@astryxdesign/theme-stone 0.0.0-bootstrap.0 → 0.0.15

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,652 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ /**
4
+ * Stone Theme
5
+ *
6
+ * A warm, earthy neutral theme inspired by natural stone and sandstone.
7
+ * Core palette: #28282A, #84848B, #D8D8DB, #f3f3f5, #FFFFFF
8
+ * Montserrat for headings, Figtree for body, JetBrains Mono for code.
9
+ */
10
+
11
+ import {defineTheme, defineSyntaxTheme} from '@astryxdesign/core/theme';
12
+ import {stoneIconRegistry} from './icons';
13
+
14
+ /**
15
+ * Input status border overrides (per-component, per-status). All 9 input
16
+ * components share inputStatusBorderStyles in core, which read
17
+ * --color-{success,warning,error} (T30 light / T80 dark = saturated text
18
+ * tone). Stone redefines those vars inside each input's status scope to
19
+ * T60 light / T70 dark so the border (and the matching status icon) reads
20
+ * as a softer hue rim, in line with the gentle T90 status message bubble.
21
+ */
22
+ const INPUT_STATUS_VARS = {
23
+ 'status:success': {
24
+ '--color-success': 'light-dark(#7f977e, #99b298)', // Green T60 / T70
25
+ },
26
+ 'status:warning': {
27
+ '--color-warning': 'light-dark(#9f8f68, #bbaa81)', // Yellow T60 / T70
28
+ },
29
+ 'status:error': {
30
+ '--color-error': 'light-dark(#a58b86, #c0a5a1)', // Red T60 / T70
31
+ },
32
+ } as const;
33
+
34
+ /**
35
+ * Stone syntax palette — light values snap to T40 / T45 stops on the
36
+ * stone categorical ramps (per audit drawer); dark values stay at T70.
37
+ *
38
+ * `string` and `property` both land on Teal T40 — intentional; the audit
39
+ * unified them since green and teal are visually adjacent at T40 and
40
+ * the stone neutral palette doesn't carry a distinct green stop.
41
+ */
42
+ const stoneSyntax = defineSyntaxTheme({
43
+ name: 'xds-stone',
44
+ tokens: {
45
+ keyword: ['#645a72', '#b2a7c1'], // Purple T40 / T70
46
+ string: ['#4e6357', '#9bb19a'], // Teal T40 / Green T70
47
+ comment: ['#5e5e5e', '#ababb0'], // Stone Neutral T40 / T70
48
+ number: ['#755752', '#bea792'], // Red T40 / Orange T70
49
+ function: ['#506072', '#99adc6'], // Blue T40 / T70
50
+ type: ['#645a72', '#b2a7c1'], // Purple T40 / T70
51
+ variable: ['#5e5e5e', '#ababb0'], // Stone Neutral T40 / T70
52
+ operator: ['#5e5e5e', '#ababb0'], // Stone Neutral T40 / T70
53
+ constant: ['#755752', '#bea792'], // Red T40 / Orange T70
54
+ tag: ['#775751', '#c7a39d'], // Red T40 / T70
55
+ attribute: ['#79693f', '#b6aa90'], // Yellow T45 / T70
56
+ property: ['#4e6357', '#94b2a0'], // Teal T40 / T70
57
+ punctuation: ['#5e5e5e', '#ababb0'], // Stone Neutral T40 / T70
58
+ background: ['#f3f3f5', '#171719'],
59
+ },
60
+ });
61
+
62
+ export const stoneTheme = defineTheme({
63
+ name: 'stone',
64
+
65
+ typography: {
66
+ scale: {base: 14, ratio: 1.25},
67
+ body: {
68
+ family: 'Figtree',
69
+ fallbacks:
70
+ '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
71
+ },
72
+ heading: {
73
+ family: 'Montserrat',
74
+ fallbacks:
75
+ '"Figtree", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif',
76
+ weights: {3: 'bold', 4: 'bold'},
77
+ },
78
+ code: {
79
+ family: 'JetBrains Mono',
80
+ fallbacks: '"SF Mono", Monaco, Consolas, monospace',
81
+ },
82
+ },
83
+
84
+ motion: {fast: 125, medium: 300, slow: 700, ratio: 0.75},
85
+
86
+ syntax: stoneSyntax,
87
+
88
+ tokens: {
89
+ // =========================================================================
90
+ // Colors — warm stone palette
91
+ // Core: #28282A, #84848B, #D8D8DB, #f3f3f5, #FFFFFF
92
+ // =========================================================================
93
+
94
+ // Core semantic — all neutrals H=291
95
+ // Stone 900 T=16 C=1.4, Stone 500 T=55 C=4, Stone 300 T=86 C=1.6, Stone 100 T=96 C=1
96
+ '--color-accent': ['#25252a', '#f3f3f5'], // light: Stone Neutral T15
97
+ '--color-accent-muted': ['#25252a14', '#f3f3f5'], // light: Stone Neutral T15 · 8%
98
+ '--color-neutral': ['#25252a0f', '#f3f3f5'], // light: Stone Neutral T15 · 6%
99
+ '--color-background-surface': ['#ffffff', '#1b1b1f'], // dark: Stone Neutral T10
100
+ '--color-background-body': ['#f3f3f5', '#111015'], // dark: Stone Neutral T5
101
+ '--color-overlay': ['#25252a80', '#28282a'], // light: Stone Neutral T15 · 50%
102
+ '--color-overlay-hover': ['#25252a0d', '#f3f3f5'], // light: Stone Neutral T15 · 5%
103
+ '--color-overlay-pressed': ['#25252a1a', '#f3f3f5'], // light: Stone Neutral T15 · 10%
104
+ '--color-background-muted': ['#e2e2e8', '#3b3b3f'], // light: Stone Neutral T90
105
+
106
+ // Text — H=291
107
+ '--color-text-primary': ['#25252a', '#f3f3f5'], // light: Stone Neutral T15
108
+ '--color-text-secondary': ['#83838a', '#9d9da3'], // T55 C=4 / T65 C=3
109
+ '--color-text-disabled': ['#d7d7da', '#5e5e61'], // T86 C=1.6 / T40 C=2
110
+ '--color-text-accent': ['#25252a', '#f3f3f5'], // light: Stone Neutral T15
111
+ '--color-on-dark': '#FFFFFF',
112
+ '--color-on-light': ['#25252a', '#28282a'], // light: Stone Neutral T15
113
+ '--color-on-accent': ['#ffffff', '#25252a'], // dark: Stone Neutral T15
114
+ // Text on top of matching status surface (badge fill, banner content).
115
+ '--color-on-success': ['#374c36', '#d0e9ce'], // Green T30 / T90
116
+ '--color-on-error': ['#58413e', '#f9dcd7'], // Red T30 / T90
117
+ '--color-on-warning': ['#524622', '#f4e1b7'], // Yellow T30 / T90
118
+
119
+ // Icon — H=291
120
+ '--color-icon-accent': ['#25252a', '#f3f3f5'], // light: Stone Neutral T15
121
+ '--color-icon-primary': ['#25252a', '#f3f3f5'], // light: Stone Neutral T15
122
+ '--color-icon-secondary': ['#83838a', '#9d9da3'], // T55 C=4 / T65 C=3
123
+ '--color-icon-disabled': ['#d7d7da', '#5e5e61'], // T86 C=1.6 / T40 C=2
124
+
125
+ // Surface variants — H=291
126
+ '--color-background-card': ['#FFFFFF', '#242325'], // T14
127
+ '--color-background-popover': ['#ffffff', '#25252a'], // dark: Stone Neutral T15
128
+ '--color-background-inverted': ['#25252a', '#f3f3f5'], // light: Stone Neutral T15
129
+
130
+ // Status / Sentiment — T50 from palette for icons/borders (visible color)
131
+ '--color-success': ['#374c36', '#b4cdb2'], // Green T30 / T80
132
+ '--color-success-muted': ['#d0e9ce', '#b4cdb2'], // Green T90 / T80
133
+ '--color-error': ['#58413e', '#dcc0bc'], // Red T30 / T80
134
+ '--color-error-muted': ['#f9dcd7', '#dcc0bc'], // Red T90 / T80
135
+ '--color-warning': ['#524622', '#d7c59c'], // Yellow T30 / T80
136
+ '--color-warning-muted': ['#f4e1b7', '#d7c59c'], // Yellow T90 / T80
137
+
138
+ // Border — H=291
139
+ '--color-border': ['#e2e2e8', '#f3f3f5'], // light: Stone Neutral T90
140
+ '--color-border-emphasized': ['#83838a', '#5e5e61'], // T55 C=4 / T40 C=2
141
+
142
+ // Effects — H=291
143
+ '--color-skeleton': ['#d4d4da', '#5e5e64'], // T85 / T40 from H=291 C=3
144
+ '--color-shadow': ['#25252a1a', '#000000'], // light: Stone Neutral T15 · 10%
145
+ '--color-tint-hover': ['black', 'white'],
146
+
147
+ // Typography override
148
+ '--text-supporting-size': '12px',
149
+
150
+ // Categorical hues
151
+ // Light: T90 solid bg + T30 text (pastel surface, dark text)
152
+ // Dark: T35 solid bg + T90 text — snaps to canonical palette stops
153
+ // per theming-infra.mdc §7. T90 dark text is the SAME hex as
154
+ // the light-mode bg pastel — clean palette symmetry, ~6–9:1
155
+ // contrast on the T35 surface across all hues (passes AA Body).
156
+ // Borders: light T85 / dark T25 — one step inward from surface in both
157
+ // modes, matching the light-mode T90/T85 spacing.
158
+
159
+ // Categorical — Blue H=265 C=10
160
+ '--color-background-blue': ['#d7e4f5', '#485362'], // light T90 / dark T35
161
+ '--color-border-blue': ['#c9d6e7', '#313c4a'], // light T85 / dark T25
162
+ '--color-icon-blue': ['#3c4856', '#d7e4f5'], // light T30 / dark T90
163
+ '--color-text-blue': ['#3c4856', '#d7e4f5'],
164
+
165
+ // Categorical — Cyan H=190 C=10
166
+ '--color-background-cyan': ['#cce8e5', '#3e5755'],
167
+ '--color-border-cyan': ['#bedad7', '#28403e'],
168
+ '--color-icon-cyan': ['#334b49', '#cce8e5'],
169
+ '--color-text-cyan': ['#334b49', '#cce8e5'],
170
+
171
+ // Categorical — Gray (pure neutral, C=0). Same T35/T25/T90 pattern from
172
+ // the neutral H=291 C=3 ramp.
173
+ '--color-background-gray': ['#e2e2e8', '#525257'], // light: Stone Neutral T90
174
+ '--color-border-gray': ['#d4d4da', '#3b3b3f'], // light: Stone Neutral T85
175
+ '--color-icon-gray': ['#46464b', '#e2e2e8'], // light: Stone Neutral T30
176
+ '--color-text-gray': ['#46464b', '#e2e2e8'], // light: Stone Neutral T30
177
+
178
+ // Categorical — Green H=142 C=17
179
+ '--color-background-green': ['#d0e9ce', '#425841'],
180
+ '--color-border-green': ['#c2dbc0', '#2b402b'],
181
+ '--color-icon-green': ['#374c36', '#d0e9ce'],
182
+ '--color-text-green': ['#374c36', '#d0e9ce'],
183
+
184
+ // Categorical — Orange H=70 C=22
185
+ '--color-background-orange': ['#ffdcbb', '#684d32'],
186
+ '--color-border-orange': ['#f1ceae', '#4f361c'],
187
+ '--color-icon-orange': ['#5b4227', '#ffdcbb'],
188
+ '--color-text-orange': ['#5b4227', '#ffdcbb'],
189
+
190
+ // Categorical — Pink H=340 C=9
191
+ '--color-background-pink': ['#f0dde8', '#5e4e57'],
192
+ '--color-border-pink': ['#e2cfda', '#463740'],
193
+ '--color-icon-pink': ['#52424c', '#f0dde8'],
194
+ '--color-text-pink': ['#52424c', '#f0dde8'],
195
+
196
+ // Categorical — Purple H=307 C=11
197
+ '--color-background-purple': ['#e8dff3', '#564f60'],
198
+ '--color-border-purple': ['#d9d1e5', '#3f3949'],
199
+ '--color-icon-purple': ['#4b4454', '#e8dff3'],
200
+ '--color-text-purple': ['#4b4454', '#e8dff3'],
201
+
202
+ // Categorical — Red H=33 C=11
203
+ '--color-background-red': ['#f9dcd7', '#644d49'],
204
+ '--color-border-red': ['#ebcec9', '#4c3633'],
205
+ '--color-icon-red': ['#58413e', '#f9dcd7'],
206
+ '--color-text-red': ['#58413e', '#f9dcd7'],
207
+
208
+ // Categorical — Teal H=158 C=9
209
+ '--color-background-teal': ['#d4e7dc', '#46564d'],
210
+ '--color-border-teal': ['#c6d9ce', '#303f36'],
211
+ '--color-icon-teal': ['#3b4a41', '#d4e7dc'],
212
+ '--color-text-teal': ['#3b4a41', '#d4e7dc'],
213
+
214
+ // Categorical — Yellow H=90 C=23
215
+ '--color-background-yellow': ['#f4e1b7', '#5e512d'],
216
+ '--color-border-yellow': ['#e5d3a9', '#463a18'],
217
+ '--color-icon-yellow': ['#524622', '#f4e1b7'],
218
+ '--color-text-yellow': ['#524622', '#f4e1b7'],
219
+
220
+ // =========================================================================
221
+ // Radius — clean and subtle
222
+ // =========================================================================
223
+ '--radius-none': '0.125rem',
224
+ '--radius-inner': '0.25rem',
225
+ '--radius-element': '0.5rem',
226
+ '--radius-container': '0.75rem',
227
+ '--radius-page': '1.5rem',
228
+ '--radius-full': '9999px',
229
+
230
+ // =========================================================================
231
+ // Shadows
232
+ // =========================================================================
233
+ '--shadow-low': '0 2px 4px #28282A0D, 0 4px 8px #28282A1A',
234
+ '--shadow-med': '0 2px 4px #28282A0D, 0 4px 12px #28282A1A',
235
+ '--shadow-high': '0 4px 6px #28282A1A, 0 12px 24px #28282A26',
236
+ '--shadow-inset-hover': 'inset 0px 0px 0px 2px #28282A30',
237
+ '--shadow-inset-selected': 'inset 0px 0px 0px 2px #28282A50',
238
+ '--shadow-inset-success': 'inset 0px 0px 0px 2px #83838a30',
239
+ '--shadow-inset-warning': 'inset 0px 0px 0px 2px #83838a30',
240
+ '--shadow-inset-error': 'inset 0px 0px 0px 2px #83838a30',
241
+ },
242
+
243
+ components: {
244
+ button: {
245
+ base: {
246
+ borderRadius: 'var(--radius-full)',
247
+ },
248
+ 'variant:secondary': {
249
+ backgroundColor: 'transparent',
250
+ borderWidth: '1.5px',
251
+ borderStyle: 'solid',
252
+ borderColor: 'var(--color-border-emphasized)',
253
+ ':hover': {
254
+ backgroundColor: 'var(--color-neutral)',
255
+ },
256
+ },
257
+ 'variant:destructive': {
258
+ backgroundColor: 'var(--color-background-red)',
259
+ color: 'var(--color-text-red)',
260
+ },
261
+ },
262
+
263
+ // Semantic variants point at categorical hue tokens — single source of truth.
264
+ badge: {
265
+ 'variant:info': {
266
+ backgroundColor: 'var(--color-background-blue)',
267
+ color: 'var(--color-text-blue)',
268
+ },
269
+ 'variant:neutral': {
270
+ backgroundColor: 'var(--color-background-gray)',
271
+ color: 'var(--color-text-gray)',
272
+ },
273
+ 'variant:success': {
274
+ backgroundColor: 'var(--color-background-green)',
275
+ color: 'var(--color-text-green)',
276
+ },
277
+ 'variant:warning': {
278
+ backgroundColor: 'var(--color-background-yellow)',
279
+ color: 'var(--color-text-yellow)',
280
+ },
281
+ 'variant:error': {
282
+ backgroundColor: 'var(--color-background-red)',
283
+ color: 'var(--color-text-red)',
284
+ },
285
+ },
286
+
287
+ // StyleX paints the banner surface from @layer priority4 (above
288
+ // @layer astryx-theme), so a direct backgroundColor override loses the
289
+ // cascade. Redefine the muted token instead so StyleX's var() resolves
290
+ // to the categorical bg in our scope.
291
+ banner: {
292
+ 'status:info': {
293
+ '--color-accent-muted': 'var(--color-background-blue)',
294
+ '--color-text-primary': 'var(--color-text-blue)',
295
+ '--color-text-secondary': 'var(--color-text-blue)',
296
+ '--color-accent': 'var(--color-text-blue)',
297
+ },
298
+ 'status:success': {
299
+ '--color-success-muted': 'var(--color-background-green)',
300
+ '--color-text-primary': 'var(--color-text-green)',
301
+ '--color-text-secondary': 'var(--color-text-green)',
302
+ '--color-success': 'var(--color-text-green)',
303
+ },
304
+ 'status:warning': {
305
+ '--color-warning-muted': 'var(--color-background-yellow)',
306
+ '--color-text-primary': 'var(--color-text-yellow)',
307
+ '--color-text-secondary': 'var(--color-text-yellow)',
308
+ '--color-warning': 'var(--color-text-yellow)',
309
+ },
310
+ 'status:error': {
311
+ '--color-error-muted': 'var(--color-background-red)',
312
+ '--color-text-primary': 'var(--color-text-red)',
313
+ '--color-text-secondary': 'var(--color-text-red)',
314
+ '--color-error': 'var(--color-text-red)',
315
+ },
316
+ },
317
+
318
+ // Fill: light = T90 (same hex as banner/badge surface — fill reads as
319
+ // the same color family as the matching status surface). Dark = T70.
320
+ // Hexes from the preview Tonal Palettes ramp. accent (default) +
321
+ // indeterminate both route to blue for the in-progress / loading look.
322
+ 'progressbar-fill': {
323
+ 'variant:accent': {
324
+ backgroundColor: 'light-dark(#d7e4f5, #a0acbc)', // Blue T90 / T70
325
+ },
326
+ 'variant:success': {
327
+ backgroundColor: 'light-dark(#d0e9ce, #9ab298)', // Green T90 / T70
328
+ },
329
+ 'variant:warning': {
330
+ backgroundColor: 'light-dark(#f4e1b7, #bbaa82)', // Yellow T90 / T70
331
+ },
332
+ 'variant:error': {
333
+ backgroundColor: 'light-dark(#f9dcd7, #c0a5a0)', // Red T90 / T70
334
+ },
335
+ },
336
+
337
+ // Track default --color-background-muted reads near-body in stone;
338
+ // redirect to --color-skeleton so the channel stays visible.
339
+ 'progressbar-track': {
340
+ base: {
341
+ backgroundColor: 'var(--color-skeleton)',
342
+ },
343
+ },
344
+
345
+ // Switch off-state track reads --color-background-gray by default.
346
+ // Redefine it inside the switch scope to --color-skeleton, matching
347
+ // the ProgressBar track. The on-state reads --color-accent (unaffected);
348
+ // disabled-off also picks up --color-skeleton for consistency.
349
+ switch: {
350
+ base: {
351
+ '--color-background-gray': 'var(--color-skeleton)',
352
+ },
353
+ },
354
+
355
+ // FieldStatus surface matches badge — see badge override above.
356
+ 'field-status': {
357
+ 'type:success': {
358
+ backgroundColor: 'var(--color-background-green)',
359
+ },
360
+ 'type:warning': {
361
+ backgroundColor: 'var(--color-background-yellow)',
362
+ },
363
+ 'type:error': {
364
+ backgroundColor: 'var(--color-background-red)',
365
+ },
366
+ },
367
+
368
+ // Input status borders + icons across all 9 input components share the
369
+ // same softer T60/T70 redirection. See INPUT_STATUS_VARS above.
370
+ 'text-input': INPUT_STATUS_VARS,
371
+ textarea: INPUT_STATUS_VARS,
372
+ 'number-input': INPUT_STATUS_VARS,
373
+ 'date-input': INPUT_STATUS_VARS,
374
+ 'time-input': INPUT_STATUS_VARS,
375
+ selector: INPUT_STATUS_VARS,
376
+ 'multi-selector': INPUT_STATUS_VARS,
377
+ typeahead: INPUT_STATUS_VARS,
378
+ tokenizer: INPUT_STATUS_VARS,
379
+
380
+ card: {
381
+ base: {
382
+ padding: 'var(--spacing-3)',
383
+ },
384
+ },
385
+
386
+ section: {
387
+ base: {
388
+ padding: 'var(--spacing-3)',
389
+ },
390
+ },
391
+ },
392
+
393
+ icons: stoneIconRegistry,
394
+ });
395
+
396
+ /**
397
+ * Raw tonal palettes — every color at every tone step (0–100 in 5s).
398
+ * Same hue and chroma used to derive all theme tokens.
399
+ * Use these for custom components or data visualization.
400
+ */
401
+ export const stonePalettes = {
402
+ neutral: {
403
+ hue: 291,
404
+ chroma: 3,
405
+ 0: '#000000',
406
+ 5: '#111015',
407
+ 10: '#1b1b1f',
408
+ 15: '#25252a',
409
+ 20: '#303034',
410
+ 25: '#3b3b3f',
411
+ 30: '#46464b',
412
+ 35: '#525257',
413
+ 40: '#5e5e63',
414
+ 45: '#6a6a6f',
415
+ 50: '#77777c',
416
+ 55: '#838388',
417
+ 60: '#909095',
418
+ 65: '#9d9da3',
419
+ 70: '#ababb0',
420
+ 75: '#b8b8be',
421
+ 80: '#c6c6cc',
422
+ 85: '#d4d4da',
423
+ 90: '#e2e2e8',
424
+ 95: '#f0f0f6',
425
+ 100: '#ffffff',
426
+ },
427
+ blue: {
428
+ hue: 265,
429
+ chroma: 10,
430
+ 0: '#000000',
431
+ 5: '#04121e',
432
+ 10: '#111c29',
433
+ 15: '#1b2734',
434
+ 20: '#26313f',
435
+ 25: '#313c4a',
436
+ 30: '#3c4856',
437
+ 35: '#485362',
438
+ 40: '#545f6e',
439
+ 45: '#606c7b',
440
+ 50: '#6c7888',
441
+ 55: '#798595',
442
+ 60: '#8692a2',
443
+ 65: '#939faf',
444
+ 70: '#a0acbd',
445
+ 75: '#adbacb',
446
+ 80: '#bbc8d9',
447
+ 85: '#c9d6e7',
448
+ 90: '#d7e4f5',
449
+ 95: '#e7f2ff',
450
+ 100: '#ffffff',
451
+ },
452
+ cyan: {
453
+ hue: 190,
454
+ chroma: 10,
455
+ 0: '#000000',
456
+ 5: '#001613',
457
+ 10: '#071f1e',
458
+ 15: '#122a28',
459
+ 20: '#1d3433',
460
+ 25: '#28403e',
461
+ 30: '#334b49',
462
+ 35: '#3e5755',
463
+ 40: '#4a6361',
464
+ 45: '#566f6d',
465
+ 50: '#627c7a',
466
+ 55: '#6f8986',
467
+ 60: '#7b9693',
468
+ 65: '#88a3a0',
469
+ 70: '#95b1ae',
470
+ 75: '#a3bebb',
471
+ 80: '#b0ccc9',
472
+ 85: '#bedad7',
473
+ 90: '#cce8e5',
474
+ 95: '#daf7f4',
475
+ 100: '#ffffff',
476
+ },
477
+ green: {
478
+ hue: 142,
479
+ chroma: 17,
480
+ 0: '#000000',
481
+ 5: '#001700',
482
+ 10: '#0c200a',
483
+ 15: '#162a16',
484
+ 20: '#213521',
485
+ 25: '#2b402b',
486
+ 30: '#374c36',
487
+ 35: '#425841',
488
+ 40: '#4e644d',
489
+ 45: '#5a7059',
490
+ 50: '#667d65',
491
+ 55: '#728a71',
492
+ 60: '#7f977e',
493
+ 65: '#8ca48b',
494
+ 70: '#99b298',
495
+ 75: '#a7bfa5',
496
+ 80: '#b4cdb2',
497
+ 85: '#c2dbc0',
498
+ 90: '#d0e9ce',
499
+ 95: '#def8dc',
500
+ 100: '#ffffff',
501
+ },
502
+ teal: {
503
+ hue: 158,
504
+ chroma: 9,
505
+ 0: '#000000',
506
+ 5: '#00150a',
507
+ 10: '#101e17',
508
+ 15: '#1a2921',
509
+ 20: '#25342b',
510
+ 25: '#303f36',
511
+ 30: '#3b4a41',
512
+ 35: '#46564d',
513
+ 40: '#526259',
514
+ 45: '#5e6e65',
515
+ 50: '#6a7b71',
516
+ 55: '#77887e',
517
+ 60: '#83958a',
518
+ 65: '#90a297',
519
+ 70: '#9dafa5',
520
+ 75: '#abbdb2',
521
+ 80: '#b8cbc0',
522
+ 85: '#c6d9ce',
523
+ 90: '#d4e7dc',
524
+ 95: '#e2f5ea',
525
+ 100: '#ffffff',
526
+ },
527
+ yellow: {
528
+ hue: 90,
529
+ chroma: 23,
530
+ 0: '#000000',
531
+ 5: '#1f0f00',
532
+ 10: '#261a00',
533
+ 15: '#2f2500',
534
+ 20: '#3a2f0d',
535
+ 25: '#463a18',
536
+ 30: '#524622',
537
+ 35: '#5e512d',
538
+ 40: '#6b5d39',
539
+ 45: '#786944',
540
+ 50: '#857650',
541
+ 55: '#92825c',
542
+ 60: '#9f8f68',
543
+ 65: '#ad9c75',
544
+ 70: '#bbaa81',
545
+ 75: '#c9b78e',
546
+ 80: '#d7c59c',
547
+ 85: '#e5d3a9',
548
+ 90: '#f4e1b7',
549
+ 95: '#ffefc7',
550
+ 100: '#ffffff',
551
+ },
552
+ orange: {
553
+ hue: 70,
554
+ chroma: 22,
555
+ 0: '#000000',
556
+ 5: '#250a00',
557
+ 10: '#2d1700',
558
+ 15: '#372104',
559
+ 20: '#432c12',
560
+ 25: '#4f361c',
561
+ 30: '#5b4227',
562
+ 35: '#684d32',
563
+ 40: '#75593d',
564
+ 45: '#826548',
565
+ 50: '#8f7154',
566
+ 55: '#9d7e60',
567
+ 60: '#aa8b6d',
568
+ 65: '#b89879',
569
+ 70: '#c6a586',
570
+ 75: '#d4b393',
571
+ 80: '#e3c0a0',
572
+ 85: '#f1ceae',
573
+ 90: '#ffdcbb',
574
+ 95: '#ffeddc',
575
+ 100: '#ffffff',
576
+ },
577
+ red: {
578
+ hue: 33,
579
+ chroma: 11,
580
+ 0: '#000000',
581
+ 5: '#210a04',
582
+ 10: '#2a1714',
583
+ 15: '#35211e',
584
+ 20: '#402b28',
585
+ 25: '#4c3633',
586
+ 30: '#58413e',
587
+ 35: '#644d49',
588
+ 40: '#715955',
589
+ 45: '#7e6561',
590
+ 50: '#8a716d',
591
+ 55: '#987e7a',
592
+ 60: '#a58b86',
593
+ 65: '#b39893',
594
+ 70: '#c0a5a1',
595
+ 75: '#ceb3ae',
596
+ 80: '#dcc0bc',
597
+ 85: '#ebcec9',
598
+ 90: '#f9dcd7',
599
+ 95: '#ffece9',
600
+ 100: '#ffffff',
601
+ },
602
+ pink: {
603
+ hue: 340,
604
+ chroma: 9,
605
+ 0: '#000000',
606
+ 5: '#1b0c16',
607
+ 10: '#251720',
608
+ 15: '#30222a',
609
+ 20: '#3b2c35',
610
+ 25: '#463740',
611
+ 30: '#52424c',
612
+ 35: '#5e4e57',
613
+ 40: '#6a5a63',
614
+ 45: '#776670',
615
+ 50: '#83727c',
616
+ 55: '#907f89',
617
+ 60: '#9d8c96',
618
+ 65: '#ab99a3',
619
+ 70: '#b8a6b1',
620
+ 75: '#c6b4be',
621
+ 80: '#d4c1cc',
622
+ 85: '#e2cfda',
623
+ 90: '#f0dde8',
624
+ 95: '#ffebf7',
625
+ 100: '#ffffff',
626
+ },
627
+ purple: {
628
+ hue: 307,
629
+ chroma: 11,
630
+ 0: '#000000',
631
+ 5: '#150e1d',
632
+ 10: '#1f1927',
633
+ 15: '#292332',
634
+ 20: '#342e3d',
635
+ 25: '#3f3949',
636
+ 30: '#4b4454',
637
+ 35: '#564f60',
638
+ 40: '#635b6d',
639
+ 45: '#6f6779',
640
+ 50: '#7b7486',
641
+ 55: '#888193',
642
+ 60: '#958da0',
643
+ 65: '#a39aad',
644
+ 70: '#b0a8bb',
645
+ 75: '#beb5c9',
646
+ 80: '#cbc3d7',
647
+ 85: '#d9d1e5',
648
+ 90: '#e8dff3',
649
+ 95: '#f6edff',
650
+ 100: '#ffffff',
651
+ },
652
+ } as const;