@cupped/tokens 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,1501 @@
1
+ {
2
+ "color": {
3
+ "$type": "color",
4
+ "palette": {
5
+ "$description": "Raw palette values. Never consumed by apps — alias through the semantic layer.",
6
+ "white": {
7
+ "$value": "#FFFFFF"
8
+ },
9
+ "slate": {
10
+ "50": {
11
+ "$value": "#F8FAFC"
12
+ },
13
+ "100": {
14
+ "$value": "#F1F5F9"
15
+ },
16
+ "200": {
17
+ "$value": "#E2E8F0"
18
+ },
19
+ "400": {
20
+ "$value": "#94A3B8"
21
+ },
22
+ "600": {
23
+ "$value": "#475569"
24
+ },
25
+ "900": {
26
+ "$value": "#0F172A"
27
+ },
28
+ "$description": "Cool slate neutrals — carry all UI chrome."
29
+ },
30
+ "coral": {
31
+ "50": {
32
+ "$value": "#FDF2F0"
33
+ },
34
+ "500": {
35
+ "$value": "#E07A5F"
36
+ },
37
+ "550": {
38
+ "$value": "#D16A4F"
39
+ },
40
+ "600": {
41
+ "$value": "#C05539"
42
+ },
43
+ "650": {
44
+ "$value": "#AD4A30"
45
+ },
46
+ "$description": "Warm brand coral — carries action and brand. Coral = action; slate = chrome."
47
+ },
48
+ "ember": {
49
+ "$description": "Gamification source hue (streak fire). Promoted to a source token in the refreshed export; --streak aliases it.",
50
+ "fill": {
51
+ "$value": "#F97316"
52
+ },
53
+ "text": {
54
+ "$value": "#C2410C"
55
+ }
56
+ },
57
+ "green": {
58
+ "50": {
59
+ "$value": "#F0FDF4"
60
+ },
61
+ "500": {
62
+ "$value": "#22C55E"
63
+ },
64
+ "700": {
65
+ "$value": "#15803D"
66
+ }
67
+ },
68
+ "red": {
69
+ "50": {
70
+ "$value": "#FEF2F2"
71
+ },
72
+ "500": {
73
+ "$value": "#EF4444"
74
+ },
75
+ "700": {
76
+ "$value": "#B91C1C"
77
+ }
78
+ },
79
+ "amber": {
80
+ "50": {
81
+ "$value": "#FFFBEB"
82
+ },
83
+ "500": {
84
+ "$value": "#F59E0B"
85
+ },
86
+ "700": {
87
+ "$value": "#B45309"
88
+ }
89
+ },
90
+ "blue": {
91
+ "50": {
92
+ "$value": "#EFF6FF"
93
+ },
94
+ "500": {
95
+ "$value": "#3B82F6"
96
+ },
97
+ "700": {
98
+ "$value": "#1D4ED8"
99
+ }
100
+ },
101
+ "flavor": {
102
+ "$description": "SCA tasting vocabulary — parametric oklch band (\"Espresso\"), not hand-picked hexes. Fill band: L 0.555 · C 0.135 (bright) / 0.062 (earth) / earth ×0.7 (roasted). Text band: L 0.510 · C 0.110 (bright) / 0.060 (earth). Hue carries the flavor; lightness/chroma are shared, so every fill carries white text at ≥4.5:1 with zero exceptions.",
103
+ "fruity": {
104
+ "fill": {
105
+ "$value": "#B44C54",
106
+ "$extensions": {
107
+ "app.cupped": {
108
+ "oklch": {
109
+ "l": 0.555,
110
+ "c": 0.135,
111
+ "h": 18
112
+ },
113
+ "band": "fill"
114
+ }
115
+ }
116
+ },
117
+ "text": {
118
+ "$value": "#9B494E",
119
+ "$extensions": {
120
+ "app.cupped": {
121
+ "oklch": {
122
+ "l": 0.51,
123
+ "c": 0.11,
124
+ "h": 18
125
+ },
126
+ "band": "text"
127
+ }
128
+ }
129
+ }
130
+ },
131
+ "berry": {
132
+ "fill": {
133
+ "$value": "#AC4D7B",
134
+ "$extensions": {
135
+ "app.cupped": {
136
+ "oklch": {
137
+ "l": 0.555,
138
+ "c": 0.135,
139
+ "h": 352
140
+ },
141
+ "band": "fill"
142
+ }
143
+ }
144
+ },
145
+ "text": {
146
+ "$value": "#94496D",
147
+ "$extensions": {
148
+ "app.cupped": {
149
+ "oklch": {
150
+ "l": 0.51,
151
+ "c": 0.11,
152
+ "h": 352
153
+ },
154
+ "band": "text"
155
+ }
156
+ }
157
+ }
158
+ },
159
+ "citrus": {
160
+ "fill": {
161
+ "$value": "#A65F02",
162
+ "$extensions": {
163
+ "app.cupped": {
164
+ "oklch": {
165
+ "l": 0.555,
166
+ "c": 0.135,
167
+ "h": 62
168
+ },
169
+ "band": "fill"
170
+ }
171
+ }
172
+ },
173
+ "text": {
174
+ "$value": "#925512",
175
+ "$extensions": {
176
+ "app.cupped": {
177
+ "oklch": {
178
+ "l": 0.51,
179
+ "c": 0.11,
180
+ "h": 62
181
+ },
182
+ "band": "text"
183
+ }
184
+ }
185
+ }
186
+ },
187
+ "sweet": {
188
+ "fill": {
189
+ "$value": "#8E6E09",
190
+ "$extensions": {
191
+ "app.cupped": {
192
+ "oklch": {
193
+ "l": 0.555,
194
+ "c": 0.135,
195
+ "h": 88
196
+ },
197
+ "band": "fill"
198
+ }
199
+ }
200
+ },
201
+ "text": {
202
+ "$value": "#7E6207",
203
+ "$extensions": {
204
+ "app.cupped": {
205
+ "oklch": {
206
+ "l": 0.51,
207
+ "c": 0.11,
208
+ "h": 88
209
+ },
210
+ "band": "text"
211
+ }
212
+ }
213
+ }
214
+ },
215
+ "floral": {
216
+ "fill": {
217
+ "$value": "#865CB2",
218
+ "$extensions": {
219
+ "app.cupped": {
220
+ "oklch": {
221
+ "l": 0.555,
222
+ "c": 0.135,
223
+ "h": 305
224
+ },
225
+ "band": "fill"
226
+ }
227
+ }
228
+ },
229
+ "text": {
230
+ "$value": "#755498",
231
+ "$extensions": {
232
+ "app.cupped": {
233
+ "oklch": {
234
+ "l": 0.51,
235
+ "c": 0.11,
236
+ "h": 305
237
+ },
238
+ "band": "text"
239
+ }
240
+ }
241
+ }
242
+ },
243
+ "green": {
244
+ "fill": {
245
+ "$value": "#4E8429",
246
+ "$extensions": {
247
+ "app.cupped": {
248
+ "oklch": {
249
+ "l": 0.555,
250
+ "c": 0.135,
251
+ "h": 135
252
+ },
253
+ "band": "fill"
254
+ }
255
+ }
256
+ },
257
+ "text": {
258
+ "$value": "#49742E",
259
+ "$extensions": {
260
+ "app.cupped": {
261
+ "oklch": {
262
+ "l": 0.51,
263
+ "c": 0.11,
264
+ "h": 135
265
+ },
266
+ "band": "text"
267
+ }
268
+ }
269
+ }
270
+ },
271
+ "spice": {
272
+ "fill": {
273
+ "$value": "#B4503A",
274
+ "$extensions": {
275
+ "app.cupped": {
276
+ "oklch": {
277
+ "l": 0.555,
278
+ "c": 0.135,
279
+ "h": 34
280
+ },
281
+ "band": "fill"
282
+ }
283
+ }
284
+ },
285
+ "text": {
286
+ "$value": "#9B4C3A",
287
+ "$extensions": {
288
+ "app.cupped": {
289
+ "oklch": {
290
+ "l": 0.51,
291
+ "c": 0.11,
292
+ "h": 34
293
+ },
294
+ "band": "text"
295
+ }
296
+ }
297
+ }
298
+ },
299
+ "nutty": {
300
+ "fill": {
301
+ "$value": "#876F49",
302
+ "$extensions": {
303
+ "app.cupped": {
304
+ "oklch": {
305
+ "l": 0.555,
306
+ "c": 0.062,
307
+ "h": 78
308
+ },
309
+ "band": "fill"
310
+ }
311
+ }
312
+ },
313
+ "text": {
314
+ "$value": "#79623E",
315
+ "$extensions": {
316
+ "app.cupped": {
317
+ "oklch": {
318
+ "l": 0.51,
319
+ "c": 0.06,
320
+ "h": 78
321
+ },
322
+ "band": "text"
323
+ }
324
+ }
325
+ }
326
+ },
327
+ "chocolate": {
328
+ "fill": {
329
+ "$value": "#916951",
330
+ "$extensions": {
331
+ "app.cupped": {
332
+ "oklch": {
333
+ "l": 0.555,
334
+ "c": 0.062,
335
+ "h": 52
336
+ },
337
+ "band": "fill"
338
+ }
339
+ }
340
+ },
341
+ "text": {
342
+ "$value": "#825C46",
343
+ "$extensions": {
344
+ "app.cupped": {
345
+ "oklch": {
346
+ "l": 0.51,
347
+ "c": 0.06,
348
+ "h": 52
349
+ },
350
+ "band": "text"
351
+ }
352
+ }
353
+ }
354
+ },
355
+ "roasted": {
356
+ "fill": {
357
+ "$value": "#896B5E",
358
+ "$extensions": {
359
+ "app.cupped": {
360
+ "oklch": {
361
+ "l": 0.555,
362
+ "c": 0.0434,
363
+ "h": 45
364
+ },
365
+ "band": "fill"
366
+ }
367
+ }
368
+ },
369
+ "text": {
370
+ "$value": "#7B5F52",
371
+ "$extensions": {
372
+ "app.cupped": {
373
+ "oklch": {
374
+ "l": 0.51,
375
+ "c": 0.042,
376
+ "h": 45
377
+ },
378
+ "band": "text"
379
+ }
380
+ }
381
+ }
382
+ }
383
+ }
384
+ },
385
+ "surface": {
386
+ "canvas": {
387
+ "$value": "{color.palette.slate.50}",
388
+ "$description": "App background.",
389
+ "$extensions": {
390
+ "app.cupped": {
391
+ "cssName": "canvas"
392
+ }
393
+ }
394
+ },
395
+ "card": {
396
+ "$value": "{color.palette.white}",
397
+ "$description": "Cards, elevated surfaces.",
398
+ "$extensions": {
399
+ "app.cupped": {
400
+ "cssName": "card"
401
+ }
402
+ }
403
+ },
404
+ "canvas-border": {
405
+ "$value": "{color.palette.slate.200}",
406
+ "$description": "Default borders, dividers.",
407
+ "$extensions": {
408
+ "app.cupped": {
409
+ "cssName": "canvas-border"
410
+ }
411
+ }
412
+ },
413
+ "canvas-border-subtle": {
414
+ "$value": "{color.palette.slate.100}",
415
+ "$description": "Subtle dividers.",
416
+ "$extensions": {
417
+ "app.cupped": {
418
+ "cssName": "canvas-border-subtle"
419
+ }
420
+ }
421
+ }
422
+ },
423
+ "ink": {
424
+ "default": {
425
+ "$value": "{color.palette.slate.900}",
426
+ "$description": "Primary text, headings — 16.9:1 AAA.",
427
+ "$extensions": {
428
+ "app.cupped": {
429
+ "cssName": "ink",
430
+ "contrast": [
431
+ {
432
+ "against": "{color.surface.canvas}",
433
+ "min": 4.5
434
+ },
435
+ {
436
+ "against": "{color.surface.card}",
437
+ "min": 4.5
438
+ }
439
+ ]
440
+ }
441
+ }
442
+ },
443
+ "secondary": {
444
+ "$value": "{color.palette.slate.600}",
445
+ "$description": "Secondary text, labels — 7.5:1 AA.",
446
+ "$extensions": {
447
+ "app.cupped": {
448
+ "contrast": [
449
+ {
450
+ "against": "{color.surface.canvas}",
451
+ "min": 4.5
452
+ },
453
+ {
454
+ "against": "{color.surface.card}",
455
+ "min": 4.5
456
+ }
457
+ ]
458
+ }
459
+ }
460
+ },
461
+ "muted": {
462
+ "$value": "{color.palette.slate.400}",
463
+ "$description": "Placeholders, decorative only — never body text."
464
+ },
465
+ "inverse": {
466
+ "$value": "{color.palette.slate.50}",
467
+ "$description": "Text on dark / strong fills. Note: 4.36:1 on primary-strong (the spec's 4.6:1 claim is for pure white #FFFFFF); flagged upstream, not encoded as an invariant."
468
+ }
469
+ },
470
+ "primary": {
471
+ "default": {
472
+ "$value": "{color.palette.coral.500}",
473
+ "$description": "Accents, ≥24px display text, illustration. ~3.0:1 on white — NEVER text below 24px.",
474
+ "$extensions": {
475
+ "app.cupped": {
476
+ "cssName": "primary",
477
+ "minTextPx": 24
478
+ }
479
+ }
480
+ },
481
+ "strong": {
482
+ "$value": "{color.palette.coral.600}",
483
+ "$description": "Action coral · 4.6:1 — buttons, links, small colored text.",
484
+ "$extensions": {
485
+ "app.cupped": {
486
+ "contrast": [
487
+ {
488
+ "against": "{color.surface.card}",
489
+ "min": 4.5
490
+ },
491
+ {
492
+ "against": "{color.surface.canvas}",
493
+ "min": 3,
494
+ "note": "focus-ring outer color, non-text WCAG 2.2"
495
+ }
496
+ ]
497
+ }
498
+ }
499
+ },
500
+ "strong-hover": {
501
+ "$value": "{color.palette.coral.650}",
502
+ "$description": "Hover/pressed for primary-strong fills."
503
+ },
504
+ "hover": {
505
+ "$value": "{color.palette.coral.550}",
506
+ "$description": "Hover for decorative coral fills."
507
+ },
508
+ "light": {
509
+ "$value": "{color.palette.coral.50}",
510
+ "$description": "Subtle coral background."
511
+ },
512
+ "muted": {
513
+ "$value": "rgba(224, 122, 95, 0.12)",
514
+ "$description": "12% coral-500 wash."
515
+ }
516
+ },
517
+ "success": {
518
+ "default": {
519
+ "$value": "{color.palette.green.500}",
520
+ "$extensions": {
521
+ "app.cupped": {
522
+ "cssName": "success"
523
+ }
524
+ }
525
+ },
526
+ "light": {
527
+ "$value": "{color.palette.green.50}"
528
+ },
529
+ "ink": {
530
+ "$value": "{color.palette.green.700}",
531
+ "$description": "AA text/icon variant on success-light.",
532
+ "$extensions": {
533
+ "app.cupped": {
534
+ "contrast": [
535
+ {
536
+ "against": "{color.success.light}",
537
+ "min": 4.5
538
+ }
539
+ ]
540
+ }
541
+ }
542
+ }
543
+ },
544
+ "error": {
545
+ "default": {
546
+ "$value": "{color.palette.red.500}",
547
+ "$extensions": {
548
+ "app.cupped": {
549
+ "cssName": "error"
550
+ }
551
+ }
552
+ },
553
+ "light": {
554
+ "$value": "{color.palette.red.50}"
555
+ },
556
+ "ink": {
557
+ "$value": "{color.palette.red.700}",
558
+ "$description": "AA text/icon variant on error-light.",
559
+ "$extensions": {
560
+ "app.cupped": {
561
+ "contrast": [
562
+ {
563
+ "against": "{color.error.light}",
564
+ "min": 4.5
565
+ }
566
+ ]
567
+ }
568
+ }
569
+ }
570
+ },
571
+ "warning": {
572
+ "default": {
573
+ "$value": "{color.palette.amber.500}",
574
+ "$extensions": {
575
+ "app.cupped": {
576
+ "cssName": "warning"
577
+ }
578
+ }
579
+ },
580
+ "light": {
581
+ "$value": "{color.palette.amber.50}"
582
+ },
583
+ "ink": {
584
+ "$value": "{color.palette.amber.700}",
585
+ "$description": "AA text/icon variant on warning-light.",
586
+ "$extensions": {
587
+ "app.cupped": {
588
+ "contrast": [
589
+ {
590
+ "against": "{color.warning.light}",
591
+ "min": 4.5
592
+ }
593
+ ]
594
+ }
595
+ }
596
+ }
597
+ },
598
+ "info": {
599
+ "default": {
600
+ "$value": "{color.palette.blue.500}",
601
+ "$extensions": {
602
+ "app.cupped": {
603
+ "cssName": "info"
604
+ }
605
+ }
606
+ },
607
+ "light": {
608
+ "$value": "{color.palette.blue.50}"
609
+ },
610
+ "ink": {
611
+ "$value": "{color.palette.blue.700}",
612
+ "$description": "AA text/icon variant on info-light.",
613
+ "$extensions": {
614
+ "app.cupped": {
615
+ "contrast": [
616
+ {
617
+ "against": "{color.info.light}",
618
+ "min": 4.5
619
+ }
620
+ ]
621
+ }
622
+ }
623
+ }
624
+ },
625
+ "fruity": {
626
+ "$value": "{color.palette.flavor.fruity.fill}",
627
+ "$extensions": {
628
+ "app.cupped": {
629
+ "contrast": [
630
+ {
631
+ "against": "{color.on-flavor}",
632
+ "min": 4.5
633
+ }
634
+ ]
635
+ }
636
+ }
637
+ },
638
+ "floral": {
639
+ "$value": "{color.palette.flavor.floral.fill}",
640
+ "$extensions": {
641
+ "app.cupped": {
642
+ "contrast": [
643
+ {
644
+ "against": "{color.on-flavor}",
645
+ "min": 4.5
646
+ }
647
+ ]
648
+ }
649
+ }
650
+ },
651
+ "nutty": {
652
+ "$value": "{color.palette.flavor.nutty.fill}",
653
+ "$extensions": {
654
+ "app.cupped": {
655
+ "contrast": [
656
+ {
657
+ "against": "{color.on-flavor}",
658
+ "min": 4.5
659
+ }
660
+ ]
661
+ }
662
+ }
663
+ },
664
+ "chocolate": {
665
+ "$value": "{color.palette.flavor.chocolate.fill}",
666
+ "$extensions": {
667
+ "app.cupped": {
668
+ "contrast": [
669
+ {
670
+ "against": "{color.on-flavor}",
671
+ "min": 4.5
672
+ }
673
+ ]
674
+ }
675
+ }
676
+ },
677
+ "spice": {
678
+ "$value": "{color.palette.flavor.spice.fill}",
679
+ "$extensions": {
680
+ "app.cupped": {
681
+ "contrast": [
682
+ {
683
+ "against": "{color.on-flavor}",
684
+ "min": 4.5
685
+ }
686
+ ]
687
+ }
688
+ }
689
+ },
690
+ "sweet": {
691
+ "$value": "{color.palette.flavor.sweet.fill}",
692
+ "$extensions": {
693
+ "app.cupped": {
694
+ "contrast": [
695
+ {
696
+ "against": "{color.on-flavor}",
697
+ "min": 4.5
698
+ }
699
+ ]
700
+ }
701
+ }
702
+ },
703
+ "citrus": {
704
+ "$value": "{color.palette.flavor.citrus.fill}",
705
+ "$extensions": {
706
+ "app.cupped": {
707
+ "contrast": [
708
+ {
709
+ "against": "{color.on-flavor}",
710
+ "min": 4.5
711
+ }
712
+ ]
713
+ }
714
+ }
715
+ },
716
+ "green": {
717
+ "$value": "{color.palette.flavor.green.fill}",
718
+ "$extensions": {
719
+ "app.cupped": {
720
+ "contrast": [
721
+ {
722
+ "against": "{color.on-flavor}",
723
+ "min": 4.5
724
+ }
725
+ ]
726
+ }
727
+ }
728
+ },
729
+ "berry": {
730
+ "$value": "{color.palette.flavor.berry.fill}",
731
+ "$extensions": {
732
+ "app.cupped": {
733
+ "contrast": [
734
+ {
735
+ "against": "{color.on-flavor}",
736
+ "min": 4.5
737
+ }
738
+ ]
739
+ }
740
+ }
741
+ },
742
+ "roasted": {
743
+ "$value": "{color.palette.flavor.roasted.fill}",
744
+ "$extensions": {
745
+ "app.cupped": {
746
+ "contrast": [
747
+ {
748
+ "against": "{color.on-flavor}",
749
+ "min": 4.5
750
+ }
751
+ ]
752
+ }
753
+ }
754
+ },
755
+ "fruity-accessible": {
756
+ "$value": "{color.palette.flavor.fruity.text}",
757
+ "$extensions": {
758
+ "app.cupped": {
759
+ "contrast": [
760
+ {
761
+ "against": "{color.surface.card}",
762
+ "min": 5.5
763
+ }
764
+ ]
765
+ }
766
+ }
767
+ },
768
+ "berry-accessible": {
769
+ "$value": "{color.palette.flavor.berry.text}",
770
+ "$extensions": {
771
+ "app.cupped": {
772
+ "contrast": [
773
+ {
774
+ "against": "{color.surface.card}",
775
+ "min": 5.5
776
+ }
777
+ ]
778
+ }
779
+ }
780
+ },
781
+ "citrus-accessible": {
782
+ "$value": "{color.palette.flavor.citrus.text}",
783
+ "$extensions": {
784
+ "app.cupped": {
785
+ "contrast": [
786
+ {
787
+ "against": "{color.surface.card}",
788
+ "min": 5.5
789
+ }
790
+ ]
791
+ }
792
+ }
793
+ },
794
+ "sweet-accessible": {
795
+ "$value": "{color.palette.flavor.sweet.text}",
796
+ "$extensions": {
797
+ "app.cupped": {
798
+ "contrast": [
799
+ {
800
+ "against": "{color.surface.card}",
801
+ "min": 5.5
802
+ }
803
+ ]
804
+ }
805
+ }
806
+ },
807
+ "floral-accessible": {
808
+ "$value": "{color.palette.flavor.floral.text}",
809
+ "$extensions": {
810
+ "app.cupped": {
811
+ "contrast": [
812
+ {
813
+ "against": "{color.surface.card}",
814
+ "min": 5.5
815
+ }
816
+ ]
817
+ }
818
+ }
819
+ },
820
+ "green-accessible": {
821
+ "$value": "{color.palette.flavor.green.text}",
822
+ "$extensions": {
823
+ "app.cupped": {
824
+ "contrast": [
825
+ {
826
+ "against": "{color.surface.card}",
827
+ "min": 5.5
828
+ }
829
+ ]
830
+ }
831
+ }
832
+ },
833
+ "spice-accessible": {
834
+ "$value": "{color.palette.flavor.spice.text}",
835
+ "$extensions": {
836
+ "app.cupped": {
837
+ "contrast": [
838
+ {
839
+ "against": "{color.surface.card}",
840
+ "min": 5.5
841
+ }
842
+ ]
843
+ }
844
+ }
845
+ },
846
+ "nutty-accessible": {
847
+ "$value": "{color.palette.flavor.nutty.text}",
848
+ "$extensions": {
849
+ "app.cupped": {
850
+ "contrast": [
851
+ {
852
+ "against": "{color.surface.card}",
853
+ "min": 5.5
854
+ }
855
+ ]
856
+ }
857
+ }
858
+ },
859
+ "chocolate-accessible": {
860
+ "$value": "{color.palette.flavor.chocolate.text}",
861
+ "$extensions": {
862
+ "app.cupped": {
863
+ "contrast": [
864
+ {
865
+ "against": "{color.surface.card}",
866
+ "min": 5.5
867
+ }
868
+ ]
869
+ }
870
+ }
871
+ },
872
+ "roasted-accessible": {
873
+ "$value": "{color.palette.flavor.roasted.text}",
874
+ "$extensions": {
875
+ "app.cupped": {
876
+ "contrast": [
877
+ {
878
+ "against": "{color.surface.card}",
879
+ "min": 5.5
880
+ }
881
+ ]
882
+ }
883
+ }
884
+ },
885
+ "on-flavor": {
886
+ "$value": "{color.palette.white}",
887
+ "$description": "Text on SOLID flavor fills. White everywhere; the band guarantees AA."
888
+ },
889
+ "xp": {
890
+ "$value": "{color.sweet}",
891
+ "$description": "Gamification alias — reserved for reward moments, never decoration."
892
+ },
893
+ "xp-accessible": {
894
+ "$value": "{color.sweet-accessible}"
895
+ },
896
+ "ember": {
897
+ "$value": "{color.palette.ember.fill}",
898
+ "$description": "Gamification source hue (streak fire)."
899
+ },
900
+ "ember-accessible": {
901
+ "$value": "{color.palette.ember.text}",
902
+ "$extensions": {
903
+ "app.cupped": {
904
+ "contrast": [
905
+ {
906
+ "against": "{color.surface.card}",
907
+ "min": 4.5
908
+ }
909
+ ]
910
+ }
911
+ }
912
+ },
913
+ "streak": {
914
+ "$value": "{color.ember}",
915
+ "$description": "Gamification alias — change the source (ember), not the alias."
916
+ },
917
+ "streak-accessible": {
918
+ "$value": "{color.ember-accessible}"
919
+ },
920
+ "badge": {
921
+ "$value": "{color.floral}",
922
+ "$description": "Gamification alias — reserved for reward moments, never decoration."
923
+ },
924
+ "badge-accessible": {
925
+ "$value": "{color.floral-accessible}"
926
+ },
927
+ "zone": {
928
+ "$description": "TDS extraction zones — aliases of feedback.",
929
+ "ideal": {
930
+ "$value": "{color.success.default}"
931
+ },
932
+ "under": {
933
+ "$value": "{color.info.default}"
934
+ },
935
+ "over": {
936
+ "$value": "{color.error.default}"
937
+ },
938
+ "strong": {
939
+ "$value": "{color.warning.default}"
940
+ },
941
+ "weak": {
942
+ "$value": "{color.ink.muted}"
943
+ }
944
+ },
945
+ "chart": {
946
+ "$description": "Chart series — aliases.",
947
+ "sca": {
948
+ "$value": "{color.primary.default}"
949
+ },
950
+ "ucdavis": {
951
+ "$value": "{color.floral}"
952
+ },
953
+ "grid": {
954
+ "$value": "{color.surface.canvas-border}"
955
+ }
956
+ }
957
+ },
958
+ "dimension": {
959
+ "$type": "dimension",
960
+ "scale": {
961
+ "2": {
962
+ "$value": "2px"
963
+ },
964
+ "4": {
965
+ "$value": "4px"
966
+ },
967
+ "8": {
968
+ "$value": "8px"
969
+ },
970
+ "12": {
971
+ "$value": "12px"
972
+ },
973
+ "16": {
974
+ "$value": "16px"
975
+ },
976
+ "20": {
977
+ "$value": "20px"
978
+ },
979
+ "24": {
980
+ "$value": "24px"
981
+ },
982
+ "32": {
983
+ "$value": "32px"
984
+ },
985
+ "44": {
986
+ "$value": "44px"
987
+ },
988
+ "$description": "Raw 4pt-grid dimension stops (plus 2px ring width and the 9999px pill radius). Never consumed by apps — alias through the semantic layer.",
989
+ "full": {
990
+ "$value": "9999px"
991
+ }
992
+ }
993
+ },
994
+ "duration": {
995
+ "$type": "duration",
996
+ "$description": "Raw durations. Kept in the spec's original units so generated CSS matches the canonical export character-for-character; the native pipeline normalizes to ms numbers.",
997
+ "spring": {
998
+ "$value": "0.55s"
999
+ },
1000
+ "stagger": {
1001
+ "$value": "0.08s"
1002
+ },
1003
+ "shimmer": {
1004
+ "$value": "1.5s"
1005
+ },
1006
+ "reduced": {
1007
+ "$value": "120ms"
1008
+ }
1009
+ },
1010
+ "font": {
1011
+ "family": {
1012
+ "$type": "fontFamily",
1013
+ "$description": "Three families, each with a job: Inter for all UI, Instrument Serif for display (max one moment per screen), JetBrains Mono for the technical register. Never Lora, Fraunces, or Plus Jakarta.",
1014
+ "sans": {
1015
+ "$value": [
1016
+ "Inter",
1017
+ "-apple-system",
1018
+ "BlinkMacSystemFont",
1019
+ "Segoe UI",
1020
+ "sans-serif"
1021
+ ]
1022
+ },
1023
+ "serif": {
1024
+ "$value": [
1025
+ "Instrument Serif",
1026
+ "Georgia",
1027
+ "serif"
1028
+ ]
1029
+ },
1030
+ "mono": {
1031
+ "$value": [
1032
+ "JetBrains Mono",
1033
+ "ui-monospace",
1034
+ "SFMono-Regular",
1035
+ "monospace"
1036
+ ]
1037
+ }
1038
+ },
1039
+ "weight": {
1040
+ "$type": "fontWeight",
1041
+ "regular": {
1042
+ "$value": 400
1043
+ },
1044
+ "medium": {
1045
+ "$value": 500
1046
+ },
1047
+ "semibold": {
1048
+ "$value": 600
1049
+ },
1050
+ "bold": {
1051
+ "$value": 700
1052
+ }
1053
+ },
1054
+ "size": {
1055
+ "12": {
1056
+ "$value": "12px"
1057
+ },
1058
+ "14": {
1059
+ "$value": "14px"
1060
+ },
1061
+ "16": {
1062
+ "$value": "16px"
1063
+ },
1064
+ "20": {
1065
+ "$value": "20px"
1066
+ },
1067
+ "24": {
1068
+ "$value": "24px"
1069
+ },
1070
+ "32": {
1071
+ "$value": "32px"
1072
+ },
1073
+ "56": {
1074
+ "$value": "56px"
1075
+ },
1076
+ "$type": "dimension",
1077
+ "$description": "Raw size stops. Every size shipped in a component has a semantic token name — no ad-hoc sizes."
1078
+ }
1079
+ },
1080
+ "shadow": {
1081
+ "$type": "shadow",
1082
+ "$description": "Shadow recipes for lifted surfaces — soft, low-opacity, slate-based, never harsh. Android elevations are judgment calls recorded in $extensions (no formulaic mapping).",
1083
+ "sm": {
1084
+ "$value": [
1085
+ {
1086
+ "color": "rgba(15,23,42,0.04)",
1087
+ "offsetX": "0px",
1088
+ "offsetY": "1px",
1089
+ "blur": "2px",
1090
+ "spread": "0px"
1091
+ },
1092
+ {
1093
+ "color": "rgba(15,23,42,0.03)",
1094
+ "offsetX": "0px",
1095
+ "offsetY": "1px",
1096
+ "blur": "1px",
1097
+ "spread": "0px"
1098
+ }
1099
+ ],
1100
+ "$description": "Cards, rows.",
1101
+ "$extensions": {
1102
+ "app.cupped": {
1103
+ "androidElevation": 1
1104
+ }
1105
+ }
1106
+ },
1107
+ "md": {
1108
+ "$value": [
1109
+ {
1110
+ "color": "rgba(15,23,42,0.06)",
1111
+ "offsetX": "0px",
1112
+ "offsetY": "4px",
1113
+ "blur": "12px",
1114
+ "spread": "0px"
1115
+ },
1116
+ {
1117
+ "color": "rgba(15,23,42,0.04)",
1118
+ "offsetX": "0px",
1119
+ "offsetY": "1px",
1120
+ "blur": "3px",
1121
+ "spread": "0px"
1122
+ }
1123
+ ],
1124
+ "$description": "Sheets, menus.",
1125
+ "$extensions": {
1126
+ "app.cupped": {
1127
+ "androidElevation": 4
1128
+ }
1129
+ }
1130
+ },
1131
+ "lg": {
1132
+ "$value": [
1133
+ {
1134
+ "color": "rgba(15,23,42,0.08)",
1135
+ "offsetX": "0px",
1136
+ "offsetY": "12px",
1137
+ "blur": "32px",
1138
+ "spread": "0px"
1139
+ },
1140
+ {
1141
+ "color": "rgba(15,23,42,0.04)",
1142
+ "offsetX": "0px",
1143
+ "offsetY": "4px",
1144
+ "blur": "8px",
1145
+ "spread": "0px"
1146
+ }
1147
+ ],
1148
+ "$description": "Modals, popovers.",
1149
+ "$extensions": {
1150
+ "app.cupped": {
1151
+ "androidElevation": 8
1152
+ }
1153
+ }
1154
+ },
1155
+ "primary": {
1156
+ "$value": [
1157
+ {
1158
+ "color": "rgba(224,122,95,0.28)",
1159
+ "offsetX": "0px",
1160
+ "offsetY": "12px",
1161
+ "blur": "28px",
1162
+ "spread": "0px"
1163
+ },
1164
+ {
1165
+ "color": "rgba(224,122,95,0.18)",
1166
+ "offsetX": "0px",
1167
+ "offsetY": "4px",
1168
+ "blur": "10px",
1169
+ "spread": "0px"
1170
+ }
1171
+ ],
1172
+ "$description": "Coral-tinted glow reserved for the FAB and hero actions — ties physicality to action.",
1173
+ "$extensions": {
1174
+ "app.cupped": {
1175
+ "androidElevation": 8,
1176
+ "androidShadowColor": "#E07A5F"
1177
+ }
1178
+ }
1179
+ }
1180
+ },
1181
+ "material": {
1182
+ "$description": "Translucency is used sparingly and only on chrome that floats over content (tab bar, sticky headers). Content surfaces are always opaque; one chrome layer per screen. prefers-reduced-transparency collapses chrome to opaque card.",
1183
+ "chrome": {
1184
+ "bg": {
1185
+ "$type": "color",
1186
+ "$value": "rgba(255, 255, 255, 0.95)",
1187
+ "$description": "Chrome material — 95% card. The CSS target composes it live via color-mix; other targets get the pre-mixed value.",
1188
+ "$extensions": {
1189
+ "app.cupped": {
1190
+ "cssValue": "color-mix(in srgb, var(--card) 95%, transparent)",
1191
+ "reducedTransparency": "var(--card)",
1192
+ "recipe": {
1193
+ "base": "{color.surface.card}",
1194
+ "opacity": 0.95
1195
+ }
1196
+ }
1197
+ }
1198
+ },
1199
+ "blur": {
1200
+ "$value": "saturate(1.4) blur(20px)",
1201
+ "$description": "backdrop-filter for the chrome material. Native consumers use the numeric ingredients with expo-blur; the opaque card fallback is the default and iOS should prefer native materials.",
1202
+ "$extensions": {
1203
+ "app.cupped": {
1204
+ "reducedTransparency": "none",
1205
+ "recipe": {
1206
+ "blurPx": 20,
1207
+ "saturate": 1.4
1208
+ }
1209
+ }
1210
+ }
1211
+ }
1212
+ },
1213
+ "scrim": {
1214
+ "$type": "color",
1215
+ "$value": "rgba(15, 23, 42, 0.45)",
1216
+ "$description": "Overlay scrim for sheets — 45% ink.",
1217
+ "$extensions": {
1218
+ "app.cupped": {
1219
+ "cssName": "scrim",
1220
+ "recipe": {
1221
+ "base": "{color.ink.default}",
1222
+ "opacity": 0.45
1223
+ }
1224
+ }
1225
+ }
1226
+ }
1227
+ },
1228
+ "spring": {
1229
+ "$description": "Springy but settled — one shared spring for tab selection, sheet presents, press feedback. Apple-style response/damping; the native pipeline derives Reanimated physics params.",
1230
+ "response": {
1231
+ "$type": "duration",
1232
+ "$value": "{duration.spring}",
1233
+ "$extensions": {
1234
+ "app.cupped": {
1235
+ "reducedMotion": "var(--motion-reduced)"
1236
+ }
1237
+ }
1238
+ },
1239
+ "damping": {
1240
+ "$type": "number",
1241
+ "$value": 0.75
1242
+ }
1243
+ },
1244
+ "tap": {
1245
+ "$description": "Press feedback — a brief pulse.",
1246
+ "scale": {
1247
+ "$type": "number",
1248
+ "$value": 0.95
1249
+ },
1250
+ "opacity": {
1251
+ "$type": "number",
1252
+ "$value": 0.8
1253
+ }
1254
+ },
1255
+ "stagger": {
1256
+ "delay": {
1257
+ "$type": "duration",
1258
+ "$value": "{duration.stagger}",
1259
+ "$description": "Stagger siblings by this much.",
1260
+ "$extensions": {
1261
+ "app.cupped": {
1262
+ "reducedMotion": "0s"
1263
+ }
1264
+ }
1265
+ }
1266
+ },
1267
+ "shimmer": {
1268
+ "duration": {
1269
+ "$type": "duration",
1270
+ "$value": "{duration.shimmer}",
1271
+ "$description": "Skeleton shimmer cycle."
1272
+ }
1273
+ },
1274
+ "motion": {
1275
+ "reduced": {
1276
+ "$type": "duration",
1277
+ "$value": "{duration.reduced}",
1278
+ "$description": "Reduced motion collapses springs/staggers to crossfades of this length — keep the state change, drop the travel."
1279
+ }
1280
+ },
1281
+ "focus": {
1282
+ "ring": {
1283
+ "$type": "shadow",
1284
+ "$value": [
1285
+ {
1286
+ "color": "{color.surface.card}",
1287
+ "offsetX": "0px",
1288
+ "offsetY": "0px",
1289
+ "blur": "0px",
1290
+ "spread": "2px"
1291
+ },
1292
+ {
1293
+ "color": "{color.primary.strong}",
1294
+ "offsetX": "0px",
1295
+ "offsetY": "0px",
1296
+ "blur": "0px",
1297
+ "spread": "4px"
1298
+ }
1299
+ ],
1300
+ "$description": "Opaque dual focus ring (refreshed export) — ≥3:1 non-text contrast on any surface. Outline is never removed without a replacement.",
1301
+ "$extensions": {
1302
+ "app.cupped": {
1303
+ "innerWidthPx": 2,
1304
+ "outerWidthPx": 2
1305
+ }
1306
+ }
1307
+ }
1308
+ },
1309
+ "hit-target": {
1310
+ "min": {
1311
+ "$type": "dimension",
1312
+ "$value": "{dimension.scale.44}",
1313
+ "$description": "Minimum touch target, pt — always."
1314
+ }
1315
+ },
1316
+ "radius": {
1317
+ "$type": "dimension",
1318
+ "$description": "Radii render as continuous (squircle) curves on iOS.",
1319
+ "sm": {
1320
+ "$value": "{dimension.scale.8}",
1321
+ "$description": "Small chips."
1322
+ },
1323
+ "md": {
1324
+ "$value": "{dimension.scale.12}",
1325
+ "$description": "Buttons, inputs."
1326
+ },
1327
+ "lg": {
1328
+ "$value": "{dimension.scale.16}",
1329
+ "$description": "Cards."
1330
+ },
1331
+ "xl": {
1332
+ "$value": "{dimension.scale.24}",
1333
+ "$description": "Sheets, hero containers."
1334
+ },
1335
+ "full": {
1336
+ "$value": "{dimension.scale.full}",
1337
+ "$description": "Pills, avatars, FAB."
1338
+ }
1339
+ },
1340
+ "space": {
1341
+ "$type": "dimension",
1342
+ "$description": "Strict 4pt grid with seven named stops — the only spacing values. Section-level layout composes multiples of xxl.",
1343
+ "xs": {
1344
+ "$value": "{dimension.scale.4}",
1345
+ "$description": "Icon gaps, tag gaps."
1346
+ },
1347
+ "sm": {
1348
+ "$value": "{dimension.scale.8}",
1349
+ "$description": "Within-cluster gaps."
1350
+ },
1351
+ "md": {
1352
+ "$value": "{dimension.scale.12}",
1353
+ "$description": "Row padding, label gaps."
1354
+ },
1355
+ "base": {
1356
+ "$value": "{dimension.scale.16}",
1357
+ "$description": "Default gaps, card padding."
1358
+ },
1359
+ "lg": {
1360
+ "$value": "{dimension.scale.20}",
1361
+ "$description": "Content insets."
1362
+ },
1363
+ "xl": {
1364
+ "$value": "{dimension.scale.24}",
1365
+ "$description": "Between component groups."
1366
+ },
1367
+ "xxl": {
1368
+ "$value": "{dimension.scale.32}",
1369
+ "$description": "Between sections."
1370
+ }
1371
+ },
1372
+ "ff": {
1373
+ "$type": "fontFamily",
1374
+ "sans": {
1375
+ "$value": "{font.family.sans}",
1376
+ "$description": "Inter — all UI.",
1377
+ "$extensions": {
1378
+ "app.cupped": {
1379
+ "cssValue": "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
1380
+ }
1381
+ }
1382
+ },
1383
+ "serif": {
1384
+ "$value": "{font.family.serif}",
1385
+ "$description": "Instrument Serif — display, one moment per screen.",
1386
+ "$extensions": {
1387
+ "app.cupped": {
1388
+ "cssValue": "'Instrument Serif', Georgia, serif"
1389
+ }
1390
+ }
1391
+ },
1392
+ "mono": {
1393
+ "$value": "{font.family.mono}",
1394
+ "$description": "JetBrains Mono — technical detail (ratios, temps, grind).",
1395
+ "$extensions": {
1396
+ "app.cupped": {
1397
+ "cssValue": "'JetBrains Mono', ui-monospace, SFMono-Regular, monospace"
1398
+ }
1399
+ }
1400
+ }
1401
+ },
1402
+ "text": {
1403
+ "$type": "dimension",
1404
+ "$description": "Platform size scale. Weights and line-heights live on the matching type.* composite tokens.",
1405
+ "screen-title": {
1406
+ "$value": "{font.size.32}",
1407
+ "$description": "Inter 700 · 1.1 · screen titles"
1408
+ },
1409
+ "sheet-title": {
1410
+ "$value": "{font.size.24}",
1411
+ "$description": "Inter 600 · 1.2 · sheet/modal titles"
1412
+ },
1413
+ "card-title": {
1414
+ "$value": "{font.size.20}",
1415
+ "$description": "Inter 600 · 1.25 · card titles (feed coffee name)"
1416
+ },
1417
+ "body": {
1418
+ "$value": "{font.size.16}",
1419
+ "$description": "Inter 400 · 1.5 · body"
1420
+ },
1421
+ "body-sm": {
1422
+ "$value": "{font.size.14}",
1423
+ "$description": "Inter 400 · 1.45 · secondary rows, metadata"
1424
+ },
1425
+ "caption": {
1426
+ "$value": "{font.size.12}",
1427
+ "$description": "Inter 500 · 1.4 · labels, timestamps"
1428
+ }
1429
+ },
1430
+ "type": {
1431
+ "$type": "typography",
1432
+ "$description": "Composite text styles — the per-size weights and line-heights promoted from spec prose to first-class tokens. Emitted to native/JSON targets; the CSS target keeps the original flat --text-* size variables.",
1433
+ "screen-title": {
1434
+ "$value": {
1435
+ "fontFamily": "{font.family.sans}",
1436
+ "fontSize": "{text.screen-title}",
1437
+ "fontWeight": "{font.weight.bold}",
1438
+ "lineHeight": 1.1
1439
+ }
1440
+ },
1441
+ "sheet-title": {
1442
+ "$value": {
1443
+ "fontFamily": "{font.family.sans}",
1444
+ "fontSize": "{text.sheet-title}",
1445
+ "fontWeight": "{font.weight.semibold}",
1446
+ "lineHeight": 1.2
1447
+ }
1448
+ },
1449
+ "card-title": {
1450
+ "$value": {
1451
+ "fontFamily": "{font.family.sans}",
1452
+ "fontSize": "{text.card-title}",
1453
+ "fontWeight": "{font.weight.semibold}",
1454
+ "lineHeight": 1.25
1455
+ }
1456
+ },
1457
+ "body": {
1458
+ "$value": {
1459
+ "fontFamily": "{font.family.sans}",
1460
+ "fontSize": "{text.body}",
1461
+ "fontWeight": "{font.weight.regular}",
1462
+ "lineHeight": 1.5
1463
+ }
1464
+ },
1465
+ "body-sm": {
1466
+ "$value": {
1467
+ "fontFamily": "{font.family.sans}",
1468
+ "fontSize": "{text.body-sm}",
1469
+ "fontWeight": "{font.weight.regular}",
1470
+ "lineHeight": 1.45
1471
+ }
1472
+ },
1473
+ "caption": {
1474
+ "$value": {
1475
+ "fontFamily": "{font.family.sans}",
1476
+ "fontSize": "{text.caption}",
1477
+ "fontWeight": "{font.weight.medium}",
1478
+ "lineHeight": 1.4
1479
+ }
1480
+ },
1481
+ "display": {
1482
+ "$value": {
1483
+ "fontFamily": "{font.family.serif}",
1484
+ "fontSize": "{font.size.56}",
1485
+ "fontWeight": "{font.weight.regular}",
1486
+ "lineHeight": 1,
1487
+ "letterSpacing": "-0.015em"
1488
+ },
1489
+ "$description": "Instrument Serif display — hero moments only, max one per screen, tracking −1.5%. Promoted from spec prose."
1490
+ },
1491
+ "mono": {
1492
+ "$value": {
1493
+ "fontFamily": "{font.family.mono}",
1494
+ "fontSize": "{font.size.12}",
1495
+ "fontWeight": "{font.weight.medium}",
1496
+ "lineHeight": 1.4
1497
+ },
1498
+ "$description": "Technical register — ratios, temps, grind, extraction (11–13px range; 12 is the default). Promoted from spec prose."
1499
+ }
1500
+ }
1501
+ }