theme-system
Skill12k starsChanged yesterdayMITView on GitHub
Use when creating or modifying OpenChamber UI components, styling, colors, buttons, visual states, themes, or icons.
We split this skill into the rules it gives an agent
13 rules. 6 are common, 1 is distinctive, and 6 are very specific to this project.
6
Common
Most of the 3 edited versions we read keep these.
1
Distinctive
This author's own choices. Worth a look.
6
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 10
Use semantic OpenChamber theme tokens.
- Common: line 11
Use shared UI primitives before introducing feature-local controls.
- Very specific: line 12
Every dropdown-style value-picker trigger takes its chrome from dropdownTriggerVariants in …
- Common: line 14
Use status colors only for actual status/feedback.
- Common: line 15
Use selection tokens for selected state and primary tokens for primary actions.
- Very specific: line 36
Prefer CSS variables/classes for component styling.
- Very specific: line 40
Use Button from packages/ui/src/components/ui/button.tsx.
- Common: line 60
Do not hardcode button height/padding when a size variant exists.
- Very specific: line 71
Keep this behavior in shared components so callers inherit it.
- Distinctive: line 74
Verify Ctrl+N/P alongside arrow keys in the real component, including search-input focus, submenus, and closed state.
- Very specific: line 84
Never import icons directly from @remixicon/react.
- Common: line 109
No hardcoded/palette colors were introduced.
- Common: line 115
Every applicable contract and loaded task reference was verified with relevant visual/runtime validation and generated-asset checks.
“Common” is measured: kept by at least 6 in 10 of the 3 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Theme System
Core Rules
- Use semantic OpenChamber theme tokens; never hardcode hex colors or generic Tailwind palette colors.
- Use shared UI primitives before introducing feature-local controls.
- Every dropdown-style value-picker trigger takes its chrome from
dropdownTriggerVariantsinpackages/ui/src/components/ui/dropdown-trigger.ts; call sites add layout classes only. Deliberately chrome-less pickers in composers or headers are the exception. - Apply hover tokens only to interactive elements.
- Use status colors only for actual status/feedback.
- Use selection tokens for selected state and primary tokens for primary actions.
Load References By Task
| Task | Required reference |
| Choosing colors/tokens or reviewing styled examples | references/tokens-and-examples.md |
| Adding, converting, storing, or generating icons | references/icons.md |
| Adding built-in or custom themes | references/adding-themes.md |
Load every matching reference before editing. How a screen should look and behave (depth and borders, which surface class to use, layout stability, sizing, composition, text density) is owned by openchamber-ui-guidance; load it for any visible UI change. User-facing or accessible text must load locale-ui-patterns. Spacing, positioning and directional icons follow rtl-layout, which owns how a layout works in both directions.
Token Decision
- Code display ->
syntax.* - Error/warning/success/info ->
status.* - Primary CTA ->
primary.* - Hover/pressed/focus ->
interactive.* - Selected/active state ->
interactive.selection* - Background/text/border layer ->
surface.*and semantic utility classes
Prefer CSS variables/classes for component styling. Use useThemeSystem() only when an API requires resolved color values.
Button Contract
Use Button from packages/ui/src/components/ui/button.tsx; do not create wrappers such as ButtonSmall or ButtonLarge.
| Variant | Use |
default | Primary local action |
outline | Visible secondary action |
secondary | Soft secondary action |
ghost | Quiet row/toolbar action |
destructive | Destructive action |
chip | Compact selectable option with aria-pressed |
link | Rare inline text action |
| Size | Use |
xs | Dense row/list control |
sm | Compact action |
default | Standard action |
lg | Prominent action |
icon | Icon-only square action |
Do not hardcode button height/padding when a size variant exists. Do not recreate selection/destructive styling with ad-hoc classes.
A button that opens a page, panel, or search field is a toggle: while what it opened is on screen it carries aria-pressed and the selection tokens, and the next click closes it. Closing a search field also clears its query, so the list never stays filtered by text nobody can see.
Every dropdown trigger on desktop is 28px (dropdownTriggerVariants() default, SelectTrigger), in forms and toolbars alike. Toolbars, filter rows and the context panel header use 28px throughout: Button size="sm", <Input inputSize="compact">, and the active-pill tab strip (its default). Form inputs and buttons stay 32px (default). Pick the size variant instead of overriding h-* at the call site to match a neighbour; mobile/touch branches keep their own larger sizes (mobile, touch).
Extensions draw these controls from their own copy, the SDK UI kit in packages/sdk/src/ui. A change to a shared primitive's size, radius, or states (button, input, dropdown trigger, select item, checkbox, tabs, badge) also changes its twin in packages/sdk/src/ui/style.ts in the same change: appearance in GUEST_UI_LOOK_CSS, which the server serves to installed extensions, sizes in UI_SIZE_CSS, which reach an extension when its author rebuilds. Then rebuild the SDK example bundles (packages/sdk/DOCUMENTATION.md).
Keyboard Navigation Contract
- Menus, selects, and autocomplete pickers with ArrowDown/ArrowUp navigation must also support Ctrl+N/Ctrl+P, including submenus and searchable lists.
- Keep this behavior in shared components so callers inherit it. Use the keyboard mapping in
packages/ui/src/components/ui/dropdown-navigation.ts; feature code must not duplicate key detection. - Lists that own their active option or stop keyboard propagation must call the shared navigation helper at their own event boundary. Wrapping a custom list in a dropdown does not guarantee that its navigation events reach the wrapper.
- Route both key pairs through the same selection logic, preserving disabled-item skipping, boundary or wrap behavior, highlight, and scroll visibility. Consume each navigation event once, only while the menu or picker is active; preserve IME text entry and other modifier chords.
- Verify Ctrl+N/P alongside arrow keys in the real component, including search-input focus, submenus, and closed state. A key-mapping unit test alone does not verify event propagation or focus behavior.
Icon Contract
import { Icon } from '@/components/icon/Icon';
<Icon name="check" className="size-4" />Never import icons directly from @remixicon/react. Use IconName for icon values stored in arrays, objects, state, or config. Icon has no size prop. Run bun run icons:generate when introducing a sprite name, and never edit sprite.ts manually. Load references/icons.md for the complete workflow.
Animation Contract
Animate only transform and opacity. Use transform: rotate(...), not the individual rotate property. Non-composited properties recalculate style continuously; geometry also triggers layout. Animate only while conveying live information.
Motion that can stay on screen for minutes follows the state it shows:
- Steady state stands still: connected, failed, degraded, "Unavailable", the provider logo while the agent works, read-aloud playing (its icon turns
--primary-text). Show a static icon in the state's color. - A wait that can last spins on the shared clock: a running project action, worktree setup or removal, a space being made, CI checks, loading sessions or models, walkthrough generation, an OpenCode update. Render
Spinner(components/ui/spinner.tsx): eight bars, four steps a second. - A wait that cannot spin blinks: a status dot (6 px,
size-1.5), the recording dot, a loading skeleton. ApplyuseWaitingBlink(active); it dims every other second. The splash logo steps instead: its roof tiers light up one at a time, once a second, throughuseWaitingPhase. - Waiting text gets dots: "Thinking", "Waiting for approval". Put
BusyDots(components/ui/busy-dots.tsx) after the label; drop any "…" from the string. - A spinner that lasts seconds (a button after a click, a quick load, refresh) keeps
animate-spin. - Hidden stops. A surface kept mounted while hidden wraps its content in
PauseClock(components/ui/pause-clock.tsx); the context panel's zones already do. Aninertsubtree pauses its CSS animations (index.css).
Spinner, useWaitingBlink, BusyDots and live counters (useDurationTickerNow) share one clock (hooks/useDurationTicker.ts): a page draws four frames a second while a spinner shows and one otherwise, however many indicators are on screen. Each tick re-renders the component that calls the hook, so call it in the indicator itself. lib/infiniteAnimations.test.ts fails on any new infinite CSS animation outside the short ones it lists. The cost behind these rules is in performance-engineering, "Motion That Stays On Screen".
Springs are the app's easing. lib/motion/springs.ts turns a spring (perceived duration, bounce) into a CSS linear() easing and writes it to --oc-motion-<name>-duration / -easing: popup for menus, selects and tooltips (oc-popup-motion, which transitions only opacity and transform; never transition-all on a popup), layout for a control easing into a new width. Change a spring in MOTION_SPRINGS and paste its generated values into design-system.css (its test keeps them in step). In development Cmd+Alt+M opens live knobs for them. A control whose width follows its value (a picker) uses useWidthMorph(ref) (lib/motion/useSizeMorph.ts): it watches the content, retargets from where the control stands when a part arrives late, and clips the text while it moves. An open popup whose content changes uses useHeightMorph(ref) on its box the same way; DropdownMenuContent calls it for every menu. Its positioner (base-ui) or bottom-full keeps the anchored edge in place in every painted frame, so the hook never moves the popup itself. These are the accepted size animations: once per content change, on a small control or an open popup.
For any other technique, load performance-engineering and scripts/perf/DOCUMENTATION.md, measure it with bun run profile:animation, and add a fixture variant when needed. This skill owns animation styling; performance-engineering owns performance evidence.
Completion Criteria
- Animations are limited to
transformandopacity, or their cost was measured and accepted. - Nothing that can stay on screen for minutes runs an infinite CSS animation: steady states stand still, waits use
Spinner,useWaitingBlinkorBusyDots. - No hardcoded/palette colors were introduced.
- Buttons use shared variants and sizes.
- Menus and pickers satisfy the keyboard navigation contract without caller-specific key handling for standard shared components.
- Icons use
Icon/IconName, and generated sprite changes are intentional. - Hover, selection, primary, and status semantics are distinct.
- Light/dark/high-contrast and long-text states remain legible.
- Every applicable contract and loaded task reference was verified with relevant visual/runtime validation and generated-asset checks.
Trending
More talk lately.about the whole repository
Who's talking about openchamber/openchamber
- HQ NET“OpenCode’u Yeniden Denedim… Bi Daha CLI Kullanmam”YouTube · Oct 9, 2026 · 41k views
- Gianni Chiarello“New Plugin Features + AI Assistant in Reaper (MCP Server Explained)”YouTube · Oct 28, 2026 · 2.4k views
- BACKFIRED X“OpenChamber: Compare Five Agent Runs And Review Them Anywhere”YouTube · Aug 10, 2026 · 777 views
- Dũng“OpenChamber + VPS: Biến Điện Thoại Thành Công Cụ Dev Fix Lỗi Siêu Nhanh”YouTube · Mar 26, 2026 · 393 views
- さつきのOSS研究室“外出先からAIの作業を監督してマージまで|openchamber 入門【AIエージェント開発者向け】”YouTube · Aug 10, 2026 · 93 views
The biggest 5 of 61 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 61
Talked about on GitHub, YouTube, Bluesky, the web and Hacker News (61 times).
On GitHub · 47
- Apr 10, 2026[Feature Request] Support browser — minghinmatthewlam/pi-gui3 reactions · 1 comment
- Sep 24, 2026[Bug]: Cannont connect to OpenCode v2 server — looptroop-ai/LoopTroop1 reaction · 1 comment
- Oct 28, 2026Bump the dev-dependencies group across 1 directory with 2 updates — pedrohendp/openchamber-claude-account-switcher0 reactions
- Oct 27, 2026build(deps-dev): bump @openchamber/sdk from 2.3.2 to 2.5.1 in /extensions/reeve — BD7PIL/reeve0 reactions
- Oct 23, 2026chore(deps)(deps): bump the minor-and-patch group across 1 directory with 3 updates — BD7PIL/ocrc0 reactions · 2 comments
42 more on GitHub
- Oct 23, 2026chore(deps)(deps): bump the minor-and-patch group across 1 directory with 3 updates — BD7PIL/ocrc0 reactions · 1 comment
- Oct 23, 2026[Feature]: make this more openchamber-compatible. — alvinunreal/oh-my-opencode-slim0 reactions · 1 comment
- Oct 21, 2026feat: integrate OpenChamber with sandboxed OpenCode — inoio/agents-sandbox0 reactions
- Oct 21, 2026Bump @openchamber/sdk from 2.3.1 to 2.4.0 in the dev-dependencies group — pedrohendp/openchamber-claude-account-switcher0 reactions · 1 comment
- Oct 20, 2026Feat/ulw finish — dang232/Alcode0 reactions · 2 comments
- Oct 20, 2026build(deps-dev): bump @openchamber/sdk from 2.3.2 to 2.4.0 in /extensions/reeve — BD7PIL/reeve0 reactions · 1 comment
- Oct 19, 2026🚀 Feature Request: Support AI-powered labs with OpenCode and OpenChamber — yodamad/easylab0 reactions
- Oct 19, 2026[Icon request] OpenChamber — PapirusDevelopmentTeam/papirus-icon-theme0 reactions
- Oct 18, 2026Windows: shell runs PowerShell 5.1 with a Store-installed pwsh 7, and a Store update strands the cached path — anomalyco/opencode0 reactions · 4 comments
- Oct 17, 2026deps(canvas): bump @openchamber/sdk from 2.2.0 to 2.3.2 in /extensions/canvas — miloszkolber/oc_build0 reactions
- Oct 15, 2026Add OpenChamber HTTP fingerprint rule — hexbay/finger-rules0 reactions
- Oct 13, 2026[Request]: openchamber — ScoopInstaller/Extras0 reactions
- Oct 12, 2026v2: non-Git file search drops existing files after refreshing its capped index — anomalyco/opencode0 reactions · 2 comments
- Oct 12, 2026[Candidate] openchamber/openchamber/.agents/skills/writing-for-agents - writing-for-agents — ProSkillsMD/proskills0 reactions · 1 comment
- Oct 8, 2026docs: add OpenChamber Cell insight note — Giorno-Giovanna-Dio/AI-Agent-Products-Reviewed0 reactions
- Oct 7, 2026docs(alwork-ide): add Alcore integration map — dang232/Alcode0 reactions · 1 comment
- Oct 5, 2026Proof compatiblity with openchamber 2.x — steffenmaechtel/opencode-permissions-kit0 reactions · 1 comment
- Oct 4, 2026Add grand-tour, an onboarding-style tour of a codebase — rubicon/ai-skills0 reactions · 1 comment
- Oct 4, 2026Add second-look, an intent-first review by a fresh agent — rubicon/ai-skills0 reactions · 1 comment
- Oct 4, 2026Add goalpost, a skill that writes /goal conditions that are checkable and can finish — rubicon/ai-skills0 reactions · 1 comment
- Oct 4, 2026Add showdown, a skill that compares approaches head to head and recommends one — rubicon/ai-skills0 reactions · 1 comment
- Oct 4, 2026Add catch-up to pitstop, a short where-was-I summary of the current branch — rubicon/ai-skills0 reactions · 1 comment
- Oct 1, 2026feat: embed OpenCode 2.0.21 with persistent conversations — newsky123/openchamber0 reactions
- Sep 30, 2026[feat] 希望支持 OpenChamber:它的 opencode 是自带的,magpie 目前还认不到 — yetone/magpie0 reactions · 3 comments
- Sep 27, 2026Add OpenChamber — AppImage/appimage.github.io0 reactions · 1 comment
- Sep 24, 2026IDK — NoxLoveYa/opencode-gui0 reactions
- Sep 20, 2026Terminalintegration verbessern: gemeinsame PTY-Session ud saubere VT-Rendering — martin-stromberg/Softwareschmiede0 reactions
- Sep 19, 2026[New]: OpenChamber — privacyguides/verified-apps0 reactions · 1 comment
- Sep 7, 2026fix: keep active tool messages unfinished — alvins82/omp-openchamber-server0 reactions
- Sep 6, 2026OpenChamber OPENCHAMBER_CHATS_DIR is merged and released — steffenmaechtel/opencode-permissions-kit0 reactions
- Aug 27, 2026Avaliar estabilidade do OpenCode v2, gaps vs v1 e compatibilidade dual (subagentes assíncronos) — verseles/codewalk0 reactions
- Aug 21, 2026OpenChamber - Incorrect context usage — rashidrazak/opencode-cmd-provider0 reactions · 2 comments
- Aug 18, 2026List a custom source's extension, and keep a detail page after uninstall — blamspotdev/j-code-android0 reactions
- Aug 16, 2026feat(sync): topic-isolated notifiers and PiChamber protocol hard rename — RyderAsKing/PiChamber0 reactions · 1 comment
- Aug 15, 2026fix(config): stop wiping opencode.jsonc with partial JSONC parses (#2923) — sdziupin/openchamber0 reactions
- Aug 7, 2026Add CVE-2026-53976: OpenChamber <1.13.0 unauthenticated arbitrary file read — projectdiscovery/nuclei-templates0 reactions
- Aug 7, 2026[Argus] CVE-2026-53976: OpenChamber 1.11.7 Path Traversal File Read via allowOutsideWorkspace Parameter — LEEKIYOON-SEC/Argus-DEV0 reactions
- Aug 7, 2026[Argus] CVE-2026-53975: OpenChamber 1.11.7 Unauthenticated RCE via /api/fs/exec — LEEKIYOON-SEC/Argus-DEV0 reactions
- Jul 25, 2026[Bug] UI Automation activity during Chromium/Electron resize can cause prolonged input stalls — rsaz/keyhop0 reactions
- May 31, 2026Fix openchamber cask URL and add mux cask for Linux — impuls42/homebrew-tap0 reactions
- May 22, 2026fix: expand chat tool details — jkker/openchamber0 reactions
- May 17, 2026fix installed skills discovery and improve editor UX — jkker/openchamber0 reactions
On YouTube · 5
- Oct 9, 2026OpenCode’u Yeniden Denedim… Bi Daha CLI Kullanmam — HQ NET41k views · 57 comments
- Oct 28, 2026New Plugin Features + AI Assistant in Reaper (MCP Server Explained) — Gianni Chiarello2.4k views · 5 comments
- Aug 10, 2026OpenChamber: Compare Five Agent Runs And Review Them Anywhere — BACKFIRED X777 views · 1 comment
- Mar 26, 2026OpenChamber + VPS: Biến Điện Thoại Thành Công Cụ Dev Fix Lỗi Siêu Nhanh — Dũng - Chia Sẻ Công Nghệ 393 views · 8 comments
- Aug 10, 2026外出先からAIの作業を監督してマージまで|openchamber 入門【AIエージェント開発者向け】 — さつきのOSS研究室93 views · 1 comment
On Bluesky · 4
- Aug 29, 2026my Poster's Intuition says this ubiquitous layout is not how things will be for long. low key I think we'll soon move on to Mostly Just… — @davidcrespo.bsky.social17 likes and reposts · 3 replies
- May 10, 2026オープンソースでCLIベースなAIエージェントOpenCodeのリッチクライアント。TUI、macOSアプリ、vscode、ブラウザからアクセス可能と。ブラウザはスマートフォンからもokなPWA仕様と。 — @matsuu.bsky.social5 likes and reposts
- May 17, 2026https://github.com/openchamber/openchamber これ良いな。OpenCode Goと組み合わせて子供のゲーム作り環境に良さそう — @chezo.uno3 likes and reposts
- Sep 11, 2026memo. [openchamber/openchamber: Agentic Development Environment based on OpenCode AI agent](github.com/openchamber/...) — @mikoto2000.bsky.social1 likes and repost · 1 reply
On the web · 4
- Oct 23, 2026openchamber/openchamber v2.5.1 on GitHub — newreleases.io
- Oct 19, 2026openchamber/openchamber v2.5.0 on GitHub — newreleases.io
- Oct 4, 2026openchamber/openchamber v2.1.1 on GitHub — newreleases.io
- Sep 30, 2026openchamber/openchamber v2.1.0 on GitHub — newreleases.io
On Hacker News · 1
- Mar 26, 2026OpenChamber – Desktop and web interface for OpenCode AI agent3 points
Other versions3 projects use a version of this.
Word for word · 0
None found.
Edited · 2
- btriapitsyn/openchamber★ 12k90% same
- jlu-lujing/TaskHunter★ 480% same
Wrote their own version · 1
- lossless-group/lossless-agent-skills★ 4same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository23 other files it gives its agents.
- AGENTS.mdAGENTS.md
- clack-cli-patternsSkill
- communication-styleSkill
- desktop-shellSkill
- drag-to-reorderSkill
- enterprise-boundarySkill
- isolated-space-boundarySkill
- locale-ui-patternsSkill
- openchamber-change-disciplineSkill
- openchamber-ui-guidanceSkill
- opencode-v2Skill
- performance-engineeringSkill
- pr-reviewSkill
- relay-transportSkill
- rtl-layoutSkill
- serve-simSkill
- settings-ui-patternsSkill
- sync-state-invariantsSkill
- triage-issuesSkill
- triage-prsSkill
- ui-api-decouplingSkill
- update-changelogSkill
- writing-for-agentsSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

