Skip to content

Latest commit

 

History

History
500 lines (468 loc) · 17.6 KB

File metadata and controls

500 lines (468 loc) · 17.6 KB
version alpha
name clientside-containers
description Design system for clientside-containers — Dark theme only.
colors
primary secondary tertiary neutral background-100 background-200 gray-100 gray-200 gray-300 gray-400 gray-500 gray-600 gray-700 gray-800 gray-900 gray-1000 gray-alpha-100 gray-alpha-200 gray-alpha-300 gray-alpha-400 gray-alpha-500 gray-alpha-600 gray-alpha-700 gray-alpha-800 gray-alpha-900 gray-alpha-1000 blue-100 blue-200 blue-300 blue-400 blue-500 blue-600 blue-700 blue-800 blue-900 blue-1000 red-100 red-200 red-300 red-400 red-500 red-600 red-700 red-800 red-900 red-1000 amber-100 amber-200 amber-300 amber-400 amber-500 amber-600 amber-700 amber-800 amber-900 amber-1000 green-100 green-200 green-300 green-400 green-500 green-600 green-700 green-800 green-900 green-1000 teal-100 teal-200 teal-300 teal-400 teal-500 teal-600 teal-700 teal-800 teal-900 teal-1000 purple-100 purple-200 purple-300 purple-400 purple-500 purple-600 purple-700 purple-800 purple-900 purple-1000 pink-100 pink-200 pink-300 pink-400 pink-500 pink-600 pink-700 pink-800 pink-900 pink-1000 blue-100-p3 blue-200-p3 blue-300-p3 blue-400-p3 blue-500-p3 blue-600-p3 blue-700-p3 blue-800-p3 blue-900-p3 blue-1000-p3 red-100-p3 red-200-p3 red-300-p3 red-400-p3 red-500-p3 red-600-p3 red-700-p3 red-800-p3 red-900-p3 red-1000-p3 amber-100-p3 amber-200-p3 amber-300-p3 amber-400-p3 amber-500-p3 amber-600-p3 amber-700-p3 amber-800-p3 amber-900-p3 amber-1000-p3 green-100-p3 green-200-p3 green-300-p3 green-400-p3 green-500-p3 green-600-p3 green-700-p3 green-800-p3 green-900-p3 green-1000-p3 teal-100-p3 teal-200-p3 teal-300-p3 teal-400-p3 teal-500-p3 teal-600-p3 teal-700-p3 teal-800-p3 teal-900-p3 teal-1000-p3 purple-100-p3 purple-200-p3 purple-300-p3 purple-400-p3 purple-500-p3 purple-600-p3 purple-700-p3 purple-800-p3 purple-900-p3 purple-1000-p3 pink-100-p3 pink-200-p3 pink-300-p3 pink-400-p3 pink-500-p3 pink-600-p3 pink-700-p3 pink-800-p3 pink-900-p3 pink-1000-p3
#ededed
#a1a1a1
#0070f3
#1a1a1a
#0a0a0a
#171717
#1a1a1a
#292929
#333333
#444444
#555555
#666666
#888888
#999999
#a1a1a1
#ededed
#ffffff0d
#ffffff15
#ffffff1a
#ffffff14
#ffffff36
#ffffff3d
#ffffff70
#ffffff82
#ffffffb3
#ffffffe8
#f0f7ff
#e9f4ff
#dfefff
#cae7ff
#94ccff
#48aeff
#006bff
#0059ec
#005ff2
#002359
#ffeeef
#ffe8ea
#ffe3e4
#ffd7d6
#ffb1b3
#ff676d
#fc0035
#ea001d
#d8001b
#47000c
#fff6de
#fff4cf
#fff1c1
#ffdc73
#ffc543
#ffa600
#ffae00
#ff9300
#aa4d00
#561900
#ecfdec
#e5fce7
#d3fad1
#b9f5bc
#82eb8d
#4ce15e
#28a948
#279141
#107d32
#003a00
#defffb
#ddfef6
#ccf9f1
#b1f7ec
#52f0db
#00e3c4
#00ac96
#00927f
#007f70
#003f34
#faf0ff
#f9f0ff
#f6e8ff
#f2d9ff
#dfa7ff
#c979ff
#a000f8
#8500d1
#7d00cc
#2f004e
#ffe8f6
#ffe8f3
#ffdfeb
#ffd3e1
#fdb3cc
#f97ea7
#f22782
#e4106e
#c41562
#460523
oklch(97.32% 0.0141 251.56)
oklch(96.29% 0.0195 250.59)
oklch(94.58% 0.0293 249.84870859673202)
oklch(91.58% 0.0473 245.11621922481282)
oklch(82.75% 0.0979 248.48)
oklch(73.08% 0.1583 248.133320980386)
oklch(57.61% 0.2508 258.23)
oklch(51.51% 0.2399 257.85)
oklch(53.18% 0.2399 256.9900584162342)
oklch(26.67% 0.1099 254.34)
oklch(96.5% 0.0223 13.09)
oklch(95.41% 0.0299 14.252646656611997)
oklch(94.33% 0.0369 15.011509923860523)
oklch(91.51% 0.0471 19.8)
oklch(84.47% 0.1018 17.71)
oklch(71.12% 0.1881 21.22)
oklch(62.56% 0.2524 23.03)
oklch(58.19% 0.2482 25.15)
oklch(54.99% 0.232 25.29)
oklch(24.8% 0.1041 18.86)
oklch(97.48% 0.0331 85.79)
oklch(96.81% 0.0495 90.24227879900472)
oklch(95.93% 0.0636 90.52)
oklch(91.02% 0.1322 88.25)
oklch(86.55% 0.1583 79.63)
oklch(80.25% 0.1953 73.59)
oklch(81.87% 0.1969 76.46)
oklch(77.21% 0.1991 64.28)
oklch(52.79% 0.1496 54.65)
oklch(30.83% 0.099 45.48)
oklch(97.59% 0.0289 145.42)
oklch(96.92% 0.037 147.15)
oklch(94.6% 0.0674 144.23)
oklch(91.49% 0.0976 146.24)
oklch(85.45% 0.1627 146.3)
oklch(80.25% 0.214 145.18)
oklch(64.58% 0.1746 147.27)
oklch(57.81% 0.1507 147.5)
oklch(51.75% 0.1453 147.65)
oklch(29.15% 0.1197 147.38)
oklch(97.72% 0.0359 186.7)
oklch(97.06% 0.0347 180.66)
oklch(94.92% 0.0478 182.07)
oklch(92.76% 0.0718 183.78)
oklch(86.88% 0.1344 182.42)
oklch(81.5% 0.161 178.96)
oklch(64.92% 0.1572 181.95)
oklch(57.53% 0.1392 181.66)
oklch(52.08% 0.1251 182.93)
oklch(32.11% 0.0788 179.82)
oklch(96.65% 0.0244 312.1890119359961)
oklch(96.73% 0.0228 309.8)
oklch(94.85% 0.0364 310.15)
oklch(91.77% 0.0614 312.82)
oklch(81.26% 0.1409 310.8)
oklch(72.07% 0.2083 308.19)
oklch(55.5% 0.3008 306.12)
oklch(48.58% 0.2638 305.73)
oklch(47.18% 0.2579 304)
oklch(23.96% 0.13 305.66)
oklch(95.69% 0.0359 344.6218910697224)
oklch(95.71% 0.0321 353.14)
oklch(93.83% 0.0451 356.29)
oklch(91.12% 0.0573 358.82)
oklch(84.28% 0.0915 356.99)
oklch(74.33% 0.1547 0.24)
oklch(63.52% 0.238 1.01)
oklch(59.51% 0.2339 4.21)
oklch(53.5% 0.2058 2.84)
oklch(26% 0.0977 359)
typography
heading-72 heading-64 heading-56 heading-48 heading-40 heading-32 heading-24 heading-20 heading-16 heading-14 button-16 button-14 button-12 label-20 label-18 label-16 label-14 label-14-mono label-13 label-13-mono label-12 label-12-mono copy-24 copy-20 copy-18 copy-16 copy-14 copy-14-mono copy-13 copy-13-mono
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
72px
600
72px
-4.32px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
64px
600
64px
-3.84px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
56px
600
56px
-3.36px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
48px
600
56px
-2.88px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
40px
600
48px
-2.4px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
32px
600
40px
-1.28px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
24px
600
32px
-0.96px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
20px
600
26px
-0.4px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
16px
600
24px
-0.32px
fontFamily fontSize fontWeight lineHeight letterSpacing
Geist Sans
14px
600
20px
-0.28px
fontFamily fontSize fontWeight lineHeight
Geist Sans
16px
500
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
14px
500
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
12px
500
16px
fontFamily fontSize fontWeight lineHeight
Geist Sans
20px
400
32px
fontFamily fontSize fontWeight lineHeight
Geist Sans
18px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
16px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
14px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Mono
14px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
13px
400
16px
fontFamily fontSize fontWeight lineHeight
Geist Mono
13px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
12px
400
16px
fontFamily fontSize fontWeight lineHeight
Geist Mono
12px
400
16px
fontFamily fontSize fontWeight lineHeight
Geist Sans
24px
400
36px
fontFamily fontSize fontWeight lineHeight
Geist Sans
20px
400
36px
fontFamily fontSize fontWeight lineHeight
Geist Sans
18px
400
28px
fontFamily fontSize fontWeight lineHeight
Geist Sans
16px
400
24px
fontFamily fontSize fontWeight lineHeight
Geist Sans
14px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Mono
14px
400
20px
fontFamily fontSize fontWeight lineHeight
Geist Sans
13px
400
18px
fontFamily fontSize fontWeight lineHeight
Geist Mono
13px
400
18px
spacing
1 2 3 4 6 8 10 16 24 base
4px
8px
12px
16px
24px
32px
40px
64px
96px
4px
rounded
sm md lg full
6px
12px
16px
9999px
components
button-primary button-secondary button-tertiary button-error button-small button-large input input-small input-large
backgroundColor textColor typography rounded padding height
{colors.primary}
{colors.background-100}
{typography.button-14}
{rounded.sm}
0 10px
40px
backgroundColor textColor typography rounded padding height
{colors.background-100}
{colors.primary}
{typography.button-14}
{rounded.sm}
0 10px
40px
textColor typography rounded padding height
{colors.primary}
{typography.button-14}
{rounded.sm}
0 10px
40px
backgroundColor textColor typography rounded padding height
{colors.red-800}
#ffffff
{typography.button-14}
{rounded.sm}
0 10px
40px
typography rounded padding height
{typography.button-14}
{rounded.sm}
0 6px
32px
typography rounded padding height
{typography.button-16}
{rounded.sm}
0 14px
48px
backgroundColor textColor typography rounded padding height
{colors.background-100}
{colors.primary}
{typography.label-14}
{rounded.sm}
0 12px
40px
typography rounded padding height
{typography.label-14}
{rounded.sm}
0 12px
32px
typography rounded padding height
{typography.label-16}
{rounded.sm}
0 12px
48px

clientside-containers design system

Overview

This is the design system for clientside-containers — the browser dashboard for agent sandboxes, app bottles, and mini OS containers. The aesthetic is minimal and high-contrast on dark surfaces: restrained color, clear hierarchy, and content set on near-black backgrounds. Prioritize readability and accessibility, and use color to signal state or hierarchy rather than decoration.

This app uses the Dark theme only. Colors are sRGB hex with Display P3 equivalents where noted. Typography uses Geist Sans and Geist Mono.

Colors

Each non-background scale runs 10 steps (1001000), and the step encodes intent, not just lightness:

  • 100 default background
  • 200 hover background
  • 300 active background
  • 400 default border
  • 500 hover border
  • 600 active border
  • 700 solid fill, high contrast
  • 800 solid fill, hover
  • 900 secondary text and icons
  • 1000 primary text and icons

background-100 is the primary page and card surface (#0a0a0a); background-200 is a secondary surface for subtle separation (#171717). The gray-alpha-* tokens are translucent white overlays for borders, dividers, overlays, and hover states. Solid gray-* holds its contrast on any surface, so use it for text and opaque fills. Accent scales carry meaning: blue for links, focus, and the primary call to action; red for errors and destructive actions; amber for warnings and booting states; plus green, teal, purple, and pink for status and tier accents.

Typography

Geist Sans sets UI and prose; Geist Mono sets code, data, terminal output, and tabular figures. The typography tokens above carry concrete fontFamily, fontSize, fontWeight, lineHeight, and letterSpacing:

  • Headings, heading-72 through heading-14, title pages and sections; letterSpacing tightens as the size grows.
  • Labels, label-20 through label-12, carry single-line, scannable text: navigation, form labels, table headers, metadata.
  • Copy, copy-24 through copy-13, set multi-line body text with a taller lineHeight.
  • Buttons, button-16 through button-12, are medium-weight labels for buttons and compact controls.

copy-14 and label-14 cover most text. The -mono tokens pair Geist Mono with the same metrics; prefer tabular figures when numbers need to align.

Layout

Spacing follows a 4px scale: 4, 8, 12, 16, 24, 32, 40, 64, 96px. Keep a three-step rhythm: 8px inside a group, 16px between groups, 32–40px between sections. Cards use 24px padding, 16px when compact and 32px for hero areas. Center content in a 1200px column with side padding that grows at wider breakpoints, and make every layout work on mobile and desktop. Breakpoints are sm 401px, md 601px, lg 961px, xl 1200px, and 2xl 1400px.

Elevation & Depth

Hierarchy comes from tonal surfaces and borders first, so shadows stay subtle. Apply these box-shadow values for the dark theme:

  • Raised cards: 0 2px 2px rgba(0, 0, 0, 0.32)
  • Popovers and menus: 0 1px 1px rgba(0, 0, 0, 0.12), 0 4px 8px -4px rgba(0, 0, 0, 0.24), 0 16px 24px -8px rgba(0, 0, 0, 0.32)
  • Modals and dialogs: 0 1px 1px rgba(0, 0, 0, 0.12), 0 8px 16px -4px rgba(0, 0, 0, 0.24), 0 24px 32px -8px rgba(0, 0, 0, 0.4)

Tooltips take the lightest of these. Pair each elevation with the matching radius below.

Motion

Use motion only when it clarifies a change, never for decoration. Most interactions should feel instant: a duration of 0ms is often the snappiest and best choice, and the call is context-dependent. When motion genuinely helps, such as revealing or moving an element, keep it short and physical with the easing cubic-bezier(0.175, 0.885, 0.32, 1.1): roughly 150ms for state changes, 200ms for popovers and tooltips, and 300ms for overlays and modals. Avoid long, looping, or attention-grabbing animation, and honor prefers-reduced-motion by dropping nonessential motion.

Shapes

Radii stay tight: 6px for everyday surfaces and controls, 12px for menus and modals, 16px for fullscreen surfaces. Reserve 9999px for pills, avatars, and circular controls. Keep one radius family per view rather than mixing rounded and sharp corners.

Components

The components tokens above give ready-to-use values per element (backgroundColor, textColor, rounded, height) drawn from this theme:

  • Primary button: solid gray-1000 fill with a background-100 label, for the single most important action on a view (e.g. New Container, Create).
  • Secondary button: background-100 fill with a translucent gray-alpha-400 border.
  • Tertiary button: transparent fill with gray-1000 text for low-emphasis actions; it tints with gray-alpha on hover.
  • Error button: solid red-800 fill with white text, for destructive actions (e.g. Delete Container).
  • Input: background-100 fill, translucent border, 6px radius.

The variant tokens are the default medium (40px) size. Use the button-small/input-small (32px) and button-large/input-large (48px) tokens for the other sizes; large buttons step up to button-16. Hover and active states step up the scale: a 100 fill becomes 200 on hover and 300 on active, and borders move from 400 to 500 to 600. Disabled uses a gray-200 fill, gray-700 text, and a not-allowed cursor. Focus shows a two-layer ring (box-shadow: 0 0 0 2px #0a0a0a, 0 0 0 4px #0070f3): a 2px gap in the surface color, then a 2px blue-700 ring.

Container runtime views (emulator screen, agent console, terminal) use a pure #000 surface so guest output stays legible; the dashboard chrome, cards, modals, and settings share the same dark Geist palette (background-100, gray-1000 text).

Voice & Content

Copy is part of the design; keep it precise and free of filler.

  • Use Title Case for labels, buttons, titles, and tabs; sentence case for body, helper text, and toasts.
  • Name actions with a verb and a noun (New Container, Delete Container), never Confirm, OK, or a bare verb.
  • Write errors as what happened plus what to do next: Boot failed. Check that the OS image finished downloading, then try again.
  • Toasts name the specific thing that changed, drop the trailing period, and never say successfully: Container deleted, not Successfully deleted the container.
  • Empty states point to the first action: No containers yet. Create one to run an agent, app, or mini OS.
  • Use the present participle with an ellipsis for in-progress states: Booting…, Saving….
  • Use numerals (3 containers), curly quotes, and the ellipsis character; skip please and marketing superlatives.

Do's and Don'ts

  • Use the gray scale to rank information: 1000 for primary text, 900 for secondary, 700 for disabled.
  • Keep solid accent color for state and the single most important action on a view.
  • Hold WCAG AA contrast (4.5:1 for body text).
  • Show the focus ring on every interactive element at :focus-visible, and never remove an outline without a visible replacement.
  • Apply the typography tokens instead of setting font size, line height, or weight by hand.
  • Don't signal state with color alone; pair it with an icon or text label.
  • Don't use background-200 as a general fill; it is for subtle separation only.
  • Don't mix rounded and sharp corners, or more than two font weights, in one view.
  • Don't swap gray-* for background-*; they are separate scales.