Skip to content

Visual Style

Default color palette, typography, and component patterns for winpane surfaces. See design.md for architecture context.

Surface (RGB only — alpha comes from themes)

Section titled “Surface (RGB only — alpha comes from themes)”
TokenRGBHexRole
surface.basergb(18, 18, 22)#121216Primary background
surface.elevatedrgb(28, 28, 33)#1C1C21Cards, sections within a surface
surface.interactivergb(38, 38, 44)#26262CButton/control resting state
surface.hoverrgb(48, 48, 56)#303038Button/control hover state
surface.activergb(55, 55, 64)#373740Button/control pressed state
TokenRGBAHexRole
border.defaultrgba(255, 255, 255, 18)#FFFFFF12Standard surface border
border.strongrgba(255, 255, 255, 31)#FFFFFF1FEmphasized border
border.interactivergba(255, 255, 255, 23)#FFFFFF17Button/control border
TokenRGBAHexRole
text.primaryrgba(232, 232, 237, 255)#E8E8EDFFHeadings, primary values
text.secondaryrgba(148, 148, 160, 255)#9494A0FFLabels, descriptions
text.tertiaryrgba(96, 96, 107, 255)#60606BFFTimestamps, hints
TokenRGBAHexRole
accent.defaultrgba(82, 139, 255, 255)#528BFFFFButtons, links, active indicators
accent.hoverrgba(110, 160, 255, 255)#6EA0FFFFInteractive hover state
accent.mutedrgba(82, 139, 255, 48)#528BFF30Subtle background tint
accent.textrgba(130, 170, 255, 255)#82AAFFFFAccent-colored text
TokenRGBAHexRole
semantic.successrgba(52, 211, 153, 255)#34D399FFHealthy, positive, in-range
semantic.warningrgba(251, 191, 36, 255)#FBBF24FFAttention, borderline
semantic.dangerrgba(239, 68, 68, 255)#EF4444FFError, critical, out-of-range
TokenGlass (HUD)Solid (Panel)Muted (utility)
surface.basergba(18,18,22, 228) #121216E4rgba(18,18,22, 255) #121216FFrgba(18,18,22, 242) #121216F2
surface.elevatedrgba(28,28,33, 242) #1C1C21F2rgba(28,28,33, 255) #1C1C21FFrgba(28,28,33, 248) #1C1C21F8
border.defaultrgba(255,255,255, 18) #FFFFFF12rgba(255,255,255, 23) #FFFFFF17rgba(255,255,255, 12) #FFFFFF0C
Surface typeThemeWhy
HUD (click-through)GlassAmbient — transparency says “I’m not a window”
Panel (interactive)SolidControls feel real on opaque background
Persistent utilityMutedVisible all day without being loud
Tray popupSolidBrief, interactive — feels like a menu
Backdrop-enabledGlass (low alpha)Let Mica/Acrylic show through
fill: Color::rgba(18, 18, 22, 228), // glass
fill: Color::rgba(18, 18, 22, 255), // solid
fill: Color::rgba(18, 18, 22, 242), // muted

Segoe UI — all UI text (system font, no install required). Consolas — numeric values, monospace data.

TokenSizeWeightFamilyUsage
display32pxBoldConsolasHero numbers
heading16pxBoldSegoe UISurface titles
body13pxRegularSegoe UIDescriptions, status
label11pxRegularSegoe UITimestamps, footnotes
data14pxRegularConsolasInline data values

Spacing uses a 4px grid: xs=4, sm=8, md=12 (standard padding), lg=16 (section gaps), xl=24.

Corner radius: sm=6px (buttons), md=10px (surfaces, cards), lg=12px (large displays).

Surface Card — outer shell of every surface (Glass shown; Solid: alpha=255/border=23; Muted: alpha=242/border=12):

surface.set_rect("bg", RectElement {
x: 0.0, y: 0.0, width: W, height: H,
fill: Color::rgba(18, 18, 22, 228), // surface.base @ glass
corner_radius: 10.0, // radius.md
border_color: Some(Color::rgba(255, 255, 255, 18)), // border.default
border_width: 1.0, ..Default::default()
});
wp.setRect(id, "bg", {
x: 0, y: 0, width: W, height: H,
fill: "#121216e4", cornerRadius: 10, borderColor: "#ffffff12", borderWidth: 1,
});

Separator — thin line between content sections:

surface.set_rect("sep", RectElement {
x: 12.0, y: SEP_Y, width: W - 24.0, height: 1.0,
fill: Color::rgba(255, 255, 255, 18), ..Default::default() // border.default
});

Title Bar (Panel) — bold heading at space.md padding:

surface.set_text("title", TextElement {
text: "Title".into(), x: 12.0, y: 10.0,
font_size: 16.0, bold: true, // heading scale
color: Color::rgba(232, 232, 237, 255), ..Default::default() // text.primary
});

Interactive Button — resting state (swap to surface.hover + border.strong on hover):

panel.set_rect("btn", RectElement {
x: X, y: Y, width: BTN_W, height: 36.0,
fill: Color::rgba(38, 38, 44, 255), // surface.interactive
corner_radius: 6.0, // radius.sm
border_color: Some(Color::rgba(255, 255, 255, 23)), // border.interactive
border_width: 1.0, interactive: true,
});

Status Text — semantic-colored inline indicator:

surface.set_text("status", TextElement {
text: "● Connected".into(), x: X, y: Y,
font_size: 11.0, // label scale
color: Color::rgba(52, 211, 153, 255), ..Default::default() // semantic.success
});

Data Row — label (text.secondary) + value (text.primary, Consolas):

surface.set_text("cpu_label", TextElement {
text: "CPU".into(), x: 12.0, y: ROW_Y,
font_size: 13.0, color: Color::rgba(148, 148, 160, 255), ..Default::default()
});
surface.set_text("cpu_val", TextElement {
text: "42%".into(), x: VALUE_X, y: ROW_Y,
font_size: 14.0, color: Color::rgba(232, 232, 237, 255),
font_family: Some("Consolas".into()), ..Default::default()
});

Section Card — elevated area within a surface:

surface.set_rect("section_bg", RectElement {
x: 8.0, y: SEC_Y, width: W - 16.0, height: SEC_H,
fill: Color::rgba(28, 28, 33, 255), // surface.elevated
corner_radius: 6.0, ..Default::default() // radius.sm
});
// ── winpane design tokens ──────────────────────────────────────
// Surface base: rgb(18, 18, 22) Glass: a=228 Solid: a=255 Muted: a=242
// Elevated: rgb(28, 28, 33) Interactive: rgba(38, 38, 44, 255)
// Border: rgba(255,255,255, 18) Hover: rgba(48, 48, 56, 255)
// Text primary: rgba(232, 232, 237, 255) Secondary: rgba(148, 148, 160, 255)
// Accent: rgba(82, 139, 255, 255) Accent hover:rgba(110, 160, 255, 255)
// Success: rgba(52, 211, 153, 255) Warning: rgba(251, 191, 36, 255)
// Danger: rgba(239, 68, 68, 255) Radius: 10/6 px
// ────────────────────────────────────────────────────────────────
// ── winpane design tokens ──────────────────────────────────────
// Surface base: #121216 Glass: +e4 Solid: +ff Muted: +f2
// Elevated: #1c1c21 Interactive: #26262cff Hover: #303038ff
// Border: #ffffff12 Text: #e8e8edff Muted: #9494a0ff
// Accent: #528bffff Success: #34d399ff Warning: #fbbf24ff
// Danger: #ef4444ff Radius: 10/6 px
// ────────────────────────────────────────────────────────────────