@orangecheck/design 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.
@@ -0,0 +1,482 @@
1
+ /*
2
+ * @orangecheck/design — theme.css
3
+ *
4
+ * Skin-independent layer: the Tailwind 4 `@theme inline` token bridge, the base
5
+ * layer, and the full OrangeCheck utility system (container, mono display,
6
+ * terminal chrome, grid/dot backgrounds, docs prose, the <Working> cursor,
7
+ * skip-link, brand utilities). Token *values* live in `themes/*.css`.
8
+ *
9
+ * This file expects to be imported into a Tailwind 4 pipeline that has already
10
+ * done `@import 'tailwindcss'` and declared `@custom-variant dark`. It also
11
+ * expects the consumer to define the font vars `--font-sans-display` and
12
+ * `--font-mono-display` (every family site loads these via next/font).
13
+ */
14
+
15
+ @theme inline {
16
+ --color-background: var(--background);
17
+ --color-foreground: var(--foreground);
18
+ /* Typography is theme-controlled: each skin sets --oc-font-sans / --oc-font-mono.
19
+ The default skin points these at the app's next/font vars
20
+ (--font-sans-display / --font-mono-display), so nothing changes for the
21
+ default; alternate skins can swap the typeface entirely. */
22
+ --font-sans: var(--oc-font-sans);
23
+ --font-mono: var(--oc-font-mono);
24
+ --color-ring: var(--ring);
25
+ --color-input: var(--input);
26
+ --color-border: var(--border);
27
+ --color-destructive: var(--destructive);
28
+ --color-destructive-foreground: var(--destructive-foreground);
29
+ --color-warning: var(--warning);
30
+ --color-warning-foreground: var(--warning-foreground);
31
+ --color-info: var(--info);
32
+ --color-info-foreground: var(--info-foreground);
33
+ --color-success: var(--success);
34
+ --color-success-foreground: var(--success-foreground);
35
+ --color-accent-foreground: var(--accent-foreground);
36
+ --color-accent: var(--accent);
37
+ --color-muted-foreground: var(--muted-foreground);
38
+ --color-muted: var(--muted);
39
+ --color-secondary-foreground: var(--secondary-foreground);
40
+ --color-secondary: var(--secondary);
41
+ --color-primary-foreground: var(--primary-foreground);
42
+ --color-primary: var(--primary);
43
+ --color-popover-foreground: var(--popover-foreground);
44
+ --color-popover: var(--popover);
45
+ --color-card-foreground: var(--card-foreground);
46
+ --color-card: var(--card);
47
+ --color-brand: var(--brand);
48
+ --color-brand-foreground: var(--brand-foreground);
49
+ --radius-sm: calc(var(--radius) - 4px);
50
+ --radius-md: calc(var(--radius) - 2px);
51
+ --radius-lg: var(--radius);
52
+ --radius-xl: calc(var(--radius) + 4px);
53
+ /* Elevation is theme-controlled: each skin sets --oc-shadow-*. Routing
54
+ Tailwind's shadow scale through a runtime var (like color) is required —
55
+ Tailwind otherwise inlines shadow values at build, defeating runtime
56
+ theming. The default skin sets the subtle near-flat OrangeCheck values;
57
+ `aurora` overrides them to float surfaces. */
58
+ --shadow-2xs: var(--oc-shadow-2xs);
59
+ --shadow-xs: var(--oc-shadow-xs);
60
+ --shadow-sm: var(--oc-shadow-sm);
61
+ --shadow-md: var(--oc-shadow-md);
62
+ --shadow-lg: var(--oc-shadow-lg);
63
+ --shadow-xl: var(--oc-shadow-xl);
64
+ }
65
+
66
+ @layer base {
67
+ * {
68
+ @apply border-border outline-ring/50;
69
+ }
70
+ body {
71
+ @apply bg-background text-foreground;
72
+ }
73
+
74
+ input:-webkit-autofill,
75
+ input:-webkit-autofill:hover,
76
+ input:-webkit-autofill:focus,
77
+ input:-webkit-autofill:active,
78
+ textarea:-webkit-autofill,
79
+ textarea:-webkit-autofill:hover,
80
+ textarea:-webkit-autofill:focus,
81
+ textarea:-webkit-autofill:active {
82
+ -webkit-text-fill-color: var(--foreground) !important;
83
+ transition: background-color 5000s ease-in-out 0s !important;
84
+ }
85
+
86
+ input:-webkit-autofill,
87
+ input:-webkit-autofill:focus,
88
+ input:-webkit-autofill:active,
89
+ textarea:-webkit-autofill,
90
+ textarea:-webkit-autofill:focus,
91
+ textarea:-webkit-autofill:active {
92
+ -webkit-box-shadow: 0 0 0 1000px oklch(0.9 0 0 / 0.3) inset !important;
93
+ }
94
+
95
+ .dark input:-webkit-autofill,
96
+ .dark input:-webkit-autofill:focus,
97
+ .dark input:-webkit-autofill:active,
98
+ .dark textarea:-webkit-autofill,
99
+ .dark textarea:-webkit-autofill:focus,
100
+ .dark textarea:-webkit-autofill:active {
101
+ -webkit-box-shadow: 0 0 0 1000px oklch(0.35 0 0 / 0.3) inset !important;
102
+ }
103
+ }
104
+
105
+ /* Accordion animations */
106
+ @keyframes accordion-down {
107
+ from {
108
+ height: 0;
109
+ }
110
+ to {
111
+ height: var(--radix-accordion-content-height);
112
+ }
113
+ }
114
+
115
+ @keyframes accordion-up {
116
+ from {
117
+ height: var(--radix-accordion-content-height);
118
+ }
119
+ to {
120
+ height: 0;
121
+ }
122
+ }
123
+
124
+ .animate-accordion-down {
125
+ animation: accordion-down 0.2s ease-out;
126
+ }
127
+ .animate-accordion-up {
128
+ animation: accordion-up 0.2s ease-out;
129
+ }
130
+
131
+ @layer utilities {
132
+ .container {
133
+ @apply mx-auto w-full max-w-screen-xl px-4 sm:px-6 lg:px-8;
134
+ }
135
+ .vstack {
136
+ @apply flex flex-col gap-4 sm:gap-5 md:gap-6;
137
+ }
138
+ .stack-tight {
139
+ @apply flex flex-col gap-3 sm:gap-4 md:gap-5;
140
+ }
141
+ .stack-loose {
142
+ @apply flex flex-col gap-5 sm:gap-6 md:gap-8;
143
+ }
144
+
145
+ .text-brand {
146
+ color: var(--brand);
147
+ }
148
+ .bg-brand {
149
+ background-color: var(--brand);
150
+ }
151
+ .bg-brand-soft {
152
+ background-color: color-mix(in oklch, var(--brand), transparent 88%);
153
+ }
154
+ .border-brand {
155
+ border-color: var(--brand);
156
+ }
157
+ .border-brand-soft {
158
+ border-color: color-mix(in oklch, var(--brand), transparent 70%);
159
+ }
160
+
161
+ /* ── Mono display utilities ──────────────────────────────────────── */
162
+ .font-display {
163
+ font-family:
164
+ var(--oc-font-mono), ui-monospace, 'JetBrains Mono', SFMono-Regular, Menlo,
165
+ monospace;
166
+ letter-spacing: -0.02em;
167
+ font-feature-settings: 'ss01', 'cv01', 'zero';
168
+ }
169
+
170
+ .label-mono {
171
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
172
+ font-size: 0.7rem;
173
+ letter-spacing: 0.18em;
174
+ text-transform: uppercase;
175
+ font-weight: 600;
176
+ color: color-mix(in oklch, var(--foreground), transparent 50%);
177
+ }
178
+
179
+ /* Terminal-window chrome: hard borders, no soft shadows. */
180
+ .terminal {
181
+ background: var(--card);
182
+ border: 1px solid var(--border);
183
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
184
+ }
185
+ .terminal-title {
186
+ background: color-mix(in oklch, var(--foreground), transparent 92%);
187
+ border-bottom: 1px solid var(--border);
188
+ font-size: 0.7rem;
189
+ letter-spacing: 0.12em;
190
+ text-transform: uppercase;
191
+ color: var(--muted-foreground);
192
+ padding: 0.4rem 0.75rem;
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 0.5rem;
196
+ }
197
+ .terminal-dot {
198
+ width: 0.5rem;
199
+ height: 0.5rem;
200
+ border-radius: 9999px;
201
+ background: color-mix(in oklch, var(--muted-foreground), transparent 50%);
202
+ }
203
+
204
+ /* ── Background motifs (hero panels) ─────────────────────────────── */
205
+ .bg-grid {
206
+ background-image:
207
+ linear-gradient(
208
+ to right,
209
+ color-mix(in oklch, var(--foreground), transparent 94%) 1px,
210
+ transparent 1px
211
+ ),
212
+ linear-gradient(
213
+ to bottom,
214
+ color-mix(in oklch, var(--foreground), transparent 94%) 1px,
215
+ transparent 1px
216
+ );
217
+ background-size: 28px 28px;
218
+ }
219
+ .bg-dots {
220
+ background-image: radial-gradient(
221
+ color-mix(in oklch, var(--foreground), transparent 88%) 1px,
222
+ transparent 1px
223
+ );
224
+ background-size: 16px 16px;
225
+ }
226
+
227
+ /* ── Docs prose styles ────────────────────────────────────────── */
228
+ .docs-prose {
229
+ color: var(--foreground);
230
+ font-size: 0.9375rem;
231
+ line-height: 1.7;
232
+ }
233
+ .docs-prose > * + * {
234
+ margin-top: 1rem;
235
+ }
236
+ .docs-prose h1 {
237
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
238
+ font-size: 2rem;
239
+ line-height: 1.1;
240
+ letter-spacing: -0.02em;
241
+ font-weight: 700;
242
+ margin-top: 0;
243
+ margin-bottom: 0.5rem;
244
+ }
245
+ .docs-prose h2 {
246
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
247
+ font-size: 1.35rem;
248
+ line-height: 1.2;
249
+ letter-spacing: -0.01em;
250
+ font-weight: 700;
251
+ margin-top: 2.5rem;
252
+ margin-bottom: 0.5rem;
253
+ padding-top: 1rem;
254
+ border-top: 1px solid var(--border);
255
+ }
256
+ .docs-prose h3 {
257
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
258
+ font-size: 1.05rem;
259
+ line-height: 1.3;
260
+ font-weight: 700;
261
+ margin-top: 1.75rem;
262
+ margin-bottom: 0.4rem;
263
+ }
264
+ .docs-prose h4 {
265
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
266
+ font-size: 0.9rem;
267
+ font-weight: 700;
268
+ margin-top: 1.5rem;
269
+ text-transform: uppercase;
270
+ letter-spacing: 0.05em;
271
+ color: var(--muted-foreground);
272
+ }
273
+ .docs-prose p,
274
+ .docs-prose li {
275
+ color: var(--foreground);
276
+ }
277
+ .docs-prose a {
278
+ color: var(--primary);
279
+ text-decoration: underline;
280
+ text-decoration-style: dotted;
281
+ text-underline-offset: 3px;
282
+ }
283
+ .docs-prose a:hover {
284
+ text-decoration-style: solid;
285
+ }
286
+ .docs-prose strong {
287
+ color: var(--foreground);
288
+ font-weight: 700;
289
+ }
290
+ .docs-prose code {
291
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
292
+ font-size: 0.85em;
293
+ background: color-mix(in oklch, var(--primary), transparent 88%);
294
+ color: var(--primary);
295
+ padding: 0.12em 0.4em;
296
+ border-radius: 3px;
297
+ border: 1px solid color-mix(in oklch, var(--primary), transparent 70%);
298
+ }
299
+ .docs-prose pre {
300
+ background: var(--card);
301
+ border: 1px solid var(--border);
302
+ padding: 1rem 1.1rem;
303
+ overflow-x: auto;
304
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
305
+ font-size: 0.8rem;
306
+ line-height: 1.6;
307
+ margin: 1.5rem 0;
308
+ }
309
+ .docs-prose pre code {
310
+ background: transparent;
311
+ border: none;
312
+ color: var(--foreground);
313
+ padding: 0;
314
+ font-size: inherit;
315
+ }
316
+ .docs-prose ul,
317
+ .docs-prose ol {
318
+ padding-left: 1.5rem;
319
+ }
320
+ .docs-prose ul {
321
+ list-style: none;
322
+ }
323
+ .docs-prose ul > li {
324
+ position: relative;
325
+ }
326
+ .docs-prose ul > li::before {
327
+ content: '·';
328
+ position: absolute;
329
+ left: -1rem;
330
+ color: var(--primary);
331
+ font-weight: 700;
332
+ }
333
+ .docs-prose ol {
334
+ list-style: decimal;
335
+ }
336
+ .docs-prose ol > li::marker {
337
+ color: var(--primary);
338
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
339
+ font-weight: 700;
340
+ }
341
+ .docs-prose li + li {
342
+ margin-top: 0.35rem;
343
+ }
344
+ .docs-prose blockquote {
345
+ border-left: 2px solid var(--primary);
346
+ background: color-mix(in oklch, var(--primary), transparent 92%);
347
+ padding: 0.75rem 1rem;
348
+ margin: 1.5rem 0;
349
+ color: var(--muted-foreground);
350
+ font-style: normal;
351
+ }
352
+ .docs-prose blockquote p {
353
+ margin: 0;
354
+ }
355
+ .docs-prose hr {
356
+ border: none;
357
+ border-top: 1px solid var(--border);
358
+ margin: 2rem 0;
359
+ }
360
+ .docs-prose table {
361
+ width: 100%;
362
+ border-collapse: collapse;
363
+ font-size: 0.85rem;
364
+ margin: 1.25rem 0;
365
+ border-top: 1px solid var(--border);
366
+ border-bottom: 1px solid var(--border);
367
+ }
368
+ .docs-prose thead th {
369
+ text-align: left;
370
+ padding: 0.5rem 0.75rem;
371
+ border-bottom: 1px solid var(--border);
372
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
373
+ font-size: 0.7rem;
374
+ letter-spacing: 0.1em;
375
+ text-transform: uppercase;
376
+ color: var(--muted-foreground);
377
+ }
378
+ .docs-prose tbody tr {
379
+ border-bottom: 1px solid color-mix(in oklch, var(--border), transparent 50%);
380
+ }
381
+ .docs-prose tbody td {
382
+ padding: 0.5rem 0.75rem;
383
+ vertical-align: top;
384
+ }
385
+ .docs-prose tbody code {
386
+ font-size: 0.78em;
387
+ }
388
+ .docs-prose kbd {
389
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
390
+ font-size: 0.8em;
391
+ background: var(--muted);
392
+ border: 1px solid var(--border);
393
+ border-bottom-width: 2px;
394
+ padding: 0.1em 0.4em;
395
+ border-radius: 3px;
396
+ }
397
+
398
+ /* ── <Working> indicator ────────────────────────────────────────── */
399
+ .oc-working-cursor {
400
+ display: inline-flex;
401
+ gap: 0.1em;
402
+ color: var(--primary);
403
+ letter-spacing: 0.1em;
404
+ font-weight: 700;
405
+ }
406
+ .oc-working-dot {
407
+ display: inline-block;
408
+ animation: oc-working-pulse 1s var(--ease) infinite;
409
+ opacity: 0.25;
410
+ }
411
+ .oc-working-text::after {
412
+ content: '';
413
+ display: inline-block;
414
+ width: 1.5ch;
415
+ text-align: left;
416
+ animation: oc-working-ellipsis 1.2s steps(4, end) infinite;
417
+ }
418
+ @keyframes oc-working-pulse {
419
+ 0%,
420
+ 20%,
421
+ 100% {
422
+ opacity: 0.25;
423
+ transform: translateY(0);
424
+ }
425
+ 40% {
426
+ opacity: 1;
427
+ transform: translateY(-1px);
428
+ }
429
+ 60% {
430
+ opacity: 0.6;
431
+ transform: translateY(0);
432
+ }
433
+ }
434
+ @keyframes oc-working-ellipsis {
435
+ 0% {
436
+ content: '';
437
+ }
438
+ 25% {
439
+ content: '·';
440
+ }
441
+ 50% {
442
+ content: '··';
443
+ }
444
+ 75% {
445
+ content: '···';
446
+ }
447
+ 100% {
448
+ content: '';
449
+ }
450
+ }
451
+ @media (prefers-reduced-motion: reduce) {
452
+ .oc-working-dot,
453
+ .oc-working-text::after {
454
+ animation: none !important;
455
+ }
456
+ .oc-working-dot {
457
+ opacity: 0.8;
458
+ }
459
+ }
460
+
461
+ /* Skip-to-content link for keyboard users — only visible on focus. */
462
+ .skip-link {
463
+ position: absolute;
464
+ left: -9999px;
465
+ top: 0.5rem;
466
+ z-index: 100;
467
+ padding: 0.5rem 0.85rem;
468
+ background: var(--primary);
469
+ color: var(--primary-foreground);
470
+ font-family: var(--oc-font-mono), ui-monospace, monospace;
471
+ font-size: 0.75rem;
472
+ letter-spacing: 0.1em;
473
+ text-transform: uppercase;
474
+ border-radius: var(--radius);
475
+ text-decoration: none;
476
+ }
477
+ .skip-link:focus {
478
+ left: 1rem;
479
+ outline: 2px solid var(--ring);
480
+ outline-offset: 2px;
481
+ }
482
+ }
@@ -0,0 +1,129 @@
1
+ /*
2
+ * Skin: aurora (demonstrator) — exercises the ELEVATION dimension.
3
+ *
4
+ * Where the other skins keep OrangeCheck's flat, hard-bordered ethos, aurora
5
+ * flips it: soft elevation (overrides the Tailwind --shadow-* scale, which the
6
+ * default theme leaves near-flat), generous radius, and a cool teal accent.
7
+ * This proves a theme can change shadow posture + shape + color together.
8
+ *
9
+ * Selectors use :root[data-oc-theme] (to beat the :root fallback that
10
+ * lightningcss merges) AND bare [data-oc-theme] (for scoped panels like the
11
+ * Themes/Matrix). Shadow vars are unlayered here, so they override Tailwind's
12
+ * @layer-theme defaults regardless of specificity.
13
+ */
14
+
15
+ :root[data-oc-theme='aurora'],
16
+ [data-oc-theme='aurora'] {
17
+ /* Generous, friendly radius. */
18
+ --radius: 0.75rem;
19
+
20
+ /* Keep Inter / JetBrains; identity comes from elevation + teal + shape. */
21
+ --oc-font-sans: var(--font-sans-display, 'Inter', ui-sans-serif, system-ui, sans-serif);
22
+ --oc-font-mono: var(--font-mono-display, 'JetBrains Mono', ui-monospace, monospace);
23
+
24
+ /* Soft elevation — the new dimension. Default skins keep the near-flat
25
+ OrangeCheck shadows; aurora makes surfaces float. */
26
+ --oc-shadow-2xs: 0 1px 2px 0 oklch(0.55 0.05 220 / 0.08);
27
+ --oc-shadow-xs: 0 1px 3px 0 oklch(0.55 0.05 220 / 0.12);
28
+ --oc-shadow-sm: 0 2px 4px 0 oklch(0.5 0.06 220 / 0.14), 0 1px 2px -1px oklch(0.5 0.06 220 / 0.14);
29
+ --oc-shadow-md:
30
+ 0 6px 12px -2px oklch(0.5 0.06 220 / 0.16), 0 3px 6px -3px oklch(0.5 0.06 220 / 0.14);
31
+ --oc-shadow-lg:
32
+ 0 14px 24px -4px oklch(0.5 0.07 220 / 0.18), 0 6px 10px -6px oklch(0.5 0.07 220 / 0.16);
33
+ --oc-shadow-xl:
34
+ 0 24px 36px -8px oklch(0.5 0.07 220 / 0.2), 0 10px 16px -8px oklch(0.5 0.07 220 / 0.16);
35
+
36
+ /* Light — airy cool paper, teal ink */
37
+ --background: oklch(0.99 0.006 210);
38
+ --foreground: oklch(0.18 0.025 225);
39
+
40
+ --card: oklch(1 0 0);
41
+ --card-foreground: oklch(0.18 0.025 225);
42
+
43
+ --popover: oklch(1 0 0);
44
+ --popover-foreground: oklch(0.18 0.025 225);
45
+
46
+ /* Teal/cyan primary. */
47
+ --primary: oklch(0.6 0.13 205);
48
+ --primary-foreground: oklch(0.99 0.01 210);
49
+
50
+ --secondary: oklch(0.96 0.01 210);
51
+ --secondary-foreground: oklch(0.18 0.025 225);
52
+
53
+ --muted: oklch(0.96 0.01 210);
54
+ --muted-foreground: oklch(0.47 0.02 220);
55
+
56
+ --accent: oklch(0.95 0.018 200);
57
+ --accent-foreground: oklch(0.24 0.03 220);
58
+
59
+ --border: oklch(0.9 0.012 215);
60
+ --input: oklch(0.92 0.012 215);
61
+ --ring: oklch(0.6 0.13 205);
62
+
63
+ --destructive: oklch(0.55 0.08 30);
64
+ --destructive-foreground: oklch(0.98 0 0);
65
+
66
+ --warning: oklch(0.68 0.09 75);
67
+ --warning-foreground: oklch(0.15 0 0);
68
+
69
+ --info: oklch(0.62 0.09 230);
70
+ --info-foreground: oklch(0.98 0 0);
71
+
72
+ --success: oklch(0.62 0.1 165);
73
+ --success-foreground: oklch(0.98 0 0);
74
+
75
+ --brand: oklch(0.64 0.14 200);
76
+ --brand-foreground: oklch(0.99 0.01 210);
77
+ }
78
+
79
+ :root[data-oc-theme='aurora'].dark,
80
+ [data-oc-theme='aurora'].dark {
81
+ /* Dark — deep cyan-slate, luminous teal, elevation still reads via larger
82
+ blurred shadows. */
83
+ --oc-shadow-2xs: 0 1px 2px 0 oklch(0 0 0 / 0.5);
84
+ --oc-shadow-xs: 0 1px 3px 0 oklch(0 0 0 / 0.55);
85
+ --oc-shadow-sm: 0 2px 4px 0 oklch(0 0 0 / 0.6), 0 1px 2px -1px oklch(0 0 0 / 0.6);
86
+ --oc-shadow-md: 0 6px 12px -2px oklch(0 0 0 / 0.65), 0 3px 6px -3px oklch(0 0 0 / 0.6);
87
+ --oc-shadow-lg: 0 14px 24px -4px oklch(0 0 0 / 0.7), 0 6px 10px -6px oklch(0 0 0 / 0.6);
88
+ --oc-shadow-xl: 0 24px 36px -8px oklch(0 0 0 / 0.72), 0 10px 16px -8px oklch(0 0 0 / 0.6);
89
+
90
+ --background: oklch(0.16 0.022 230);
91
+ --foreground: oklch(0.96 0.006 210);
92
+
93
+ --card: oklch(0.2 0.026 228);
94
+ --card-foreground: oklch(0.96 0.006 210);
95
+
96
+ --popover: oklch(0.2 0.026 228);
97
+ --popover-foreground: oklch(0.96 0.006 210);
98
+
99
+ --primary: oklch(0.74 0.13 200);
100
+ --primary-foreground: oklch(0.16 0.022 230);
101
+
102
+ --secondary: oklch(0.25 0.028 228);
103
+ --secondary-foreground: oklch(0.96 0.006 210);
104
+
105
+ --muted: oklch(0.23 0.024 228);
106
+ --muted-foreground: oklch(0.66 0.025 215);
107
+
108
+ --accent: oklch(0.28 0.032 220);
109
+ --accent-foreground: oklch(0.96 0.006 210);
110
+
111
+ --border: oklch(0.3 0.03 225);
112
+ --input: oklch(0.3 0.03 225);
113
+ --ring: oklch(0.74 0.13 200);
114
+
115
+ --destructive: oklch(0.6 0.1 30);
116
+ --destructive-foreground: oklch(0.95 0 0);
117
+
118
+ --warning: oklch(0.72 0.1 75);
119
+ --warning-foreground: oklch(0.12 0 0);
120
+
121
+ --info: oklch(0.67 0.09 230);
122
+ --info-foreground: oklch(0.95 0 0);
123
+
124
+ --success: oklch(0.7 0.12 165);
125
+ --success-foreground: oklch(0.14 0.02 230);
126
+
127
+ --brand: oklch(0.74 0.13 200);
128
+ --brand-foreground: oklch(0.16 0.022 230);
129
+ }
@@ -0,0 +1,105 @@
1
+ /*
2
+ * Skin: midnight (demonstrator)
3
+ *
4
+ * Proves the multi-theme rail: a cool indigo accent on deep slate. Same token
5
+ * contract, same radius, same semantic roles — only the values shift. Declares
6
+ * the COMPLETE token set in both modes so it fully overrides the default. No
7
+ * bare `:root`/`.dark` arms here; only the default skin owns the fallback.
8
+ */
9
+
10
+ :root[data-oc-theme='midnight'],
11
+ [data-oc-theme='midnight'] {
12
+ /* Softer, more rounded than the sharp default — a calmer, SaaS-ier shape. */
13
+ --radius: 0.625rem;
14
+
15
+ /* Geometric humanist sans for the calmer feel; mono stays JetBrains. */
16
+ --oc-font-sans: 'Manrope', ui-sans-serif, system-ui, sans-serif;
17
+ --oc-font-mono: var(--font-mono-display, 'JetBrains Mono', ui-monospace, monospace);
18
+
19
+ /* Light — cool paper, indigo ink */
20
+ --background: oklch(0.985 0.004 255);
21
+ --foreground: oklch(0.16 0.02 265);
22
+
23
+ --card: oklch(1 0 0);
24
+ --card-foreground: oklch(0.16 0.02 265);
25
+
26
+ --popover: oklch(1 0 0);
27
+ --popover-foreground: oklch(0.16 0.02 265);
28
+
29
+ /* Indigo is the primary. */
30
+ --primary: oklch(0.55 0.18 265);
31
+ --primary-foreground: oklch(0.98 0.01 255);
32
+
33
+ --secondary: oklch(0.96 0.005 255);
34
+ --secondary-foreground: oklch(0.16 0.02 265);
35
+
36
+ --muted: oklch(0.96 0.005 255);
37
+ --muted-foreground: oklch(0.46 0.02 265);
38
+
39
+ --accent: oklch(0.95 0.012 265);
40
+ --accent-foreground: oklch(0.22 0.03 265);
41
+
42
+ --border: oklch(0.88 0.008 265);
43
+ --input: oklch(0.9 0.008 265);
44
+ --ring: oklch(0.55 0.18 265);
45
+
46
+ --destructive: oklch(0.55 0.08 30);
47
+ --destructive-foreground: oklch(0.98 0 0);
48
+
49
+ --warning: oklch(0.65 0.08 75);
50
+ --warning-foreground: oklch(0.15 0 0);
51
+
52
+ --info: oklch(0.6 0.08 240);
53
+ --info-foreground: oklch(0.98 0 0);
54
+
55
+ --success: oklch(0.6 0.08 165);
56
+ --success-foreground: oklch(0.98 0 0);
57
+
58
+ /* Brand accent — bright indigo. */
59
+ --brand: oklch(0.6 0.2 265);
60
+ --brand-foreground: oklch(0.98 0.01 255);
61
+ }
62
+
63
+ :root[data-oc-theme='midnight'].dark,
64
+ [data-oc-theme='midnight'].dark {
65
+ /* Dark — deep slate, luminous indigo */
66
+ --background: oklch(0.13 0.02 265);
67
+ --foreground: oklch(0.96 0.005 255);
68
+
69
+ --card: oklch(0.17 0.022 265);
70
+ --card-foreground: oklch(0.96 0.005 255);
71
+
72
+ --popover: oklch(0.17 0.022 265);
73
+ --popover-foreground: oklch(0.96 0.005 255);
74
+
75
+ --primary: oklch(0.68 0.17 265);
76
+ --primary-foreground: oklch(0.12 0.02 265);
77
+
78
+ --secondary: oklch(0.22 0.025 265);
79
+ --secondary-foreground: oklch(0.96 0.005 255);
80
+
81
+ --muted: oklch(0.2 0.022 265);
82
+ --muted-foreground: oklch(0.64 0.02 265);
83
+
84
+ --accent: oklch(0.25 0.03 265);
85
+ --accent-foreground: oklch(0.96 0.005 255);
86
+
87
+ --border: oklch(0.27 0.025 265);
88
+ --input: oklch(0.27 0.025 265);
89
+ --ring: oklch(0.68 0.17 265);
90
+
91
+ --destructive: oklch(0.6 0.1 30);
92
+ --destructive-foreground: oklch(0.95 0 0);
93
+
94
+ --warning: oklch(0.7 0.1 75);
95
+ --warning-foreground: oklch(0.12 0 0);
96
+
97
+ --info: oklch(0.65 0.09 240);
98
+ --info-foreground: oklch(0.95 0 0);
99
+
100
+ --success: oklch(0.65 0.1 165);
101
+ --success-foreground: oklch(0.95 0 0);
102
+
103
+ --brand: oklch(0.68 0.18 265);
104
+ --brand-foreground: oklch(0.12 0.02 265);
105
+ }