@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/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
+ var jsxRuntime = require('react/jsx-runtime');
3
4
  var reactNative = require('react-native');
4
5
  var clsx = require('clsx');
5
6
  var tailwindMerge = require('tailwind-merge');
6
- var jsxRuntime = require('react/jsx-runtime');
7
7
  var React24 = require('react');
8
8
 
9
9
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -16,9 +16,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
16
16
  if (typeof require !== "undefined") return require.apply(this, arguments);
17
17
  throw Error('Dynamic require of "' + x + '" is not supported');
18
18
  });
19
- function cn(...inputs) {
20
- return tailwindMerge.twMerge(clsx.clsx(inputs));
21
- }
22
19
  function wrapJsx(fn) {
23
20
  return function(type, props, ...rest) {
24
21
  if (props && typeof props.className === "string" && props.className) {
@@ -37,6 +34,58 @@ function wrapJsx(fn) {
37
34
  var jsx = wrapJsx(jsxRuntime.jsx);
38
35
  var jsxs = wrapJsx(jsxRuntime.jsxs);
39
36
 
37
+ // src/components/icons/SvgIcon.tsx
38
+ function SvgIcon({
39
+ size = 24,
40
+ color = "currentColor",
41
+ strokeWidth = 2,
42
+ fill = "none",
43
+ title,
44
+ children
45
+ }) {
46
+ return /* @__PURE__ */ jsxs(
47
+ "svg",
48
+ {
49
+ width: size,
50
+ height: size,
51
+ viewBox: "0 0 24 24",
52
+ fill,
53
+ stroke: color,
54
+ strokeWidth,
55
+ strokeLinecap: "round",
56
+ strokeLinejoin: "round",
57
+ ...title ? { role: "img", "aria-label": title } : { "aria-hidden": true },
58
+ children: [
59
+ title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
60
+ children
61
+ ]
62
+ }
63
+ );
64
+ }
65
+
66
+ // src/components/icons/icons.tsx
67
+ function VoltrasMark({ size = 14, ...props }) {
68
+ return /* @__PURE__ */ jsx(SvgIcon, { size, ...props, children: /* @__PURE__ */ jsx("path", { d: "M12 2 22 12 12 22 2 12Z" }) });
69
+ }
70
+ function BluetoothIcon({ size = 18, ...props }) {
71
+ return /* @__PURE__ */ jsx(SvgIcon, { size, ...props, children: /* @__PURE__ */ jsx("path", { d: "M7 7 17 17 12 22 12 2 17 7 7 17" }) });
72
+ }
73
+ function DumbbellIcon(props) {
74
+ return /* @__PURE__ */ jsxs(SvgIcon, { ...props, children: [
75
+ /* @__PURE__ */ jsx("path", { d: "M14.4 14.4 9.6 9.6" }),
76
+ /* @__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" }),
77
+ /* @__PURE__ */ jsx("path", { d: "m21.5 21.5-1.4-1.4" }),
78
+ /* @__PURE__ */ jsx("path", { d: "M3.9 3.9 2.5 2.5" }),
79
+ /* @__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" })
80
+ ] });
81
+ }
82
+ function StarIcon(props) {
83
+ 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" }) });
84
+ }
85
+ function cn(...inputs) {
86
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
87
+ }
88
+
40
89
  // src/components/ui/alert/Alert.tsx
41
90
  var statusColors = {
42
91
  success: {
@@ -194,6 +243,38 @@ var primitiveColors = {
194
243
  800: "#991B1B",
195
244
  900: "#7F1D1D"
196
245
  },
246
+ // Vivid green scale (live/go success)
247
+ greenVivid: {
248
+ 50: "#E9FBF0",
249
+ 100: "#C8F7DA",
250
+ 200: "#9FF0BF",
251
+ 300: "#6BE79D",
252
+ 400: "#47DE84",
253
+ // Success vivid light
254
+ 500: "#2ED573",
255
+ // Success vivid main
256
+ 600: "#22B85F",
257
+ 700: "#1A9950",
258
+ // Success vivid dark
259
+ 800: "#157A40",
260
+ 900: "#105C30"
261
+ },
262
+ // Vivid red scale (alert)
263
+ redVivid: {
264
+ 50: "#FFECEE",
265
+ 100: "#FFD6DB",
266
+ 200: "#FFB3BC",
267
+ 300: "#FF8593",
268
+ 400: "#FF6070",
269
+ // Error vivid light
270
+ 500: "#FF4757",
271
+ // Error vivid main
272
+ 600: "#E63548",
273
+ 700: "#C42539",
274
+ // Error vivid dark
275
+ 800: "#9E1C2C",
276
+ 900: "#7A1520"
277
+ },
197
278
  // Amber scale (warning)
198
279
  amber: {
199
280
  50: "#FFFBEB",
@@ -283,6 +364,162 @@ var primitiveColors = {
283
364
  black: "#000000",
284
365
  transparent: "transparent"
285
366
  };
367
+ var primitiveRamps = {
368
+ red: {
369
+ 50: "#FFF4F4",
370
+ 100: "#FFE3E5",
371
+ 200: "#FFC2C5",
372
+ 300: "#FF9A9D",
373
+ 400: "#F77175",
374
+ 500: "#E05254",
375
+ 600: "#D14343",
376
+ // pin
377
+ 700: "#A4221C",
378
+ 800: "#7E1002",
379
+ 900: "#5A0900",
380
+ 950: "#3D0400"
381
+ },
382
+ orange: {
383
+ 50: "#FFF5ED",
384
+ 100: "#FFE6D4",
385
+ 200: "#FFC7A2",
386
+ 300: "#FFA063",
387
+ 400: "#FF7900",
388
+ // pin
389
+ 500: "#DA5F00",
390
+ 600: "#B94A00",
391
+ 700: "#983804",
392
+ 800: "#6F290F",
393
+ 900: "#4E1C0C",
394
+ 950: "#331107"
395
+ },
396
+ amber: {
397
+ 50: "#FFF7DD",
398
+ 100: "#FFEAA9",
399
+ 200: "#FFD352",
400
+ 300: "#F9B415",
401
+ // pin
402
+ 400: "#E08C00",
403
+ 500: "#C27400",
404
+ 600: "#A45E00",
405
+ 700: "#814D14",
406
+ 800: "#5B3A1A",
407
+ 900: "#442503",
408
+ 950: "#301500"
409
+ },
410
+ green: {
411
+ 50: "#E3FFEE",
412
+ 100: "#B5FFD2",
413
+ 200: "#58F69E",
414
+ 300: "#2ED573",
415
+ // pin
416
+ 400: "#21C05D",
417
+ 500: "#22A444",
418
+ 600: "#298732",
419
+ 700: "#2B6B25",
420
+ 800: "#264D1C",
421
+ 900: "#1B3515",
422
+ 950: "#11220D"
423
+ },
424
+ cyan: {
425
+ 50: "#E6FBFF",
426
+ 100: "#C2F6FF",
427
+ 200: "#62EAFF",
428
+ 300: "#22D3EE",
429
+ // pin
430
+ 400: "#01B5D1",
431
+ 500: "#2697B7",
432
+ 600: "#307B9B",
433
+ 700: "#2A617F",
434
+ 800: "#22465F",
435
+ 900: "#0B3149",
436
+ 950: "#001F36"
437
+ },
438
+ blue: {
439
+ 50: "#EFF8FF",
440
+ 100: "#D9EFFF",
441
+ 200: "#ACDBFF",
442
+ 300: "#78C2FF",
443
+ 400: "#3CA8FF",
444
+ 500: "#2196F3",
445
+ // pin
446
+ 600: "#1072CB",
447
+ 700: "#135AA8",
448
+ 800: "#14407E",
449
+ 900: "#112C5A",
450
+ 950: "#091B3C"
451
+ },
452
+ magenta: {
453
+ 50: "#FFF3F9",
454
+ 100: "#FFE2F1",
455
+ 200: "#FFBDE2",
456
+ 300: "#FF8FD5",
457
+ 400: "#ED69C3",
458
+ 500: "#D548AF",
459
+ 600: "#BA2996",
460
+ 700: "#9C0D7A",
461
+ // pin
462
+ 800: "#77005A",
463
+ 900: "#56003F",
464
+ 950: "#3B0029"
465
+ }
466
+ };
467
+ var categoricalPalette = {
468
+ default: [
469
+ primitiveRamps.blue[500],
470
+ primitiveRamps.magenta[500],
471
+ primitiveRamps.red[500],
472
+ primitiveRamps.orange[400],
473
+ primitiveRamps.green[300],
474
+ primitiveRamps.cyan[300],
475
+ primitiveRamps.amber[600]
476
+ // extended (7th) — pair with a legend
477
+ ],
478
+ dark: [
479
+ primitiveRamps.blue[600],
480
+ primitiveRamps.magenta[600],
481
+ primitiveRamps.red[500],
482
+ primitiveRamps.orange[600],
483
+ primitiveRamps.green[800],
484
+ primitiveRamps.cyan[800],
485
+ primitiveRamps.amber[500]
486
+ // extended (7th) — pair with a legend
487
+ ]
488
+ };
489
+ var CATEGORICAL_CVD_SAFE_MAX = 6;
490
+ function getCategoricalColor(index, variant = "default") {
491
+ const palette = categoricalPalette[variant];
492
+ index = Math.max(0, Math.floor(index));
493
+ return palette[index % palette.length];
494
+ }
495
+ var divergingScale = [
496
+ primitiveRamps.blue[500],
497
+ // under
498
+ primitiveRamps.cyan[300],
499
+ // maintenance
500
+ primitiveRamps.green[200],
501
+ // optimal (light center)
502
+ primitiveRamps.amber[300],
503
+ // approaching
504
+ primitiveRamps.red[600]
505
+ // over
506
+ ];
507
+ var sequentialEffort = [
508
+ primitiveRamps.green[300],
509
+ primitiveRamps.amber[200],
510
+ primitiveRamps.amber[300],
511
+ primitiveRamps.orange[400],
512
+ primitiveRamps.red[600],
513
+ primitiveRamps.red[700]
514
+ ];
515
+ function bestTextColor(hex) {
516
+ const [r, g, b] = [0, 2, 4].map((i) => {
517
+ const c = parseInt(hex.replace("#", "").slice(i, i + 2), 16) / 255;
518
+ return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92;
519
+ });
520
+ const l = 0.2126 * r + 0.7152 * g + 0.0722 * b;
521
+ return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? "#000000" : "#FFFFFF";
522
+ }
286
523
  var discreteRainbow = [
287
524
  "#E8ECFB",
288
525
  "#D9CCE3",
@@ -492,56 +729,43 @@ var primitiveZIndex = {
492
729
  // src/theme/tokens/semantic.ts
493
730
  var semanticColorsLight = {
494
731
  // Brand colors (brand-*)
495
- "brand-primary": primitiveColors.accent[400],
496
- // #FF7900
497
- "brand-primary-light": primitiveColors.accent[200],
498
- // #FF9630
499
- "brand-primary-dark": primitiveColors.accent[700],
500
- // #D0620C
732
+ "brand-primary": primitiveRamps.orange[400],
733
+ "brand-primary-light": primitiveRamps.orange[300],
734
+ "brand-primary-dark": primitiveRamps.orange[500],
501
735
  "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
502
- "brand-primary-hover": primitiveColors.accent[500],
503
- "brand-primary-active": primitiveColors.accent[600],
504
- "brand-secondary": primitiveColors.steel[500],
505
- // #406D87
506
- "brand-secondary-light": primitiveColors.steel[300],
507
- // #678498
508
- "brand-secondary-dark": primitiveColors.steel[700],
509
- // #32556D
510
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.08)",
511
- "brand-secondary-hover": primitiveColors.steel[600],
512
- "brand-secondary-active": primitiveColors.steel[700],
736
+ "brand-primary-hover": primitiveRamps.orange[500],
737
+ "brand-primary-active": primitiveRamps.orange[600],
738
+ "brand-secondary": primitiveRamps.cyan[600],
739
+ "brand-secondary-light": primitiveRamps.cyan[500],
740
+ "brand-secondary-dark": primitiveRamps.cyan[700],
741
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.08)",
742
+ "brand-secondary-hover": primitiveRamps.cyan[700],
743
+ "brand-secondary-active": primitiveRamps.cyan[800],
513
744
  // Text on brand backgrounds (on-*)
514
745
  "on-brand-primary": primitiveColors.white,
515
746
  "on-brand-secondary": primitiveColors.white,
516
747
  // Status colors (status-*)
517
- "status-success": primitiveColors.teal[500],
518
- // #14B8A6
519
- "status-success-light": primitiveColors.teal[400],
520
- // #43C6B7
521
- "status-success-dark": primitiveColors.teal[700],
522
- // #0E8074
523
- "status-success-subtle": primitiveColors.teal[50],
524
- "status-error": primitiveColors.red[600],
525
- // #D14343
526
- "status-error-light": primitiveColors.red[400],
527
- // #DA6868
528
- "status-error-dark": primitiveColors.red[700],
529
- // #922E2E
530
- "status-error-subtle": primitiveColors.red[50],
531
- "status-warning": primitiveColors.amber[500],
532
- // #FFB020
533
- "status-warning-light": primitiveColors.amber[400],
534
- // #FFBF4C
535
- "status-warning-dark": primitiveColors.amber[600],
536
- // #B27B16
537
- "status-warning-subtle": primitiveColors.amber[50],
538
- "status-info": primitiveColors.sky[500],
539
- // #2196F3
540
- "status-info-light": primitiveColors.sky[400],
541
- // #64B6F7
542
- "status-info-dark": primitiveColors.sky[700],
543
- // #0B79D0
544
- "status-info-subtle": primitiveColors.sky[50],
748
+ "status-success": primitiveRamps.green[300],
749
+ "status-success-light": primitiveRamps.green[200],
750
+ "status-success-dark": primitiveRamps.green[600],
751
+ "status-success-subtle": primitiveRamps.green[50],
752
+ "status-error": primitiveRamps.red[600],
753
+ "status-error-light": primitiveRamps.red[500],
754
+ "status-error-dark": primitiveRamps.red[700],
755
+ "status-error-subtle": primitiveRamps.red[50],
756
+ "status-error-vivid": primitiveColors.redVivid[500],
757
+ // vivid alert red
758
+ "status-error-vivid-light": primitiveColors.redVivid[400],
759
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
760
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
761
+ "status-warning": primitiveRamps.amber[300],
762
+ "status-warning-light": primitiveRamps.amber[200],
763
+ "status-warning-dark": primitiveRamps.amber[500],
764
+ "status-warning-subtle": primitiveRamps.amber[50],
765
+ "status-info": primitiveRamps.blue[500],
766
+ "status-info-light": primitiveRamps.blue[300],
767
+ "status-info-dark": primitiveRamps.blue[600],
768
+ "status-info-subtle": primitiveRamps.blue[50],
545
769
  // Text on status backgrounds (on-status-*)
546
770
  "on-status-success": primitiveColors.white,
547
771
  "on-status-error": primitiveColors.white,
@@ -568,25 +792,25 @@ var semanticColorsLight = {
568
792
  // Data visualization colors (data-*)
569
793
  // First 10 colors from discrete rainbow optimized for charts
570
794
  "data-1": discreteRainbow[9],
571
- // #1965B0 - Blue
795
+ // Blue
572
796
  "data-2": discreteRainbow[14],
573
- // #4EB265 - Green
797
+ // Green
574
798
  "data-3": discreteRainbow[17],
575
- // #F7F056 - Yellow
799
+ // Yellow
576
800
  "data-4": discreteRainbow[25],
577
- // #DC050C - Red
801
+ // Red
578
802
  "data-5": discreteRainbow[8],
579
- // #882E72 - Purple
803
+ // Purple
580
804
  "data-6": discreteRainbow[20],
581
- // #F4A736 - Orange
805
+ // Orange
582
806
  "data-7": discreteRainbow[13],
583
- // #7BAFDE - Light Blue
807
+ // Light Blue
584
808
  "data-8": discreteRainbow[15],
585
- // #90C987 - Light Green
809
+ // Light Green
586
810
  "data-9": discreteRainbow[3],
587
- // #CAACCB - Lavender
811
+ // Lavender
588
812
  "data-10": discreteRainbow[22],
589
- // #EE8026 - Dark Orange
813
+ // Dark Orange
590
814
  // Text colors (text-*)
591
815
  "text-primary": "#121828",
592
816
  "text-secondary": "#65748B",
@@ -598,9 +822,9 @@ var semanticColorsLight = {
598
822
  // Surface colors (surface-*) - for elevated containers
599
823
  "surface-base": primitiveColors.white,
600
824
  "surface-elevated": primitiveColors.neutral[50],
601
- // #FAFAFA - slightly off-white for elevated cards
825
+ // slightly off-white for elevated cards
602
826
  "surface-raised": primitiveColors.neutral[100],
603
- // #F3F4F6 - light gray for raised cards
827
+ // light gray for raised cards
604
828
  "surface-overlay": primitiveColors.white,
605
829
  "surface-input": primitiveColors.neutral[50],
606
830
  // Input field background (filled variant)
@@ -612,6 +836,8 @@ var semanticColorsLight = {
612
836
  "border-default": "#E8E9EB",
613
837
  "border-subtle": primitiveColors.neutral[100],
614
838
  "border-strong": primitiveColors.neutral[300],
839
+ "border-prominent": primitiveColors.neutral[400],
840
+ // high-visibility divider
615
841
  "border-focus": primitiveColors.blue[600],
616
842
  "border-input": primitiveColors.neutral[300],
617
843
  // Input field border
@@ -636,37 +862,41 @@ var semanticColorsLight = {
636
862
  };
637
863
  var semanticColorsDark = {
638
864
  // Brand colors stay the same in dark mode
639
- "brand-primary": primitiveColors.accent[400],
640
- "brand-primary-light": primitiveColors.accent[200],
641
- "brand-primary-dark": primitiveColors.accent[700],
865
+ "brand-primary": primitiveRamps.orange[400],
866
+ "brand-primary-light": primitiveRamps.orange[300],
867
+ "brand-primary-dark": primitiveRamps.orange[500],
642
868
  "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
643
- "brand-primary-hover": primitiveColors.accent[300],
644
- "brand-primary-active": primitiveColors.accent[200],
645
- "brand-secondary": primitiveColors.steel[500],
646
- "brand-secondary-light": primitiveColors.steel[300],
647
- "brand-secondary-dark": primitiveColors.steel[700],
648
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.12)",
649
- "brand-secondary-hover": primitiveColors.steel[400],
650
- "brand-secondary-active": primitiveColors.steel[300],
869
+ "brand-primary-hover": primitiveRamps.orange[300],
870
+ "brand-primary-active": primitiveRamps.orange[200],
871
+ "brand-secondary": primitiveRamps.cyan[600],
872
+ "brand-secondary-light": primitiveRamps.cyan[500],
873
+ "brand-secondary-dark": primitiveRamps.cyan[700],
874
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
875
+ "brand-secondary-hover": primitiveRamps.cyan[500],
876
+ "brand-secondary-active": primitiveRamps.cyan[400],
651
877
  // Text on brand backgrounds
652
878
  "on-brand-primary": primitiveColors.white,
653
879
  "on-brand-secondary": primitiveColors.white,
654
880
  // Status colors
655
- "status-success": primitiveColors.teal[500],
656
- "status-success-light": primitiveColors.teal[400],
657
- "status-success-dark": primitiveColors.teal[700],
658
- "status-success-subtle": "rgba(20, 184, 166, 0.12)",
659
- "status-error": primitiveColors.red[600],
660
- "status-error-light": primitiveColors.red[400],
661
- "status-error-dark": primitiveColors.red[700],
881
+ "status-success": primitiveRamps.green[300],
882
+ "status-success-light": primitiveRamps.green[200],
883
+ "status-success-dark": primitiveRamps.green[600],
884
+ "status-success-subtle": "rgba(46, 213, 115, 0.12)",
885
+ "status-error": primitiveRamps.red[600],
886
+ "status-error-light": primitiveRamps.red[500],
887
+ "status-error-dark": primitiveRamps.red[700],
662
888
  "status-error-subtle": "rgba(209, 67, 67, 0.12)",
663
- "status-warning": primitiveColors.amber[500],
664
- "status-warning-light": primitiveColors.amber[400],
665
- "status-warning-dark": primitiveColors.amber[600],
666
- "status-warning-subtle": "rgba(255, 176, 32, 0.12)",
667
- "status-info": primitiveColors.sky[500],
668
- "status-info-light": primitiveColors.sky[400],
669
- "status-info-dark": primitiveColors.sky[700],
889
+ "status-error-vivid": primitiveColors.redVivid[500],
890
+ "status-error-vivid-light": primitiveColors.redVivid[400],
891
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
892
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
893
+ "status-warning": primitiveRamps.amber[300],
894
+ "status-warning-light": primitiveRamps.amber[200],
895
+ "status-warning-dark": primitiveRamps.amber[500],
896
+ "status-warning-subtle": "rgba(249, 180, 21, 0.12)",
897
+ "status-info": primitiveRamps.blue[500],
898
+ "status-info-light": primitiveRamps.blue[300],
899
+ "status-info-dark": primitiveRamps.blue[600],
670
900
  "status-info-subtle": "rgba(33, 150, 243, 0.12)",
671
901
  // Text on status backgrounds
672
902
  "on-status-success": primitiveColors.white,
@@ -708,29 +938,31 @@ var semanticColorsDark = {
708
938
  "text-link-hover": primitiveColors.blue[400],
709
939
  // Surface colors - dark backgrounds
710
940
  "surface-base": primitiveColors.charcoal[700],
711
- // #161616 - main surface
941
+ // main surface
712
942
  "surface-elevated": primitiveColors.charcoal[600],
713
- // #191919 - elevated surface
943
+ // elevated surface
714
944
  "surface-raised": primitiveColors.charcoal[500],
715
- // #1C1C1C - raised surface
945
+ // raised surface
716
946
  "surface-overlay": primitiveColors.charcoal[600],
717
- // #191919 - overlay surface
947
+ // overlay surface
718
948
  "surface-input": primitiveColors.charcoal[600],
719
- // #191919 - input surface
949
+ // input surface
720
950
  // Background colors
721
951
  "background-base": primitiveColors.charcoal[900],
722
- // #101010 - darkest charcoal
952
+ // darkest charcoal
723
953
  "background-default": primitiveColors.charcoal[700],
724
- // #161616 - main background
954
+ // main background
725
955
  "background-subtle": primitiveColors.charcoal[500],
726
- // #1C1C1C - subtle background
956
+ // subtle background
727
957
  // Border colors
728
958
  "border-default": primitiveColors.charcoal[400],
729
- // #1F1F1F - default border
959
+ // default border
730
960
  "border-subtle": primitiveColors.charcoal[500],
731
- // #1C1C1C - subtle border
961
+ // subtle border
732
962
  "border-strong": primitiveColors.charcoal[300],
733
- // #2C2C2C - strong border
963
+ // strong border
964
+ "border-prominent": primitiveColors.charcoal[200],
965
+ // high-visibility divider
734
966
  "border-focus": "#828DF8",
735
967
  "border-input": primitiveColors.neutral[600],
736
968
  "border-input-hover": primitiveColors.neutral[500],
@@ -745,7 +977,7 @@ var semanticColorsDark = {
745
977
  "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
746
978
  // Divider
747
979
  "divider": primitiveColors.charcoal[400],
748
- // #1F1F1F - divider color
980
+ // divider color
749
981
  // Avatar default
750
982
  "avatar-background": primitiveColors.neutral[600],
751
983
  "avatar-text": primitiveColors.white
@@ -1211,10 +1443,11 @@ var PasswordInput = React24.forwardRef(function PasswordInput2({ showIcon, hideI
1211
1443
  var themeIndependentCSSVars = {
1212
1444
  // RGB decomposed values for glow shadows
1213
1445
  "--color-brand-primary-rgb": "255, 121, 0",
1214
- "--color-brand-secondary-rgb": "64, 109, 135",
1215
- "--color-status-success-rgb": "20, 184, 166",
1446
+ "--color-brand-secondary-rgb": "48, 123, 155",
1447
+ "--color-status-success-rgb": "46, 213, 115",
1216
1448
  "--color-status-error-rgb": "209, 67, 67",
1217
- "--color-status-warning-rgb": "255, 176, 32",
1449
+ "--color-status-error-vivid-rgb": "255, 71, 87",
1450
+ "--color-status-warning-rgb": "249, 180, 21",
1218
1451
  "--color-status-info-rgb": "33, 150, 243",
1219
1452
  "--color-background-base-rgb": "16, 16, 16",
1220
1453
  // Font families
@@ -1249,6 +1482,10 @@ var lightThemeCSSVars = {
1249
1482
  "--color-status-warning-subtle": semanticColorsLight["status-warning-subtle"],
1250
1483
  "--color-status-info": semanticColorsLight["status-info"],
1251
1484
  "--color-status-info-subtle": semanticColorsLight["status-info-subtle"],
1485
+ "--color-status-error-vivid": semanticColorsLight["status-error-vivid"],
1486
+ "--color-status-error-vivid-light": semanticColorsLight["status-error-vivid-light"],
1487
+ "--color-status-error-vivid-dark": semanticColorsLight["status-error-vivid-dark"],
1488
+ "--color-status-error-vivid-subtle": semanticColorsLight["status-error-vivid-subtle"],
1252
1489
  "--color-text-primary": semanticColorsLight["text-primary"],
1253
1490
  "--color-text-secondary": semanticColorsLight["text-secondary"],
1254
1491
  "--color-text-tertiary": semanticColorsLight["text-tertiary"],
@@ -1264,6 +1501,7 @@ var lightThemeCSSVars = {
1264
1501
  "--color-border-default": semanticColorsLight["border-default"],
1265
1502
  "--color-border-subtle": semanticColorsLight["border-subtle"],
1266
1503
  "--color-border-strong": semanticColorsLight["border-strong"],
1504
+ "--color-border-prominent": semanticColorsLight["border-prominent"],
1267
1505
  "--color-border-focus": semanticColorsLight["border-focus"],
1268
1506
  "--color-interactive-hover": semanticColorsLight["interactive-hover"],
1269
1507
  "--color-interactive-focus": semanticColorsLight["interactive-focus"],
@@ -1340,6 +1578,10 @@ var darkThemeCSSVars = {
1340
1578
  "--color-status-warning-subtle": semanticColorsDark["status-warning-subtle"],
1341
1579
  "--color-status-info": semanticColorsDark["status-info"],
1342
1580
  "--color-status-info-subtle": semanticColorsDark["status-info-subtle"],
1581
+ "--color-status-error-vivid": semanticColorsDark["status-error-vivid"],
1582
+ "--color-status-error-vivid-light": semanticColorsDark["status-error-vivid-light"],
1583
+ "--color-status-error-vivid-dark": semanticColorsDark["status-error-vivid-dark"],
1584
+ "--color-status-error-vivid-subtle": semanticColorsDark["status-error-vivid-subtle"],
1343
1585
  "--color-text-primary": semanticColorsDark["text-primary"],
1344
1586
  "--color-text-secondary": semanticColorsDark["text-secondary"],
1345
1587
  "--color-text-tertiary": semanticColorsDark["text-tertiary"],
@@ -1355,6 +1597,7 @@ var darkThemeCSSVars = {
1355
1597
  "--color-border-default": semanticColorsDark["border-default"],
1356
1598
  "--color-border-subtle": semanticColorsDark["border-subtle"],
1357
1599
  "--color-border-strong": semanticColorsDark["border-strong"],
1600
+ "--color-border-prominent": semanticColorsDark["border-prominent"],
1358
1601
  "--color-border-focus": semanticColorsDark["border-focus"],
1359
1602
  "--color-interactive-hover": semanticColorsDark["interactive-hover"],
1360
1603
  "--color-interactive-focus": semanticColorsDark["interactive-focus"],
@@ -2163,6 +2406,17 @@ function resolveColor(token, mode = "dark") {
2163
2406
  return reactNative.Platform.OS === "web" ? `var(--color-${token})` : getSemanticColors(mode)[token];
2164
2407
  }
2165
2408
 
2409
+ // src/theme/gradients.ts
2410
+ function linearGradient(from, to, angle = 180, mode = "dark") {
2411
+ return {
2412
+ backgroundImage: `linear-gradient(${angle}deg, ${resolveColor(from, mode)}, ${resolveColor(to, mode)})`
2413
+ };
2414
+ }
2415
+ var surfaceGradient = {
2416
+ /** Chrome bands (top bar, headers): elevated → base, a subtle dark wash. */
2417
+ chrome: (mode = "dark") => linearGradient("surface-elevated", "background-base", 180, mode)
2418
+ };
2419
+
2166
2420
  // src/theme/presets/apply.ts
2167
2421
  function colorKeyToVar(key) {
2168
2422
  return `--color-${key}`;
@@ -2537,7 +2791,8 @@ var colorStyles = {
2537
2791
  success: "bg-status-success",
2538
2792
  error: "bg-status-error",
2539
2793
  warning: "bg-status-warning",
2540
- info: "bg-status-info"
2794
+ info: "bg-status-info",
2795
+ "error-vivid": "bg-status-error-vivid"
2541
2796
  };
2542
2797
  function Indicator({
2543
2798
  size = "sm",
@@ -2545,14 +2800,40 @@ function Indicator({
2545
2800
  customColor,
2546
2801
  glow = false,
2547
2802
  ring = false,
2803
+ pulse = false,
2548
2804
  className,
2549
2805
  style,
2550
2806
  ...props
2551
2807
  }) {
2808
+ const pulseMode = pulse === true ? "opacity" : pulse || false;
2809
+ const colorClass = !customColor ? colorStyles[color] : void 0;
2810
+ const colorStyle = customColor ? { backgroundColor: customColor } : void 0;
2811
+ if (pulseMode === "ping") {
2812
+ return /* @__PURE__ */ jsxs(reactNative.View, { className: cn("relative", sizeStyles3[size], className), style, ...props, children: [
2813
+ /* @__PURE__ */ jsx(
2814
+ reactNative.View,
2815
+ {
2816
+ className: cn("absolute inset-0 rounded-full animate-ping", colorClass),
2817
+ style: colorStyle
2818
+ }
2819
+ ),
2820
+ /* @__PURE__ */ jsx(
2821
+ reactNative.View,
2822
+ {
2823
+ className: cn(
2824
+ "relative rounded-full",
2825
+ sizeStyles3[size],
2826
+ colorClass,
2827
+ ring && "border-2 border-background-base"
2828
+ ),
2829
+ style: colorStyle
2830
+ }
2831
+ )
2832
+ ] });
2833
+ }
2552
2834
  const dynamicStyle = {
2553
2835
  ...typeof style === "object" ? style : {},
2554
- ...customColor ? { backgroundColor: customColor } : {},
2555
- ...glow && !customColor ? {} : {},
2836
+ ...colorStyle ?? {},
2556
2837
  ...glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}
2557
2838
  };
2558
2839
  return /* @__PURE__ */ jsx(
@@ -2561,12 +2842,14 @@ function Indicator({
2561
2842
  className: cn(
2562
2843
  "rounded-full shrink-0",
2563
2844
  sizeStyles3[size],
2564
- !customColor && colorStyles[color],
2845
+ colorClass,
2846
+ pulseMode === "opacity" && "animate-pulse",
2565
2847
  ring && "border-2 border-background-base",
2566
- glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(20,184,166,0.6)]",
2848
+ glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(46,213,115,0.6)]",
2567
2849
  glow && !customColor && color === "error" && "shadow-[0_0_6px_rgba(239,68,68,0.6)]",
2568
2850
  glow && !customColor && color === "warning" && "shadow-[0_0_6px_rgba(245,158,11,0.6)]",
2569
2851
  glow && !customColor && color === "primary" && "shadow-[0_0_6px_rgba(255,121,0,0.6)]",
2852
+ glow && !customColor && color === "error-vivid" && "shadow-[0_0_6px_rgba(255,71,87,0.6)]",
2570
2853
  className
2571
2854
  ),
2572
2855
  style: Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style,
@@ -2647,6 +2930,13 @@ function Badge({
2647
2930
  function BadgeText({ children, className }) {
2648
2931
  return /* @__PURE__ */ jsx(reactNative.Text, { className: cn("text-inherit font-medium", className), children });
2649
2932
  }
2933
+
2934
+ // src/theme/extracted-colors-ui.ts
2935
+ var SPINNER_PRIMARY = primitiveRamps.cyan[600];
2936
+ var SPINNER_SECONDARY = primitiveRamps.green[400];
2937
+ var AVATAR_CATEGORICAL_COLORS = categoricalPalette.default;
2938
+
2939
+ // src/components/ui/spinner/Spinner.tsx
2650
2940
  var sizeMap = {
2651
2941
  sm: "small",
2652
2942
  md: "small",
@@ -2654,8 +2944,8 @@ var sizeMap = {
2654
2944
  xl: "large"
2655
2945
  };
2656
2946
  var colorMap = {
2657
- primary: "#5048E5",
2658
- secondary: "#10B981",
2947
+ primary: SPINNER_PRIMARY,
2948
+ secondary: SPINNER_SECONDARY,
2659
2949
  white: "#FFFFFF",
2660
2950
  default: "#6B7280"
2661
2951
  };
@@ -2691,15 +2981,7 @@ function Spinner({
2691
2981
  }
2692
2982
 
2693
2983
  // src/utils/avatar-color.ts
2694
- var AVATAR_COLORS = [
2695
- "#FF6B6B",
2696
- "#4ECDC4",
2697
- "#45B7D1",
2698
- "#96CEB4",
2699
- "#FFEAA7",
2700
- "#DDA0DD",
2701
- "#98D8C8"
2702
- ];
2984
+ var AVATAR_COLORS = AVATAR_CATEGORICAL_COLORS;
2703
2985
  function avatarColor(name) {
2704
2986
  let hash = 0;
2705
2987
  for (let i = 0; i < name.length; i++) {
@@ -4344,7 +4626,7 @@ function ToolbarButton({
4344
4626
  const selected = isActive === void 0 ? isOpen : isActive;
4345
4627
  const showActive = isActive !== false;
4346
4628
  const getIconColor = () => {
4347
- if (isActive === true) return "#FF7900";
4629
+ if (isActive === true) return resolveColor("brand-primary");
4348
4630
  return showActive ? "#FFFFFF" : "#D1D1D1";
4349
4631
  };
4350
4632
  const getNeumorphicStyle = () => {
@@ -4987,7 +5269,7 @@ function ToastProvider({
4987
5269
  return id;
4988
5270
  }, [defaultDuration, maxToasts]);
4989
5271
  const removeToast = React24.useCallback((id) => {
4990
- setToasts((prev) => prev.filter((t2) => t2.id !== id));
5272
+ setToasts((prev) => prev.filter((t12) => t12.id !== id));
4991
5273
  }, []);
4992
5274
  const removeAllToasts = React24.useCallback(() => {
4993
5275
  setToasts([]);
@@ -5869,7 +6151,10 @@ var variantStyles4 = {
5869
6151
  subtitle2: "font-body text-sm font-medium leading-normal",
5870
6152
  caption: "font-body text-xs font-normal leading-loose",
5871
6153
  overline: "font-body text-xs font-semibold uppercase tracking-widest leading-relaxed",
5872
- button: "font-sans text-sm font-semibold leading-relaxed"
6154
+ button: "font-sans text-sm font-semibold leading-relaxed",
6155
+ // Monospace technical readouts (clocks, ids, metrics) and their all-caps label form.
6156
+ mono: "font-mono text-xs font-normal leading-normal",
6157
+ monoLabel: "font-mono text-xs font-bold uppercase tracking-wide leading-normal"
5873
6158
  };
5874
6159
  var colorStyles7 = {
5875
6160
  primary: "text-text-primary",
@@ -6558,7 +6843,7 @@ var colorStyles8 = {
6558
6843
  tertiary: "text-text-tertiary",
6559
6844
  inherit: ""
6560
6845
  };
6561
- function formatDate(value, format, isUTC) {
6846
+ function formatDate(value, format, isUTC, hour12, seconds) {
6562
6847
  const date = value instanceof Date ? value : new Date(value);
6563
6848
  if (isNaN(date.getTime())) {
6564
6849
  return "Invalid Date";
@@ -6608,6 +6893,12 @@ function formatDate(value, format, isUTC) {
6608
6893
  if (isUTC) {
6609
6894
  options.timeZone = "UTC";
6610
6895
  }
6896
+ if (hour12 !== void 0 && (options.hour !== void 0 || options.minute !== void 0)) {
6897
+ options.hour12 = hour12;
6898
+ }
6899
+ if (seconds && options.hour !== void 0) {
6900
+ options.second = "2-digit";
6901
+ }
6611
6902
  return new Intl.DateTimeFormat(void 0, options).format(date);
6612
6903
  }
6613
6904
  function getRelativeTime(date) {
@@ -6677,16 +6968,28 @@ function DateTime({
6677
6968
  format = "datetime",
6678
6969
  customFormat,
6679
6970
  isUTC = false,
6971
+ hour12,
6972
+ seconds,
6973
+ variant,
6974
+ live = false,
6975
+ refreshMs = 1e3,
6680
6976
  fallback = "-",
6681
6977
  color = "inherit",
6682
6978
  className,
6683
6979
  ...props
6684
6980
  }) {
6685
- if (value === null || value === void 0) {
6686
- return /* @__PURE__ */ jsx(reactNative.Text, { className: cn(colorStyles8[color], className), ...props, children: fallback });
6981
+ const [now, setNow] = React24.useState(() => Date.now());
6982
+ React24.useEffect(() => {
6983
+ if (!live) return;
6984
+ const id = setInterval(() => setNow(Date.now()), refreshMs);
6985
+ return () => clearInterval(id);
6986
+ }, [live, refreshMs]);
6987
+ const effectiveValue = live ? now : value;
6988
+ const text = effectiveValue === null || effectiveValue === void 0 ? fallback : formatDate(effectiveValue, format, isUTC, hour12, seconds);
6989
+ if (variant) {
6990
+ return /* @__PURE__ */ jsx(Typography, { variant, color, className, ...props, children: text });
6687
6991
  }
6688
- const formattedDate = formatDate(value, format, isUTC);
6689
- return /* @__PURE__ */ jsx(reactNative.Text, { className: cn(colorStyles8[color], className), ...props, children: formattedDate });
6992
+ return /* @__PURE__ */ jsx(reactNative.Text, { className: cn(colorStyles8[color], className), ...props, children: text });
6690
6993
  }
6691
6994
  function formatDateTime(value, format = "datetime", isUTC = false, fallback = "-") {
6692
6995
  if (value === null || value === void 0) {
@@ -6822,58 +7125,6 @@ function BaseBadge({
6822
7125
  }
6823
7126
  return badge;
6824
7127
  }
6825
-
6826
- // src/components/custom/Workout/icons.tsx
6827
- function DumbbellIcon({
6828
- size = 24,
6829
- color = "currentColor",
6830
- fill = "none",
6831
- strokeWidth = 2
6832
- }) {
6833
- return /* @__PURE__ */ jsxs(
6834
- "svg",
6835
- {
6836
- width: size,
6837
- height: size,
6838
- viewBox: "0 0 24 24",
6839
- fill,
6840
- stroke: color,
6841
- strokeWidth,
6842
- strokeLinecap: "round",
6843
- strokeLinejoin: "round",
6844
- children: [
6845
- /* @__PURE__ */ jsx("path", { d: "M14.4 14.4 9.6 9.6" }),
6846
- /* @__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" }),
6847
- /* @__PURE__ */ jsx("path", { d: "m21.5 21.5-1.4-1.4" }),
6848
- /* @__PURE__ */ jsx("path", { d: "M3.9 3.9 2.5 2.5" }),
6849
- /* @__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" })
6850
- ]
6851
- }
6852
- );
6853
- }
6854
- function StarIcon({
6855
- size = 24,
6856
- color = "currentColor",
6857
- fill = "none",
6858
- strokeWidth = 2
6859
- }) {
6860
- return /* @__PURE__ */ jsx(
6861
- "svg",
6862
- {
6863
- width: size,
6864
- height: size,
6865
- viewBox: "0 0 24 24",
6866
- fill,
6867
- stroke: color,
6868
- strokeWidth,
6869
- strokeLinecap: "round",
6870
- strokeLinejoin: "round",
6871
- 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" })
6872
- }
6873
- );
6874
- }
6875
-
6876
- // src/components/custom/Workout/WeightBadge.tsx
6877
7128
  function WeightBadge({
6878
7129
  value,
6879
7130
  unit = "lbs",
@@ -6887,7 +7138,7 @@ function WeightBadge({
6887
7138
  ...props
6888
7139
  }) {
6889
7140
  const config = baseBadgeSizeConfig[size];
6890
- const textColor = isPr ? "#FF7900" : "#9CA3AF";
7141
+ const textColor = isPr ? getSemanticColors("dark")["brand-primary"] : "#9CA3AF";
6891
7142
  const iconColor = textColor;
6892
7143
  const repMaxClause = reps != null ? `${reps} rep max` : "Estimated one rep max";
6893
7144
  const deltaLabel = delta != null ? `, ${delta >= 0 ? "+" : ""}${delta}% change` : "";
@@ -6946,7 +7197,7 @@ function WeightBadge({
6946
7197
  fontFamily: '"Space Grotesk", sans-serif',
6947
7198
  fontSize: config.fontSize,
6948
7199
  marginLeft: 4,
6949
- color: delta >= 0 ? "#4caf50" : "#ef5350"
7200
+ color: delta >= 0 ? getSemanticColors("dark")["result-improve"] : getSemanticColors("dark")["result-degrade"]
6950
7201
  },
6951
7202
  testID: "weight-badge-delta",
6952
7203
  children: [
@@ -6960,6 +7211,7 @@ function WeightBadge({
6960
7211
  }
6961
7212
  );
6962
7213
  }
7214
+ var BRAND_PRIMARY = getSemanticColors("dark")["brand-primary"];
6963
7215
  var typeLabels = {
6964
7216
  e1rm: "PR e1RM",
6965
7217
  weight: "PR Weight",
@@ -7003,7 +7255,7 @@ function PrBadge({
7003
7255
  accessibilityLabel: `Personal record: ${resolvedLabel}`,
7004
7256
  testID: "pr-badge-star",
7005
7257
  ...props,
7006
- children: /* @__PURE__ */ jsx(StarIcon, { size: 14, color: "#FF7900", fill: "#FF7900", strokeWidth: 2 })
7258
+ children: /* @__PURE__ */ jsx(StarIcon, { size: 14, color: BRAND_PRIMARY, fill: BRAND_PRIMARY, strokeWidth: 2 })
7007
7259
  }
7008
7260
  ) : /* @__PURE__ */ jsx(
7009
7261
  BaseBadge,
@@ -7017,7 +7269,7 @@ function PrBadge({
7017
7269
  {
7018
7270
  style: {
7019
7271
  fontSize: 12,
7020
- color: "#FF7900",
7272
+ color: BRAND_PRIMARY,
7021
7273
  fontWeight: "700",
7022
7274
  fontFamily: "Inter, sans-serif"
7023
7275
  },
@@ -7042,17 +7294,18 @@ function PrBadge({
7042
7294
  }
7043
7295
  return badge;
7044
7296
  }
7297
+ var t = getSemanticColors("dark");
7045
7298
  var solidVariantColors = {
7046
- success: "#14B8A6",
7047
- warning: "#FFB020",
7048
- error: "#D14343",
7299
+ success: t["status-success"],
7300
+ warning: t["status-warning"],
7301
+ error: t["status-error"],
7049
7302
  neutral: "#6B7280"
7050
7303
  };
7051
7304
  var ringVariantStyles = {
7052
7305
  "on-track": {
7053
- backgroundColor: "rgba(20,184,166,0.15)",
7306
+ backgroundColor: "rgba(46,213,115,0.15)",
7054
7307
  borderWidth: 1,
7055
- borderColor: "rgba(20,184,166,0.3)"
7308
+ borderColor: "rgba(46,213,115,0.3)"
7056
7309
  },
7057
7310
  deviation: {
7058
7311
  backgroundColor: "rgba(245,158,11,0.15)",
@@ -7067,11 +7320,11 @@ var ringVariantStyles = {
7067
7320
  }
7068
7321
  };
7069
7322
  var glowStyles = {
7070
- success: { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
7323
+ success: { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
7071
7324
  warning: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
7072
7325
  error: { boxShadow: "0 0 4px rgba(239,68,68,0.4)" },
7073
7326
  neutral: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" },
7074
- "on-track": { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
7327
+ "on-track": { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
7075
7328
  deviation: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
7076
7329
  future: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" }
7077
7330
  };
@@ -7085,8 +7338,8 @@ var iconColors2 = {
7085
7338
  warning: "#6B4000",
7086
7339
  error: "#5C1A1A",
7087
7340
  neutral: "#D1D5DB",
7088
- "on-track": "#14B8A6",
7089
- deviation: "#FFB020",
7341
+ "on-track": t["status-success"],
7342
+ deviation: t["status-warning"],
7090
7343
  future: "#6B7280"
7091
7344
  };
7092
7345
  var sizeDimensions = {
@@ -7173,17 +7426,41 @@ var WORKOUT_TOKENS = {
7173
7426
  // Canonical 4-band performance scale — the single source for BOTH the
7174
7427
  // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction
7175
7428
  // is intentionally inverted between the two consumers: for velocity, green =
7176
- // fastest/best; for RPE, green = easiest. Each component maps its own
7177
- // thresholds onto these four colors. Kept as vivid data-viz values (distinct
7178
- // from the muted status tokens) and theme-independent, so — like the heatmap
7179
- // scale below — they are consumed inline as a JS import rather than CSS vars.
7180
- // A JS import also resolves on native RN, unlike var(--…) strings.
7429
+ // fastest/best; for RPE, green = easiest. This is the [0,1,2,4] subsample of
7430
+ // the canonical `sequentialEffort` primitive. The `orange` key is the band
7431
+ // label. Consumed inline (RN).
7181
7432
  scale: {
7182
- green: "#2ed573",
7183
- yellow: "#ffd43b",
7184
- orange: "#ffa502",
7185
- red: "#ff4757"
7433
+ green: sequentialEffort[0],
7434
+ yellow: sequentialEffort[1],
7435
+ orange: sequentialEffort[2],
7436
+ // gold band
7437
+ red: sequentialEffort[4]
7438
+ },
7439
+ // BodyMap volume heatmap — the canonical `divergingScale` (under → optimal →
7440
+ // over): a true diverging shape with a light green center, cool-blue under-
7441
+ // trained end and warm-red over-reaching end (colorblind-robust in lightness).
7442
+ heatmap: {
7443
+ // no training data
7444
+ under: divergingScale[0],
7445
+ // below MEV
7446
+ maintenance: divergingScale[1],
7447
+ // MEV to MAV
7448
+ productive: divergingScale[2],
7449
+ // optimal center — MAV to MRV
7450
+ approaching: divergingScale[3],
7451
+ // near MRV
7452
+ over: divergingScale[4]
7453
+ // over MRV
7186
7454
  },
7455
+ // Surface and border colors were removed here: those flip with the theme, so
7456
+ // components use the CSS custom properties (var(--color-surface-*/border-*))
7457
+ // directly. Only theme-independent data-viz values remain below.
7458
+ // Intensity bar specific — over-target tiers deepen along the red ramp.
7459
+ intensity: {
7460
+ over1: primitiveRamps.red[600],
7461
+ // matches status-error
7462
+ over2: primitiveRamps.red[700],
7463
+ over3: primitiveRamps.red[800]},
7187
7464
  // Placeholder strip
7188
7465
  placeholder: {
7189
7466
  fill: "#3A3A3A"
@@ -7358,7 +7635,7 @@ function getLuminance(color) {
7358
7635
  function getContrastText(backgroundColor) {
7359
7636
  return getLuminance(backgroundColor) === "light" ? "#000000" : "#FFFFFF";
7360
7637
  }
7361
- var t = getSemanticColors("dark");
7638
+ var t2 = getSemanticColors("dark");
7362
7639
  var TEMPO_PACING = {
7363
7640
  behindThresholdPct: 0.15,
7364
7641
  minPhaseDurationMs: 500
@@ -7375,9 +7652,9 @@ function getTempoFillPct(elapsedMs, targetMs) {
7375
7652
  }
7376
7653
  var PHASE_ORDER = ["concentric", "hold", "eccentric"];
7377
7654
  var PHASE_CONFIG = {
7378
- concentric: { label: "Con", color: t["status-success"], flex: 2 },
7379
- hold: { label: "Hold", color: t["brand-primary"], flex: 1 },
7380
- eccentric: { label: "Ecc", color: t["status-warning"], flex: 3 }
7655
+ concentric: { label: "Con", color: t2["status-success"], flex: 2 },
7656
+ hold: { label: "Hold", color: t2["brand-primary"], flex: 1 },
7657
+ eccentric: { label: "Ecc", color: t2["status-warning"], flex: 3 }
7381
7658
  };
7382
7659
  function TempoBar({
7383
7660
  activePhase,
@@ -7390,7 +7667,7 @@ function TempoBar({
7390
7667
  return /* @__PURE__ */ jsxs(reactNative.View, { className, testID: "tempo-bar", ...props, children: [
7391
7668
  /* @__PURE__ */ jsx(reactNative.View, { style: { flexDirection: "row", marginBottom: 4 }, children: PHASE_ORDER.map((phase) => {
7392
7669
  const config = PHASE_CONFIG[phase];
7393
- return /* @__PURE__ */ jsx(reactNative.View, { style: { flex: config.flex, alignItems: "center" }, children: /* @__PURE__ */ jsx(reactNative.Text, { style: { fontSize: 10, color: t["text-disabled"] }, children: config.label }) }, phase);
7670
+ return /* @__PURE__ */ jsx(reactNative.View, { style: { flex: config.flex, alignItems: "center" }, children: /* @__PURE__ */ jsx(reactNative.Text, { style: { fontSize: 10, color: t2["text-disabled"] }, children: config.label }) }, phase);
7394
7671
  }) }),
7395
7672
  /* @__PURE__ */ jsx(reactNative.View, { style: { flexDirection: "row", gap: 2, height: 20 }, children: PHASE_ORDER.map((phase) => {
7396
7673
  const config = PHASE_CONFIG[phase];
@@ -7427,7 +7704,7 @@ function ActiveSegment({
7427
7704
  targetMs
7428
7705
  }) {
7429
7706
  const pacing = getTempoPacingState(phaseElapsedMs, targetMs);
7430
- const barColor = pacing === "behind" ? t["status-error"] : config.color;
7707
+ const barColor = pacing === "behind" ? t2["status-error"] : config.color;
7431
7708
  const fillPct = getTempoFillPct(phaseElapsedMs, targetMs);
7432
7709
  const label = targetMs ? `${formatDuration(phaseElapsedMs)} / ${formatDuration(targetMs)}` : formatDuration(phaseElapsedMs);
7433
7710
  return /* @__PURE__ */ jsxs(reactNative.View, { style: { height: "100%", position: "relative" }, testID: `tempo-segment-active-${config.label}`, children: [
@@ -7491,15 +7768,14 @@ function formatDuration(ms) {
7491
7768
  }
7492
7769
 
7493
7770
  // src/components/custom/Workout/TempoDisplay.tsx
7771
+ var t3 = getSemanticColors("dark");
7494
7772
  var INTER = "Inter, sans-serif";
7495
7773
  var TEXT_TERTIARY = "#6B7280";
7496
- var STATUS_ERROR = "#D14343";
7774
+ var STATUS_ERROR = t3["status-error"];
7497
7775
  var phaseColors = {
7498
- eccentric: "#FFB020",
7499
- // status-warning (amber)
7776
+ eccentric: t3["status-warning"],
7500
7777
  pauseBottom: TEXT_TERTIARY,
7501
- concentric: "#14B8A6",
7502
- // status-success (teal)
7778
+ concentric: t3["status-success"],
7503
7779
  pauseTop: TEXT_TERTIARY,
7504
7780
  dash: TEXT_TERTIARY
7505
7781
  };
@@ -7764,12 +8040,13 @@ function TempoDisplay({
7764
8040
  }
7765
8041
  );
7766
8042
  }
8043
+ var t4 = getSemanticColors("dark");
7767
8044
  function getDotColor(deviation) {
7768
8045
  const abs = Math.abs(deviation);
7769
- if (deviation < -0.3) return "#14B8A6";
8046
+ if (deviation < -0.3) return t4["status-success"];
7770
8047
  if (abs <= 0.3) return "#6B7280";
7771
- if (abs <= 0.7) return "#FFB020";
7772
- return "#D14343";
8048
+ if (abs <= 0.7) return t4["status-warning"];
8049
+ return t4["status-error"];
7773
8050
  }
7774
8051
  function getDeviationDescription(deviation) {
7775
8052
  if (deviation < -0.3) return "lighter than planned";
@@ -7811,7 +8088,7 @@ function DeviationBar({
7811
8088
  width: resolvedWidth,
7812
8089
  borderRadius: 3,
7813
8090
  // react-native-web renders backgroundImage at runtime; not in RN ViewStyle types
7814
- backgroundImage: "linear-gradient(90deg, rgba(20,184,166,0.25) 0%, rgba(107,114,128,0.15) 50%, rgba(255,176,32,0.25) 100%)"
8091
+ backgroundImage: "linear-gradient(90deg, rgba(46,213,115,0.25) 0%, rgba(107,114,128,0.15) 50%, rgba(249,180,21,0.25) 100%)"
7815
8092
  }
7816
8093
  }
7817
8094
  ),
@@ -7837,23 +8114,24 @@ function DeviationBar({
7837
8114
  }
7838
8115
  );
7839
8116
  }
8117
+ var t5 = getSemanticColors("dark");
7840
8118
  var TRACK_BG = "#333333";
7841
8119
  var LABEL_COLOR = "#6B7280";
7842
8120
  var TARGET_LINE_COLOR = "rgba(33, 150, 243, 0.5)";
7843
8121
  var AT_TARGET_GLOW = "0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)";
7844
8122
  var ZONE = {
7845
- building: "#14B8A6",
7846
- // teal — below target ramp-up
7847
- approaching: "#FFB020",
7848
- // amber — nearing target
7849
- target: "#FF7900",
7850
- // brand — exactly at target
7851
- over1: "#D14343",
7852
- // red — mild over-target
7853
- over2: "#A62626",
7854
- // deep red — moderate over-target
7855
- over3: "#7A1C1C"
7856
- // darkest red — severe over-target
8123
+ building: t5["status-success"],
8124
+ // below target ramp-up
8125
+ approaching: t5["status-warning"],
8126
+ // nearing target
8127
+ target: t5["brand-primary"],
8128
+ // exactly at target
8129
+ over1: t5["status-error"],
8130
+ // mild over-target
8131
+ over2: WORKOUT_TOKENS.intensity.over2,
8132
+ // moderate over-target
8133
+ over3: WORKOUT_TOKENS.intensity.over3
8134
+ // severe over-target
7857
8135
  };
7858
8136
  var BULGE_SIZE = { 1: 8, 2: 10, 3: 11 };
7859
8137
  function zoneForPct(pct) {
@@ -8009,29 +8287,38 @@ function IntensityBar({
8009
8287
  }
8010
8288
  );
8011
8289
  }
8290
+
8291
+ // src/theme/extracted-colors-dataviz.ts
8292
+ var DATAVIZ_CATEGORICAL_PALETTE = categoricalPalette.default;
8293
+ var MESO_ACCENT_GRADIENT_DARK = primitiveRamps.orange[500];
8294
+ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
8295
+ var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
8296
+
8297
+ // src/components/custom/Workout/WorkoutPill.tsx
8298
+ var t6 = getSemanticColors("dark");
8012
8299
  var statusBgColors = {
8013
- completed: "rgba(20,184,166,0.15)",
8300
+ completed: "rgba(46,213,115,0.15)",
8014
8301
  current: "rgba(255,121,0,0.15)",
8015
8302
  next: "transparent",
8016
8303
  upcoming: "#1C1C1C",
8017
8304
  missed: "rgba(209,67,67,0.1)",
8018
- deload: "rgba(147,51,234,0.15)"
8305
+ deload: "rgba(186,41,150,0.15)"
8019
8306
  };
8020
8307
  var statusBorderStyles = {
8021
- completed: { borderWidth: 1, borderColor: "rgba(20,184,166,0.3)" },
8308
+ completed: { borderWidth: 1, borderColor: "rgba(46,213,115,0.3)" },
8022
8309
  current: { borderWidth: 1, borderColor: "rgba(255,121,0,0.3)" },
8023
8310
  next: { borderWidth: 1, borderColor: "rgba(255,121,0,0.4)" },
8024
8311
  upcoming: { borderWidth: 1, borderColor: "#1F1F1F" },
8025
8312
  missed: { borderWidth: 1, borderColor: "rgba(209,67,67,0.25)" },
8026
- deload: { borderWidth: 1, borderColor: "rgba(147,51,234,0.3)" }
8313
+ deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
8027
8314
  };
8028
8315
  var textColors = {
8029
- completed: "#14B8A6",
8030
- current: "#FF7900",
8031
- next: "#FF7900",
8316
+ completed: t6["status-success"],
8317
+ current: t6["brand-primary"],
8318
+ next: t6["brand-primary"],
8032
8319
  upcoming: "#6B7280",
8033
8320
  missed: "rgba(209,67,67,0.7)",
8034
- deload: "#9333ea"
8321
+ deload: WORKOUT_PILL_DELOAD
8035
8322
  };
8036
8323
  function usePulse(enabled) {
8037
8324
  const [opacity] = React24.useState(() => new reactNative.Animated.Value(1));
@@ -8506,12 +8793,13 @@ function VelocityStrip({
8506
8793
  }
8507
8794
  return stripContent;
8508
8795
  }
8796
+ var t7 = getSemanticColors("dark");
8509
8797
  var dotColorMap = {
8510
8798
  untrained: "#2C2C2C",
8511
- behind: "#406D87",
8512
- ontrack: "#14B8A6",
8513
- target: "#FF7900",
8514
- over: "#D14343"
8799
+ behind: t7["brand-secondary"],
8800
+ ontrack: t7["status-success"],
8801
+ target: t7["brand-primary"],
8802
+ over: t7["status-error"]
8515
8803
  };
8516
8804
  function MuscleGroupChip({
8517
8805
  name,
@@ -8583,7 +8871,7 @@ function MuscleGroupChip({
8583
8871
  }
8584
8872
  return content;
8585
8873
  }
8586
- var BRAND_PRIMARY = "#FF7900";
8874
+ var BRAND_PRIMARY2 = getSemanticColors("dark")["brand-primary"];
8587
8875
  function normalizeData(data, height) {
8588
8876
  if (data.length === 0) return [];
8589
8877
  const min = Math.min(...data);
@@ -8620,7 +8908,7 @@ function Sparkline({
8620
8908
  }
8621
8909
  );
8622
8910
  }
8623
- const resolvedColor = color ?? BRAND_PRIMARY;
8911
+ const resolvedColor = color ?? BRAND_PRIMARY2;
8624
8912
  const normalized = normalizeData(data, height);
8625
8913
  const stepX = data.length > 1 ? width / (data.length - 1) : 0;
8626
8914
  const dotSize = 3;
@@ -8799,7 +9087,7 @@ function SetRow({
8799
9087
  fontSize: 10,
8800
9088
  fontWeight: "700",
8801
9089
  fontFamily: "Inter, sans-serif",
8802
- color: "#ffa502",
9090
+ color: WORKOUT_TOKENS.scale.orange,
8803
9091
  backgroundColor: "rgba(255,165,2,0.12)",
8804
9092
  paddingVertical: 1,
8805
9093
  paddingHorizontal: 5,
@@ -8965,7 +9253,7 @@ function SetRow({
8965
9253
  }
8966
9254
  );
8967
9255
  }
8968
- var BRAND_PRIMARY2 = "#FF7900";
9256
+ var BRAND_PRIMARY3 = getSemanticColors("dark")["brand-primary"];
8969
9257
  var INPUT_CLASSNAME = "bg-surface-raised border-border-strong text-text-primary";
8970
9258
  var inputStyle = {
8971
9259
  fontSize: 14,
@@ -9094,7 +9382,7 @@ function InputBar({
9094
9382
  onPress: onRecord,
9095
9383
  disabled: !canRecord,
9096
9384
  style: ({ pressed }) => ({
9097
- backgroundColor: BRAND_PRIMARY2,
9385
+ backgroundColor: BRAND_PRIMARY3,
9098
9386
  borderRadius: 8,
9099
9387
  paddingVertical: 10,
9100
9388
  paddingHorizontal: 16,
@@ -9121,7 +9409,7 @@ function InputBar({
9121
9409
  }
9122
9410
  );
9123
9411
  }
9124
- var BRAND_PRIMARY3 = "#FF7900";
9412
+ var BRAND_PRIMARY4 = getSemanticColors("dark")["brand-primary"];
9125
9413
  function RestTimer({
9126
9414
  totalSeconds,
9127
9415
  elapsedMs,
@@ -9227,7 +9515,7 @@ function RestTimer({
9227
9515
  {
9228
9516
  style: {
9229
9517
  height: "100%",
9230
- backgroundColor: BRAND_PRIMARY3,
9518
+ backgroundColor: BRAND_PRIMARY4,
9231
9519
  borderRadius: 2,
9232
9520
  width: `${progressPct}%`
9233
9521
  },
@@ -9284,7 +9572,7 @@ function RestTimer({
9284
9572
  fontSize: 11,
9285
9573
  fontFamily: "Inter, sans-serif",
9286
9574
  fontWeight: "600",
9287
- color: BRAND_PRIMARY3
9575
+ color: BRAND_PRIMARY4
9288
9576
  },
9289
9577
  children: "Skip"
9290
9578
  }
@@ -9677,7 +9965,7 @@ function ExerciseCard(props) {
9677
9965
  }
9678
9966
  var DEFAULTS = {
9679
9967
  label: "SS",
9680
- color: "#FF7900",
9968
+ color: getSemanticColors("dark")["brand-primary"],
9681
9969
  bgBase: "#101010"
9682
9970
  };
9683
9971
  function SupersetWrapper({
@@ -9728,9 +10016,9 @@ function SupersetWrapper({
9728
10016
  }
9729
10017
  );
9730
10018
  }
9731
- var BRAND_PRIMARY4 = "#FF7900";
10019
+ var BRAND_PRIMARY5 = getSemanticColors("dark")["brand-primary"];
9732
10020
  var segmentBgColors = {
9733
- completed: "rgba(20,184,166,0.3)",
10021
+ completed: "rgba(46,213,115,0.3)",
9734
10022
  current: "rgba(255,121,0,0.5)",
9735
10023
  upcoming: "rgba(255,255,255,0.06)"
9736
10024
  };
@@ -9780,7 +10068,7 @@ function MesoSegment({ meso, isActive, onPress }) {
9780
10068
  },
9781
10069
  isActive ? {
9782
10070
  borderWidth: 2,
9783
- borderColor: BRAND_PRIMARY4,
10071
+ borderColor: BRAND_PRIMARY5,
9784
10072
  transform: [{ scale: 1.02 }, { scale: pressScale }]
9785
10073
  } : void 0
9786
10074
  ],
@@ -9794,7 +10082,7 @@ function MesoSegment({ meso, isActive, onPress }) {
9794
10082
  top: 0,
9795
10083
  bottom: 0,
9796
10084
  width: `${progress * 100}%`,
9797
- backgroundColor: BRAND_PRIMARY4
10085
+ backgroundColor: BRAND_PRIMARY5
9798
10086
  },
9799
10087
  testID: `meso-segment-fill-${meso.id}`
9800
10088
  }
@@ -9835,7 +10123,7 @@ function MesoProgressBar({
9835
10123
  }
9836
10124
  );
9837
10125
  }
9838
- var BRAND_PRIMARY5 = "#FF7900";
10126
+ var BRAND_PRIMARY6 = getSemanticColors("dark")["brand-primary"];
9839
10127
  function WeekRow({
9840
10128
  weekNumber,
9841
10129
  totalWeeks,
@@ -9855,12 +10143,12 @@ function WeekRow({
9855
10143
  gap: 12
9856
10144
  };
9857
10145
  if (isDeload) {
9858
- rowStyle.backgroundColor = "rgba(147,51,234,0.06)";
10146
+ rowStyle.backgroundColor = "rgba(186,41,150,0.06)";
9859
10147
  }
9860
10148
  if (isCurrent) {
9861
10149
  rowStyle.backgroundColor = "rgba(255,121,0,0.04)";
9862
10150
  rowStyle.borderLeftWidth = 2;
9863
- rowStyle.borderLeftColor = BRAND_PRIMARY5;
10151
+ rowStyle.borderLeftColor = BRAND_PRIMARY6;
9864
10152
  }
9865
10153
  return /* @__PURE__ */ jsxs(
9866
10154
  reactNative.View,
@@ -9884,7 +10172,7 @@ function WeekRow({
9884
10172
  width: 6,
9885
10173
  height: 6,
9886
10174
  borderRadius: 3,
9887
- backgroundColor: BRAND_PRIMARY5
10175
+ backgroundColor: BRAND_PRIMARY6
9888
10176
  },
9889
10177
  accessibilityElementsHidden: true,
9890
10178
  testID: "week-row-current-dot"
@@ -9898,7 +10186,7 @@ function WeekRow({
9898
10186
  fontSize: 13,
9899
10187
  fontWeight: "700",
9900
10188
  fontFamily: "Inter, sans-serif",
9901
- color: isCurrent ? BRAND_PRIMARY5 : void 0
10189
+ color: isCurrent ? BRAND_PRIMARY6 : void 0
9902
10190
  },
9903
10191
  accessibilityElementsHidden: true,
9904
10192
  children: `W${weekNumber}`
@@ -9937,9 +10225,10 @@ function WeekRow({
9937
10225
  }
9938
10226
  );
9939
10227
  }
10228
+ var t8 = getSemanticColors("dark");
9940
10229
  var COLORS = {
9941
- statusSuccess: "#14B8A6",
9942
- brandPrimary: "#FF7900",
10230
+ statusSuccess: t8["status-success"],
10231
+ brandPrimary: t8["brand-primary"],
9943
10232
  borderDefault: "#1F1F1F",
9944
10233
  brandPrimarySubtle: "rgba(255,121,0,0.06)"
9945
10234
  };
@@ -10081,11 +10370,11 @@ function WorkoutCard({
10081
10370
  }
10082
10371
  );
10083
10372
  }
10084
- var BRAND_PRIMARY6 = "#FF7900";
10085
- var BRAND_PRIMARY_DARK = "#C45E00";
10086
- var BRAND_PRIMARY_LIGHT = "#FFB066";
10373
+ var BRAND_PRIMARY7 = getSemanticColors("dark")["brand-primary"];
10374
+ var BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK;
10375
+ var BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT;
10087
10376
  var BORDER_DEFAULT = "#1F1F1F";
10088
- var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY6, BRAND_PRIMARY_LIGHT];
10377
+ var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY7, BRAND_PRIMARY_LIGHT];
10089
10378
  function heatmapColor(percentage) {
10090
10379
  const clamped = Math.max(0, Math.min(100, percentage));
10091
10380
  const opacity = 0.12 + clamped / 100 * 0.78;
@@ -10120,7 +10409,7 @@ function MesoCard({
10120
10409
  }, [highlighted, highlight]);
10121
10410
  const borderColor = highlight.interpolate({
10122
10411
  inputRange: [0, 1],
10123
- outputRange: [BORDER_DEFAULT, BRAND_PRIMARY6]
10412
+ outputRange: [BORDER_DEFAULT, BRAND_PRIMARY7]
10124
10413
  });
10125
10414
  const header = /* @__PURE__ */ jsxs(reactNative.View, { style: { paddingHorizontal: 14, paddingTop: 12, paddingBottom: 10 }, testID: "meso-card-body", children: [
10126
10415
  /* @__PURE__ */ jsxs(reactNative.View, { className: "flex-row items-center", style: { gap: 8 }, testID: "meso-card-header", children: [
@@ -10180,7 +10469,7 @@ function MesoCard({
10180
10469
  {
10181
10470
  variant: "outline",
10182
10471
  elevation: 2,
10183
- borderColor: highlighted ? BRAND_PRIMARY6 : BORDER_DEFAULT,
10472
+ borderColor: highlighted ? BRAND_PRIMARY7 : BORDER_DEFAULT,
10184
10473
  className,
10185
10474
  style: [
10186
10475
  { borderColor },
@@ -10237,9 +10526,9 @@ function MesoCard({
10237
10526
  }
10238
10527
  ) });
10239
10528
  }
10240
- var BRAND_PRIMARY7 = "#FF7900";
10241
- var RECENT_BORDER = "rgba(255,176,32,0.3)";
10242
- var RECENT_GLOW = "0 0 12px rgba(255,176,32,0.06)";
10529
+ var BRAND_PRIMARY8 = getSemanticColors("dark")["brand-primary"];
10530
+ var RECENT_BORDER = "rgba(249,180,21,0.3)";
10531
+ var RECENT_GLOW = "0 0 12px rgba(249,180,21,0.06)";
10243
10532
  var BORDER_DEFAULT2 = resolveColor("border-default");
10244
10533
  var TYPE_LABELS = {
10245
10534
  e1rm: "e1RM",
@@ -10279,7 +10568,7 @@ function PrRecordRow({ record, index }) {
10279
10568
  },
10280
10569
  testID: `pr-history-modal-record-${index}`,
10281
10570
  children: [
10282
- /* @__PURE__ */ jsx(StarIcon, { size: 16, color: BRAND_PRIMARY7, fill: BRAND_PRIMARY7, strokeWidth: 2 }),
10571
+ /* @__PURE__ */ jsx(StarIcon, { size: 16, color: BRAND_PRIMARY8, fill: BRAND_PRIMARY8, strokeWidth: 2 }),
10283
10572
  /* @__PURE__ */ jsx(
10284
10573
  reactNative.Text,
10285
10574
  {
@@ -10423,11 +10712,12 @@ function PrHistoryModal({
10423
10712
  }
10424
10713
  );
10425
10714
  }
10426
- var BRAND_PRIMARY8 = "#FF7900";
10715
+ var t9 = getSemanticColors("dark");
10716
+ var BRAND_PRIMARY9 = t9["brand-primary"];
10427
10717
  var BRAND_PRIMARY_SUBTLE = "rgba(255,121,0,0.12)";
10428
- var STATUS_SUCCESS = "#14B8A6";
10429
- var STATUS_WARNING = "#FFB020";
10430
- var STATUS_ERROR2 = "#D14343";
10718
+ var STATUS_SUCCESS = t9["status-success"];
10719
+ var STATUS_WARNING = t9["status-warning"];
10720
+ var STATUS_ERROR2 = t9["status-error"];
10431
10721
  var EMOJI_SETS = {
10432
10722
  sleep: ["\u{1F634}", "\u{1F610}", "\u{1F642}", "\u{1F60A}", "\u{1F929}"],
10433
10723
  soreness: ["\u{1F635}", "\u{1F623}", "\u{1F610}", "\u{1F642}", "\u{1F4AA}"],
@@ -10491,7 +10781,7 @@ function EmojiSlider({ factor }) {
10491
10781
  paddingVertical: 8,
10492
10782
  borderRadius: 8,
10493
10783
  borderWidth: 1,
10494
- borderColor: selected ? BRAND_PRIMARY8 : void 0,
10784
+ borderColor: selected ? BRAND_PRIMARY9 : void 0,
10495
10785
  backgroundColor: selected ? BRAND_PRIMARY_SUBTLE : void 0,
10496
10786
  opacity: selected ? 1 : pressed ? 0.8 : 0.55,
10497
10787
  transform: [{ scale: selected ? 1.06 : 1 }]
@@ -10607,7 +10897,7 @@ function ReadinessCheck({
10607
10897
  marginTop: 16,
10608
10898
  width: "100%",
10609
10899
  alignItems: "center",
10610
- backgroundColor: BRAND_PRIMARY8,
10900
+ backgroundColor: BRAND_PRIMARY9,
10611
10901
  borderRadius: 8,
10612
10902
  paddingVertical: 12,
10613
10903
  opacity: pressed ? 0.8 : 1
@@ -10617,18 +10907,19 @@ function ReadinessCheck({
10617
10907
  )
10618
10908
  ] }) });
10619
10909
  }
10620
- var BRAND_PRIMARY9 = "#FF7900";
10621
- var BRAND_PRIMARY_DARK2 = "#C45E00";
10622
- var BRAND_PRIMARY_LIGHT2 = "#FFB066";
10623
- var SUCCESS = "#14B8A6";
10624
- var WARNING = "#FFB020";
10625
- var ERROR = "#D14343";
10626
- var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY9, BRAND_PRIMARY_LIGHT2];
10910
+ var t10 = getSemanticColors("dark");
10911
+ var BRAND_PRIMARY10 = t10["brand-primary"];
10912
+ var BRAND_PRIMARY_DARK2 = MESO_ACCENT_GRADIENT_DARK;
10913
+ var BRAND_PRIMARY_LIGHT2 = MESO_ACCENT_GRADIENT_LIGHT;
10914
+ var SUCCESS = t10["status-success"];
10915
+ var WARNING = t10["status-warning"];
10916
+ var ERROR = t10["status-error"];
10917
+ var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY10, BRAND_PRIMARY_LIGHT2];
10627
10918
  var CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor("surface-elevated")} 0%, ${resolveColor("surface-raised")} 100%)`;
10628
- 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%)";
10919
+ 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%)";
10629
10920
  var STATUS_VARIANTS = {
10630
- success: { bg: "rgba(20,184,166,0.15)", border: "rgba(20,184,166,0.3)", text: SUCCESS },
10631
- warning: { bg: "rgba(255,176,32,0.15)", border: "rgba(255,176,32,0.3)", text: WARNING },
10921
+ success: { bg: "rgba(46,213,115,0.15)", border: "rgba(46,213,115,0.3)", text: SUCCESS },
10922
+ warning: { bg: "rgba(249,180,21,0.15)", border: "rgba(249,180,21,0.3)", text: WARNING },
10632
10923
  error: { bg: "rgba(209,67,67,0.15)", border: "rgba(209,67,67,0.25)", text: ERROR }
10633
10924
  };
10634
10925
  function clamp01(value) {
@@ -10920,9 +11211,9 @@ function MesoStatusCard({
10920
11211
  reactNative.View,
10921
11212
  {
10922
11213
  style: {
10923
- backgroundColor: "rgba(255,176,32,0.06)",
11214
+ backgroundColor: "rgba(249,180,21,0.06)",
10924
11215
  borderWidth: 1,
10925
- borderColor: "rgba(255,176,32,0.15)",
11216
+ borderColor: "rgba(249,180,21,0.15)",
10926
11217
  borderRadius: 8,
10927
11218
  paddingVertical: 10,
10928
11219
  paddingHorizontal: 12
@@ -10948,9 +11239,9 @@ function MesoStatusCard({
10948
11239
  className: "flex-row items-center",
10949
11240
  style: {
10950
11241
  gap: 8,
10951
- backgroundColor: "rgba(20,184,166,0.06)",
11242
+ backgroundColor: "rgba(46,213,115,0.06)",
10952
11243
  borderWidth: 1,
10953
- borderColor: "rgba(20,184,166,0.2)",
11244
+ borderColor: "rgba(46,213,115,0.2)",
10954
11245
  borderRadius: 8,
10955
11246
  paddingVertical: 10,
10956
11247
  paddingHorizontal: 12
@@ -10979,21 +11270,22 @@ function MesoStatusCard({
10979
11270
  }
10980
11271
  );
10981
11272
  }
10982
- var BRAND_PRIMARY10 = "#FF7900";
11273
+ var sem = getSemanticColors("dark");
11274
+ var BRAND_PRIMARY11 = sem["brand-primary"];
10983
11275
  var PROJECTION_LINE_COLOR = resolveColor("text-tertiary");
10984
- var STATUS_SUCCESS2 = "#14B8A6";
10985
- var STATUS_ERROR3 = "#D14343";
10986
- var STATUS_WARNING2 = "#FFB020";
11276
+ var STATUS_SUCCESS2 = sem["status-success"];
11277
+ var STATUS_ERROR3 = sem["status-error"];
11278
+ var STATUS_WARNING2 = sem["status-warning"];
10987
11279
  var GRID_LINE = "rgba(255,255,255,0.06)";
10988
- var SUCCESS_PILL_BG = "rgba(20,184,166,0.10)";
10989
- var SUCCESS_PILL_BORDER = "rgba(20,184,166,0.20)";
11280
+ var SUCCESS_PILL_BG = "rgba(46,213,115,0.10)";
11281
+ var SUCCESS_PILL_BORDER = "rgba(46,213,115,0.20)";
10990
11282
  var ERROR_PILL_BG = "rgba(209,67,67,0.10)";
10991
11283
  var ERROR_PILL_BORDER = "rgba(209,67,67,0.20)";
10992
11284
  var PLOT_LEFT = 26;
10993
11285
  var TOOLTIP_WIDTH = 124;
10994
11286
  function timeOf(dateStr) {
10995
- const t2 = Date.parse(dateStr);
10996
- return Number.isNaN(t2) ? 0 : t2;
11287
+ const t12 = Date.parse(dateStr);
11288
+ return Number.isNaN(t12) ? 0 : t12;
10997
11289
  }
10998
11290
  function formatValue(value) {
10999
11291
  return `${Math.round(value)}`;
@@ -11270,7 +11562,7 @@ function StrengthTrendChart({
11270
11562
  ChartLine,
11271
11563
  {
11272
11564
  coords: geometry.actual,
11273
- color: BRAND_PRIMARY10,
11565
+ color: BRAND_PRIMARY11,
11274
11566
  strokeWidth: 2.5,
11275
11567
  testID: "strength-trend-chart-actual-segment"
11276
11568
  }
@@ -11323,7 +11615,7 @@ function StrengthTrendChart({
11323
11615
  width: 8,
11324
11616
  height: 8,
11325
11617
  borderRadius: 1,
11326
- backgroundColor: BRAND_PRIMARY10
11618
+ backgroundColor: BRAND_PRIMARY11
11327
11619
  }
11328
11620
  },
11329
11621
  `point-${c.index}`
@@ -11453,7 +11745,7 @@ function StrengthTrendChart({
11453
11745
  testID: "strength-trend-chart-legend",
11454
11746
  children: [
11455
11747
  /* @__PURE__ */ jsxs(reactNative.View, { className: "flex-row items-center", style: { gap: 5 }, children: [
11456
- /* @__PURE__ */ jsx(reactNative.View, { style: { width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY10 } }),
11748
+ /* @__PURE__ */ jsx(reactNative.View, { style: { width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY11 } }),
11457
11749
  /* @__PURE__ */ jsx(reactNative.Text, { className: "text-text-secondary", style: { fontSize: 10, fontFamily: "Inter, sans-serif" }, children: "Actual" })
11458
11750
  ] }),
11459
11751
  /* @__PURE__ */ jsxs(reactNative.View, { className: "flex-row items-center", style: { gap: 5 }, children: [
@@ -11482,13 +11774,14 @@ function StrengthTrendChart({
11482
11774
  }
11483
11775
  );
11484
11776
  }
11485
- var STATUS_SUCCESS3 = "#14B8A6";
11486
- var STATUS_WARNING3 = "#FFB020";
11487
- var STATUS_INFO = "#2196F3";
11777
+ var t11 = getSemanticColors("dark");
11778
+ var STATUS_SUCCESS3 = t11["status-success"];
11779
+ var STATUS_WARNING3 = t11["status-warning"];
11780
+ var STATUS_INFO = t11["status-info"];
11488
11781
  var DOT_BORDER = "#F3F4F6";
11489
- var BAND_FILL = "rgba(20,184,166,0.1)";
11490
- var BAND_EDGE = "rgba(20,184,166,0.45)";
11491
- var PROJECTION_FILL = "rgba(20,184,166,0.05)";
11782
+ var BAND_FILL = "rgba(46,213,115,0.1)";
11783
+ var BAND_EDGE = "rgba(46,213,115,0.45)";
11784
+ var PROJECTION_FILL = "rgba(46,213,115,0.05)";
11492
11785
  var PADDING_LEFT = 28;
11493
11786
  var PADDING_RIGHT = 10;
11494
11787
  var PADDING_TOP = 8;
@@ -11527,8 +11820,8 @@ function interpEdge(pixels, x, key) {
11527
11820
  const a = pixels[i];
11528
11821
  const b = pixels[i + 1];
11529
11822
  if (x >= a.x && x <= b.x) {
11530
- const t2 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
11531
- return a[key] + t2 * (b[key] - a[key]);
11823
+ const t12 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
11824
+ return a[key] + t12 * (b[key] - a[key]);
11532
11825
  }
11533
11826
  }
11534
11827
  return pixels[pixels.length - 1][key];
@@ -11858,16 +12151,7 @@ function CapacityBandChart({
11858
12151
  }
11859
12152
  );
11860
12153
  }
11861
- var PALETTE = [
11862
- "#5B9BD5",
11863
- "#14B8A6",
11864
- "#F4A736",
11865
- "#F83030",
11866
- "#823CA0",
11867
- "#D4A520",
11868
- "#406D87",
11869
- "#43C6B7"
11870
- ];
12154
+ var PALETTE = DATAVIZ_CATEGORICAL_PALETTE;
11871
12155
  function scaleValue(v, scale) {
11872
12156
  if (v <= 0) return 0;
11873
12157
  if (scale === "sqrt") return Math.sqrt(v);
@@ -11983,16 +12267,7 @@ function Treemap({
11983
12267
  );
11984
12268
  }) });
11985
12269
  }
11986
- var PALETTE2 = [
11987
- "#5B9BD5",
11988
- "#14B8A6",
11989
- "#F4A736",
11990
- "#F83030",
11991
- "#823CA0",
11992
- "#D4A520",
11993
- "#406D87",
11994
- "#43C6B7"
11995
- ];
12270
+ var PALETTE2 = DATAVIZ_CATEGORICAL_PALETTE;
11996
12271
  var GRID_LINE2 = "rgba(255,255,255,0.07)";
11997
12272
  var AXIS_LINE = "rgba(255,255,255,0.18)";
11998
12273
  var DIAGONAL_LINE = "rgba(255,255,255,0.28)";
@@ -12082,28 +12357,28 @@ function Scatter({
12082
12357
  testID: "scatter-canvas",
12083
12358
  style: { position: "absolute", top: 0, left: 0, width, height, overflow: "hidden" },
12084
12359
  children: [
12085
- ticksOf(yd, TICK_COUNT).map((t2, i) => {
12086
- const y = toY(t2);
12360
+ ticksOf(yd, TICK_COUNT).map((t12, i) => {
12361
+ const y = toY(t12);
12087
12362
  return /* @__PURE__ */ jsx(
12088
12363
  reactNative.View,
12089
12364
  {
12090
12365
  accessibilityElementsHidden: true,
12091
12366
  testID: "scatter-gridline-y",
12092
12367
  style: { position: "absolute", left: PLOT_LEFT2, width: innerW, top: y, height: 1, backgroundColor: GRID_LINE2 },
12093
- children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", left: -PLOT_LEFT2, top: -6, width: PLOT_LEFT2 - 6, textAlign: "right" }, children: formatTick(t2) })
12368
+ children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", left: -PLOT_LEFT2, top: -6, width: PLOT_LEFT2 - 6, textAlign: "right" }, children: formatTick(t12) })
12094
12369
  },
12095
12370
  `y-${i}`
12096
12371
  );
12097
12372
  }),
12098
- ticksOf(xd, TICK_COUNT).map((t2, i) => {
12099
- const x = toX(t2);
12373
+ ticksOf(xd, TICK_COUNT).map((t12, i) => {
12374
+ const x = toX(t12);
12100
12375
  return /* @__PURE__ */ jsx(
12101
12376
  reactNative.View,
12102
12377
  {
12103
12378
  accessibilityElementsHidden: true,
12104
12379
  testID: "scatter-gridline-x",
12105
12380
  style: { position: "absolute", top: PLOT_TOP, height: innerH, left: x, width: 1, backgroundColor: GRID_LINE2 },
12106
- children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t2) })
12381
+ children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t12) })
12107
12382
  },
12108
12383
  `x-${i}`
12109
12384
  );
@@ -12163,9 +12438,10 @@ function Scatter({
12163
12438
  }) })
12164
12439
  ] });
12165
12440
  }
12166
- var STATUS_SUCCESS4 = "#14B8A6";
12167
- var STATUS_WARNING4 = "#FFB020";
12168
- var STATUS_ERROR4 = "#D14343";
12441
+ var sem2 = getSemanticColors("dark");
12442
+ var STATUS_SUCCESS4 = sem2["status-success"];
12443
+ var STATUS_WARNING4 = sem2["status-warning"];
12444
+ var STATUS_ERROR4 = sem2["status-error"];
12169
12445
  var TRACK = "rgba(255,255,255,0.08)";
12170
12446
  var DEFAULT_THRESHOLDS = [
12171
12447
  { value: 0, color: STATUS_ERROR4 },
@@ -12237,23 +12513,23 @@ function Gauge2({
12237
12513
  testID: "gauge",
12238
12514
  ...props,
12239
12515
  children: [
12240
- ticks.map((t2) => /* @__PURE__ */ jsx(
12516
+ ticks.map((t12) => /* @__PURE__ */ jsx(
12241
12517
  reactNative.View,
12242
12518
  {
12243
12519
  accessibilityElementsHidden: true,
12244
12520
  testID: "gauge-segment",
12245
12521
  style: {
12246
12522
  position: "absolute",
12247
- left: t2.left - tickThickness / 2,
12248
- top: t2.top - tickLength / 2,
12523
+ left: t12.left - tickThickness / 2,
12524
+ top: t12.top - tickLength / 2,
12249
12525
  width: tickThickness,
12250
12526
  height: tickLength,
12251
12527
  borderRadius: tickThickness / 2,
12252
- backgroundColor: t2.color,
12253
- transform: [{ rotate: t2.rotate }]
12528
+ backgroundColor: t12.color,
12529
+ transform: [{ rotate: t12.rotate }]
12254
12530
  }
12255
12531
  },
12256
- t2.key
12532
+ t12.key
12257
12533
  )),
12258
12534
  /* @__PURE__ */ jsxs(reactNative.View, { style: { position: "absolute", top: 0, left: 0, width: size, height: size }, className: "items-center justify-center", children: [
12259
12535
  /* @__PURE__ */ jsxs(reactNative.View, { className: "flex-row items-baseline gap-0.5", children: [
@@ -12266,6 +12542,203 @@ function Gauge2({
12266
12542
  }
12267
12543
  );
12268
12544
  }
12545
+ function BrandLockup({
12546
+ subtitle = "wall dashboard",
12547
+ showSubtitle = true,
12548
+ className,
12549
+ ...props
12550
+ }) {
12551
+ return /* @__PURE__ */ jsxs(reactNative.View, { className: cn("flex-row items-center gap-[7px]", className), ...props, children: [
12552
+ /* @__PURE__ */ jsx(reactNative.View, { className: "text-brand-primary", children: /* @__PURE__ */ jsx(VoltrasMark, { size: 14, color: "currentColor" }) }),
12553
+ /* @__PURE__ */ jsx(
12554
+ Typography,
12555
+ {
12556
+ variant: "button",
12557
+ color: "primary",
12558
+ className: "text-[12px] font-extrabold tracking-[1.5px]",
12559
+ children: "VOLTRAS"
12560
+ }
12561
+ ),
12562
+ showSubtitle && subtitle ? /* @__PURE__ */ jsxs(
12563
+ Typography,
12564
+ {
12565
+ variant: "button",
12566
+ color: "tertiary",
12567
+ className: "text-[10px] font-semibold tracking-[0.4px]",
12568
+ children: [
12569
+ "/ ",
12570
+ subtitle
12571
+ ]
12572
+ }
12573
+ ) : null
12574
+ ] });
12575
+ }
12576
+ var stateConfig = {
12577
+ // live = vivid green with an expanding ring; rest = solid amber (no pulse — operator); idle is dim.
12578
+ live: { label: "LIVE", color: "success", pulse: "ping", textColor: "primary" },
12579
+ rest: { label: "REST", color: "warning", pulse: false, textColor: "primary" },
12580
+ idle: { label: "IDLE", color: "default", pulse: false, textColor: "secondary" }
12581
+ };
12582
+ function SessionStatePill({ state, label, className, ...props }) {
12583
+ const cfg = stateConfig[state];
12584
+ return /* @__PURE__ */ jsxs(reactNative.View, { className: cn("flex-row items-center gap-2", className), ...props, children: [
12585
+ /* @__PURE__ */ jsx(Indicator, { size: "md", color: cfg.color, pulse: cfg.pulse }),
12586
+ /* @__PURE__ */ jsx(Typography, { variant: "monoLabel", color: cfg.textColor, className: "text-[11px]", children: label ?? cfg.label })
12587
+ ] });
12588
+ }
12589
+ var statusTextClass = {
12590
+ connected: "text-status-success",
12591
+ degraded: "text-status-warning",
12592
+ lost: "text-status-error-vivid"
12593
+ };
12594
+ function DeviceIndicator({
12595
+ status = "connected",
12596
+ onPress,
12597
+ label = "Devices",
12598
+ className,
12599
+ ...props
12600
+ }) {
12601
+ const Wrapper = onPress ? reactNative.Pressable : reactNative.View;
12602
+ return /* @__PURE__ */ jsx(
12603
+ Wrapper,
12604
+ {
12605
+ accessibilityLabel: label,
12606
+ ...onPress ? { onPress, accessibilityRole: "button" } : {},
12607
+ className: cn(
12608
+ "w-[26px] h-[28px] items-center justify-center rounded-[7px]",
12609
+ statusTextClass[status],
12610
+ className
12611
+ ),
12612
+ ...props,
12613
+ children: /* @__PURE__ */ jsx(BluetoothIcon, { size: 18, color: "currentColor", title: label })
12614
+ }
12615
+ );
12616
+ }
12617
+ var stateColor = {
12618
+ connected: "success",
12619
+ available: "info",
12620
+ degraded: "warning",
12621
+ lost: "error-vivid"
12622
+ };
12623
+ function DeviceRow({ device, onPress, className, ...props }) {
12624
+ const Wrapper = onPress ? reactNative.Pressable : reactNative.View;
12625
+ return /* @__PURE__ */ jsxs(
12626
+ Wrapper,
12627
+ {
12628
+ ...onPress ? { onPress, accessibilityRole: "button" } : {},
12629
+ className: cn("flex-row items-center gap-[10px] px-2 py-[9px] rounded-[7px]", className),
12630
+ ...props,
12631
+ children: [
12632
+ /* @__PURE__ */ jsx(Indicator, { size: "md", color: stateColor[device.state] }),
12633
+ /* @__PURE__ */ jsx(
12634
+ Typography,
12635
+ {
12636
+ variant: "body2",
12637
+ color: device.slot ? "primary" : "secondary",
12638
+ className: "flex-1 font-bold text-[12px]",
12639
+ children: device.nickname
12640
+ }
12641
+ ),
12642
+ /* @__PURE__ */ jsx(Typography, { variant: "mono", color: "tertiary", className: "text-[10px]", children: device.id })
12643
+ ]
12644
+ }
12645
+ );
12646
+ }
12647
+ function aggregateStatus(devices) {
12648
+ const bound = devices.filter((d) => d.slot);
12649
+ if (bound.some((d) => d.state === "lost")) return "lost";
12650
+ if (bound.some((d) => d.state === "degraded")) return "degraded";
12651
+ return "connected";
12652
+ }
12653
+ function DeviceMenu({
12654
+ devices,
12655
+ isOpen,
12656
+ onOpenChange,
12657
+ onSelectDevice,
12658
+ className
12659
+ }) {
12660
+ const status = aggregateStatus(devices);
12661
+ const boundCount = devices.filter((d) => d.slot).length;
12662
+ const availCount = devices.filter((d) => !d.slot).length;
12663
+ return /* @__PURE__ */ jsxs(Popover, { placement: "bottom", isOpen, onOpenChange, className, children: [
12664
+ /* @__PURE__ */ jsx(PopoverTrigger, { children: /* @__PURE__ */ jsx(DeviceIndicator, { status }) }),
12665
+ /* @__PURE__ */ jsxs(PopoverContent, { className: "right-0 left-auto mt-[10px] w-[326px] bg-surface-elevated border border-border-strong rounded-[10px] p-[7px]", children: [
12666
+ /* @__PURE__ */ jsxs(
12667
+ Typography,
12668
+ {
12669
+ variant: "monoLabel",
12670
+ color: "tertiary",
12671
+ className: "text-[9px] tracking-[0.8px] px-2 pt-[6px] pb-2",
12672
+ children: [
12673
+ "Devices \u2014 ",
12674
+ boundCount,
12675
+ " bound \xB7 ",
12676
+ availCount,
12677
+ " available"
12678
+ ]
12679
+ }
12680
+ ),
12681
+ devices.map((device, i) => /* @__PURE__ */ jsx(reactNative.View, { className: cn(i > 0 && "border-t border-border"), children: /* @__PURE__ */ jsx(
12682
+ DeviceRow,
12683
+ {
12684
+ device,
12685
+ onPress: onSelectDevice ? () => onSelectDevice(device) : void 0
12686
+ }
12687
+ ) }, device.id))
12688
+ ] })
12689
+ ] });
12690
+ }
12691
+ var SUBTITLE_MIN = 1024;
12692
+ var CLOCK_MIN = 720;
12693
+ function TopBar({
12694
+ state,
12695
+ devices,
12696
+ time,
12697
+ subtitle = "wall dashboard",
12698
+ showSubtitle,
12699
+ showClock,
12700
+ onSelectDevice,
12701
+ className
12702
+ }) {
12703
+ const [width, setWidth] = React24.useState(SUBTITLE_MIN);
12704
+ const onLayout = (e) => setWidth(e.nativeEvent.layout.width);
12705
+ const subtitleVisible = showSubtitle ?? width >= SUBTITLE_MIN;
12706
+ const clockVisible = showClock ?? width >= CLOCK_MIN;
12707
+ return /* @__PURE__ */ jsxs(
12708
+ reactNative.View,
12709
+ {
12710
+ onLayout,
12711
+ style: surfaceGradient.chrome(),
12712
+ className: cn(
12713
+ "h-[46px] flex-row items-center gap-[14px] px-4 bg-surface-elevated border-b border-border",
12714
+ className
12715
+ ),
12716
+ children: [
12717
+ /* @__PURE__ */ jsx(BrandLockup, { subtitle, showSubtitle: subtitleVisible }),
12718
+ /* @__PURE__ */ jsxs(reactNative.View, { className: "ml-auto flex-row items-center gap-[12px]", children: [
12719
+ /* @__PURE__ */ jsx(SessionStatePill, { state }),
12720
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", className: "h-4 bg-border-prominent" }),
12721
+ /* @__PURE__ */ jsx(DeviceMenu, { devices, onSelectDevice }),
12722
+ clockVisible ? /* @__PURE__ */ jsxs(jsxRuntime.Fragment, { children: [
12723
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", className: "h-4 bg-border-prominent" }),
12724
+ /* @__PURE__ */ jsx(
12725
+ DateTime,
12726
+ {
12727
+ value: time,
12728
+ live: time == null,
12729
+ format: "time",
12730
+ hour12: false,
12731
+ variant: "mono",
12732
+ color: "secondary",
12733
+ className: "text-[11px] min-w-[38px] text-right"
12734
+ }
12735
+ )
12736
+ ] }) : null
12737
+ ] })
12738
+ ]
12739
+ }
12740
+ );
12741
+ }
12269
12742
 
12270
12743
  // src/utils/form.ts
12271
12744
  function getFieldValidationProps(state) {
@@ -12369,12 +12842,15 @@ exports.AvatarGroup = AvatarGroup;
12369
12842
  exports.Badge = Badge;
12370
12843
  exports.BadgeText = BadgeText;
12371
12844
  exports.BaseBadge = BaseBadge;
12845
+ exports.BluetoothIcon = BluetoothIcon;
12846
+ exports.BrandLockup = BrandLockup;
12372
12847
  exports.BreadcrumbItem = BreadcrumbItem;
12373
12848
  exports.Breadcrumbs = Breadcrumbs;
12374
12849
  exports.Button = Button;
12375
12850
  exports.ButtonIcon = ButtonIcon;
12376
12851
  exports.ButtonSpinner = ButtonSpinner;
12377
12852
  exports.ButtonText = ButtonText;
12853
+ exports.CATEGORICAL_CVD_SAFE_MAX = CATEGORICAL_CVD_SAFE_MAX;
12378
12854
  exports.CapacityBandChart = CapacityBandChart;
12379
12855
  exports.Caption = Caption;
12380
12856
  exports.Card = Card;
@@ -12394,11 +12870,15 @@ exports.CollapseContent = CollapseContent;
12394
12870
  exports.DataRow = DataRow;
12395
12871
  exports.DateTime = DateTime;
12396
12872
  exports.DeviationBar = DeviationBar;
12873
+ exports.DeviceIndicator = DeviceIndicator;
12874
+ exports.DeviceMenu = DeviceMenu;
12875
+ exports.DeviceRow = DeviceRow;
12397
12876
  exports.Divider = Divider;
12398
12877
  exports.Drawer = Drawer;
12399
12878
  exports.DrawerBody = DrawerBody;
12400
12879
  exports.DrawerFooter = DrawerFooter;
12401
12880
  exports.DrawerHeader = DrawerHeader;
12881
+ exports.DumbbellIcon = DumbbellIcon;
12402
12882
  exports.EmptyState = EmptyState;
12403
12883
  exports.ExerciseCard = ExerciseCard;
12404
12884
  exports.FormActions = FormActions;
@@ -12464,6 +12944,7 @@ exports.Section = Section;
12464
12944
  exports.SectionContent = SectionContent;
12465
12945
  exports.SectionHeader = SectionHeader;
12466
12946
  exports.Select = Select;
12947
+ exports.SessionStatePill = SessionStatePill;
12467
12948
  exports.SetRow = SetRow;
12468
12949
  exports.Sidebar = Sidebar;
12469
12950
  exports.SidebarContent = SidebarContent;
@@ -12480,6 +12961,7 @@ exports.SkeletonText = SkeletonText;
12480
12961
  exports.Sparkline = Sparkline;
12481
12962
  exports.Spinner = Spinner;
12482
12963
  exports.Stack = Stack;
12964
+ exports.StarIcon = StarIcon;
12483
12965
  exports.StatusDot = StatusDot;
12484
12966
  exports.StepContent = StepContent;
12485
12967
  exports.StepIndicator = StepIndicator;
@@ -12489,6 +12971,7 @@ exports.StepperStep = Step;
12489
12971
  exports.StrengthTrendChart = StrengthTrendChart;
12490
12972
  exports.SupersetWrapper = SupersetWrapper;
12491
12973
  exports.Surface = Surface;
12974
+ exports.SvgIcon = SvgIcon;
12492
12975
  exports.Switch = Switch;
12493
12976
  exports.TEMPO_PACING = TEMPO_PACING;
12494
12977
  exports.Tab = Tab;
@@ -12510,10 +12993,12 @@ exports.ToastProvider = ToastProvider;
12510
12993
  exports.ToolbarButton = ToolbarButton;
12511
12994
  exports.ToolbarButtonGroup = ToolbarButtonGroup;
12512
12995
  exports.Tooltip = Tooltip;
12996
+ exports.TopBar = TopBar;
12513
12997
  exports.Treemap = Treemap;
12514
12998
  exports.Typography = Typography;
12515
12999
  exports.VStack = VStack;
12516
13000
  exports.VelocityStrip = VelocityStrip;
13001
+ exports.VoltrasMark = VoltrasMark;
12517
13002
  exports.WeekRow = WeekRow;
12518
13003
  exports.WeightBadge = WeightBadge;
12519
13004
  exports.WorkoutCard = WorkoutCard;
@@ -12521,9 +13006,11 @@ exports.WorkoutPill = WorkoutPill;
12521
13006
  exports.alpha = alpha;
12522
13007
  exports.applyThemePreset = applyThemePreset;
12523
13008
  exports.audiobookPreset = audiobookPreset;
13009
+ exports.bestTextColor = bestTextColor;
12524
13010
  exports.buttonSizes = buttonSizes;
12525
13011
  exports.calculateMeanVelocity = calculateMeanVelocity;
12526
13012
  exports.calculateVelocityLoss = calculateVelocityLoss;
13013
+ exports.categoricalPalette = categoricalPalette;
12527
13014
  exports.cn = cn;
12528
13015
  exports.componentElevationRanges = componentElevationRanges;
12529
13016
  exports.composeValidators = composeValidators;
@@ -12537,12 +13024,14 @@ exports.darkThemeCSSVars = darkThemeCSSVars;
12537
13024
  exports.darken = darken;
12538
13025
  exports.defaultPreset = defaultPreset;
12539
13026
  exports.discreteRainbow = discreteRainbow;
13027
+ exports.divergingScale = divergingScale;
12540
13028
  exports.elevationSystem = elevationSystem;
12541
13029
  exports.formatDateTime = formatDateTime;
12542
13030
  exports.formatPrescription = formatPrescription;
12543
13031
  exports.formatSignedPct = formatSignedPct;
12544
13032
  exports.formatVelocity = formatVelocity;
12545
13033
  exports.getBaseSurfaceColor = getBaseSurfaceColor;
13034
+ exports.getCategoricalColor = getCategoricalColor;
12546
13035
  exports.getContrastText = getContrastText;
12547
13036
  exports.getDiscreteRainbowColor = getDiscreteRainbowColor;
12548
13037
  exports.getElevationConfig = getElevationConfig;
@@ -12573,10 +13062,12 @@ exports.isEmpty = isEmpty;
12573
13062
  exports.isValidEmail = isValidEmail;
12574
13063
  exports.lightThemeCSSVars = lightThemeCSSVars;
12575
13064
  exports.lighten = lighten;
13065
+ exports.linearGradient = linearGradient;
12576
13066
  exports.neumorphicShadows = neumorphicShadows;
12577
13067
  exports.primitiveBorderRadius = primitiveBorderRadius;
12578
13068
  exports.primitiveBreakpoints = primitiveBreakpoints;
12579
13069
  exports.primitiveColors = primitiveColors;
13070
+ exports.primitiveRamps = primitiveRamps;
12580
13071
  exports.primitiveShadows = primitiveShadows;
12581
13072
  exports.primitiveSpacing = primitiveSpacing;
12582
13073
  exports.primitiveTypography = primitiveTypography;
@@ -12591,7 +13082,9 @@ exports.rpeColor = rpeColor;
12591
13082
  exports.semanticColorsDark = semanticColorsDark;
12592
13083
  exports.semanticColorsLight = semanticColorsLight;
12593
13084
  exports.semanticTypography = semanticTypography;
13085
+ exports.sequentialEffort = sequentialEffort;
12594
13086
  exports.shadowColors = shadowColors;
13087
+ exports.surfaceGradient = surfaceGradient;
12595
13088
  exports.useTable = useTable;
12596
13089
  exports.useToast = useToast;
12597
13090
  exports.useToolbarButton = useToolbarButton;