@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.mjs CHANGED
@@ -1,7 +1,7 @@
1
+ import { jsx as jsx$1, jsxs as jsxs$1, Fragment } from 'react/jsx-runtime';
1
2
  import { Pressable, ActivityIndicator, Text, View, TextInput, Platform, StyleSheet, Easing, Image, Modal as Modal$1, ScrollView, Animated } from 'react-native';
2
3
  import { clsx } from 'clsx';
3
4
  import { twMerge } from 'tailwind-merge';
4
- import { jsx as jsx$1, jsxs as jsxs$1, Fragment } from 'react/jsx-runtime';
5
5
  import React24, { forwardRef, useState, createContext, useMemo, useContext, useRef, useEffect, useCallback, useSyncExternalStore, Fragment as Fragment$1 } from 'react';
6
6
 
7
7
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
@@ -10,9 +10,6 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
10
10
  if (typeof require !== "undefined") return require.apply(this, arguments);
11
11
  throw Error('Dynamic require of "' + x + '" is not supported');
12
12
  });
13
- function cn(...inputs) {
14
- return twMerge(clsx(inputs));
15
- }
16
13
  function wrapJsx(fn) {
17
14
  return function(type, props, ...rest) {
18
15
  if (props && typeof props.className === "string" && props.className) {
@@ -31,6 +28,58 @@ function wrapJsx(fn) {
31
28
  var jsx = wrapJsx(jsx$1);
32
29
  var jsxs = wrapJsx(jsxs$1);
33
30
 
31
+ // src/components/icons/SvgIcon.tsx
32
+ function SvgIcon({
33
+ size = 24,
34
+ color = "currentColor",
35
+ strokeWidth = 2,
36
+ fill = "none",
37
+ title,
38
+ children
39
+ }) {
40
+ return /* @__PURE__ */ jsxs(
41
+ "svg",
42
+ {
43
+ width: size,
44
+ height: size,
45
+ viewBox: "0 0 24 24",
46
+ fill,
47
+ stroke: color,
48
+ strokeWidth,
49
+ strokeLinecap: "round",
50
+ strokeLinejoin: "round",
51
+ ...title ? { role: "img", "aria-label": title } : { "aria-hidden": true },
52
+ children: [
53
+ title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
54
+ children
55
+ ]
56
+ }
57
+ );
58
+ }
59
+
60
+ // src/components/icons/icons.tsx
61
+ function VoltrasMark({ size = 14, ...props }) {
62
+ return /* @__PURE__ */ jsx(SvgIcon, { size, ...props, children: /* @__PURE__ */ jsx("path", { d: "M12 2 22 12 12 22 2 12Z" }) });
63
+ }
64
+ function BluetoothIcon({ size = 18, ...props }) {
65
+ return /* @__PURE__ */ jsx(SvgIcon, { size, ...props, children: /* @__PURE__ */ jsx("path", { d: "M7 7 17 17 12 22 12 2 17 7 7 17" }) });
66
+ }
67
+ function DumbbellIcon(props) {
68
+ return /* @__PURE__ */ jsxs(SvgIcon, { ...props, children: [
69
+ /* @__PURE__ */ jsx("path", { d: "M14.4 14.4 9.6 9.6" }),
70
+ /* @__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" }),
71
+ /* @__PURE__ */ jsx("path", { d: "m21.5 21.5-1.4-1.4" }),
72
+ /* @__PURE__ */ jsx("path", { d: "M3.9 3.9 2.5 2.5" }),
73
+ /* @__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" })
74
+ ] });
75
+ }
76
+ function StarIcon(props) {
77
+ 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" }) });
78
+ }
79
+ function cn(...inputs) {
80
+ return twMerge(clsx(inputs));
81
+ }
82
+
34
83
  // src/components/ui/alert/Alert.tsx
35
84
  var statusColors = {
36
85
  success: {
@@ -188,6 +237,38 @@ var primitiveColors = {
188
237
  800: "#991B1B",
189
238
  900: "#7F1D1D"
190
239
  },
240
+ // Vivid green scale (live/go success)
241
+ greenVivid: {
242
+ 50: "#E9FBF0",
243
+ 100: "#C8F7DA",
244
+ 200: "#9FF0BF",
245
+ 300: "#6BE79D",
246
+ 400: "#47DE84",
247
+ // Success vivid light
248
+ 500: "#2ED573",
249
+ // Success vivid main
250
+ 600: "#22B85F",
251
+ 700: "#1A9950",
252
+ // Success vivid dark
253
+ 800: "#157A40",
254
+ 900: "#105C30"
255
+ },
256
+ // Vivid red scale (alert)
257
+ redVivid: {
258
+ 50: "#FFECEE",
259
+ 100: "#FFD6DB",
260
+ 200: "#FFB3BC",
261
+ 300: "#FF8593",
262
+ 400: "#FF6070",
263
+ // Error vivid light
264
+ 500: "#FF4757",
265
+ // Error vivid main
266
+ 600: "#E63548",
267
+ 700: "#C42539",
268
+ // Error vivid dark
269
+ 800: "#9E1C2C",
270
+ 900: "#7A1520"
271
+ },
191
272
  // Amber scale (warning)
192
273
  amber: {
193
274
  50: "#FFFBEB",
@@ -277,6 +358,162 @@ var primitiveColors = {
277
358
  black: "#000000",
278
359
  transparent: "transparent"
279
360
  };
361
+ var primitiveRamps = {
362
+ red: {
363
+ 50: "#FFF4F4",
364
+ 100: "#FFE3E5",
365
+ 200: "#FFC2C5",
366
+ 300: "#FF9A9D",
367
+ 400: "#F77175",
368
+ 500: "#E05254",
369
+ 600: "#D14343",
370
+ // pin
371
+ 700: "#A4221C",
372
+ 800: "#7E1002",
373
+ 900: "#5A0900",
374
+ 950: "#3D0400"
375
+ },
376
+ orange: {
377
+ 50: "#FFF5ED",
378
+ 100: "#FFE6D4",
379
+ 200: "#FFC7A2",
380
+ 300: "#FFA063",
381
+ 400: "#FF7900",
382
+ // pin
383
+ 500: "#DA5F00",
384
+ 600: "#B94A00",
385
+ 700: "#983804",
386
+ 800: "#6F290F",
387
+ 900: "#4E1C0C",
388
+ 950: "#331107"
389
+ },
390
+ amber: {
391
+ 50: "#FFF7DD",
392
+ 100: "#FFEAA9",
393
+ 200: "#FFD352",
394
+ 300: "#F9B415",
395
+ // pin
396
+ 400: "#E08C00",
397
+ 500: "#C27400",
398
+ 600: "#A45E00",
399
+ 700: "#814D14",
400
+ 800: "#5B3A1A",
401
+ 900: "#442503",
402
+ 950: "#301500"
403
+ },
404
+ green: {
405
+ 50: "#E3FFEE",
406
+ 100: "#B5FFD2",
407
+ 200: "#58F69E",
408
+ 300: "#2ED573",
409
+ // pin
410
+ 400: "#21C05D",
411
+ 500: "#22A444",
412
+ 600: "#298732",
413
+ 700: "#2B6B25",
414
+ 800: "#264D1C",
415
+ 900: "#1B3515",
416
+ 950: "#11220D"
417
+ },
418
+ cyan: {
419
+ 50: "#E6FBFF",
420
+ 100: "#C2F6FF",
421
+ 200: "#62EAFF",
422
+ 300: "#22D3EE",
423
+ // pin
424
+ 400: "#01B5D1",
425
+ 500: "#2697B7",
426
+ 600: "#307B9B",
427
+ 700: "#2A617F",
428
+ 800: "#22465F",
429
+ 900: "#0B3149",
430
+ 950: "#001F36"
431
+ },
432
+ blue: {
433
+ 50: "#EFF8FF",
434
+ 100: "#D9EFFF",
435
+ 200: "#ACDBFF",
436
+ 300: "#78C2FF",
437
+ 400: "#3CA8FF",
438
+ 500: "#2196F3",
439
+ // pin
440
+ 600: "#1072CB",
441
+ 700: "#135AA8",
442
+ 800: "#14407E",
443
+ 900: "#112C5A",
444
+ 950: "#091B3C"
445
+ },
446
+ magenta: {
447
+ 50: "#FFF3F9",
448
+ 100: "#FFE2F1",
449
+ 200: "#FFBDE2",
450
+ 300: "#FF8FD5",
451
+ 400: "#ED69C3",
452
+ 500: "#D548AF",
453
+ 600: "#BA2996",
454
+ 700: "#9C0D7A",
455
+ // pin
456
+ 800: "#77005A",
457
+ 900: "#56003F",
458
+ 950: "#3B0029"
459
+ }
460
+ };
461
+ var categoricalPalette = {
462
+ default: [
463
+ primitiveRamps.blue[500],
464
+ primitiveRamps.magenta[500],
465
+ primitiveRamps.red[500],
466
+ primitiveRamps.orange[400],
467
+ primitiveRamps.green[300],
468
+ primitiveRamps.cyan[300],
469
+ primitiveRamps.amber[600]
470
+ // extended (7th) — pair with a legend
471
+ ],
472
+ dark: [
473
+ primitiveRamps.blue[600],
474
+ primitiveRamps.magenta[600],
475
+ primitiveRamps.red[500],
476
+ primitiveRamps.orange[600],
477
+ primitiveRamps.green[800],
478
+ primitiveRamps.cyan[800],
479
+ primitiveRamps.amber[500]
480
+ // extended (7th) — pair with a legend
481
+ ]
482
+ };
483
+ var CATEGORICAL_CVD_SAFE_MAX = 6;
484
+ function getCategoricalColor(index, variant = "default") {
485
+ const palette = categoricalPalette[variant];
486
+ index = Math.max(0, Math.floor(index));
487
+ return palette[index % palette.length];
488
+ }
489
+ var divergingScale = [
490
+ primitiveRamps.blue[500],
491
+ // under
492
+ primitiveRamps.cyan[300],
493
+ // maintenance
494
+ primitiveRamps.green[200],
495
+ // optimal (light center)
496
+ primitiveRamps.amber[300],
497
+ // approaching
498
+ primitiveRamps.red[600]
499
+ // over
500
+ ];
501
+ var sequentialEffort = [
502
+ primitiveRamps.green[300],
503
+ primitiveRamps.amber[200],
504
+ primitiveRamps.amber[300],
505
+ primitiveRamps.orange[400],
506
+ primitiveRamps.red[600],
507
+ primitiveRamps.red[700]
508
+ ];
509
+ function bestTextColor(hex) {
510
+ const [r, g, b] = [0, 2, 4].map((i) => {
511
+ const c = parseInt(hex.replace("#", "").slice(i, i + 2), 16) / 255;
512
+ return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92;
513
+ });
514
+ const l = 0.2126 * r + 0.7152 * g + 0.0722 * b;
515
+ return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? "#000000" : "#FFFFFF";
516
+ }
280
517
  var discreteRainbow = [
281
518
  "#E8ECFB",
282
519
  "#D9CCE3",
@@ -486,56 +723,43 @@ var primitiveZIndex = {
486
723
  // src/theme/tokens/semantic.ts
487
724
  var semanticColorsLight = {
488
725
  // Brand colors (brand-*)
489
- "brand-primary": primitiveColors.accent[400],
490
- // #FF7900
491
- "brand-primary-light": primitiveColors.accent[200],
492
- // #FF9630
493
- "brand-primary-dark": primitiveColors.accent[700],
494
- // #D0620C
726
+ "brand-primary": primitiveRamps.orange[400],
727
+ "brand-primary-light": primitiveRamps.orange[300],
728
+ "brand-primary-dark": primitiveRamps.orange[500],
495
729
  "brand-primary-subtle": "rgba(255, 121, 0, 0.08)",
496
- "brand-primary-hover": primitiveColors.accent[500],
497
- "brand-primary-active": primitiveColors.accent[600],
498
- "brand-secondary": primitiveColors.steel[500],
499
- // #406D87
500
- "brand-secondary-light": primitiveColors.steel[300],
501
- // #678498
502
- "brand-secondary-dark": primitiveColors.steel[700],
503
- // #32556D
504
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.08)",
505
- "brand-secondary-hover": primitiveColors.steel[600],
506
- "brand-secondary-active": primitiveColors.steel[700],
730
+ "brand-primary-hover": primitiveRamps.orange[500],
731
+ "brand-primary-active": primitiveRamps.orange[600],
732
+ "brand-secondary": primitiveRamps.cyan[600],
733
+ "brand-secondary-light": primitiveRamps.cyan[500],
734
+ "brand-secondary-dark": primitiveRamps.cyan[700],
735
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.08)",
736
+ "brand-secondary-hover": primitiveRamps.cyan[700],
737
+ "brand-secondary-active": primitiveRamps.cyan[800],
507
738
  // Text on brand backgrounds (on-*)
508
739
  "on-brand-primary": primitiveColors.white,
509
740
  "on-brand-secondary": primitiveColors.white,
510
741
  // Status colors (status-*)
511
- "status-success": primitiveColors.teal[500],
512
- // #14B8A6
513
- "status-success-light": primitiveColors.teal[400],
514
- // #43C6B7
515
- "status-success-dark": primitiveColors.teal[700],
516
- // #0E8074
517
- "status-success-subtle": primitiveColors.teal[50],
518
- "status-error": primitiveColors.red[600],
519
- // #D14343
520
- "status-error-light": primitiveColors.red[400],
521
- // #DA6868
522
- "status-error-dark": primitiveColors.red[700],
523
- // #922E2E
524
- "status-error-subtle": primitiveColors.red[50],
525
- "status-warning": primitiveColors.amber[500],
526
- // #FFB020
527
- "status-warning-light": primitiveColors.amber[400],
528
- // #FFBF4C
529
- "status-warning-dark": primitiveColors.amber[600],
530
- // #B27B16
531
- "status-warning-subtle": primitiveColors.amber[50],
532
- "status-info": primitiveColors.sky[500],
533
- // #2196F3
534
- "status-info-light": primitiveColors.sky[400],
535
- // #64B6F7
536
- "status-info-dark": primitiveColors.sky[700],
537
- // #0B79D0
538
- "status-info-subtle": primitiveColors.sky[50],
742
+ "status-success": primitiveRamps.green[300],
743
+ "status-success-light": primitiveRamps.green[200],
744
+ "status-success-dark": primitiveRamps.green[600],
745
+ "status-success-subtle": primitiveRamps.green[50],
746
+ "status-error": primitiveRamps.red[600],
747
+ "status-error-light": primitiveRamps.red[500],
748
+ "status-error-dark": primitiveRamps.red[700],
749
+ "status-error-subtle": primitiveRamps.red[50],
750
+ "status-error-vivid": primitiveColors.redVivid[500],
751
+ // vivid alert red
752
+ "status-error-vivid-light": primitiveColors.redVivid[400],
753
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
754
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
755
+ "status-warning": primitiveRamps.amber[300],
756
+ "status-warning-light": primitiveRamps.amber[200],
757
+ "status-warning-dark": primitiveRamps.amber[500],
758
+ "status-warning-subtle": primitiveRamps.amber[50],
759
+ "status-info": primitiveRamps.blue[500],
760
+ "status-info-light": primitiveRamps.blue[300],
761
+ "status-info-dark": primitiveRamps.blue[600],
762
+ "status-info-subtle": primitiveRamps.blue[50],
539
763
  // Text on status backgrounds (on-status-*)
540
764
  "on-status-success": primitiveColors.white,
541
765
  "on-status-error": primitiveColors.white,
@@ -562,25 +786,25 @@ var semanticColorsLight = {
562
786
  // Data visualization colors (data-*)
563
787
  // First 10 colors from discrete rainbow optimized for charts
564
788
  "data-1": discreteRainbow[9],
565
- // #1965B0 - Blue
789
+ // Blue
566
790
  "data-2": discreteRainbow[14],
567
- // #4EB265 - Green
791
+ // Green
568
792
  "data-3": discreteRainbow[17],
569
- // #F7F056 - Yellow
793
+ // Yellow
570
794
  "data-4": discreteRainbow[25],
571
- // #DC050C - Red
795
+ // Red
572
796
  "data-5": discreteRainbow[8],
573
- // #882E72 - Purple
797
+ // Purple
574
798
  "data-6": discreteRainbow[20],
575
- // #F4A736 - Orange
799
+ // Orange
576
800
  "data-7": discreteRainbow[13],
577
- // #7BAFDE - Light Blue
801
+ // Light Blue
578
802
  "data-8": discreteRainbow[15],
579
- // #90C987 - Light Green
803
+ // Light Green
580
804
  "data-9": discreteRainbow[3],
581
- // #CAACCB - Lavender
805
+ // Lavender
582
806
  "data-10": discreteRainbow[22],
583
- // #EE8026 - Dark Orange
807
+ // Dark Orange
584
808
  // Text colors (text-*)
585
809
  "text-primary": "#121828",
586
810
  "text-secondary": "#65748B",
@@ -592,9 +816,9 @@ var semanticColorsLight = {
592
816
  // Surface colors (surface-*) - for elevated containers
593
817
  "surface-base": primitiveColors.white,
594
818
  "surface-elevated": primitiveColors.neutral[50],
595
- // #FAFAFA - slightly off-white for elevated cards
819
+ // slightly off-white for elevated cards
596
820
  "surface-raised": primitiveColors.neutral[100],
597
- // #F3F4F6 - light gray for raised cards
821
+ // light gray for raised cards
598
822
  "surface-overlay": primitiveColors.white,
599
823
  "surface-input": primitiveColors.neutral[50],
600
824
  // Input field background (filled variant)
@@ -606,6 +830,8 @@ var semanticColorsLight = {
606
830
  "border-default": "#E8E9EB",
607
831
  "border-subtle": primitiveColors.neutral[100],
608
832
  "border-strong": primitiveColors.neutral[300],
833
+ "border-prominent": primitiveColors.neutral[400],
834
+ // high-visibility divider
609
835
  "border-focus": primitiveColors.blue[600],
610
836
  "border-input": primitiveColors.neutral[300],
611
837
  // Input field border
@@ -630,37 +856,41 @@ var semanticColorsLight = {
630
856
  };
631
857
  var semanticColorsDark = {
632
858
  // Brand colors stay the same in dark mode
633
- "brand-primary": primitiveColors.accent[400],
634
- "brand-primary-light": primitiveColors.accent[200],
635
- "brand-primary-dark": primitiveColors.accent[700],
859
+ "brand-primary": primitiveRamps.orange[400],
860
+ "brand-primary-light": primitiveRamps.orange[300],
861
+ "brand-primary-dark": primitiveRamps.orange[500],
636
862
  "brand-primary-subtle": "rgba(255, 121, 0, 0.12)",
637
- "brand-primary-hover": primitiveColors.accent[300],
638
- "brand-primary-active": primitiveColors.accent[200],
639
- "brand-secondary": primitiveColors.steel[500],
640
- "brand-secondary-light": primitiveColors.steel[300],
641
- "brand-secondary-dark": primitiveColors.steel[700],
642
- "brand-secondary-subtle": "rgba(64, 109, 135, 0.12)",
643
- "brand-secondary-hover": primitiveColors.steel[400],
644
- "brand-secondary-active": primitiveColors.steel[300],
863
+ "brand-primary-hover": primitiveRamps.orange[300],
864
+ "brand-primary-active": primitiveRamps.orange[200],
865
+ "brand-secondary": primitiveRamps.cyan[600],
866
+ "brand-secondary-light": primitiveRamps.cyan[500],
867
+ "brand-secondary-dark": primitiveRamps.cyan[700],
868
+ "brand-secondary-subtle": "rgba(48, 123, 155, 0.12)",
869
+ "brand-secondary-hover": primitiveRamps.cyan[500],
870
+ "brand-secondary-active": primitiveRamps.cyan[400],
645
871
  // Text on brand backgrounds
646
872
  "on-brand-primary": primitiveColors.white,
647
873
  "on-brand-secondary": primitiveColors.white,
648
874
  // Status colors
649
- "status-success": primitiveColors.teal[500],
650
- "status-success-light": primitiveColors.teal[400],
651
- "status-success-dark": primitiveColors.teal[700],
652
- "status-success-subtle": "rgba(20, 184, 166, 0.12)",
653
- "status-error": primitiveColors.red[600],
654
- "status-error-light": primitiveColors.red[400],
655
- "status-error-dark": primitiveColors.red[700],
875
+ "status-success": primitiveRamps.green[300],
876
+ "status-success-light": primitiveRamps.green[200],
877
+ "status-success-dark": primitiveRamps.green[600],
878
+ "status-success-subtle": "rgba(46, 213, 115, 0.12)",
879
+ "status-error": primitiveRamps.red[600],
880
+ "status-error-light": primitiveRamps.red[500],
881
+ "status-error-dark": primitiveRamps.red[700],
656
882
  "status-error-subtle": "rgba(209, 67, 67, 0.12)",
657
- "status-warning": primitiveColors.amber[500],
658
- "status-warning-light": primitiveColors.amber[400],
659
- "status-warning-dark": primitiveColors.amber[600],
660
- "status-warning-subtle": "rgba(255, 176, 32, 0.12)",
661
- "status-info": primitiveColors.sky[500],
662
- "status-info-light": primitiveColors.sky[400],
663
- "status-info-dark": primitiveColors.sky[700],
883
+ "status-error-vivid": primitiveColors.redVivid[500],
884
+ "status-error-vivid-light": primitiveColors.redVivid[400],
885
+ "status-error-vivid-dark": primitiveColors.redVivid[700],
886
+ "status-error-vivid-subtle": "rgba(255, 71, 87, 0.12)",
887
+ "status-warning": primitiveRamps.amber[300],
888
+ "status-warning-light": primitiveRamps.amber[200],
889
+ "status-warning-dark": primitiveRamps.amber[500],
890
+ "status-warning-subtle": "rgba(249, 180, 21, 0.12)",
891
+ "status-info": primitiveRamps.blue[500],
892
+ "status-info-light": primitiveRamps.blue[300],
893
+ "status-info-dark": primitiveRamps.blue[600],
664
894
  "status-info-subtle": "rgba(33, 150, 243, 0.12)",
665
895
  // Text on status backgrounds
666
896
  "on-status-success": primitiveColors.white,
@@ -702,29 +932,31 @@ var semanticColorsDark = {
702
932
  "text-link-hover": primitiveColors.blue[400],
703
933
  // Surface colors - dark backgrounds
704
934
  "surface-base": primitiveColors.charcoal[700],
705
- // #161616 - main surface
935
+ // main surface
706
936
  "surface-elevated": primitiveColors.charcoal[600],
707
- // #191919 - elevated surface
937
+ // elevated surface
708
938
  "surface-raised": primitiveColors.charcoal[500],
709
- // #1C1C1C - raised surface
939
+ // raised surface
710
940
  "surface-overlay": primitiveColors.charcoal[600],
711
- // #191919 - overlay surface
941
+ // overlay surface
712
942
  "surface-input": primitiveColors.charcoal[600],
713
- // #191919 - input surface
943
+ // input surface
714
944
  // Background colors
715
945
  "background-base": primitiveColors.charcoal[900],
716
- // #101010 - darkest charcoal
946
+ // darkest charcoal
717
947
  "background-default": primitiveColors.charcoal[700],
718
- // #161616 - main background
948
+ // main background
719
949
  "background-subtle": primitiveColors.charcoal[500],
720
- // #1C1C1C - subtle background
950
+ // subtle background
721
951
  // Border colors
722
952
  "border-default": primitiveColors.charcoal[400],
723
- // #1F1F1F - default border
953
+ // default border
724
954
  "border-subtle": primitiveColors.charcoal[500],
725
- // #1C1C1C - subtle border
955
+ // subtle border
726
956
  "border-strong": primitiveColors.charcoal[300],
727
- // #2C2C2C - strong border
957
+ // strong border
958
+ "border-prominent": primitiveColors.charcoal[200],
959
+ // high-visibility divider
728
960
  "border-focus": "#828DF8",
729
961
  "border-input": primitiveColors.neutral[600],
730
962
  "border-input-hover": primitiveColors.neutral[500],
@@ -739,7 +971,7 @@ var semanticColorsDark = {
739
971
  "interactive-disabled-text": "rgba(255, 255, 255, 0.26)",
740
972
  // Divider
741
973
  "divider": primitiveColors.charcoal[400],
742
- // #1F1F1F - divider color
974
+ // divider color
743
975
  // Avatar default
744
976
  "avatar-background": primitiveColors.neutral[600],
745
977
  "avatar-text": primitiveColors.white
@@ -1205,10 +1437,11 @@ var PasswordInput = forwardRef(function PasswordInput2({ showIcon, hideIcon, ...
1205
1437
  var themeIndependentCSSVars = {
1206
1438
  // RGB decomposed values for glow shadows
1207
1439
  "--color-brand-primary-rgb": "255, 121, 0",
1208
- "--color-brand-secondary-rgb": "64, 109, 135",
1209
- "--color-status-success-rgb": "20, 184, 166",
1440
+ "--color-brand-secondary-rgb": "48, 123, 155",
1441
+ "--color-status-success-rgb": "46, 213, 115",
1210
1442
  "--color-status-error-rgb": "209, 67, 67",
1211
- "--color-status-warning-rgb": "255, 176, 32",
1443
+ "--color-status-error-vivid-rgb": "255, 71, 87",
1444
+ "--color-status-warning-rgb": "249, 180, 21",
1212
1445
  "--color-status-info-rgb": "33, 150, 243",
1213
1446
  "--color-background-base-rgb": "16, 16, 16",
1214
1447
  // Font families
@@ -1243,6 +1476,10 @@ var lightThemeCSSVars = {
1243
1476
  "--color-status-warning-subtle": semanticColorsLight["status-warning-subtle"],
1244
1477
  "--color-status-info": semanticColorsLight["status-info"],
1245
1478
  "--color-status-info-subtle": semanticColorsLight["status-info-subtle"],
1479
+ "--color-status-error-vivid": semanticColorsLight["status-error-vivid"],
1480
+ "--color-status-error-vivid-light": semanticColorsLight["status-error-vivid-light"],
1481
+ "--color-status-error-vivid-dark": semanticColorsLight["status-error-vivid-dark"],
1482
+ "--color-status-error-vivid-subtle": semanticColorsLight["status-error-vivid-subtle"],
1246
1483
  "--color-text-primary": semanticColorsLight["text-primary"],
1247
1484
  "--color-text-secondary": semanticColorsLight["text-secondary"],
1248
1485
  "--color-text-tertiary": semanticColorsLight["text-tertiary"],
@@ -1258,6 +1495,7 @@ var lightThemeCSSVars = {
1258
1495
  "--color-border-default": semanticColorsLight["border-default"],
1259
1496
  "--color-border-subtle": semanticColorsLight["border-subtle"],
1260
1497
  "--color-border-strong": semanticColorsLight["border-strong"],
1498
+ "--color-border-prominent": semanticColorsLight["border-prominent"],
1261
1499
  "--color-border-focus": semanticColorsLight["border-focus"],
1262
1500
  "--color-interactive-hover": semanticColorsLight["interactive-hover"],
1263
1501
  "--color-interactive-focus": semanticColorsLight["interactive-focus"],
@@ -1334,6 +1572,10 @@ var darkThemeCSSVars = {
1334
1572
  "--color-status-warning-subtle": semanticColorsDark["status-warning-subtle"],
1335
1573
  "--color-status-info": semanticColorsDark["status-info"],
1336
1574
  "--color-status-info-subtle": semanticColorsDark["status-info-subtle"],
1575
+ "--color-status-error-vivid": semanticColorsDark["status-error-vivid"],
1576
+ "--color-status-error-vivid-light": semanticColorsDark["status-error-vivid-light"],
1577
+ "--color-status-error-vivid-dark": semanticColorsDark["status-error-vivid-dark"],
1578
+ "--color-status-error-vivid-subtle": semanticColorsDark["status-error-vivid-subtle"],
1337
1579
  "--color-text-primary": semanticColorsDark["text-primary"],
1338
1580
  "--color-text-secondary": semanticColorsDark["text-secondary"],
1339
1581
  "--color-text-tertiary": semanticColorsDark["text-tertiary"],
@@ -1349,6 +1591,7 @@ var darkThemeCSSVars = {
1349
1591
  "--color-border-default": semanticColorsDark["border-default"],
1350
1592
  "--color-border-subtle": semanticColorsDark["border-subtle"],
1351
1593
  "--color-border-strong": semanticColorsDark["border-strong"],
1594
+ "--color-border-prominent": semanticColorsDark["border-prominent"],
1352
1595
  "--color-border-focus": semanticColorsDark["border-focus"],
1353
1596
  "--color-interactive-hover": semanticColorsDark["interactive-hover"],
1354
1597
  "--color-interactive-focus": semanticColorsDark["interactive-focus"],
@@ -2157,6 +2400,17 @@ function resolveColor(token, mode = "dark") {
2157
2400
  return Platform.OS === "web" ? `var(--color-${token})` : getSemanticColors(mode)[token];
2158
2401
  }
2159
2402
 
2403
+ // src/theme/gradients.ts
2404
+ function linearGradient(from, to, angle = 180, mode = "dark") {
2405
+ return {
2406
+ backgroundImage: `linear-gradient(${angle}deg, ${resolveColor(from, mode)}, ${resolveColor(to, mode)})`
2407
+ };
2408
+ }
2409
+ var surfaceGradient = {
2410
+ /** Chrome bands (top bar, headers): elevated → base, a subtle dark wash. */
2411
+ chrome: (mode = "dark") => linearGradient("surface-elevated", "background-base", 180, mode)
2412
+ };
2413
+
2160
2414
  // src/theme/presets/apply.ts
2161
2415
  function colorKeyToVar(key) {
2162
2416
  return `--color-${key}`;
@@ -2531,7 +2785,8 @@ var colorStyles = {
2531
2785
  success: "bg-status-success",
2532
2786
  error: "bg-status-error",
2533
2787
  warning: "bg-status-warning",
2534
- info: "bg-status-info"
2788
+ info: "bg-status-info",
2789
+ "error-vivid": "bg-status-error-vivid"
2535
2790
  };
2536
2791
  function Indicator({
2537
2792
  size = "sm",
@@ -2539,14 +2794,40 @@ function Indicator({
2539
2794
  customColor,
2540
2795
  glow = false,
2541
2796
  ring = false,
2797
+ pulse = false,
2542
2798
  className,
2543
2799
  style,
2544
2800
  ...props
2545
2801
  }) {
2802
+ const pulseMode = pulse === true ? "opacity" : pulse || false;
2803
+ const colorClass = !customColor ? colorStyles[color] : void 0;
2804
+ const colorStyle = customColor ? { backgroundColor: customColor } : void 0;
2805
+ if (pulseMode === "ping") {
2806
+ return /* @__PURE__ */ jsxs(View, { className: cn("relative", sizeStyles3[size], className), style, ...props, children: [
2807
+ /* @__PURE__ */ jsx(
2808
+ View,
2809
+ {
2810
+ className: cn("absolute inset-0 rounded-full animate-ping", colorClass),
2811
+ style: colorStyle
2812
+ }
2813
+ ),
2814
+ /* @__PURE__ */ jsx(
2815
+ View,
2816
+ {
2817
+ className: cn(
2818
+ "relative rounded-full",
2819
+ sizeStyles3[size],
2820
+ colorClass,
2821
+ ring && "border-2 border-background-base"
2822
+ ),
2823
+ style: colorStyle
2824
+ }
2825
+ )
2826
+ ] });
2827
+ }
2546
2828
  const dynamicStyle = {
2547
2829
  ...typeof style === "object" ? style : {},
2548
- ...customColor ? { backgroundColor: customColor } : {},
2549
- ...glow && !customColor ? {} : {},
2830
+ ...colorStyle ?? {},
2550
2831
  ...glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}
2551
2832
  };
2552
2833
  return /* @__PURE__ */ jsx(
@@ -2555,12 +2836,14 @@ function Indicator({
2555
2836
  className: cn(
2556
2837
  "rounded-full shrink-0",
2557
2838
  sizeStyles3[size],
2558
- !customColor && colorStyles[color],
2839
+ colorClass,
2840
+ pulseMode === "opacity" && "animate-pulse",
2559
2841
  ring && "border-2 border-background-base",
2560
- glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(20,184,166,0.6)]",
2842
+ glow && !customColor && color === "success" && "shadow-[0_0_6px_rgba(46,213,115,0.6)]",
2561
2843
  glow && !customColor && color === "error" && "shadow-[0_0_6px_rgba(239,68,68,0.6)]",
2562
2844
  glow && !customColor && color === "warning" && "shadow-[0_0_6px_rgba(245,158,11,0.6)]",
2563
2845
  glow && !customColor && color === "primary" && "shadow-[0_0_6px_rgba(255,121,0,0.6)]",
2846
+ glow && !customColor && color === "error-vivid" && "shadow-[0_0_6px_rgba(255,71,87,0.6)]",
2564
2847
  className
2565
2848
  ),
2566
2849
  style: Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style,
@@ -2641,6 +2924,13 @@ function Badge({
2641
2924
  function BadgeText({ children, className }) {
2642
2925
  return /* @__PURE__ */ jsx(Text, { className: cn("text-inherit font-medium", className), children });
2643
2926
  }
2927
+
2928
+ // src/theme/extracted-colors-ui.ts
2929
+ var SPINNER_PRIMARY = primitiveRamps.cyan[600];
2930
+ var SPINNER_SECONDARY = primitiveRamps.green[400];
2931
+ var AVATAR_CATEGORICAL_COLORS = categoricalPalette.default;
2932
+
2933
+ // src/components/ui/spinner/Spinner.tsx
2644
2934
  var sizeMap = {
2645
2935
  sm: "small",
2646
2936
  md: "small",
@@ -2648,8 +2938,8 @@ var sizeMap = {
2648
2938
  xl: "large"
2649
2939
  };
2650
2940
  var colorMap = {
2651
- primary: "#5048E5",
2652
- secondary: "#10B981",
2941
+ primary: SPINNER_PRIMARY,
2942
+ secondary: SPINNER_SECONDARY,
2653
2943
  white: "#FFFFFF",
2654
2944
  default: "#6B7280"
2655
2945
  };
@@ -2685,15 +2975,7 @@ function Spinner({
2685
2975
  }
2686
2976
 
2687
2977
  // src/utils/avatar-color.ts
2688
- var AVATAR_COLORS = [
2689
- "#FF6B6B",
2690
- "#4ECDC4",
2691
- "#45B7D1",
2692
- "#96CEB4",
2693
- "#FFEAA7",
2694
- "#DDA0DD",
2695
- "#98D8C8"
2696
- ];
2978
+ var AVATAR_COLORS = AVATAR_CATEGORICAL_COLORS;
2697
2979
  function avatarColor(name) {
2698
2980
  let hash = 0;
2699
2981
  for (let i = 0; i < name.length; i++) {
@@ -4338,7 +4620,7 @@ function ToolbarButton({
4338
4620
  const selected = isActive === void 0 ? isOpen : isActive;
4339
4621
  const showActive = isActive !== false;
4340
4622
  const getIconColor = () => {
4341
- if (isActive === true) return "#FF7900";
4623
+ if (isActive === true) return resolveColor("brand-primary");
4342
4624
  return showActive ? "#FFFFFF" : "#D1D1D1";
4343
4625
  };
4344
4626
  const getNeumorphicStyle = () => {
@@ -4981,7 +5263,7 @@ function ToastProvider({
4981
5263
  return id;
4982
5264
  }, [defaultDuration, maxToasts]);
4983
5265
  const removeToast = useCallback((id) => {
4984
- setToasts((prev) => prev.filter((t2) => t2.id !== id));
5266
+ setToasts((prev) => prev.filter((t12) => t12.id !== id));
4985
5267
  }, []);
4986
5268
  const removeAllToasts = useCallback(() => {
4987
5269
  setToasts([]);
@@ -5863,7 +6145,10 @@ var variantStyles4 = {
5863
6145
  subtitle2: "font-body text-sm font-medium leading-normal",
5864
6146
  caption: "font-body text-xs font-normal leading-loose",
5865
6147
  overline: "font-body text-xs font-semibold uppercase tracking-widest leading-relaxed",
5866
- button: "font-sans text-sm font-semibold leading-relaxed"
6148
+ button: "font-sans text-sm font-semibold leading-relaxed",
6149
+ // Monospace technical readouts (clocks, ids, metrics) and their all-caps label form.
6150
+ mono: "font-mono text-xs font-normal leading-normal",
6151
+ monoLabel: "font-mono text-xs font-bold uppercase tracking-wide leading-normal"
5867
6152
  };
5868
6153
  var colorStyles7 = {
5869
6154
  primary: "text-text-primary",
@@ -6552,7 +6837,7 @@ var colorStyles8 = {
6552
6837
  tertiary: "text-text-tertiary",
6553
6838
  inherit: ""
6554
6839
  };
6555
- function formatDate(value, format, isUTC) {
6840
+ function formatDate(value, format, isUTC, hour12, seconds) {
6556
6841
  const date = value instanceof Date ? value : new Date(value);
6557
6842
  if (isNaN(date.getTime())) {
6558
6843
  return "Invalid Date";
@@ -6602,6 +6887,12 @@ function formatDate(value, format, isUTC) {
6602
6887
  if (isUTC) {
6603
6888
  options.timeZone = "UTC";
6604
6889
  }
6890
+ if (hour12 !== void 0 && (options.hour !== void 0 || options.minute !== void 0)) {
6891
+ options.hour12 = hour12;
6892
+ }
6893
+ if (seconds && options.hour !== void 0) {
6894
+ options.second = "2-digit";
6895
+ }
6605
6896
  return new Intl.DateTimeFormat(void 0, options).format(date);
6606
6897
  }
6607
6898
  function getRelativeTime(date) {
@@ -6671,16 +6962,28 @@ function DateTime({
6671
6962
  format = "datetime",
6672
6963
  customFormat,
6673
6964
  isUTC = false,
6965
+ hour12,
6966
+ seconds,
6967
+ variant,
6968
+ live = false,
6969
+ refreshMs = 1e3,
6674
6970
  fallback = "-",
6675
6971
  color = "inherit",
6676
6972
  className,
6677
6973
  ...props
6678
6974
  }) {
6679
- if (value === null || value === void 0) {
6680
- return /* @__PURE__ */ jsx(Text, { className: cn(colorStyles8[color], className), ...props, children: fallback });
6975
+ const [now, setNow] = useState(() => Date.now());
6976
+ useEffect(() => {
6977
+ if (!live) return;
6978
+ const id = setInterval(() => setNow(Date.now()), refreshMs);
6979
+ return () => clearInterval(id);
6980
+ }, [live, refreshMs]);
6981
+ const effectiveValue = live ? now : value;
6982
+ const text = effectiveValue === null || effectiveValue === void 0 ? fallback : formatDate(effectiveValue, format, isUTC, hour12, seconds);
6983
+ if (variant) {
6984
+ return /* @__PURE__ */ jsx(Typography, { variant, color, className, ...props, children: text });
6681
6985
  }
6682
- const formattedDate = formatDate(value, format, isUTC);
6683
- return /* @__PURE__ */ jsx(Text, { className: cn(colorStyles8[color], className), ...props, children: formattedDate });
6986
+ return /* @__PURE__ */ jsx(Text, { className: cn(colorStyles8[color], className), ...props, children: text });
6684
6987
  }
6685
6988
  function formatDateTime(value, format = "datetime", isUTC = false, fallback = "-") {
6686
6989
  if (value === null || value === void 0) {
@@ -6816,58 +7119,6 @@ function BaseBadge({
6816
7119
  }
6817
7120
  return badge;
6818
7121
  }
6819
-
6820
- // src/components/custom/Workout/icons.tsx
6821
- function DumbbellIcon({
6822
- size = 24,
6823
- color = "currentColor",
6824
- fill = "none",
6825
- strokeWidth = 2
6826
- }) {
6827
- return /* @__PURE__ */ jsxs(
6828
- "svg",
6829
- {
6830
- width: size,
6831
- height: size,
6832
- viewBox: "0 0 24 24",
6833
- fill,
6834
- stroke: color,
6835
- strokeWidth,
6836
- strokeLinecap: "round",
6837
- strokeLinejoin: "round",
6838
- children: [
6839
- /* @__PURE__ */ jsx("path", { d: "M14.4 14.4 9.6 9.6" }),
6840
- /* @__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" }),
6841
- /* @__PURE__ */ jsx("path", { d: "m21.5 21.5-1.4-1.4" }),
6842
- /* @__PURE__ */ jsx("path", { d: "M3.9 3.9 2.5 2.5" }),
6843
- /* @__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" })
6844
- ]
6845
- }
6846
- );
6847
- }
6848
- function StarIcon({
6849
- size = 24,
6850
- color = "currentColor",
6851
- fill = "none",
6852
- strokeWidth = 2
6853
- }) {
6854
- return /* @__PURE__ */ jsx(
6855
- "svg",
6856
- {
6857
- width: size,
6858
- height: size,
6859
- viewBox: "0 0 24 24",
6860
- fill,
6861
- stroke: color,
6862
- strokeWidth,
6863
- strokeLinecap: "round",
6864
- strokeLinejoin: "round",
6865
- 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" })
6866
- }
6867
- );
6868
- }
6869
-
6870
- // src/components/custom/Workout/WeightBadge.tsx
6871
7122
  function WeightBadge({
6872
7123
  value,
6873
7124
  unit = "lbs",
@@ -6881,7 +7132,7 @@ function WeightBadge({
6881
7132
  ...props
6882
7133
  }) {
6883
7134
  const config = baseBadgeSizeConfig[size];
6884
- const textColor = isPr ? "#FF7900" : "#9CA3AF";
7135
+ const textColor = isPr ? getSemanticColors("dark")["brand-primary"] : "#9CA3AF";
6885
7136
  const iconColor = textColor;
6886
7137
  const repMaxClause = reps != null ? `${reps} rep max` : "Estimated one rep max";
6887
7138
  const deltaLabel = delta != null ? `, ${delta >= 0 ? "+" : ""}${delta}% change` : "";
@@ -6940,7 +7191,7 @@ function WeightBadge({
6940
7191
  fontFamily: '"Space Grotesk", sans-serif',
6941
7192
  fontSize: config.fontSize,
6942
7193
  marginLeft: 4,
6943
- color: delta >= 0 ? "#4caf50" : "#ef5350"
7194
+ color: delta >= 0 ? getSemanticColors("dark")["result-improve"] : getSemanticColors("dark")["result-degrade"]
6944
7195
  },
6945
7196
  testID: "weight-badge-delta",
6946
7197
  children: [
@@ -6954,6 +7205,7 @@ function WeightBadge({
6954
7205
  }
6955
7206
  );
6956
7207
  }
7208
+ var BRAND_PRIMARY = getSemanticColors("dark")["brand-primary"];
6957
7209
  var typeLabels = {
6958
7210
  e1rm: "PR e1RM",
6959
7211
  weight: "PR Weight",
@@ -6997,7 +7249,7 @@ function PrBadge({
6997
7249
  accessibilityLabel: `Personal record: ${resolvedLabel}`,
6998
7250
  testID: "pr-badge-star",
6999
7251
  ...props,
7000
- children: /* @__PURE__ */ jsx(StarIcon, { size: 14, color: "#FF7900", fill: "#FF7900", strokeWidth: 2 })
7252
+ children: /* @__PURE__ */ jsx(StarIcon, { size: 14, color: BRAND_PRIMARY, fill: BRAND_PRIMARY, strokeWidth: 2 })
7001
7253
  }
7002
7254
  ) : /* @__PURE__ */ jsx(
7003
7255
  BaseBadge,
@@ -7011,7 +7263,7 @@ function PrBadge({
7011
7263
  {
7012
7264
  style: {
7013
7265
  fontSize: 12,
7014
- color: "#FF7900",
7266
+ color: BRAND_PRIMARY,
7015
7267
  fontWeight: "700",
7016
7268
  fontFamily: "Inter, sans-serif"
7017
7269
  },
@@ -7036,17 +7288,18 @@ function PrBadge({
7036
7288
  }
7037
7289
  return badge;
7038
7290
  }
7291
+ var t = getSemanticColors("dark");
7039
7292
  var solidVariantColors = {
7040
- success: "#14B8A6",
7041
- warning: "#FFB020",
7042
- error: "#D14343",
7293
+ success: t["status-success"],
7294
+ warning: t["status-warning"],
7295
+ error: t["status-error"],
7043
7296
  neutral: "#6B7280"
7044
7297
  };
7045
7298
  var ringVariantStyles = {
7046
7299
  "on-track": {
7047
- backgroundColor: "rgba(20,184,166,0.15)",
7300
+ backgroundColor: "rgba(46,213,115,0.15)",
7048
7301
  borderWidth: 1,
7049
- borderColor: "rgba(20,184,166,0.3)"
7302
+ borderColor: "rgba(46,213,115,0.3)"
7050
7303
  },
7051
7304
  deviation: {
7052
7305
  backgroundColor: "rgba(245,158,11,0.15)",
@@ -7061,11 +7314,11 @@ var ringVariantStyles = {
7061
7314
  }
7062
7315
  };
7063
7316
  var glowStyles = {
7064
- success: { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
7317
+ success: { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
7065
7318
  warning: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
7066
7319
  error: { boxShadow: "0 0 4px rgba(239,68,68,0.4)" },
7067
7320
  neutral: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" },
7068
- "on-track": { boxShadow: "0 0 4px rgba(20,184,166,0.4)" },
7321
+ "on-track": { boxShadow: "0 0 4px rgba(46,213,115,0.4)" },
7069
7322
  deviation: { boxShadow: "0 0 4px rgba(245,158,11,0.4)" },
7070
7323
  future: { boxShadow: "0 0 4px rgba(107,114,128,0.4)" }
7071
7324
  };
@@ -7079,8 +7332,8 @@ var iconColors2 = {
7079
7332
  warning: "#6B4000",
7080
7333
  error: "#5C1A1A",
7081
7334
  neutral: "#D1D5DB",
7082
- "on-track": "#14B8A6",
7083
- deviation: "#FFB020",
7335
+ "on-track": t["status-success"],
7336
+ deviation: t["status-warning"],
7084
7337
  future: "#6B7280"
7085
7338
  };
7086
7339
  var sizeDimensions = {
@@ -7167,17 +7420,41 @@ var WORKOUT_TOKENS = {
7167
7420
  // Canonical 4-band performance scale — the single source for BOTH the
7168
7421
  // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction
7169
7422
  // is intentionally inverted between the two consumers: for velocity, green =
7170
- // fastest/best; for RPE, green = easiest. Each component maps its own
7171
- // thresholds onto these four colors. Kept as vivid data-viz values (distinct
7172
- // from the muted status tokens) and theme-independent, so — like the heatmap
7173
- // scale below — they are consumed inline as a JS import rather than CSS vars.
7174
- // A JS import also resolves on native RN, unlike var(--…) strings.
7423
+ // fastest/best; for RPE, green = easiest. This is the [0,1,2,4] subsample of
7424
+ // the canonical `sequentialEffort` primitive. The `orange` key is the band
7425
+ // label. Consumed inline (RN).
7175
7426
  scale: {
7176
- green: "#2ed573",
7177
- yellow: "#ffd43b",
7178
- orange: "#ffa502",
7179
- red: "#ff4757"
7427
+ green: sequentialEffort[0],
7428
+ yellow: sequentialEffort[1],
7429
+ orange: sequentialEffort[2],
7430
+ // gold band
7431
+ red: sequentialEffort[4]
7432
+ },
7433
+ // BodyMap volume heatmap — the canonical `divergingScale` (under → optimal →
7434
+ // over): a true diverging shape with a light green center, cool-blue under-
7435
+ // trained end and warm-red over-reaching end (colorblind-robust in lightness).
7436
+ heatmap: {
7437
+ // no training data
7438
+ under: divergingScale[0],
7439
+ // below MEV
7440
+ maintenance: divergingScale[1],
7441
+ // MEV to MAV
7442
+ productive: divergingScale[2],
7443
+ // optimal center — MAV to MRV
7444
+ approaching: divergingScale[3],
7445
+ // near MRV
7446
+ over: divergingScale[4]
7447
+ // over MRV
7180
7448
  },
7449
+ // Surface and border colors were removed here: those flip with the theme, so
7450
+ // components use the CSS custom properties (var(--color-surface-*/border-*))
7451
+ // directly. Only theme-independent data-viz values remain below.
7452
+ // Intensity bar specific — over-target tiers deepen along the red ramp.
7453
+ intensity: {
7454
+ over1: primitiveRamps.red[600],
7455
+ // matches status-error
7456
+ over2: primitiveRamps.red[700],
7457
+ over3: primitiveRamps.red[800]},
7181
7458
  // Placeholder strip
7182
7459
  placeholder: {
7183
7460
  fill: "#3A3A3A"
@@ -7352,7 +7629,7 @@ function getLuminance(color) {
7352
7629
  function getContrastText(backgroundColor) {
7353
7630
  return getLuminance(backgroundColor) === "light" ? "#000000" : "#FFFFFF";
7354
7631
  }
7355
- var t = getSemanticColors("dark");
7632
+ var t2 = getSemanticColors("dark");
7356
7633
  var TEMPO_PACING = {
7357
7634
  behindThresholdPct: 0.15,
7358
7635
  minPhaseDurationMs: 500
@@ -7369,9 +7646,9 @@ function getTempoFillPct(elapsedMs, targetMs) {
7369
7646
  }
7370
7647
  var PHASE_ORDER = ["concentric", "hold", "eccentric"];
7371
7648
  var PHASE_CONFIG = {
7372
- concentric: { label: "Con", color: t["status-success"], flex: 2 },
7373
- hold: { label: "Hold", color: t["brand-primary"], flex: 1 },
7374
- eccentric: { label: "Ecc", color: t["status-warning"], flex: 3 }
7649
+ concentric: { label: "Con", color: t2["status-success"], flex: 2 },
7650
+ hold: { label: "Hold", color: t2["brand-primary"], flex: 1 },
7651
+ eccentric: { label: "Ecc", color: t2["status-warning"], flex: 3 }
7375
7652
  };
7376
7653
  function TempoBar({
7377
7654
  activePhase,
@@ -7384,7 +7661,7 @@ function TempoBar({
7384
7661
  return /* @__PURE__ */ jsxs(View, { className, testID: "tempo-bar", ...props, children: [
7385
7662
  /* @__PURE__ */ jsx(View, { style: { flexDirection: "row", marginBottom: 4 }, children: PHASE_ORDER.map((phase) => {
7386
7663
  const config = PHASE_CONFIG[phase];
7387
- return /* @__PURE__ */ jsx(View, { style: { flex: config.flex, alignItems: "center" }, children: /* @__PURE__ */ jsx(Text, { style: { fontSize: 10, color: t["text-disabled"] }, children: config.label }) }, phase);
7664
+ return /* @__PURE__ */ jsx(View, { style: { flex: config.flex, alignItems: "center" }, children: /* @__PURE__ */ jsx(Text, { style: { fontSize: 10, color: t2["text-disabled"] }, children: config.label }) }, phase);
7388
7665
  }) }),
7389
7666
  /* @__PURE__ */ jsx(View, { style: { flexDirection: "row", gap: 2, height: 20 }, children: PHASE_ORDER.map((phase) => {
7390
7667
  const config = PHASE_CONFIG[phase];
@@ -7421,7 +7698,7 @@ function ActiveSegment({
7421
7698
  targetMs
7422
7699
  }) {
7423
7700
  const pacing = getTempoPacingState(phaseElapsedMs, targetMs);
7424
- const barColor = pacing === "behind" ? t["status-error"] : config.color;
7701
+ const barColor = pacing === "behind" ? t2["status-error"] : config.color;
7425
7702
  const fillPct = getTempoFillPct(phaseElapsedMs, targetMs);
7426
7703
  const label = targetMs ? `${formatDuration(phaseElapsedMs)} / ${formatDuration(targetMs)}` : formatDuration(phaseElapsedMs);
7427
7704
  return /* @__PURE__ */ jsxs(View, { style: { height: "100%", position: "relative" }, testID: `tempo-segment-active-${config.label}`, children: [
@@ -7485,15 +7762,14 @@ function formatDuration(ms) {
7485
7762
  }
7486
7763
 
7487
7764
  // src/components/custom/Workout/TempoDisplay.tsx
7765
+ var t3 = getSemanticColors("dark");
7488
7766
  var INTER = "Inter, sans-serif";
7489
7767
  var TEXT_TERTIARY = "#6B7280";
7490
- var STATUS_ERROR = "#D14343";
7768
+ var STATUS_ERROR = t3["status-error"];
7491
7769
  var phaseColors = {
7492
- eccentric: "#FFB020",
7493
- // status-warning (amber)
7770
+ eccentric: t3["status-warning"],
7494
7771
  pauseBottom: TEXT_TERTIARY,
7495
- concentric: "#14B8A6",
7496
- // status-success (teal)
7772
+ concentric: t3["status-success"],
7497
7773
  pauseTop: TEXT_TERTIARY,
7498
7774
  dash: TEXT_TERTIARY
7499
7775
  };
@@ -7758,12 +8034,13 @@ function TempoDisplay({
7758
8034
  }
7759
8035
  );
7760
8036
  }
8037
+ var t4 = getSemanticColors("dark");
7761
8038
  function getDotColor(deviation) {
7762
8039
  const abs = Math.abs(deviation);
7763
- if (deviation < -0.3) return "#14B8A6";
8040
+ if (deviation < -0.3) return t4["status-success"];
7764
8041
  if (abs <= 0.3) return "#6B7280";
7765
- if (abs <= 0.7) return "#FFB020";
7766
- return "#D14343";
8042
+ if (abs <= 0.7) return t4["status-warning"];
8043
+ return t4["status-error"];
7767
8044
  }
7768
8045
  function getDeviationDescription(deviation) {
7769
8046
  if (deviation < -0.3) return "lighter than planned";
@@ -7805,7 +8082,7 @@ function DeviationBar({
7805
8082
  width: resolvedWidth,
7806
8083
  borderRadius: 3,
7807
8084
  // react-native-web renders backgroundImage at runtime; not in RN ViewStyle types
7808
- 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%)"
8085
+ 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%)"
7809
8086
  }
7810
8087
  }
7811
8088
  ),
@@ -7831,23 +8108,24 @@ function DeviationBar({
7831
8108
  }
7832
8109
  );
7833
8110
  }
8111
+ var t5 = getSemanticColors("dark");
7834
8112
  var TRACK_BG = "#333333";
7835
8113
  var LABEL_COLOR = "#6B7280";
7836
8114
  var TARGET_LINE_COLOR = "rgba(33, 150, 243, 0.5)";
7837
8115
  var AT_TARGET_GLOW = "0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)";
7838
8116
  var ZONE = {
7839
- building: "#14B8A6",
7840
- // teal — below target ramp-up
7841
- approaching: "#FFB020",
7842
- // amber — nearing target
7843
- target: "#FF7900",
7844
- // brand — exactly at target
7845
- over1: "#D14343",
7846
- // red — mild over-target
7847
- over2: "#A62626",
7848
- // deep red — moderate over-target
7849
- over3: "#7A1C1C"
7850
- // darkest red — severe over-target
8117
+ building: t5["status-success"],
8118
+ // below target ramp-up
8119
+ approaching: t5["status-warning"],
8120
+ // nearing target
8121
+ target: t5["brand-primary"],
8122
+ // exactly at target
8123
+ over1: t5["status-error"],
8124
+ // mild over-target
8125
+ over2: WORKOUT_TOKENS.intensity.over2,
8126
+ // moderate over-target
8127
+ over3: WORKOUT_TOKENS.intensity.over3
8128
+ // severe over-target
7851
8129
  };
7852
8130
  var BULGE_SIZE = { 1: 8, 2: 10, 3: 11 };
7853
8131
  function zoneForPct(pct) {
@@ -8003,29 +8281,38 @@ function IntensityBar({
8003
8281
  }
8004
8282
  );
8005
8283
  }
8284
+
8285
+ // src/theme/extracted-colors-dataviz.ts
8286
+ var DATAVIZ_CATEGORICAL_PALETTE = categoricalPalette.default;
8287
+ var MESO_ACCENT_GRADIENT_DARK = primitiveRamps.orange[500];
8288
+ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
8289
+ var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
8290
+
8291
+ // src/components/custom/Workout/WorkoutPill.tsx
8292
+ var t6 = getSemanticColors("dark");
8006
8293
  var statusBgColors = {
8007
- completed: "rgba(20,184,166,0.15)",
8294
+ completed: "rgba(46,213,115,0.15)",
8008
8295
  current: "rgba(255,121,0,0.15)",
8009
8296
  next: "transparent",
8010
8297
  upcoming: "#1C1C1C",
8011
8298
  missed: "rgba(209,67,67,0.1)",
8012
- deload: "rgba(147,51,234,0.15)"
8299
+ deload: "rgba(186,41,150,0.15)"
8013
8300
  };
8014
8301
  var statusBorderStyles = {
8015
- completed: { borderWidth: 1, borderColor: "rgba(20,184,166,0.3)" },
8302
+ completed: { borderWidth: 1, borderColor: "rgba(46,213,115,0.3)" },
8016
8303
  current: { borderWidth: 1, borderColor: "rgba(255,121,0,0.3)" },
8017
8304
  next: { borderWidth: 1, borderColor: "rgba(255,121,0,0.4)" },
8018
8305
  upcoming: { borderWidth: 1, borderColor: "#1F1F1F" },
8019
8306
  missed: { borderWidth: 1, borderColor: "rgba(209,67,67,0.25)" },
8020
- deload: { borderWidth: 1, borderColor: "rgba(147,51,234,0.3)" }
8307
+ deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
8021
8308
  };
8022
8309
  var textColors = {
8023
- completed: "#14B8A6",
8024
- current: "#FF7900",
8025
- next: "#FF7900",
8310
+ completed: t6["status-success"],
8311
+ current: t6["brand-primary"],
8312
+ next: t6["brand-primary"],
8026
8313
  upcoming: "#6B7280",
8027
8314
  missed: "rgba(209,67,67,0.7)",
8028
- deload: "#9333ea"
8315
+ deload: WORKOUT_PILL_DELOAD
8029
8316
  };
8030
8317
  function usePulse(enabled) {
8031
8318
  const [opacity] = useState(() => new Animated.Value(1));
@@ -8500,12 +8787,13 @@ function VelocityStrip({
8500
8787
  }
8501
8788
  return stripContent;
8502
8789
  }
8790
+ var t7 = getSemanticColors("dark");
8503
8791
  var dotColorMap = {
8504
8792
  untrained: "#2C2C2C",
8505
- behind: "#406D87",
8506
- ontrack: "#14B8A6",
8507
- target: "#FF7900",
8508
- over: "#D14343"
8793
+ behind: t7["brand-secondary"],
8794
+ ontrack: t7["status-success"],
8795
+ target: t7["brand-primary"],
8796
+ over: t7["status-error"]
8509
8797
  };
8510
8798
  function MuscleGroupChip({
8511
8799
  name,
@@ -8577,7 +8865,7 @@ function MuscleGroupChip({
8577
8865
  }
8578
8866
  return content;
8579
8867
  }
8580
- var BRAND_PRIMARY = "#FF7900";
8868
+ var BRAND_PRIMARY2 = getSemanticColors("dark")["brand-primary"];
8581
8869
  function normalizeData(data, height) {
8582
8870
  if (data.length === 0) return [];
8583
8871
  const min = Math.min(...data);
@@ -8614,7 +8902,7 @@ function Sparkline({
8614
8902
  }
8615
8903
  );
8616
8904
  }
8617
- const resolvedColor = color ?? BRAND_PRIMARY;
8905
+ const resolvedColor = color ?? BRAND_PRIMARY2;
8618
8906
  const normalized = normalizeData(data, height);
8619
8907
  const stepX = data.length > 1 ? width / (data.length - 1) : 0;
8620
8908
  const dotSize = 3;
@@ -8793,7 +9081,7 @@ function SetRow({
8793
9081
  fontSize: 10,
8794
9082
  fontWeight: "700",
8795
9083
  fontFamily: "Inter, sans-serif",
8796
- color: "#ffa502",
9084
+ color: WORKOUT_TOKENS.scale.orange,
8797
9085
  backgroundColor: "rgba(255,165,2,0.12)",
8798
9086
  paddingVertical: 1,
8799
9087
  paddingHorizontal: 5,
@@ -8959,7 +9247,7 @@ function SetRow({
8959
9247
  }
8960
9248
  );
8961
9249
  }
8962
- var BRAND_PRIMARY2 = "#FF7900";
9250
+ var BRAND_PRIMARY3 = getSemanticColors("dark")["brand-primary"];
8963
9251
  var INPUT_CLASSNAME = "bg-surface-raised border-border-strong text-text-primary";
8964
9252
  var inputStyle = {
8965
9253
  fontSize: 14,
@@ -9088,7 +9376,7 @@ function InputBar({
9088
9376
  onPress: onRecord,
9089
9377
  disabled: !canRecord,
9090
9378
  style: ({ pressed }) => ({
9091
- backgroundColor: BRAND_PRIMARY2,
9379
+ backgroundColor: BRAND_PRIMARY3,
9092
9380
  borderRadius: 8,
9093
9381
  paddingVertical: 10,
9094
9382
  paddingHorizontal: 16,
@@ -9115,7 +9403,7 @@ function InputBar({
9115
9403
  }
9116
9404
  );
9117
9405
  }
9118
- var BRAND_PRIMARY3 = "#FF7900";
9406
+ var BRAND_PRIMARY4 = getSemanticColors("dark")["brand-primary"];
9119
9407
  function RestTimer({
9120
9408
  totalSeconds,
9121
9409
  elapsedMs,
@@ -9221,7 +9509,7 @@ function RestTimer({
9221
9509
  {
9222
9510
  style: {
9223
9511
  height: "100%",
9224
- backgroundColor: BRAND_PRIMARY3,
9512
+ backgroundColor: BRAND_PRIMARY4,
9225
9513
  borderRadius: 2,
9226
9514
  width: `${progressPct}%`
9227
9515
  },
@@ -9278,7 +9566,7 @@ function RestTimer({
9278
9566
  fontSize: 11,
9279
9567
  fontFamily: "Inter, sans-serif",
9280
9568
  fontWeight: "600",
9281
- color: BRAND_PRIMARY3
9569
+ color: BRAND_PRIMARY4
9282
9570
  },
9283
9571
  children: "Skip"
9284
9572
  }
@@ -9671,7 +9959,7 @@ function ExerciseCard(props) {
9671
9959
  }
9672
9960
  var DEFAULTS = {
9673
9961
  label: "SS",
9674
- color: "#FF7900",
9962
+ color: getSemanticColors("dark")["brand-primary"],
9675
9963
  bgBase: "#101010"
9676
9964
  };
9677
9965
  function SupersetWrapper({
@@ -9722,9 +10010,9 @@ function SupersetWrapper({
9722
10010
  }
9723
10011
  );
9724
10012
  }
9725
- var BRAND_PRIMARY4 = "#FF7900";
10013
+ var BRAND_PRIMARY5 = getSemanticColors("dark")["brand-primary"];
9726
10014
  var segmentBgColors = {
9727
- completed: "rgba(20,184,166,0.3)",
10015
+ completed: "rgba(46,213,115,0.3)",
9728
10016
  current: "rgba(255,121,0,0.5)",
9729
10017
  upcoming: "rgba(255,255,255,0.06)"
9730
10018
  };
@@ -9774,7 +10062,7 @@ function MesoSegment({ meso, isActive, onPress }) {
9774
10062
  },
9775
10063
  isActive ? {
9776
10064
  borderWidth: 2,
9777
- borderColor: BRAND_PRIMARY4,
10065
+ borderColor: BRAND_PRIMARY5,
9778
10066
  transform: [{ scale: 1.02 }, { scale: pressScale }]
9779
10067
  } : void 0
9780
10068
  ],
@@ -9788,7 +10076,7 @@ function MesoSegment({ meso, isActive, onPress }) {
9788
10076
  top: 0,
9789
10077
  bottom: 0,
9790
10078
  width: `${progress * 100}%`,
9791
- backgroundColor: BRAND_PRIMARY4
10079
+ backgroundColor: BRAND_PRIMARY5
9792
10080
  },
9793
10081
  testID: `meso-segment-fill-${meso.id}`
9794
10082
  }
@@ -9829,7 +10117,7 @@ function MesoProgressBar({
9829
10117
  }
9830
10118
  );
9831
10119
  }
9832
- var BRAND_PRIMARY5 = "#FF7900";
10120
+ var BRAND_PRIMARY6 = getSemanticColors("dark")["brand-primary"];
9833
10121
  function WeekRow({
9834
10122
  weekNumber,
9835
10123
  totalWeeks,
@@ -9849,12 +10137,12 @@ function WeekRow({
9849
10137
  gap: 12
9850
10138
  };
9851
10139
  if (isDeload) {
9852
- rowStyle.backgroundColor = "rgba(147,51,234,0.06)";
10140
+ rowStyle.backgroundColor = "rgba(186,41,150,0.06)";
9853
10141
  }
9854
10142
  if (isCurrent) {
9855
10143
  rowStyle.backgroundColor = "rgba(255,121,0,0.04)";
9856
10144
  rowStyle.borderLeftWidth = 2;
9857
- rowStyle.borderLeftColor = BRAND_PRIMARY5;
10145
+ rowStyle.borderLeftColor = BRAND_PRIMARY6;
9858
10146
  }
9859
10147
  return /* @__PURE__ */ jsxs(
9860
10148
  View,
@@ -9878,7 +10166,7 @@ function WeekRow({
9878
10166
  width: 6,
9879
10167
  height: 6,
9880
10168
  borderRadius: 3,
9881
- backgroundColor: BRAND_PRIMARY5
10169
+ backgroundColor: BRAND_PRIMARY6
9882
10170
  },
9883
10171
  accessibilityElementsHidden: true,
9884
10172
  testID: "week-row-current-dot"
@@ -9892,7 +10180,7 @@ function WeekRow({
9892
10180
  fontSize: 13,
9893
10181
  fontWeight: "700",
9894
10182
  fontFamily: "Inter, sans-serif",
9895
- color: isCurrent ? BRAND_PRIMARY5 : void 0
10183
+ color: isCurrent ? BRAND_PRIMARY6 : void 0
9896
10184
  },
9897
10185
  accessibilityElementsHidden: true,
9898
10186
  children: `W${weekNumber}`
@@ -9931,9 +10219,10 @@ function WeekRow({
9931
10219
  }
9932
10220
  );
9933
10221
  }
10222
+ var t8 = getSemanticColors("dark");
9934
10223
  var COLORS = {
9935
- statusSuccess: "#14B8A6",
9936
- brandPrimary: "#FF7900",
10224
+ statusSuccess: t8["status-success"],
10225
+ brandPrimary: t8["brand-primary"],
9937
10226
  borderDefault: "#1F1F1F",
9938
10227
  brandPrimarySubtle: "rgba(255,121,0,0.06)"
9939
10228
  };
@@ -10075,11 +10364,11 @@ function WorkoutCard({
10075
10364
  }
10076
10365
  );
10077
10366
  }
10078
- var BRAND_PRIMARY6 = "#FF7900";
10079
- var BRAND_PRIMARY_DARK = "#C45E00";
10080
- var BRAND_PRIMARY_LIGHT = "#FFB066";
10367
+ var BRAND_PRIMARY7 = getSemanticColors("dark")["brand-primary"];
10368
+ var BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK;
10369
+ var BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT;
10081
10370
  var BORDER_DEFAULT = "#1F1F1F";
10082
- var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY6, BRAND_PRIMARY_LIGHT];
10371
+ var ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY7, BRAND_PRIMARY_LIGHT];
10083
10372
  function heatmapColor(percentage) {
10084
10373
  const clamped = Math.max(0, Math.min(100, percentage));
10085
10374
  const opacity = 0.12 + clamped / 100 * 0.78;
@@ -10114,7 +10403,7 @@ function MesoCard({
10114
10403
  }, [highlighted, highlight]);
10115
10404
  const borderColor = highlight.interpolate({
10116
10405
  inputRange: [0, 1],
10117
- outputRange: [BORDER_DEFAULT, BRAND_PRIMARY6]
10406
+ outputRange: [BORDER_DEFAULT, BRAND_PRIMARY7]
10118
10407
  });
10119
10408
  const header = /* @__PURE__ */ jsxs(View, { style: { paddingHorizontal: 14, paddingTop: 12, paddingBottom: 10 }, testID: "meso-card-body", children: [
10120
10409
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 8 }, testID: "meso-card-header", children: [
@@ -10174,7 +10463,7 @@ function MesoCard({
10174
10463
  {
10175
10464
  variant: "outline",
10176
10465
  elevation: 2,
10177
- borderColor: highlighted ? BRAND_PRIMARY6 : BORDER_DEFAULT,
10466
+ borderColor: highlighted ? BRAND_PRIMARY7 : BORDER_DEFAULT,
10178
10467
  className,
10179
10468
  style: [
10180
10469
  { borderColor },
@@ -10231,9 +10520,9 @@ function MesoCard({
10231
10520
  }
10232
10521
  ) });
10233
10522
  }
10234
- var BRAND_PRIMARY7 = "#FF7900";
10235
- var RECENT_BORDER = "rgba(255,176,32,0.3)";
10236
- var RECENT_GLOW = "0 0 12px rgba(255,176,32,0.06)";
10523
+ var BRAND_PRIMARY8 = getSemanticColors("dark")["brand-primary"];
10524
+ var RECENT_BORDER = "rgba(249,180,21,0.3)";
10525
+ var RECENT_GLOW = "0 0 12px rgba(249,180,21,0.06)";
10237
10526
  var BORDER_DEFAULT2 = resolveColor("border-default");
10238
10527
  var TYPE_LABELS = {
10239
10528
  e1rm: "e1RM",
@@ -10273,7 +10562,7 @@ function PrRecordRow({ record, index }) {
10273
10562
  },
10274
10563
  testID: `pr-history-modal-record-${index}`,
10275
10564
  children: [
10276
- /* @__PURE__ */ jsx(StarIcon, { size: 16, color: BRAND_PRIMARY7, fill: BRAND_PRIMARY7, strokeWidth: 2 }),
10565
+ /* @__PURE__ */ jsx(StarIcon, { size: 16, color: BRAND_PRIMARY8, fill: BRAND_PRIMARY8, strokeWidth: 2 }),
10277
10566
  /* @__PURE__ */ jsx(
10278
10567
  Text,
10279
10568
  {
@@ -10417,11 +10706,12 @@ function PrHistoryModal({
10417
10706
  }
10418
10707
  );
10419
10708
  }
10420
- var BRAND_PRIMARY8 = "#FF7900";
10709
+ var t9 = getSemanticColors("dark");
10710
+ var BRAND_PRIMARY9 = t9["brand-primary"];
10421
10711
  var BRAND_PRIMARY_SUBTLE = "rgba(255,121,0,0.12)";
10422
- var STATUS_SUCCESS = "#14B8A6";
10423
- var STATUS_WARNING = "#FFB020";
10424
- var STATUS_ERROR2 = "#D14343";
10712
+ var STATUS_SUCCESS = t9["status-success"];
10713
+ var STATUS_WARNING = t9["status-warning"];
10714
+ var STATUS_ERROR2 = t9["status-error"];
10425
10715
  var EMOJI_SETS = {
10426
10716
  sleep: ["\u{1F634}", "\u{1F610}", "\u{1F642}", "\u{1F60A}", "\u{1F929}"],
10427
10717
  soreness: ["\u{1F635}", "\u{1F623}", "\u{1F610}", "\u{1F642}", "\u{1F4AA}"],
@@ -10485,7 +10775,7 @@ function EmojiSlider({ factor }) {
10485
10775
  paddingVertical: 8,
10486
10776
  borderRadius: 8,
10487
10777
  borderWidth: 1,
10488
- borderColor: selected ? BRAND_PRIMARY8 : void 0,
10778
+ borderColor: selected ? BRAND_PRIMARY9 : void 0,
10489
10779
  backgroundColor: selected ? BRAND_PRIMARY_SUBTLE : void 0,
10490
10780
  opacity: selected ? 1 : pressed ? 0.8 : 0.55,
10491
10781
  transform: [{ scale: selected ? 1.06 : 1 }]
@@ -10601,7 +10891,7 @@ function ReadinessCheck({
10601
10891
  marginTop: 16,
10602
10892
  width: "100%",
10603
10893
  alignItems: "center",
10604
- backgroundColor: BRAND_PRIMARY8,
10894
+ backgroundColor: BRAND_PRIMARY9,
10605
10895
  borderRadius: 8,
10606
10896
  paddingVertical: 12,
10607
10897
  opacity: pressed ? 0.8 : 1
@@ -10611,18 +10901,19 @@ function ReadinessCheck({
10611
10901
  )
10612
10902
  ] }) });
10613
10903
  }
10614
- var BRAND_PRIMARY9 = "#FF7900";
10615
- var BRAND_PRIMARY_DARK2 = "#C45E00";
10616
- var BRAND_PRIMARY_LIGHT2 = "#FFB066";
10617
- var SUCCESS = "#14B8A6";
10618
- var WARNING = "#FFB020";
10619
- var ERROR = "#D14343";
10620
- var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY9, BRAND_PRIMARY_LIGHT2];
10904
+ var t10 = getSemanticColors("dark");
10905
+ var BRAND_PRIMARY10 = t10["brand-primary"];
10906
+ var BRAND_PRIMARY_DARK2 = MESO_ACCENT_GRADIENT_DARK;
10907
+ var BRAND_PRIMARY_LIGHT2 = MESO_ACCENT_GRADIENT_LIGHT;
10908
+ var SUCCESS = t10["status-success"];
10909
+ var WARNING = t10["status-warning"];
10910
+ var ERROR = t10["status-error"];
10911
+ var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY10, BRAND_PRIMARY_LIGHT2];
10621
10912
  var CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor("surface-elevated")} 0%, ${resolveColor("surface-raised")} 100%)`;
10622
- 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%)";
10913
+ 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%)";
10623
10914
  var STATUS_VARIANTS = {
10624
- success: { bg: "rgba(20,184,166,0.15)", border: "rgba(20,184,166,0.3)", text: SUCCESS },
10625
- warning: { bg: "rgba(255,176,32,0.15)", border: "rgba(255,176,32,0.3)", text: WARNING },
10915
+ success: { bg: "rgba(46,213,115,0.15)", border: "rgba(46,213,115,0.3)", text: SUCCESS },
10916
+ warning: { bg: "rgba(249,180,21,0.15)", border: "rgba(249,180,21,0.3)", text: WARNING },
10626
10917
  error: { bg: "rgba(209,67,67,0.15)", border: "rgba(209,67,67,0.25)", text: ERROR }
10627
10918
  };
10628
10919
  function clamp01(value) {
@@ -10914,9 +11205,9 @@ function MesoStatusCard({
10914
11205
  View,
10915
11206
  {
10916
11207
  style: {
10917
- backgroundColor: "rgba(255,176,32,0.06)",
11208
+ backgroundColor: "rgba(249,180,21,0.06)",
10918
11209
  borderWidth: 1,
10919
- borderColor: "rgba(255,176,32,0.15)",
11210
+ borderColor: "rgba(249,180,21,0.15)",
10920
11211
  borderRadius: 8,
10921
11212
  paddingVertical: 10,
10922
11213
  paddingHorizontal: 12
@@ -10942,9 +11233,9 @@ function MesoStatusCard({
10942
11233
  className: "flex-row items-center",
10943
11234
  style: {
10944
11235
  gap: 8,
10945
- backgroundColor: "rgba(20,184,166,0.06)",
11236
+ backgroundColor: "rgba(46,213,115,0.06)",
10946
11237
  borderWidth: 1,
10947
- borderColor: "rgba(20,184,166,0.2)",
11238
+ borderColor: "rgba(46,213,115,0.2)",
10948
11239
  borderRadius: 8,
10949
11240
  paddingVertical: 10,
10950
11241
  paddingHorizontal: 12
@@ -10973,21 +11264,22 @@ function MesoStatusCard({
10973
11264
  }
10974
11265
  );
10975
11266
  }
10976
- var BRAND_PRIMARY10 = "#FF7900";
11267
+ var sem = getSemanticColors("dark");
11268
+ var BRAND_PRIMARY11 = sem["brand-primary"];
10977
11269
  var PROJECTION_LINE_COLOR = resolveColor("text-tertiary");
10978
- var STATUS_SUCCESS2 = "#14B8A6";
10979
- var STATUS_ERROR3 = "#D14343";
10980
- var STATUS_WARNING2 = "#FFB020";
11270
+ var STATUS_SUCCESS2 = sem["status-success"];
11271
+ var STATUS_ERROR3 = sem["status-error"];
11272
+ var STATUS_WARNING2 = sem["status-warning"];
10981
11273
  var GRID_LINE = "rgba(255,255,255,0.06)";
10982
- var SUCCESS_PILL_BG = "rgba(20,184,166,0.10)";
10983
- var SUCCESS_PILL_BORDER = "rgba(20,184,166,0.20)";
11274
+ var SUCCESS_PILL_BG = "rgba(46,213,115,0.10)";
11275
+ var SUCCESS_PILL_BORDER = "rgba(46,213,115,0.20)";
10984
11276
  var ERROR_PILL_BG = "rgba(209,67,67,0.10)";
10985
11277
  var ERROR_PILL_BORDER = "rgba(209,67,67,0.20)";
10986
11278
  var PLOT_LEFT = 26;
10987
11279
  var TOOLTIP_WIDTH = 124;
10988
11280
  function timeOf(dateStr) {
10989
- const t2 = Date.parse(dateStr);
10990
- return Number.isNaN(t2) ? 0 : t2;
11281
+ const t12 = Date.parse(dateStr);
11282
+ return Number.isNaN(t12) ? 0 : t12;
10991
11283
  }
10992
11284
  function formatValue(value) {
10993
11285
  return `${Math.round(value)}`;
@@ -11264,7 +11556,7 @@ function StrengthTrendChart({
11264
11556
  ChartLine,
11265
11557
  {
11266
11558
  coords: geometry.actual,
11267
- color: BRAND_PRIMARY10,
11559
+ color: BRAND_PRIMARY11,
11268
11560
  strokeWidth: 2.5,
11269
11561
  testID: "strength-trend-chart-actual-segment"
11270
11562
  }
@@ -11317,7 +11609,7 @@ function StrengthTrendChart({
11317
11609
  width: 8,
11318
11610
  height: 8,
11319
11611
  borderRadius: 1,
11320
- backgroundColor: BRAND_PRIMARY10
11612
+ backgroundColor: BRAND_PRIMARY11
11321
11613
  }
11322
11614
  },
11323
11615
  `point-${c.index}`
@@ -11447,7 +11739,7 @@ function StrengthTrendChart({
11447
11739
  testID: "strength-trend-chart-legend",
11448
11740
  children: [
11449
11741
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 5 }, children: [
11450
- /* @__PURE__ */ jsx(View, { style: { width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY10 } }),
11742
+ /* @__PURE__ */ jsx(View, { style: { width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY11 } }),
11451
11743
  /* @__PURE__ */ jsx(Text, { className: "text-text-secondary", style: { fontSize: 10, fontFamily: "Inter, sans-serif" }, children: "Actual" })
11452
11744
  ] }),
11453
11745
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 5 }, children: [
@@ -11476,13 +11768,14 @@ function StrengthTrendChart({
11476
11768
  }
11477
11769
  );
11478
11770
  }
11479
- var STATUS_SUCCESS3 = "#14B8A6";
11480
- var STATUS_WARNING3 = "#FFB020";
11481
- var STATUS_INFO = "#2196F3";
11771
+ var t11 = getSemanticColors("dark");
11772
+ var STATUS_SUCCESS3 = t11["status-success"];
11773
+ var STATUS_WARNING3 = t11["status-warning"];
11774
+ var STATUS_INFO = t11["status-info"];
11482
11775
  var DOT_BORDER = "#F3F4F6";
11483
- var BAND_FILL = "rgba(20,184,166,0.1)";
11484
- var BAND_EDGE = "rgba(20,184,166,0.45)";
11485
- var PROJECTION_FILL = "rgba(20,184,166,0.05)";
11776
+ var BAND_FILL = "rgba(46,213,115,0.1)";
11777
+ var BAND_EDGE = "rgba(46,213,115,0.45)";
11778
+ var PROJECTION_FILL = "rgba(46,213,115,0.05)";
11486
11779
  var PADDING_LEFT = 28;
11487
11780
  var PADDING_RIGHT = 10;
11488
11781
  var PADDING_TOP = 8;
@@ -11521,8 +11814,8 @@ function interpEdge(pixels, x, key) {
11521
11814
  const a = pixels[i];
11522
11815
  const b = pixels[i + 1];
11523
11816
  if (x >= a.x && x <= b.x) {
11524
- const t2 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
11525
- return a[key] + t2 * (b[key] - a[key]);
11817
+ const t12 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
11818
+ return a[key] + t12 * (b[key] - a[key]);
11526
11819
  }
11527
11820
  }
11528
11821
  return pixels[pixels.length - 1][key];
@@ -11852,16 +12145,7 @@ function CapacityBandChart({
11852
12145
  }
11853
12146
  );
11854
12147
  }
11855
- var PALETTE = [
11856
- "#5B9BD5",
11857
- "#14B8A6",
11858
- "#F4A736",
11859
- "#F83030",
11860
- "#823CA0",
11861
- "#D4A520",
11862
- "#406D87",
11863
- "#43C6B7"
11864
- ];
12148
+ var PALETTE = DATAVIZ_CATEGORICAL_PALETTE;
11865
12149
  function scaleValue(v, scale) {
11866
12150
  if (v <= 0) return 0;
11867
12151
  if (scale === "sqrt") return Math.sqrt(v);
@@ -11977,16 +12261,7 @@ function Treemap({
11977
12261
  );
11978
12262
  }) });
11979
12263
  }
11980
- var PALETTE2 = [
11981
- "#5B9BD5",
11982
- "#14B8A6",
11983
- "#F4A736",
11984
- "#F83030",
11985
- "#823CA0",
11986
- "#D4A520",
11987
- "#406D87",
11988
- "#43C6B7"
11989
- ];
12264
+ var PALETTE2 = DATAVIZ_CATEGORICAL_PALETTE;
11990
12265
  var GRID_LINE2 = "rgba(255,255,255,0.07)";
11991
12266
  var AXIS_LINE = "rgba(255,255,255,0.18)";
11992
12267
  var DIAGONAL_LINE = "rgba(255,255,255,0.28)";
@@ -12076,28 +12351,28 @@ function Scatter({
12076
12351
  testID: "scatter-canvas",
12077
12352
  style: { position: "absolute", top: 0, left: 0, width, height, overflow: "hidden" },
12078
12353
  children: [
12079
- ticksOf(yd, TICK_COUNT).map((t2, i) => {
12080
- const y = toY(t2);
12354
+ ticksOf(yd, TICK_COUNT).map((t12, i) => {
12355
+ const y = toY(t12);
12081
12356
  return /* @__PURE__ */ jsx(
12082
12357
  View,
12083
12358
  {
12084
12359
  accessibilityElementsHidden: true,
12085
12360
  testID: "scatter-gridline-y",
12086
12361
  style: { position: "absolute", left: PLOT_LEFT2, width: innerW, top: y, height: 1, backgroundColor: GRID_LINE2 },
12087
- children: /* @__PURE__ */ jsx(Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", left: -PLOT_LEFT2, top: -6, width: PLOT_LEFT2 - 6, textAlign: "right" }, children: formatTick(t2) })
12362
+ children: /* @__PURE__ */ jsx(Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", left: -PLOT_LEFT2, top: -6, width: PLOT_LEFT2 - 6, textAlign: "right" }, children: formatTick(t12) })
12088
12363
  },
12089
12364
  `y-${i}`
12090
12365
  );
12091
12366
  }),
12092
- ticksOf(xd, TICK_COUNT).map((t2, i) => {
12093
- const x = toX(t2);
12367
+ ticksOf(xd, TICK_COUNT).map((t12, i) => {
12368
+ const x = toX(t12);
12094
12369
  return /* @__PURE__ */ jsx(
12095
12370
  View,
12096
12371
  {
12097
12372
  accessibilityElementsHidden: true,
12098
12373
  testID: "scatter-gridline-x",
12099
12374
  style: { position: "absolute", top: PLOT_TOP, height: innerH, left: x, width: 1, backgroundColor: GRID_LINE2 },
12100
- children: /* @__PURE__ */ jsx(Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t2) })
12375
+ children: /* @__PURE__ */ jsx(Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t12) })
12101
12376
  },
12102
12377
  `x-${i}`
12103
12378
  );
@@ -12157,9 +12432,10 @@ function Scatter({
12157
12432
  }) })
12158
12433
  ] });
12159
12434
  }
12160
- var STATUS_SUCCESS4 = "#14B8A6";
12161
- var STATUS_WARNING4 = "#FFB020";
12162
- var STATUS_ERROR4 = "#D14343";
12435
+ var sem2 = getSemanticColors("dark");
12436
+ var STATUS_SUCCESS4 = sem2["status-success"];
12437
+ var STATUS_WARNING4 = sem2["status-warning"];
12438
+ var STATUS_ERROR4 = sem2["status-error"];
12163
12439
  var TRACK = "rgba(255,255,255,0.08)";
12164
12440
  var DEFAULT_THRESHOLDS = [
12165
12441
  { value: 0, color: STATUS_ERROR4 },
@@ -12231,23 +12507,23 @@ function Gauge2({
12231
12507
  testID: "gauge",
12232
12508
  ...props,
12233
12509
  children: [
12234
- ticks.map((t2) => /* @__PURE__ */ jsx(
12510
+ ticks.map((t12) => /* @__PURE__ */ jsx(
12235
12511
  View,
12236
12512
  {
12237
12513
  accessibilityElementsHidden: true,
12238
12514
  testID: "gauge-segment",
12239
12515
  style: {
12240
12516
  position: "absolute",
12241
- left: t2.left - tickThickness / 2,
12242
- top: t2.top - tickLength / 2,
12517
+ left: t12.left - tickThickness / 2,
12518
+ top: t12.top - tickLength / 2,
12243
12519
  width: tickThickness,
12244
12520
  height: tickLength,
12245
12521
  borderRadius: tickThickness / 2,
12246
- backgroundColor: t2.color,
12247
- transform: [{ rotate: t2.rotate }]
12522
+ backgroundColor: t12.color,
12523
+ transform: [{ rotate: t12.rotate }]
12248
12524
  }
12249
12525
  },
12250
- t2.key
12526
+ t12.key
12251
12527
  )),
12252
12528
  /* @__PURE__ */ jsxs(View, { style: { position: "absolute", top: 0, left: 0, width: size, height: size }, className: "items-center justify-center", children: [
12253
12529
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-baseline gap-0.5", children: [
@@ -12260,6 +12536,203 @@ function Gauge2({
12260
12536
  }
12261
12537
  );
12262
12538
  }
12539
+ function BrandLockup({
12540
+ subtitle = "wall dashboard",
12541
+ showSubtitle = true,
12542
+ className,
12543
+ ...props
12544
+ }) {
12545
+ return /* @__PURE__ */ jsxs(View, { className: cn("flex-row items-center gap-[7px]", className), ...props, children: [
12546
+ /* @__PURE__ */ jsx(View, { className: "text-brand-primary", children: /* @__PURE__ */ jsx(VoltrasMark, { size: 14, color: "currentColor" }) }),
12547
+ /* @__PURE__ */ jsx(
12548
+ Typography,
12549
+ {
12550
+ variant: "button",
12551
+ color: "primary",
12552
+ className: "text-[12px] font-extrabold tracking-[1.5px]",
12553
+ children: "VOLTRAS"
12554
+ }
12555
+ ),
12556
+ showSubtitle && subtitle ? /* @__PURE__ */ jsxs(
12557
+ Typography,
12558
+ {
12559
+ variant: "button",
12560
+ color: "tertiary",
12561
+ className: "text-[10px] font-semibold tracking-[0.4px]",
12562
+ children: [
12563
+ "/ ",
12564
+ subtitle
12565
+ ]
12566
+ }
12567
+ ) : null
12568
+ ] });
12569
+ }
12570
+ var stateConfig = {
12571
+ // live = vivid green with an expanding ring; rest = solid amber (no pulse — operator); idle is dim.
12572
+ live: { label: "LIVE", color: "success", pulse: "ping", textColor: "primary" },
12573
+ rest: { label: "REST", color: "warning", pulse: false, textColor: "primary" },
12574
+ idle: { label: "IDLE", color: "default", pulse: false, textColor: "secondary" }
12575
+ };
12576
+ function SessionStatePill({ state, label, className, ...props }) {
12577
+ const cfg = stateConfig[state];
12578
+ return /* @__PURE__ */ jsxs(View, { className: cn("flex-row items-center gap-2", className), ...props, children: [
12579
+ /* @__PURE__ */ jsx(Indicator, { size: "md", color: cfg.color, pulse: cfg.pulse }),
12580
+ /* @__PURE__ */ jsx(Typography, { variant: "monoLabel", color: cfg.textColor, className: "text-[11px]", children: label ?? cfg.label })
12581
+ ] });
12582
+ }
12583
+ var statusTextClass = {
12584
+ connected: "text-status-success",
12585
+ degraded: "text-status-warning",
12586
+ lost: "text-status-error-vivid"
12587
+ };
12588
+ function DeviceIndicator({
12589
+ status = "connected",
12590
+ onPress,
12591
+ label = "Devices",
12592
+ className,
12593
+ ...props
12594
+ }) {
12595
+ const Wrapper = onPress ? Pressable : View;
12596
+ return /* @__PURE__ */ jsx(
12597
+ Wrapper,
12598
+ {
12599
+ accessibilityLabel: label,
12600
+ ...onPress ? { onPress, accessibilityRole: "button" } : {},
12601
+ className: cn(
12602
+ "w-[26px] h-[28px] items-center justify-center rounded-[7px]",
12603
+ statusTextClass[status],
12604
+ className
12605
+ ),
12606
+ ...props,
12607
+ children: /* @__PURE__ */ jsx(BluetoothIcon, { size: 18, color: "currentColor", title: label })
12608
+ }
12609
+ );
12610
+ }
12611
+ var stateColor = {
12612
+ connected: "success",
12613
+ available: "info",
12614
+ degraded: "warning",
12615
+ lost: "error-vivid"
12616
+ };
12617
+ function DeviceRow({ device, onPress, className, ...props }) {
12618
+ const Wrapper = onPress ? Pressable : View;
12619
+ return /* @__PURE__ */ jsxs(
12620
+ Wrapper,
12621
+ {
12622
+ ...onPress ? { onPress, accessibilityRole: "button" } : {},
12623
+ className: cn("flex-row items-center gap-[10px] px-2 py-[9px] rounded-[7px]", className),
12624
+ ...props,
12625
+ children: [
12626
+ /* @__PURE__ */ jsx(Indicator, { size: "md", color: stateColor[device.state] }),
12627
+ /* @__PURE__ */ jsx(
12628
+ Typography,
12629
+ {
12630
+ variant: "body2",
12631
+ color: device.slot ? "primary" : "secondary",
12632
+ className: "flex-1 font-bold text-[12px]",
12633
+ children: device.nickname
12634
+ }
12635
+ ),
12636
+ /* @__PURE__ */ jsx(Typography, { variant: "mono", color: "tertiary", className: "text-[10px]", children: device.id })
12637
+ ]
12638
+ }
12639
+ );
12640
+ }
12641
+ function aggregateStatus(devices) {
12642
+ const bound = devices.filter((d) => d.slot);
12643
+ if (bound.some((d) => d.state === "lost")) return "lost";
12644
+ if (bound.some((d) => d.state === "degraded")) return "degraded";
12645
+ return "connected";
12646
+ }
12647
+ function DeviceMenu({
12648
+ devices,
12649
+ isOpen,
12650
+ onOpenChange,
12651
+ onSelectDevice,
12652
+ className
12653
+ }) {
12654
+ const status = aggregateStatus(devices);
12655
+ const boundCount = devices.filter((d) => d.slot).length;
12656
+ const availCount = devices.filter((d) => !d.slot).length;
12657
+ return /* @__PURE__ */ jsxs(Popover, { placement: "bottom", isOpen, onOpenChange, className, children: [
12658
+ /* @__PURE__ */ jsx(PopoverTrigger, { children: /* @__PURE__ */ jsx(DeviceIndicator, { status }) }),
12659
+ /* @__PURE__ */ jsxs(PopoverContent, { className: "right-0 left-auto mt-[10px] w-[326px] bg-surface-elevated border border-border-strong rounded-[10px] p-[7px]", children: [
12660
+ /* @__PURE__ */ jsxs(
12661
+ Typography,
12662
+ {
12663
+ variant: "monoLabel",
12664
+ color: "tertiary",
12665
+ className: "text-[9px] tracking-[0.8px] px-2 pt-[6px] pb-2",
12666
+ children: [
12667
+ "Devices \u2014 ",
12668
+ boundCount,
12669
+ " bound \xB7 ",
12670
+ availCount,
12671
+ " available"
12672
+ ]
12673
+ }
12674
+ ),
12675
+ devices.map((device, i) => /* @__PURE__ */ jsx(View, { className: cn(i > 0 && "border-t border-border"), children: /* @__PURE__ */ jsx(
12676
+ DeviceRow,
12677
+ {
12678
+ device,
12679
+ onPress: onSelectDevice ? () => onSelectDevice(device) : void 0
12680
+ }
12681
+ ) }, device.id))
12682
+ ] })
12683
+ ] });
12684
+ }
12685
+ var SUBTITLE_MIN = 1024;
12686
+ var CLOCK_MIN = 720;
12687
+ function TopBar({
12688
+ state,
12689
+ devices,
12690
+ time,
12691
+ subtitle = "wall dashboard",
12692
+ showSubtitle,
12693
+ showClock,
12694
+ onSelectDevice,
12695
+ className
12696
+ }) {
12697
+ const [width, setWidth] = useState(SUBTITLE_MIN);
12698
+ const onLayout = (e) => setWidth(e.nativeEvent.layout.width);
12699
+ const subtitleVisible = showSubtitle ?? width >= SUBTITLE_MIN;
12700
+ const clockVisible = showClock ?? width >= CLOCK_MIN;
12701
+ return /* @__PURE__ */ jsxs(
12702
+ View,
12703
+ {
12704
+ onLayout,
12705
+ style: surfaceGradient.chrome(),
12706
+ className: cn(
12707
+ "h-[46px] flex-row items-center gap-[14px] px-4 bg-surface-elevated border-b border-border",
12708
+ className
12709
+ ),
12710
+ children: [
12711
+ /* @__PURE__ */ jsx(BrandLockup, { subtitle, showSubtitle: subtitleVisible }),
12712
+ /* @__PURE__ */ jsxs(View, { className: "ml-auto flex-row items-center gap-[12px]", children: [
12713
+ /* @__PURE__ */ jsx(SessionStatePill, { state }),
12714
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", className: "h-4 bg-border-prominent" }),
12715
+ /* @__PURE__ */ jsx(DeviceMenu, { devices, onSelectDevice }),
12716
+ clockVisible ? /* @__PURE__ */ jsxs(Fragment, { children: [
12717
+ /* @__PURE__ */ jsx(Divider, { orientation: "vertical", className: "h-4 bg-border-prominent" }),
12718
+ /* @__PURE__ */ jsx(
12719
+ DateTime,
12720
+ {
12721
+ value: time,
12722
+ live: time == null,
12723
+ format: "time",
12724
+ hour12: false,
12725
+ variant: "mono",
12726
+ color: "secondary",
12727
+ className: "text-[11px] min-w-[38px] text-right"
12728
+ }
12729
+ )
12730
+ ] }) : null
12731
+ ] })
12732
+ ]
12733
+ }
12734
+ );
12735
+ }
12263
12736
 
12264
12737
  // src/utils/form.ts
12265
12738
  function getFieldValidationProps(state) {
@@ -12349,6 +12822,6 @@ function composeValidators(...validators) {
12349
12822
  };
12350
12823
  }
12351
12824
 
12352
- export { Accordion, AccordionButton, AccordionItem, AccordionPanel, Alert, AlertDescription, AlertTitle, Autocomplete, Avatar, AvatarBadge, AvatarGroup, Badge, BadgeText, BaseBadge, BreadcrumbItem, Breadcrumbs, Button, ButtonIcon, ButtonSpinner, ButtonText, CapacityBandChart, Caption, Card, CardContent, CardDescription, CardFooter, CardHeader, CardSkeleton, CardTitle, Checkbox, CheckboxGroup, Chip, CircularProgress, Collapse, CollapseButton, CollapseContent, DataRow, DateTime, DeviationBar, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, EmptyState, ExerciseCard, FormActions, FormField, FormRow, FormSection, Gauge2 as Gauge, HStack, Heading, HelpTip, IconBox, Indicator, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricGroup, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, Overline, Paragraph, PasswordInput, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, Radio, RadioGroup, ReadinessCheck, RestTimer, Scatter, Section, SectionContent, SectionHeader, Select, SetRow, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StatusDot, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, Switch, TEMPO_PACING, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoBar, TempoDisplay, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, Treemap, Typography, VStack, VelocityStrip, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, alpha, applyThemePreset, audiobookPreset, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, elevationSystem, formatDateTime, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getResultColor, getSemanticColors, getStatusColor, getTempoFillPct, getTempoPacingState, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, gluestackConfig, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, neumorphicShadows, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, shadowColors, useTable, useToast, useToolbarButton, validateCssPropertyManifest, validationRules };
12825
+ export { Accordion, AccordionButton, AccordionItem, AccordionPanel, Alert, AlertDescription, AlertTitle, Autocomplete, Avatar, AvatarBadge, AvatarGroup, Badge, BadgeText, BaseBadge, BluetoothIcon, BrandLockup, BreadcrumbItem, Breadcrumbs, Button, ButtonIcon, ButtonSpinner, ButtonText, CATEGORICAL_CVD_SAFE_MAX, CapacityBandChart, Caption, Card, CardContent, CardDescription, CardFooter, CardHeader, CardSkeleton, CardTitle, Checkbox, CheckboxGroup, Chip, CircularProgress, Collapse, CollapseButton, CollapseContent, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DumbbellIcon, EmptyState, ExerciseCard, FormActions, FormField, FormRow, FormSection, Gauge2 as Gauge, HStack, Heading, HelpTip, IconBox, Indicator, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricGroup, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, Overline, Paragraph, PasswordInput, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, Radio, RadioGroup, ReadinessCheck, RestTimer, Scatter, Section, SectionContent, SectionHeader, Select, SessionStatePill, SetRow, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, SvgIcon, Switch, TEMPO_PACING, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoBar, TempoDisplay, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, Typography, VStack, VelocityStrip, VoltrasMark, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, alpha, applyThemePreset, audiobookPreset, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getCategoricalColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getResultColor, getSemanticColors, getStatusColor, getTempoFillPct, getTempoPacingState, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, gluestackConfig, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, linearGradient, neumorphicShadows, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, surfaceGradient, useTable, useToast, useToolbarButton, validateCssPropertyManifest, validationRules };
12353
12826
  //# sourceMappingURL=index.mjs.map
12354
12827
  //# sourceMappingURL=index.mjs.map