@teamblind-chorus/ui 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (141) hide show
  1. package/README.md +3 -3
  2. package/agents/AGENTS.md +6 -6
  3. package/agents/DESIGN.md +245 -244
  4. package/agents/LOVABLE.md +40 -11
  5. package/agents/catalog.md +4 -4
  6. package/agents/components/avatar-rail/avatar-rail.md +2 -4
  7. package/agents/components/avatar-rail/avatar-rail.spec.json +10 -14
  8. package/agents/components/badge/role.md +7 -9
  9. package/agents/components/badge/role.spec.json +6 -6
  10. package/agents/components/badge/update.md +6 -8
  11. package/agents/components/badge/update.spec.json +5 -5
  12. package/agents/components/banner/banner.md +16 -18
  13. package/agents/components/banner/banner.spec.json +14 -14
  14. package/agents/components/bottom-sheet/bottom-sheet.md +4 -6
  15. package/agents/components/bottom-sheet/bottom-sheet.spec.json +5 -5
  16. package/agents/components/bubble/bubble.md +8 -10
  17. package/agents/components/bubble/bubble.spec.json +11 -11
  18. package/agents/components/button/button.md +1 -1
  19. package/agents/components/button/check.md +9 -11
  20. package/agents/components/button/check.spec.json +8 -10
  21. package/agents/components/button/fab.md +7 -9
  22. package/agents/components/button/fab.spec.json +10 -12
  23. package/agents/components/button/group.spec.json +4 -4
  24. package/agents/components/button/icon.md +21 -23
  25. package/agents/components/button/icon.spec.json +12 -14
  26. package/agents/components/button/standard.md +40 -42
  27. package/agents/components/button/standard.spec.json +20 -22
  28. package/agents/components/button/text.md +21 -23
  29. package/agents/components/button/text.spec.json +13 -15
  30. package/agents/components/button/toggle.md +7 -9
  31. package/agents/components/button/toggle.spec.json +10 -12
  32. package/agents/components/button/toolbar.md +24 -26
  33. package/agents/components/button/toolbar.spec.json +10 -12
  34. package/agents/components/carousel/carousel.md +1 -1
  35. package/agents/components/carousel/post.md +15 -21
  36. package/agents/components/carousel/post.spec.json +17 -17
  37. package/agents/components/carousel/profile.md +9 -45
  38. package/agents/components/carousel/profile.spec.json +17 -17
  39. package/agents/components/chip/chip.md +1 -1
  40. package/agents/components/chip/filter.md +22 -24
  41. package/agents/components/chip/filter.spec.json +17 -13
  42. package/agents/components/chip/tag.md +22 -24
  43. package/agents/components/chip/tag.spec.json +19 -15
  44. package/agents/components/dialog/dialog.md +1 -3
  45. package/agents/components/dialog/dialog.spec.json +3 -3
  46. package/agents/components/directory-list/directory-list.md +1 -3
  47. package/agents/components/directory-list/directory-list.spec.json +2 -2
  48. package/agents/components/divider/divider.family.json +1 -1
  49. package/agents/components/divider/divider.md +12 -14
  50. package/agents/components/divider/divider.spec.json +8 -8
  51. package/agents/components/empty-state/empty-state.md +9 -9
  52. package/agents/components/empty-state/empty-state.spec.json +14 -14
  53. package/agents/components/feed/ad.md +2 -4
  54. package/agents/components/feed/ad.spec.json +10 -10
  55. package/agents/components/feed/post.md +41 -43
  56. package/agents/components/feed/post.spec.json +35 -39
  57. package/agents/components/form-field/form-field.md +1 -1
  58. package/agents/components/form-field/input.md +32 -34
  59. package/agents/components/form-field/input.spec.json +34 -33
  60. package/agents/components/form-field/search.md +2 -4
  61. package/agents/components/form-field/search.spec.json +19 -18
  62. package/agents/components/form-field/select.md +18 -20
  63. package/agents/components/form-field/select.spec.json +30 -29
  64. package/agents/components/form-field/textarea.md +3 -5
  65. package/agents/components/form-field/textarea.spec.json +32 -31
  66. package/agents/components/header/main.md +4 -6
  67. package/agents/components/header/main.spec.json +3 -3
  68. package/agents/components/header/sub.md +6 -8
  69. package/agents/components/header/sub.spec.json +3 -3
  70. package/agents/components/list/accordion.md +34 -45
  71. package/agents/components/list/accordion.spec.json +20 -20
  72. package/agents/components/list/entry.md +59 -81
  73. package/agents/components/list/entry.spec.json +20 -23
  74. package/agents/components/list/list.md +2 -2
  75. package/agents/components/list/radio.md +13 -20
  76. package/agents/components/list/radio.spec.json +16 -20
  77. package/agents/components/list/standard.md +50 -72
  78. package/agents/components/list/standard.spec.json +18 -21
  79. package/agents/components/metadata/compact.md +4 -6
  80. package/agents/components/metadata/compact.spec.json +6 -6
  81. package/agents/components/metadata/metadata.md +1 -1
  82. package/agents/components/metadata/standard.md +12 -14
  83. package/agents/components/metadata/standard.spec.json +10 -10
  84. package/agents/components/nav-card/nav-card.md +25 -27
  85. package/agents/components/nav-card/nav-card.spec.json +19 -19
  86. package/agents/components/nav-list/nav-list.md +2 -8
  87. package/agents/components/nav-list/nav-list.spec.json +3 -3
  88. package/agents/components/navigation-bar/main.md +9 -11
  89. package/agents/components/navigation-bar/main.spec.json +6 -6
  90. package/agents/components/navigation-bar/search.md +6 -8
  91. package/agents/components/navigation-bar/search.spec.json +9 -9
  92. package/agents/components/navigation-bar/sub.md +9 -11
  93. package/agents/components/navigation-bar/sub.spec.json +7 -7
  94. package/agents/components/pagination/pagination.family.json +1 -1
  95. package/agents/components/pagination/pagination.md +3 -3
  96. package/agents/components/pagination/pagination.spec.json +5 -5
  97. package/agents/components/profile-header/profile-header.md +9 -11
  98. package/agents/components/profile-header/profile-header.spec.json +9 -9
  99. package/agents/components/progress/progress.family.json +1 -1
  100. package/agents/components/progress/progress.md +5 -5
  101. package/agents/components/progress/progress.spec.json +8 -8
  102. package/agents/components/side-sheet/side-sheet.md +11 -13
  103. package/agents/components/side-sheet/side-sheet.spec.json +3 -3
  104. package/agents/components/skeleton/skeleton.md +7 -9
  105. package/agents/components/skeleton/skeleton.spec.json +5 -5
  106. package/agents/components/spinner/spinner.family.json +1 -1
  107. package/agents/components/spinner/spinner.md +8 -10
  108. package/agents/components/spinner/spinner.spec.json +9 -9
  109. package/agents/components/status-tag/status-tag.md +7 -9
  110. package/agents/components/status-tag/status-tag.spec.json +5 -5
  111. package/agents/components/suggestion-list/suggestion-list.md +3 -7
  112. package/agents/components/suggestion-list/suggestion-list.spec.json +8 -12
  113. package/agents/components/switch/switch.md +12 -14
  114. package/agents/components/switch/switch.spec.json +17 -18
  115. package/agents/components/tab-bar/tab-bar.md +9 -11
  116. package/agents/components/tab-bar/tab-bar.spec.json +25 -27
  117. package/agents/components/tabs/rounded.md +6 -8
  118. package/agents/components/tabs/rounded.spec.json +17 -15
  119. package/agents/components/tabs/segmented.md +4 -6
  120. package/agents/components/tabs/segmented.spec.json +4 -8
  121. package/agents/components/tabs/underline.md +9 -11
  122. package/agents/components/tabs/underline.spec.json +14 -16
  123. package/agents/components/thumbnail/thumbnail.md +5 -7
  124. package/agents/components/thumbnail/thumbnail.spec.json +8 -8
  125. package/agents/components/toast/toast.md +5 -7
  126. package/agents/components/toast/toast.spec.json +3 -3
  127. package/agents/components/tooltip/tooltip.md +6 -8
  128. package/agents/components/tooltip/tooltip.spec.json +4 -4
  129. package/agents/tokens.usage.json +71 -226
  130. package/dist/index.cjs +212 -223
  131. package/dist/index.cjs.map +1 -1
  132. package/dist/index.d.cts +16 -16
  133. package/dist/index.d.ts +16 -16
  134. package/dist/index.js +212 -223
  135. package/dist/index.js.map +1 -1
  136. package/dist/styles.css +386 -387
  137. package/eslint/rules.js +7 -7
  138. package/package.json +2 -3
  139. package/agents/anti-patterns.md +0 -533
  140. package/agents/compose.md +0 -240
  141. package/agents/images.md +0 -66
package/dist/styles.css CHANGED
@@ -160,10 +160,9 @@ textarea {
160
160
  `box-shadow` on the button itself. Because the pseudo-element is
161
161
  `position: absolute`, the ring is out of flow: it contributes nothing
162
162
  to layout, so neither the button, a button group's gap, nor any
163
- sibling shifts when focus arrives. The two-layer composition is
164
- DESIGN.md's canonical recipe, painted *outward* via stacked box-shadows
165
- (1px `focusInset` counter-ring at 0→1px, then the 2px `focus` stroke
166
- visible at 1→3px). Sits at `z-index: 2`, above the state-overlay
163
+ sibling shifts when focus arrives. The single-ring composition is
164
+ DESIGN.md's canonical recipe, painted *outward* as a 1px
165
+ `border.focused` box-shadow. Sits at `z-index: 2`, above the state-overlay
167
166
  `::before` (z-index 0) and the label / icon (z-index 1). */
168
167
  .chorus-button--standard::after {
169
168
  content: '';
@@ -178,9 +177,7 @@ textarea {
178
177
 
179
178
  .chorus-button--standard:focus-visible::after,
180
179
  .chorus-button--standard[data-force-state="focused"]::after {
181
- box-shadow:
182
- 0 0 0 var(--button-standard-focus-inset-width) var(--button-standard-focus-inset-color),
183
- 0 0 0 calc(var(--button-standard-focus-outer-width) + var(--button-standard-focus-inset-width)) var(--button-standard-focus-outer-color);
180
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--button-standard-focus-outer-color);
184
181
  }
185
182
 
186
183
  .chorus-button--standard:disabled::after { box-shadow: none; }
@@ -252,7 +249,7 @@ textarea {
252
249
  .chorus-button-group__label {
253
250
  text-align: center;
254
251
  margin-bottom: var(--sys-layout-stack-md);
255
- color: var(--sys-color-onSurfaceVariant);
252
+ color: var(--sys-color-text-subtle);
256
253
  font-size: var(--sys-typo-body-md-size);
257
254
  font-weight: var(--sys-typo-body-md-weight);
258
255
  line-height: var(--sys-typo-body-md-line);
@@ -260,7 +257,7 @@ textarea {
260
257
  }
261
258
 
262
259
  .chorus-button-group__label strong {
263
- color: var(--sys-color-onSurface);
260
+ color: var(--sys-color-text-default);
264
261
  }
265
262
 
266
263
  /* Docked footer bar — full-bleed surface pinned to the bottom of the app.
@@ -269,7 +266,7 @@ textarea {
269
266
  passing behind reads as a separate region. Renders in flow — PageShell
270
267
  owns the pin, so the bar must NOT set position: sticky/fixed itself. */
271
268
  .chorus-button-group--docked {
272
- background: var(--sys-color-surface);
269
+ background: var(--sys-color-surface-default);
273
270
  padding: var(--sys-layout-container-md);
274
271
  box-shadow: var(--sys-elevation-sheet);
275
272
  }
@@ -329,7 +326,7 @@ textarea {
329
326
  /* Focus ring — dedicated overlay layer (`::after`), so it never affects
330
327
  layout (the FAB's footprint is fixed; nothing reflows on focus) and
331
328
  never collides with the FAB's own `box-shadow` (the floating
332
- elevation, which stays untouched underneath). Canonical two-layer
329
+ elevation, which stays untouched underneath). Canonical single-ring
333
330
  composition, painted outward; `z-index: 2`, above the overlay
334
331
  `::before` (z-index 0) and the label / icon (z-index 1). */
335
332
  .chorus-button--fab::after {
@@ -345,9 +342,7 @@ textarea {
345
342
 
346
343
  .chorus-button--fab:focus-visible::after,
347
344
  .chorus-button--fab[data-force-state="focused"]::after {
348
- box-shadow:
349
- 0 0 0 var(--button-fab-focus-inset-width) var(--button-fab-focus-inset-color),
350
- 0 0 0 calc(var(--button-fab-focus-outer-width) + var(--button-fab-focus-inset-width)) var(--button-fab-focus-outer-color);
345
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--button-fab-focus-outer-color);
351
346
  }
352
347
 
353
348
  .chorus-button--fab__icon,
@@ -393,11 +388,7 @@ textarea {
393
388
  --chip-overlay-hover: var(--sys-state-hover);
394
389
  --chip-overlay-pressed: var(--sys-state-pressed);
395
390
  --chip-overlay-focus: var(--sys-state-focus);
396
- --chip-disabled-opacity: var(--sys-state-disabled);
397
- --chip-focus-outer-width: var(--sys-borderWidth-thin);
398
- --chip-focus-outer-color: var(--sys-color-focus);
399
- --chip-focus-inset-width: var(--sys-borderWidth-hairline);
400
- --chip-focus-inset-color: var(--sys-color-focusInset);
391
+ --chip-focus-outer-color: var(--sys-color-border-focused);
401
392
  font-size: var(--sys-typo-label-sm-size);
402
393
  font-weight: var(--sys-typo-label-sm-weight);
403
394
  line-height: var(--sys-typo-label-sm-line);
@@ -431,8 +422,8 @@ textarea {
431
422
 
432
423
  .chorus-chip--filter {
433
424
  --chip-bg: transparent;
434
- --chip-label: var(--sys-color-onSurface);
435
- --chip-border-color: var(--sys-color-outlineVariant);
425
+ --chip-label: var(--sys-color-text-default);
426
+ --chip-border-color: var(--sys-color-border-default);
436
427
  /* 32 capsule — anatomy rung, resolved via ref.space. */
437
428
  --chip-min-height: var(--ref-space-400);
438
429
  --chip-padding-block: var(--sys-layout-container-2xs);
@@ -441,8 +432,8 @@ textarea {
441
432
  }
442
433
 
443
434
  .chorus-chip--filter.is-selected {
444
- --chip-bg: var(--sys-color-inverseSurface);
445
- --chip-label: var(--sys-color-inverseOnSurface);
435
+ --chip-bg: var(--sys-color-background-inverse);
436
+ --chip-label: var(--sys-color-text-inverse);
446
437
  --chip-border-color: transparent;
447
438
  }
448
439
 
@@ -455,8 +446,8 @@ textarea {
455
446
  so the recipe falls out of the same chip CSS without a per-state
456
447
  override. */
457
448
  .chorus-chip--filter.chorus-button--toolbar--accent {
458
- --chip-bg: var(--sys-color-primary);
459
- --chip-label: var(--sys-color-onPrimary);
449
+ --chip-bg: var(--sys-color-background-primary);
450
+ --chip-label: var(--sys-color-text-onFill);
460
451
  --chip-border-color: transparent;
461
452
  }
462
453
 
@@ -466,8 +457,8 @@ textarea {
466
457
  cluster so the button reads against `inverseSurface` containers
467
458
  without a per-host tweak. */
468
459
  .chorus-chip--filter.chorus-button--toolbar--inverse {
469
- --chip-bg: var(--sys-color-inverseSurface);
470
- --chip-label: var(--sys-color-inverseOnSurface);
460
+ --chip-bg: var(--sys-color-background-inverse);
461
+ --chip-label: var(--sys-color-text-inverse);
471
462
  --chip-border-color: transparent;
472
463
  }
473
464
 
@@ -477,8 +468,8 @@ textarea {
477
468
  (transparent while inactive), so the chip never changes width when it
478
469
  toggles. */
479
470
  .chorus-chip--toggle {
480
- --chip-bg: var(--sys-color-primary);
481
- --chip-label: var(--sys-color-onPrimary);
471
+ --chip-bg: var(--sys-color-background-primary);
472
+ --chip-label: var(--sys-color-text-onFill);
482
473
  --chip-border-color: transparent;
483
474
  /* 32 capsule — same geometry as Filter, anatomy rung. */
484
475
  --chip-min-height: var(--ref-space-400);
@@ -488,21 +479,18 @@ textarea {
488
479
  }
489
480
 
490
481
  .chorus-chip--toggle.is-selected {
491
- --chip-bg: var(--sys-color-surfaceContainerHigh);
492
- --chip-label: var(--sys-color-onSurface);
493
- --chip-border-color: var(--sys-color-outlineVariant);
482
+ --chip-bg: var(--sys-color-background-neutral);
483
+ --chip-label: var(--sys-color-text-default);
484
+ --chip-border-color: var(--sys-color-border-default);
494
485
  }
495
486
 
496
487
  .chorus-chip--tag {
497
- /* Translucent overlay (`sys.color.scrimSubtle` black 8% in light,
498
- white 8% in dark) rather than a tonal container role, so the tag
499
- adopts whatever surface sits behind it — body, raised card, sheet —
500
- by tinting one step darker (light mode) or lighter (dark mode)
501
- instead of pinning to a fixed neutral step that can collide with
502
- the surface ladder. Same Banner-style scrim used by Progress
503
- track, StatusTag neutral, and Skeleton. */
504
- --chip-bg: var(--sys-color-scrimSubtle);
505
- --chip-label: var(--sys-color-onSurface);
488
+ /* Solid `background.neutral` fill (the role that replaced the old ~8%
489
+ scrim) a fixed light-gray pill in light, a mid-gray in dark. Same
490
+ neutral fill as Banner default, Progress track, StatusTag neutral,
491
+ and Skeleton, so the quiet-neutral family reads as one. */
492
+ --chip-bg: var(--sys-color-background-neutral);
493
+ --chip-label: var(--sys-color-text-default);
506
494
  --chip-border-color: transparent;
507
495
  /* 24 capsule — Tag rung, anatomy via ref.space. */
508
496
  --chip-min-height: var(--ref-space-300);
@@ -516,8 +504,8 @@ textarea {
516
504
  block. Inline `--chip-bg` is also skipped by the JSX (the appearance
517
505
  has no `backgroundDark` field) so this class wins cleanly. */
518
506
  .chorus-chip--tag.chorus-chip--tag--accent {
519
- --chip-bg: var(--sys-color-primaryContainer);
520
- --chip-label: var(--sys-color-primary);
507
+ --chip-bg: var(--sys-color-background-selected);
508
+ --chip-label: var(--sys-color-text-accent-blue);
521
509
  }
522
510
 
523
511
  /* Icon-only Compact — when the chip carries no label slot, shrink the
@@ -559,7 +547,7 @@ span.chorus-chip {
559
547
 
560
548
  /* Focus ring — dedicated overlay layer (`::after`), `position: absolute`
561
549
  so it's out of flow: a focused chip never widens, and a chip group's
562
- 4px gap never shifts. Canonical two-layer composition, painted outward;
550
+ 4px gap never shifts. Canonical single-ring composition, painted outward;
563
551
  `z-index: 2`, above the overlay `::before` (z-index 0) and the label /
564
552
  icon (z-index 1). Inside a Tabs row the ring is re-anchored *inward*
565
553
  (the row is a scroller — see the Segmented override below). */
@@ -576,9 +564,7 @@ span.chorus-chip {
576
564
 
577
565
  .chorus-chip:focus-visible::after,
578
566
  .chorus-chip[data-force-state="focused"]::after {
579
- box-shadow:
580
- 0 0 0 var(--chip-focus-inset-width) var(--chip-focus-inset-color),
581
- 0 0 0 calc(var(--chip-focus-outer-width) + var(--chip-focus-inset-width)) var(--chip-focus-outer-color);
567
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--chip-focus-outer-color);
582
568
  }
583
569
 
584
570
  .chorus-chip:disabled::after { box-shadow: none; }
@@ -607,7 +593,12 @@ span.chorus-chip {
607
593
  }
608
594
 
609
595
  .chorus-chip:disabled {
610
- opacity: var(--chip-disabled-opacity);
596
+ /* Explicit disabled (no opacity): neutral disabled pill — overrides the
597
+ variant's --chip-bg / --chip-label / --chip-border-color on source
598
+ order (this rule sits after every appearance block above). */
599
+ --chip-bg: var(--sys-color-background-disabled);
600
+ --chip-label: var(--sys-color-text-disabled);
601
+ --chip-border-color: var(--sys-color-border-bold);
611
602
  cursor: not-allowed;
612
603
  }
613
604
 
@@ -649,7 +640,7 @@ span.chorus-chip {
649
640
  width: var(--badge-min-width);
650
641
  height: var(--badge-min-height);
651
642
  padding: 0;
652
- box-shadow: 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-surface);
643
+ box-shadow: 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-surface-default);
653
644
  }
654
645
 
655
646
  /* ============================================================
@@ -749,7 +740,11 @@ span.chorus-chip {
749
740
  }
750
741
 
751
742
  .chorus-tab:disabled {
752
- opacity: var(--tabs-disabled-opacity);
743
+ /* Explicit disabled (no opacity): label + icon re-tone to text.disabled
744
+ (icon rides currentColor); overrides the selected/unselected label
745
+ color on specificity. A disabled tab is never selected, so no
746
+ indicator paints. */
747
+ color: var(--sys-color-text-disabled);
753
748
  cursor: not-allowed;
754
749
  outline: none;
755
750
  box-shadow: none;
@@ -889,10 +884,9 @@ span.chorus-chip {
889
884
  • Clip-safe — the Tabs row is a horizontal scroller (`overflow-x:
890
885
  auto`, which coerces `overflow-y: auto`), so an *outward* ring is
891
886
  sliced off at the row's top / bottom edge. The ring is drawn
892
- *inside* the tab via stacked inset box-shadows, so nothing clips it.
893
- • Layer-safe — an `outline` painted over the tab box covers the inset
894
- counter-ring; here the two layers (2px `focus` stroke over a 1px
895
- `focusInset` counter-ring) are explicit and both visible.
887
+ *inside* the tab via an inset box-shadow, so nothing clips it.
888
+ • Layer-safe — the ring is a single 1px `border.focused` inset
889
+ box-shadow on the `::after`, explicit and always visible.
896
890
  Sits at `z-index: 2`, above the state-overlay `::before` (z-index 0)
897
891
  and the label / icon (z-index 1). The tab's own `::before` already
898
892
  owns the focus *overlay* tint; this `::after` owns the *ring*. */
@@ -909,9 +903,7 @@ span.chorus-chip {
909
903
 
910
904
  .chorus-tab--underline:focus-visible::after,
911
905
  .chorus-tab--underline[data-force-state="focused"]::after {
912
- box-shadow:
913
- inset 0 0 0 var(--tabs-focus-outer-width) var(--tabs-focus-outer-color),
914
- inset 0 0 0 calc(var(--tabs-focus-outer-width) + var(--tabs-focus-inset-width)) var(--tabs-focus-inset-color);
906
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--tabs-focus-outer-color);
915
907
  }
916
908
 
917
909
  /* ----- Segmented ----- */
@@ -951,9 +943,7 @@ span.chorus-chip {
951
943
  from outward to inset here.) */
952
944
  .chorus-tabs--segmented .chorus-chip:focus-visible::after,
953
945
  .chorus-tabs--segmented .chorus-chip[data-force-state="focused"]::after {
954
- box-shadow:
955
- inset 0 0 0 var(--chip-focus-outer-width) var(--chip-focus-outer-color),
956
- inset 0 0 0 calc(var(--chip-focus-outer-width) + var(--chip-focus-inset-width)) var(--chip-focus-inset-color);
946
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--chip-focus-outer-color);
957
947
  }
958
948
 
959
949
  /* ----- Rounded (chip-delegated) -----
@@ -998,7 +988,7 @@ span.chorus-chip {
998
988
  font-size: var(--sys-typo-label-sm-size);
999
989
  font-weight: var(--sys-typo-label-sm-weight);
1000
990
  line-height: var(--sys-typo-label-sm-line);
1001
- color: var(--sys-color-onSurface);
991
+ color: var(--sys-color-text-default);
1002
992
  text-decoration: none;
1003
993
  white-space: nowrap;
1004
994
  overflow: hidden;
@@ -1007,7 +997,7 @@ span.chorus-chip {
1007
997
  }
1008
998
  a.chorus-metadata__name:hover { text-decoration: underline; }
1009
999
  a.chorus-metadata__name:focus-visible {
1010
- outline: var(--sys-borderWidth-hairline) solid var(--sys-color-focus);
1000
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
1011
1001
  outline-offset: var(--sys-layout-inline-xs);
1012
1002
  border-radius: var(--sys-radius-xs);
1013
1003
  }
@@ -1017,7 +1007,7 @@ a.chorus-metadata__name:focus-visible {
1017
1007
  font-weight: var(--sys-typo-label-sm-weight);
1018
1008
  line-height: var(--sys-typo-label-sm-line);
1019
1009
  /* One tonal step further than name — timestamp recedes. */
1020
- color: var(--sys-color-outline);
1010
+ color: var(--sys-color-border-boldest);
1021
1011
  }
1022
1012
 
1023
1013
  /* Middot separator. The bullet glyph (U+00B7) is naturally tall — its
@@ -1029,7 +1019,7 @@ a.chorus-metadata__name:focus-visible {
1029
1019
  the line-box to that font-size so the dot's vertical extent never
1030
1020
  exceeds the text height. */
1031
1021
  .chorus-metadata__dot {
1032
- color: var(--sys-color-outline);
1022
+ color: var(--sys-color-border-boldest);
1033
1023
  font-size: var(--sys-typo-label-sm-size);
1034
1024
  line-height: 1;
1035
1025
  }
@@ -1044,15 +1034,15 @@ a.chorus-metadata__name:focus-visible {
1044
1034
  font-size: var(--sys-typo-label-sm-size);
1045
1035
  font-weight: var(--sys-typo-label-sm-weight);
1046
1036
  line-height: var(--sys-typo-label-sm-line);
1047
- color: var(--sys-color-primary);
1037
+ color: var(--sys-color-text-link);
1048
1038
  }
1049
1039
 
1050
1040
  .chorus-metadata__follow[aria-pressed="true"] {
1051
- color: var(--sys-color-onSurfaceVariant);
1041
+ color: var(--sys-color-text-subtle);
1052
1042
  }
1053
1043
 
1054
1044
  .chorus-metadata__follow:focus-visible {
1055
- outline: var(--sys-borderWidth-hairline) solid var(--sys-color-focus);
1045
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
1056
1046
  outline-offset: var(--sys-layout-inline-xs);
1057
1047
  border-radius: var(--sys-radius-xs);
1058
1048
  }
@@ -1061,7 +1051,7 @@ a.chorus-metadata__name:focus-visible {
1061
1051
  font-size: var(--sys-typo-label-sm-size);
1062
1052
  font-weight: var(--sys-typo-label-sm-weight);
1063
1053
  line-height: var(--sys-typo-label-sm-line);
1064
- color: var(--sys-color-onSurfaceVariant);
1054
+ color: var(--sys-color-text-subtle);
1065
1055
  white-space: nowrap;
1066
1056
  overflow: hidden;
1067
1057
  text-overflow: ellipsis;
@@ -1074,7 +1064,7 @@ a.chorus-metadata__name:focus-visible {
1074
1064
  font-size: var(--sys-typo-label-sm-size);
1075
1065
  font-weight: var(--sys-typo-label-sm-weight);
1076
1066
  line-height: var(--sys-typo-label-sm-line);
1077
- color: var(--sys-color-onSurfaceVariant);
1067
+ color: var(--sys-color-text-subtle);
1078
1068
  min-width: 0;
1079
1069
  }
1080
1070
 
@@ -1088,7 +1078,7 @@ a.chorus-metadata__name:focus-visible {
1088
1078
  }
1089
1079
  .chorus-metadata__meta-link:hover { text-decoration: underline; }
1090
1080
  .chorus-metadata__meta-link:focus-visible {
1091
- outline: var(--sys-borderWidth-hairline) solid var(--sys-color-focus);
1081
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
1092
1082
  outline-offset: var(--sys-layout-inline-xs);
1093
1083
  border-radius: var(--sys-radius-xs);
1094
1084
  }
@@ -1148,8 +1138,8 @@ a.chorus-metadata__name:focus-visible {
1148
1138
  flex-direction: column;
1149
1139
  gap: var(--sys-layout-stack-md);
1150
1140
  padding: var(--sys-layout-container-lg) var(--sys-layout-container-md);
1151
- background: var(--sys-color-surface);
1152
- color: var(--sys-color-onSurface);
1141
+ background: var(--sys-color-surface-default);
1142
+ color: var(--sys-color-text-default);
1153
1143
  width: 100%;
1154
1144
  /* Max-width is a layout-contract literal (matches the Feed family's
1155
1145
  "single column, mobile-first card" rule). Anatomy contract, not a
@@ -1157,9 +1147,9 @@ a.chorus-metadata__name:focus-visible {
1157
1147
  max-width: 480px;
1158
1148
  box-sizing: border-box;
1159
1149
  /* Hairline bottom divider — every Post / Ad card ends with a 1px
1160
- outlineVariant seam so consecutive cards in a stream read as one
1150
+ border.default seam so consecutive cards in a stream read as one
1161
1151
  rhythm. border-bottom is layout-safe under box-sizing: border-box. */
1162
- border-bottom: var(--sys-borderWidth-hairline) solid var(--sys-color-outlineVariant);
1152
+ border-bottom: var(--sys-borderWidth-hairline) solid var(--sys-color-border-default);
1163
1153
  }
1164
1154
 
1165
1155
  /* Clickable Post — whole-card navigation target (opt-in via `onClick`).
@@ -1172,7 +1162,7 @@ a.chorus-metadata__name:focus-visible {
1172
1162
  }
1173
1163
 
1174
1164
  .chorus-feed--clickable:focus-visible {
1175
- outline: var(--sys-borderWidth-hairline) solid var(--sys-color-focus);
1165
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
1176
1166
  outline-offset: calc(-1 * var(--sys-layout-inline-xs));
1177
1167
  }
1178
1168
 
@@ -1196,7 +1186,7 @@ a.chorus-metadata__name:focus-visible {
1196
1186
  font-weight: var(--sys-typo-label-sm-weight);
1197
1187
  line-height: var(--sys-typo-label-sm-line);
1198
1188
  letter-spacing: var(--sys-typo-label-sm-tracking);
1199
- color: var(--sys-color-brand);
1189
+ color: var(--sys-color-text-brand);
1200
1190
  text-transform: uppercase;
1201
1191
  }
1202
1192
 
@@ -1227,7 +1217,7 @@ a.chorus-metadata__name:focus-visible {
1227
1217
  font-weight: var(--sys-typo-heading-sm-weight);
1228
1218
  line-height: var(--sys-typo-heading-sm-line);
1229
1219
  letter-spacing: var(--sys-typo-heading-sm-tracking);
1230
- color: var(--sys-color-onSurface);
1220
+ color: var(--sys-color-text-default);
1231
1221
  white-space: nowrap;
1232
1222
  overflow: hidden;
1233
1223
  text-overflow: ellipsis;
@@ -1238,7 +1228,7 @@ a.chorus-metadata__name:focus-visible {
1238
1228
  font-size: var(--sys-typo-body-sm-size);
1239
1229
  font-weight: var(--sys-typo-body-sm-weight);
1240
1230
  line-height: var(--sys-typo-body-sm-line);
1241
- color: var(--sys-color-onSurfaceVariant);
1231
+ color: var(--sys-color-text-subtle);
1242
1232
  display: -webkit-box;
1243
1233
  -webkit-line-clamp: 2;
1244
1234
  -webkit-box-orient: vertical;
@@ -1254,7 +1244,7 @@ a.chorus-metadata__name:focus-visible {
1254
1244
  width: var(--ref-space-1000);
1255
1245
  height: var(--ref-space-1000);
1256
1246
  border-radius: var(--sys-radius-md);
1257
- background: var(--sys-color-surfaceContainerHigh);
1247
+ background: var(--sys-color-surface-sunken);
1258
1248
  position: relative;
1259
1249
  overflow: hidden;
1260
1250
  }
@@ -1262,7 +1252,6 @@ a.chorus-metadata__name:focus-visible {
1262
1252
  .chorus-feed__thumbnail img,
1263
1253
  .chorus-feed__thumbnail-fallback {
1264
1254
  width: 100%; height: 100%; display: block;
1265
- background: linear-gradient(135deg, var(--sys-color-placeholderImage-start) 0%, var(--sys-color-placeholderImage-end) 100%);
1266
1255
  object-fit: cover;
1267
1256
  }
1268
1257
 
@@ -1300,7 +1289,7 @@ a.chorus-metadata__name:focus-visible {
1300
1289
  /* Touch-target floor — same 48 rung used by List rows, kept as an
1301
1290
  intrinsic anatomy dimension (not a layout token). */
1302
1291
  min-height: var(--ref-space-600);
1303
- background: var(--sys-color-surfaceVariant);
1292
+ background: var(--sys-color-surface-sunken);
1304
1293
  border-radius: var(--sys-radius-md);
1305
1294
  font-size: var(--sys-typo-body-sm-size);
1306
1295
  line-height: var(--sys-typo-body-sm-line);
@@ -1311,25 +1300,25 @@ a.chorus-metadata__name:focus-visible {
1311
1300
  align-items: center;
1312
1301
  gap: var(--sys-layout-inline-sm);
1313
1302
  }
1314
- .chorus-feed__poll-glyph { color: var(--sys-color-brand); display: inline-flex; }
1315
- .chorus-feed__poll-label { color: var(--sys-color-brand); font-weight: var(--ref-fontWeight-bold); }
1303
+ .chorus-feed__poll-glyph { color: var(--sys-color-text-brand); display: inline-flex; }
1304
+ .chorus-feed__poll-label { color: var(--sys-color-text-brand); font-weight: var(--ref-fontWeight-bold); }
1316
1305
 
1317
1306
  /* Offer-evaluation tone — same chrome as the poll banner, but the
1318
- leading glyph and label paint in `sys.color.success` (resolves to
1307
+ leading glyph and label paint in `sys.color.text.success` (resolves to
1319
1308
  `ref.palette.green.500` in light, the same step in dark), so the
1320
1309
  editorial category reads as "compensation / decision support"
1321
1310
  rather than "community vote". The icon is `CompensationFillIcon`;
1322
1311
  the label is constrained to the literal "Offer" by the spec. */
1323
1312
  .chorus-feed__poll--offer .chorus-feed__poll-glyph,
1324
1313
  .chorus-feed__poll--offer .chorus-feed__poll-label {
1325
- color: var(--sys-color-success);
1314
+ color: var(--sys-color-text-success);
1326
1315
  }
1327
1316
  .chorus-feed__poll-divider {
1328
1317
  width: var(--sys-borderWidth-hairline);
1329
1318
  align-self: stretch;
1330
- background: var(--sys-color-outlineVariant);
1319
+ background: var(--sys-color-border-default);
1331
1320
  }
1332
- .chorus-feed__poll-participants { color: var(--sys-color-onSurface); }
1321
+ .chorus-feed__poll-participants { color: var(--sys-color-text-default); }
1333
1322
  .chorus-feed__poll-participants strong { font-weight: var(--ref-fontWeight-bold); }
1334
1323
 
1335
1324
  .chorus-feed__citation {
@@ -1342,7 +1331,7 @@ a.chorus-metadata__name:focus-visible {
1342
1331
  gap: 0;
1343
1332
  align-items: stretch;
1344
1333
  padding: 0;
1345
- background: var(--sys-color-surfaceContainer);
1334
+ background: var(--sys-color-surface-default);
1346
1335
  border-radius: var(--sys-radius-md);
1347
1336
  overflow: hidden;
1348
1337
  text-decoration: none;
@@ -1359,7 +1348,6 @@ a.chorus-metadata__name:focus-visible {
1359
1348
  flex: 0 0 120px;
1360
1349
  width: 120px;
1361
1350
  align-self: stretch;
1362
- background: linear-gradient(135deg, var(--sys-color-placeholderImage-start) 0%, var(--sys-color-placeholderImage-end) 100%);
1363
1351
  overflow: hidden;
1364
1352
  position: relative;
1365
1353
  }
@@ -1380,7 +1368,7 @@ a.chorus-metadata__name:focus-visible {
1380
1368
  padding: var(--sys-layout-container-sm);
1381
1369
  min-width: 0;
1382
1370
  flex: 1 1 auto;
1383
- background: var(--sys-color-surfaceVariant);
1371
+ background: var(--sys-color-surface-sunken);
1384
1372
  }
1385
1373
 
1386
1374
  /* All text inside the citation surface sits at the label.sm rung —
@@ -1394,7 +1382,7 @@ a.chorus-metadata__name:focus-visible {
1394
1382
  .chorus-feed__citation-title {
1395
1383
  font-weight: var(--sys-typo-label-sm-weight);
1396
1384
  line-height: var(--sys-typo-label-sm-line);
1397
- color: var(--sys-color-onSurface);
1385
+ color: var(--sys-color-text-default);
1398
1386
  display: -webkit-box;
1399
1387
  -webkit-line-clamp: 2;
1400
1388
  -webkit-box-orient: vertical;
@@ -1405,7 +1393,7 @@ a.chorus-metadata__name:focus-visible {
1405
1393
  display: inline-flex;
1406
1394
  align-items: center;
1407
1395
  gap: var(--sys-layout-inline-sm);
1408
- color: var(--sys-color-onSurfaceVariant);
1396
+ color: var(--sys-color-text-subtle);
1409
1397
  }
1410
1398
  /* Source mark is a 16×16 brand badge — `icon.sm` anatomy rung with
1411
1399
  `radius.sm` (4px) so it reads as a chip-adjacent badge, not a tag. */
@@ -1413,8 +1401,8 @@ a.chorus-metadata__name:focus-visible {
1413
1401
  width: var(--sys-icon-md); height: var(--sys-icon-md);
1414
1402
  flex: 0 0 var(--sys-icon-md);
1415
1403
  border-radius: var(--sys-radius-sm);
1416
- background: var(--sys-color-onSurface);
1417
- color: var(--sys-color-surface);
1404
+ background: var(--sys-color-icon-default);
1405
+ color: var(--sys-color-surface-default);
1418
1406
  display: inline-flex; align-items: center; justify-content: center;
1419
1407
  overflow: hidden;
1420
1408
  }
@@ -1424,7 +1412,7 @@ a.chorus-metadata__name:focus-visible {
1424
1412
  .chorus-feed__mention {
1425
1413
  font-style: italic;
1426
1414
  font-size: var(--sys-typo-body-sm-size);
1427
- color: var(--sys-color-primary);
1415
+ color: var(--sys-color-text-mention);
1428
1416
  text-decoration: none;
1429
1417
  }
1430
1418
 
@@ -1439,14 +1427,14 @@ a.chorus-metadata__name:focus-visible {
1439
1427
  display: flex;
1440
1428
  align-items: center;
1441
1429
  gap: var(--sys-layout-inline-lg);
1442
- color: var(--sys-color-onSurfaceVariant);
1430
+ color: var(--sys-color-text-subtle);
1443
1431
  }
1444
1432
 
1445
1433
  /* Active toggle — the brand-tone variant of the Like counter. We
1446
1434
  override `--button-text-label` directly rather than reaching for
1447
1435
  Text Button's `primary` appearance because Feed's active-like
1448
- colour is `sys.color.brand` (the same role the editorial `flag`
1449
- slot rides), not the interactive `sys.color.primary`. Selector
1436
+ colour is `sys.color.text.brand` (the same role the editorial `flag`
1437
+ slot rides), not the interactive `sys.color.background.primary`. Selector
1450
1438
  doubles the class (specificity 0,2,0) so it wins against the
1451
1439
  `.chorus-button--text--appearance-default` rule that declares
1452
1440
  `--button-text-label` later in the cascade. The Heart glyph re-
@@ -1454,7 +1442,7 @@ a.chorus-metadata__name:focus-visible {
1454
1442
  and the hover / pressed / focus overlays inherit from
1455
1443
  `--button-text-label` so the state feedback stays in lockstep. */
1456
1444
  .chorus-button--text.chorus-feed__like--active {
1457
- --button-text-label: var(--sys-color-brand);
1445
+ --button-text-label: var(--sys-color-text-brand);
1458
1446
  }
1459
1447
 
1460
1448
 
@@ -1478,7 +1466,7 @@ a.chorus-metadata__name:focus-visible {
1478
1466
  font-size: var(--sys-typo-label-sm-size);
1479
1467
  font-weight: var(--sys-typo-label-sm-weight);
1480
1468
  line-height: var(--sys-typo-label-sm-line);
1481
- color: var(--sys-color-onSurfaceVariant);
1469
+ color: var(--sys-color-text-subtle);
1482
1470
  }
1483
1471
  .chorus-feed__views-icon {
1484
1472
  display: inline-flex;
@@ -1496,8 +1484,8 @@ a.chorus-metadata__name:focus-visible {
1496
1484
  flex-direction: column;
1497
1485
  gap: var(--sys-layout-stack-md);
1498
1486
  padding: var(--sys-layout-container-lg) var(--sys-layout-container-md);
1499
- background: var(--sys-color-surface);
1500
- color: var(--sys-color-onSurface);
1487
+ background: var(--sys-color-surface-default);
1488
+ color: var(--sys-color-text-default);
1501
1489
  width: 100%;
1502
1490
  /* Same column cap as Feed — FeedAd rides in the same scrolling
1503
1491
  column, so the literal mirrors Feed's anatomy contract. */
@@ -1506,7 +1494,7 @@ a.chorus-metadata__name:focus-visible {
1506
1494
  box-sizing: border-box;
1507
1495
  /* Hairline bottom divider — mirrors the Feed Post seam so an Ad
1508
1496
  drops into a Post stream without breaking the inter-card rhythm. */
1509
- border-bottom: var(--sys-borderWidth-hairline) solid var(--sys-color-outlineVariant);
1497
+ border-bottom: var(--sys-borderWidth-hairline) solid var(--sys-color-border-default);
1510
1498
  }
1511
1499
 
1512
1500
  /* FeedAd brand row is now rendered via the shared Metadata component —
@@ -1528,7 +1516,7 @@ a.chorus-metadata__name:focus-visible {
1528
1516
  justify-content: center;
1529
1517
  width: var(--ref-space-300);
1530
1518
  height: var(--ref-space-300);
1531
- color: var(--sys-color-onSurfaceVariant);
1519
+ color: var(--sys-color-text-subtle);
1532
1520
  flex: 0 0 auto;
1533
1521
  }
1534
1522
  .chorus-feed-ad__dismiss svg {
@@ -1537,7 +1525,7 @@ a.chorus-metadata__name:focus-visible {
1537
1525
  display: block;
1538
1526
  }
1539
1527
  .chorus-feed-ad__dismiss:focus-visible {
1540
- outline: var(--sys-borderWidth-hairline) solid var(--sys-color-focus);
1528
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
1541
1529
  outline-offset: var(--sys-layout-inline-xs);
1542
1530
  border-radius: var(--sys-radius-xs);
1543
1531
  }
@@ -1555,7 +1543,7 @@ a.chorus-metadata__name:focus-visible {
1555
1543
  font-weight: var(--sys-typo-heading-sm-weight);
1556
1544
  line-height: var(--sys-typo-heading-sm-line);
1557
1545
  letter-spacing: var(--sys-typo-heading-sm-tracking);
1558
- color: var(--sys-color-onSurface);
1546
+ color: var(--sys-color-text-default);
1559
1547
  white-space: nowrap;
1560
1548
  overflow: hidden;
1561
1549
  text-overflow: ellipsis;
@@ -1566,7 +1554,7 @@ a.chorus-metadata__name:focus-visible {
1566
1554
  font-size: var(--sys-typo-body-sm-size);
1567
1555
  font-weight: var(--sys-typo-body-sm-weight);
1568
1556
  line-height: var(--sys-typo-body-sm-line);
1569
- color: var(--sys-color-onSurfaceVariant);
1557
+ color: var(--sys-color-text-subtle);
1570
1558
  display: -webkit-box;
1571
1559
  -webkit-line-clamp: 2;
1572
1560
  -webkit-box-orient: vertical;
@@ -1592,7 +1580,7 @@ a.chorus-metadata__name:focus-visible {
1592
1580
  .chorus-feed-ad__media {
1593
1581
  width: 100%;
1594
1582
  aspect-ratio: 16 / 10;
1595
- background-color: var(--sys-color-surfaceContainerHigh);
1583
+ background-color: var(--sys-color-surface-sunken);
1596
1584
  background-image: var(--chorus-placeholder-image);
1597
1585
  background-size: cover;
1598
1586
  background-position: center;
@@ -1624,7 +1612,7 @@ a.chorus-metadata__name:focus-visible {
1624
1612
  schema/components/carousel/carousel.md for the contract.
1625
1613
  ============================================================ */
1626
1614
  .chorus-carousel {
1627
- background: var(--sys-color-surface);
1615
+ background: var(--sys-color-surface-default);
1628
1616
  width: 100%;
1629
1617
  box-sizing: border-box;
1630
1618
  /* Full-bleed inline (matches DirectoryList): the host pays NO inline
@@ -1676,7 +1664,7 @@ a.chorus-metadata__name:focus-visible {
1676
1664
 
1677
1665
  .chorus-header .chorus-header__label {
1678
1666
  margin: 0;
1679
- color: var(--sys-color-onSurface);
1667
+ color: var(--sys-color-text-default);
1680
1668
  font-size: var(--sys-typo-heading-md-size);
1681
1669
  line-height: var(--sys-typo-heading-md-line);
1682
1670
  font-weight: var(--sys-typo-heading-md-weight);
@@ -1699,7 +1687,7 @@ a.chorus-metadata__name:focus-visible {
1699
1687
  later in this file. The IconButton is its own tap target; the
1700
1688
  surrounding `<header>` stays non-interactive. */
1701
1689
  .chorus-button--icon.chorus-header__icon {
1702
- --button-icon-glyph-color: var(--sys-color-onSurfaceVariant);
1690
+ --button-icon-glyph-color: var(--sys-color-text-subtle);
1703
1691
  }
1704
1692
 
1705
1693
  .chorus-header__icon--chevron svg {
@@ -1801,10 +1789,10 @@ a.chorus-metadata__name:focus-visible {
1801
1789
  gap: var(--sys-layout-stack-sm);
1802
1790
  padding: var(--sys-layout-container-md);
1803
1791
  border-radius: var(--sys-radius-md);
1804
- background: var(--sys-color-surface);
1792
+ background: var(--sys-color-surface-default);
1805
1793
  /* No-layout outline — an inset hairline ring rather than a border so
1806
1794
  the card's box geometry is stable across states. */
1807
- box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-outlineVariant);
1795
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-default);
1808
1796
  text-align: left;
1809
1797
  font: inherit;
1810
1798
  color: inherit;
@@ -1842,7 +1830,7 @@ a.chorus-metadata__name:focus-visible {
1842
1830
  font-size: var(--sys-typo-label-md-size);
1843
1831
  line-height: var(--sys-typo-label-md-line);
1844
1832
  font-weight: var(--sys-typo-label-md-weight);
1845
- color: var(--sys-color-onSurface);
1833
+ color: var(--sys-color-text-default);
1846
1834
  white-space: nowrap;
1847
1835
  overflow: hidden;
1848
1836
  text-overflow: ellipsis;
@@ -1853,7 +1841,7 @@ a.chorus-metadata__name:focus-visible {
1853
1841
  font-size: var(--sys-typo-body-sm-size);
1854
1842
  line-height: var(--sys-typo-body-sm-line);
1855
1843
  font-weight: var(--sys-typo-body-sm-weight);
1856
- color: var(--sys-color-onSurfaceVariant);
1844
+ color: var(--sys-color-text-subtle);
1857
1845
  display: -webkit-box;
1858
1846
  -webkit-line-clamp: 3;
1859
1847
  -webkit-box-orient: vertical;
@@ -1863,7 +1851,7 @@ a.chorus-metadata__name:focus-visible {
1863
1851
  .chorus-post-carousel__card-mention {
1864
1852
  font-size: var(--sys-typo-body-sm-size);
1865
1853
  line-height: var(--sys-typo-body-sm-line);
1866
- color: var(--sys-color-primary);
1854
+ color: var(--sys-color-text-mention);
1867
1855
  }
1868
1856
 
1869
1857
  .chorus-post-carousel__card-footer {
@@ -1877,7 +1865,7 @@ a.chorus-metadata__name:focus-visible {
1877
1865
  font-size: var(--sys-typo-label-sm-size);
1878
1866
  line-height: var(--sys-typo-label-sm-line);
1879
1867
  font-weight: var(--sys-typo-label-sm-weight);
1880
- color: var(--sys-color-onSurfaceVariant);
1868
+ color: var(--sys-color-text-subtle);
1881
1869
  }
1882
1870
 
1883
1871
  .chorus-post-carousel__card-views {
@@ -1886,7 +1874,7 @@ a.chorus-metadata__name:focus-visible {
1886
1874
  gap: var(--sys-layout-inline-sm);
1887
1875
  font-size: var(--sys-typo-label-sm-size);
1888
1876
  line-height: var(--sys-typo-label-sm-line);
1889
- color: var(--sys-color-onSurfaceVariant);
1877
+ color: var(--sys-color-text-subtle);
1890
1878
  }
1891
1879
 
1892
1880
  .chorus-post-carousel__card-views svg {
@@ -1949,7 +1937,7 @@ a.chorus-metadata__name:focus-visible {
1949
1937
  display: flex;
1950
1938
  flex-direction: column;
1951
1939
  align-items: center;
1952
- background: var(--sys-color-surface);
1940
+ background: var(--sys-color-surface-default);
1953
1941
  border-radius: var(--sys-radius-md);
1954
1942
  overflow: hidden;
1955
1943
  padding-bottom: var(--sys-layout-container-md);
@@ -1973,7 +1961,7 @@ a.chorus-metadata__name:focus-visible {
1973
1961
  border-radius: inherit;
1974
1962
  pointer-events: none;
1975
1963
  z-index: 2;
1976
- box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-outlineVariant);
1964
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-default);
1977
1965
  }
1978
1966
 
1979
1967
  .chorus-profile-carousel__card--clickable {
@@ -1988,7 +1976,7 @@ a.chorus-metadata__name:focus-visible {
1988
1976
  paints opaquely over the background. */
1989
1977
  width: 100%;
1990
1978
  height: 88px;
1991
- background-color: var(--sys-color-surfaceContainerHigh);
1979
+ background-color: var(--sys-color-surface-sunken);
1992
1980
  background-image: var(--chorus-placeholder-image);
1993
1981
  background-size: cover;
1994
1982
  background-position: center;
@@ -2012,7 +2000,7 @@ a.chorus-metadata__name:focus-visible {
2012
2000
  /* The Thumbnail's surface halo (a 2px ring) sits on the cover band's
2013
2001
  edge so the circular avatar reads as a separate plane from the
2014
2002
  cover. */
2015
- box-shadow: 0 0 0 2px var(--sys-color-surface);
2003
+ box-shadow: 0 0 0 2px var(--sys-color-surface-default);
2016
2004
  border-radius: var(--sys-radius-full);
2017
2005
  }
2018
2006
 
@@ -2031,7 +2019,7 @@ a.chorus-metadata__name:focus-visible {
2031
2019
  font-size: var(--sys-typo-label-md-size);
2032
2020
  line-height: var(--sys-typo-label-md-line);
2033
2021
  font-weight: var(--sys-typo-label-md-weight);
2034
- color: var(--sys-color-onSurface);
2022
+ color: var(--sys-color-text-default);
2035
2023
  max-width: 100%;
2036
2024
  white-space: nowrap;
2037
2025
  overflow: hidden;
@@ -2041,7 +2029,7 @@ a.chorus-metadata__name:focus-visible {
2041
2029
  .chorus-profile-carousel__followers {
2042
2030
  font-size: var(--sys-typo-label-sm-size);
2043
2031
  line-height: var(--sys-typo-label-sm-line);
2044
- color: var(--sys-color-onSurfaceVariant);
2032
+ color: var(--sys-color-text-subtle);
2045
2033
  }
2046
2034
 
2047
2035
  /* Slot below the identity stack. Either a row of icon-value metrics or a
@@ -2083,7 +2071,7 @@ a.chorus-metadata__name:focus-visible {
2083
2071
  margin: 0;
2084
2072
  font-size: var(--sys-typo-label-sm-size);
2085
2073
  line-height: var(--sys-typo-label-sm-line);
2086
- color: var(--sys-color-onSurfaceVariant);
2074
+ color: var(--sys-color-text-subtle);
2087
2075
  text-align: center;
2088
2076
  display: -webkit-box;
2089
2077
  -webkit-line-clamp: 2;
@@ -2098,7 +2086,7 @@ a.chorus-metadata__name:focus-visible {
2098
2086
  gap: var(--sys-layout-inline-sm);
2099
2087
  font-size: var(--sys-typo-label-sm-size);
2100
2088
  line-height: var(--sys-typo-label-sm-line);
2101
- color: var(--sys-color-onSurface);
2089
+ color: var(--sys-color-text-default);
2102
2090
  }
2103
2091
 
2104
2092
  .chorus-profile-carousel__metric-icon {
@@ -2145,7 +2133,7 @@ a.chorus-metadata__name:focus-visible {
2145
2133
  .chorus-profile-header {
2146
2134
  display: flex;
2147
2135
  flex-direction: column;
2148
- background: var(--sys-color-surface);
2136
+ background: var(--sys-color-surface-default);
2149
2137
  width: 100%;
2150
2138
  }
2151
2139
 
@@ -2164,7 +2152,7 @@ a.chorus-metadata__name:focus-visible {
2164
2152
  widens / narrows, so the cover keeps the same visual mass relative
2165
2153
  to the column instead of locking to a hard pixel height. */
2166
2154
  aspect-ratio: 375 / 120;
2167
- background-color: var(--sys-color-surfaceContainerHigh);
2155
+ background-color: var(--sys-color-surface-sunken);
2168
2156
  background-image: var(--chorus-placeholder-image);
2169
2157
  background-size: cover;
2170
2158
  background-position: center;
@@ -2295,7 +2283,7 @@ a.chorus-metadata__name:focus-visible {
2295
2283
  line-height: var(--sys-typo-heading-lg-line);
2296
2284
  font-weight: var(--sys-typo-heading-lg-weight);
2297
2285
  letter-spacing: var(--sys-typo-heading-lg-tracking);
2298
- color: var(--sys-color-onSurface);
2286
+ color: var(--sys-color-text-default);
2299
2287
  white-space: nowrap;
2300
2288
  overflow: hidden;
2301
2289
  text-overflow: ellipsis;
@@ -2309,17 +2297,17 @@ a.chorus-metadata__name:focus-visible {
2309
2297
  gap: var(--sys-layout-inline-sm);
2310
2298
  font-size: var(--sys-typo-body-sm-size);
2311
2299
  line-height: var(--sys-typo-body-sm-line);
2312
- color: var(--sys-color-onSurfaceVariant);
2300
+ color: var(--sys-color-text-subtle);
2313
2301
  min-width: 0;
2314
2302
  }
2315
2303
 
2316
2304
  .chorus-profile-header__meta-icon {
2317
2305
  flex: 0 0 auto;
2318
- color: var(--sys-color-onSurfaceVariant);
2306
+ color: var(--sys-color-text-subtle);
2319
2307
  }
2320
2308
 
2321
2309
  .chorus-profile-header__meta-sep {
2322
- color: var(--sys-color-onSurfaceVariant);
2310
+ color: var(--sys-color-text-subtle);
2323
2311
  }
2324
2312
 
2325
2313
  .chorus-profile-header__meta-visibility,
@@ -2357,7 +2345,7 @@ a.chorus-metadata__name:focus-visible {
2357
2345
  Canonical hosts: ProfileHeader's avatar (the 56-rung that half-
2358
2346
  overlaps the cover) and any avatar Thumbnail that lives over imagery. */
2359
2347
  .chorus-thumbnail--outlined {
2360
- box-shadow: 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-surface);
2348
+ box-shadow: 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-surface-default);
2361
2349
  }
2362
2350
 
2363
2351
  /* Same image-area fallback contract as `.chorus-feed-ad__media` — the
@@ -2369,7 +2357,7 @@ a.chorus-metadata__name:focus-visible {
2369
2357
  width: 100%;
2370
2358
  height: 100%;
2371
2359
  border-radius: var(--sys-radius-full);
2372
- background-color: var(--sys-color-surfaceContainerHigh);
2360
+ background-color: var(--sys-color-surface-sunken);
2373
2361
  background-image: var(--chorus-placeholder-image);
2374
2362
  background-size: cover;
2375
2363
  background-position: center;
@@ -2402,11 +2390,11 @@ a.chorus-metadata__name:focus-visible {
2402
2390
  width: var(--sys-icon-md);
2403
2391
  height: var(--sys-icon-md);
2404
2392
  border-radius: var(--sys-radius-full);
2405
- background: var(--sys-color-surface);
2393
+ background: var(--sys-color-surface-default);
2406
2394
  /* Hairline halo via box-shadow so the badge does not enlarge the
2407
2395
  bounding box — the halo paints over the host image's edge without
2408
2396
  shifting the badge's `icon.sm` footprint. */
2409
- box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-surface);
2397
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-surface-default);
2410
2398
  overflow: hidden;
2411
2399
  display: inline-flex;
2412
2400
  align-items: center;
@@ -2422,12 +2410,12 @@ a.chorus-metadata__name:focus-visible {
2422
2410
  }
2423
2411
 
2424
2412
  .chorus-thumbnail__badge:empty {
2425
- background: var(--sys-color-surfaceContainerHigh);
2413
+ background: var(--sys-color-surface-sunken);
2426
2414
  }
2427
2415
 
2428
2416
  /* List — vertical row stack. The row is the interactive surface;
2429
2417
  leading and trailing slots are decorative. Inter-row divider is a
2430
- hairline `outlineVariant`, not a layout gap — the contract is
2418
+ hairline `border.default`, not a layout gap — the contract is
2431
2419
  "flush rows separated by a rule", not "rows with breathing room". */
2432
2420
  .chorus-list {
2433
2421
  display: flex;
@@ -2456,7 +2444,7 @@ a.chorus-metadata__name:focus-visible {
2456
2444
  min-height: var(--ref-space-600);
2457
2445
  box-sizing: border-box;
2458
2446
  cursor: pointer;
2459
- color: var(--sys-color-onSurface);
2447
+ color: var(--sys-color-text-default);
2460
2448
  position: relative;
2461
2449
  isolation: isolate;
2462
2450
  }
@@ -2475,7 +2463,7 @@ a.chorus-metadata__name:focus-visible {
2475
2463
  right: var(--sys-layout-container-md);
2476
2464
  bottom: 0;
2477
2465
  height: var(--sys-borderWidth-hairline);
2478
- background: var(--sys-color-outlineVariant);
2466
+ background: var(--sys-color-border-default);
2479
2467
  pointer-events: none;
2480
2468
  }
2481
2469
 
@@ -2489,11 +2477,11 @@ a.chorus-metadata__name:focus-visible {
2489
2477
  nav chevron carries no `data-nested-action`, so hovering it still lights
2490
2478
  the row (it IS the row's drill-in affordance). */
2491
2479
  .chorus-list__row:hover:not(:has([data-nested-action]:hover)) {
2492
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-hover) * 100%), transparent);
2480
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-hover) * 100%), transparent);
2493
2481
  }
2494
2482
 
2495
2483
  .chorus-list__row:active:not(:has([data-nested-action]:active)) {
2496
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-pressed) * 100%), transparent);
2484
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-pressed) * 100%), transparent);
2497
2485
  }
2498
2486
 
2499
2487
  /* Focus indicator — inward composition per DESIGN.md → Focus ring
@@ -2514,9 +2502,7 @@ a.chorus-metadata__name:focus-visible {
2514
2502
 
2515
2503
  .chorus-list__row:focus-visible::before,
2516
2504
  .chorus-list__row[data-force-state="focused"]::before {
2517
- box-shadow:
2518
- inset 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-focus),
2519
- inset 0 0 0 calc(var(--sys-borderWidth-thin) + var(--sys-borderWidth-hairline)) var(--sys-color-focusInset);
2505
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-focused);
2520
2506
  }
2521
2507
 
2522
2508
  .chorus-list__row:focus-visible {
@@ -2527,13 +2513,21 @@ a.chorus-metadata__name:focus-visible {
2527
2513
  cursor: not-allowed;
2528
2514
  }
2529
2515
 
2530
- /* Disabled dims the row *content* only applied to the row's direct
2531
- children so the inter-row divider (`::after`) and focus overlay
2532
- (`::before`) keep full opacity. Fading the whole row box would dim the
2533
- hairline divider too, which reads as an awkward gap in the otherwise
2534
- crisp rule between rows. */
2535
- .chorus-list__row.is-disabled > * {
2536
- opacity: var(--sys-state-disabled);
2516
+ /* Disabled re-tones the row *content* to the neutral disabled tokens
2517
+ text `text.disabled`, icon glyph `icon.disabled` instead of an
2518
+ opacity dim, so the inter-row divider (`::after`) and focus overlay
2519
+ (`::before`) keep full strength. Scoping the colors to the content
2520
+ leaves the hairline rule crisp, the same reason the old opacity was
2521
+ applied to the row's children rather than the whole box. */
2522
+ .chorus-list__row.is-disabled .chorus-list__label,
2523
+ .chorus-list__row.is-disabled .chorus-list__supporting,
2524
+ .chorus-list__row.is-disabled .chorus-list__trailing {
2525
+ color: var(--sys-color-text-disabled);
2526
+ }
2527
+
2528
+ .chorus-list__row.is-disabled .chorus-list__leading--icon,
2529
+ .chorus-list__row.is-disabled .chorus-list__radio {
2530
+ color: var(--sys-color-icon-disabled);
2537
2531
  }
2538
2532
 
2539
2533
  .chorus-list__leading {
@@ -2577,7 +2571,7 @@ a.chorus-metadata__name:focus-visible {
2577
2571
  .chorus-list__label {
2578
2572
  font-size: var(--sys-typo-body-md-size);
2579
2573
  line-height: var(--sys-typo-body-md-line);
2580
- color: var(--sys-color-onSurface);
2574
+ color: var(--sys-color-text-default);
2581
2575
  overflow: hidden;
2582
2576
  text-overflow: ellipsis;
2583
2577
  white-space: nowrap;
@@ -2599,7 +2593,7 @@ a.chorus-metadata__name:focus-visible {
2599
2593
  .chorus-list__supporting {
2600
2594
  font-size: var(--sys-typo-body-sm-size);
2601
2595
  line-height: var(--sys-typo-body-sm-line);
2602
- color: var(--sys-color-onSurfaceVariant);
2596
+ color: var(--sys-color-text-subtle);
2603
2597
  overflow: hidden;
2604
2598
  text-overflow: ellipsis;
2605
2599
  white-space: nowrap;
@@ -2609,7 +2603,7 @@ a.chorus-metadata__name:focus-visible {
2609
2603
  display: inline-flex;
2610
2604
  align-items: center;
2611
2605
  justify-content: center;
2612
- color: var(--sys-color-onSurfaceVariant);
2606
+ color: var(--sys-color-text-subtle);
2613
2607
  flex: 0 0 auto;
2614
2608
  /* Text group ↔ trailing action: fixed `inline.md` (8) in every variant. */
2615
2609
  margin-left: var(--sys-layout-inline-md);
@@ -2674,7 +2668,7 @@ a.chorus-metadata__name:focus-visible {
2674
2668
  carries the meaning; the slot enforces the 24 rung regardless of the glyph's
2675
2669
  own size attribute. */
2676
2670
  .chorus-list__leading--icon {
2677
- color: var(--sys-color-onSurfaceVariant);
2671
+ color: var(--sys-color-text-subtle);
2678
2672
  }
2679
2673
 
2680
2674
  .chorus-list__leading--icon svg {
@@ -2744,7 +2738,7 @@ a.chorus-metadata__name:focus-visible {
2744
2738
  min-width: 0;
2745
2739
  }
2746
2740
 
2747
- /* Inline verified mark — paints in `sys.color.primary` (resolves to
2741
+ /* Inline verified mark — paints in `sys.color.background.primary` (resolves to
2748
2742
  `ref.palette.blue.500`). Sits to the LEFT of the label so the trust
2749
2743
  signal reads first. Centred against the label (the primary row is
2750
2744
  baseline-aligned for the label + count pairing). */
@@ -2753,7 +2747,7 @@ a.chorus-metadata__name:focus-visible {
2753
2747
  align-self: center;
2754
2748
  width: var(--sys-icon-md);
2755
2749
  height: var(--sys-icon-md);
2756
- color: var(--sys-color-primary);
2750
+ color: var(--sys-color-icon-accent-blue-default);
2757
2751
  flex: 0 0 auto;
2758
2752
  }
2759
2753
 
@@ -2766,7 +2760,7 @@ a.chorus-metadata__name:focus-visible {
2766
2760
  font-size: var(--sys-typo-label-md-size);
2767
2761
  line-height: var(--sys-typo-label-md-line);
2768
2762
  font-weight: var(--sys-typo-label-md-weight);
2769
- color: var(--sys-color-onSurface);
2763
+ color: var(--sys-color-text-default);
2770
2764
  overflow: hidden;
2771
2765
  text-overflow: ellipsis;
2772
2766
  white-space: nowrap;
@@ -2783,7 +2777,7 @@ a.chorus-metadata__name:focus-visible {
2783
2777
  .chorus-entry-row__secondary {
2784
2778
  font-size: var(--sys-typo-label-sm-size);
2785
2779
  line-height: var(--sys-typo-label-sm-line);
2786
- color: var(--sys-color-onSurface);
2780
+ color: var(--sys-color-text-default);
2787
2781
  overflow: hidden;
2788
2782
  text-overflow: ellipsis;
2789
2783
  white-space: nowrap;
@@ -2792,7 +2786,7 @@ a.chorus-metadata__name:focus-visible {
2792
2786
  .chorus-entry-row__description {
2793
2787
  font-size: var(--sys-typo-label-sm-size);
2794
2788
  line-height: var(--sys-typo-label-sm-line);
2795
- color: var(--sys-color-onSurfaceVariant);
2789
+ color: var(--sys-color-text-subtle);
2796
2790
  /* Identity-group ↔ description separator: 2px (ref.space.25). The
2797
2791
  description reads as a tight supporting layer below the identity
2798
2792
  block rather than a co-equal line. */
@@ -2809,7 +2803,7 @@ a.chorus-metadata__name:focus-visible {
2809
2803
  display: inline-flex;
2810
2804
  align-items: center;
2811
2805
  justify-content: center;
2812
- color: var(--sys-color-onSurfaceVariant);
2806
+ color: var(--sys-color-text-subtle);
2813
2807
  flex: 0 0 auto;
2814
2808
  margin-left: var(--sys-layout-inline-md);
2815
2809
  }
@@ -2850,7 +2844,7 @@ a.chorus-metadata__name:focus-visible {
2850
2844
  modifier when the card needs its own opaque tier (sitting on a
2851
2845
  transparent host or between bare-surface sections). */
2852
2846
  background: transparent;
2853
- color: var(--sys-color-onSurface);
2847
+ color: var(--sys-color-text-default);
2854
2848
  border: 0;
2855
2849
  border-radius: var(--sys-radius-md);
2856
2850
  text-align: left;
@@ -2858,7 +2852,7 @@ a.chorus-metadata__name:focus-visible {
2858
2852
  cursor: pointer;
2859
2853
  position: relative;
2860
2854
  isolation: isolate;
2861
- box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-outlineVariant);
2855
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-default);
2862
2856
  transition: background 120ms ease;
2863
2857
  }
2864
2858
 
@@ -2879,12 +2873,12 @@ a.chorus-metadata__name:focus-visible {
2879
2873
  /* Default hover/pressed — overlay mixes on a transparent base, so the
2880
2874
  host surface tone keeps reading through underneath the state paint. */
2881
2875
  .chorus-nav-card:hover {
2882
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-hover) * 100%), transparent);
2876
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-hover) * 100%), transparent);
2883
2877
  }
2884
2878
 
2885
2879
  .chorus-nav-card:active,
2886
2880
  .chorus-nav-card[data-force-state="pressed"] {
2887
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-pressed) * 100%), transparent);
2881
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-pressed) * 100%), transparent);
2888
2882
  }
2889
2883
 
2890
2884
  /* Surface appearance — paints the card with its own `surface` fill.
@@ -2894,16 +2888,16 @@ a.chorus-metadata__name:focus-visible {
2894
2888
  hairline outline + chevron + hover overlay all stay; only the
2895
2889
  container fill changes. */
2896
2890
  .chorus-nav-card--surface {
2897
- background: var(--sys-color-surface);
2891
+ background: var(--sys-color-surface-default);
2898
2892
  }
2899
2893
 
2900
2894
  .chorus-nav-card--surface:hover {
2901
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-hover) * 100%), var(--sys-color-surface));
2895
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-hover) * 100%), var(--sys-color-surface-default));
2902
2896
  }
2903
2897
 
2904
2898
  .chorus-nav-card--surface:active,
2905
2899
  .chorus-nav-card--surface[data-force-state="pressed"] {
2906
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-pressed) * 100%), var(--sys-color-surface));
2900
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-pressed) * 100%), var(--sys-color-surface-default));
2907
2901
  }
2908
2902
 
2909
2903
  /* Outward focus ring — paints OUTSIDE the card's outline so it never
@@ -2926,14 +2920,15 @@ a.chorus-metadata__name:focus-visible {
2926
2920
 
2927
2921
  .chorus-nav-card:focus-visible::after,
2928
2922
  .chorus-nav-card[data-force-state="focused"]::after {
2929
- box-shadow:
2930
- 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-focus),
2931
- 0 0 0 calc(var(--sys-borderWidth-thin) + var(--sys-borderWidth-hairline)) var(--sys-color-focusInset);
2923
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-focused);
2932
2924
  }
2933
2925
 
2934
2926
  .chorus-nav-card[data-disabled="true"],
2935
2927
  .chorus-nav-card:disabled {
2936
- opacity: var(--sys-state-disabled);
2928
+ /* Explicit disabled (no opacity): content re-tones to text.disabled via
2929
+ the card's inherited color (label / supporting / leading glyph all
2930
+ ride it). */
2931
+ color: var(--sys-color-text-disabled);
2937
2932
  cursor: not-allowed;
2938
2933
  }
2939
2934
 
@@ -2959,7 +2954,7 @@ a.chorus-metadata__name:focus-visible {
2959
2954
  font-size: var(--sys-typo-body-sm-size);
2960
2955
  line-height: var(--sys-typo-body-sm-line);
2961
2956
  font-weight: var(--sys-typo-body-sm-weight);
2962
- color: var(--sys-color-onSurface);
2957
+ color: var(--sys-color-text-default);
2963
2958
  overflow: hidden;
2964
2959
  text-overflow: ellipsis;
2965
2960
  white-space: nowrap;
@@ -2968,7 +2963,7 @@ a.chorus-metadata__name:focus-visible {
2968
2963
  .chorus-nav-card__supporting {
2969
2964
  font-size: var(--sys-typo-label-sm-size);
2970
2965
  line-height: var(--sys-typo-label-sm-line);
2971
- color: var(--sys-color-onSurfaceVariant);
2966
+ color: var(--sys-color-text-subtle);
2972
2967
  overflow: hidden;
2973
2968
  text-overflow: ellipsis;
2974
2969
  white-space: nowrap;
@@ -2978,7 +2973,7 @@ a.chorus-metadata__name:focus-visible {
2978
2973
  display: inline-flex;
2979
2974
  align-items: center;
2980
2975
  justify-content: center;
2981
- color: var(--sys-color-onSurfaceVariant);
2976
+ color: var(--sys-color-text-subtle);
2982
2977
  flex: 0 0 auto;
2983
2978
  }
2984
2979
 
@@ -3001,7 +2996,7 @@ a.chorus-metadata__name:focus-visible {
3001
2996
  display: inline-flex;
3002
2997
  align-items: center;
3003
2998
  justify-content: center;
3004
- color: var(--sys-color-onSurface);
2999
+ color: var(--sys-color-icon-default);
3005
3000
  transition: color 120ms ease;
3006
3001
  }
3007
3002
 
@@ -3018,7 +3013,7 @@ a.chorus-metadata__name:focus-visible {
3018
3013
  anchored to the rail's right edge regardless of how far the user
3019
3014
  scrolls the avatars. */
3020
3015
  .chorus-avatar-rail {
3021
- background: var(--sys-color-surface);
3016
+ background: var(--sys-color-surface-default);
3022
3017
  width: 100%;
3023
3018
  box-sizing: border-box;
3024
3019
  padding: var(--sys-layout-container-sm) var(--sys-layout-container-md);
@@ -3093,7 +3088,7 @@ a.chorus-metadata__name:focus-visible {
3093
3088
  }
3094
3089
 
3095
3090
  .chorus-avatar-rail__item:focus-visible {
3096
- outline: var(--sys-borderWidth-hairline) solid var(--sys-color-focus);
3091
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
3097
3092
  outline-offset: var(--sys-layout-inline-xs);
3098
3093
  }
3099
3094
 
@@ -3111,7 +3106,7 @@ a.chorus-metadata__name:focus-visible {
3111
3106
  width: calc(48px + 2 * var(--sys-layout-inline-sm));
3112
3107
  font-size: var(--sys-typo-label-sm-size);
3113
3108
  line-height: var(--sys-typo-label-sm-line);
3114
- color: var(--sys-color-onSurface);
3109
+ color: var(--sys-color-text-default);
3115
3110
  text-align: center;
3116
3111
  overflow: hidden;
3117
3112
  text-overflow: ellipsis;
@@ -3144,7 +3139,7 @@ a.chorus-metadata__name:focus-visible {
3144
3139
  label), toggle at one inline.xl (16) before the next page's leading avatar,
3145
3140
  and that next avatar peeks 8 (inline.md) past the surface's right edge. */
3146
3141
  .chorus-suggestion-list {
3147
- background: var(--sys-color-surface);
3142
+ background: var(--sys-color-surface-default);
3148
3143
  width: 100%;
3149
3144
  box-sizing: border-box;
3150
3145
  padding-block: var(--sys-layout-container-lg);
@@ -3282,7 +3277,7 @@ a.chorus-metadata__name:focus-visible {
3282
3277
  ============================================================ */
3283
3278
  .chorus-directory-list,
3284
3279
  .chorus-nav-list {
3285
- background: var(--sys-color-surface);
3280
+ background: var(--sys-color-surface-default);
3286
3281
  width: 100%;
3287
3282
  box-sizing: border-box;
3288
3283
  /* Full-bleed column — the host pays NO inline padding. Its Header and
@@ -3374,9 +3369,9 @@ a.chorus-metadata__name:focus-visible {
3374
3369
  }
3375
3370
 
3376
3371
  .chorus-banner--accent {
3377
- background: var(--sys-color-primaryContainer);
3378
- color: var(--sys-color-onPrimaryContainer);
3379
- --banner-outline-color: color-mix(in srgb, var(--sys-color-primary) 40%, transparent);
3372
+ background: var(--sys-color-background-selected);
3373
+ color: var(--sys-color-text-link);
3374
+ --banner-outline-color: color-mix(in srgb, var(--sys-color-border-primary) 40%, transparent);
3380
3375
  }
3381
3376
 
3382
3377
  /* Destructive — error-tinted banner. Reach for it when the aside is a
@@ -3385,30 +3380,26 @@ a.chorus-metadata__name:focus-visible {
3385
3380
  shadcn `<Alert variant="destructive">` shape for Lovable-generated
3386
3381
  screens. */
3387
3382
  .chorus-banner--destructive {
3388
- background: var(--sys-color-errorContainer);
3389
- color: var(--sys-color-onErrorContainer);
3390
- --banner-outline-color: color-mix(in srgb, var(--sys-color-error) 40%, transparent);
3391
- }
3392
-
3393
- /* Default uses `sys.color.scrimSubtle` (~8% inverse-tone overlay —
3394
- black in light, white in dark) rather than a tonal container role,
3395
- so the banner stays harmonious on any underlying surface body,
3396
- raised card, BottomSheet, Dialog by tinting one step darker
3397
- (light mode) or lighter (dark mode) instead of pinning to a fixed
3398
- neutral step that can collide with the surface ladder. Same scrim
3399
- used by Chip / Tag default, Progress track, StatusTag neutral, and
3400
- Skeleton. */
3383
+ background: var(--sys-color-background-danger);
3384
+ color: var(--sys-color-text-danger);
3385
+ --banner-outline-color: color-mix(in srgb, var(--sys-color-border-danger) 40%, transparent);
3386
+ }
3387
+
3388
+ /* Default uses the solid `background.neutral` fill (the role that
3389
+ replaced the old ~8% scrim) a fixed light-gray step in light, a
3390
+ mid-gray in dark. Same neutral fill as Chip / Tag default, Progress
3391
+ track, StatusTag neutral, and Skeleton, so they read as one family. */
3401
3392
  .chorus-banner--default {
3402
- background: var(--sys-color-scrimSubtle);
3403
- color: var(--sys-color-onSurface);
3404
- --banner-outline-color: var(--sys-color-outlineVariant);
3393
+ background: var(--sys-color-background-neutral);
3394
+ color: var(--sys-color-text-default);
3395
+ --banner-outline-color: var(--sys-color-border-default);
3405
3396
  }
3406
3397
 
3407
3398
  /* Optional outline — a hairline inset stroke toned to the appearance's
3408
3399
  color family (each appearance block above sets
3409
3400
  `--banner-outline-color`), kept deliberately faint so the edge reads
3410
3401
  as a soft boundary of the same tint, not a frame: the subtle gray
3411
- hairline (`sys.color.outlineVariant`) on default's gray-tinted
3402
+ hairline (`sys.color.border.default`) on default's gray-tinted
3412
3403
  scrim; `primary` / `error` at 40% over transparent (the Skeleton
3413
3404
  fill recipe) on accent / destructive. Painted as an inset
3414
3405
  box-shadow, never a `border`, so toggling it can't change the
@@ -3498,7 +3489,7 @@ a.chorus-metadata__name:focus-visible {
3498
3489
  }
3499
3490
 
3500
3491
  .chorus-banner--default .chorus-banner__action {
3501
- color: var(--sys-color-primary);
3492
+ color: var(--sys-color-text-link);
3502
3493
  }
3503
3494
 
3504
3495
  /* neutral-body — keeps the `accent` fill but lays the Default
@@ -3509,11 +3500,11 @@ a.chorus-metadata__name:focus-visible {
3509
3500
  Only meaningful combined with `--accent` (default is already
3510
3501
  `onSurface`; destructive must carry the warning tone through copy). */
3511
3502
  .chorus-banner--accent.chorus-banner--neutral-body {
3512
- color: var(--sys-color-onSurface);
3503
+ color: var(--sys-color-text-default);
3513
3504
  }
3514
3505
 
3515
3506
  .chorus-banner--accent.chorus-banner--neutral-body .chorus-banner__action {
3516
- color: var(--sys-color-primary);
3507
+ color: var(--sys-color-text-link);
3517
3508
  }
3518
3509
 
3519
3510
  /* Trailing icon slot — a 16 × 16 glyph (`sys.icon.md`) at the trailing
@@ -3558,16 +3549,14 @@ a.chorus-metadata__name:focus-visible {
3558
3549
  /* ============================================================
3559
3550
  Divider — section-break band between adjacent regions that
3560
3551
  don't share an enclosing container. Single full-bleed block
3561
- painted with `sys.color.scrimSubtle` (~8% inverse-tone
3562
- overlayblack in light mode, white in dark) at a fixed
3563
- `sys.layout.stack.xs` (8) block thickness — the 1× rung of
3564
- the base-unit ladder. The translucent fill stays visible on
3565
- every host surface tier (surface, surfaceContainerHigh,
3566
- hero, …) without colliding with a fixed neutral step
3567
- same scrim tier as Banner default, Chip / Tag default,
3568
- Progress track, StatusTag neutral, and Skeleton. Resets
3569
- every browser `<hr>` default (margin, border, background-
3570
- image) so only the scrimSubtle band paints.
3552
+ painted with `sys.color.border.default` (the hairline
3553
+ separator role a faint gray in light, a subtle dark step in
3554
+ dark) at a fixed `sys.layout.stack.xs` (8) block thickness —
3555
+ the 1× rung of the base-unit ladder. Reads as a separator
3556
+ tier rather than a fill (unlike Banner / Chip / Tag default,
3557
+ which take the solid `background.neutral`). Resets every
3558
+ browser `<hr>` default (margin, border, background-image) so
3559
+ only the divider band paints.
3571
3560
  ============================================================ */
3572
3561
  .chorus-divider {
3573
3562
  display: block;
@@ -3577,7 +3566,7 @@ a.chorus-metadata__name:focus-visible {
3577
3566
  padding: 0;
3578
3567
  border: none;
3579
3568
  border-radius: 0;
3580
- background: var(--sys-color-scrimSubtle);
3569
+ background: var(--sys-color-border-default);
3581
3570
  background-image: none;
3582
3571
  flex-shrink: 0;
3583
3572
  }
@@ -3620,8 +3609,8 @@ a.chorus-metadata__name:focus-visible {
3620
3609
  box-sizing: border-box;
3621
3610
  display: flex;
3622
3611
  flex-direction: column;
3623
- background: var(--sys-color-surface);
3624
- color: var(--sys-color-onSurface);
3612
+ background: var(--sys-color-surface-default);
3613
+ color: var(--sys-color-text-default);
3625
3614
  box-shadow: var(--sys-elevation-sheet);
3626
3615
  }
3627
3616
 
@@ -3673,7 +3662,7 @@ a.chorus-metadata__name:focus-visible {
3673
3662
  .chorus-side-sheet__footer {
3674
3663
  flex: 0 0 auto;
3675
3664
  padding: var(--sys-layout-container-md);
3676
- border-top: var(--sys-borderWidth-hairline) solid var(--sys-color-outlineVariant);
3665
+ border-top: var(--sys-borderWidth-hairline) solid var(--sys-color-border-default);
3677
3666
  display: flex;
3678
3667
  align-items: center;
3679
3668
  justify-content: flex-start;
@@ -3719,8 +3708,8 @@ a.chorus-metadata__name:focus-visible {
3719
3708
  max-height: 90vh;
3720
3709
  display: flex;
3721
3710
  flex-direction: column;
3722
- background: var(--sys-color-surfaceContainerHigh);
3723
- color: var(--sys-color-onSurface);
3711
+ background: var(--sys-color-surface-default);
3712
+ color: var(--sys-color-text-default);
3724
3713
  border-top-left-radius: var(--sys-radius-xl);
3725
3714
  border-top-right-radius: var(--sys-radius-xl);
3726
3715
  box-shadow: var(--sys-elevation-sheet);
@@ -3738,7 +3727,7 @@ a.chorus-metadata__name:focus-visible {
3738
3727
  height: var(--ref-space-50);
3739
3728
  margin: var(--sys-layout-container-xs) auto;
3740
3729
  border-radius: var(--sys-radius-full);
3741
- background: color-mix(in srgb, var(--sys-color-onSurfaceVariant) 40%, transparent);
3730
+ background: color-mix(in srgb, var(--sys-color-text-subtle) 40%, transparent);
3742
3731
  }
3743
3732
 
3744
3733
  .chorus-bottom-sheet__content {
@@ -3756,7 +3745,7 @@ a.chorus-metadata__name:focus-visible {
3756
3745
  line-height: var(--sys-typo-heading-lg-line);
3757
3746
  font-weight: var(--sys-typo-heading-lg-weight);
3758
3747
  letter-spacing: var(--sys-typo-heading-lg-tracking);
3759
- color: var(--sys-color-onSurface);
3748
+ color: var(--sys-color-text-default);
3760
3749
  }
3761
3750
 
3762
3751
  /* Nested-step title row — when the sheet drives a drill-in, an Icon
@@ -3775,7 +3764,7 @@ a.chorus-metadata__name:focus-visible {
3775
3764
  font-size: var(--sys-typo-body-md-size);
3776
3765
  line-height: var(--sys-typo-body-md-line);
3777
3766
  font-weight: var(--sys-typo-body-md-weight);
3778
- color: var(--sys-color-onSurfaceVariant);
3767
+ color: var(--sys-color-text-subtle);
3779
3768
  }
3780
3769
 
3781
3770
  .chorus-bottom-sheet__actions {
@@ -3784,7 +3773,7 @@ a.chorus-metadata__name:focus-visible {
3784
3773
  flex-direction: column;
3785
3774
  gap: var(--sys-layout-stack-xs);
3786
3775
  padding: var(--sys-layout-container-md);
3787
- background: var(--sys-color-surfaceContainerHigh);
3776
+ background: var(--sys-color-surface-default);
3788
3777
  transition: box-shadow 120ms ease-out;
3789
3778
  }
3790
3779
 
@@ -3829,8 +3818,8 @@ a.chorus-metadata__name:focus-visible {
3829
3818
  align-items: stretch;
3830
3819
  text-align: start;
3831
3820
  padding: var(--sys-layout-container-lg);
3832
- background: var(--sys-color-surfaceContainerHigh);
3833
- color: var(--sys-color-onSurface);
3821
+ background: var(--sys-color-surface-default);
3822
+ color: var(--sys-color-text-default);
3834
3823
  border-radius: var(--sys-radius-xl);
3835
3824
  box-shadow: var(--sys-elevation-overlay);
3836
3825
  }
@@ -3846,7 +3835,7 @@ a.chorus-metadata__name:focus-visible {
3846
3835
  line-height: var(--sys-typo-heading-sm-line);
3847
3836
  font-weight: var(--sys-typo-heading-sm-weight);
3848
3837
  letter-spacing: var(--sys-typo-heading-sm-tracking);
3849
- color: var(--sys-color-onSurface);
3838
+ color: var(--sys-color-text-default);
3850
3839
  }
3851
3840
 
3852
3841
  .chorus-dialog__image {
@@ -3862,7 +3851,7 @@ a.chorus-metadata__name:focus-visible {
3862
3851
  font-size: var(--sys-typo-body-sm-size);
3863
3852
  line-height: var(--sys-typo-body-sm-line);
3864
3853
  font-weight: var(--sys-typo-body-sm-weight);
3865
- color: var(--sys-color-onSurfaceVariant);
3854
+ color: var(--sys-color-text-subtle);
3866
3855
  }
3867
3856
 
3868
3857
  .chorus-dialog__actions {
@@ -3970,7 +3959,7 @@ a.chorus-metadata__name:focus-visible {
3970
3959
 
3971
3960
  /* Accessibility focus ring — a dedicated overlay layer (`::after`),
3972
3961
  `position: absolute` so it never affects layout: a focused field never
3973
- widens and never nudges a sibling. Canonical two-layer composition,
3962
+ widens and never nudges a sibling. Canonical single-ring composition,
3974
3963
  painted outward from the field's edge; sits at `z-index: 2`, above the
3975
3964
  state-overlay `::before` (z-index 0) and the input / clear slots
3976
3965
  (z-index 1). `inset: 0` because the field has no `border` — the padding
@@ -3988,14 +3977,15 @@ a.chorus-metadata__name:focus-visible {
3988
3977
  }
3989
3978
 
3990
3979
  .chorus-field[data-force-state="focused"]::after {
3991
- box-shadow:
3992
- 0 0 0 var(--field-focus-inset-width) var(--field-focus-inset-color),
3993
- 0 0 0 calc(var(--field-focus-outer-width) + var(--field-focus-inset-width)) var(--field-focus-outer-color);
3980
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--field-focus-outer-color);
3994
3981
  }
3995
3982
 
3996
3983
  .chorus-field.is-disabled {
3984
+ /* Explicit disabled (no opacity): neutral disabled fill + bold border
3985
+ + disabled text. The component swaps `--field-text` / `--field-border`
3986
+ to the disabled tokens when disabled (see FormField.jsx), so the held
3987
+ rest stroke and typed text re-tone without a dim. */
3997
3988
  background: var(--field-bg-disabled);
3998
- opacity: var(--field-disabled-opacity);
3999
3989
  cursor: not-allowed;
4000
3990
  /* Hold the rest stroke even if the disabled field is hovered. */
4001
3991
  box-shadow: inset 0 0 0 var(--field-border-width) var(--field-border);
@@ -4121,7 +4111,7 @@ a.chorus-metadata__name:focus-visible {
4121
4111
  padding: 0;
4122
4112
  border: none;
4123
4113
  background: transparent;
4124
- color: var(--sys-color-onSurfaceVariant);
4114
+ color: var(--sys-color-text-subtle);
4125
4115
  border-radius: var(--sys-radius-full);
4126
4116
  cursor: pointer;
4127
4117
  }
@@ -4143,7 +4133,7 @@ a.chorus-metadata__name:focus-visible {
4143
4133
  }
4144
4134
 
4145
4135
  /* Focus ring — dedicated overlay layer (`::after`), `position: absolute`
4146
- so it never affects the field's layout. Canonical two-layer ring,
4136
+ so it never affects the field's layout. Canonical single-ring,
4147
4137
  outward; `z-index: 2`, above the 16px glyph. */
4148
4138
  .chorus-field__clear::after {
4149
4139
  content: '';
@@ -4157,9 +4147,7 @@ a.chorus-metadata__name:focus-visible {
4157
4147
  }
4158
4148
 
4159
4149
  .chorus-field__clear:focus-visible::after {
4160
- box-shadow:
4161
- 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-focusInset),
4162
- 0 0 0 calc(var(--sys-borderWidth-thin) + var(--sys-borderWidth-hairline)) var(--sys-color-focus);
4150
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-focused);
4163
4151
  }
4164
4152
 
4165
4153
  /* ============================================================
@@ -4190,7 +4178,7 @@ a.chorus-metadata__name:focus-visible {
4190
4178
  font-weight: var(--sys-typo-label-md-weight);
4191
4179
  line-height: var(--sys-typo-label-md-line);
4192
4180
  letter-spacing: var(--sys-typo-label-md-tracking);
4193
- color: var(--sys-color-onSurface);
4181
+ color: var(--sys-color-text-default);
4194
4182
  }
4195
4183
 
4196
4184
  .chorus-field-group__helper {
@@ -4198,7 +4186,7 @@ a.chorus-metadata__name:focus-visible {
4198
4186
  font-weight: var(--sys-typo-body-sm-weight);
4199
4187
  line-height: var(--sys-typo-body-sm-line);
4200
4188
  letter-spacing: var(--sys-typo-body-sm-tracking);
4201
- color: var(--sys-color-onSurfaceVariant);
4189
+ color: var(--sys-color-text-subtle);
4202
4190
  }
4203
4191
 
4204
4192
  .chorus-field-group__count {
@@ -4207,14 +4195,14 @@ a.chorus-metadata__name:focus-visible {
4207
4195
  font-weight: var(--sys-typo-body-sm-weight);
4208
4196
  line-height: var(--sys-typo-body-sm-line);
4209
4197
  letter-spacing: var(--sys-typo-body-sm-tracking);
4210
- color: var(--sys-color-onSurfaceVariant);
4198
+ color: var(--sys-color-text-subtle);
4211
4199
  }
4212
4200
 
4213
4201
  /* Current-count number — same body.sm size, label.md weight so the
4214
4202
  live count reads bolder than the `/max` suffix. */
4215
4203
  .chorus-field-group__count-current {
4216
4204
  font-weight: var(--sys-typo-label-md-weight);
4217
- color: var(--sys-color-onSurface);
4205
+ color: var(--sys-color-text-default);
4218
4206
  }
4219
4207
 
4220
4208
  /* Error appearance — re-tone the helper / count so the bottom rung
@@ -4222,16 +4210,15 @@ a.chorus-metadata__name:focus-visible {
4222
4210
  .chorus-field-group--error .chorus-field-group__helper,
4223
4211
  .chorus-field-group--error .chorus-field-group__count,
4224
4212
  .chorus-field-group--error .chorus-field-group__count-current {
4225
- color: var(--sys-color-error);
4213
+ color: var(--sys-color-text-danger);
4226
4214
  }
4227
4215
 
4228
- /* Disabled — dim the label / helper / count to match the 40% the box
4229
- already applies to itself. Box and group bits use the same
4230
- `--field-disabled-opacity` independently (no compounding). */
4216
+ /* Disabled — re-tone the label / helper / count to `text.disabled` to
4217
+ match the field box's explicit disabled treatment (no opacity). */
4231
4218
  .chorus-field-group.is-disabled .chorus-field-group__label,
4232
4219
  .chorus-field-group.is-disabled .chorus-field-group__helper,
4233
4220
  .chorus-field-group.is-disabled .chorus-field-group__count {
4234
- opacity: var(--field-disabled-opacity);
4221
+ color: var(--sys-color-text-disabled);
4235
4222
  }
4236
4223
 
4237
4224
  /* Trailing slot — symmetric to `.chorus-field__leading`. Hosts the
@@ -4246,7 +4233,7 @@ a.chorus-metadata__name:focus-visible {
4246
4233
  justify-content: center;
4247
4234
  width: var(--field-icon-size);
4248
4235
  height: var(--field-icon-size);
4249
- color: var(--sys-color-onSurfaceVariant);
4236
+ color: var(--sys-color-text-subtle);
4250
4237
  }
4251
4238
 
4252
4239
  .chorus-field--error .chorus-field__trailing {
@@ -4389,8 +4376,8 @@ a.chorus-metadata__name:focus-visible {
4389
4376
  calc(env(safe-area-inset-top, 0px) + var(--sys-layout-container-xs))
4390
4377
  var(--sys-layout-container-md)
4391
4378
  var(--sys-layout-container-xs);
4392
- background: var(--sys-color-surface);
4393
- color: var(--sys-color-onSurface);
4379
+ background: var(--sys-color-surface-default);
4380
+ color: var(--sys-color-text-default);
4394
4381
  }
4395
4382
 
4396
4383
  /* Main row layout (leading slot + flex-grown left title + trailing action
@@ -4411,7 +4398,7 @@ a.chorus-metadata__name:focus-visible {
4411
4398
  line-height: var(--sys-typo-heading-lg-line);
4412
4399
  font-weight: var(--sys-typo-heading-lg-weight);
4413
4400
  letter-spacing: var(--sys-typo-heading-lg-tracking);
4414
- color: var(--sys-color-onSurface);
4401
+ color: var(--sys-color-text-default);
4415
4402
  overflow: hidden;
4416
4403
  text-overflow: ellipsis;
4417
4404
  white-space: nowrap;
@@ -4445,7 +4432,7 @@ a.chorus-metadata__name:focus-visible {
4445
4432
  line-height: var(--sys-typo-heading-sm-line);
4446
4433
  font-weight: var(--sys-typo-heading-sm-weight);
4447
4434
  letter-spacing: var(--sys-typo-heading-sm-tracking);
4448
- color: var(--sys-color-onSurface);
4435
+ color: var(--sys-color-text-default);
4449
4436
  overflow: hidden;
4450
4437
  text-overflow: ellipsis;
4451
4438
  white-space: nowrap;
@@ -4523,7 +4510,7 @@ a.chorus-metadata__name:focus-visible {
4523
4510
  the row or shifts the input's caret position. Unique to Search; the
4524
4511
  bare input has no chrome of its own and the divider terminates the
4525
4512
  bar against the results list below. */
4526
- box-shadow: inset 0 -1px 0 var(--sys-color-outlineVariant);
4513
+ box-shadow: inset 0 -1px 0 var(--sys-color-border-default);
4527
4514
  }
4528
4515
 
4529
4516
  .chorus-navigation-bar--search .chorus-navigation-bar__slot--leading {
@@ -4535,9 +4522,9 @@ a.chorus-metadata__name:focus-visible {
4535
4522
  }
4536
4523
 
4537
4524
  /* Bare input — no border / background / inset stroke. Type rung body.md
4538
- (16/Regular). Caret picks up `sys.color.primary` so the active state
4525
+ (16/Regular). Caret picks up `sys.color.background.primary` so the active state
4539
4526
  reads against the surface fill. Placeholder picks up `sys.color.outline`;
4540
- value text picks up `sys.color.onSurface`. */
4527
+ value text picks up `sys.color.text.default`. */
4541
4528
  .chorus-navigation-bar__search-input {
4542
4529
  box-sizing: border-box;
4543
4530
  width: 100%;
@@ -4546,8 +4533,8 @@ a.chorus-metadata__name:focus-visible {
4546
4533
  padding: 0;
4547
4534
  border: 0;
4548
4535
  background: transparent;
4549
- color: var(--sys-color-onSurface);
4550
- caret-color: var(--sys-color-onSurface);
4536
+ color: var(--sys-color-text-default);
4537
+ caret-color: var(--sys-color-text-default);
4551
4538
  font-family: inherit;
4552
4539
  font-size: var(--sys-typo-body-md-size);
4553
4540
  line-height: var(--sys-typo-body-md-line);
@@ -4559,7 +4546,7 @@ a.chorus-metadata__name:focus-visible {
4559
4546
  }
4560
4547
 
4561
4548
  .chorus-navigation-bar__search-input::placeholder {
4562
- color: var(--sys-color-outline);
4549
+ color: var(--sys-color-border-boldest);
4563
4550
  opacity: 1;
4564
4551
  }
4565
4552
 
@@ -4585,8 +4572,8 @@ a.chorus-metadata__name:focus-visible {
4585
4572
  40 × 40 footprint falls out of `8 (padding) + 24 (glyph) + 8` and
4586
4573
  re-flows automatically if the icon token changes. Transparent at
4587
4574
  rest; hover / pressed paint `sys.state.*` overlays of `onSurface`;
4588
- focus composes the standard three-layer ring (`sys.color.focus`
4589
- outside `sys.color.focusInset`). */
4575
+ focus composes the standard three-layer ring (`sys.color.border.focused`
4576
+ outside `sys.color.border.focused`). */
4590
4577
  .chorus-button--icon {
4591
4578
  box-sizing: border-box;
4592
4579
  display: inline-flex;
@@ -4608,7 +4595,7 @@ a.chorus-metadata__name:focus-visible {
4608
4595
  /* Per-appearance plumbing — the glyph colour drives the hover /
4609
4596
  pressed / focus overlays (they `color-mix` from this var), so
4610
4597
  each appearance only declares one token. */
4611
- --button-icon-glyph-color: var(--sys-color-onSurface);
4598
+ --button-icon-glyph-color: var(--sys-color-icon-default);
4612
4599
  color: var(--button-icon-glyph-color);
4613
4600
  border-radius: var(--sys-radius-full);
4614
4601
  cursor: pointer;
@@ -4625,8 +4612,8 @@ a.chorus-metadata__name:focus-visible {
4625
4612
  /* Appearance modifiers — only the glyph colour token changes. Hover /
4626
4613
  pressed / focus overlays mix from `--button-icon-glyph-color`, so
4627
4614
  the recipe falls out without per-appearance overlay rules. */
4628
- .chorus-button--icon--appearance-default { --button-icon-glyph-color: var(--sys-color-onSurface); }
4629
- .chorus-button--icon--appearance-inverse { --button-icon-glyph-color: var(--sys-color-inverseOnSurface); }
4615
+ .chorus-button--icon--appearance-default { --button-icon-glyph-color: var(--sys-color-icon-default); }
4616
+ .chorus-button--icon--appearance-inverse { --button-icon-glyph-color: var(--sys-color-text-inverse); }
4630
4617
 
4631
4618
  .chorus-button--icon:hover,
4632
4619
  .chorus-button--icon[data-force-state="hovered"] {
@@ -4640,9 +4627,8 @@ a.chorus-metadata__name:focus-visible {
4640
4627
 
4641
4628
  .chorus-button--icon:focus-visible,
4642
4629
  .chorus-button--icon[data-force-state="focused"] {
4643
- outline: var(--sys-borderWidth-thin) solid var(--sys-color-focus);
4644
- outline-offset: calc(-1 * var(--sys-borderWidth-thin));
4645
- box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-focusInset);
4630
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
4631
+ outline-offset: calc(-1 * var(--sys-borderWidth-hairline));
4646
4632
  }
4647
4633
 
4648
4634
  .chorus-button--icon[data-force-state="focused"] {
@@ -4684,7 +4670,7 @@ a.chorus-metadata__name:focus-visible {
4684
4670
  density. Renders as <a> when `href` is given, <button> otherwise. */
4685
4671
  .chorus-button--text {
4686
4672
  /* Per-size plumbing — appearance + size modifiers override these. */
4687
- --button-text-label: var(--sys-color-onSurfaceVariant);
4673
+ --button-text-label: var(--sys-color-text-subtle);
4688
4674
  --button-text-min-height: var(--ref-space-500);
4689
4675
  --button-text-padding-block: var(--sys-layout-container-xs);
4690
4676
  --button-text-padding-inline: var(--sys-layout-container-xs);
@@ -4736,10 +4722,10 @@ a.chorus-metadata__name:focus-visible {
4736
4722
  `inverse` swaps the label to the inverse cluster so a Text Button
4737
4723
  inside a Toast / coach-mark / snackbar reads against the host's
4738
4724
  `inverseSurface` fill without a per-host tweak. */
4739
- .chorus-button--text--appearance-default { --button-text-label: var(--sys-color-onSurfaceVariant); }
4740
- .chorus-button--text--appearance-accent { --button-text-label: var(--sys-color-primary); }
4741
- .chorus-button--text--appearance-onPrimary { --button-text-label: var(--sys-color-onPrimary); }
4742
- .chorus-button--text--appearance-inverse { --button-text-label: var(--sys-color-inverseOnSurface); }
4725
+ .chorus-button--text--appearance-default { --button-text-label: var(--sys-color-text-subtle); }
4726
+ .chorus-button--text--appearance-accent { --button-text-label: var(--sys-color-text-accent-blue); }
4727
+ .chorus-button--text--appearance-onPrimary { --button-text-label: var(--sys-color-text-onFill); }
4728
+ .chorus-button--text--appearance-inverse { --button-text-label: var(--sys-color-text-inverse); }
4743
4729
 
4744
4730
  /* Size modifiers — pair min-height + padding + typo + icon footprint. */
4745
4731
  .chorus-button--text--size-medium {
@@ -4809,9 +4795,8 @@ a.chorus-metadata__name:focus-visible {
4809
4795
 
4810
4796
  .chorus-button--text:focus-visible,
4811
4797
  .chorus-button--text[data-force-state="focused"] {
4812
- outline: var(--sys-borderWidth-thin) solid var(--sys-color-focus);
4813
- outline-offset: calc(-1 * var(--sys-borderWidth-thin));
4814
- box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-focusInset);
4798
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
4799
+ outline-offset: calc(-1 * var(--sys-borderWidth-hairline));
4815
4800
  }
4816
4801
 
4817
4802
  .chorus-button--text[data-force-state="focused"] {
@@ -4835,7 +4820,7 @@ a.chorus-metadata__name:focus-visible {
4835
4820
  layout edges. */
4836
4821
  .chorus-button--check {
4837
4822
  /* Per-size plumbing. */
4838
- --button-check-label: var(--sys-color-onSurfaceVariant);
4823
+ --button-check-label: var(--sys-color-text-subtle);
4839
4824
  --button-check-min-height: var(--ref-space-500);
4840
4825
  --button-check-padding-block: var(--sys-layout-container-xs);
4841
4826
  --button-check-padding-inline: var(--sys-layout-container-xs);
@@ -4872,9 +4857,18 @@ a.chorus-metadata__name:focus-visible {
4872
4857
  transition: background 120ms ease;
4873
4858
  }
4874
4859
 
4875
- .chorus-button--check--appearance-default { --button-check-label: var(--sys-color-onSurfaceVariant); }
4876
- .chorus-button--check--appearance-accent { --button-check-label: var(--sys-color-primary); }
4877
- .chorus-button--check--appearance-inverse { --button-check-label: var(--sys-color-inverseOnSurface); }
4860
+ .chorus-button--check--appearance-default { --button-check-label: var(--sys-color-text-subtle); }
4861
+ .chorus-button--check--appearance-accent { --button-check-label: var(--sys-color-text-accent-blue); }
4862
+ .chorus-button--check--appearance-inverse { --button-check-label: var(--sys-color-text-inverse); }
4863
+
4864
+ /* Standard checkbox glyph paints in `icon.default` — the selection-control
4865
+ family's neutral glyph tone (selection is shown by the outline↔fill glyph
4866
+ swap, not color), while the label keeps its quieter `text.subtle`. The
4867
+ accent / inverse appearances intentionally tint the glyph with their label
4868
+ color via `currentColor`, so this only re-tones the default appearance. */
4869
+ .chorus-button--check--appearance-default .chorus-button--check__checkbox {
4870
+ color: var(--sys-color-icon-default);
4871
+ }
4878
4872
 
4879
4873
  /* Two sizes — the checkbox footprint is the size differentiator, not the
4880
4874
  label. Both rungs share `sys.typo.label.sm` (12-rank); medium pairs it
@@ -4946,9 +4940,8 @@ a.chorus-metadata__name:focus-visible {
4946
4940
 
4947
4941
  .chorus-button--check:focus-visible,
4948
4942
  .chorus-button--check[data-force-state="focused"] {
4949
- outline: var(--sys-borderWidth-thin) solid var(--sys-color-focus);
4950
- outline-offset: calc(-1 * var(--sys-borderWidth-thin));
4951
- box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-focusInset);
4943
+ outline: var(--sys-borderWidth-hairline) solid var(--sys-color-border-focused);
4944
+ outline-offset: calc(-1 * var(--sys-borderWidth-hairline));
4952
4945
  }
4953
4946
 
4954
4947
  .chorus-button--check[data-force-state="focused"] {
@@ -4990,13 +4983,13 @@ a.chorus-metadata__name:focus-visible {
4990
4983
  its original 56-tall footprint. Inline padding stays 0 — tab
4991
4984
  items are equal-width and span the full row. */
4992
4985
  padding: 0 0 env(safe-area-inset-bottom, 0px);
4993
- background: var(--sys-color-surface);
4994
- color: var(--sys-color-onSurface);
4986
+ background: var(--sys-color-surface-default);
4987
+ color: var(--sys-color-text-default);
4995
4988
  /* Top hairline divider — separates the bar from the scrolling content
4996
4989
  above it without introducing a layout border that could nudge the
4997
4990
  56-tall row off-pixel. Painted as an inset shadow so the bar's flex
4998
4991
  geometry is untouched. */
4999
- box-shadow: inset 0 var(--sys-borderWidth-hairline) 0 0 var(--sys-color-outlineVariant);
4992
+ box-shadow: inset 0 var(--sys-borderWidth-hairline) 0 0 var(--sys-color-border-default);
5000
4993
  }
5001
4994
 
5002
4995
  .chorus-tab-bar__item {
@@ -5024,14 +5017,14 @@ a.chorus-metadata__name:focus-visible {
5024
5017
  margin: 0;
5025
5018
  font: inherit;
5026
5019
  text-decoration: none;
5027
- color: var(--sys-color-onSurfaceVariant);
5020
+ color: var(--sys-color-text-subtle);
5028
5021
  cursor: pointer;
5029
5022
  -webkit-tap-highlight-color: transparent;
5030
5023
  }
5031
5024
 
5032
5025
  .chorus-tab-bar__item[aria-current="page"].is-active,
5033
5026
  .chorus-tab-bar__item.is-active {
5034
- color: var(--sys-color-onSurface);
5027
+ color: var(--sys-color-text-default);
5035
5028
  }
5036
5029
 
5037
5030
  .chorus-tab-bar__icon {
@@ -5070,27 +5063,25 @@ a.chorus-metadata__name:focus-visible {
5070
5063
 
5071
5064
  .chorus-tab-bar__item:hover::before,
5072
5065
  .chorus-tab-bar__item[data-force-state="hovered"]::before {
5073
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-hover) * 100%), transparent);
5066
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-hover) * 100%), transparent);
5074
5067
  }
5075
5068
 
5076
5069
  .chorus-tab-bar__item:active::before,
5077
5070
  .chorus-tab-bar__item[data-force-state="pressed"]::before {
5078
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-pressed) * 100%), transparent);
5071
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-pressed) * 100%), transparent);
5079
5072
  }
5080
5073
 
5081
5074
  .chorus-tab-bar__item[data-force-state="focused"]::before {
5082
- background: color-mix(in srgb, var(--sys-color-onSurface) calc(var(--sys-state-focus) * 100%), transparent);
5075
+ background: color-mix(in srgb, var(--sys-color-text-default) calc(var(--sys-state-focus) * 100%), transparent);
5083
5076
  }
5084
5077
 
5085
5078
  /* Focus ring — three-layer composition rings the item flush at the
5086
5079
  slot edge. We can't ring outward (adjacent items are flush under
5087
5080
  `flex: 1 1 0`, so an outward stroke would overlap its neighbour),
5088
- so the standard composition is painted as `inset` shadows on the
5089
- ::after that covers the slot exactly. Layering reads from the slot
5090
- edge inward: `focus` (the 2px outer stroke) sits at the edge, then
5091
- `focusInset` (the 1px counter-ring) sits just inside — **focus
5092
- outer, inset inner**, never reversed. The ring is constrained
5093
- strictly inside the slot's bounding box. */
5081
+ so the standard composition is painted as an `inset` shadow on the
5082
+ ::after that covers the slot exactly: a single 1px `border.focused`
5083
+ ring at the slot edge, constrained strictly inside the slot's
5084
+ bounding box. */
5094
5085
  .chorus-tab-bar__item::after {
5095
5086
  content: '';
5096
5087
  position: absolute;
@@ -5104,9 +5095,7 @@ a.chorus-metadata__name:focus-visible {
5104
5095
 
5105
5096
  .chorus-tab-bar__item:focus-visible::after,
5106
5097
  .chorus-tab-bar__item[data-force-state="focused"]::after {
5107
- box-shadow:
5108
- inset 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-focus),
5109
- inset 0 0 0 calc(var(--sys-borderWidth-thin) + var(--sys-borderWidth-hairline)) var(--sys-color-focusInset);
5098
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-focused);
5110
5099
  }
5111
5100
 
5112
5101
  /* Label fills the item's slot up to its natural text width and
@@ -5118,10 +5107,10 @@ a.chorus-metadata__name:focus-visible {
5118
5107
  .chorus-tab-bar__label {
5119
5108
  max-width: 100%;
5120
5109
  font-family: var(--sys-typo-fontFamily-sans);
5121
- font-size: var(--sys-typo-caption-size);
5122
- line-height: var(--sys-typo-caption-line);
5123
- font-weight: var(--sys-typo-caption-weight);
5124
- letter-spacing: var(--sys-typo-caption-tracking);
5110
+ font-size: var(--sys-typo-label-xs-size);
5111
+ line-height: var(--sys-typo-label-xs-line);
5112
+ font-weight: var(--sys-typo-label-xs-weight);
5113
+ letter-spacing: var(--sys-typo-label-xs-tracking);
5125
5114
  color: currentColor;
5126
5115
  text-align: center;
5127
5116
  white-space: nowrap;
@@ -5132,7 +5121,7 @@ a.chorus-metadata__name:focus-visible {
5132
5121
  }
5133
5122
 
5134
5123
  /* Primary appearance — the "Create" / "Compose" commit affordance.
5135
- Paints the glyph in `sys.color.brand` (the editorial/brand accent
5124
+ Paints the glyph in `sys.color.text.brand` (the editorial/brand accent
5136
5125
  the system reserves for commit affordances that should read as the
5137
5126
  product's voice, not a generic call-to-action). Pair with a
5138
5127
  filled-tile icon (AddSquareFillIcon / ComposeFillIcon) so the
@@ -5143,11 +5132,11 @@ a.chorus-metadata__name:focus-visible {
5143
5132
  standard icon footprint so the row's optical alignment is
5144
5133
  unaffected. */
5145
5134
  .chorus-tab-bar__item--primary {
5146
- color: var(--sys-color-onSurfaceVariant);
5135
+ color: var(--sys-color-text-subtle);
5147
5136
  }
5148
5137
 
5149
5138
  .chorus-tab-bar__item--primary .chorus-tab-bar__icon {
5150
- color: var(--sys-color-brand);
5139
+ color: var(--sys-color-text-brand);
5151
5140
  }
5152
5141
 
5153
5142
  .chorus-tab-bar__item:focus-visible {
@@ -5156,7 +5145,9 @@ a.chorus-metadata__name:focus-visible {
5156
5145
 
5157
5146
  .chorus-tab-bar__item:disabled,
5158
5147
  .chorus-tab-bar__item[aria-disabled="true"] {
5159
- opacity: var(--sys-state-disabled);
5148
+ /* Explicit disabled (no opacity): item re-tones to text.disabled; icon
5149
+ and label ride currentColor so both follow. */
5150
+ color: var(--sys-color-text-disabled);
5160
5151
  cursor: not-allowed;
5161
5152
  pointer-events: none;
5162
5153
  }
@@ -5182,8 +5173,8 @@ a.chorus-metadata__name:focus-visible {
5182
5173
  max-width: min(400px, calc(100vw - 2 * var(--sys-layout-container-xs)));
5183
5174
  padding: var(--sys-layout-container-xs) var(--sys-layout-container-md);
5184
5175
  border-radius: var(--sys-radius-md);
5185
- background: var(--sys-color-inverseSurface);
5186
- color: var(--sys-color-inverseOnSurface);
5176
+ background: var(--sys-color-background-inverse);
5177
+ color: var(--sys-color-text-inverse);
5187
5178
  box-shadow: var(--sys-elevation-overlay);
5188
5179
  }
5189
5180
 
@@ -5265,16 +5256,16 @@ a.chorus-metadata__name:focus-visible {
5265
5256
  Pair the action button with `appearance="onPrimary"` (also
5266
5257
  theme-stable). */
5267
5258
  .chorus-tooltip--appearance-default {
5268
- background: var(--sys-color-primary);
5269
- color: var(--sys-color-onPrimary);
5259
+ background: var(--sys-color-background-primary);
5260
+ color: var(--sys-color-text-onFill);
5270
5261
  }
5271
5262
 
5272
5263
  /* Inverse — dark-cluster bubble for primary-heavy screens. Pair the
5273
5264
  action button with `appearance="inverse"` so the label flips with
5274
5265
  the host fill. */
5275
5266
  .chorus-tooltip--appearance-inverse {
5276
- background: var(--sys-color-inverseSurface);
5277
- color: var(--sys-color-inverseOnSurface);
5267
+ background: var(--sys-color-background-inverse);
5268
+ color: var(--sys-color-text-inverse);
5278
5269
  }
5279
5270
 
5280
5271
  .chorus-tooltip__body {
@@ -5372,8 +5363,8 @@ a.chorus-metadata__name:focus-visible {
5372
5363
  }
5373
5364
 
5374
5365
  .chorus-bubble {
5375
- --bubble-fill: var(--sys-color-primary);
5376
- --bubble-ink: var(--sys-color-onPrimary);
5366
+ --bubble-fill: var(--sys-color-background-primary);
5367
+ --bubble-ink: var(--sys-color-text-onFill);
5377
5368
 
5378
5369
  position: relative;
5379
5370
  display: inline-flex;
@@ -5393,10 +5384,10 @@ a.chorus-metadata__name:focus-visible {
5393
5384
  border-radius: var(--sys-radius-full);
5394
5385
  background: var(--bubble-fill);
5395
5386
  color: var(--bubble-ink);
5396
- font-size: var(--sys-typo-caption-size);
5397
- font-weight: var(--sys-typo-caption-weight);
5398
- line-height: var(--sys-typo-caption-line);
5399
- letter-spacing: var(--sys-typo-caption-tracking);
5387
+ font-size: var(--sys-typo-label-xs-size);
5388
+ font-weight: var(--sys-typo-label-xs-weight);
5389
+ line-height: var(--sys-typo-label-xs-line);
5390
+ letter-spacing: var(--sys-typo-label-xs-tracking);
5400
5391
  }
5401
5392
 
5402
5393
  /* Single-line body. `min-width: 0` is the standard flex-truncation
@@ -5461,7 +5452,7 @@ a.chorus-metadata__name:focus-visible {
5461
5452
  /* One 6px dot per page in an inline.sm row. An inline element —
5462
5453
  inline-flex, intrinsic width (no stretch, no self-centering); the
5463
5454
  host owns horizontal placement. Active dot paints `onSurface`, the
5464
- rest `outlineVariant`. Non-interactive (`aria-hidden` on the root) —
5455
+ rest `border.default`. Non-interactive (`aria-hidden` on the root) —
5465
5456
  the host pager owns the active index and keyboard reach.
5466
5457
  See schema/components/pagination/pagination.md. */
5467
5458
 
@@ -5475,23 +5466,22 @@ a.chorus-metadata__name:focus-visible {
5475
5466
  width: var(--ref-space-75);
5476
5467
  height: var(--ref-space-75);
5477
5468
  border-radius: var(--sys-radius-full);
5478
- background: var(--sys-color-outlineVariant);
5469
+ background: var(--sys-color-border-default);
5479
5470
  display: block;
5480
5471
  }
5481
5472
 
5482
5473
  .chorus-pagination__dot--active {
5483
- background: var(--sys-color-onSurface);
5474
+ background: var(--sys-color-text-default);
5484
5475
  }
5485
5476
 
5486
5477
  /* ============================================================
5487
5478
  Progress — linear progress bar (determinate)
5488
5479
  ============================================================ */
5489
- /* Single visual rung — 8px tall, radius.full. Track paints with
5490
- `sys.color.scrimSubtle` (the Banner-style inverse-tone scrim black
5491
- 8% in light, white 8% in dark) so the bar reads cleanly on any host
5492
- surface tier rather than colliding with a fixed surface-container
5493
- step. Indicator paints in `inverseSurface` so the filled segment
5494
- always contrasts against the bare-track scrim regardless of theme.
5480
+ /* Single visual rung — 8px tall, radius.full. Track paints with the
5481
+ solid `background.neutral` fill (the role that replaced the old
5482
+ Banner-style ~8% scrim) a light-gray track in light, a mid-gray in
5483
+ dark. Indicator paints in `inverseSurface` so the filled segment
5484
+ always contrasts against the bare track regardless of theme.
5495
5485
  The indicator's `translateX` parks at `-100 + percent`% so the
5496
5486
  trailing edge sits at the value's ratio; transitions over 200ms so
5497
5487
  jumps animate. */
@@ -5502,7 +5492,7 @@ a.chorus-metadata__name:focus-visible {
5502
5492
  width: 100%;
5503
5493
  height: var(--sys-layout-container-xs);
5504
5494
  overflow: hidden;
5505
- background: var(--sys-color-scrimSubtle);
5495
+ background: var(--sys-color-background-neutral);
5506
5496
  border-radius: var(--sys-radius-full);
5507
5497
  flex: 1 1 auto;
5508
5498
  }
@@ -5512,7 +5502,7 @@ a.chorus-metadata__name:focus-visible {
5512
5502
  position: absolute;
5513
5503
  inset: 0;
5514
5504
  width: 100%;
5515
- background: var(--sys-color-inverseSurface);
5505
+ background: var(--sys-color-background-inverse);
5516
5506
  border-radius: inherit;
5517
5507
  transform: translateX(-100%);
5518
5508
  transition: transform 200ms ease-out;
@@ -5549,32 +5539,30 @@ a.chorus-metadata__name:focus-visible {
5549
5539
  }
5550
5540
 
5551
5541
  /* Neutral — the quiet informational default. Background paints with
5552
- `sys.color.scrimSubtle` a translucent inverse-tone scrim (~8%
5553
- black light, ~8% white dark) so the pill stays a faint overlay on
5554
- the host surface rather than picking up the same tone as a
5555
- surface-* container. Same Banner-style fill used by Chip / Tag
5556
- default, Progress track, and Skeleton. Foreground stays bound to
5557
- `onSurfaceVariant` so legibility tracks the active palette
5558
- automatically. */
5542
+ the solid `background.neutral` fill (the role that replaced the old
5543
+ ~8% scrim) a light-gray pill in light, a mid-gray in dark. Same
5544
+ neutral fill used by Banner / Chip / Tag default, Progress track,
5545
+ and Skeleton. Foreground stays bound to `text.subtle` so legibility
5546
+ tracks the active palette automatically. */
5559
5547
  .chorus-status-tag--neutral {
5560
- background: var(--sys-color-scrimSubtle);
5561
- color: var(--sys-color-onSurfaceVariant);
5548
+ background: var(--sys-color-background-neutral);
5549
+ color: var(--sys-color-text-subtle);
5562
5550
  }
5563
5551
 
5564
5552
  .chorus-status-tag--error {
5565
- background: var(--sys-color-errorContainer);
5566
- color: var(--sys-color-onErrorContainer);
5553
+ background: var(--sys-color-background-danger);
5554
+ color: var(--sys-color-text-danger);
5567
5555
  }
5568
5556
 
5569
5557
  /* ============================================================
5570
5558
  Skeleton — tonal loading placeholder with opacity pulse
5571
5559
  ============================================================ */
5572
- /* Translucent inverse-tone scrim (`sys.color.scrimSubtle` black 8%
5573
- in light mode, white 8% in dark) painted with a slow opacity pulse
5574
- (0.5 → 1 → 0.5, 1.6s `ease-in-out`). The same Banner-style fill used
5575
- by Chip / Tag default, Progress track, and StatusTag neutral stays
5576
- visible on every host surface tier without colliding with a fixed
5577
- neutral step. Three shapes select the default footprint and corner
5560
+ /* Solid `background.neutral` fill (the role that replaced the old ~8%
5561
+ scrim) a light-gray placeholder in light, a mid-gray in dark
5562
+ painted with a slow opacity pulse (0.5 → 1 → 0.5, 1.6s
5563
+ `ease-in-out`). The same neutral fill used by Banner / Chip / Tag
5564
+ default, Progress track, and StatusTag neutral. Three shapes select
5565
+ the default footprint and corner
5578
5566
  radius. The pulse animates `opacity` only — no gradient sweep — so
5579
5567
  the placeholder reads as anonymous chrome and degrades cleanly under
5580
5568
  `prefers-reduced-motion: reduce`. */
@@ -5585,7 +5573,7 @@ a.chorus-metadata__name:focus-visible {
5585
5573
 
5586
5574
  .chorus-skeleton {
5587
5575
  display: block;
5588
- background: var(--sys-color-scrimSubtle);
5576
+ background: var(--sys-color-background-neutral);
5589
5577
  animation: chorus-skeleton-pulse 1.6s ease-in-out infinite;
5590
5578
  }
5591
5579
 
@@ -5625,9 +5613,9 @@ a.chorus-metadata__name:focus-visible {
5625
5613
  Spinner — indeterminate rotating-arc loading indicator
5626
5614
  ============================================================ */
5627
5615
  /* A rotating ring for short, progress-unknown waits (< ~1s) on a
5628
- neutral host surface. The arc paints `sys.color.primary` as the
5629
- foreground motion over a faint `sys.color.scrimSubtle` track ring
5630
- (inverse-tone ~8% tint) so the rotation reads on any surface tier.
5616
+ neutral host surface. The arc paints `background.primary` as the
5617
+ foreground motion over a solid `background.neutral` track ring (the
5618
+ role that replaced the old ~8% scrim) so the rotation reads clearly.
5631
5619
  The ring is drawn with a conic gradient masked to an annulus — no
5632
5620
  `border:` (per the no-layout-strokes rule). Diameter rides the
5633
5621
  icon.* ladder via the `--spinner-diameter` plumbing var (sys.icon.lg
@@ -5652,7 +5640,7 @@ a.chorus-metadata__name:focus-visible {
5652
5640
  border-radius: var(--sys-radius-full);
5653
5641
  /* Foreground arc sweeps from primary to transparent over the track. */
5654
5642
  background:
5655
- conic-gradient(var(--sys-color-primary), color-mix(in srgb, var(--sys-color-primary) 0%, transparent) 75%, color-mix(in srgb, var(--sys-color-primary) 0%, transparent));
5643
+ conic-gradient(var(--sys-color-background-primary), color-mix(in srgb, var(--sys-color-background-primary) 0%, transparent) 75%, color-mix(in srgb, var(--sys-color-background-primary) 0%, transparent));
5656
5644
  /* Annulus mask: punch out the centre so it reads as a ring, 2px thick.
5657
5645
  The mask fill is alpha-only — the opaque keep-region of the mask is
5658
5646
  not a design color, so it is not a token binding. */
@@ -5670,7 +5658,7 @@ a.chorus-metadata__name:focus-visible {
5670
5658
  position: absolute;
5671
5659
  inset: 0;
5672
5660
  border-radius: inherit;
5673
- box-shadow: inset 0 0 0 2px var(--sys-color-scrimSubtle);
5661
+ box-shadow: inset 0 0 0 2px var(--sys-color-background-neutral);
5674
5662
  }
5675
5663
 
5676
5664
  .chorus-spinner__arc {
@@ -5678,7 +5666,7 @@ a.chorus-metadata__name:focus-visible {
5678
5666
  }
5679
5667
 
5680
5668
  .chorus-spinner__label {
5681
- color: var(--sys-color-onSurfaceVariant);
5669
+ color: var(--sys-color-text-subtle);
5682
5670
  }
5683
5671
 
5684
5672
  @media (prefers-reduced-motion: reduce) {
@@ -5690,21 +5678,21 @@ a.chorus-metadata__name:focus-visible {
5690
5678
  /* ============================================================
5691
5679
  Switch — binary active/inactive pill with translating thumb
5692
5680
  ============================================================ */
5693
- /* 52 × 32 pill track + 28 × 28 thumb. Inactive paints a `scrimSubtle`
5694
- track (inverse-tone ~8% tint) with a hairline outline and a fixed-white
5681
+ /* 52 × 32 pill track + 28 × 28 thumb. Inactive paints a solid
5682
+ `background.neutral` track with a hairline outline and a fixed-white
5695
5683
  thumb; active paints `primary` track with no outline. Thumb translates 20px between
5696
5684
  the two ends. Whole track is the click target — the thumb is
5697
5685
  decorative. Outward focus ring matches Switch's "stands inline with
5698
5686
  whitespace around it" placement; the rest stroke stays a no-layout
5699
5687
  inset box-shadow. */
5700
5688
  .chorus-switch {
5701
- /* Inactive (resting) — `scrimSubtle` track (inverse-tone ~8% tint:
5702
- black in light, white in dark) so the track stays distinct on any
5703
- host surface tier, reinforced by the hairline outline, with a
5704
- fixed-white thumb that reads the same in light and dark. The active
5705
- selector below overrides for the on-state. */
5706
- --switch-track-bg: var(--sys-color-scrimSubtle);
5707
- --switch-track-outline: var(--sys-color-outlineVariant);
5689
+ /* Inactive (resting) — `icon.subtlest` track: the off state of the
5690
+ selection-control family, a mid-neutral that reads clearly on any host
5691
+ surface, reinforced by the hairline outline, with a fixed-white thumb
5692
+ that reads the same in light and dark. The active selector below
5693
+ overrides for the on-state. */
5694
+ --switch-track-bg: var(--sys-color-icon-subtlest);
5695
+ --switch-track-outline: var(--sys-color-border-default);
5708
5696
  --switch-thumb-bg: var(--ref-palette-white-1000);
5709
5697
  --switch-thumb-offset: 0px;
5710
5698
 
@@ -5743,20 +5731,20 @@ a.chorus-metadata__name:focus-visible {
5743
5731
  transform 120ms ease-out;
5744
5732
  }
5745
5733
 
5746
- /* Active — `primary` track, `onPrimary` thumb, outline disappears so the
5747
- filled track reads as one solid block. Thumb translates to the
5734
+ /* Active — `icon.accent.blue` track, `onFill` thumb, outline disappears so
5735
+ the filled track reads as one solid block. Thumb translates to the
5748
5736
  trailing end (52 - 28 - 2*2 = 20). */
5749
5737
  .chorus-switch[data-state='active'] {
5750
- --switch-track-bg: var(--sys-color-primary);
5738
+ --switch-track-bg: var(--sys-color-icon-accent-blue-default);
5751
5739
  --switch-track-outline: transparent;
5752
- --switch-thumb-bg: var(--sys-color-onPrimary);
5740
+ --switch-thumb-bg: var(--sys-color-text-onFill);
5753
5741
  --switch-thumb-offset: 20px;
5754
5742
  }
5755
5743
 
5756
5744
  .chorus-switch:hover {
5757
5745
  background: color-mix(
5758
5746
  in srgb,
5759
- var(--sys-color-onSurface) calc(var(--sys-state-hover) * 100%),
5747
+ var(--sys-color-text-default) calc(var(--sys-state-hover) * 100%),
5760
5748
  var(--switch-track-bg)
5761
5749
  );
5762
5750
  }
@@ -5765,7 +5753,7 @@ a.chorus-metadata__name:focus-visible {
5765
5753
  .chorus-switch[data-force-state='pressed'] {
5766
5754
  background: color-mix(
5767
5755
  in srgb,
5768
- var(--sys-color-onSurface) calc(var(--sys-state-pressed) * 100%),
5756
+ var(--sys-color-text-default) calc(var(--sys-state-pressed) * 100%),
5769
5757
  var(--switch-track-bg)
5770
5758
  );
5771
5759
  }
@@ -5790,14 +5778,16 @@ a.chorus-metadata__name:focus-visible {
5790
5778
 
5791
5779
  .chorus-switch:focus-visible::after,
5792
5780
  .chorus-switch[data-force-state='focused']::after {
5793
- box-shadow:
5794
- 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-focus),
5795
- 0 0 0 calc(var(--sys-borderWidth-thin) + var(--sys-borderWidth-hairline)) var(--sys-color-focusInset);
5781
+ box-shadow: 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-focused);
5796
5782
  }
5797
5783
 
5798
5784
  .chorus-switch:disabled,
5799
5785
  .chorus-switch[data-disabled='true'] {
5800
- opacity: var(--sys-state-disabled);
5786
+ /* Explicit disabled (no opacity): the track re-tones to the neutral
5787
+ disabled fill with a bold edge, overriding the active/inactive track
5788
+ set above — this rule wins on source order. Thumb stays put. */
5789
+ --switch-track-bg: var(--sys-color-icon-disabled);
5790
+ --switch-track-outline: var(--sys-color-border-bold);
5801
5791
  cursor: not-allowed;
5802
5792
  pointer-events: none;
5803
5793
  }
@@ -5806,7 +5796,7 @@ a.chorus-metadata__name:focus-visible {
5806
5796
  Accordion — stack of expandable rows with rotating chevron
5807
5797
  ============================================================ */
5808
5798
  /* Edge-to-edge (`full-bleed`) family. Rows tile flush with a hairline
5809
- `outlineVariant` divider inset 16px (`layout.container.md`) on BOTH
5799
+ `border.default` divider inset 16px (`layout.container.md`) on BOTH
5810
5800
  the leading and trailing edges so the rule reads as separating row
5811
5801
  *content*, not the container. Composes the divider on a dedicated
5812
5802
  `::after` overlay rather than a `border:` / full-bleed box-shadow so
@@ -5831,7 +5821,7 @@ a.chorus-metadata__name:focus-visible {
5831
5821
  right: var(--sys-layout-container-md);
5832
5822
  bottom: 0;
5833
5823
  height: var(--sys-borderWidth-hairline);
5834
- background: var(--sys-color-outlineVariant);
5824
+ background: var(--sys-color-border-default);
5835
5825
  pointer-events: none;
5836
5826
  }
5837
5827
 
@@ -5845,7 +5835,7 @@ a.chorus-metadata__name:focus-visible {
5845
5835
  padding: var(--sys-layout-container-xs) var(--sys-layout-container-md);
5846
5836
  border: 0;
5847
5837
  background: transparent;
5848
- color: var(--sys-color-onSurface);
5838
+ color: var(--sys-color-text-default);
5849
5839
  text-align: left;
5850
5840
  cursor: pointer;
5851
5841
  position: relative;
@@ -5863,7 +5853,7 @@ a.chorus-metadata__name:focus-visible {
5863
5853
  line-height: var(--sys-typo-body-md-line);
5864
5854
  font-weight: var(--sys-typo-body-md-weight);
5865
5855
  letter-spacing: var(--sys-typo-body-md-tracking);
5866
- color: var(--sys-color-onSurface);
5856
+ color: var(--sys-color-text-default);
5867
5857
  }
5868
5858
 
5869
5859
  .chorus-accordion__chevron {
@@ -5873,7 +5863,7 @@ a.chorus-metadata__name:focus-visible {
5873
5863
  justify-content: center;
5874
5864
  width: var(--sys-icon-md);
5875
5865
  height: var(--sys-icon-md);
5876
- color: var(--sys-color-onSurfaceVariant);
5866
+ color: var(--sys-color-text-subtle);
5877
5867
  transition: transform 120ms ease-out;
5878
5868
  }
5879
5869
 
@@ -5884,7 +5874,7 @@ a.chorus-metadata__name:focus-visible {
5884
5874
  .chorus-accordion__trigger:hover {
5885
5875
  background: color-mix(
5886
5876
  in srgb,
5887
- var(--sys-color-onSurface) calc(var(--sys-state-hover) * 100%),
5877
+ var(--sys-color-text-default) calc(var(--sys-state-hover) * 100%),
5888
5878
  transparent
5889
5879
  );
5890
5880
  }
@@ -5893,7 +5883,7 @@ a.chorus-metadata__name:focus-visible {
5893
5883
  .chorus-accordion__trigger[data-force-state='pressed'] {
5894
5884
  background: color-mix(
5895
5885
  in srgb,
5896
- var(--sys-color-onSurface) calc(var(--sys-state-pressed) * 100%),
5886
+ var(--sys-color-text-default) calc(var(--sys-state-pressed) * 100%),
5897
5887
  transparent
5898
5888
  );
5899
5889
  }
@@ -5917,17 +5907,26 @@ a.chorus-metadata__name:focus-visible {
5917
5907
 
5918
5908
  .chorus-accordion__trigger:focus-visible::before,
5919
5909
  .chorus-accordion__trigger[data-force-state='focused']::before {
5920
- box-shadow:
5921
- inset 0 0 0 var(--sys-borderWidth-thin) var(--sys-color-focus),
5922
- inset 0 0 0 calc(var(--sys-borderWidth-thin) + var(--sys-borderWidth-hairline)) var(--sys-color-focusInset);
5910
+ box-shadow: inset 0 0 0 var(--sys-borderWidth-hairline) var(--sys-color-border-focused);
5923
5911
  }
5924
5912
 
5925
5913
  .chorus-accordion__trigger:disabled,
5926
5914
  .chorus-accordion__item[data-disabled='true'] {
5927
- opacity: var(--sys-state-disabled);
5928
5915
  cursor: not-allowed;
5929
5916
  }
5930
5917
 
5918
+ /* Explicit disabled (no opacity): trigger label re-tones to text.disabled,
5919
+ chevron glyph to icon.disabled. */
5920
+ .chorus-accordion__trigger:disabled,
5921
+ .chorus-accordion__item[data-disabled='true'] .chorus-accordion__trigger,
5922
+ .chorus-accordion__item[data-disabled='true'] .chorus-accordion__label {
5923
+ color: var(--sys-color-text-disabled);
5924
+ }
5925
+
5926
+ .chorus-accordion__item[data-disabled='true'] .chorus-accordion__chevron {
5927
+ color: var(--sys-color-icon-disabled);
5928
+ }
5929
+
5931
5930
  .chorus-accordion__item[data-disabled='true'] .chorus-accordion__trigger {
5932
5931
  pointer-events: none;
5933
5932
  }
@@ -5948,7 +5947,7 @@ a.chorus-metadata__name:focus-visible {
5948
5947
  sub-list stretches flush to the accordion's right edge without
5949
5948
  a double-paid gutter.
5950
5949
 
5951
- Mode (b) also paints a hairline `outlineVariant` top group-divider
5950
+ Mode (b) also paints a hairline `border.default` top group-divider
5952
5951
  via a `::before` overlay (no-layout stroke — a `border-top:` on the
5953
5952
  child container would reflow the first row's box and break its
5954
5953
  inward focus ring). The 16px inline inset mirrors the inter-item
@@ -5985,7 +5984,7 @@ a.chorus-metadata__name:focus-visible {
5985
5984
  right: var(--sys-layout-container-md);
5986
5985
  top: 0;
5987
5986
  height: var(--sys-borderWidth-hairline);
5988
- background: var(--sys-color-outlineVariant);
5987
+ background: var(--sys-color-border-default);
5989
5988
  pointer-events: none;
5990
5989
  }
5991
5990
 
@@ -6027,7 +6026,7 @@ a.chorus-metadata__name:focus-visible {
6027
6026
  line-height: var(--sys-typo-body-sm-line);
6028
6027
  font-weight: var(--sys-typo-body-sm-weight);
6029
6028
  letter-spacing: var(--sys-typo-body-sm-tracking);
6030
- color: var(--sys-color-onSurfaceVariant);
6029
+ color: var(--sys-color-text-subtle);
6031
6030
  }
6032
6031
 
6033
6032
  @media (prefers-reduced-motion: reduce) {