@cosxai/ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/package.json +38 -0
  2. package/src/actionbar/ActionBar.tsx +436 -0
  3. package/src/actionbar/ActionBarButton.tsx +110 -0
  4. package/src/actionbar/ActionBarMenuGroup.tsx +106 -0
  5. package/src/actionbar/ActionBarProvider.tsx +76 -0
  6. package/src/actionbar/actionbar-context.ts +23 -0
  7. package/src/actionbar/index.ts +13 -0
  8. package/src/actionbar/types.ts +50 -0
  9. package/src/actionbar/useActionBarItems.ts +47 -0
  10. package/src/ambient/AmbientBackdrop.tsx +74 -0
  11. package/src/ambient/CommandInput.tsx +107 -0
  12. package/src/ambient/SuperbarStrip.tsx +36 -0
  13. package/src/ambient/index.ts +6 -0
  14. package/src/bento/BentoCell.tsx +66 -0
  15. package/src/bento/BentoGrid.tsx +42 -0
  16. package/src/bento/index.ts +2 -0
  17. package/src/command/CommandPalette.tsx +277 -0
  18. package/src/command/CommandProvider.tsx +57 -0
  19. package/src/command/command-context.ts +12 -0
  20. package/src/command/index.ts +6 -0
  21. package/src/command/rank.ts +45 -0
  22. package/src/command/types.ts +26 -0
  23. package/src/command/useCommandSource.ts +37 -0
  24. package/src/dialogs/DialogsProvider.tsx +216 -0
  25. package/src/dialogs/Modal.tsx +204 -0
  26. package/src/dialogs/Toast.tsx +85 -0
  27. package/src/dialogs/dialogs-context.ts +6 -0
  28. package/src/dialogs/index.ts +10 -0
  29. package/src/dialogs/types.ts +37 -0
  30. package/src/dialogs/useDialogs.ts +8 -0
  31. package/src/editorial/EditorialSpotlight.tsx +63 -0
  32. package/src/editorial/Folio.tsx +52 -0
  33. package/src/editorial/PlateMarker.tsx +33 -0
  34. package/src/editorial/RomanSection.tsx +65 -0
  35. package/src/editorial/RunningMarginalia.tsx +65 -0
  36. package/src/editorial/index.ts +10 -0
  37. package/src/frutiger/GlossyOrb.tsx +79 -0
  38. package/src/frutiger/SkyBackdrop.tsx +114 -0
  39. package/src/frutiger/index.ts +2 -0
  40. package/src/hooks/index.ts +5 -0
  41. package/src/hooks/useKeyboardHotkey.ts +80 -0
  42. package/src/hooks/useReducedMotion.ts +20 -0
  43. package/src/hooks/useViewport.ts +61 -0
  44. package/src/index.ts +26 -0
  45. package/src/layout/Breadcrumb.tsx +74 -0
  46. package/src/layout/LeftNavRail.tsx +126 -0
  47. package/src/layout/MobileTabBar.tsx +101 -0
  48. package/src/layout/NavItem.tsx +128 -0
  49. package/src/layout/NavSearchTrigger.tsx +88 -0
  50. package/src/layout/NavSection.tsx +40 -0
  51. package/src/layout/RightSidebarPanel.tsx +111 -0
  52. package/src/layout/Shell.tsx +91 -0
  53. package/src/layout/StickyBanner.tsx +83 -0
  54. package/src/layout/Topbar.tsx +68 -0
  55. package/src/layout/index.ts +22 -0
  56. package/src/layout/useNavRailState.ts +69 -0
  57. package/src/lib/cn.ts +7 -0
  58. package/src/lib/time-utils.ts +44 -0
  59. package/src/neobrutalism/Marquee.tsx +81 -0
  60. package/src/neobrutalism/Sticker.tsx +71 -0
  61. package/src/neobrutalism/index.ts +4 -0
  62. package/src/primitives/Avatar.tsx +53 -0
  63. package/src/primitives/Button.tsx +30 -0
  64. package/src/primitives/Card.tsx +41 -0
  65. package/src/primitives/Checkbox.tsx +78 -0
  66. package/src/primitives/CountBadge.tsx +50 -0
  67. package/src/primitives/Input.tsx +71 -0
  68. package/src/primitives/Kbd.tsx +45 -0
  69. package/src/primitives/PageHeader.tsx +77 -0
  70. package/src/primitives/Tag.tsx +56 -0
  71. package/src/primitives/Textarea.tsx +62 -0
  72. package/src/primitives/ToggleSwitch.tsx +79 -0
  73. package/src/primitives/Tooltip.tsx +171 -0
  74. package/src/primitives/index.ts +24 -0
  75. package/src/pwa/InstallPromptBanner.tsx +132 -0
  76. package/src/pwa/index.ts +4 -0
  77. package/src/pwa/manifest.template.json +20 -0
  78. package/src/pwa/registerSW.ts +55 -0
  79. package/src/riso/Halftone.tsx +85 -0
  80. package/src/riso/Misregister.tsx +63 -0
  81. package/src/riso/RisoStamp.tsx +76 -0
  82. package/src/riso/index.ts +3 -0
  83. package/src/sketch/HandUnderline.tsx +53 -0
  84. package/src/sketch/RoughArrow.tsx +91 -0
  85. package/src/sketch/RoughBox.tsx +73 -0
  86. package/src/sketch/StickyNote.tsx +56 -0
  87. package/src/sketch/index.ts +4 -0
  88. package/src/styles/base.css +80 -0
  89. package/src/styles/chrome-ambient.css +222 -0
  90. package/src/styles/chrome-bento.css +184 -0
  91. package/src/styles/chrome-editorial.css +145 -0
  92. package/src/styles/chrome-frutiger.css +364 -0
  93. package/src/styles/chrome-neobrutalism.css +315 -0
  94. package/src/styles/chrome-riso.css +328 -0
  95. package/src/styles/chrome-sketch.css +351 -0
  96. package/src/styles/chrome-swiss.css +232 -0
  97. package/src/styles/chrome-terminal.css +235 -0
  98. package/src/styles/fonts.css +22 -0
  99. package/src/styles/index.css +198 -0
  100. package/src/styles/tokens.css +976 -0
  101. package/src/terminal/AsciiBox.tsx +65 -0
  102. package/src/terminal/BrailleSpinner.tsx +46 -0
  103. package/src/terminal/index.ts +4 -0
  104. package/src/theme/ThemeProvider.tsx +93 -0
  105. package/src/theme/index.ts +5 -0
  106. package/src/theme/inline-script.ts +36 -0
  107. package/src/theme/theme-context.ts +7 -0
  108. package/src/theme/types.ts +22 -0
  109. package/src/theme/useTheme.ts +8 -0
@@ -0,0 +1,976 @@
1
+ /* ============================================================
2
+ @cosxai/ui — design tokens
3
+ Variables only. No selectors that target consumer markup,
4
+ no app-specific overrides (those belong in the consumer).
5
+ Two axes: theme (light | dark) via html[data-ck-theme], chrome
6
+ (classic | seamless) via html[data-ck-chrome]. Both default to
7
+ light/classic on :root.
8
+ ============================================================ */
9
+
10
+ :root {
11
+ /* ---------- Fonts ----------
12
+ Four slots — sans (UI body), mono (metadata / kbd / coordinates),
13
+ serif (editorial body), and display (headlines). By default
14
+ display = sans so headings inherit the same neutral grotesk;
15
+ editorial chrome overrides display → serif to flip headlines
16
+ to a high-contrast serif without touching component code. */
17
+ --ck-font-sans: "Geist", "Inter", system-ui, -apple-system, sans-serif;
18
+ --ck-font-mono: "Geist Mono", "JetBrains Mono", ui-monospace, "SF Mono", Menlo, monospace;
19
+ --ck-font-serif: "Playfair Display", "GT Sectra", "Canela", Georgia, serif;
20
+ --ck-font-display: var(--ck-font-sans);
21
+
22
+ /* ---------- Radii / motion ---------- */
23
+ --ck-radius-xs: 4px;
24
+ --ck-radius-sm: 6px;
25
+ --ck-radius-md: 8px;
26
+ --ck-radius-lg: 12px;
27
+ --ck-radius-xl: 16px;
28
+ --ck-ease: cubic-bezier(0.4, 0, 0.2, 1);
29
+ --ck-dur-fast: 150ms;
30
+ --ck-dur-page: 260ms;
31
+
32
+ /* ---------- Mono type sizes ----------
33
+ Drives the eyebrow / tag / meta scale. Body sans sizes are
34
+ set inline on typography utility classes. */
35
+ --ck-mono-tag-size: 10px;
36
+ --ck-mono-xs-size: 11px;
37
+ --ck-mono-sm-size: 12px;
38
+ --ck-mono-md-size: 14px;
39
+
40
+ /* ---------- Light palette (default) ---------- */
41
+ --ck-bg-canvas: #ECEEF2;
42
+ --ck-bg-surface: #FFFFFF;
43
+ --ck-bg-surface-2: #F4F6F9;
44
+ --ck-bg-muted: #E5E8EE;
45
+ --ck-bg-sidebar: #F4F4F6;
46
+
47
+ --ck-border-subtle: #DDE0E6;
48
+ --ck-border-strong: #C5C9D2;
49
+
50
+ --ck-text-primary: #0A0E1A;
51
+ --ck-text-secondary: #4A5160;
52
+ --ck-text-tertiary: #8B92A3;
53
+ --ck-text-disabled: #B8BDC8;
54
+ --ck-text-inverse: #FFFFFF;
55
+
56
+ /* Accent — single primitive, every shade derives via color-mix().
57
+ Runtime brand override: stamp --ck-accent-light-override or
58
+ --ck-accent-dark-override on documentElement.style. */
59
+ --ck-accent: var(--ck-accent-light-override, #534AB7);
60
+ --ck-accent-hover: color-mix(in oklab, var(--ck-accent), black 10%);
61
+ --ck-accent-active: color-mix(in oklab, var(--ck-accent), black 18%);
62
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 8%, transparent);
63
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 35%, transparent);
64
+ --ck-border-focus: var(--ck-accent);
65
+
66
+ /* Status */
67
+ --ck-success: #0E9F6E;
68
+ --ck-success-muted: #E3F5EE;
69
+ --ck-warning: #D97706;
70
+ --ck-warning-muted: #FEF3E7;
71
+ --ck-critical: #DC2626;
72
+ --ck-critical-muted: #FCEAEA;
73
+ --ck-info: var(--ck-accent);
74
+ --ck-info-muted: var(--ck-accent-muted);
75
+
76
+ /* Shadows */
77
+ --ck-shadow-1: 0 1px 2px rgba(10, 14, 26, 0.04);
78
+ --ck-shadow-2: 0 4px 12px rgba(10, 14, 26, 0.06), 0 1px 2px rgba(10, 14, 26, 0.04);
79
+ --ck-shadow-3: 0 16px 48px rgba(10, 14, 26, 0.12), 0 4px 12px rgba(10, 14, 26, 0.06);
80
+
81
+ /* Layout vars — owned by layout primitives. Default 0 so pages
82
+ that don't mount the rails don't reserve space. */
83
+ --ck-leftnav-width: 0px;
84
+ --ck-rightrail-width: 0px;
85
+ --ck-tabbar-height: 0px;
86
+ --ck-breadcrumb-height: 64px;
87
+ }
88
+
89
+ /* ---------- Dark theme ---------- */
90
+ html[data-ck-theme="dark"] {
91
+ --ck-bg-canvas: #0B0D12;
92
+ --ck-bg-surface: #13161D;
93
+ --ck-bg-surface-2: #1A1E27;
94
+ --ck-bg-muted: #181B23;
95
+ --ck-bg-sidebar: #090B10;
96
+
97
+ --ck-border-subtle: #1F242E;
98
+ --ck-border-strong: #2A303C;
99
+
100
+ --ck-text-primary: #F2F3F5;
101
+ --ck-text-secondary: #A0A6B3;
102
+ --ck-text-tertiary: #6B7280;
103
+ --ck-text-disabled: #4A5160;
104
+ --ck-text-inverse: #0A0E1A;
105
+
106
+ --ck-accent: var(--ck-accent-dark-override, #7B72D9);
107
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 12%, transparent);
108
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 32%, transparent);
109
+
110
+ --ck-success: #34D399; --ck-success-muted: rgba(52, 211, 153, 0.12);
111
+ --ck-warning: #FBBF24; --ck-warning-muted: rgba(251, 191, 36, 0.12);
112
+ --ck-critical: #F87171; --ck-critical-muted: rgba(248, 113, 113, 0.12);
113
+
114
+ --ck-shadow-1: none;
115
+ --ck-shadow-2: 0 8px 24px rgba(0, 0, 0, 0.4);
116
+ --ck-shadow-3: 0 24px 64px rgba(0, 0, 0, 0.5);
117
+ --ck-glow-accent: 0 0 32px color-mix(in srgb, var(--ck-accent) 25%, transparent);
118
+ }
119
+
120
+ /* ---------- Seamless chrome — borders go transparent, layering
121
+ carried by background shifts. Things 3 / Linear /
122
+ Raycast feel. Combine with dark via
123
+ html[data-ck-theme='dark'][data-ck-chrome='seamless']. */
124
+ html[data-ck-chrome="seamless"] {
125
+ --ck-bg-canvas: #FAFAFB;
126
+ --ck-bg-sidebar: #F4F4F6;
127
+ --ck-bg-surface: #FFFFFF;
128
+ --ck-bg-surface-2: #FCFCFD;
129
+ --ck-bg-muted: #F1F2F4;
130
+ --ck-border-subtle: transparent;
131
+ --ck-border-strong: rgba(10, 14, 26, 0.08);
132
+ --ck-shadow-1: 0 1px 2px rgba(10, 14, 26, 0.03);
133
+ --ck-shadow-2: 0 4px 16px rgba(10, 14, 26, 0.04), 0 1px 3px rgba(10, 14, 26, 0.03);
134
+ }
135
+ html[data-ck-theme="dark"][data-ck-chrome="seamless"] {
136
+ --ck-bg-canvas: #0F1218;
137
+ --ck-bg-sidebar: #090B10;
138
+ --ck-bg-surface: #181C24;
139
+ --ck-bg-surface-2: #1F232D;
140
+ --ck-bg-muted: #14171E;
141
+ --ck-border-subtle: transparent;
142
+ --ck-border-strong: rgba(255, 255, 255, 0.08);
143
+ --ck-shadow-1: none;
144
+ --ck-shadow-2: 0 12px 32px rgba(0, 0, 0, 0.5);
145
+ }
146
+
147
+ /* ---------- Editorial chrome — print-magazine / art-quarterly
148
+ aesthetic. Cream paper canvas, coral accent, serif
149
+ headlines. Defaults to its own light variant; the
150
+ [data-ck-theme="dark"] variant flips to the inverted
151
+ "spotlight" surface from the brief. Pure white never
152
+ appears in either mode. */
153
+ html[data-ck-chrome="editorial"] {
154
+ /* Cream paper, slightly green-tinted (--bg-paper) */
155
+ --ck-bg-canvas: #ECE6D6;
156
+ --ck-bg-sidebar: #E5DECB;
157
+ --ck-bg-surface: #E5DECB;
158
+ --ck-bg-surface-2: #DCD4C0;
159
+ --ck-bg-muted: #DCD4C0;
160
+
161
+ --ck-border-subtle: #A8A294;
162
+ --ck-border-strong: #6B6557;
163
+
164
+ /* Ink stack */
165
+ --ck-text-primary: #0F0F0F;
166
+ --ck-text-secondary: #6B6557;
167
+ --ck-text-tertiary: #A8A294;
168
+ --ck-text-disabled: #C9C3B5;
169
+ --ck-text-inverse: #ECE6D6;
170
+
171
+ /* Coral is THE accent. Ochre lives in --ck-warning for
172
+ secondary "guest star" use (the brief says one accent only;
173
+ ochre repurposes the warning slot since its tone matches). */
174
+ --ck-accent: #E96E50;
175
+ --ck-accent-hover: #D85A3E;
176
+ --ck-accent-active: #C44D34;
177
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 14%, transparent);
178
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 40%, transparent);
179
+ --ck-border-focus: var(--ck-accent);
180
+
181
+ --ck-warning: #C99A3A;
182
+ --ck-warning-muted: color-mix(in oklab, var(--ck-warning) 18%, transparent);
183
+
184
+ /* Serif headlines + tracked-sans body. */
185
+ --ck-font-display: var(--ck-font-serif);
186
+
187
+ /* No drop shadows. 1 px hairlines do all the layering work. */
188
+ --ck-shadow-1: none;
189
+ --ck-shadow-2: none;
190
+ --ck-shadow-3: 0 2px 0 rgba(15, 15, 15, 0.04);
191
+ }
192
+
193
+ /* Dark editorial — coherent dark mode: charcoal canvas + lifted
194
+ charcoal cards + cream ink + coral accent. Like a magazine
195
+ printed on black paper. The "spotlight" inversion (cream paper
196
+ card on dark canvas) from the brief is intentionally OUT of the
197
+ global theme — it would break legibility when used as the
198
+ whole-page default (cream text on cream cards = invisible). For
199
+ genuine spotlight sections wrap content in <EditorialSpotlight>
200
+ which flips just its own subtree back to cream-on-dark. */
201
+ html[data-ck-theme="dark"][data-ck-chrome="editorial"] {
202
+ --ck-bg-canvas: #0E0E0E;
203
+ --ck-bg-sidebar: #161616;
204
+ --ck-bg-surface: #1A1A1A;
205
+ --ck-bg-surface-2: #232323;
206
+ --ck-bg-muted: #161616;
207
+
208
+ /* Cream-tinted hairlines so dividers read against charcoal
209
+ without going stark white. */
210
+ --ck-border-subtle: rgba(244, 239, 224, 0.12);
211
+ --ck-border-strong: rgba(244, 239, 224, 0.24);
212
+
213
+ /* Cream ink stack — printed-on-black-paper feel. */
214
+ --ck-text-primary: #F4EFE0;
215
+ --ck-text-secondary: #C9C3B5;
216
+ --ck-text-tertiary: #8F897D;
217
+ --ck-text-disabled: #5C5851;
218
+ --ck-text-inverse: #0F0F0F;
219
+
220
+ /* Coral inherits from the parent editorial block. Bump muted/
221
+ border alpha so accent tints still register on charcoal
222
+ without going neon. */
223
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 22%, transparent);
224
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 44%, transparent);
225
+ }
226
+
227
+ /* ---------- Neobrutalism chrome — thick 2 px borders, hard
228
+ offset shadows, pastel canvas, saturated accent.
229
+ Memphis-group-meets-shareware aesthetic. The signature
230
+ move (hover-translate) is wired in
231
+ chrome-neobrutalism.css; this block just sets the
232
+ colour + typography stack. */
233
+ html[data-ck-chrome="neobrutalism"] {
234
+ --ck-bg-canvas: #FEF2E8;
235
+ --ck-bg-sidebar: #FEF2E8;
236
+ --ck-bg-surface: #FFFFFF;
237
+ --ck-bg-surface-2: #E3DFF2;
238
+ --ck-bg-muted: #E3DFF2;
239
+
240
+ /* All borders are pure black under neobrutalism — the brief
241
+ forbids gray. --neobrut-ink is the canonical "stamp colour"
242
+ used by every border + shadow in chrome-neobrutalism.css;
243
+ flips to near-white in dark mode (see below). */
244
+ --neobrut-ink: #000000;
245
+ --ck-border-subtle: #000000;
246
+ --ck-border-strong: #000000;
247
+ --ck-border-focus: #000000;
248
+
249
+ --ck-text-primary: #000000;
250
+ --ck-text-secondary: #1A1A1A;
251
+ --ck-text-tertiary: #4A4A4A;
252
+ --ck-text-disabled: #999999;
253
+ --ck-text-inverse: #FFFFFF;
254
+
255
+ /* Canonical blue accent. Override by setting --ck-accent-light-
256
+ override on documentElement to pick a different hero — the
257
+ brief approves lime, orange, violet, pink, yellow, teal. */
258
+ --ck-accent: var(--ck-accent-light-override, #88AAEE);
259
+ --ck-accent-hover: var(--ck-accent);
260
+ --ck-accent-active: var(--ck-accent);
261
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 30%, transparent);
262
+ --ck-accent-border: #000000;
263
+
264
+ /* Status colours saturated per brief. */
265
+ --ck-success: #A3E636;
266
+ --ck-warning: #FFD23F;
267
+ --ck-critical: #FF6B6B;
268
+
269
+ /* Display font — Archivo Black for headlines is the canonical
270
+ neobrutalism pick. Body uses Geist's heaviest weight. */
271
+ --ck-font-display: "Archivo Black", "Space Grotesk", var(--ck-font-sans);
272
+
273
+ /* Hard offset shadow primitive. Component CSS reads this so the
274
+ consistent "4 px offset, pure black, zero blur" reads through
275
+ every interactive surface. */
276
+ --ck-shadow-1: 2px 2px 0 0 var(--neobrut-ink);
277
+ --ck-shadow-2: 4px 4px 0 0 var(--neobrut-ink);
278
+ --ck-shadow-3: 8px 8px 0 0 var(--neobrut-ink);
279
+ }
280
+
281
+ html[data-ck-theme="dark"][data-ck-chrome="neobrutalism"] {
282
+ /* Dark canvas — deep saturated navy / purple. Lifted slightly
283
+ so the dark-gray card surface beneath it reads as DARKER
284
+ than canvas. Mirrors the reference site (neobrutalism.dev)
285
+ pattern exactly: canvas is the brighter hue, cards sit
286
+ darker, borders + shadows stay PURE BLACK in both modes. */
287
+ --ck-bg-canvas: oklch(29.12% 0.0633 270.86);
288
+ /* Cards / sidebar — dark gray, DARKER than canvas. Black
289
+ offset shadow on the brighter navy canvas is the dominant
290
+ visual cue; the border on the card is a quieter structural
291
+ line. */
292
+ --ck-bg-sidebar: oklch(23.93% 0 0);
293
+ --ck-bg-surface: oklch(23.93% 0 0);
294
+ --ck-bg-surface-2: oklch(28% 0 0);
295
+ --ck-bg-muted: oklch(28% 0 0);
296
+
297
+ /* CRITICAL: borders + shadows stay PURE BLACK in dark mode.
298
+ I tried flipping them to white earlier — that's the wrong
299
+ direction. The chunky offset shadow is black on the navy
300
+ canvas, which is where the contrast lives. */
301
+ --neobrut-ink: #000000;
302
+ --ck-border-subtle: #000000;
303
+ --ck-border-strong: #000000;
304
+ --ck-border-focus: #FFFFFF;
305
+
306
+ --ck-text-primary: oklch(92.49% 0 0);
307
+ --ck-text-secondary: #C0C0C0;
308
+ --ck-text-tertiary: #888888;
309
+ --ck-text-disabled: #555555;
310
+ --ck-text-inverse: #000000;
311
+
312
+ /* Accent stays identical to light — brand commitment doesn't
313
+ flip per theme. Override per-app via
314
+ --ck-accent-dark-override if you want a different shade. */
315
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #88AAEE));
316
+
317
+ /* Shadow sizes back to the canonical 4 px offset that the
318
+ light mode uses — same chunky language across themes. */
319
+ --ck-shadow-1: 2px 2px 0 0 var(--neobrut-ink);
320
+ --ck-shadow-2: 4px 4px 0 0 var(--neobrut-ink);
321
+ --ck-shadow-3: 8px 8px 0 0 var(--neobrut-ink);
322
+ }
323
+
324
+ /* ---------- Ambient Glass chrome — Superlist / Linear / Arc /
325
+ Things 3 aesthetic. Translucent glass surfaces over
326
+ an ambient gradient backdrop. Dark-first; light is a
327
+ fully equal counterpart. The defining gesture is the
328
+ single multi-stop "Superbar" gradient used as a thin
329
+ accent on active elements. */
330
+ html[data-ck-chrome="ambient"] {
331
+ /* Ambient backdrop — radial gradient mesh derived from
332
+ --ck-accent. Three different opacities of the brand colour
333
+ bloom from three corners over a near-neutral base. Change
334
+ the accent (via --ck-accent-*-override) and the entire mesh
335
+ re-tints to match — coral accent yields a coral-bloom mesh,
336
+ emerald yields an emerald mesh, etc. Painted on body (Shell
337
+ inherits) so glass surfaces have something behind them to
338
+ blur.
339
+
340
+ Override --ck-bg-canvas directly if you want a fixed mesh
341
+ not derived from accent. */
342
+ --ck-bg-canvas:
343
+ radial-gradient(ellipse at 18% 22%, color-mix(in oklab, var(--ck-accent) 40%, transparent) 0%, transparent 55%),
344
+ radial-gradient(ellipse at 82% 70%, color-mix(in oklab, var(--ck-accent) 22%, transparent) 0%, transparent 52%),
345
+ radial-gradient(ellipse at 50% 110%, color-mix(in oklab, var(--ck-accent) 32%, transparent) 0%, transparent 50%),
346
+ #1A1525;
347
+
348
+ /* Glass overlay surfaces — semi-transparent so backdrop-filter
349
+ blurs the ambient mesh underneath. Cards, sidebar, topbar all
350
+ read from these. */
351
+ --ck-bg-surface: rgba(255, 255, 255, 0.05);
352
+ --ck-bg-surface-2: rgba(255, 255, 255, 0.08);
353
+ --ck-bg-sidebar: rgba(20, 20, 28, 0.55);
354
+ --ck-bg-muted: rgba(255, 255, 255, 0.04);
355
+
356
+ --ck-border-subtle: rgba(255, 255, 255, 0.08);
357
+ --ck-border-strong: rgba(255, 255, 255, 0.16);
358
+ --ck-border-focus: rgba(255, 122, 162, 0.6);
359
+
360
+ --ck-text-primary: #F5F5F7;
361
+ --ck-text-secondary: #A0A0AB;
362
+ --ck-text-tertiary: #6B6B78;
363
+ --ck-text-disabled: #4A4A52;
364
+ --ck-text-inverse: #1A1525;
365
+
366
+ /* Coral as the single brand pop. Override via the *-override
367
+ vars per-app to pick a different signature colour. */
368
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #FF6B7A));
369
+ --ck-accent-hover: color-mix(in oklab, var(--ck-accent), white 10%);
370
+ --ck-accent-active: color-mix(in oklab, var(--ck-accent), black 8%);
371
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 14%, transparent);
372
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 40%, transparent);
373
+
374
+ --ck-success: #6EE7B7;
375
+ --ck-warning: #FCD34D;
376
+ --ck-critical: #FF8A8A;
377
+
378
+ /* The Superbar — multi-stop signature gradient. Used as a thin
379
+ accent (right-edge strip on active items, divider above the
380
+ command input, tab underlines). Never as a button fill. */
381
+ --ck-superbar: linear-gradient(90deg, #FF7AA2 0%, #B66EFF 50%, #5DA8FF 100%);
382
+
383
+ /* Larger radii — every surface softens. */
384
+ --ck-radius-xs: 6px;
385
+ --ck-radius-sm: 10px;
386
+ --ck-radius-md: 14px;
387
+ --ck-radius-lg: 18px;
388
+ --ck-radius-xl: 22px;
389
+
390
+ /* Soft outer shadow — large blur, low opacity. Depth comes
391
+ from this gentle haze, not hard offsets. */
392
+ --ck-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.18);
393
+ --ck-shadow-2: 0 8px 24px rgba(0, 0, 0, 0.24), 0 2px 6px rgba(0, 0, 0, 0.16);
394
+ --ck-shadow-3: 0 24px 60px rgba(0, 0, 0, 0.4), 0 4px 12px rgba(0, 0, 0, 0.2);
395
+
396
+ /* Backdrop blur strength — referenced from CSS in chrome-ambient.css. */
397
+ --ck-blur-window: blur(24px) saturate(140%);
398
+ --ck-blur-overlay: blur(40px) saturate(180%);
399
+ }
400
+
401
+ html[data-ck-theme="light"][data-ck-chrome="ambient"] {
402
+ /* Warm off-white ambient — softer mesh than the dark counterpart
403
+ but the same structural approach. */
404
+ /* Light mesh — same accent-derived structure as dark, lighter
405
+ base + lower opacity stops so the mesh reads as soft glow
406
+ blooms instead of saturated tints. */
407
+ --ck-bg-canvas:
408
+ radial-gradient(ellipse at 18% 22%, color-mix(in oklab, var(--ck-accent) 28%, transparent) 0%, transparent 55%),
409
+ radial-gradient(ellipse at 82% 70%, color-mix(in oklab, var(--ck-accent) 16%, transparent) 0%, transparent 52%),
410
+ radial-gradient(ellipse at 50% 110%, color-mix(in oklab, var(--ck-accent) 22%, transparent) 0%, transparent 50%),
411
+ #F1EDE6;
412
+
413
+ --ck-bg-surface: rgba(255, 255, 255, 0.62);
414
+ --ck-bg-surface-2: rgba(255, 255, 255, 0.72);
415
+ --ck-bg-sidebar: rgba(255, 255, 255, 0.58);
416
+ --ck-bg-muted: rgba(0, 0, 0, 0.03);
417
+
418
+ --ck-border-subtle: rgba(20, 20, 30, 0.08);
419
+ --ck-border-strong: rgba(20, 20, 30, 0.14);
420
+
421
+ --ck-text-primary: #1A1A22;
422
+ --ck-text-secondary: #5E5E68;
423
+ --ck-text-tertiary: #8B8B95;
424
+ --ck-text-disabled: #B5B5BC;
425
+ --ck-text-inverse: #FFFFFF;
426
+ }
427
+
428
+ /* ---------- Swiss / International Typographic chrome —
429
+ Müller-Brockmann / Vignelli / Stripe docs / Vercel
430
+ docs aesthetic. Achromatic + one saturated accent
431
+ (red by default). Single neutral grotesk family,
432
+ tight letter-spacing on headlines. No shadows, no
433
+ gradients, no decoration — type and space do all
434
+ the work. */
435
+ html[data-ck-chrome="swiss"] {
436
+ /* Pure white canvas; bg-alt for very rare row tinting. */
437
+ --ck-bg-canvas: #FFFFFF;
438
+ --ck-bg-sidebar: #FFFFFF;
439
+ --ck-bg-surface: #FFFFFF;
440
+ --ck-bg-surface-2: #F4F4F4;
441
+ --ck-bg-muted: #F4F4F4;
442
+
443
+ /* Near-black ink. Rule colour is a quiet gray; strong is the
444
+ ink itself (used for input focus underline + secondary
445
+ button border). */
446
+ --ck-border-subtle: #E5E5E5;
447
+ --ck-border-strong: #0A0A0A;
448
+ --ck-border-focus: #0A0A0A;
449
+
450
+ --ck-text-primary: #0A0A0A;
451
+ --ck-text-secondary: #525252;
452
+ --ck-text-tertiary: #A3A3A3;
453
+ --ck-text-disabled: #D4D4D4;
454
+ --ck-text-inverse: #FFFFFF;
455
+
456
+ /* Canonical Swiss red. Used SPARINGLY — links, active marks,
457
+ single accent button per page. Override per-app via
458
+ --ck-accent-*-override (deep blue / forest green /
459
+ international orange are the brief's other valid hero
460
+ colours). */
461
+ --ck-accent: var(--ck-accent-light-override, #DC2626);
462
+ --ck-accent-hover: color-mix(in oklab, var(--ck-accent), black 8%);
463
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 10%, transparent);
464
+ --ck-accent-border: var(--ck-accent);
465
+
466
+ /* Single sans family — no display swap. The same grotesk runs
467
+ headline → body → caption. Headlines achieve scale through
468
+ size + weight + letter-spacing, not a different face. */
469
+ --ck-font-display: var(--ck-font-sans);
470
+
471
+ /* Tiny radii — 3 px feels engineered, not friendly. */
472
+ --ck-radius-xs: 2px;
473
+ --ck-radius-sm: 3px;
474
+ --ck-radius-md: 3px;
475
+ --ck-radius-lg: 4px;
476
+ --ck-radius-xl: 4px;
477
+
478
+ /* No shadows. Depth comes from 1 px rules + whitespace. */
479
+ --ck-shadow-1: none;
480
+ --ck-shadow-2: none;
481
+ --ck-shadow-3: none;
482
+ }
483
+
484
+ html[data-ck-theme="dark"][data-ck-chrome="swiss"] {
485
+ --ck-bg-canvas: #0A0A0A;
486
+ --ck-bg-sidebar: #0A0A0A;
487
+ --ck-bg-surface: #0A0A0A;
488
+ --ck-bg-surface-2: #161616;
489
+ --ck-bg-muted: #161616;
490
+
491
+ --ck-border-subtle: rgba(255, 255, 255, 0.12);
492
+ --ck-border-strong: #FAFAFA;
493
+ --ck-border-focus: #FAFAFA;
494
+
495
+ --ck-text-primary: #FAFAFA;
496
+ --ck-text-secondary: #A3A3A3;
497
+ --ck-text-tertiary: #525252;
498
+ --ck-text-disabled: #2F2F2F;
499
+ --ck-text-inverse: #0A0A0A;
500
+
501
+ /* Brighter red against the near-black canvas. */
502
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #EF4444));
503
+ }
504
+
505
+ /* ---------- Terminal / Monospace Maximalist chrome —
506
+ Vercel v0 / charm.sh / Warp / Lazygit / k9s feel.
507
+ Dark by default (CRT-style), light "vellum" variant
508
+ available. Everything monospace, semantic colours
509
+ only, square corners. */
510
+ html[data-ck-chrome="terminal"] {
511
+ /* Canonical dark canvas — near-black with a hint of warmth. */
512
+ --ck-bg-canvas: #0A0A0A;
513
+ --ck-bg-sidebar: #0A0A0A;
514
+ --ck-bg-surface: #141414;
515
+ --ck-bg-surface-2: #1A1A1A;
516
+ --ck-bg-muted: #1A1A1A;
517
+
518
+ --ck-border-subtle: #262626;
519
+ --ck-border-strong: #404040;
520
+ --ck-border-focus: #4ADE80;
521
+
522
+ --ck-text-primary: #E5E5E5;
523
+ --ck-text-secondary: #A3A3A3;
524
+ --ck-text-tertiary: #525252;
525
+ --ck-text-disabled: #404040;
526
+ --ck-text-inverse: #0A0A0A;
527
+
528
+ /* Terminal canon — six semantic colours that earn their place
529
+ by signalling state, never by decorating. Available as
530
+ CSS variables so consumer code can read them directly. */
531
+ --ck-term-green: #4ADE80;
532
+ --ck-term-amber: #FBBF24;
533
+ --ck-term-red: #F87171;
534
+ --ck-term-blue: #60A5FA;
535
+ --ck-term-magenta: #C084FC;
536
+ --ck-term-cyan: #67E8F9;
537
+ --ck-term-bright: #FAFAFA;
538
+
539
+ /* Default accent — green (the dominant terminal hue for
540
+ active / success). Override to swap to amber / blue /
541
+ magenta etc. as the brand pop. */
542
+ --ck-accent: var(--ck-accent-light-override, #4ADE80);
543
+ --ck-accent-hover: color-mix(in oklab, var(--ck-accent), white 8%);
544
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 16%, transparent);
545
+ --ck-accent-border: var(--ck-accent);
546
+
547
+ --ck-success: var(--ck-term-green);
548
+ --ck-warning: var(--ck-term-amber);
549
+ --ck-critical: var(--ck-term-red);
550
+
551
+ /* Single typeface — mono everywhere. font-display points to
552
+ mono too so headings stay terminal-textured. */
553
+ --ck-font-display: var(--ck-font-mono);
554
+ --ck-font-sans: var(--ck-font-mono);
555
+
556
+ /* Square edges (or near-square). The CRT feel forbids
557
+ anything that reads as friendly. */
558
+ --ck-radius-xs: 0px;
559
+ --ck-radius-sm: 2px;
560
+ --ck-radius-md: 2px;
561
+ --ck-radius-lg: 4px;
562
+ --ck-radius-xl: 4px;
563
+
564
+ /* No shadows. Depth comes from border darkness shifts. */
565
+ --ck-shadow-1: none;
566
+ --ck-shadow-2: none;
567
+ --ck-shadow-3: none;
568
+ }
569
+
570
+ /* Light "vellum" variant — flipped palette but same semantic
571
+ colour stack. The brief notes it should look like an iTerm2
572
+ light theme. */
573
+ html[data-ck-theme="light"][data-ck-chrome="terminal"] {
574
+ --ck-bg-canvas: #FAFAF7;
575
+ --ck-bg-sidebar: #FAFAF7;
576
+ --ck-bg-surface: #F3F3EE;
577
+ --ck-bg-surface-2: #ECECE6;
578
+ --ck-bg-muted: #ECECE6;
579
+
580
+ --ck-border-subtle: #D4D4D0;
581
+ --ck-border-strong: #A3A39E;
582
+
583
+ --ck-text-primary: #1A1A1A;
584
+ --ck-text-secondary: #525252;
585
+ --ck-text-tertiary: #A3A39E;
586
+ --ck-text-disabled: #C9C9C5;
587
+ --ck-text-inverse: #FAFAF7;
588
+
589
+ /* Dimmer semantic colours that read on the warm off-white. */
590
+ --ck-term-green: #16A34A;
591
+ --ck-term-amber: #CA8A04;
592
+ --ck-term-red: #DC2626;
593
+ --ck-term-blue: #2563EB;
594
+ --ck-term-magenta: #9333EA;
595
+ --ck-term-cyan: #0891B2;
596
+ --ck-term-bright: #0A0A0A;
597
+
598
+ --ck-accent: var(--ck-accent-light-override, #16A34A);
599
+ }
600
+
601
+ /* ---------- Bento Grid chrome — Apple product page / Linear /
602
+ Vercel marketing-page aesthetic. Less a "visual
603
+ style" than a layout pattern, but with a canonical
604
+ surface treatment that ties cells together: generous
605
+ radius (20-28 px), soft multi-layer shadow, neutral
606
+ page bg, cells where each one does its own visual
607
+ job. Pair with <BentoGrid> + <BentoCell> primitives. */
608
+ html[data-ck-chrome="bento"] {
609
+ --ck-bg-canvas: #F5F5F7;
610
+ --ck-bg-sidebar: #FFFFFF;
611
+ --ck-bg-surface: #FFFFFF;
612
+ --ck-bg-surface-2: #F0F0F2;
613
+ --ck-bg-muted: #ECECEE;
614
+
615
+ --ck-border-subtle: rgba(0, 0, 0, 0.06);
616
+ --ck-border-strong: rgba(0, 0, 0, 0.12);
617
+ --ck-border-focus: var(--ck-accent);
618
+
619
+ --ck-text-primary: #1D1D1F;
620
+ --ck-text-secondary: #6E6E73;
621
+ --ck-text-tertiary: #98989D;
622
+ --ck-text-disabled: #C7C7CC;
623
+ --ck-text-inverse: #FFFFFF;
624
+
625
+ /* Apple-y neutral accent (system blue). Override per app for
626
+ a different signature. */
627
+ --ck-accent: var(--ck-accent-light-override, #0A84FF);
628
+ --ck-accent-hover: color-mix(in oklab, var(--ck-accent), black 6%);
629
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 10%, transparent);
630
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 35%, transparent);
631
+
632
+ /* Three canonical cell-accent gradients — apply manually inside
633
+ <BentoCell tone="..."> via the demo. */
634
+ --ck-bento-grad-1: linear-gradient(135deg, #FF6B9D, #C026D3);
635
+ --ck-bento-grad-2: linear-gradient(135deg, #60A5FA, #A78BFA);
636
+ --ck-bento-grad-3: linear-gradient(135deg, #34D399, #06B6D4);
637
+
638
+ /* Generous Apple-y radii — 20 px is the cell baseline. Smaller
639
+ primitives (buttons, inputs) sit at 12 px so they nest. */
640
+ --ck-radius-xs: 8px;
641
+ --ck-radius-sm: 12px;
642
+ --ck-radius-md: 16px;
643
+ --ck-radius-lg: 22px;
644
+ --ck-radius-xl: 28px;
645
+
646
+ /* Soft multi-layer shadow — the canonical bento card lift. */
647
+ --ck-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.04);
648
+ --ck-shadow-2: 0 1px 3px rgba(0, 0, 0, 0.04), 0 8px 24px rgba(0, 0, 0, 0.06);
649
+ --ck-shadow-3: 0 1px 3px rgba(0, 0, 0, 0.05), 0 16px 40px rgba(0, 0, 0, 0.12);
650
+ }
651
+
652
+ html[data-ck-theme="dark"][data-ck-chrome="bento"] {
653
+ /* True black canvas (OLED-feel — Apple's product pages flip to
654
+ this in dark mode). */
655
+ --ck-bg-canvas: #000000;
656
+ --ck-bg-sidebar: #1C1C1E;
657
+ --ck-bg-surface: #1C1C1E;
658
+ --ck-bg-surface-2: #2C2C2E;
659
+ --ck-bg-muted: #2C2C2E;
660
+
661
+ --ck-border-subtle: rgba(255, 255, 255, 0.08);
662
+ --ck-border-strong: rgba(255, 255, 255, 0.16);
663
+
664
+ --ck-text-primary: #F5F5F7;
665
+ --ck-text-secondary: #98989D;
666
+ --ck-text-tertiary: #6E6E73;
667
+ --ck-text-disabled: #3A3A3C;
668
+ --ck-text-inverse: #1D1D1F;
669
+
670
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #0A84FF));
671
+
672
+ /* Heavier shadow on dark — needed for cards to read against
673
+ true black. */
674
+ --ck-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.4);
675
+ --ck-shadow-2: 0 1px 3px rgba(0, 0, 0, 0.4), 0 8px 24px rgba(0, 0, 0, 0.4);
676
+ --ck-shadow-3: 0 1px 3px rgba(0, 0, 0, 0.5), 0 24px 60px rgba(0, 0, 0, 0.6);
677
+ }
678
+
679
+ /* ---------- Frutiger Aero / Glossy Revival chrome — 2004-2013
680
+ Aero / Vista / iOS 6 / Vision Pro Liquid Glass.
681
+ Sky-blue canvas, glossy white-glass surfaces, lime
682
+ pop accent, deep-navy ink (not black), 1px white
683
+ top-highlight on every elevated element, soft blue-
684
+ tinted shadows + outer glow on hover. Image-driven,
685
+ optimistic, intentionally pretty. */
686
+ html[data-ck-chrome="frutiger"] {
687
+ /* Sky gradient as canvas — the whole page sits on it. */
688
+ --ck-bg-canvas: linear-gradient(180deg, #87CEEB 0%, #B3E5FC 45%, #E1F5FE 100%);
689
+ --ck-bg-sidebar: rgba(255, 255, 255, 0.55);
690
+ --ck-bg-surface: rgba(255, 255, 255, 0.62);
691
+ --ck-bg-surface-2: rgba(255, 255, 255, 0.78);
692
+ --ck-bg-muted: rgba(255, 255, 255, 0.4);
693
+
694
+ /* Cool, near-white borders with a hint of sky — they read as
695
+ light catching the edge of glass. */
696
+ --ck-border-subtle: rgba(255, 255, 255, 0.55);
697
+ --ck-border-strong: rgba(26, 35, 126, 0.18);
698
+ --ck-border-focus: var(--ck-accent);
699
+
700
+ /* Deep navy ink — black is too harsh against sky. */
701
+ --ck-text-primary: #0E1A6B;
702
+ --ck-text-secondary: #38507A;
703
+ --ck-text-tertiary: #6C82A8;
704
+ --ck-text-disabled: #B7C6DD;
705
+ --ck-text-inverse: #FFFFFF;
706
+
707
+ /* Aqua accent — the canonical Aero blue. */
708
+ --ck-accent: var(--ck-accent-light-override, #0288D1);
709
+ --ck-accent-hover: #01579B;
710
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 14%, transparent);
711
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 38%, transparent);
712
+
713
+ /* Lime pop — used very sparingly for "go" / new / on-states. */
714
+ --ck-frutiger-lime: #C6FF00;
715
+ --ck-frutiger-orange: #FF9800;
716
+
717
+ /* Glossy gradient stacks — applied to buttons via background-
718
+ image. Two layers: the aqua tint at the bottom, the white
719
+ gloss highlight on the top half. */
720
+ --ck-frutiger-btn: linear-gradient(180deg, #4FC3F7 0%, #0288D1 50%, #01579B 100%);
721
+ --ck-frutiger-btn-hover: linear-gradient(180deg, #81D4FA 0%, #039BE5 50%, #0277BD 100%);
722
+ --ck-frutiger-gloss: linear-gradient(180deg, rgba(255,255,255,0.65) 0%, rgba(255,255,255,0) 50%, rgba(255,255,255,0) 100%);
723
+
724
+ /* Generous "pebble" radii. */
725
+ --ck-radius-xs: 8px;
726
+ --ck-radius-sm: 12px;
727
+ --ck-radius-md: 16px;
728
+ --ck-radius-lg: 20px;
729
+ --ck-radius-xl: 28px;
730
+
731
+ /* Soft blue-tinted shadows — never dark/crisp. */
732
+ --ck-shadow-1: 0 2px 8px rgba(0, 100, 200, 0.12);
733
+ --ck-shadow-2: 0 4px 16px rgba(0, 100, 200, 0.18), 0 1px 2px rgba(0, 100, 200, 0.08);
734
+ --ck-shadow-3: 0 12px 40px rgba(0, 100, 200, 0.28), 0 2px 6px rgba(0, 100, 200, 0.14);
735
+
736
+ /* The "Aero glow" — used on hover/focus. */
737
+ --ck-frutiger-glow: 0 0 24px rgba(79, 195, 247, 0.55);
738
+ --ck-frutiger-glow-soft: 0 0 14px rgba(79, 195, 247, 0.35);
739
+ }
740
+
741
+ html[data-ck-theme="dark"][data-ck-chrome="frutiger"] {
742
+ /* Twilight / aurora sky for dark — the brief lives in light,
743
+ but a coherent dark mode keeps the chrome usable. Deep
744
+ navy → indigo → soft lavender gradient. Glass surfaces
745
+ become darker translucent panels. */
746
+ --ck-bg-canvas: linear-gradient(180deg, #0B1029 0%, #1A2167 50%, #2E2280 100%);
747
+ --ck-bg-sidebar: rgba(20, 30, 80, 0.55);
748
+ --ck-bg-surface: rgba(30, 45, 110, 0.55);
749
+ --ck-bg-surface-2: rgba(45, 60, 130, 0.65);
750
+ --ck-bg-muted: rgba(20, 30, 80, 0.4);
751
+
752
+ --ck-border-subtle: rgba(255, 255, 255, 0.16);
753
+ --ck-border-strong: rgba(255, 255, 255, 0.28);
754
+
755
+ --ck-text-primary: #EAF3FF;
756
+ --ck-text-secondary: #B7C6E8;
757
+ --ck-text-tertiary: #8094BE;
758
+ --ck-text-disabled: #4B5C84;
759
+ --ck-text-inverse: #0E1A6B;
760
+
761
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #4FC3F7));
762
+
763
+ --ck-frutiger-btn: linear-gradient(180deg, #4FC3F7 0%, #0288D1 50%, #01579B 100%);
764
+ --ck-frutiger-btn-hover: linear-gradient(180deg, #81D4FA 0%, #039BE5 50%, #0277BD 100%);
765
+
766
+ --ck-shadow-1: 0 2px 8px rgba(0, 0, 0, 0.35);
767
+ --ck-shadow-2: 0 4px 16px rgba(0, 0, 0, 0.42), 0 1px 2px rgba(0, 0, 0, 0.32);
768
+ --ck-shadow-3: 0 12px 40px rgba(0, 0, 0, 0.55), 0 2px 6px rgba(0, 0, 0, 0.32);
769
+
770
+ --ck-frutiger-glow: 0 0 24px rgba(129, 212, 250, 0.45);
771
+ --ck-frutiger-glow-soft: 0 0 14px rgba(129, 212, 250, 0.3);
772
+ }
773
+
774
+ /* ---------- Risograph / Zine Print chrome — DIY print culture as
775
+ a digital aesthetic. Warm uncoated paper canvas, 2-3
776
+ fluorescent inks per composition (pink/blue/yellow
777
+ signature trio), halftone dots, misregistration
778
+ offset, hand-drawn imperfection, bold display type
779
+ + workhorse mono body. Anti-glossy, anti-gradient. */
780
+ html[data-ck-chrome="riso"] {
781
+ /* Warm cream paper, never flat white. */
782
+ --ck-bg-canvas: #F4EFE5;
783
+ --ck-bg-sidebar: #F8F1DE;
784
+ --ck-bg-surface: #F8F1DE;
785
+ --ck-bg-surface-2: #ECE5D2;
786
+ --ck-bg-muted: #ECE5D2;
787
+
788
+ /* "Black" is never pure — it's a soft charcoal that mimics riso
789
+ ink-on-paper rather than CRT pixels. */
790
+ --ck-border-subtle: rgba(26, 26, 26, 0.18);
791
+ --ck-border-strong: rgba(26, 26, 26, 0.85);
792
+ --ck-border-focus: var(--ck-accent);
793
+
794
+ --ck-text-primary: #1A1A1A;
795
+ --ck-text-secondary: #4A4A4A;
796
+ --ck-text-tertiary: #7A7468;
797
+ --ck-text-disabled: #B9B0A0;
798
+ --ck-text-inverse: #F8F1DE;
799
+
800
+ /* Pink is the canonical riso ink — the one print everyone
801
+ associates with the aesthetic. Override per-app for blue /
802
+ yellow / orange-led palettes. */
803
+ --ck-accent: var(--ck-accent-light-override, #FF48B0);
804
+ --ck-accent-hover: #E63A9D;
805
+ --ck-accent-muted: color-mix(in oklab, var(--ck-accent) 14%, transparent);
806
+ --ck-accent-border: color-mix(in oklab, var(--ck-accent) 50%, transparent);
807
+
808
+ /* The canonical riso ink palette — pick 2-3 per layout. */
809
+ --ck-riso-pink: #FF48B0;
810
+ --ck-riso-blue: #3D5AFE;
811
+ --ck-riso-yellow: #FFE100;
812
+ --ck-riso-teal: #00A99D;
813
+ --ck-riso-green: #00A95C;
814
+ --ck-riso-orange: #FF6F3C;
815
+ --ck-riso-violet: #765BA7;
816
+ --ck-riso-red: #F02D2D;
817
+
818
+ /* Overprint blends — when two inks overlap on paper. */
819
+ --ck-riso-overprint-pb: #6B2DCC; /* pink + blue */
820
+ --ck-riso-overprint-py: #FF7A2D; /* pink + yellow */
821
+ --ck-riso-overprint-by: #4A9A4F; /* blue + yellow */
822
+
823
+ /* Square-ish radii — riso isn't soft. */
824
+ --ck-radius-xs: 2px;
825
+ --ck-radius-sm: 4px;
826
+ --ck-radius-md: 6px;
827
+ --ck-radius-lg: 8px;
828
+ --ck-radius-xl: 12px;
829
+
830
+ /* "Shadows" in riso are ink-offset duplicates, not soft drop
831
+ shadows. The chrome CSS overrides individual primitives with
832
+ offset shadow blocks. These minimal values are fallbacks. */
833
+ --ck-shadow-1: 0 1px 0 rgba(26, 26, 26, 0.4);
834
+ --ck-shadow-2: 3px 3px 0 var(--ck-riso-blue);
835
+ --ck-shadow-3: 4px 4px 0 var(--ck-riso-pink);
836
+
837
+ /* Paper texture — SVG noise that the chrome stamps onto body. */
838
+ --ck-riso-paper:
839
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' seed='4'/><feColorMatrix values='0 0 0 0 0.05 0 0 0 0 0.05 0 0 0 0 0.05 0 0 0 0.6 0'/></filter><rect width='100%25' height='100%25' filter='url(%23n)' opacity='0.18'/></svg>");
840
+
841
+ /* Halftone dot pattern — apply as background-image where you
842
+ want the "shaded with ink" look. */
843
+ --ck-riso-halftone:
844
+ radial-gradient(circle, currentColor 1.4px, transparent 1.6px);
845
+ }
846
+
847
+ html[data-ck-theme="dark"][data-ck-chrome="riso"] {
848
+ /* "Dark mode" riso = ink on dark paper / blueprint reversal.
849
+ Holds the spirit (limited inks, halftone, no gradients) but
850
+ flips canvas to deep ink-on-newsprint navy. Not the canonical
851
+ riso look — for late-night reading. */
852
+ --ck-bg-canvas: #14131A;
853
+ --ck-bg-sidebar: #1A1922;
854
+ --ck-bg-surface: #1F1D2A;
855
+ --ck-bg-surface-2: #262433;
856
+ --ck-bg-muted: #1A1922;
857
+
858
+ --ck-border-subtle: rgba(248, 241, 222, 0.16);
859
+ --ck-border-strong: rgba(248, 241, 222, 0.7);
860
+
861
+ --ck-text-primary: #F4EFE5;
862
+ --ck-text-secondary: #C7BFAE;
863
+ --ck-text-tertiary: #8C8678;
864
+ --ck-text-disabled: #4D4A40;
865
+ --ck-text-inverse: #14131A;
866
+
867
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #FF6FBF));
868
+ --ck-accent-hover: #FF8FCC;
869
+
870
+ --ck-shadow-1: 0 1px 0 rgba(0, 0, 0, 0.6);
871
+ --ck-shadow-2: 3px 3px 0 var(--ck-riso-blue);
872
+ --ck-shadow-3: 4px 4px 0 var(--ck-riso-pink);
873
+ }
874
+
875
+ /* ---------- Hand-drawn / Sketchy chrome — Excalidraw / tldraw /
876
+ Whimsical aesthetic. Pen-on-paper feel, hatch-filled
877
+ shapes, slight wobble on every stroke, handwritten
878
+ type. Anti-final by design — perfect for AI-output
879
+ UIs and brainstorming tools. Dark mode flips to a
880
+ chalkboard. */
881
+ html[data-ck-chrome="sketch"] {
882
+ /* Notebook paper, never crisp white. */
883
+ --ck-bg-canvas: #FFFEF9;
884
+ --ck-bg-sidebar: #FFFBEE;
885
+ --ck-bg-surface: #FFFEF9;
886
+ --ck-bg-surface-2: #F8F5E8;
887
+ --ck-bg-muted: #F3EFE0;
888
+
889
+ --ck-border-subtle: rgba(26, 26, 26, 0.14);
890
+ --ck-border-strong: rgba(26, 26, 26, 0.85);
891
+ --ck-border-focus: var(--ck-accent);
892
+
893
+ /* Pen ink — never pure black. */
894
+ --ck-text-primary: #1A1A1A;
895
+ --ck-text-secondary: #555555;
896
+ --ck-text-tertiary: #8A8270;
897
+ --ck-text-disabled: #C7C0AE;
898
+ --ck-text-inverse: #FFFEF9;
899
+
900
+ /* The marker palette — bright, friendly, NOT fluorescent. */
901
+ --ck-sketch-red: #E54B4B;
902
+ --ck-sketch-orange: #F2994A;
903
+ --ck-sketch-yellow: #F2C94C;
904
+ --ck-sketch-green: #6FCF97;
905
+ --ck-sketch-teal: #45B7AF;
906
+ --ck-sketch-blue: #4A90E2;
907
+ --ck-sketch-purple: #9B6FE0;
908
+ --ck-sketch-pink: #E36AB0;
909
+
910
+ /* Highlighter (translucent so the line shows through) */
911
+ --ck-sketch-hi-yellow: rgba(242, 201, 76, 0.42);
912
+ --ck-sketch-hi-pink: rgba(227, 106, 176, 0.32);
913
+ --ck-sketch-hi-green: rgba(111, 207, 151, 0.32);
914
+
915
+ --ck-accent: var(--ck-accent-light-override, var(--ck-sketch-blue));
916
+ --ck-accent-hover: #3A78C8;
917
+ --ck-accent-muted: rgba(74, 144, 226, 0.16);
918
+ --ck-accent-border: rgba(74, 144, 226, 0.5);
919
+
920
+ /* Handwriting fonts — Caveat / Patrick Hand / Kalam are common
921
+ Google Fonts; Comic Sans MS is the universal fallback that
922
+ still captures the spirit. Body uses the friendlier
923
+ proportional sans so paragraphs stay readable. */
924
+ --ck-font-sketch-display: "Caveat", "Patrick Hand", "Kalam",
925
+ "Shadows Into Light Two", "Comic Sans MS", cursive;
926
+ --ck-font-sketch-body: "Comic Neue", "Atkinson Hyperlegible",
927
+ "Nunito", "Comic Sans MS", system-ui, sans-serif;
928
+ --ck-font-sans: var(--ck-font-sketch-body);
929
+
930
+ /* The wobble filter — feTurbulence + feDisplacementMap inline
931
+ SVG. Applied via filter: var(--ck-sketch-wobble) on the
932
+ elements that should "draw" with a rough edge. Chrome /
933
+ Safari render this fine; Firefox skips data:-URL filters,
934
+ which is OK — borders still read as drawn via asymmetric
935
+ radii + offset second strokes. */
936
+ --ck-sketch-wobble:
937
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='w' x='-2%25' y='-2%25' width='104%25' height='104%25'><feTurbulence type='fractalNoise' baseFrequency='0.025' numOctaves='2' seed='4'/><feDisplacementMap in='SourceGraphic' scale='2.2'/></filter></svg>#w");
938
+ --ck-sketch-wobble-strong:
939
+ url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'><filter id='w' x='-3%25' y='-3%25' width='106%25' height='106%25'><feTurbulence type='fractalNoise' baseFrequency='0.04' numOctaves='2' seed='6'/><feDisplacementMap in='SourceGraphic' scale='3.4'/></filter></svg>#w");
940
+
941
+ /* Asymmetric radii — corners that aren't quite the same. */
942
+ --ck-radius-xs: 5px 7px 6px 8px / 7px 5px 8px 6px;
943
+ --ck-radius-sm: 7px 9px 8px 10px / 9px 7px 10px 8px;
944
+ --ck-radius-md: 10px 12px 11px 13px / 12px 10px 13px 11px;
945
+ --ck-radius-lg: 12px 16px 14px 18px / 16px 12px 18px 14px;
946
+ --ck-radius-xl: 18px 22px 20px 24px / 22px 18px 24px 20px;
947
+
948
+ /* Shadows are offset second strokes — never blurred. */
949
+ --ck-shadow-1: 2px 3px 0 rgba(26, 26, 26, 0.85);
950
+ --ck-shadow-2: 3px 4px 0 rgba(26, 26, 26, 0.85);
951
+ --ck-shadow-3: 4px 6px 0 rgba(26, 26, 26, 0.85);
952
+ }
953
+
954
+ html[data-ck-theme="dark"][data-ck-chrome="sketch"] {
955
+ /* Chalkboard — dark teal-grey with off-white chalk lines. */
956
+ --ck-bg-canvas: #1E2A2E;
957
+ --ck-bg-sidebar: #25333A;
958
+ --ck-bg-surface: #233038;
959
+ --ck-bg-surface-2: #2D3D45;
960
+ --ck-bg-muted: #2A3942;
961
+
962
+ --ck-border-subtle: rgba(240, 240, 232, 0.18);
963
+ --ck-border-strong: rgba(240, 240, 232, 0.9);
964
+
965
+ --ck-text-primary: #F0F0E8;
966
+ --ck-text-secondary: #C8C8C0;
967
+ --ck-text-tertiary: #8E938F;
968
+ --ck-text-disabled: #4F5A60;
969
+ --ck-text-inverse: #1E2A2E;
970
+
971
+ --ck-accent: var(--ck-accent-dark-override, var(--ck-accent-light-override, #6FCF97));
972
+
973
+ --ck-shadow-1: 2px 3px 0 rgba(240, 240, 232, 0.85);
974
+ --ck-shadow-2: 3px 4px 0 rgba(240, 240, 232, 0.85);
975
+ --ck-shadow-3: 4px 6px 0 rgba(240, 240, 232, 0.85);
976
+ }