@titan-design/react-ui 0.5.0 → 0.6.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 (116) hide show
  1. package/dist/bodymap.js +232 -185
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +232 -185
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +164 -8
  6. package/dist/index.d.ts +164 -8
  7. package/dist/index.js +835 -342
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +816 -343
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +570 -522
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +570 -522
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +461 -199
  16. package/dist/theme/index.d.ts +461 -199
  17. package/dist/theme/index.js +311 -97
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +303 -98
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +148 -139
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +148 -139
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/package.json +3 -1
  26. package/src/components/custom/DateTime/DateTime.stories.tsx +82 -6
  27. package/src/components/custom/DateTime/DateTime.test.tsx +29 -3
  28. package/src/components/custom/DateTime/DateTime.tsx +55 -15
  29. package/src/components/custom/Gauge/Gauge.test.tsx +2 -2
  30. package/src/components/custom/Gauge/Gauge.tsx +6 -3
  31. package/src/components/custom/Scatter/Scatter.tsx +3 -5
  32. package/src/components/custom/Treemap/Treemap.tsx +3 -5
  33. package/src/components/custom/Typography/Typography.stories.tsx +45 -27
  34. package/src/components/custom/Typography/Typography.test.tsx +13 -3
  35. package/src/components/custom/Typography/Typography.tsx +5 -0
  36. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +2 -1
  37. package/src/components/custom/Workout/BodyMap.tsx +6 -3
  38. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +6 -3
  39. package/src/components/custom/Workout/CapacityBandChart.test.tsx +2 -2
  40. package/src/components/custom/Workout/CapacityBandChart.tsx +9 -6
  41. package/src/components/custom/Workout/DeviationBar.test.tsx +1 -1
  42. package/src/components/custom/Workout/DeviationBar.tsx +7 -4
  43. package/src/components/custom/Workout/ExerciseDetailPage.tsx +2 -1
  44. package/src/components/custom/Workout/InputBar.tsx +2 -1
  45. package/src/components/custom/Workout/IntensityBar.test.tsx +8 -8
  46. package/src/components/custom/Workout/IntensityBar.tsx +10 -6
  47. package/src/components/custom/Workout/MesoCard.tsx +8 -3
  48. package/src/components/custom/Workout/MesoProgressBar.test.tsx +1 -1
  49. package/src/components/custom/Workout/MesoProgressBar.tsx +3 -2
  50. package/src/components/custom/Workout/MesoStatusCard.tsx +20 -13
  51. package/src/components/custom/Workout/MuscleGroupChip.tsx +7 -4
  52. package/src/components/custom/Workout/PrBadge.tsx +5 -2
  53. package/src/components/custom/Workout/PrHistoryModal.tsx +4 -3
  54. package/src/components/custom/Workout/ProgramPlanningPage.tsx +2 -1
  55. package/src/components/custom/Workout/ReadinessCheck.tsx +7 -4
  56. package/src/components/custom/Workout/RestTimer.tsx +2 -1
  57. package/src/components/custom/Workout/SetRow.tsx +2 -1
  58. package/src/components/custom/Workout/Sparkline.tsx +2 -1
  59. package/src/components/custom/Workout/StatusDot.test.tsx +2 -2
  60. package/src/components/custom/Workout/StatusDot.tsx +12 -9
  61. package/src/components/custom/Workout/StrengthTrendChart.tsx +9 -6
  62. package/src/components/custom/Workout/SupersetWrapper.tsx +2 -1
  63. package/src/components/custom/Workout/TempoDisplay.tsx +6 -3
  64. package/src/components/custom/Workout/VelocityStrip.test.tsx +3 -3
  65. package/src/components/custom/Workout/WeekRow.tsx +3 -2
  66. package/src/components/custom/Workout/WeightBadge.tsx +6 -2
  67. package/src/components/custom/Workout/WorkoutCard.tsx +5 -2
  68. package/src/components/custom/Workout/WorkoutPill.tsx +12 -8
  69. package/src/components/custom/Workout/icons.tsx +6 -67
  70. package/src/components/icons/SvgIcon.tsx +50 -0
  71. package/src/components/icons/icons.stories.tsx +57 -0
  72. package/src/components/icons/icons.test.tsx +43 -0
  73. package/src/components/icons/icons.tsx +45 -0
  74. package/src/components/icons/index.ts +4 -0
  75. package/src/components/index.ts +6 -0
  76. package/src/components/shell/BrandLockup.stories.tsx +27 -0
  77. package/src/components/shell/BrandLockup.test.tsx +23 -0
  78. package/src/components/shell/BrandLockup.tsx +47 -0
  79. package/src/components/shell/DeviceIndicator.stories.tsx +28 -0
  80. package/src/components/shell/DeviceIndicator.test.tsx +26 -0
  81. package/src/components/shell/DeviceIndicator.tsx +52 -0
  82. package/src/components/shell/DeviceMenu.stories.tsx +47 -0
  83. package/src/components/shell/DeviceMenu.test.tsx +40 -0
  84. package/src/components/shell/DeviceMenu.tsx +65 -0
  85. package/src/components/shell/DeviceRow.stories.tsx +38 -0
  86. package/src/components/shell/DeviceRow.test.tsx +37 -0
  87. package/src/components/shell/DeviceRow.tsx +58 -0
  88. package/src/components/shell/README.md +86 -0
  89. package/src/components/shell/SessionStatePill.stories.tsx +27 -0
  90. package/src/components/shell/SessionStatePill.test.tsx +25 -0
  91. package/src/components/shell/SessionStatePill.tsx +46 -0
  92. package/src/components/shell/TopBar.stories.tsx +49 -0
  93. package/src/components/shell/TopBar.test.tsx +36 -0
  94. package/src/components/shell/TopBar.tsx +89 -0
  95. package/src/components/shell/index.ts +8 -0
  96. package/src/components/ui/indicator/Indicator.stories.tsx +37 -1
  97. package/src/components/ui/indicator/Indicator.test.tsx +19 -1
  98. package/src/components/ui/indicator/Indicator.tsx +45 -6
  99. package/src/components/ui/indicator/index.ts +1 -1
  100. package/src/components/ui/spinner/Spinner.tsx +3 -2
  101. package/src/components/ui/toolbar-button/ToolbarButton.tsx +2 -1
  102. package/src/theme/ColorSystem.stories.tsx +323 -0
  103. package/src/theme/Colors.stories.tsx +69 -1
  104. package/src/theme/barrel.ts +1 -0
  105. package/src/theme/config.ts +16 -3
  106. package/src/theme/extracted-colors-dataviz.ts +21 -0
  107. package/src/theme/extracted-colors-ui.ts +20 -0
  108. package/src/theme/global.css +64 -52
  109. package/src/theme/gradients.test.ts +25 -0
  110. package/src/theme/gradients.ts +36 -0
  111. package/src/theme/tokens/primitives.test.ts +232 -0
  112. package/src/theme/tokens/primitives.ts +247 -0
  113. package/src/theme/tokens/semantic.ts +93 -81
  114. package/src/theme/workout-tokens.ts +22 -21
  115. package/src/utils/avatar-color.ts +3 -3
  116. package/tailwind.config.js +10 -3
package/dist/bodymap.mjs CHANGED
@@ -18,37 +18,17 @@ var primitiveColors = {
18
18
  600: "#5048E5",
19
19
  // Primary main
20
20
  700: "#3832A0"},
21
- // Teal scale (success)
22
- teal: {
23
- 50: "#F0FDFA",
24
- 400: "#43C6B7",
25
- // Success light
26
- 500: "#14B8A6",
27
- 700: "#0E8074"},
28
21
  // Red scale (error)
29
22
  red: {
30
- 50: "#FEF2F2",
31
- 400: "#DA6868",
32
23
  // Error light
33
24
  500: "#EF4444",
34
- 600: "#D14343",
35
- // Error main
36
- 700: "#922E2E"},
37
- // Amber scale (warning)
38
- amber: {
39
- 50: "#FFFBEB",
40
- 400: "#FFBF4C",
41
- // Warning light
42
- 500: "#FFB020",
43
- // Warning main
44
- 600: "#B27B16"},
45
- // Sky/Blue scale (info)
46
- sky: {
47
- 50: "#F0F9FF",
48
- 400: "#64B6F7",
49
- // Info light
50
- 500: "#2196F3",
51
- 700: "#0B79D0"},
25
+ 600: "#D14343"},
26
+ // Vivid red scale (alert)
27
+ redVivid: {
28
+ 400: "#FF6070",
29
+ // Error vivid light
30
+ 500: "#FF4757",
31
+ 700: "#C42539"},
52
32
  // Neutral/Gray scale
53
33
  neutral: {
54
34
  50: "#FAFAFA",
@@ -58,16 +38,9 @@ var primitiveColors = {
58
38
  500: "#6B7280",
59
39
  600: "#4B5563",
60
40
  900: "#111827"},
61
- // Orange scale (accent/brand color)
62
- accent: {
63
- 200: "#FF9630",
64
- 300: "#FF8500",
65
- 400: "#FF7900",
66
- 500: "#F56C00",
67
- 600: "#E06D10",
68
- 700: "#D0620C"},
69
41
  // Charcoal scale (dark backgrounds)
70
42
  charcoal: {
43
+ 200: "#3C3C3C",
71
44
  300: "#2C2C2C",
72
45
  400: "#1F1F1F",
73
46
  500: "#1C1C1C",
@@ -75,15 +48,58 @@ var primitiveColors = {
75
48
  700: "#161616",
76
49
  900: "#101010"
77
50
  },
78
- // Steel scale (cool accent)
79
- steel: {
80
- 300: "#678498",
81
- 400: "#557488",
82
- 500: "#406D87",
83
- 600: "#39617A",
84
- 700: "#32556D"},
85
51
  // Pure colors
86
52
  white: "#FFFFFF"};
53
+ var primitiveRamps = {
54
+ red: {
55
+ 50: "#FFF4F4",
56
+ 500: "#E05254",
57
+ 600: "#D14343",
58
+ // pin
59
+ 700: "#A4221C"},
60
+ orange: {
61
+ 200: "#FFC7A2",
62
+ 300: "#FFA063",
63
+ 400: "#FF7900",
64
+ // pin
65
+ 500: "#DA5F00",
66
+ 600: "#B94A00"},
67
+ amber: {
68
+ 50: "#FFF7DD",
69
+ 200: "#FFD352",
70
+ 300: "#F9B415",
71
+ 500: "#C27400"},
72
+ green: {
73
+ 50: "#E3FFEE",
74
+ 200: "#58F69E",
75
+ 300: "#2ED573",
76
+ 600: "#298732"},
77
+ cyan: {
78
+ 300: "#22D3EE",
79
+ // pin
80
+ 400: "#01B5D1",
81
+ 500: "#2697B7",
82
+ 600: "#307B9B",
83
+ 700: "#2A617F",
84
+ 800: "#22465F"},
85
+ blue: {
86
+ 50: "#EFF8FF",
87
+ 300: "#78C2FF",
88
+ 500: "#2196F3",
89
+ // pin
90
+ 600: "#1072CB"}};
91
+ var divergingScale = [
92
+ primitiveRamps.blue[500],
93
+ // under
94
+ primitiveRamps.cyan[300],
95
+ // maintenance
96
+ primitiveRamps.green[200],
97
+ // optimal (light center)
98
+ primitiveRamps.amber[300],
99
+ // approaching
100
+ primitiveRamps.red[600]
101
+ // over
102
+ ];
87
103
  var discreteRainbow = [
88
104
  "#E8ECFB",
89
105
  "#D9CCE3",
@@ -119,56 +135,43 @@ var discreteRainbow = [
119
135
  // src/theme/tokens/semantic.ts
120
136
  var semanticColorsLight = {
121
137
  // Brand colors (brand-*)
122
- "brand-primary": primitiveColors.accent[400],
123
- // #FF7900
124
- "brand-primary-light": primitiveColors.accent[200],
125
- // #FF9630
126
- "brand-primary-dark": primitiveColors.accent[700],
127
- // #D0620C
138
+ "brand-primary": primitiveRamps.orange[400],
139
+ "brand-primary-light": primitiveRamps.orange[300],
140
+ "brand-primary-dark": primitiveRamps.orange[500],
128
141
  "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
129
- "brand-primary-hover": primitiveColors.accent[500],
130
- "brand-primary-active": primitiveColors.accent[600],
131
- "brand-secondary": primitiveColors.steel[500],
132
- // #406D87
133
- "brand-secondary-light": primitiveColors.steel[300],
134
- // #678498
135
- "brand-secondary-dark": primitiveColors.steel[700],
136
- // #32556D
137
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.08)",
138
- "brand-secondary-hover": primitiveColors.steel[600],
139
- "brand-secondary-active": primitiveColors.steel[700],
142
+ "brand-primary-hover": primitiveRamps.orange[500],
143
+ "brand-primary-active": primitiveRamps.orange[600],
144
+ "brand-secondary": primitiveRamps.cyan[600],
145
+ "brand-secondary-light": primitiveRamps.cyan[500],
146
+ "brand-secondary-dark": primitiveRamps.cyan[700],
147
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.08)",
148
+ "brand-secondary-hover": primitiveRamps.cyan[700],
149
+ "brand-secondary-active": primitiveRamps.cyan[800],
140
150
  // Text on brand backgrounds (on-*)
141
151
  "on-brand-primary": primitiveColors.white,
142
152
  "on-brand-secondary": primitiveColors.white,
143
153
  // Status colors (status-*)
144
- "status-success": primitiveColors.teal[500],
145
- // #14B8A6
146
- "status-success-light": primitiveColors.teal[400],
147
- // #43C6B7
148
- "status-success-dark": primitiveColors.teal[700],
149
- // #0E8074
150
- "status-success-subtle": primitiveColors.teal[50],
151
- "status-error": primitiveColors.red[600],
152
- // #D14343
153
- "status-error-light": primitiveColors.red[400],
154
- // #DA6868
155
- "status-error-dark": primitiveColors.red[700],
156
- // #922E2E
157
- "status-error-subtle": primitiveColors.red[50],
158
- "status-warning": primitiveColors.amber[500],
159
- // #FFB020
160
- "status-warning-light": primitiveColors.amber[400],
161
- // #FFBF4C
162
- "status-warning-dark": primitiveColors.amber[600],
163
- // #B27B16
164
- "status-warning-subtle": primitiveColors.amber[50],
165
- "status-info": primitiveColors.sky[500],
166
- // #2196F3
167
- "status-info-light": primitiveColors.sky[400],
168
- // #64B6F7
169
- "status-info-dark": primitiveColors.sky[700],
170
- // #0B79D0
171
- "status-info-subtle": primitiveColors.sky[50],
154
+ "status-success": primitiveRamps.green[300],
155
+ "status-success-light": primitiveRamps.green[200],
156
+ "status-success-dark": primitiveRamps.green[600],
157
+ "status-success-subtle": primitiveRamps.green[50],
158
+ "status-error": primitiveRamps.red[600],
159
+ "status-error-light": primitiveRamps.red[500],
160
+ "status-error-dark": primitiveRamps.red[700],
161
+ "status-error-subtle": primitiveRamps.red[50],
162
+ "status-error-vivid": primitiveColors.redVivid[500],
163
+ // vivid alert red
164
+ "status-error-vivid-light": primitiveColors.redVivid[400],
165
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
166
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
167
+ "status-warning": primitiveRamps.amber[300],
168
+ "status-warning-light": primitiveRamps.amber[200],
169
+ "status-warning-dark": primitiveRamps.amber[500],
170
+ "status-warning-subtle": primitiveRamps.amber[50],
171
+ "status-info": primitiveRamps.blue[500],
172
+ "status-info-light": primitiveRamps.blue[300],
173
+ "status-info-dark": primitiveRamps.blue[600],
174
+ "status-info-subtle": primitiveRamps.blue[50],
172
175
  // Text on status backgrounds (on-status-*)
173
176
  "on-status-success": primitiveColors.white,
174
177
  "on-status-error": primitiveColors.white,
@@ -195,25 +198,25 @@ var semanticColorsLight = {
195
198
  // Data visualization colors (data-*)
196
199
  // First 10 colors from discrete rainbow optimized for charts
197
200
  "data-1": discreteRainbow[9],
198
- // #1965B0 - Blue
201
+ // Blue
199
202
  "data-2": discreteRainbow[14],
200
- // #4EB265 - Green
203
+ // Green
201
204
  "data-3": discreteRainbow[17],
202
- // #F7F056 - Yellow
205
+ // Yellow
203
206
  "data-4": discreteRainbow[25],
204
- // #DC050C - Red
207
+ // Red
205
208
  "data-5": discreteRainbow[8],
206
- // #882E72 - Purple
209
+ // Purple
207
210
  "data-6": discreteRainbow[20],
208
- // #F4A736 - Orange
211
+ // Orange
209
212
  "data-7": discreteRainbow[13],
210
- // #7BAFDE - Light Blue
213
+ // Light Blue
211
214
  "data-8": discreteRainbow[15],
212
- // #90C987 - Light Green
215
+ // Light Green
213
216
  "data-9": discreteRainbow[3],
214
- // #CAACCB - Lavender
217
+ // Lavender
215
218
  "data-10": discreteRainbow[22],
216
- // #EE8026 - Dark Orange
219
+ // Dark Orange
217
220
  // Text colors (text-*)
218
221
  "text-primary": "#121828",
219
222
  "text-secondary": "#65748B",
@@ -225,9 +228,9 @@ var semanticColorsLight = {
225
228
  // Surface colors (surface-*) - for elevated containers
226
229
  "surface-base": primitiveColors.white,
227
230
  "surface-elevated": primitiveColors.neutral[50],
228
- // #FAFAFA - slightly off-white for elevated cards
231
+ // slightly off-white for elevated cards
229
232
  "surface-raised": primitiveColors.neutral[100],
230
- // #F3F4F6 - light gray for raised cards
233
+ // light gray for raised cards
231
234
  "surface-overlay": primitiveColors.white,
232
235
  "surface-input": primitiveColors.neutral[50],
233
236
  // Input field background (filled variant)
@@ -239,6 +242,8 @@ var semanticColorsLight = {
239
242
  "border-default": "#E8E9EB",
240
243
  "border-subtle": primitiveColors.neutral[100],
241
244
  "border-strong": primitiveColors.neutral[300],
245
+ "border-prominent": primitiveColors.neutral[400],
246
+ // high-visibility divider
242
247
  "border-focus": primitiveColors.blue[600],
243
248
  "border-input": primitiveColors.neutral[300],
244
249
  // Input field border
@@ -263,37 +268,41 @@ var semanticColorsLight = {
263
268
  };
264
269
  var semanticColorsDark = {
265
270
  // Brand colors stay the same in dark mode
266
- "brand-primary": primitiveColors.accent[400],
267
- "brand-primary-light": primitiveColors.accent[200],
268
- "brand-primary-dark": primitiveColors.accent[700],
271
+ "brand-primary": primitiveRamps.orange[400],
272
+ "brand-primary-light": primitiveRamps.orange[300],
273
+ "brand-primary-dark": primitiveRamps.orange[500],
269
274
  "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
270
- "brand-primary-hover": primitiveColors.accent[300],
271
- "brand-primary-active": primitiveColors.accent[200],
272
- "brand-secondary": primitiveColors.steel[500],
273
- "brand-secondary-light": primitiveColors.steel[300],
274
- "brand-secondary-dark": primitiveColors.steel[700],
275
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.12)",
276
- "brand-secondary-hover": primitiveColors.steel[400],
277
- "brand-secondary-active": primitiveColors.steel[300],
275
+ "brand-primary-hover": primitiveRamps.orange[300],
276
+ "brand-primary-active": primitiveRamps.orange[200],
277
+ "brand-secondary": primitiveRamps.cyan[600],
278
+ "brand-secondary-light": primitiveRamps.cyan[500],
279
+ "brand-secondary-dark": primitiveRamps.cyan[700],
280
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
281
+ "brand-secondary-hover": primitiveRamps.cyan[500],
282
+ "brand-secondary-active": primitiveRamps.cyan[400],
278
283
  // Text on brand backgrounds
279
284
  "on-brand-primary": primitiveColors.white,
280
285
  "on-brand-secondary": primitiveColors.white,
281
286
  // Status colors
282
- "status-success": primitiveColors.teal[500],
283
- "status-success-light": primitiveColors.teal[400],
284
- "status-success-dark": primitiveColors.teal[700],
285
- "status-success-subtle": "rgba(20, 184, 166, 0.12)",
286
- "status-error": primitiveColors.red[600],
287
- "status-error-light": primitiveColors.red[400],
288
- "status-error-dark": primitiveColors.red[700],
287
+ "status-success": primitiveRamps.green[300],
288
+ "status-success-light": primitiveRamps.green[200],
289
+ "status-success-dark": primitiveRamps.green[600],
290
+ "status-success-subtle": "rgba(46, 213, 115, 0.12)",
291
+ "status-error": primitiveRamps.red[600],
292
+ "status-error-light": primitiveRamps.red[500],
293
+ "status-error-dark": primitiveRamps.red[700],
289
294
  "status-error-subtle": "rgba(209, 67, 67, 0.12)",
290
- "status-warning": primitiveColors.amber[500],
291
- "status-warning-light": primitiveColors.amber[400],
292
- "status-warning-dark": primitiveColors.amber[600],
293
- "status-warning-subtle": "rgba(255, 176, 32, 0.12)",
294
- "status-info": primitiveColors.sky[500],
295
- "status-info-light": primitiveColors.sky[400],
296
- "status-info-dark": primitiveColors.sky[700],
295
+ "status-error-vivid": primitiveColors.redVivid[500],
296
+ "status-error-vivid-light": primitiveColors.redVivid[400],
297
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
298
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
299
+ "status-warning": primitiveRamps.amber[300],
300
+ "status-warning-light": primitiveRamps.amber[200],
301
+ "status-warning-dark": primitiveRamps.amber[500],
302
+ "status-warning-subtle": "rgba(249, 180, 21, 0.12)",
303
+ "status-info": primitiveRamps.blue[500],
304
+ "status-info-light": primitiveRamps.blue[300],
305
+ "status-info-dark": primitiveRamps.blue[600],
297
306
  "status-info-subtle": "rgba(33, 150, 243, 0.12)",
298
307
  // Text on status backgrounds
299
308
  "on-status-success": primitiveColors.white,
@@ -335,29 +344,31 @@ var semanticColorsDark = {
335
344
  "text-link-hover": primitiveColors.blue[400],
336
345
  // Surface colors - dark backgrounds
337
346
  "surface-base": primitiveColors.charcoal[700],
338
- // #161616 - main surface
347
+ // main surface
339
348
  "surface-elevated": primitiveColors.charcoal[600],
340
- // #191919 - elevated surface
349
+ // elevated surface
341
350
  "surface-raised": primitiveColors.charcoal[500],
342
- // #1C1C1C - raised surface
351
+ // raised surface
343
352
  "surface-overlay": primitiveColors.charcoal[600],
344
- // #191919 - overlay surface
353
+ // overlay surface
345
354
  "surface-input": primitiveColors.charcoal[600],
346
- // #191919 - input surface
355
+ // input surface
347
356
  // Background colors
348
357
  "background-base": primitiveColors.charcoal[900],
349
- // #101010 - darkest charcoal
358
+ // darkest charcoal
350
359
  "background-default": primitiveColors.charcoal[700],
351
- // #161616 - main background
360
+ // main background
352
361
  "background-subtle": primitiveColors.charcoal[500],
353
- // #1C1C1C - subtle background
362
+ // subtle background
354
363
  // Border colors
355
364
  "border-default": primitiveColors.charcoal[400],
356
- // #1F1F1F - default border
365
+ // default border
357
366
  "border-subtle": primitiveColors.charcoal[500],
358
- // #1C1C1C - subtle border
367
+ // subtle border
359
368
  "border-strong": primitiveColors.charcoal[300],
360
- // #2C2C2C - strong border
369
+ // strong border
370
+ "border-prominent": primitiveColors.charcoal[200],
371
+ // high-visibility divider
361
372
  "border-focus": "#828DF8",
362
373
  "border-input": primitiveColors.neutral[600],
363
374
  "border-input-hover": primitiveColors.neutral[500],
@@ -372,7 +383,7 @@ var semanticColorsDark = {
372
383
  "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
373
384
  // Divider
374
385
  "divider": primitiveColors.charcoal[400],
375
- // #1F1F1F - divider color
386
+ // divider color
376
387
  // Avatar default
377
388
  "avatar-background": primitiveColors.neutral[600],
378
389
  "avatar-text": primitiveColors.white
@@ -388,21 +399,22 @@ function resolveColor(token, mode = "dark") {
388
399
 
389
400
  // src/theme/workout-tokens.ts
390
401
  var WORKOUT_TOKENS = {
391
- // BodyMap volume heatmap scale (drive dynamic SVG fills, so inline values).
392
- // Maps weekly-volume status against MEV/MAV/MRV landmarks to a fill color.
402
+ // BodyMap volume heatmap the canonical `divergingScale` (under optimal
403
+ // over): a true diverging shape with a light green center, cool-blue under-
404
+ // trained end and warm-red over-reaching end (colorblind-robust in lightness).
393
405
  heatmap: {
394
406
  none: "#E0E0E0",
395
- // gray — no training data
396
- under: "#4A90D9",
397
- // cool blue — below MEV
398
- maintenance: "#F5C842",
399
- // warm yellow — MEV to MAV
400
- productive: "#4CAF50",
401
- // green — MAV to MRV
402
- approaching: "#FFA502",
403
- // orange — near MRV
404
- over: "#FF6B35"
405
- // red-orange — over MRV
407
+ // no training data
408
+ under: divergingScale[0],
409
+ // below MEV
410
+ maintenance: divergingScale[1],
411
+ // MEV to MAV
412
+ productive: divergingScale[2],
413
+ // optimal center — MAV to MRV
414
+ approaching: divergingScale[3],
415
+ // near MRV
416
+ over: divergingScale[4]
417
+ // over MRV
406
418
  }};
407
419
 
408
420
  // src/components/custom/Workout/muscleTaxonomy.ts
@@ -608,6 +620,7 @@ var jsxs = wrapJsx(jsxs$1);
608
620
 
609
621
  // src/components/custom/Workout/BodyMap.tsx
610
622
  var Body = BodyHighlighter.default ?? BodyHighlighter;
623
+ var BRAND_PRIMARY = getSemanticColors("dark")["brand-primary"];
611
624
  var OUTLINE_FILL = "rgba(255,255,255,0.08)";
612
625
  var OUTLINE_BORDER = "rgba(255,255,255,0.12)";
613
626
  var BODY_SCALE = 0.8;
@@ -786,7 +799,7 @@ function ViewToggle({ view, onViewChange }) {
786
799
  borderRadius: 9999,
787
800
  backgroundColor: active ? "rgba(255,121,0,0.16)" : "transparent",
788
801
  borderWidth: 1,
789
- borderColor: active ? "#FF7900" : resolveColor("border-strong")
802
+ borderColor: active ? BRAND_PRIMARY : resolveColor("border-strong")
790
803
  },
791
804
  testID: `body-map-toggle-${side}`,
792
805
  children: /* @__PURE__ */ jsx(
@@ -796,7 +809,7 @@ function ViewToggle({ view, onViewChange }) {
796
809
  fontSize: 12,
797
810
  fontFamily: "Inter, sans-serif",
798
811
  fontWeight: active ? "700" : "500",
799
- color: active ? "#FF7900" : resolveColor("text-secondary"),
812
+ color: active ? BRAND_PRIMARY : resolveColor("text-secondary"),
800
813
  textTransform: "capitalize"
801
814
  },
802
815
  children: side
@@ -828,7 +841,7 @@ function MuscleButton({ entry, highlighted, onMusclePress }) {
828
841
  paddingVertical: 3,
829
842
  borderRadius: 9999,
830
843
  borderWidth: 1,
831
- borderColor: highlighted ? "#FF7900" : resolveColor("border-default")
844
+ borderColor: highlighted ? BRAND_PRIMARY : resolveColor("border-default")
832
845
  },
833
846
  testID: `body-map-muscle-${entry.key}`,
834
847
  children: [
@@ -869,7 +882,8 @@ var colorStyles = {
869
882
  success: "bg-status-success",
870
883
  error: "bg-status-error",
871
884
  warning: "bg-status-warning",
872
- info: "bg-status-info"
885
+ info: "bg-status-info",
886
+ "error-vivid": "bg-status-error-vivid"
873
887
  };
874
888
  function Indicator({
875
889
  size = "sm",
@@ -877,14 +891,40 @@ function Indicator({
877
891
  customColor,
878
892
  glow = false,
879
893
  ring = false,
894
+ pulse = false,
880
895
  className,
881
896
  style,
882
897
  ...props
883
898
  }) {
899
+ const pulseMode = pulse === true ? "opacity" : pulse || false;
900
+ const colorClass = !customColor ? colorStyles[color] : void 0;
901
+ const colorStyle = customColor ? { backgroundColor: customColor } : void 0;
902
+ if (pulseMode === "ping") {
903
+ return /* @__PURE__ */ jsxs(View, { className: cn("relative", sizeStyles[size], className), style, ...props, children: [
904
+ /* @__PURE__ */ jsx(
905
+ View,
906
+ {
907
+ className: cn("absolute inset-0 rounded-full animate-ping", colorClass),
908
+ style: colorStyle
909
+ }
910
+ ),
911
+ /* @__PURE__ */ jsx(
912
+ View,
913
+ {
914
+ className: cn(
915
+ "relative rounded-full",
916
+ sizeStyles[size],
917
+ colorClass,
918
+ ring && "border-2 border-background-base"
919
+ ),
920
+ style: colorStyle
921
+ }
922
+ )
923
+ ] });
924
+ }
884
925
  const dynamicStyle = {
885
926
  ...typeof style === "object" ? style : {},
886
- ...customColor ? { backgroundColor: customColor } : {},
887
- ...glow && !customColor ? {} : {},
927
+ ...colorStyle ?? {},
888
928
  ...glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}
889
929
  };
890
930
  return /* @__PURE__ */ jsx(
@@ -893,12 +933,14 @@ function Indicator({
893
933
  className: cn(
894
934
  "rounded-full shrink-0",
895
935
  sizeStyles[size],
896
- !customColor && colorStyles[color],
936
+ colorClass,
937
+ pulseMode === "opacity" && "animate-pulse",
897
938
  ring && "border-2 border-background-base",
898
- glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(20,184,166,0.6)]",
939
+ glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(46,213,115,0.6)]",
899
940
  glow && !customColor && color === "error" && "shadow-[0_0_6px_rgba(239,68,68,0.6)]",
900
941
  glow && !customColor && color === "warning" && "shadow-[0_0_6px_rgba(245,158,11,0.6)]",
901
942
  glow && !customColor && color === "primary" && "shadow-[0_0_6px_rgba(255,121,0,0.6)]",
943
+ glow && !customColor && color === "error-vivid" && "shadow-[0_0_6px_rgba(255,71,87,0.6)]",
902
944
  className
903
945
  ),
904
946
  style: Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style,
@@ -976,7 +1018,7 @@ function Badge({
976
1018
  }
977
1019
  );
978
1020
  }
979
- var BRAND_PRIMARY = "#FF7900";
1021
+ var BRAND_PRIMARY2 = getSemanticColors("dark")["brand-primary"];
980
1022
  function normalizeData(data, height) {
981
1023
  if (data.length === 0) return [];
982
1024
  const min = Math.min(...data);
@@ -1013,7 +1055,7 @@ function Sparkline({
1013
1055
  }
1014
1056
  );
1015
1057
  }
1016
- const resolvedColor = color ?? BRAND_PRIMARY;
1058
+ const resolvedColor = color ?? BRAND_PRIMARY2;
1017
1059
  const normalized = normalizeData(data, height);
1018
1060
  const stepX = data.length > 1 ? width / (data.length - 1) : 0;
1019
1061
  const dotSize = 3;
@@ -1129,8 +1171,9 @@ function Sparkline({
1129
1171
  }
1130
1172
 
1131
1173
  // src/components/custom/Workout/BodyMapDetailPanel.tsx
1132
- var BRAND_PRIMARY2 = "#FF7900";
1133
- var VOLUME_GRADIENT = "linear-gradient(90deg, #2196F3 0%, #14B8A6 50%, #D14343 100%)";
1174
+ var t = getSemanticColors("dark");
1175
+ var BRAND_PRIMARY3 = t["brand-primary"];
1176
+ var VOLUME_GRADIENT = `linear-gradient(90deg, ${t["status-info"]} 0%, ${t["status-success"]} 50%, ${t["status-error"]} 100%)`;
1134
1177
  var SLIDE_OFFSET = 400;
1135
1178
  var BACKDROP_OPACITY = 0.4;
1136
1179
  var STATUS_BADGE_COLOR = {
@@ -1528,7 +1571,7 @@ function BodyMapDetailPanel({
1528
1571
  borderColor: "rgba(255,121,0,0.3)"
1529
1572
  },
1530
1573
  testID: "body-map-detail-panel-view-exercises",
1531
- children: /* @__PURE__ */ jsx(Text, { style: { fontSize: 13, fontFamily: "Inter, sans-serif", fontWeight: "700", color: BRAND_PRIMARY2 }, children: "View exercises" })
1574
+ children: /* @__PURE__ */ jsx(Text, { style: { fontSize: 13, fontFamily: "Inter, sans-serif", fontWeight: "700", color: BRAND_PRIMARY3 }, children: "View exercises" })
1532
1575
  }
1533
1576
  )
1534
1577
  ]
@@ -2266,17 +2309,18 @@ function CardContent({ children, className }) {
2266
2309
  function CardFooter({ children, className }) {
2267
2310
  return /* @__PURE__ */ jsx(View, { className: cn("px-6 py-4 flex-row items-center gap-2", className), children });
2268
2311
  }
2312
+ var t2 = getSemanticColors("dark");
2269
2313
  var solidVariantColors = {
2270
- success: "#14B8A6",
2271
- warning: "#FFB020",
2272
- error: "#D14343",
2314
+ success: t2["status-success"],
2315
+ warning: t2["status-warning"],
2316
+ error: t2["status-error"],
2273
2317
  neutral: "#6B7280"
2274
2318
  };
2275
2319
  var ringVariantStyles = {
2276
2320
  "on-track": {
2277
- backgroundColor: "rgba(20,184,166,0.15)",
2321
+ backgroundColor: "rgba(46,213,115,0.15)",
2278
2322
  borderWidth: 1,
2279
- borderColor: "rgba(20,184,166,0.3)"
2323
+ borderColor: "rgba(46,213,115,0.3)"
2280
2324
  },
2281
2325
  deviation: {
2282
2326
  backgroundColor: "rgba(245,158,11,0.15)",
@@ -2291,11 +2335,11 @@ var ringVariantStyles = {
2291
2335
  }
2292
2336
  };
2293
2337
  var glowStyles = {
2294
- success: { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
2338
+ success: { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
2295
2339
  warning: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
2296
2340
  error: { boxShadow: "0 0 4px rgba(239,68,68,0.4)" },
2297
2341
  neutral: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" },
2298
- "on-track": { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
2342
+ "on-track": { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
2299
2343
  deviation: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
2300
2344
  future: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" }
2301
2345
  };
@@ -2309,8 +2353,8 @@ var iconColors = {
2309
2353
  warning: "#6B4000",
2310
2354
  error: "#5C1A1A",
2311
2355
  neutral: "#D1D5DB",
2312
- "on-track": "#14B8A6",
2313
- deviation: "#FFB020",
2356
+ "on-track": t2["status-success"],
2357
+ deviation: t2["status-warning"],
2314
2358
  future: "#6B7280"
2315
2359
  };
2316
2360
  var sizeDimensions = {
@@ -2391,20 +2435,23 @@ function StatusDot({
2391
2435
  }
2392
2436
  return /* @__PURE__ */ jsx(View, { className, ...props, children: dot });
2393
2437
  }
2438
+ var MESO_ACCENT_GRADIENT_DARK = primitiveRamps.orange[500];
2439
+ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
2394
2440
 
2395
2441
  // src/components/custom/Workout/MesoStatusCard.tsx
2396
- var BRAND_PRIMARY3 = "#FF7900";
2397
- var BRAND_PRIMARY_DARK = "#C45E00";
2398
- var BRAND_PRIMARY_LIGHT = "#FFB066";
2399
- var SUCCESS = "#14B8A6";
2400
- var WARNING = "#FFB020";
2401
- var ERROR = "#D14343";
2402
- var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY3, BRAND_PRIMARY_LIGHT];
2442
+ var t3 = getSemanticColors("dark");
2443
+ var BRAND_PRIMARY4 = t3["brand-primary"];
2444
+ var BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK;
2445
+ var BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT;
2446
+ var SUCCESS = t3["status-success"];
2447
+ var WARNING = t3["status-warning"];
2448
+ var ERROR = t3["status-error"];
2449
+ var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY4, BRAND_PRIMARY_LIGHT];
2403
2450
  var CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor("surface-elevated")} 0%, ${resolveColor("surface-raised")} 100%)`;
2404
- var GAUGE_GRADIENT = "linear-gradient(90deg, rgba(20,184,166,0.25) 0%, rgba(255,176,32,0.25) 50%, rgba(209,67,67,0.25) 100%)";
2451
+ var GAUGE_GRADIENT = "linear-gradient(90deg, rgba(46,213,115,0.25) 0%, rgba(249,180,21,0.25) 50%, rgba(209,67,67,0.25) 100%)";
2405
2452
  var STATUS_VARIANTS = {
2406
- success: { bg: "rgba(20,184,166,0.15)", border: "rgba(20,184,166,0.3)", text: SUCCESS },
2407
- warning: { bg: "rgba(255,176,32,0.15)", border: "rgba(255,176,32,0.3)", text: WARNING },
2453
+ success: { bg: "rgba(46,213,115,0.15)", border: "rgba(46,213,115,0.3)", text: SUCCESS },
2454
+ warning: { bg: "rgba(249,180,21,0.15)", border: "rgba(249,180,21,0.3)", text: WARNING },
2408
2455
  error: { bg: "rgba(209,67,67,0.15)", border: "rgba(209,67,67,0.25)", text: ERROR }
2409
2456
  };
2410
2457
  function clamp012(value) {
@@ -2696,9 +2743,9 @@ function MesoStatusCard({
2696
2743
  View,
2697
2744
  {
2698
2745
  style: {
2699
- backgroundColor: "rgba(255,176,32,0.06)",
2746
+ backgroundColor: "rgba(249,180,21,0.06)",
2700
2747
  borderWidth: 1,
2701
- borderColor: "rgba(255,176,32,0.15)",
2748
+ borderColor: "rgba(249,180,21,0.15)",
2702
2749
  borderRadius: 8,
2703
2750
  paddingVertical: 10,
2704
2751
  paddingHorizontal: 12
@@ -2724,9 +2771,9 @@ function MesoStatusCard({
2724
2771
  className: "flex-row items-center",
2725
2772
  style: {
2726
2773
  gap: 8,
2727
- backgroundColor: "rgba(20,184,166,0.06)",
2774
+ backgroundColor: "rgba(46,213,115,0.06)",
2728
2775
  borderWidth: 1,
2729
- borderColor: "rgba(20,184,166,0.2)",
2776
+ borderColor: "rgba(46,213,115,0.2)",
2730
2777
  borderRadius: 8,
2731
2778
  paddingVertical: 10,
2732
2779
  paddingHorizontal: 12