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