@titan-design/react-ui 0.13.0 → 0.14.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 (146) hide show
  1. package/README.md +14 -0
  2. package/dist/bodymap.js +129 -76
  3. package/dist/bodymap.js.map +1 -1
  4. package/dist/bodymap.mjs +129 -76
  5. package/dist/bodymap.mjs.map +1 -1
  6. package/dist/index.d.mts +117 -26
  7. package/dist/index.d.ts +117 -26
  8. package/dist/index.js +677 -450
  9. package/dist/index.js.map +1 -1
  10. package/dist/index.mjs +673 -451
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/{pages-_3Ajpiqu.d.ts → pages-CsjsUn0G.d.ts} +30 -13
  13. package/dist/{pages-CpW3OB3g.d.mts → pages-ZbT_pD_U.d.mts} +30 -13
  14. package/dist/pages.d.mts +1 -1
  15. package/dist/pages.d.ts +1 -1
  16. package/dist/pages.js +676 -701
  17. package/dist/pages.js.map +1 -1
  18. package/dist/pages.mjs +676 -701
  19. package/dist/pages.mjs.map +1 -1
  20. package/dist/theme/index.d.mts +31 -7
  21. package/dist/theme/index.d.ts +31 -7
  22. package/dist/theme/index.js +84 -20
  23. package/dist/theme/index.js.map +1 -1
  24. package/dist/theme/index.mjs +83 -21
  25. package/dist/theme/index.mjs.map +1 -1
  26. package/dist/theme/tokens-css.js +84 -20
  27. package/dist/theme/tokens-css.js.map +1 -1
  28. package/dist/theme/tokens-css.mjs +84 -20
  29. package/dist/theme/tokens-css.mjs.map +1 -1
  30. package/dist/theme/tokens.d.mts +56 -7
  31. package/dist/theme/tokens.d.ts +56 -7
  32. package/dist/theme/tokens.js +72 -20
  33. package/dist/theme/tokens.js.map +1 -1
  34. package/dist/theme/tokens.mjs +71 -21
  35. package/dist/theme/tokens.mjs.map +1 -1
  36. package/docs/render-testing-pattern.md +130 -0
  37. package/package.json +1 -1
  38. package/src/arch/Architecture.stories.tsx +3 -1
  39. package/src/arch/arch-graph.json +74 -72
  40. package/src/components/custom/ActiveWork/InitiativeBrief.tsx +2 -1
  41. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +8 -3
  42. package/src/components/custom/EmptyState/EmptyState.stories.tsx +1 -1
  43. package/src/components/custom/Gauge/Gauge.stories.tsx +4 -1
  44. package/src/components/custom/Gauge/Gauge.tsx +3 -1
  45. package/src/components/custom/Scatter/Scatter.stories.tsx +10 -7
  46. package/src/components/custom/Scatter/Scatter.tsx +6 -4
  47. package/src/components/custom/Sidebar/Sidebar.stories.tsx +1 -1
  48. package/src/components/custom/Table/Table.stories.tsx +1 -1
  49. package/src/components/custom/Table/Table.tsx +2 -2
  50. package/src/components/custom/Treemap/Treemap.stories.tsx +13 -10
  51. package/src/components/custom/Treemap/Treemap.tsx +4 -1
  52. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +2 -1
  53. package/src/components/custom/Workout/BaseBadge.stories.tsx +11 -7
  54. package/src/components/custom/Workout/BaseBadge.tsx +3 -2
  55. package/src/components/custom/Workout/BodyMap.tsx +5 -3
  56. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +13 -3
  57. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +5 -3
  58. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +2 -1
  59. package/src/components/custom/Workout/CapacityBandChart.tsx +5 -3
  60. package/src/components/custom/Workout/DeviationBar.test.tsx +5 -2
  61. package/src/components/custom/Workout/DeviationBar.tsx +5 -2
  62. package/src/components/custom/Workout/DualVelocityStrip.stories.tsx +7 -6
  63. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +29 -16
  64. package/src/components/custom/Workout/ExerciseCard.stories.tsx +8 -8
  65. package/src/components/custom/Workout/ExerciseCard.test.tsx +39 -19
  66. package/src/components/custom/Workout/ExerciseCard.tsx +92 -167
  67. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +89 -6
  68. package/src/components/custom/Workout/ExerciseCardHeading.test.tsx +189 -1
  69. package/src/components/custom/Workout/ExerciseCardHeading.tsx +167 -18
  70. package/src/components/custom/Workout/ExerciseDetailPage.tsx +3 -2
  71. package/src/components/custom/Workout/ExerciseHeading.tsx +192 -47
  72. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +6 -5
  73. package/src/components/custom/Workout/InputBar.tsx +4 -2
  74. package/src/components/custom/Workout/IntensityBar.tsx +4 -1
  75. package/src/components/custom/Workout/MesoCard.tsx +2 -1
  76. package/src/components/custom/Workout/MesoStatusCard.tsx +11 -10
  77. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +8 -3
  78. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +12 -2
  79. package/src/components/custom/Workout/README.md +58 -12
  80. package/src/components/custom/Workout/ReadinessCheck.tsx +4 -2
  81. package/src/components/custom/Workout/RestTimer.stories.tsx +13 -2
  82. package/src/components/custom/Workout/RestTimer.tsx +4 -2
  83. package/src/components/custom/Workout/SegmentedBar.stories.tsx +16 -12
  84. package/src/components/custom/Workout/SegmentedBar.tsx +4 -3
  85. package/src/components/custom/Workout/SetStrip.stories.tsx +3 -2
  86. package/src/components/custom/Workout/SetsRepsLoad.tsx +23 -9
  87. package/src/components/custom/Workout/Sparkline.stories.tsx +13 -10
  88. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +2 -1
  89. package/src/components/custom/Workout/StrengthTrendChart.tsx +8 -6
  90. package/src/components/custom/Workout/TempoDisplay.stories.tsx +4 -3
  91. package/src/components/custom/Workout/TempoDisplay.tsx +2 -0
  92. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +3 -2
  93. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +1 -1
  94. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +40 -0
  95. package/src/components/custom/Workout/VelocityStrip.test.tsx +48 -6
  96. package/src/components/custom/Workout/VelocityStrip.tsx +23 -14
  97. package/src/components/custom/Workout/ZoneTrack.stories.tsx +3 -1
  98. package/src/components/custom/Workout/exerciseRowState.ts +29 -0
  99. package/src/components/custom/Workout/index.ts +12 -2
  100. package/src/components/custom/Workout/metricText.stories.tsx +9 -8
  101. package/src/components/custom/Workout/metricText.tsx +4 -2
  102. package/src/components/custom/Workout/setHeadingKit.tsx +12 -10
  103. package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
  104. package/src/components/custom/charts/README.md +5 -0
  105. package/src/components/custom/charts/SetBarChart.test.tsx +16 -0
  106. package/src/components/custom/charts/SetBarChart.tsx +14 -5
  107. package/src/components/custom/charts/flatBarGeometry.test.ts +41 -0
  108. package/src/components/custom/charts/flatBarGeometry.ts +32 -0
  109. package/src/components/custom/stepper/Stepper.tsx +8 -6
  110. package/src/components/ui/alert/Alert.stories.tsx +14 -4
  111. package/src/components/ui/alert/Alert.tsx +24 -3
  112. package/src/components/ui/button/Button.tsx +12 -12
  113. package/src/components/ui/checkbox/Checkbox.tsx +2 -2
  114. package/src/components/ui/data-row/DataRow.stories.tsx +6 -2
  115. package/src/components/ui/drawer/Drawer.tsx +4 -1
  116. package/src/components/ui/icon-box/IconBox.tsx +8 -6
  117. package/src/components/ui/indicator/Indicator.stories.tsx +4 -3
  118. package/src/components/ui/list-item/ListItem.stories.tsx +7 -4
  119. package/src/components/ui/modal/Modal.tsx +2 -0
  120. package/src/components/ui/pill/Pill.stories.tsx +53 -0
  121. package/src/components/ui/pill/Pill.tsx +10 -6
  122. package/src/components/ui/popover/Popover.stories.tsx +1 -1
  123. package/src/components/ui/progress/Progress.tsx +9 -6
  124. package/src/components/ui/radio/Radio.tsx +1 -1
  125. package/src/components/ui/section/Section.stories.tsx +10 -10
  126. package/src/components/ui/select/Select.tsx +2 -1
  127. package/src/components/ui/spinner/Spinner.tsx +3 -1
  128. package/src/components/ui/stack/Stack.stories.tsx +7 -7
  129. package/src/components/ui/surface/Surface.stories.tsx +75 -28
  130. package/src/components/ui/switch/Switch.tsx +1 -1
  131. package/src/components/ui/tabs/Tabs.tsx +4 -2
  132. package/src/components/ui/toast/Toast.tsx +6 -4
  133. package/src/components/ui/toolbar-button/ToolbarButton.tsx +13 -6
  134. package/src/stories/PresetShowcase.stories.tsx +1 -1
  135. package/src/test/no-raw-color.test.ts +39 -0
  136. package/src/theme/Alpha.stories.tsx +103 -0
  137. package/src/theme/ProposedTokensVW82.stories.tsx +414 -0
  138. package/src/theme/config.ts +12 -0
  139. package/src/theme/global.css +15 -3
  140. package/src/theme/subtle-tone-weight.test.ts +163 -0
  141. package/src/theme/tailwind-var-opacity.test.ts +163 -0
  142. package/src/theme/tokens/primitives.ts +33 -0
  143. package/src/theme/tokens/semantic-hex-guard.test.ts +322 -0
  144. package/src/theme/tokens/semantic.ts +56 -20
  145. package/src/utils/colors.alpha-adoption.test.ts +408 -0
  146. package/tailwind.config.js +50 -9
@@ -61,6 +61,8 @@ declare const semanticColorsLight: {
61
61
  readonly 'brand-secondary-active': "#22465F";
62
62
  readonly 'on-brand-primary': "#FFFFFF";
63
63
  readonly 'on-brand-secondary': "#FFFFFF";
64
+ readonly 'on-brand-primary-subtle': "#FF7900";
65
+ readonly 'on-brand-secondary-subtle': "#307B9B";
64
66
  readonly 'status-success': "#2ED573";
65
67
  readonly 'status-success-light': "#58F69E";
66
68
  readonly 'status-success-dark': "#298732";
@@ -93,6 +95,10 @@ declare const semanticColorsLight: {
93
95
  readonly 'status-info-subtle': "#EFF8FF";
94
96
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
95
97
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
98
+ readonly 'on-status-success-subtle': "#2ED573";
99
+ readonly 'on-status-error-subtle': "#D14343";
100
+ readonly 'on-status-warning-subtle': "#F9B415";
101
+ readonly 'on-status-info-subtle': "#2196F3";
96
102
  readonly 'on-status-success': "#FFFFFF";
97
103
  readonly 'on-status-error': "#FFFFFF";
98
104
  readonly 'on-status-warning': "#FFFFFF";
@@ -166,13 +172,15 @@ declare const semanticColorsDark: {
166
172
  readonly 'brand-secondary': "#307B9B";
167
173
  readonly 'brand-secondary-light': "#2697B7";
168
174
  readonly 'brand-secondary-dark': "#2A617F";
169
- readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.12)";
175
+ readonly 'brand-secondary-subtle': "rgba(34, 211, 238, 0.12)";
170
176
  readonly 'brand-secondary-muted': "rgba(48, 123, 155, 0.30)";
171
177
  readonly 'brand-secondary-strong': "rgba(48, 123, 155, 0.50)";
172
178
  readonly 'brand-secondary-hover': "#2697B7";
173
179
  readonly 'brand-secondary-active': "#01B5D1";
174
180
  readonly 'on-brand-primary': "#FFFFFF";
175
181
  readonly 'on-brand-secondary': "#FFFFFF";
182
+ readonly 'on-brand-primary-subtle': "#FF7900";
183
+ readonly 'on-brand-secondary-subtle': "#22D3EE";
176
184
  readonly 'status-success': "#2ED573";
177
185
  readonly 'status-success-light': "#58F69E";
178
186
  readonly 'status-success-dark': "#298732";
@@ -184,7 +192,7 @@ declare const semanticColorsDark: {
184
192
  readonly 'status-error': "#D14343";
185
193
  readonly 'status-error-light': "#E05254";
186
194
  readonly 'status-error-dark': "#A4221C";
187
- readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
195
+ readonly 'status-error-subtle': "rgba(247, 113, 117, 0.08)";
188
196
  readonly 'status-error-muted': "rgba(209, 67, 67, 0.30)";
189
197
  readonly 'status-error-strong': "rgba(209, 67, 67, 0.50)";
190
198
  readonly 'status-error-vivid': "#FF4757";
@@ -202,13 +210,17 @@ declare const semanticColorsDark: {
202
210
  readonly 'status-info': "#2196F3";
203
211
  readonly 'status-info-light': "#78C2FF";
204
212
  readonly 'status-info-dark': "#1072CB";
205
- readonly 'status-info-subtle': "rgba(33, 150, 243, 0.12)";
213
+ readonly 'status-info-subtle': "rgba(120, 194, 255, 0.12)";
206
214
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
207
215
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
208
216
  readonly 'on-status-success': "#FFFFFF";
209
217
  readonly 'on-status-error': "#FFFFFF";
210
218
  readonly 'on-status-warning': "#FFFFFF";
211
219
  readonly 'on-status-info': "#FFFFFF";
220
+ readonly 'on-status-success-subtle': "#2ED573";
221
+ readonly 'on-status-error-subtle': "#F77175";
222
+ readonly 'on-status-warning-subtle': "#F9B415";
223
+ readonly 'on-status-info-subtle': "#78C2FF";
212
224
  readonly 'result-improve': "#4caf50";
213
225
  readonly 'result-improve-light': "rgba(76, 175, 80, 0.16)";
214
226
  readonly 'result-improve-dark': "#248a24";
@@ -385,6 +397,8 @@ declare function getSemanticColors(mode: ThemeMode): {
385
397
  readonly 'brand-secondary-active': "#22465F";
386
398
  readonly 'on-brand-primary': "#FFFFFF";
387
399
  readonly 'on-brand-secondary': "#FFFFFF";
400
+ readonly 'on-brand-primary-subtle': "#FF7900";
401
+ readonly 'on-brand-secondary-subtle': "#307B9B";
388
402
  readonly 'status-success': "#2ED573";
389
403
  readonly 'status-success-light': "#58F69E";
390
404
  readonly 'status-success-dark': "#298732";
@@ -417,6 +431,10 @@ declare function getSemanticColors(mode: ThemeMode): {
417
431
  readonly 'status-info-subtle': "#EFF8FF";
418
432
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
419
433
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
434
+ readonly 'on-status-success-subtle': "#2ED573";
435
+ readonly 'on-status-error-subtle': "#D14343";
436
+ readonly 'on-status-warning-subtle': "#F9B415";
437
+ readonly 'on-status-info-subtle': "#2196F3";
420
438
  readonly 'on-status-success': "#FFFFFF";
421
439
  readonly 'on-status-error': "#FFFFFF";
422
440
  readonly 'on-status-warning': "#FFFFFF";
@@ -489,13 +507,15 @@ declare function getSemanticColors(mode: ThemeMode): {
489
507
  readonly 'brand-secondary': "#307B9B";
490
508
  readonly 'brand-secondary-light': "#2697B7";
491
509
  readonly 'brand-secondary-dark': "#2A617F";
492
- readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.12)";
510
+ readonly 'brand-secondary-subtle': "rgba(34, 211, 238, 0.12)";
493
511
  readonly 'brand-secondary-muted': "rgba(48, 123, 155, 0.30)";
494
512
  readonly 'brand-secondary-strong': "rgba(48, 123, 155, 0.50)";
495
513
  readonly 'brand-secondary-hover': "#2697B7";
496
514
  readonly 'brand-secondary-active': "#01B5D1";
497
515
  readonly 'on-brand-primary': "#FFFFFF";
498
516
  readonly 'on-brand-secondary': "#FFFFFF";
517
+ readonly 'on-brand-primary-subtle': "#FF7900";
518
+ readonly 'on-brand-secondary-subtle': "#22D3EE";
499
519
  readonly 'status-success': "#2ED573";
500
520
  readonly 'status-success-light': "#58F69E";
501
521
  readonly 'status-success-dark': "#298732";
@@ -507,7 +527,7 @@ declare function getSemanticColors(mode: ThemeMode): {
507
527
  readonly 'status-error': "#D14343";
508
528
  readonly 'status-error-light': "#E05254";
509
529
  readonly 'status-error-dark': "#A4221C";
510
- readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
530
+ readonly 'status-error-subtle': "rgba(247, 113, 117, 0.08)";
511
531
  readonly 'status-error-muted': "rgba(209, 67, 67, 0.30)";
512
532
  readonly 'status-error-strong': "rgba(209, 67, 67, 0.50)";
513
533
  readonly 'status-error-vivid': "#FF4757";
@@ -525,13 +545,17 @@ declare function getSemanticColors(mode: ThemeMode): {
525
545
  readonly 'status-info': "#2196F3";
526
546
  readonly 'status-info-light': "#78C2FF";
527
547
  readonly 'status-info-dark': "#1072CB";
528
- readonly 'status-info-subtle': "rgba(33, 150, 243, 0.12)";
548
+ readonly 'status-info-subtle': "rgba(120, 194, 255, 0.12)";
529
549
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
530
550
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
531
551
  readonly 'on-status-success': "#FFFFFF";
532
552
  readonly 'on-status-error': "#FFFFFF";
533
553
  readonly 'on-status-warning': "#FFFFFF";
534
554
  readonly 'on-status-info': "#FFFFFF";
555
+ readonly 'on-status-success-subtle': "#2ED573";
556
+ readonly 'on-status-error-subtle': "#F77175";
557
+ readonly 'on-status-warning-subtle': "#F9B415";
558
+ readonly 'on-status-info-subtle': "#78C2FF";
535
559
  readonly 'result-improve': "#4caf50";
536
560
  readonly 'result-improve-light': "rgba(76, 175, 80, 0.16)";
537
561
  readonly 'result-improve-dark': "#248a24";
@@ -620,6 +644,31 @@ declare const primitiveColors: {
620
644
  * regenerating the ramp, so it stays a pin.
621
645
  */
622
646
  declare const alertRedVivid: "#FF4757";
647
+ /**
648
+ * Result/outcome palette anchors (VW-83): Material-style green/red/grey chosen
649
+ * for the result-improve/-degrade/-inconclusive tokens. No `primitiveRamps` step
650
+ * matches any of these exactly (the ramps are OKLCH-generated with a different
651
+ * hue/chroma arc), so they are pinned by name here rather than left as raw hex
652
+ * in semantic.ts — same pattern as {@link alertRedVivid}.
653
+ */
654
+ declare const resultPaletteColors: {
655
+ readonly improve: "#4caf50";
656
+ readonly improveDark: "#248a24";
657
+ readonly degrade: "#ef5350";
658
+ readonly degradeDark: "#b30000";
659
+ readonly inconclusive: "#9E9A97";
660
+ };
661
+ /**
662
+ * One-off semantic literals (VW-83) with no exact `greyRamp`/`primitiveRamps`
663
+ * match, pinned by name instead of left as raw hex in semantic.ts.
664
+ */
665
+ declare const semanticPins: {
666
+ readonly textPrimaryLight: "#121828";
667
+ readonly textSecondaryLight: "#65748B";
668
+ readonly backgroundBaseLight: "#EBEBEB";
669
+ readonly dividerLight: "#E8E9EB";
670
+ readonly focusIndigoDark: "#828DF8";
671
+ };
623
672
  /**
624
673
  * Unified warm-neutral grey ramp (TD-07.14)
625
674
  *
@@ -969,4 +1018,4 @@ declare const primitiveZIndex: {
969
1018
  readonly tooltip: 1800;
970
1019
  };
971
1020
 
972
- export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, SURFACE_PLANE_STEPS, type ThemeMode, alertRedVivid, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort };
1021
+ export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, SURFACE_PLANE_STEPS, type ThemeMode, alertRedVivid, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, resultPaletteColors, semanticColorsDark, semanticColorsLight, semanticPins, semanticTypography, sequentialEffort };
@@ -61,6 +61,8 @@ declare const semanticColorsLight: {
61
61
  readonly 'brand-secondary-active': "#22465F";
62
62
  readonly 'on-brand-primary': "#FFFFFF";
63
63
  readonly 'on-brand-secondary': "#FFFFFF";
64
+ readonly 'on-brand-primary-subtle': "#FF7900";
65
+ readonly 'on-brand-secondary-subtle': "#307B9B";
64
66
  readonly 'status-success': "#2ED573";
65
67
  readonly 'status-success-light': "#58F69E";
66
68
  readonly 'status-success-dark': "#298732";
@@ -93,6 +95,10 @@ declare const semanticColorsLight: {
93
95
  readonly 'status-info-subtle': "#EFF8FF";
94
96
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
95
97
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
98
+ readonly 'on-status-success-subtle': "#2ED573";
99
+ readonly 'on-status-error-subtle': "#D14343";
100
+ readonly 'on-status-warning-subtle': "#F9B415";
101
+ readonly 'on-status-info-subtle': "#2196F3";
96
102
  readonly 'on-status-success': "#FFFFFF";
97
103
  readonly 'on-status-error': "#FFFFFF";
98
104
  readonly 'on-status-warning': "#FFFFFF";
@@ -166,13 +172,15 @@ declare const semanticColorsDark: {
166
172
  readonly 'brand-secondary': "#307B9B";
167
173
  readonly 'brand-secondary-light': "#2697B7";
168
174
  readonly 'brand-secondary-dark': "#2A617F";
169
- readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.12)";
175
+ readonly 'brand-secondary-subtle': "rgba(34, 211, 238, 0.12)";
170
176
  readonly 'brand-secondary-muted': "rgba(48, 123, 155, 0.30)";
171
177
  readonly 'brand-secondary-strong': "rgba(48, 123, 155, 0.50)";
172
178
  readonly 'brand-secondary-hover': "#2697B7";
173
179
  readonly 'brand-secondary-active': "#01B5D1";
174
180
  readonly 'on-brand-primary': "#FFFFFF";
175
181
  readonly 'on-brand-secondary': "#FFFFFF";
182
+ readonly 'on-brand-primary-subtle': "#FF7900";
183
+ readonly 'on-brand-secondary-subtle': "#22D3EE";
176
184
  readonly 'status-success': "#2ED573";
177
185
  readonly 'status-success-light': "#58F69E";
178
186
  readonly 'status-success-dark': "#298732";
@@ -184,7 +192,7 @@ declare const semanticColorsDark: {
184
192
  readonly 'status-error': "#D14343";
185
193
  readonly 'status-error-light': "#E05254";
186
194
  readonly 'status-error-dark': "#A4221C";
187
- readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
195
+ readonly 'status-error-subtle': "rgba(247, 113, 117, 0.08)";
188
196
  readonly 'status-error-muted': "rgba(209, 67, 67, 0.30)";
189
197
  readonly 'status-error-strong': "rgba(209, 67, 67, 0.50)";
190
198
  readonly 'status-error-vivid': "#FF4757";
@@ -202,13 +210,17 @@ declare const semanticColorsDark: {
202
210
  readonly 'status-info': "#2196F3";
203
211
  readonly 'status-info-light': "#78C2FF";
204
212
  readonly 'status-info-dark': "#1072CB";
205
- readonly 'status-info-subtle': "rgba(33, 150, 243, 0.12)";
213
+ readonly 'status-info-subtle': "rgba(120, 194, 255, 0.12)";
206
214
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
207
215
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
208
216
  readonly 'on-status-success': "#FFFFFF";
209
217
  readonly 'on-status-error': "#FFFFFF";
210
218
  readonly 'on-status-warning': "#FFFFFF";
211
219
  readonly 'on-status-info': "#FFFFFF";
220
+ readonly 'on-status-success-subtle': "#2ED573";
221
+ readonly 'on-status-error-subtle': "#F77175";
222
+ readonly 'on-status-warning-subtle': "#F9B415";
223
+ readonly 'on-status-info-subtle': "#78C2FF";
212
224
  readonly 'result-improve': "#4caf50";
213
225
  readonly 'result-improve-light': "rgba(76, 175, 80, 0.16)";
214
226
  readonly 'result-improve-dark': "#248a24";
@@ -385,6 +397,8 @@ declare function getSemanticColors(mode: ThemeMode): {
385
397
  readonly 'brand-secondary-active': "#22465F";
386
398
  readonly 'on-brand-primary': "#FFFFFF";
387
399
  readonly 'on-brand-secondary': "#FFFFFF";
400
+ readonly 'on-brand-primary-subtle': "#FF7900";
401
+ readonly 'on-brand-secondary-subtle': "#307B9B";
388
402
  readonly 'status-success': "#2ED573";
389
403
  readonly 'status-success-light': "#58F69E";
390
404
  readonly 'status-success-dark': "#298732";
@@ -417,6 +431,10 @@ declare function getSemanticColors(mode: ThemeMode): {
417
431
  readonly 'status-info-subtle': "#EFF8FF";
418
432
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
419
433
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
434
+ readonly 'on-status-success-subtle': "#2ED573";
435
+ readonly 'on-status-error-subtle': "#D14343";
436
+ readonly 'on-status-warning-subtle': "#F9B415";
437
+ readonly 'on-status-info-subtle': "#2196F3";
420
438
  readonly 'on-status-success': "#FFFFFF";
421
439
  readonly 'on-status-error': "#FFFFFF";
422
440
  readonly 'on-status-warning': "#FFFFFF";
@@ -489,13 +507,15 @@ declare function getSemanticColors(mode: ThemeMode): {
489
507
  readonly 'brand-secondary': "#307B9B";
490
508
  readonly 'brand-secondary-light': "#2697B7";
491
509
  readonly 'brand-secondary-dark': "#2A617F";
492
- readonly 'brand-secondary-subtle': "rgba(48, 123, 155, 0.12)";
510
+ readonly 'brand-secondary-subtle': "rgba(34, 211, 238, 0.12)";
493
511
  readonly 'brand-secondary-muted': "rgba(48, 123, 155, 0.30)";
494
512
  readonly 'brand-secondary-strong': "rgba(48, 123, 155, 0.50)";
495
513
  readonly 'brand-secondary-hover': "#2697B7";
496
514
  readonly 'brand-secondary-active': "#01B5D1";
497
515
  readonly 'on-brand-primary': "#FFFFFF";
498
516
  readonly 'on-brand-secondary': "#FFFFFF";
517
+ readonly 'on-brand-primary-subtle': "#FF7900";
518
+ readonly 'on-brand-secondary-subtle': "#22D3EE";
499
519
  readonly 'status-success': "#2ED573";
500
520
  readonly 'status-success-light': "#58F69E";
501
521
  readonly 'status-success-dark': "#298732";
@@ -507,7 +527,7 @@ declare function getSemanticColors(mode: ThemeMode): {
507
527
  readonly 'status-error': "#D14343";
508
528
  readonly 'status-error-light': "#E05254";
509
529
  readonly 'status-error-dark': "#A4221C";
510
- readonly 'status-error-subtle': "rgba(209, 67, 67, 0.12)";
530
+ readonly 'status-error-subtle': "rgba(247, 113, 117, 0.08)";
511
531
  readonly 'status-error-muted': "rgba(209, 67, 67, 0.30)";
512
532
  readonly 'status-error-strong': "rgba(209, 67, 67, 0.50)";
513
533
  readonly 'status-error-vivid': "#FF4757";
@@ -525,13 +545,17 @@ declare function getSemanticColors(mode: ThemeMode): {
525
545
  readonly 'status-info': "#2196F3";
526
546
  readonly 'status-info-light': "#78C2FF";
527
547
  readonly 'status-info-dark': "#1072CB";
528
- readonly 'status-info-subtle': "rgba(33, 150, 243, 0.12)";
548
+ readonly 'status-info-subtle': "rgba(120, 194, 255, 0.12)";
529
549
  readonly 'status-info-muted': "rgba(33, 150, 243, 0.30)";
530
550
  readonly 'status-info-strong': "rgba(33, 150, 243, 0.50)";
531
551
  readonly 'on-status-success': "#FFFFFF";
532
552
  readonly 'on-status-error': "#FFFFFF";
533
553
  readonly 'on-status-warning': "#FFFFFF";
534
554
  readonly 'on-status-info': "#FFFFFF";
555
+ readonly 'on-status-success-subtle': "#2ED573";
556
+ readonly 'on-status-error-subtle': "#F77175";
557
+ readonly 'on-status-warning-subtle': "#F9B415";
558
+ readonly 'on-status-info-subtle': "#78C2FF";
535
559
  readonly 'result-improve': "#4caf50";
536
560
  readonly 'result-improve-light': "rgba(76, 175, 80, 0.16)";
537
561
  readonly 'result-improve-dark': "#248a24";
@@ -620,6 +644,31 @@ declare const primitiveColors: {
620
644
  * regenerating the ramp, so it stays a pin.
621
645
  */
622
646
  declare const alertRedVivid: "#FF4757";
647
+ /**
648
+ * Result/outcome palette anchors (VW-83): Material-style green/red/grey chosen
649
+ * for the result-improve/-degrade/-inconclusive tokens. No `primitiveRamps` step
650
+ * matches any of these exactly (the ramps are OKLCH-generated with a different
651
+ * hue/chroma arc), so they are pinned by name here rather than left as raw hex
652
+ * in semantic.ts — same pattern as {@link alertRedVivid}.
653
+ */
654
+ declare const resultPaletteColors: {
655
+ readonly improve: "#4caf50";
656
+ readonly improveDark: "#248a24";
657
+ readonly degrade: "#ef5350";
658
+ readonly degradeDark: "#b30000";
659
+ readonly inconclusive: "#9E9A97";
660
+ };
661
+ /**
662
+ * One-off semantic literals (VW-83) with no exact `greyRamp`/`primitiveRamps`
663
+ * match, pinned by name instead of left as raw hex in semantic.ts.
664
+ */
665
+ declare const semanticPins: {
666
+ readonly textPrimaryLight: "#121828";
667
+ readonly textSecondaryLight: "#65748B";
668
+ readonly backgroundBaseLight: "#EBEBEB";
669
+ readonly dividerLight: "#E8E9EB";
670
+ readonly focusIndigoDark: "#828DF8";
671
+ };
623
672
  /**
624
673
  * Unified warm-neutral grey ramp (TD-07.14)
625
674
  *
@@ -969,4 +1018,4 @@ declare const primitiveZIndex: {
969
1018
  readonly tooltip: 1800;
970
1019
  };
971
1020
 
972
- export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, SURFACE_PLANE_STEPS, type ThemeMode, alertRedVivid, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort };
1021
+ export { CATEGORICAL_CVD_SAFE_MAX, type CategoricalVariant, SURFACE_PLANE_STEPS, type ThemeMode, alertRedVivid, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, resultPaletteColors, semanticColorsDark, semanticColorsLight, semanticPins, semanticTypography, sequentialEffort };
@@ -7,6 +7,26 @@ var primitiveColors = {
7
7
  transparent: "transparent"
8
8
  };
9
9
  var alertRedVivid = "#FF4757";
10
+ var resultPaletteColors = {
11
+ improve: "#4caf50",
12
+ improveDark: "#248a24",
13
+ degrade: "#ef5350",
14
+ degradeDark: "#b30000",
15
+ inconclusive: "#9E9A97"
16
+ };
17
+ var semanticPins = {
18
+ // Cool navy-black; darker and more blue-shifted than any warm greyRamp step.
19
+ textPrimaryLight: "#121828",
20
+ // Cool blue-grey; outside greyRamp's warm (R>=G>=B) scale.
21
+ textSecondaryLight: "#65748B",
22
+ // Pure neutral grey (R=G=B); no warm greyRamp step lands on it exactly.
23
+ backgroundBaseLight: "#EBEBEB",
24
+ // Near-neutral grey, kept one step off backgroundBaseLight by design.
25
+ dividerLight: "#E8E9EB",
26
+ // Periwinkle/indigo; more purple than any primitiveRamps.blue step. Shared by
27
+ // dark-mode text-link, border-focus and border-input-focus.
28
+ focusIndigoDark: "#828DF8"
29
+ };
10
30
  var greyRamp = {
11
31
  50: "#F9F6F3",
12
32
  // L*97.0 W6
@@ -439,6 +459,12 @@ var semanticColorsLight = {
439
459
  // Text on brand backgrounds (on-*)
440
460
  "on-brand-primary": primitiveColors.white,
441
461
  "on-brand-secondary": primitiveColors.white,
462
+ // Text ON a `-subtle` fill. Light mode keeps today's pairing (the base token) so
463
+ // nothing moves here: light has the same disease mirrored — a light rung on a
464
+ // near-white ramp[50] fill — but correcting it belongs with the light-mode pass
465
+ // in AW-121, not this one.
466
+ "on-brand-primary-subtle": primitiveRamps.orange[400],
467
+ "on-brand-secondary-subtle": primitiveRamps.cyan[600],
442
468
  // Status colors (status-*)
443
469
  "status-success": primitiveRamps.green[300],
444
470
  "status-success-light": primitiveRamps.green[200],
@@ -474,21 +500,26 @@ var semanticColorsLight = {
474
500
  "status-info-subtle": primitiveRamps.blue[50],
475
501
  "status-info-muted": "rgba(33, 150, 243, 0.30)",
476
502
  "status-info-strong": "rgba(33, 150, 243, 0.50)",
503
+ // Text ON a `-subtle` fill — see the on-brand-*-subtle note above.
504
+ "on-status-success-subtle": primitiveRamps.green[300],
505
+ "on-status-error-subtle": primitiveRamps.red[600],
506
+ "on-status-warning-subtle": primitiveRamps.amber[300],
507
+ "on-status-info-subtle": primitiveRamps.blue[500],
477
508
  // Text on status backgrounds (on-status-*)
478
509
  "on-status-success": primitiveColors.white,
479
510
  "on-status-error": primitiveColors.white,
480
511
  "on-status-warning": primitiveColors.white,
481
512
  "on-status-info": primitiveColors.white,
482
513
  // Result/outcome indicators (result-*)
483
- "result-improve": "#4caf50",
514
+ "result-improve": resultPaletteColors.improve,
484
515
  // Green - positive outcome
485
516
  "result-improve-light": "rgba(76, 175, 80, 0.12)",
486
- "result-improve-dark": "#248a24",
487
- "result-degrade": "#ef5350",
517
+ "result-improve-dark": resultPaletteColors.improveDark,
518
+ "result-degrade": resultPaletteColors.degrade,
488
519
  // Red - negative outcome
489
520
  "result-degrade-light": "rgba(239, 83, 80, 0.12)",
490
- "result-degrade-dark": "#b30000",
491
- "result-inconclusive": "#9E9A97",
521
+ "result-degrade-dark": resultPaletteColors.degradeDark,
522
+ "result-inconclusive": resultPaletteColors.inconclusive,
492
523
  // Gray - no clear result
493
524
  "result-inconclusive-light": "rgba(158, 154, 151, 0.12)",
494
525
  "result-neutral": greyRamp[600],
@@ -520,8 +551,8 @@ var semanticColorsLight = {
520
551
  "data-10": discreteRainbow[22],
521
552
  // Dark Orange
522
553
  // Text colors (text-*)
523
- "text-primary": "#121828",
524
- "text-secondary": "#65748B",
554
+ "text-primary": semanticPins.textPrimaryLight,
555
+ "text-secondary": semanticPins.textSecondaryLight,
525
556
  "text-tertiary": greyRamp[400],
526
557
  "text-disabled": "rgba(55, 65, 81, 0.48)",
527
558
  "text-inverse": primitiveColors.white,
@@ -537,7 +568,7 @@ var semanticColorsLight = {
537
568
  "surface-input": greyRamp[50],
538
569
  // Input field background (filled variant)
539
570
  // Background colors (background-*)
540
- "background-base": "#EBEBEB",
571
+ "background-base": semanticPins.backgroundBaseLight,
541
572
  "background-default": primitiveColors.white,
542
573
  "background-subtle": greyRamp[50],
543
574
  // Frame/bezel chrome — top bar + side nav shell, one step below
@@ -568,7 +599,7 @@ var semanticColorsLight = {
568
599
  "interactive-disabled": "rgba(55, 65, 81, 0.12)",
569
600
  "interactive-disabled-text": "rgba(55, 65, 81, 0.26)",
570
601
  // Divider
571
- divider: "#E8E9EB",
602
+ divider: semanticPins.dividerLight,
572
603
  // Avatar default
573
604
  "avatar-background": greyRamp[600],
574
605
  "avatar-text": primitiveColors.white
@@ -586,7 +617,7 @@ var semanticColorsDark = {
586
617
  "brand-secondary": primitiveRamps.cyan[600],
587
618
  "brand-secondary-light": primitiveRamps.cyan[500],
588
619
  "brand-secondary-dark": primitiveRamps.cyan[700],
589
- "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
620
+ "brand-secondary-subtle": "rgba(34, 211, 238, 0.12)",
590
621
  "brand-secondary-muted": "rgba(48, 123, 155, 0.30)",
591
622
  "brand-secondary-strong": "rgba(48, 123, 155, 0.50)",
592
623
  "brand-secondary-hover": primitiveRamps.cyan[500],
@@ -594,6 +625,14 @@ var semanticColorsDark = {
594
625
  // Text on brand backgrounds
595
626
  "on-brand-primary": primitiveColors.white,
596
627
  "on-brand-secondary": primitiveColors.white,
628
+ // Text ON a `-subtle` fill. Its own role: `brand-primary` and friends are tuned to
629
+ // carry a white label as a solid fill, which makes the two deepest of them
630
+ // (cyan[600], red[600]) too dark to read as text on a dark plane. Levelling the
631
+ // family at rung 300 puts every tone within OKLCH L 0.769-0.813 instead of
632
+ // 0.550-0.813. Brand is deliberately left at its own orange[400] (operator, AW-133)
633
+ // so the Voltras tone never drifts; it is the one tone under AA on a raised card.
634
+ "on-brand-primary-subtle": primitiveRamps.orange[400],
635
+ "on-brand-secondary-subtle": primitiveRamps.cyan[300],
597
636
  // Status colors
598
637
  "status-success": primitiveRamps.green[300],
599
638
  "status-success-light": primitiveRamps.green[200],
@@ -607,7 +646,10 @@ var semanticColorsDark = {
607
646
  "status-error": primitiveRamps.red[600],
608
647
  "status-error-light": primitiveRamps.red[500],
609
648
  "status-error-dark": primitiveRamps.red[700],
610
- "status-error-subtle": "rgba(209, 67, 67, 0.12)",
649
+ // Alpha 0.08, not the family's 0.12: error's label is red[400], a rung darker than
650
+ // its siblings so it reads RED rather than pink (rung 300 has only 0.121 chroma).
651
+ // Thinning the fill buys back the contrast that extra darkness costs. See AW-133.
652
+ "status-error-subtle": "rgba(247, 113, 117, 0.08)",
611
653
  "status-error-muted": "rgba(209, 67, 67, 0.30)",
612
654
  "status-error-strong": "rgba(209, 67, 67, 0.50)",
613
655
  "status-error-vivid": alertRedVivid,
@@ -625,7 +667,7 @@ var semanticColorsDark = {
625
667
  "status-info": primitiveRamps.blue[500],
626
668
  "status-info-light": primitiveRamps.blue[300],
627
669
  "status-info-dark": primitiveRamps.blue[600],
628
- "status-info-subtle": "rgba(33, 150, 243, 0.12)",
670
+ "status-info-subtle": "rgba(120, 194, 255, 0.12)",
629
671
  "status-info-muted": "rgba(33, 150, 243, 0.30)",
630
672
  "status-info-strong": "rgba(33, 150, 243, 0.50)",
631
673
  // Text on status backgrounds
@@ -633,14 +675,22 @@ var semanticColorsDark = {
633
675
  "on-status-error": primitiveColors.white,
634
676
  "on-status-warning": primitiveColors.white,
635
677
  "on-status-info": primitiveColors.white,
678
+ // Text ON a `-subtle` fill — see the on-brand-*-subtle note above. Error is the
679
+ // second deliberate exception to the rung-300 rule (operator, AW-133): red[300]
680
+ // levelled perfectly but read PINK, because a red that light can only hold 0.121
681
+ // chroma. red[400] carries 0.165 and reads red; its fill is thinned to compensate.
682
+ "on-status-success-subtle": primitiveRamps.green[300],
683
+ "on-status-error-subtle": primitiveRamps.red[400],
684
+ "on-status-warning-subtle": primitiveRamps.amber[300],
685
+ "on-status-info-subtle": primitiveRamps.blue[300],
636
686
  // Result/outcome indicators (result-*)
637
- "result-improve": "#4caf50",
687
+ "result-improve": resultPaletteColors.improve,
638
688
  "result-improve-light": "rgba(76, 175, 80, 0.16)",
639
- "result-improve-dark": "#248a24",
640
- "result-degrade": "#ef5350",
689
+ "result-improve-dark": resultPaletteColors.improveDark,
690
+ "result-degrade": resultPaletteColors.degrade,
641
691
  "result-degrade-light": "rgba(239, 83, 80, 0.16)",
642
- "result-degrade-dark": "#b30000",
643
- "result-inconclusive": "#9E9A97",
692
+ "result-degrade-dark": resultPaletteColors.degradeDark,
693
+ "result-inconclusive": resultPaletteColors.inconclusive,
644
694
  "result-inconclusive-light": "rgba(158, 154, 151, 0.16)",
645
695
  "result-neutral": greyRamp[400],
646
696
  // Text on result backgrounds
@@ -671,7 +721,7 @@ var semanticColorsDark = {
671
721
  "text-tertiary": greyRamp[500],
672
722
  "text-disabled": "rgba(255, 255, 255, 0.38)",
673
723
  "text-inverse": greyRamp[950],
674
- "text-link": "#828DF8",
724
+ "text-link": semanticPins.focusIndigoDark,
675
725
  "text-link-hover": primitiveRamps.blue[400],
676
726
  // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,
677
727
  // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see
@@ -721,10 +771,10 @@ var semanticColorsDark = {
721
771
  // plane, so it keeps its job without collision.
722
772
  "border-prominent": greyRamp[800],
723
773
  // high-visibility divider
724
- "border-focus": "#828DF8",
774
+ "border-focus": semanticPins.focusIndigoDark,
725
775
  "border-input": greyRamp[700],
726
776
  "border-input-hover": greyRamp[600],
727
- "border-input-focus": "#828DF8",
777
+ "border-input-focus": semanticPins.focusIndigoDark,
728
778
  "border-input-error": primitiveRamps.red[500],
729
779
  // Alpha hairline separators — the primary separation cue (§4/S-2). Self-
730
780
  // normalizing: composites toward white by ~the same amount on ANY plane, so
@@ -896,8 +946,10 @@ exports.primitiveRamps = primitiveRamps;
896
946
  exports.primitiveSpacing = primitiveSpacing;
897
947
  exports.primitiveTypography = primitiveTypography;
898
948
  exports.primitiveZIndex = primitiveZIndex;
949
+ exports.resultPaletteColors = resultPaletteColors;
899
950
  exports.semanticColorsDark = semanticColorsDark;
900
951
  exports.semanticColorsLight = semanticColorsLight;
952
+ exports.semanticPins = semanticPins;
901
953
  exports.semanticTypography = semanticTypography;
902
954
  exports.sequentialEffort = sequentialEffort;
903
955
  //# sourceMappingURL=tokens.js.map