@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/pages.mjs CHANGED
@@ -6,22 +6,150 @@ import { twMerge } from 'tailwind-merge';
6
6
 
7
7
  // src/components/custom/Workout/ActiveWorkoutPage.tsx
8
8
 
9
+ // src/theme/tokens/primitives.ts
10
+ var primitiveColors = {
11
+ // Blue scale (primary brand)
12
+ blue: {
13
+ 400: "#60A5FA",
14
+ 600: "#5048E5",
15
+ // Primary main
16
+ 700: "#3832A0"},
17
+ // Red scale (error)
18
+ red: {
19
+ // Error light
20
+ 500: "#EF4444",
21
+ 600: "#D14343"},
22
+ // Vivid red scale (alert)
23
+ redVivid: {
24
+ 400: "#FF6070",
25
+ // Error vivid light
26
+ 500: "#FF4757",
27
+ 700: "#C42539"},
28
+ // Neutral/Gray scale
29
+ neutral: {
30
+ 50: "#FAFAFA",
31
+ 100: "#F3F4F6",
32
+ 300: "#D1D5DB",
33
+ 400: "#9CA3AF",
34
+ 500: "#6B7280",
35
+ 600: "#4B5563",
36
+ 900: "#111827"},
37
+ // Charcoal scale (dark backgrounds)
38
+ charcoal: {
39
+ 200: "#3C3C3C",
40
+ 300: "#2C2C2C",
41
+ 400: "#1F1F1F",
42
+ 500: "#1C1C1C",
43
+ 600: "#191919",
44
+ 700: "#161616",
45
+ 900: "#101010"
46
+ },
47
+ // Pure colors
48
+ white: "#FFFFFF"};
49
+ var primitiveRamps = {
50
+ red: {
51
+ 50: "#FFF4F4",
52
+ 500: "#E05254",
53
+ 600: "#D14343",
54
+ // pin
55
+ 700: "#A4221C",
56
+ 800: "#7E1002"},
57
+ orange: {
58
+ 200: "#FFC7A2",
59
+ 300: "#FFA063",
60
+ 400: "#FF7900",
61
+ // pin
62
+ 500: "#DA5F00",
63
+ 600: "#B94A00"},
64
+ amber: {
65
+ 50: "#FFF7DD",
66
+ 200: "#FFD352",
67
+ 300: "#F9B415",
68
+ 500: "#C27400"},
69
+ green: {
70
+ 50: "#E3FFEE",
71
+ 200: "#58F69E",
72
+ 300: "#2ED573",
73
+ 600: "#298732"},
74
+ cyan: {
75
+ // pin
76
+ 400: "#01B5D1",
77
+ 500: "#2697B7",
78
+ 600: "#307B9B",
79
+ 700: "#2A617F",
80
+ 800: "#22465F"},
81
+ blue: {
82
+ 50: "#EFF8FF",
83
+ 300: "#78C2FF",
84
+ 500: "#2196F3",
85
+ // pin
86
+ 600: "#1072CB"},
87
+ magenta: {
88
+ 600: "#BA2996"}
89
+ };
90
+ var sequentialEffort = [
91
+ primitiveRamps.green[300],
92
+ primitiveRamps.amber[200],
93
+ primitiveRamps.amber[300],
94
+ primitiveRamps.orange[400],
95
+ primitiveRamps.red[600],
96
+ primitiveRamps.red[700]
97
+ ];
98
+ var discreteRainbow = [
99
+ "#E8ECFB",
100
+ "#D9CCE3",
101
+ "#D1BBD7",
102
+ "#CAACCB",
103
+ "#BA8DB4",
104
+ "#AE76A3",
105
+ "#AA6F9E",
106
+ "#994F88",
107
+ "#882E72",
108
+ "#1965B0",
109
+ "#437DBF",
110
+ "#5289C7",
111
+ "#6195CF",
112
+ "#7BAFDE",
113
+ "#4EB265",
114
+ "#90C987",
115
+ "#CAE0AB",
116
+ "#F7F056",
117
+ "#F7CB45",
118
+ "#F6C141",
119
+ "#F4A736",
120
+ "#F1932D",
121
+ "#EE8026",
122
+ "#E8601C",
123
+ "#E65518",
124
+ "#DC050C",
125
+ "#A5170E",
126
+ "#72190E",
127
+ "#42150A"
128
+ ];
129
+
9
130
  // src/theme/workout-tokens.ts
10
131
  var WORKOUT_TOKENS = {
11
132
  // Canonical 4-band performance scale — the single source for BOTH the
12
133
  // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction
13
134
  // is intentionally inverted between the two consumers: for velocity, green =
14
- // fastest/best; for RPE, green = easiest. Each component maps its own
15
- // thresholds onto these four colors. Kept as vivid data-viz values (distinct
16
- // from the muted status tokens) and theme-independent, so — like the heatmap
17
- // scale below — they are consumed inline as a JS import rather than CSS vars.
18
- // A JS import also resolves on native RN, unlike var(--…) strings.
135
+ // fastest/best; for RPE, green = easiest. This is the [0,1,2,4] subsample of
136
+ // the canonical `sequentialEffort` primitive. The `orange` key is the band
137
+ // label. Consumed inline (RN).
19
138
  scale: {
20
- green: "#2ed573",
21
- yellow: "#ffd43b",
22
- orange: "#ffa502",
23
- red: "#ff4757"
139
+ green: sequentialEffort[0],
140
+ yellow: sequentialEffort[1],
141
+ orange: sequentialEffort[2],
142
+ // gold band
143
+ red: sequentialEffort[4]
24
144
  },
145
+ // Surface and border colors were removed here: those flip with the theme, so
146
+ // components use the CSS custom properties (var(--color-surface-*/border-*))
147
+ // directly. Only theme-independent data-viz values remain below.
148
+ // Intensity bar specific — over-target tiers deepen along the red ramp.
149
+ intensity: {
150
+ // matches status-error
151
+ over2: primitiveRamps.red[700],
152
+ over3: primitiveRamps.red[800]},
25
153
  // Placeholder strip
26
154
  placeholder: {
27
155
  fill: "#3A3A3A"
@@ -487,12 +615,14 @@ function PlaceholderStrip({
487
615
  return /* @__PURE__ */ jsx(SingleStrip, { ...props });
488
616
  }
489
617
 
490
- // src/components/custom/Workout/icons.tsx
491
- function DumbbellIcon({
618
+ // src/components/icons/SvgIcon.tsx
619
+ function SvgIcon({
492
620
  size = 24,
493
621
  color = "currentColor",
622
+ strokeWidth = 2,
494
623
  fill = "none",
495
- strokeWidth = 2
624
+ title,
625
+ children
496
626
  }) {
497
627
  return /* @__PURE__ */ jsxs(
498
628
  "svg",
@@ -505,36 +635,27 @@ function DumbbellIcon({
505
635
  strokeWidth,
506
636
  strokeLinecap: "round",
507
637
  strokeLinejoin: "round",
638
+ ...title ? { role: "img", "aria-label": title } : { "aria-hidden": true },
508
639
  children: [
509
- /* @__PURE__ */ jsx("path", { d: "M14.4 14.4 9.6 9.6" }),
510
- /* @__PURE__ */ jsx("path", { d: "M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767a2 2 0 1 1 2.828 2.829z" }),
511
- /* @__PURE__ */ jsx("path", { d: "m21.5 21.5-1.4-1.4" }),
512
- /* @__PURE__ */ jsx("path", { d: "M3.9 3.9 2.5 2.5" }),
513
- /* @__PURE__ */ jsx("path", { d: "M6.404 12.768a2 2 0 1 1-2.829-2.829l1.768-1.767a2 2 0 1 1-2.828-2.829l2.828-2.828a2 2 0 1 1 2.829 2.828l1.767-1.768a2 2 0 1 1 2.829 2.829z" })
640
+ title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
641
+ children
514
642
  ]
515
643
  }
516
644
  );
517
645
  }
518
- function StarIcon({
519
- size = 24,
520
- color = "currentColor",
521
- fill = "none",
522
- strokeWidth = 2
523
- }) {
524
- return /* @__PURE__ */ jsx(
525
- "svg",
526
- {
527
- width: size,
528
- height: size,
529
- viewBox: "0 0 24 24",
530
- fill,
531
- stroke: color,
532
- strokeWidth,
533
- strokeLinecap: "round",
534
- strokeLinejoin: "round",
535
- children: /* @__PURE__ */ jsx("path", { d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" })
536
- }
537
- );
646
+
647
+ // src/components/icons/icons.tsx
648
+ function DumbbellIcon(props) {
649
+ return /* @__PURE__ */ jsxs(SvgIcon, { ...props, children: [
650
+ /* @__PURE__ */ jsx("path", { d: "M14.4 14.4 9.6 9.6" }),
651
+ /* @__PURE__ */ jsx("path", { d: "M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767a2 2 0 1 1 2.828 2.829z" }),
652
+ /* @__PURE__ */ jsx("path", { d: "m21.5 21.5-1.4-1.4" }),
653
+ /* @__PURE__ */ jsx("path", { d: "M3.9 3.9 2.5 2.5" }),
654
+ /* @__PURE__ */ jsx("path", { d: "M6.404 12.768a2 2 0 1 1-2.829-2.829l1.768-1.767a2 2 0 1 1-2.828-2.829l2.828-2.828a2 2 0 1 1 2.829 2.828l1.767-1.768a2 2 0 1 1 2.829 2.829z" })
655
+ ] });
656
+ }
657
+ function StarIcon(props) {
658
+ return /* @__PURE__ */ jsx(SvgIcon, { ...props, children: /* @__PURE__ */ jsx("path", { d: "M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" }) });
538
659
  }
539
660
  var baseBadgeSizeConfig = {
540
661
  sm: { fontSize: 9, paddingH: 6, paddingV: 2, iconSize: 10 },
@@ -614,6 +735,266 @@ function BaseBadge({
614
735
  return badge;
615
736
  }
616
737
 
738
+ // src/theme/tokens/semantic.ts
739
+ var semanticColorsLight = {
740
+ // Brand colors (brand-*)
741
+ "brand-primary": primitiveRamps.orange[400],
742
+ "brand-primary-light": primitiveRamps.orange[300],
743
+ "brand-primary-dark": primitiveRamps.orange[500],
744
+ "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
745
+ "brand-primary-hover": primitiveRamps.orange[500],
746
+ "brand-primary-active": primitiveRamps.orange[600],
747
+ "brand-secondary": primitiveRamps.cyan[600],
748
+ "brand-secondary-light": primitiveRamps.cyan[500],
749
+ "brand-secondary-dark": primitiveRamps.cyan[700],
750
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.08)",
751
+ "brand-secondary-hover": primitiveRamps.cyan[700],
752
+ "brand-secondary-active": primitiveRamps.cyan[800],
753
+ // Text on brand backgrounds (on-*)
754
+ "on-brand-primary": primitiveColors.white,
755
+ "on-brand-secondary": primitiveColors.white,
756
+ // Status colors (status-*)
757
+ "status-success": primitiveRamps.green[300],
758
+ "status-success-light": primitiveRamps.green[200],
759
+ "status-success-dark": primitiveRamps.green[600],
760
+ "status-success-subtle": primitiveRamps.green[50],
761
+ "status-error": primitiveRamps.red[600],
762
+ "status-error-light": primitiveRamps.red[500],
763
+ "status-error-dark": primitiveRamps.red[700],
764
+ "status-error-subtle": primitiveRamps.red[50],
765
+ "status-error-vivid": primitiveColors.redVivid[500],
766
+ // vivid alert red
767
+ "status-error-vivid-light": primitiveColors.redVivid[400],
768
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
769
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
770
+ "status-warning": primitiveRamps.amber[300],
771
+ "status-warning-light": primitiveRamps.amber[200],
772
+ "status-warning-dark": primitiveRamps.amber[500],
773
+ "status-warning-subtle": primitiveRamps.amber[50],
774
+ "status-info": primitiveRamps.blue[500],
775
+ "status-info-light": primitiveRamps.blue[300],
776
+ "status-info-dark": primitiveRamps.blue[600],
777
+ "status-info-subtle": primitiveRamps.blue[50],
778
+ // Text on status backgrounds (on-status-*)
779
+ "on-status-success": primitiveColors.white,
780
+ "on-status-error": primitiveColors.white,
781
+ "on-status-warning": primitiveColors.white,
782
+ "on-status-info": primitiveColors.white,
783
+ // Result/outcome indicators (result-*)
784
+ "result-improve": "#4caf50",
785
+ // Green - positive outcome
786
+ "result-improve-light": "rgba(76, 175, 80, 0.12)",
787
+ "result-improve-dark": "#248a24",
788
+ "result-degrade": "#ef5350",
789
+ // Red - negative outcome
790
+ "result-degrade-light": "rgba(239, 83, 80, 0.12)",
791
+ "result-degrade-dark": "#b30000",
792
+ "result-inconclusive": "#9E9A97",
793
+ // Gray - no clear result
794
+ "result-inconclusive-light": "rgba(158, 154, 151, 0.12)",
795
+ "result-neutral": primitiveColors.neutral[500],
796
+ // Neutral baseline
797
+ // Text on result backgrounds (on-result-*)
798
+ "on-result-improve": primitiveColors.white,
799
+ "on-result-degrade": primitiveColors.white,
800
+ "on-result-inconclusive": primitiveColors.white,
801
+ // Data visualization colors (data-*)
802
+ // First 10 colors from discrete rainbow optimized for charts
803
+ "data-1": discreteRainbow[9],
804
+ // Blue
805
+ "data-2": discreteRainbow[14],
806
+ // Green
807
+ "data-3": discreteRainbow[17],
808
+ // Yellow
809
+ "data-4": discreteRainbow[25],
810
+ // Red
811
+ "data-5": discreteRainbow[8],
812
+ // Purple
813
+ "data-6": discreteRainbow[20],
814
+ // Orange
815
+ "data-7": discreteRainbow[13],
816
+ // Light Blue
817
+ "data-8": discreteRainbow[15],
818
+ // Light Green
819
+ "data-9": discreteRainbow[3],
820
+ // Lavender
821
+ "data-10": discreteRainbow[22],
822
+ // Dark Orange
823
+ // Text colors (text-*)
824
+ "text-primary": "#121828",
825
+ "text-secondary": "#65748B",
826
+ "text-tertiary": primitiveColors.neutral[400],
827
+ "text-disabled": "rgba(55, 65, 81, 0.48)",
828
+ "text-inverse": primitiveColors.white,
829
+ "text-link": primitiveColors.blue[600],
830
+ "text-link-hover": primitiveColors.blue[700],
831
+ // Surface colors (surface-*) - for elevated containers
832
+ "surface-base": primitiveColors.white,
833
+ "surface-elevated": primitiveColors.neutral[50],
834
+ // slightly off-white for elevated cards
835
+ "surface-raised": primitiveColors.neutral[100],
836
+ // light gray for raised cards
837
+ "surface-overlay": primitiveColors.white,
838
+ "surface-input": primitiveColors.neutral[50],
839
+ // Input field background (filled variant)
840
+ // Background colors (background-*)
841
+ "background-base": "#EBEBEB",
842
+ "background-default": primitiveColors.white,
843
+ "background-subtle": primitiveColors.neutral[50],
844
+ // Border colors (border-*)
845
+ "border-default": "#E8E9EB",
846
+ "border-subtle": primitiveColors.neutral[100],
847
+ "border-strong": primitiveColors.neutral[300],
848
+ "border-prominent": primitiveColors.neutral[400],
849
+ // high-visibility divider
850
+ "border-focus": primitiveColors.blue[600],
851
+ "border-input": primitiveColors.neutral[300],
852
+ // Input field border
853
+ "border-input-hover": primitiveColors.neutral[400],
854
+ // Input field border on hover
855
+ "border-input-focus": primitiveColors.blue[600],
856
+ // Input field border on focus
857
+ "border-input-error": primitiveColors.red[600],
858
+ // Input field border on error
859
+ // Interactive states (interactive-*)
860
+ "interactive-hover": "rgba(55, 65, 81, 0.04)",
861
+ "interactive-focus": "rgba(55, 65, 81, 0.12)",
862
+ "interactive-active": "rgba(55, 65, 81, 0.16)",
863
+ "interactive-selected": "rgba(55, 65, 81, 0.08)",
864
+ "interactive-disabled": "rgba(55, 65, 81, 0.12)",
865
+ "interactive-disabled-text": "rgba(55, 65, 81, 0.26)",
866
+ // Divider
867
+ "divider": "#E8E9EB",
868
+ // Avatar default
869
+ "avatar-background": primitiveColors.neutral[500],
870
+ "avatar-text": primitiveColors.white
871
+ };
872
+ var semanticColorsDark = {
873
+ // Brand colors stay the same in dark mode
874
+ "brand-primary": primitiveRamps.orange[400],
875
+ "brand-primary-light": primitiveRamps.orange[300],
876
+ "brand-primary-dark": primitiveRamps.orange[500],
877
+ "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
878
+ "brand-primary-hover": primitiveRamps.orange[300],
879
+ "brand-primary-active": primitiveRamps.orange[200],
880
+ "brand-secondary": primitiveRamps.cyan[600],
881
+ "brand-secondary-light": primitiveRamps.cyan[500],
882
+ "brand-secondary-dark": primitiveRamps.cyan[700],
883
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
884
+ "brand-secondary-hover": primitiveRamps.cyan[500],
885
+ "brand-secondary-active": primitiveRamps.cyan[400],
886
+ // Text on brand backgrounds
887
+ "on-brand-primary": primitiveColors.white,
888
+ "on-brand-secondary": primitiveColors.white,
889
+ // Status colors
890
+ "status-success": primitiveRamps.green[300],
891
+ "status-success-light": primitiveRamps.green[200],
892
+ "status-success-dark": primitiveRamps.green[600],
893
+ "status-success-subtle": "rgba(46, 213, 115, 0.12)",
894
+ "status-error": primitiveRamps.red[600],
895
+ "status-error-light": primitiveRamps.red[500],
896
+ "status-error-dark": primitiveRamps.red[700],
897
+ "status-error-subtle": "rgba(209, 67, 67, 0.12)",
898
+ "status-error-vivid": primitiveColors.redVivid[500],
899
+ "status-error-vivid-light": primitiveColors.redVivid[400],
900
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
901
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
902
+ "status-warning": primitiveRamps.amber[300],
903
+ "status-warning-light": primitiveRamps.amber[200],
904
+ "status-warning-dark": primitiveRamps.amber[500],
905
+ "status-warning-subtle": "rgba(249, 180, 21, 0.12)",
906
+ "status-info": primitiveRamps.blue[500],
907
+ "status-info-light": primitiveRamps.blue[300],
908
+ "status-info-dark": primitiveRamps.blue[600],
909
+ "status-info-subtle": "rgba(33, 150, 243, 0.12)",
910
+ // Text on status backgrounds
911
+ "on-status-success": primitiveColors.white,
912
+ "on-status-error": primitiveColors.white,
913
+ "on-status-warning": primitiveColors.white,
914
+ "on-status-info": primitiveColors.white,
915
+ // Result/outcome indicators (result-*)
916
+ "result-improve": "#4caf50",
917
+ "result-improve-light": "rgba(76, 175, 80, 0.16)",
918
+ "result-improve-dark": "#248a24",
919
+ "result-degrade": "#ef5350",
920
+ "result-degrade-light": "rgba(239, 83, 80, 0.16)",
921
+ "result-degrade-dark": "#b30000",
922
+ "result-inconclusive": "#9E9A97",
923
+ "result-inconclusive-light": "rgba(158, 154, 151, 0.16)",
924
+ "result-neutral": primitiveColors.neutral[400],
925
+ // Text on result backgrounds
926
+ "on-result-improve": primitiveColors.white,
927
+ "on-result-degrade": primitiveColors.white,
928
+ "on-result-inconclusive": primitiveColors.white,
929
+ // Data visualization colors (same in dark mode for consistency)
930
+ "data-1": discreteRainbow[9],
931
+ "data-2": discreteRainbow[14],
932
+ "data-3": discreteRainbow[17],
933
+ "data-4": discreteRainbow[25],
934
+ "data-5": discreteRainbow[8],
935
+ "data-6": discreteRainbow[20],
936
+ "data-7": discreteRainbow[13],
937
+ "data-8": discreteRainbow[15],
938
+ "data-9": discreteRainbow[3],
939
+ "data-10": discreteRainbow[22],
940
+ // Text colors - inverted for dark mode
941
+ "text-primary": primitiveColors.neutral[100],
942
+ "text-secondary": primitiveColors.neutral[400],
943
+ "text-tertiary": primitiveColors.neutral[500],
944
+ "text-disabled": "rgba(255, 255, 255, 0.38)",
945
+ "text-inverse": primitiveColors.neutral[900],
946
+ "text-link": "#828DF8",
947
+ "text-link-hover": primitiveColors.blue[400],
948
+ // Surface colors - dark backgrounds
949
+ "surface-base": primitiveColors.charcoal[700],
950
+ // main surface
951
+ "surface-elevated": primitiveColors.charcoal[600],
952
+ // elevated surface
953
+ "surface-raised": primitiveColors.charcoal[500],
954
+ // raised surface
955
+ "surface-overlay": primitiveColors.charcoal[600],
956
+ // overlay surface
957
+ "surface-input": primitiveColors.charcoal[600],
958
+ // input surface
959
+ // Background colors
960
+ "background-base": primitiveColors.charcoal[900],
961
+ // darkest charcoal
962
+ "background-default": primitiveColors.charcoal[700],
963
+ // main background
964
+ "background-subtle": primitiveColors.charcoal[500],
965
+ // subtle background
966
+ // Border colors
967
+ "border-default": primitiveColors.charcoal[400],
968
+ // default border
969
+ "border-subtle": primitiveColors.charcoal[500],
970
+ // subtle border
971
+ "border-strong": primitiveColors.charcoal[300],
972
+ // strong border
973
+ "border-prominent": primitiveColors.charcoal[200],
974
+ // high-visibility divider
975
+ "border-focus": "#828DF8",
976
+ "border-input": primitiveColors.neutral[600],
977
+ "border-input-hover": primitiveColors.neutral[500],
978
+ "border-input-focus": "#828DF8",
979
+ "border-input-error": primitiveColors.red[500],
980
+ // Interactive states
981
+ "interactive-hover": "rgba(255, 255, 255, 0.04)",
982
+ "interactive-focus": "rgba(255, 255, 255, 0.12)",
983
+ "interactive-active": "rgba(255, 255, 255, 0.16)",
984
+ "interactive-selected": "rgba(255, 255, 255, 0.08)",
985
+ "interactive-disabled": "rgba(255, 255, 255, 0.12)",
986
+ "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
987
+ // Divider
988
+ "divider": primitiveColors.charcoal[400],
989
+ // divider color
990
+ // Avatar default
991
+ "avatar-background": primitiveColors.neutral[600],
992
+ "avatar-text": primitiveColors.white
993
+ };
994
+ function getSemanticColors(mode) {
995
+ return mode === "dark" ? semanticColorsDark : semanticColorsLight;
996
+ }
997
+
617
998
  // src/components/custom/Workout/WeightBadge.tsx
618
999
  function WeightBadge({
619
1000
  value,
@@ -628,7 +1009,7 @@ function WeightBadge({
628
1009
  ...props
629
1010
  }) {
630
1011
  const config = baseBadgeSizeConfig[size];
631
- const textColor = isPr ? "#FF7900" : "#9CA3AF";
1012
+ const textColor = isPr ? getSemanticColors("dark")["brand-primary"] : "#9CA3AF";
632
1013
  const iconColor = textColor;
633
1014
  const repMaxClause = reps != null ? `${reps} rep max` : "Estimated one rep max";
634
1015
  const deltaLabel = delta != null ? `, ${delta >= 0 ? "+" : ""}${delta}% change` : "";
@@ -687,7 +1068,7 @@ function WeightBadge({
687
1068
  fontFamily: '"Space Grotesk", sans-serif',
688
1069
  fontSize: config.fontSize,
689
1070
  marginLeft: 4,
690
- color: delta >= 0 ? "#4caf50" : "#ef5350"
1071
+ color: delta >= 0 ? getSemanticColors("dark")["result-improve"] : getSemanticColors("dark")["result-degrade"]
691
1072
  },
692
1073
  testID: "weight-badge-delta",
693
1074
  children: [
@@ -701,6 +1082,7 @@ function WeightBadge({
701
1082
  }
702
1083
  );
703
1084
  }
1085
+ var BRAND_PRIMARY = getSemanticColors("dark")["brand-primary"];
704
1086
  var typeLabels = {
705
1087
  e1rm: "PR e1RM",
706
1088
  weight: "PR Weight",
@@ -744,7 +1126,7 @@ function PrBadge({
744
1126
  accessibilityLabel: `Personal record: ${resolvedLabel}`,
745
1127
  testID: "pr-badge-star",
746
1128
  ...props,
747
- children: /* @__PURE__ */ jsx(StarIcon, { size: 14, color: "#FF7900", fill: "#FF7900", strokeWidth: 2 })
1129
+ children: /* @__PURE__ */ jsx(StarIcon, { size: 14, color: BRAND_PRIMARY, fill: BRAND_PRIMARY, strokeWidth: 2 })
748
1130
  }
749
1131
  ) : /* @__PURE__ */ jsx(
750
1132
  BaseBadge,
@@ -758,7 +1140,7 @@ function PrBadge({
758
1140
  {
759
1141
  style: {
760
1142
  fontSize: 12,
761
- color: "#FF7900",
1143
+ color: BRAND_PRIMARY,
762
1144
  fontWeight: "700",
763
1145
  fontFamily: "Inter, sans-serif"
764
1146
  },
@@ -1092,379 +1474,6 @@ function alpha(color, opacity) {
1092
1474
  }
1093
1475
  return color;
1094
1476
  }
1095
-
1096
- // src/theme/tokens/primitives.ts
1097
- var primitiveColors = {
1098
- // Blue scale (primary brand)
1099
- blue: {
1100
- 400: "#60A5FA",
1101
- 600: "#5048E5",
1102
- // Primary main
1103
- 700: "#3832A0"},
1104
- // Teal scale (success)
1105
- teal: {
1106
- 50: "#F0FDFA",
1107
- 400: "#43C6B7",
1108
- // Success light
1109
- 500: "#14B8A6",
1110
- 700: "#0E8074"},
1111
- // Red scale (error)
1112
- red: {
1113
- 50: "#FEF2F2",
1114
- 400: "#DA6868",
1115
- // Error light
1116
- 500: "#EF4444",
1117
- 600: "#D14343",
1118
- // Error main
1119
- 700: "#922E2E"},
1120
- // Amber scale (warning)
1121
- amber: {
1122
- 50: "#FFFBEB",
1123
- 400: "#FFBF4C",
1124
- // Warning light
1125
- 500: "#FFB020",
1126
- // Warning main
1127
- 600: "#B27B16"},
1128
- // Sky/Blue scale (info)
1129
- sky: {
1130
- 50: "#F0F9FF",
1131
- 400: "#64B6F7",
1132
- // Info light
1133
- 500: "#2196F3",
1134
- 700: "#0B79D0"},
1135
- // Neutral/Gray scale
1136
- neutral: {
1137
- 50: "#FAFAFA",
1138
- 100: "#F3F4F6",
1139
- 300: "#D1D5DB",
1140
- 400: "#9CA3AF",
1141
- 500: "#6B7280",
1142
- 600: "#4B5563",
1143
- 900: "#111827"},
1144
- // Orange scale (accent/brand color)
1145
- accent: {
1146
- 200: "#FF9630",
1147
- 300: "#FF8500",
1148
- 400: "#FF7900",
1149
- 500: "#F56C00",
1150
- 600: "#E06D10",
1151
- 700: "#D0620C"},
1152
- // Charcoal scale (dark backgrounds)
1153
- charcoal: {
1154
- 300: "#2C2C2C",
1155
- 400: "#1F1F1F",
1156
- 500: "#1C1C1C",
1157
- 600: "#191919",
1158
- 700: "#161616",
1159
- 900: "#101010"
1160
- },
1161
- // Steel scale (cool accent)
1162
- steel: {
1163
- 300: "#678498",
1164
- 400: "#557488",
1165
- 500: "#406D87",
1166
- 600: "#39617A",
1167
- 700: "#32556D"},
1168
- // Pure colors
1169
- white: "#FFFFFF"};
1170
- var discreteRainbow = [
1171
- "#E8ECFB",
1172
- "#D9CCE3",
1173
- "#D1BBD7",
1174
- "#CAACCB",
1175
- "#BA8DB4",
1176
- "#AE76A3",
1177
- "#AA6F9E",
1178
- "#994F88",
1179
- "#882E72",
1180
- "#1965B0",
1181
- "#437DBF",
1182
- "#5289C7",
1183
- "#6195CF",
1184
- "#7BAFDE",
1185
- "#4EB265",
1186
- "#90C987",
1187
- "#CAE0AB",
1188
- "#F7F056",
1189
- "#F7CB45",
1190
- "#F6C141",
1191
- "#F4A736",
1192
- "#F1932D",
1193
- "#EE8026",
1194
- "#E8601C",
1195
- "#E65518",
1196
- "#DC050C",
1197
- "#A5170E",
1198
- "#72190E",
1199
- "#42150A"
1200
- ];
1201
-
1202
- // src/theme/tokens/semantic.ts
1203
- var semanticColorsLight = {
1204
- // Brand colors (brand-*)
1205
- "brand-primary": primitiveColors.accent[400],
1206
- // #FF7900
1207
- "brand-primary-light": primitiveColors.accent[200],
1208
- // #FF9630
1209
- "brand-primary-dark": primitiveColors.accent[700],
1210
- // #D0620C
1211
- "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
1212
- "brand-primary-hover": primitiveColors.accent[500],
1213
- "brand-primary-active": primitiveColors.accent[600],
1214
- "brand-secondary": primitiveColors.steel[500],
1215
- // #406D87
1216
- "brand-secondary-light": primitiveColors.steel[300],
1217
- // #678498
1218
- "brand-secondary-dark": primitiveColors.steel[700],
1219
- // #32556D
1220
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.08)",
1221
- "brand-secondary-hover": primitiveColors.steel[600],
1222
- "brand-secondary-active": primitiveColors.steel[700],
1223
- // Text on brand backgrounds (on-*)
1224
- "on-brand-primary": primitiveColors.white,
1225
- "on-brand-secondary": primitiveColors.white,
1226
- // Status colors (status-*)
1227
- "status-success": primitiveColors.teal[500],
1228
- // #14B8A6
1229
- "status-success-light": primitiveColors.teal[400],
1230
- // #43C6B7
1231
- "status-success-dark": primitiveColors.teal[700],
1232
- // #0E8074
1233
- "status-success-subtle": primitiveColors.teal[50],
1234
- "status-error": primitiveColors.red[600],
1235
- // #D14343
1236
- "status-error-light": primitiveColors.red[400],
1237
- // #DA6868
1238
- "status-error-dark": primitiveColors.red[700],
1239
- // #922E2E
1240
- "status-error-subtle": primitiveColors.red[50],
1241
- "status-warning": primitiveColors.amber[500],
1242
- // #FFB020
1243
- "status-warning-light": primitiveColors.amber[400],
1244
- // #FFBF4C
1245
- "status-warning-dark": primitiveColors.amber[600],
1246
- // #B27B16
1247
- "status-warning-subtle": primitiveColors.amber[50],
1248
- "status-info": primitiveColors.sky[500],
1249
- // #2196F3
1250
- "status-info-light": primitiveColors.sky[400],
1251
- // #64B6F7
1252
- "status-info-dark": primitiveColors.sky[700],
1253
- // #0B79D0
1254
- "status-info-subtle": primitiveColors.sky[50],
1255
- // Text on status backgrounds (on-status-*)
1256
- "on-status-success": primitiveColors.white,
1257
- "on-status-error": primitiveColors.white,
1258
- "on-status-warning": primitiveColors.white,
1259
- "on-status-info": primitiveColors.white,
1260
- // Result/outcome indicators (result-*)
1261
- "result-improve": "#4caf50",
1262
- // Green - positive outcome
1263
- "result-improve-light": "rgba(76, 175, 80, 0.12)",
1264
- "result-improve-dark": "#248a24",
1265
- "result-degrade": "#ef5350",
1266
- // Red - negative outcome
1267
- "result-degrade-light": "rgba(239, 83, 80, 0.12)",
1268
- "result-degrade-dark": "#b30000",
1269
- "result-inconclusive": "#9E9A97",
1270
- // Gray - no clear result
1271
- "result-inconclusive-light": "rgba(158, 154, 151, 0.12)",
1272
- "result-neutral": primitiveColors.neutral[500],
1273
- // Neutral baseline
1274
- // Text on result backgrounds (on-result-*)
1275
- "on-result-improve": primitiveColors.white,
1276
- "on-result-degrade": primitiveColors.white,
1277
- "on-result-inconclusive": primitiveColors.white,
1278
- // Data visualization colors (data-*)
1279
- // First 10 colors from discrete rainbow optimized for charts
1280
- "data-1": discreteRainbow[9],
1281
- // #1965B0 - Blue
1282
- "data-2": discreteRainbow[14],
1283
- // #4EB265 - Green
1284
- "data-3": discreteRainbow[17],
1285
- // #F7F056 - Yellow
1286
- "data-4": discreteRainbow[25],
1287
- // #DC050C - Red
1288
- "data-5": discreteRainbow[8],
1289
- // #882E72 - Purple
1290
- "data-6": discreteRainbow[20],
1291
- // #F4A736 - Orange
1292
- "data-7": discreteRainbow[13],
1293
- // #7BAFDE - Light Blue
1294
- "data-8": discreteRainbow[15],
1295
- // #90C987 - Light Green
1296
- "data-9": discreteRainbow[3],
1297
- // #CAACCB - Lavender
1298
- "data-10": discreteRainbow[22],
1299
- // #EE8026 - Dark Orange
1300
- // Text colors (text-*)
1301
- "text-primary": "#121828",
1302
- "text-secondary": "#65748B",
1303
- "text-tertiary": primitiveColors.neutral[400],
1304
- "text-disabled": "rgba(55, 65, 81, 0.48)",
1305
- "text-inverse": primitiveColors.white,
1306
- "text-link": primitiveColors.blue[600],
1307
- "text-link-hover": primitiveColors.blue[700],
1308
- // Surface colors (surface-*) - for elevated containers
1309
- "surface-base": primitiveColors.white,
1310
- "surface-elevated": primitiveColors.neutral[50],
1311
- // #FAFAFA - slightly off-white for elevated cards
1312
- "surface-raised": primitiveColors.neutral[100],
1313
- // #F3F4F6 - light gray for raised cards
1314
- "surface-overlay": primitiveColors.white,
1315
- "surface-input": primitiveColors.neutral[50],
1316
- // Input field background (filled variant)
1317
- // Background colors (background-*)
1318
- "background-base": "#EBEBEB",
1319
- "background-default": primitiveColors.white,
1320
- "background-subtle": primitiveColors.neutral[50],
1321
- // Border colors (border-*)
1322
- "border-default": "#E8E9EB",
1323
- "border-subtle": primitiveColors.neutral[100],
1324
- "border-strong": primitiveColors.neutral[300],
1325
- "border-focus": primitiveColors.blue[600],
1326
- "border-input": primitiveColors.neutral[300],
1327
- // Input field border
1328
- "border-input-hover": primitiveColors.neutral[400],
1329
- // Input field border on hover
1330
- "border-input-focus": primitiveColors.blue[600],
1331
- // Input field border on focus
1332
- "border-input-error": primitiveColors.red[600],
1333
- // Input field border on error
1334
- // Interactive states (interactive-*)
1335
- "interactive-hover": "rgba(55, 65, 81, 0.04)",
1336
- "interactive-focus": "rgba(55, 65, 81, 0.12)",
1337
- "interactive-active": "rgba(55, 65, 81, 0.16)",
1338
- "interactive-selected": "rgba(55, 65, 81, 0.08)",
1339
- "interactive-disabled": "rgba(55, 65, 81, 0.12)",
1340
- "interactive-disabled-text": "rgba(55, 65, 81, 0.26)",
1341
- // Divider
1342
- "divider": "#E8E9EB",
1343
- // Avatar default
1344
- "avatar-background": primitiveColors.neutral[500],
1345
- "avatar-text": primitiveColors.white
1346
- };
1347
- var semanticColorsDark = {
1348
- // Brand colors stay the same in dark mode
1349
- "brand-primary": primitiveColors.accent[400],
1350
- "brand-primary-light": primitiveColors.accent[200],
1351
- "brand-primary-dark": primitiveColors.accent[700],
1352
- "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
1353
- "brand-primary-hover": primitiveColors.accent[300],
1354
- "brand-primary-active": primitiveColors.accent[200],
1355
- "brand-secondary": primitiveColors.steel[500],
1356
- "brand-secondary-light": primitiveColors.steel[300],
1357
- "brand-secondary-dark": primitiveColors.steel[700],
1358
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.12)",
1359
- "brand-secondary-hover": primitiveColors.steel[400],
1360
- "brand-secondary-active": primitiveColors.steel[300],
1361
- // Text on brand backgrounds
1362
- "on-brand-primary": primitiveColors.white,
1363
- "on-brand-secondary": primitiveColors.white,
1364
- // Status colors
1365
- "status-success": primitiveColors.teal[500],
1366
- "status-success-light": primitiveColors.teal[400],
1367
- "status-success-dark": primitiveColors.teal[700],
1368
- "status-success-subtle": "rgba(20, 184, 166, 0.12)",
1369
- "status-error": primitiveColors.red[600],
1370
- "status-error-light": primitiveColors.red[400],
1371
- "status-error-dark": primitiveColors.red[700],
1372
- "status-error-subtle": "rgba(209, 67, 67, 0.12)",
1373
- "status-warning": primitiveColors.amber[500],
1374
- "status-warning-light": primitiveColors.amber[400],
1375
- "status-warning-dark": primitiveColors.amber[600],
1376
- "status-warning-subtle": "rgba(255, 176, 32, 0.12)",
1377
- "status-info": primitiveColors.sky[500],
1378
- "status-info-light": primitiveColors.sky[400],
1379
- "status-info-dark": primitiveColors.sky[700],
1380
- "status-info-subtle": "rgba(33, 150, 243, 0.12)",
1381
- // Text on status backgrounds
1382
- "on-status-success": primitiveColors.white,
1383
- "on-status-error": primitiveColors.white,
1384
- "on-status-warning": primitiveColors.white,
1385
- "on-status-info": primitiveColors.white,
1386
- // Result/outcome indicators (result-*)
1387
- "result-improve": "#4caf50",
1388
- "result-improve-light": "rgba(76, 175, 80, 0.16)",
1389
- "result-improve-dark": "#248a24",
1390
- "result-degrade": "#ef5350",
1391
- "result-degrade-light": "rgba(239, 83, 80, 0.16)",
1392
- "result-degrade-dark": "#b30000",
1393
- "result-inconclusive": "#9E9A97",
1394
- "result-inconclusive-light": "rgba(158, 154, 151, 0.16)",
1395
- "result-neutral": primitiveColors.neutral[400],
1396
- // Text on result backgrounds
1397
- "on-result-improve": primitiveColors.white,
1398
- "on-result-degrade": primitiveColors.white,
1399
- "on-result-inconclusive": primitiveColors.white,
1400
- // Data visualization colors (same in dark mode for consistency)
1401
- "data-1": discreteRainbow[9],
1402
- "data-2": discreteRainbow[14],
1403
- "data-3": discreteRainbow[17],
1404
- "data-4": discreteRainbow[25],
1405
- "data-5": discreteRainbow[8],
1406
- "data-6": discreteRainbow[20],
1407
- "data-7": discreteRainbow[13],
1408
- "data-8": discreteRainbow[15],
1409
- "data-9": discreteRainbow[3],
1410
- "data-10": discreteRainbow[22],
1411
- // Text colors - inverted for dark mode
1412
- "text-primary": primitiveColors.neutral[100],
1413
- "text-secondary": primitiveColors.neutral[400],
1414
- "text-tertiary": primitiveColors.neutral[500],
1415
- "text-disabled": "rgba(255, 255, 255, 0.38)",
1416
- "text-inverse": primitiveColors.neutral[900],
1417
- "text-link": "#828DF8",
1418
- "text-link-hover": primitiveColors.blue[400],
1419
- // Surface colors - dark backgrounds
1420
- "surface-base": primitiveColors.charcoal[700],
1421
- // #161616 - main surface
1422
- "surface-elevated": primitiveColors.charcoal[600],
1423
- // #191919 - elevated surface
1424
- "surface-raised": primitiveColors.charcoal[500],
1425
- // #1C1C1C - raised surface
1426
- "surface-overlay": primitiveColors.charcoal[600],
1427
- // #191919 - overlay surface
1428
- "surface-input": primitiveColors.charcoal[600],
1429
- // #191919 - input surface
1430
- // Background colors
1431
- "background-base": primitiveColors.charcoal[900],
1432
- // #101010 - darkest charcoal
1433
- "background-default": primitiveColors.charcoal[700],
1434
- // #161616 - main background
1435
- "background-subtle": primitiveColors.charcoal[500],
1436
- // #1C1C1C - subtle background
1437
- // Border colors
1438
- "border-default": primitiveColors.charcoal[400],
1439
- // #1F1F1F - default border
1440
- "border-subtle": primitiveColors.charcoal[500],
1441
- // #1C1C1C - subtle border
1442
- "border-strong": primitiveColors.charcoal[300],
1443
- // #2C2C2C - strong border
1444
- "border-focus": "#828DF8",
1445
- "border-input": primitiveColors.neutral[600],
1446
- "border-input-hover": primitiveColors.neutral[500],
1447
- "border-input-focus": "#828DF8",
1448
- "border-input-error": primitiveColors.red[500],
1449
- // Interactive states
1450
- "interactive-hover": "rgba(255, 255, 255, 0.04)",
1451
- "interactive-focus": "rgba(255, 255, 255, 0.12)",
1452
- "interactive-active": "rgba(255, 255, 255, 0.16)",
1453
- "interactive-selected": "rgba(255, 255, 255, 0.08)",
1454
- "interactive-disabled": "rgba(255, 255, 255, 0.12)",
1455
- "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
1456
- // Divider
1457
- "divider": primitiveColors.charcoal[400],
1458
- // #1F1F1F - divider color
1459
- // Avatar default
1460
- "avatar-background": primitiveColors.neutral[600],
1461
- "avatar-text": primitiveColors.white
1462
- };
1463
- function getSemanticColors(mode) {
1464
- return mode === "dark" ? semanticColorsDark : semanticColorsLight;
1465
- }
1466
-
1467
- // src/components/custom/Workout/TempoBar.tsx
1468
1477
  var t = getSemanticColors("dark");
1469
1478
  var TEMPO_PACING = {
1470
1479
  behindThresholdPct: 0.15,
@@ -1487,15 +1496,14 @@ function getTempoFillPct(elapsedMs, targetMs) {
1487
1496
  });
1488
1497
 
1489
1498
  // src/components/custom/Workout/TempoDisplay.tsx
1499
+ var t2 = getSemanticColors("dark");
1490
1500
  var INTER = "Inter, sans-serif";
1491
1501
  var TEXT_TERTIARY = "#6B7280";
1492
- var STATUS_ERROR = "#D14343";
1502
+ var STATUS_ERROR = t2["status-error"];
1493
1503
  var phaseColors = {
1494
- eccentric: "#FFB020",
1495
- // status-warning (amber)
1504
+ eccentric: t2["status-warning"],
1496
1505
  pauseBottom: TEXT_TERTIARY,
1497
- concentric: "#14B8A6",
1498
- // status-success (teal)
1506
+ concentric: t2["status-success"],
1499
1507
  pauseTop: TEXT_TERTIARY,
1500
1508
  dash: TEXT_TERTIARY
1501
1509
  };
@@ -1825,7 +1833,7 @@ function SetRow({
1825
1833
  fontSize: 10,
1826
1834
  fontWeight: "700",
1827
1835
  fontFamily: "Inter, sans-serif",
1828
- color: "#ffa502",
1836
+ color: WORKOUT_TOKENS.scale.orange,
1829
1837
  backgroundColor: "rgba(255,165,2,0.12)",
1830
1838
  paddingVertical: 1,
1831
1839
  paddingHorizontal: 5,
@@ -2375,7 +2383,7 @@ function ExerciseCard(props) {
2375
2383
  return /* @__PURE__ */ jsx(UpcomingCard, { ...props });
2376
2384
  }
2377
2385
  }
2378
- var BRAND_PRIMARY = "#FF7900";
2386
+ var BRAND_PRIMARY2 = getSemanticColors("dark")["brand-primary"];
2379
2387
  var INPUT_CLASSNAME = "bg-surface-raised border-border-strong text-text-primary";
2380
2388
  var inputStyle = {
2381
2389
  fontSize: 14,
@@ -2504,7 +2512,7 @@ function InputBar({
2504
2512
  onPress: onRecord,
2505
2513
  disabled: !canRecord,
2506
2514
  style: ({ pressed }) => ({
2507
- backgroundColor: BRAND_PRIMARY,
2515
+ backgroundColor: BRAND_PRIMARY2,
2508
2516
  borderRadius: 8,
2509
2517
  paddingVertical: 10,
2510
2518
  paddingHorizontal: 16,
@@ -2531,7 +2539,7 @@ function InputBar({
2531
2539
  }
2532
2540
  );
2533
2541
  }
2534
- var BRAND_PRIMARY2 = "#FF7900";
2542
+ var BRAND_PRIMARY3 = getSemanticColors("dark")["brand-primary"];
2535
2543
  function RestTimer({
2536
2544
  totalSeconds,
2537
2545
  elapsedMs,
@@ -2637,7 +2645,7 @@ function RestTimer({
2637
2645
  {
2638
2646
  style: {
2639
2647
  height: "100%",
2640
- backgroundColor: BRAND_PRIMARY2,
2648
+ backgroundColor: BRAND_PRIMARY3,
2641
2649
  borderRadius: 2,
2642
2650
  width: `${progressPct}%`
2643
2651
  },
@@ -2694,7 +2702,7 @@ function RestTimer({
2694
2702
  fontSize: 11,
2695
2703
  fontFamily: "Inter, sans-serif",
2696
2704
  fontWeight: "600",
2697
- color: BRAND_PRIMARY2
2705
+ color: BRAND_PRIMARY3
2698
2706
  },
2699
2707
  children: "Skip"
2700
2708
  }
@@ -2708,7 +2716,7 @@ function RestTimer({
2708
2716
  }
2709
2717
  var DEFAULTS = {
2710
2718
  label: "SS",
2711
- color: "#FF7900",
2719
+ color: getSemanticColors("dark")["brand-primary"],
2712
2720
  bgBase: "#101010"
2713
2721
  };
2714
2722
  function SupersetWrapper({
@@ -2761,7 +2769,7 @@ function SupersetWrapper({
2761
2769
  }
2762
2770
 
2763
2771
  // src/components/custom/Workout/ActiveWorkoutPage.tsx
2764
- var BRAND_PRIMARY3 = "#FF7900";
2772
+ var BRAND_PRIMARY4 = getSemanticColors("dark")["brand-primary"];
2765
2773
  function countCompletedSets(exercise) {
2766
2774
  if (exercise.setVelocities != null) return exercise.setVelocities.length;
2767
2775
  if (exercise.status === "completed") return exercise.totalPlannedSets;
@@ -2876,7 +2884,7 @@ function WorkoutHeader({
2876
2884
  fontSize: 15,
2877
2885
  fontFamily: '"Space Grotesk", sans-serif',
2878
2886
  fontWeight: "700",
2879
- color: BRAND_PRIMARY3,
2887
+ color: BRAND_PRIMARY4,
2880
2888
  fontVariant: ["tabular-nums"]
2881
2889
  },
2882
2890
  children: `${progress.completedExercises}/${progress.totalExercises}`
@@ -2910,7 +2918,7 @@ function WorkoutHeader({
2910
2918
  style: {
2911
2919
  height: "100%",
2912
2920
  width: `${Math.round(progress.fraction * 100)}%`,
2913
- backgroundColor: BRAND_PRIMARY3,
2921
+ backgroundColor: BRAND_PRIMARY4,
2914
2922
  borderRadius: 2
2915
2923
  },
2916
2924
  testID: "active-workout-page-progress-fill"
@@ -3492,17 +3500,18 @@ function CardContent({ children, className }) {
3492
3500
  function CardFooter({ children, className }) {
3493
3501
  return /* @__PURE__ */ jsx(View, { className: cn("px-6 py-4 flex-row items-center gap-2", className), children });
3494
3502
  }
3503
+ var t3 = getSemanticColors("dark");
3495
3504
  var solidVariantColors = {
3496
- success: "#14B8A6",
3497
- warning: "#FFB020",
3498
- error: "#D14343",
3505
+ success: t3["status-success"],
3506
+ warning: t3["status-warning"],
3507
+ error: t3["status-error"],
3499
3508
  neutral: "#6B7280"
3500
3509
  };
3501
3510
  var ringVariantStyles = {
3502
3511
  "on-track": {
3503
- backgroundColor: "rgba(20,184,166,0.15)",
3512
+ backgroundColor: "rgba(46,213,115,0.15)",
3504
3513
  borderWidth: 1,
3505
- borderColor: "rgba(20,184,166,0.3)"
3514
+ borderColor: "rgba(46,213,115,0.3)"
3506
3515
  },
3507
3516
  deviation: {
3508
3517
  backgroundColor: "rgba(245,158,11,0.15)",
@@ -3517,11 +3526,11 @@ var ringVariantStyles = {
3517
3526
  }
3518
3527
  };
3519
3528
  var glowStyles = {
3520
- success: { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
3529
+ success: { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
3521
3530
  warning: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
3522
3531
  error: { boxShadow: "0 0 4px rgba(239,68,68,0.4)" },
3523
3532
  neutral: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" },
3524
- "on-track": { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
3533
+ "on-track": { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
3525
3534
  deviation: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
3526
3535
  future: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" }
3527
3536
  };
@@ -3535,8 +3544,8 @@ var iconColors = {
3535
3544
  warning: "#6B4000",
3536
3545
  error: "#5C1A1A",
3537
3546
  neutral: "#D1D5DB",
3538
- "on-track": "#14B8A6",
3539
- deviation: "#FFB020",
3547
+ "on-track": t3["status-success"],
3548
+ deviation: t3["status-warning"],
3540
3549
  future: "#6B7280"
3541
3550
  };
3542
3551
  var sizeDimensions = {
@@ -3617,20 +3626,24 @@ function StatusDot({
3617
3626
  }
3618
3627
  return /* @__PURE__ */ jsx(View, { className, ...props, children: dot });
3619
3628
  }
3629
+ var MESO_ACCENT_GRADIENT_DARK = primitiveRamps.orange[500];
3630
+ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
3631
+ var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
3620
3632
 
3621
3633
  // src/components/custom/Workout/MesoStatusCard.tsx
3622
- var BRAND_PRIMARY4 = "#FF7900";
3623
- var BRAND_PRIMARY_DARK = "#C45E00";
3624
- var BRAND_PRIMARY_LIGHT = "#FFB066";
3625
- var SUCCESS = "#14B8A6";
3626
- var WARNING = "#FFB020";
3627
- var ERROR = "#D14343";
3628
- var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY4, BRAND_PRIMARY_LIGHT];
3634
+ var t4 = getSemanticColors("dark");
3635
+ var BRAND_PRIMARY5 = t4["brand-primary"];
3636
+ var BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK;
3637
+ var BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT;
3638
+ var SUCCESS = t4["status-success"];
3639
+ var WARNING = t4["status-warning"];
3640
+ var ERROR = t4["status-error"];
3641
+ var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY5, BRAND_PRIMARY_LIGHT];
3629
3642
  var CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor("surface-elevated")} 0%, ${resolveColor("surface-raised")} 100%)`;
3630
- 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%)";
3643
+ 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%)";
3631
3644
  var STATUS_VARIANTS = {
3632
- success: { bg: "rgba(20,184,166,0.15)", border: "rgba(20,184,166,0.3)", text: SUCCESS },
3633
- warning: { bg: "rgba(255,176,32,0.15)", border: "rgba(255,176,32,0.3)", text: WARNING },
3645
+ success: { bg: "rgba(46,213,115,0.15)", border: "rgba(46,213,115,0.3)", text: SUCCESS },
3646
+ warning: { bg: "rgba(249,180,21,0.15)", border: "rgba(249,180,21,0.3)", text: WARNING },
3634
3647
  error: { bg: "rgba(209,67,67,0.15)", border: "rgba(209,67,67,0.25)", text: ERROR }
3635
3648
  };
3636
3649
  function clamp01(value) {
@@ -3922,9 +3935,9 @@ function MesoStatusCard({
3922
3935
  View,
3923
3936
  {
3924
3937
  style: {
3925
- backgroundColor: "rgba(255,176,32,0.06)",
3938
+ backgroundColor: "rgba(249,180,21,0.06)",
3926
3939
  borderWidth: 1,
3927
- borderColor: "rgba(255,176,32,0.15)",
3940
+ borderColor: "rgba(249,180,21,0.15)",
3928
3941
  borderRadius: 8,
3929
3942
  paddingVertical: 10,
3930
3943
  paddingHorizontal: 12
@@ -3950,9 +3963,9 @@ function MesoStatusCard({
3950
3963
  className: "flex-row items-center",
3951
3964
  style: {
3952
3965
  gap: 8,
3953
- backgroundColor: "rgba(20,184,166,0.06)",
3966
+ backgroundColor: "rgba(46,213,115,0.06)",
3954
3967
  borderWidth: 1,
3955
- borderColor: "rgba(20,184,166,0.2)",
3968
+ borderColor: "rgba(46,213,115,0.2)",
3956
3969
  borderRadius: 8,
3957
3970
  paddingVertical: 10,
3958
3971
  paddingHorizontal: 12
@@ -3981,21 +3994,22 @@ function MesoStatusCard({
3981
3994
  }
3982
3995
  );
3983
3996
  }
3984
- var BRAND_PRIMARY5 = "#FF7900";
3997
+ var sem = getSemanticColors("dark");
3998
+ var BRAND_PRIMARY6 = sem["brand-primary"];
3985
3999
  var PROJECTION_LINE_COLOR = resolveColor("text-tertiary");
3986
- var STATUS_SUCCESS = "#14B8A6";
3987
- var STATUS_ERROR2 = "#D14343";
3988
- var STATUS_WARNING = "#FFB020";
4000
+ var STATUS_SUCCESS = sem["status-success"];
4001
+ var STATUS_ERROR2 = sem["status-error"];
4002
+ var STATUS_WARNING = sem["status-warning"];
3989
4003
  var GRID_LINE = "rgba(255,255,255,0.06)";
3990
- var SUCCESS_PILL_BG = "rgba(20,184,166,0.10)";
3991
- var SUCCESS_PILL_BORDER = "rgba(20,184,166,0.20)";
4004
+ var SUCCESS_PILL_BG = "rgba(46,213,115,0.10)";
4005
+ var SUCCESS_PILL_BORDER = "rgba(46,213,115,0.20)";
3992
4006
  var ERROR_PILL_BG = "rgba(209,67,67,0.10)";
3993
4007
  var ERROR_PILL_BORDER = "rgba(209,67,67,0.20)";
3994
4008
  var PLOT_LEFT = 26;
3995
4009
  var TOOLTIP_WIDTH = 124;
3996
4010
  function timeOf(dateStr) {
3997
- const t2 = Date.parse(dateStr);
3998
- return Number.isNaN(t2) ? 0 : t2;
4011
+ const t10 = Date.parse(dateStr);
4012
+ return Number.isNaN(t10) ? 0 : t10;
3999
4013
  }
4000
4014
  function formatValue(value) {
4001
4015
  return `${Math.round(value)}`;
@@ -4272,7 +4286,7 @@ function StrengthTrendChart({
4272
4286
  ChartLine,
4273
4287
  {
4274
4288
  coords: geometry.actual,
4275
- color: BRAND_PRIMARY5,
4289
+ color: BRAND_PRIMARY6,
4276
4290
  strokeWidth: 2.5,
4277
4291
  testID: "strength-trend-chart-actual-segment"
4278
4292
  }
@@ -4325,7 +4339,7 @@ function StrengthTrendChart({
4325
4339
  width: 8,
4326
4340
  height: 8,
4327
4341
  borderRadius: 1,
4328
- backgroundColor: BRAND_PRIMARY5
4342
+ backgroundColor: BRAND_PRIMARY6
4329
4343
  }
4330
4344
  },
4331
4345
  `point-${c.index}`
@@ -4455,7 +4469,7 @@ function StrengthTrendChart({
4455
4469
  testID: "strength-trend-chart-legend",
4456
4470
  children: [
4457
4471
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 5 }, children: [
4458
- /* @__PURE__ */ jsx(View, { style: { width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY5 } }),
4472
+ /* @__PURE__ */ jsx(View, { style: { width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY6 } }),
4459
4473
  /* @__PURE__ */ jsx(Text, { className: "text-text-secondary", style: { fontSize: 10, fontFamily: "Inter, sans-serif" }, children: "Actual" })
4460
4474
  ] }),
4461
4475
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 5 }, children: [
@@ -4484,13 +4498,14 @@ function StrengthTrendChart({
4484
4498
  }
4485
4499
  );
4486
4500
  }
4487
- var STATUS_SUCCESS2 = "#14B8A6";
4488
- var STATUS_WARNING2 = "#FFB020";
4489
- var STATUS_INFO = "#2196F3";
4501
+ var t5 = getSemanticColors("dark");
4502
+ var STATUS_SUCCESS2 = t5["status-success"];
4503
+ var STATUS_WARNING2 = t5["status-warning"];
4504
+ var STATUS_INFO = t5["status-info"];
4490
4505
  var DOT_BORDER = "#F3F4F6";
4491
- var BAND_FILL = "rgba(20,184,166,0.1)";
4492
- var BAND_EDGE = "rgba(20,184,166,0.45)";
4493
- var PROJECTION_FILL = "rgba(20,184,166,0.05)";
4506
+ var BAND_FILL = "rgba(46,213,115,0.1)";
4507
+ var BAND_EDGE = "rgba(46,213,115,0.45)";
4508
+ var PROJECTION_FILL = "rgba(46,213,115,0.05)";
4494
4509
  var PADDING_LEFT = 28;
4495
4510
  var PADDING_RIGHT = 10;
4496
4511
  var PADDING_TOP = 8;
@@ -4529,8 +4544,8 @@ function interpEdge(pixels, x, key) {
4529
4544
  const a = pixels[i];
4530
4545
  const b = pixels[i + 1];
4531
4546
  if (x >= a.x && x <= b.x) {
4532
- const t2 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
4533
- return a[key] + t2 * (b[key] - a[key]);
4547
+ const t10 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
4548
+ return a[key] + t10 * (b[key] - a[key]);
4534
4549
  }
4535
4550
  }
4536
4551
  return pixels[pixels.length - 1][key];
@@ -4862,7 +4877,7 @@ function CapacityBandChart({
4862
4877
  }
4863
4878
 
4864
4879
  // src/components/custom/Workout/ExerciseDetailPage.tsx
4865
- var BRAND_PRIMARY6 = "#FF7900";
4880
+ var BRAND_PRIMARY7 = getSemanticColors("dark")["brand-primary"];
4866
4881
  var CHART_WIDTH = 326;
4867
4882
  var CHART_HEIGHT = 150;
4868
4883
  var EXERCISE_DETAIL_TABS = [
@@ -4926,7 +4941,7 @@ function TabBar({ active, onSelect }) {
4926
4941
  alignItems: "center",
4927
4942
  paddingVertical: 10,
4928
4943
  borderBottomWidth: 2,
4929
- borderBottomColor: isActive ? BRAND_PRIMARY6 : "transparent"
4944
+ borderBottomColor: isActive ? BRAND_PRIMARY7 : "transparent"
4930
4945
  },
4931
4946
  testID: `exercise-detail-page-tab-${key}`,
4932
4947
  children: /* @__PURE__ */ jsx(
@@ -5248,7 +5263,7 @@ function ExerciseDetailPage({
5248
5263
  fontSize: 15,
5249
5264
  fontFamily: '"Space Grotesk", sans-serif',
5250
5265
  fontWeight: "700",
5251
- color: BRAND_PRIMARY6
5266
+ color: BRAND_PRIMARY7
5252
5267
  },
5253
5268
  children: `${exercise.currentE1rm} ${exercise.unit}`
5254
5269
  }
@@ -5314,9 +5329,9 @@ function ExerciseDetailPage({
5314
5329
  }
5315
5330
  );
5316
5331
  }
5317
- var BRAND_PRIMARY7 = "#FF7900";
5332
+ var BRAND_PRIMARY8 = getSemanticColors("dark")["brand-primary"];
5318
5333
  var segmentBgColors = {
5319
- completed: "rgba(20,184,166,0.3)",
5334
+ completed: "rgba(46,213,115,0.3)",
5320
5335
  current: "rgba(255,121,0,0.5)",
5321
5336
  upcoming: "rgba(255,255,255,0.06)"
5322
5337
  };
@@ -5366,7 +5381,7 @@ function MesoSegment({ meso, isActive, onPress }) {
5366
5381
  },
5367
5382
  isActive ? {
5368
5383
  borderWidth: 2,
5369
- borderColor: BRAND_PRIMARY7,
5384
+ borderColor: BRAND_PRIMARY8,
5370
5385
  transform: [{ scale: 1.02 }, { scale: pressScale }]
5371
5386
  } : void 0
5372
5387
  ],
@@ -5380,7 +5395,7 @@ function MesoSegment({ meso, isActive, onPress }) {
5380
5395
  top: 0,
5381
5396
  bottom: 0,
5382
5397
  width: `${progress * 100}%`,
5383
- backgroundColor: BRAND_PRIMARY7
5398
+ backgroundColor: BRAND_PRIMARY8
5384
5399
  },
5385
5400
  testID: `meso-segment-fill-${meso.id}`
5386
5401
  }
@@ -5433,7 +5448,8 @@ var colorStyles = {
5433
5448
  success: "bg-status-success",
5434
5449
  error: "bg-status-error",
5435
5450
  warning: "bg-status-warning",
5436
- info: "bg-status-info"
5451
+ info: "bg-status-info",
5452
+ "error-vivid": "bg-status-error-vivid"
5437
5453
  };
5438
5454
  function Indicator({
5439
5455
  size = "sm",
@@ -5441,14 +5457,40 @@ function Indicator({
5441
5457
  customColor,
5442
5458
  glow = false,
5443
5459
  ring = false,
5460
+ pulse = false,
5444
5461
  className,
5445
5462
  style,
5446
5463
  ...props
5447
5464
  }) {
5465
+ const pulseMode = pulse === true ? "opacity" : pulse || false;
5466
+ const colorClass = !customColor ? colorStyles[color] : void 0;
5467
+ const colorStyle = customColor ? { backgroundColor: customColor } : void 0;
5468
+ if (pulseMode === "ping") {
5469
+ return /* @__PURE__ */ jsxs(View, { className: cn("relative", sizeStyles[size], className), style, ...props, children: [
5470
+ /* @__PURE__ */ jsx(
5471
+ View,
5472
+ {
5473
+ className: cn("absolute inset-0 rounded-full animate-ping", colorClass),
5474
+ style: colorStyle
5475
+ }
5476
+ ),
5477
+ /* @__PURE__ */ jsx(
5478
+ View,
5479
+ {
5480
+ className: cn(
5481
+ "relative rounded-full",
5482
+ sizeStyles[size],
5483
+ colorClass,
5484
+ ring && "border-2 border-background-base"
5485
+ ),
5486
+ style: colorStyle
5487
+ }
5488
+ )
5489
+ ] });
5490
+ }
5448
5491
  const dynamicStyle = {
5449
5492
  ...typeof style === "object" ? style : {},
5450
- ...customColor ? { backgroundColor: customColor } : {},
5451
- ...glow && !customColor ? {} : {},
5493
+ ...colorStyle ?? {},
5452
5494
  ...glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}
5453
5495
  };
5454
5496
  return /* @__PURE__ */ jsx(
@@ -5457,12 +5499,14 @@ function Indicator({
5457
5499
  className: cn(
5458
5500
  "rounded-full shrink-0",
5459
5501
  sizeStyles[size],
5460
- !customColor && colorStyles[color],
5502
+ colorClass,
5503
+ pulseMode === "opacity" && "animate-pulse",
5461
5504
  ring && "border-2 border-background-base",
5462
- glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(20,184,166,0.6)]",
5505
+ glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(46,213,115,0.6)]",
5463
5506
  glow && !customColor && color === "error" && "shadow-[0_0_6px_rgba(239,68,68,0.6)]",
5464
5507
  glow && !customColor && color === "warning" && "shadow-[0_0_6px_rgba(245,158,11,0.6)]",
5465
5508
  glow && !customColor && color === "primary" && "shadow-[0_0_6px_rgba(255,121,0,0.6)]",
5509
+ glow && !customColor && color === "error-vivid" && "shadow-[0_0_6px_rgba(255,71,87,0.6)]",
5466
5510
  className
5467
5511
  ),
5468
5512
  style: Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style,
@@ -5540,29 +5584,30 @@ function Badge({
5540
5584
  }
5541
5585
  );
5542
5586
  }
5587
+ var t6 = getSemanticColors("dark");
5543
5588
  var statusBgColors = {
5544
- completed: "rgba(20,184,166,0.15)",
5589
+ completed: "rgba(46,213,115,0.15)",
5545
5590
  current: "rgba(255,121,0,0.15)",
5546
5591
  next: "transparent",
5547
5592
  upcoming: "#1C1C1C",
5548
5593
  missed: "rgba(209,67,67,0.1)",
5549
- deload: "rgba(147,51,234,0.15)"
5594
+ deload: "rgba(186,41,150,0.15)"
5550
5595
  };
5551
5596
  var statusBorderStyles = {
5552
- completed: { borderWidth: 1, borderColor: "rgba(20,184,166,0.3)" },
5597
+ completed: { borderWidth: 1, borderColor: "rgba(46,213,115,0.3)" },
5553
5598
  current: { borderWidth: 1, borderColor: "rgba(255,121,0,0.3)" },
5554
5599
  next: { borderWidth: 1, borderColor: "rgba(255,121,0,0.4)" },
5555
5600
  upcoming: { borderWidth: 1, borderColor: "#1F1F1F" },
5556
5601
  missed: { borderWidth: 1, borderColor: "rgba(209,67,67,0.25)" },
5557
- deload: { borderWidth: 1, borderColor: "rgba(147,51,234,0.3)" }
5602
+ deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
5558
5603
  };
5559
5604
  var textColors = {
5560
- completed: "#14B8A6",
5561
- current: "#FF7900",
5562
- next: "#FF7900",
5605
+ completed: t6["status-success"],
5606
+ current: t6["brand-primary"],
5607
+ next: t6["brand-primary"],
5563
5608
  upcoming: "#6B7280",
5564
5609
  missed: "rgba(209,67,67,0.7)",
5565
- deload: "#9333ea"
5610
+ deload: WORKOUT_PILL_DELOAD
5566
5611
  };
5567
5612
  function usePulse(enabled) {
5568
5613
  const [opacity] = useState(() => new Animated.Value(1));
@@ -5692,23 +5737,24 @@ function WorkoutPill({
5692
5737
  }
5693
5738
  return pill;
5694
5739
  }
5740
+ var t7 = getSemanticColors("dark");
5695
5741
  var TRACK_BG = "#333333";
5696
5742
  var LABEL_COLOR = "#6B7280";
5697
5743
  var TARGET_LINE_COLOR = "rgba(33, 150, 243, 0.5)";
5698
5744
  var AT_TARGET_GLOW = "0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)";
5699
5745
  var ZONE = {
5700
- building: "#14B8A6",
5701
- // teal — below target ramp-up
5702
- approaching: "#FFB020",
5703
- // amber — nearing target
5704
- target: "#FF7900",
5705
- // brand — exactly at target
5706
- over1: "#D14343",
5707
- // red — mild over-target
5708
- over2: "#A62626",
5709
- // deep red — moderate over-target
5710
- over3: "#7A1C1C"
5711
- // darkest red — severe over-target
5746
+ building: t7["status-success"],
5747
+ // below target ramp-up
5748
+ approaching: t7["status-warning"],
5749
+ // nearing target
5750
+ target: t7["brand-primary"],
5751
+ // exactly at target
5752
+ over1: t7["status-error"],
5753
+ // mild over-target
5754
+ over2: WORKOUT_TOKENS.intensity.over2,
5755
+ // moderate over-target
5756
+ over3: WORKOUT_TOKENS.intensity.over3
5757
+ // severe over-target
5712
5758
  };
5713
5759
  var BULGE_SIZE = { 1: 8, 2: 10, 3: 11 };
5714
5760
  function zoneForPct(pct) {
@@ -5866,7 +5912,7 @@ function IntensityBar({
5866
5912
  }
5867
5913
 
5868
5914
  // src/components/custom/Workout/WeekRow.tsx
5869
- var BRAND_PRIMARY8 = "#FF7900";
5915
+ var BRAND_PRIMARY9 = getSemanticColors("dark")["brand-primary"];
5870
5916
  function WeekRow({
5871
5917
  weekNumber,
5872
5918
  totalWeeks,
@@ -5886,12 +5932,12 @@ function WeekRow({
5886
5932
  gap: 12
5887
5933
  };
5888
5934
  if (isDeload) {
5889
- rowStyle.backgroundColor = "rgba(147,51,234,0.06)";
5935
+ rowStyle.backgroundColor = "rgba(186,41,150,0.06)";
5890
5936
  }
5891
5937
  if (isCurrent) {
5892
5938
  rowStyle.backgroundColor = "rgba(255,121,0,0.04)";
5893
5939
  rowStyle.borderLeftWidth = 2;
5894
- rowStyle.borderLeftColor = BRAND_PRIMARY8;
5940
+ rowStyle.borderLeftColor = BRAND_PRIMARY9;
5895
5941
  }
5896
5942
  return /* @__PURE__ */ jsxs(
5897
5943
  View,
@@ -5915,7 +5961,7 @@ function WeekRow({
5915
5961
  width: 6,
5916
5962
  height: 6,
5917
5963
  borderRadius: 3,
5918
- backgroundColor: BRAND_PRIMARY8
5964
+ backgroundColor: BRAND_PRIMARY9
5919
5965
  },
5920
5966
  accessibilityElementsHidden: true,
5921
5967
  testID: "week-row-current-dot"
@@ -5929,7 +5975,7 @@ function WeekRow({
5929
5975
  fontSize: 13,
5930
5976
  fontWeight: "700",
5931
5977
  fontFamily: "Inter, sans-serif",
5932
- color: isCurrent ? BRAND_PRIMARY8 : void 0
5978
+ color: isCurrent ? BRAND_PRIMARY9 : void 0
5933
5979
  },
5934
5980
  accessibilityElementsHidden: true,
5935
5981
  children: `W${weekNumber}`
@@ -5970,11 +6016,11 @@ function WeekRow({
5970
6016
  }
5971
6017
 
5972
6018
  // src/components/custom/Workout/MesoCard.tsx
5973
- var BRAND_PRIMARY9 = "#FF7900";
5974
- var BRAND_PRIMARY_DARK2 = "#C45E00";
5975
- var BRAND_PRIMARY_LIGHT2 = "#FFB066";
6019
+ var BRAND_PRIMARY10 = getSemanticColors("dark")["brand-primary"];
6020
+ var BRAND_PRIMARY_DARK2 = MESO_ACCENT_GRADIENT_DARK;
6021
+ var BRAND_PRIMARY_LIGHT2 = MESO_ACCENT_GRADIENT_LIGHT;
5976
6022
  var BORDER_DEFAULT = "#1F1F1F";
5977
- var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY9, BRAND_PRIMARY_LIGHT2];
6023
+ var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY10, BRAND_PRIMARY_LIGHT2];
5978
6024
  function heatmapColor(percentage) {
5979
6025
  const clamped = Math.max(0, Math.min(100, percentage));
5980
6026
  const opacity = 0.12 + clamped / 100 * 0.78;
@@ -6009,7 +6055,7 @@ function MesoCard({
6009
6055
  }, [highlighted, highlight]);
6010
6056
  const borderColor = highlight.interpolate({
6011
6057
  inputRange: [0, 1],
6012
- outputRange: [BORDER_DEFAULT, BRAND_PRIMARY9]
6058
+ outputRange: [BORDER_DEFAULT, BRAND_PRIMARY10]
6013
6059
  });
6014
6060
  const header = /* @__PURE__ */ jsxs(View, { style: { paddingHorizontal: 14, paddingTop: 12, paddingBottom: 10 }, testID: "meso-card-body", children: [
6015
6061
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 8 }, testID: "meso-card-header", children: [
@@ -6069,7 +6115,7 @@ function MesoCard({
6069
6115
  {
6070
6116
  variant: "outline",
6071
6117
  elevation: 2,
6072
- borderColor: highlighted ? BRAND_PRIMARY9 : BORDER_DEFAULT,
6118
+ borderColor: highlighted ? BRAND_PRIMARY10 : BORDER_DEFAULT,
6073
6119
  className,
6074
6120
  style: [
6075
6121
  { borderColor },
@@ -6126,12 +6172,13 @@ function MesoCard({
6126
6172
  }
6127
6173
  ) });
6128
6174
  }
6175
+ var t8 = getSemanticColors("dark");
6129
6176
  var dotColorMap = {
6130
6177
  untrained: "#2C2C2C",
6131
- behind: "#406D87",
6132
- ontrack: "#14B8A6",
6133
- target: "#FF7900",
6134
- over: "#D14343"
6178
+ behind: t8["brand-secondary"],
6179
+ ontrack: t8["status-success"],
6180
+ target: t8["brand-primary"],
6181
+ over: t8["status-error"]
6135
6182
  };
6136
6183
  function MuscleGroupChip({
6137
6184
  name,
@@ -6205,9 +6252,10 @@ function MuscleGroupChip({
6205
6252
  }
6206
6253
 
6207
6254
  // src/components/custom/Workout/WorkoutCard.tsx
6255
+ var t9 = getSemanticColors("dark");
6208
6256
  var COLORS = {
6209
- statusSuccess: "#14B8A6",
6210
- brandPrimary: "#FF7900",
6257
+ statusSuccess: t9["status-success"],
6258
+ brandPrimary: t9["brand-primary"],
6211
6259
  borderDefault: "#1F1F1F",
6212
6260
  brandPrimarySubtle: "rgba(255,121,0,0.06)"
6213
6261
  };
@@ -6351,7 +6399,7 @@ function WorkoutCard({
6351
6399
  }
6352
6400
 
6353
6401
  // src/components/custom/Workout/ProgramPlanningPage.tsx
6354
- var BRAND_PRIMARY10 = "#FF7900";
6402
+ var BRAND_PRIMARY11 = getSemanticColors("dark")["brand-primary"];
6355
6403
  var WORKOUT_PILL_STATUS = {
6356
6404
  completed: "completed",
6357
6405
  today: "current",
@@ -6419,7 +6467,7 @@ function Breadcrumbs({ crumbs, onNavigate }) {
6419
6467
  fontSize: 12,
6420
6468
  fontFamily: "Inter, sans-serif",
6421
6469
  fontWeight: isLast ? "700" : "500",
6422
- color: isLast ? void 0 : BRAND_PRIMARY10
6470
+ color: isLast ? void 0 : BRAND_PRIMARY11
6423
6471
  },
6424
6472
  children: crumb.label
6425
6473
  }