@cosxai/ui 0.25.0 → 1.0.0-alpha.1

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