live preview

The OpenCode CLI preview — my-theme.json

A complete dual-mode color theme for the OpenCode CLI — designed in Figma, shipped as production JSON. Not a screenshot, a replay: queries type themselves, the agent thinks, markdown and syntax-highlighted code stream in. Scroll inside it like the real app.

anna — OC | REST API overview — opencode — 80×24
■ Build · Big Pickle · 0.0s0.5k (4%) ctrl+g commands
scroll
0
color tokens (defs)
0
UI role mappings
0
modes: dark + light
0
iteration rounds
0
Figma CLI components
tokens

One palette, two modes

The defs block holds 44 named colors. Dark mode sits on a cool graphite ramp with purple as primary; light mode shifts the same roles onto deeper, print-safe values — teal takes over so contrast holds on white. Click any row to copy its hex.

COLOR PALETTE — DARK

darkBg#22272B
darkPanel#181D21
darkElement#3E454D
darkFg#E8EBED
darkMuted#8F97A1
darkBorder#2A3036
darkAccentprimary#909BF5
darkBlue#87ADF8
darkGreen#2BC46F
darkGreenBright#56DF8A
darkRed#ED7171
darkRedBright#F79797
darkYellow#E5D74C
darkOrange#E98C3B
darkTurquoise#61BFC5
darkPurple#909BF5
darkSyntaxYellow#CEB31C
darkSyntaxOrange#EDA769
darkSyntaxGreen#56DF8A
darkSyntaxBlue#42C0FC

COLOR PALETTE — LIGHT

lightBg#FFFFFF
lightPanel#F7F9FD
lightElement#C4CEDE
lightFg#1D1E21
lightMuted#6B7380
lightBorder#DEE3ED
lightTealprimary#00949F
lightBlue#5C41FF
lightBlueDark#407CF3
lightGreen#016B3E
lightGreenBright#008A48
lightRed#C24141
lightRedBright#E85656
lightYellow#966900
lightOrange#E3710D
lightTurquoise#00949F
lightPurple#7770F9
lightPurpleDark#5C41FF
lightMagenta#b3003f
lightPinkretired#D547B8
iteration

Three rounds of refinement

Every change was logged in the Figma file as a design change log — token, before, after, and the reason. The theme that shipped is the sum of these decisions.

Round 1 / UI Backgrounds

Neutral blacks were replaced with the platform graphite ramp.

darkElement#262626→#2A3036prompt input bg
darkPanel#141414→#181D21user message bg

Round 2 / Fine-Tuning

The primary returned to brand purple; pink was iterated into turquoise and renamed.

darkCyan#30AAB2→#909BF5restore purple primary
darkPink (iterated)#E98AD6→#61BFC5syntax-string: 4 iterations → final #61BFC5
RENAMEDdarkPink→darkTurquoise
lightPink#D547B8→#00949F
RENAMEDlightPink→lightTurquoise

Round 3 / Syntax Saturation Reduction

Code colors were dialed back so syntax reads calmly against the purple and turquoise primaries.

darkSyntaxYellow#E5D74C→#CEB31CsyntaxNumber — less vivid
NEWdarkSyntaxOrangeMuted#EDA769syntaxType only — split from syntaxFunction
REMOVEDdarkSyntaxOrangeMutedexperiment reverted the same round
darkSyntaxOrange#E98C3B (or-50)→#EDA769 (or-40)syntaxType reassigned back to darkSyntaxOrange
Teal header text — increased lightness 15% specifically for table headers and H2/H3 headings to clear contrast more comfortably
Table highlight colors — slightly desaturated orange so turquoise and purple carry more weight as primary roles (the two most visually aggressive: orange and green)
system

Not invented — aligned

No color in this theme is arbitrary. In Figma, every token is a variable aliased into the DataRobot design system library — the CLI inherits the platform's graphite, purple and supportive ramps, so it looks native next to the product. Two modes are driven by the same variable collection.

theme tokenlibrary variablevalue
darkBgmidnight-gray-70#22272B
darkPanelsurface/page-background-90#181D21
darkFgmidnight-gray-10#E8EBED
darkAccent / darkPurplepurple-50#909BF5
darkTurquoisedata viz / turquoise-40#61BFC5
darkGreensupportive / green-50#2BC46F
darkRedsupportive / red-50#ED7171
darkSyntaxOrangedata viz / orange-40#EDA769
darkSyntaxBluedata viz / azure-40#42C0FC
lightBg → lightMutedalpine-light ramp (100 → 30)#FFFFFF … #6B7380

Figma variable architecture

One collection, two modes. Each of the 24 numbered color variables resolves through a library alias per mode, so switching the mode in Figma restyles the entire prototype.

Collection modesdark / light
Color variables24 aliased
TypographyJetBrains Mono
WeightsRegular / Medium
Base size14
Corner radiusradii = 6
mapping

Tokens become roles

The theme block assigns the 44 defs to 52 semantic roles OpenCode understands — core UI, markdown rendering, syntax highlighting and diffs. The dots are live: they read the CSS custom properties of the current mode.

Core UI

primarydarkCyan / lightTeal
accentdarkAccent / lightTeal
errorred
warningyellow / orange
successgreen
infoblue
textfg
textMutedmuted
backgroundbg
backgroundPanelpanel
backgroundElementelement
borderActiveprimary

Markdown

markdownHeadingpurple / blueDark
markdownLinkteal / blueDark
markdownCodeturquoise / green
markdownEmphteal / fg
markdownStrongsynYellow / fg
markdownBlockQuotemuted

Syntax

syntaxKeywordteal / magenta
syntaxFunctionsynOrange / orange
syntaxStringturquoise / purple
syntaxNumbersynYellow / turquoise
syntaxTypesynOrange / blueDark
syntaxCommentmuted

Diff

diffAddedgreen
diffRemovedred
diffAddedBgalpha green
diffRemovedBgalpha red
diffHighlightAddedgreenBright
diffHighlightRemovedredBright
deliverable

Shipped as code

The final deliverable is not a mockup — it is a working theme.json following the official OpenCode schema, contributed via pull request to datarobot-oss/datarobot-agent-skills, living alongside the marketing-branded theme.

01
Design tokens finalized in Figma variables
2 modes, library-aliased
02
Exported to theme.json
$schema: opencode.ai/theme.json
03
Fork + PR
.opencode-plugin/themes registered in index.ts
04
Two themes coexist
platform-aligned + datarobot-brand
▶ my-theme.json 44 defs · 52 roles · click to expand

    
copied