@titan-design/react-ui 0.9.3 → 0.10.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 (49) hide show
  1. package/dist/bodymap.js +78 -24
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +78 -24
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +31 -8
  6. package/dist/index.d.ts +31 -8
  7. package/dist/index.js +214 -113
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +210 -114
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +214 -157
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +214 -157
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +129 -34
  16. package/dist/theme/index.d.ts +129 -34
  17. package/dist/theme/index.js +95 -19
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +92 -20
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +88 -24
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +88 -24
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/custom/Workout/BaseBadge.tsx +5 -5
  27. package/src/components/custom/Workout/RowInventory.stories.tsx +5 -2
  28. package/src/components/custom/Workout/S3FullRail.stories.tsx +13 -1
  29. package/src/components/custom/Workout/SessionHeader.tsx +2 -2
  30. package/src/components/custom/Workout/SessionRail.stories.tsx +4 -1
  31. package/src/components/custom/Workout/SessionRail.tsx +5 -5
  32. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +16 -25
  33. package/src/components/custom/Workout/SupersetWrapper.tsx +1 -1
  34. package/src/components/custom/Workout/TempoDisplay.tsx +3 -7
  35. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +4 -1
  36. package/src/components/custom/Workout/WorkoutPill.tsx +2 -2
  37. package/src/components/ui/surface/Surface.stories.tsx +195 -1
  38. package/src/components/ui/surface/Surface.test.tsx +148 -9
  39. package/src/components/ui/surface/Surface.tsx +37 -9
  40. package/src/components/ui/surface/SurfaceContext.ts +48 -8
  41. package/src/components/ui/surface/index.ts +1 -0
  42. package/src/components/ui/surface/surface.contract.test.ts +283 -0
  43. package/src/theme/ColorSystem.stories.tsx +232 -47
  44. package/src/theme/config.ts +12 -0
  45. package/src/theme/elevation.ts +90 -67
  46. package/src/theme/global.css +35 -9
  47. package/src/theme/tokens/primitives.ts +40 -0
  48. package/src/theme/tokens/semantic.ts +63 -14
  49. package/tailwind.config.js +8 -0
package/dist/index.js CHANGED
@@ -339,6 +339,21 @@ var primitiveColors = {
339
339
  black: "#000000",
340
340
  transparent: "transparent"
341
341
  };
342
+ var surfaceRampDark = {
343
+ inset: "#13100D",
344
+ // L*4.5 — sub-shell well / pressed
345
+ background: "#1C1916",
346
+ // L*9 — shell / frame
347
+ base: "#252321",
348
+ // L*13.5 — main content plane
349
+ elevated: "#2C2A28",
350
+ // L*17 — nav / rail
351
+ raised: "#31302F",
352
+ // L*20 — cards
353
+ overlay: "#373635"
354
+ // L*22.5 — hero / popover
355
+ };
356
+ var backgroundFrameDark = "#100D0A";
342
357
  var primitiveRamps = {
343
358
  red: {
344
359
  50: "#FFF4F4",
@@ -806,10 +821,19 @@ var semanticColorsLight = {
806
821
  "surface-overlay": primitiveColors.white,
807
822
  "surface-input": primitiveColors.neutral[50],
808
823
  // Input field background (filled variant)
824
+ // Deepest pressed pit (TD-surface-tokens, S-3) — light-mode counterpart of
825
+ // the dark ramp's `inset` plane; a placeholder pairing, not part of the
826
+ // dark-ramp investigation (surface.contract.test.ts is dark-mode only).
827
+ "surface-inset": primitiveColors.neutral[300],
809
828
  // Background colors (background-*)
810
829
  "background-base": "#EBEBEB",
811
830
  "background-default": primitiveColors.white,
812
831
  "background-subtle": primitiveColors.neutral[50],
832
+ // Frame/bezel chrome (TD-surface-tokens, S-3) — top bar + side nav shell,
833
+ // one step below `background-base` (darker still than `surface-inset`
834
+ // above, mirroring the dark-mode ordering). Placeholder pairing for light
835
+ // mode (see dark-mode note on `surface-inset` above).
836
+ "background-frame": primitiveColors.neutral[400],
813
837
  // Border colors (border-*)
814
838
  "border-default": "#E8E9EB",
815
839
  "border-subtle": primitiveColors.neutral[100],
@@ -825,6 +849,11 @@ var semanticColorsLight = {
825
849
  // Input field border on focus
826
850
  "border-input-error": primitiveColors.red[600],
827
851
  // Input field border on error
852
+ // Alpha hairline separators (surface-independent — composite toward black on
853
+ // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.
854
+ "hairline-subtle": "rgba(0, 0, 0, 0.06)",
855
+ "hairline-default": "rgba(0, 0, 0, 0.09)",
856
+ "hairline-strong": "rgba(0, 0, 0, 0.14)",
828
857
  // Interactive states (interactive-*)
829
858
  "interactive-hover": "rgba(55, 65, 81, 0.04)",
830
859
  "interactive-focus": "rgba(55, 65, 81, 0.12)",
@@ -917,25 +946,46 @@ var semanticColorsDark = {
917
946
  "text-inverse": primitiveColors.neutral[900],
918
947
  "text-link": "#828DF8",
919
948
  "text-link-hover": primitiveColors.blue[400],
920
- // Surface colors - dark backgrounds
921
- "surface-base": primitiveColors.charcoal[700],
922
- // main surface
923
- "surface-elevated": primitiveColors.charcoal[600],
924
- // elevated surface
925
- "surface-raised": primitiveColors.charcoal[500],
926
- // raised surface
927
- "surface-overlay": primitiveColors.charcoal[600],
928
- // overlay surface
929
- "surface-input": primitiveColors.charcoal[600],
930
- // input surface
931
- // Background colors
932
- "background-base": primitiveColors.charcoal[900],
933
- // darkest charcoal
934
- "background-default": primitiveColors.charcoal[700],
935
- // main background
936
- "background-subtle": primitiveColors.charcoal[500],
937
- // subtle background
938
- // Border colors
949
+ // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,
950
+ // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see
951
+ // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`
952
+ // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`
953
+ // tracks one plane above `surface-base`, same relative position as before the remap.
954
+ // `background-base` backs `Surface level="background"` (SurfaceContext.SURFACE_LEVEL_TOKEN),
955
+ // so it takes the ramp's `background` (shell/frame) role, NOT `inset`. The ramp's
956
+ // deepest `inset` plane is now promoted to `surface-inset` below (S-3) — still no
957
+ // `SurfaceLevel` member for it (follow-up, alongside the elevation.ts -1/-2 pressed
958
+ // levels — parallel workstream, not this branch).
959
+ "surface-base": surfaceRampDark.base,
960
+ // main surface (#252321, L*13.5)
961
+ "surface-elevated": surfaceRampDark.elevated,
962
+ // elevated surface (#2C2A28, L*17 — nav/rail)
963
+ "surface-raised": surfaceRampDark.raised,
964
+ // raised surface (#31302F, L*20 — cards)
965
+ "surface-overlay": surfaceRampDark.overlay,
966
+ // overlay surface (#373635, L*22.5 — hero/popover)
967
+ "surface-input": surfaceRampDark.elevated,
968
+ // input surface (#2C2A28 — one plane above base)
969
+ "surface-inset": surfaceRampDark.inset,
970
+ // deepest pressed pit (#13100D, L*4.5 — sub-shell well)
971
+ // Background colors — same ramp, the frame/shell end of it.
972
+ "background-base": surfaceRampDark.background,
973
+ // shell / frame (#1C1916, L*9 — Surface level="background")
974
+ "background-default": surfaceRampDark.base,
975
+ // main background (#252321, L*13.5 — matches surface-base)
976
+ "background-subtle": surfaceRampDark.elevated,
977
+ // subtle background (#2C2A28, L*17 — matches surface-elevated)
978
+ // Frame/bezel chrome (S-3) — the top bar + side nav shell; one step BELOW
979
+ // `background-base`, darker even than `surface-inset` — it exits the content
980
+ // ramp entirely rather than sitting in it. See `backgroundFrameDark` in
981
+ // primitives.ts.
982
+ "background-frame": backgroundFrameDark,
983
+ // frame / bezel (#100D0A, L*3.79)
984
+ // Border colors — `border-subtle` (#1C1C1C) previously collided with
985
+ // `surface-raised` (also #1C1C1C, an invisible border on raised cards). The
986
+ // re-spaced ramp above moved `surface-raised` to #2D2C2B, so this value is now
987
+ // distinct from every surface hex without needing to change it — see
988
+ // `surface.contract.test.ts` R2/R4.
939
989
  "border-default": primitiveColors.charcoal[400],
940
990
  // default border
941
991
  "border-subtle": primitiveColors.charcoal[500],
@@ -949,6 +999,14 @@ var semanticColorsDark = {
949
999
  "border-input-hover": primitiveColors.neutral[500],
950
1000
  "border-input-focus": "#828DF8",
951
1001
  "border-input-error": primitiveColors.red[500],
1002
+ // Alpha hairline separators — the primary separation cue (§4/S-2). Self-
1003
+ // normalizing: composites toward white by ~the same amount on ANY plane, so
1004
+ // one family works at every elevation instead of per-surface border tokens.
1005
+ // Shadows are demoted to floating-overlay use only (not shipped as a fill
1006
+ // separator here — see elevation.ts, follow-up S-4).
1007
+ "hairline-subtle": "rgba(255, 255, 255, 0.06)",
1008
+ "hairline-default": "rgba(255, 255, 255, 0.09)",
1009
+ "hairline-strong": "rgba(255, 255, 255, 0.14)",
952
1010
  // Interactive states
953
1011
  "interactive-hover": "rgba(255, 255, 255, 0.04)",
954
1012
  "interactive-focus": "rgba(255, 255, 255, 0.12)",
@@ -1478,9 +1536,11 @@ var lightThemeCSSVars = {
1478
1536
  "--color-surface-base": semanticColorsLight["surface-base"],
1479
1537
  "--color-surface-elevated": semanticColorsLight["surface-elevated"],
1480
1538
  "--color-surface-raised": semanticColorsLight["surface-raised"],
1539
+ "--color-surface-inset": semanticColorsLight["surface-inset"],
1481
1540
  "--color-background-base": semanticColorsLight["background-base"],
1482
1541
  "--color-background-default": semanticColorsLight["background-default"],
1483
1542
  "--color-background-subtle": semanticColorsLight["background-subtle"],
1543
+ "--color-background-frame": semanticColorsLight["background-frame"],
1484
1544
  "--color-border-default": semanticColorsLight["border-default"],
1485
1545
  "--color-border-subtle": semanticColorsLight["border-subtle"],
1486
1546
  "--color-border-strong": semanticColorsLight["border-strong"],
@@ -1537,6 +1597,9 @@ var lightThemeCSSVars = {
1537
1597
  "--color-border-input-hover": semanticColorsLight["border-input-hover"],
1538
1598
  "--color-border-input-focus": semanticColorsLight["border-input-focus"],
1539
1599
  "--color-border-input-error": semanticColorsLight["border-input-error"],
1600
+ "--color-hairline-subtle": semanticColorsLight["hairline-subtle"],
1601
+ "--color-hairline-default": semanticColorsLight["hairline-default"],
1602
+ "--color-hairline-strong": semanticColorsLight["hairline-strong"],
1540
1603
  "--color-interactive-disabled-text": semanticColorsLight["interactive-disabled-text"],
1541
1604
  "--color-avatar-background": semanticColorsLight["avatar-background"],
1542
1605
  "--color-avatar-text": semanticColorsLight["avatar-text"],
@@ -1576,9 +1639,11 @@ var darkThemeCSSVars = {
1576
1639
  "--color-surface-base": semanticColorsDark["surface-base"],
1577
1640
  "--color-surface-elevated": semanticColorsDark["surface-elevated"],
1578
1641
  "--color-surface-raised": semanticColorsDark["surface-raised"],
1642
+ "--color-surface-inset": semanticColorsDark["surface-inset"],
1579
1643
  "--color-background-base": semanticColorsDark["background-base"],
1580
1644
  "--color-background-default": semanticColorsDark["background-default"],
1581
1645
  "--color-background-subtle": semanticColorsDark["background-subtle"],
1646
+ "--color-background-frame": semanticColorsDark["background-frame"],
1582
1647
  "--color-border-default": semanticColorsDark["border-default"],
1583
1648
  "--color-border-subtle": semanticColorsDark["border-subtle"],
1584
1649
  "--color-border-strong": semanticColorsDark["border-strong"],
@@ -1635,6 +1700,9 @@ var darkThemeCSSVars = {
1635
1700
  "--color-border-input-hover": semanticColorsDark["border-input-hover"],
1636
1701
  "--color-border-input-focus": semanticColorsDark["border-input-focus"],
1637
1702
  "--color-border-input-error": semanticColorsDark["border-input-error"],
1703
+ "--color-hairline-subtle": semanticColorsDark["hairline-subtle"],
1704
+ "--color-hairline-default": semanticColorsDark["hairline-default"],
1705
+ "--color-hairline-strong": semanticColorsDark["hairline-strong"],
1638
1706
  "--color-interactive-disabled-text": semanticColorsDark["interactive-disabled-text"],
1639
1707
  "--color-avatar-background": semanticColorsDark["avatar-background"],
1640
1708
  "--color-avatar-text": semanticColorsDark["avatar-text"],
@@ -2269,6 +2337,10 @@ function getElevationShadow(baseColor, level, theme, isHovered = false) {
2269
2337
  elevationShadowCache.set(cacheKey, result);
2270
2338
  return result;
2271
2339
  }
2340
+ var PRESSED_ELEVATION_LEVEL = -1;
2341
+ function getPressedRecessShadow(fillColor, theme) {
2342
+ return getElevationShadow(fillColor, PRESSED_ELEVATION_LEVEL, theme);
2343
+ }
2272
2344
  function getBaseSurfaceColor(theme) {
2273
2345
  return theme === "light" ? semanticColorsLight["surface-raised"] : semanticColorsDark["surface-elevated"];
2274
2346
  }
@@ -2571,6 +2643,7 @@ var SURFACE_LEVEL_TOKEN = {
2571
2643
  raised: "surface-raised",
2572
2644
  overlay: "surface-overlay"
2573
2645
  };
2646
+ var PRESSED_RAMP = ["inset", "background", "base", "elevated", "raised", "overlay"];
2574
2647
  var ON_SURFACE_TOKEN = {
2575
2648
  primary: "text-primary",
2576
2649
  secondary: "text-secondary",
@@ -2595,9 +2668,19 @@ function onSurfaceColors(mode) {
2595
2668
  function useOnSurfaceColor(role = "primary") {
2596
2669
  return getSemanticColors(useSurfaceMode())[ON_SURFACE_TOKEN[role]];
2597
2670
  }
2671
+ function insetFloor(mode) {
2672
+ const colors = getSemanticColors(mode);
2673
+ return colors["surface-inset"] ?? surfaceRampDark.inset;
2674
+ }
2598
2675
  function surfaceBackground(level, mode) {
2676
+ if (level === "inset") return insetFloor(mode);
2599
2677
  return getSemanticColors(mode)[SURFACE_LEVEL_TOKEN[level]];
2600
2678
  }
2679
+ function pressedLevel(parent) {
2680
+ const index = PRESSED_RAMP.indexOf(parent);
2681
+ const down = Math.max(0, index - 1);
2682
+ return PRESSED_RAMP[down];
2683
+ }
2601
2684
  function getTheme() {
2602
2685
  if (typeof document === "undefined") return "dark";
2603
2686
  return document.documentElement.classList.contains("light") ? "light" : "dark";
@@ -5296,7 +5379,7 @@ function ToastProvider({
5296
5379
  return id;
5297
5380
  }, [defaultDuration, maxToasts]);
5298
5381
  const removeToast = React25.useCallback((id) => {
5299
- setToasts((prev) => prev.filter((t16) => t16.id !== id));
5382
+ setToasts((prev) => prev.filter((t17) => t17.id !== id));
5300
5383
  }, []);
5301
5384
  const removeAllToasts = React25.useCallback(() => {
5302
5385
  setToasts([]);
@@ -6049,6 +6132,7 @@ function IconBox({
6049
6132
  function Surface({
6050
6133
  elevation = 0,
6051
6134
  level,
6135
+ pressed = false,
6052
6136
  glowColor,
6053
6137
  glowIntensity,
6054
6138
  theme,
@@ -6062,13 +6146,24 @@ function Surface({
6062
6146
  const mode = theme ?? inherited.mode;
6063
6147
  const isPlane = level != null;
6064
6148
  const baseColor = getBaseSurfaceColor(mode);
6065
- const backgroundColor = isPlane ? surfaceBackground(level, mode) : getElevationSurface(baseColor, elevation, mode);
6066
- const shadowStyle = isPlane ? {} : getElevationShadow(baseColor, elevation, mode);
6149
+ const resolvedLevel = pressed ? pressedLevel(inherited.level) : level ?? inherited.level;
6150
+ let backgroundColor;
6151
+ let shadowStyle;
6152
+ if (pressed) {
6153
+ backgroundColor = surfaceBackground(resolvedLevel, mode);
6154
+ shadowStyle = getPressedRecessShadow(backgroundColor, mode);
6155
+ } else if (isPlane) {
6156
+ backgroundColor = surfaceBackground(level, mode);
6157
+ shadowStyle = {};
6158
+ } else {
6159
+ backgroundColor = getElevationSurface(baseColor, elevation, mode);
6160
+ shadowStyle = getElevationShadow(baseColor, elevation, mode);
6161
+ }
6067
6162
  const glowStyle = glowColor ? getGlowShadow(glowColor, glowIntensity) : {};
6068
- const applyRounded = rounded ?? !isPlane;
6163
+ const applyRounded = rounded ?? (pressed || !isPlane);
6069
6164
  const value = React25.useMemo(
6070
- () => ({ mode, level: level ?? inherited.level }),
6071
- [mode, level, inherited.level]
6165
+ () => ({ mode, level: resolvedLevel }),
6166
+ [mode, resolvedLevel]
6072
6167
  );
6073
6168
  return /* @__PURE__ */ jsx(SurfaceContext.Provider, { value, children: /* @__PURE__ */ jsx(
6074
6169
  reactNative.View,
@@ -7261,13 +7356,14 @@ function MetricGroup({
7261
7356
  )
7262
7357
  ] }, i)) });
7263
7358
  }
7359
+ var t = getSemanticColors("dark");
7264
7360
  var baseBadgeSizeConfig = {
7265
7361
  sm: { fontSize: 9, paddingH: 6, paddingV: 2, iconSize: 10 },
7266
7362
  md: { fontSize: 10, paddingH: 8, paddingV: 2, iconSize: 12 },
7267
7363
  lg: { fontSize: 12, paddingH: 10, paddingV: 4, iconSize: 14 }
7268
7364
  };
7269
7365
  var variantColors = {
7270
- plain: { backgroundColor: "#1C1C1C", borderColor: "#1F1F1F" },
7366
+ plain: { backgroundColor: t["surface-raised"], borderColor: "#1F1F1F" },
7271
7367
  pr: {
7272
7368
  backgroundColor: "rgba(255, 121, 0, 0.12)",
7273
7369
  borderColor: "rgba(255, 121, 0, 0.3)"
@@ -7507,11 +7603,11 @@ function PrBadge({
7507
7603
  }
7508
7604
  return badge;
7509
7605
  }
7510
- var t = getSemanticColors("dark");
7606
+ var t2 = getSemanticColors("dark");
7511
7607
  var solidVariantColors = {
7512
- success: t["status-success"],
7513
- warning: t["status-warning"],
7514
- error: t["status-error"],
7608
+ success: t2["status-success"],
7609
+ warning: t2["status-warning"],
7610
+ error: t2["status-error"],
7515
7611
  neutral: "#6B7280"
7516
7612
  };
7517
7613
  var ringVariantStyles = {
@@ -7551,8 +7647,8 @@ var iconColors2 = {
7551
7647
  warning: "#6B4000",
7552
7648
  error: "#5C1A1A",
7553
7649
  neutral: "#D1D5DB",
7554
- "on-track": t["status-success"],
7555
- deviation: t["status-warning"],
7650
+ "on-track": t2["status-success"],
7651
+ deviation: t2["status-warning"],
7556
7652
  future: "#6B7280"
7557
7653
  };
7558
7654
  var sizeDimensions = {
@@ -7873,19 +7969,19 @@ function MetricCell({ children, color, fontSize = 11 }) {
7873
7969
  }
7874
7970
 
7875
7971
  // src/components/custom/Workout/TempoDisplay.tsx
7876
- var t2 = getSemanticColors("dark");
7972
+ var t3 = getSemanticColors("dark");
7877
7973
  var INTER = "Inter, sans-serif";
7878
7974
  var TEXT_TERTIARY = "#6B7280";
7879
- var STATUS_ERROR = t2["status-error"];
7880
- var STATUS_SUCCESS = t2["status-success"];
7881
- var STATUS_WARNING = t2["status-warning"];
7975
+ var STATUS_ERROR = t3["status-error"];
7976
+ var STATUS_SUCCESS = t3["status-success"];
7977
+ var STATUS_WARNING = t3["status-warning"];
7882
7978
  var ON_TARGET_MS = 100;
7883
7979
  function getTempoFillPct(elapsedMs, targetMs) {
7884
7980
  if (!targetMs) return 100;
7885
7981
  return Math.min(100, elapsedMs / targetMs * 100);
7886
7982
  }
7887
7983
  function activeNumberTone(elapsedMs, targetMs) {
7888
- if (targetMs == null) return t2["text-primary"];
7984
+ if (targetMs == null) return t3["text-primary"];
7889
7985
  const remainingMs = targetMs - elapsedMs;
7890
7986
  if (remainingMs > ON_TARGET_MS) return STATUS_WARNING;
7891
7987
  if (remainingMs >= -ON_TARGET_MS) return STATUS_SUCCESS;
@@ -8037,7 +8133,7 @@ function TempoDisplay({
8037
8133
  style: {
8038
8134
  flexDirection: "row",
8039
8135
  alignItems: "center",
8040
- backgroundColor: "#1C1C1C",
8136
+ backgroundColor: t3["surface-raised"],
8041
8137
  paddingHorizontal: chromePadX,
8042
8138
  paddingVertical: chromePadY,
8043
8139
  borderRadius: chromeRadius
@@ -8052,7 +8148,7 @@ function TempoDisplay({
8052
8148
  fontSize: labelFont,
8053
8149
  fontWeight: "500",
8054
8150
  // Live-muted green while a rep is running, tertiary at rest.
8055
- color: live ? t2["status-live-muted"] : TEXT_TERTIARY,
8151
+ color: live ? t3["status-live-muted"] : TEXT_TERTIARY,
8056
8152
  letterSpacing: 0.5,
8057
8153
  textTransform: "uppercase",
8058
8154
  marginRight: Math.round(fontSize * 0.5)
@@ -8110,7 +8206,7 @@ function TempoDisplay({
8110
8206
  reactNative.View,
8111
8207
  {
8112
8208
  style: {
8113
- backgroundColor: "#191919",
8209
+ backgroundColor: t3["surface-overlay"],
8114
8210
  borderRadius: 6,
8115
8211
  paddingVertical: 8,
8116
8212
  paddingHorizontal: 12,
@@ -8163,13 +8259,13 @@ function TempoDisplay({
8163
8259
  }
8164
8260
  );
8165
8261
  }
8166
- var t3 = getSemanticColors("dark");
8262
+ var t4 = getSemanticColors("dark");
8167
8263
  function getDotColor(deviation) {
8168
8264
  const abs = Math.abs(deviation);
8169
- if (deviation < -0.3) return t3["status-success"];
8265
+ if (deviation < -0.3) return t4["status-success"];
8170
8266
  if (abs <= 0.3) return "#6B7280";
8171
- if (abs <= 0.7) return t3["status-warning"];
8172
- return t3["status-error"];
8267
+ if (abs <= 0.7) return t4["status-warning"];
8268
+ return t4["status-error"];
8173
8269
  }
8174
8270
  function getDeviationDescription(deviation) {
8175
8271
  if (deviation < -0.3) return "lighter than planned";
@@ -8237,19 +8333,19 @@ function DeviationBar({
8237
8333
  }
8238
8334
  );
8239
8335
  }
8240
- var t4 = getSemanticColors("dark");
8336
+ var t5 = getSemanticColors("dark");
8241
8337
  var TRACK_BG = "#333333";
8242
8338
  var LABEL_COLOR = "#6B7280";
8243
8339
  var TARGET_LINE_COLOR = "rgba(33, 150, 243, 0.5)";
8244
8340
  var AT_TARGET_GLOW = "0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)";
8245
8341
  var ZONE = {
8246
- building: t4["status-success"],
8342
+ building: t5["status-success"],
8247
8343
  // below target ramp-up
8248
- approaching: t4["status-warning"],
8344
+ approaching: t5["status-warning"],
8249
8345
  // nearing target
8250
- target: t4["brand-primary"],
8346
+ target: t5["brand-primary"],
8251
8347
  // exactly at target
8252
- over1: t4["status-error"],
8348
+ over1: t5["status-error"],
8253
8349
  // mild over-target
8254
8350
  over2: WORKOUT_TOKENS.intensity.over2,
8255
8351
  // moderate over-target
@@ -8418,12 +8514,12 @@ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
8418
8514
  var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
8419
8515
 
8420
8516
  // src/components/custom/Workout/WorkoutPill.tsx
8421
- var t5 = getSemanticColors("dark");
8517
+ var t6 = getSemanticColors("dark");
8422
8518
  var statusBgColors = {
8423
8519
  completed: "rgba(46,213,115,0.15)",
8424
8520
  current: "rgba(255,121,0,0.15)",
8425
8521
  next: "transparent",
8426
- upcoming: "#1C1C1C",
8522
+ upcoming: t6["surface-raised"],
8427
8523
  missed: "rgba(209,67,67,0.1)",
8428
8524
  deload: "rgba(186,41,150,0.15)"
8429
8525
  };
@@ -8436,9 +8532,9 @@ var statusBorderStyles = {
8436
8532
  deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
8437
8533
  };
8438
8534
  var textColors = {
8439
- completed: t5["status-success"],
8440
- current: t5["brand-primary"],
8441
- next: t5["brand-primary"],
8535
+ completed: t6["status-success"],
8536
+ current: t6["brand-primary"],
8537
+ next: t6["brand-primary"],
8442
8538
  upcoming: "#6B7280",
8443
8539
  missed: "rgba(209,67,67,0.7)",
8444
8540
  deload: WORKOUT_PILL_DELOAD
@@ -9585,13 +9681,13 @@ function VelocityStrip({
9585
9681
  }
9586
9682
  return stripContent;
9587
9683
  }
9588
- var t6 = getSemanticColors("dark");
9684
+ var t7 = getSemanticColors("dark");
9589
9685
  var dotColorMap = {
9590
9686
  untrained: "#2C2C2C",
9591
- behind: t6["brand-secondary"],
9592
- ontrack: t6["status-success"],
9593
- target: t6["brand-primary"],
9594
- over: t6["status-error"]
9687
+ behind: t7["brand-secondary"],
9688
+ ontrack: t7["status-success"],
9689
+ target: t7["brand-primary"],
9690
+ over: t7["status-error"]
9595
9691
  };
9596
9692
  function MuscleGroupChip({
9597
9693
  name,
@@ -10294,7 +10390,7 @@ function RestTimer({
10294
10390
  }
10295
10391
  );
10296
10392
  }
10297
- var t7 = getSemanticColors("dark");
10393
+ var t8 = getSemanticColors("dark");
10298
10394
  var TIMES = "\xD7";
10299
10395
  var AT = "@";
10300
10396
  function SetsRepsLoad({
@@ -10306,8 +10402,8 @@ function SetsRepsLoad({
10306
10402
  className,
10307
10403
  ...props
10308
10404
  }) {
10309
- const value = t7["text-primary"];
10310
- const sep = t7["text-tertiary"];
10405
+ const value = t8["text-primary"];
10406
+ const sep = t8["text-tertiary"];
10311
10407
  return /* @__PURE__ */ jsxs(
10312
10408
  reactNative.View,
10313
10409
  {
@@ -10420,14 +10516,14 @@ function ScheduleTiles({ when, now, gap = 1, ...props }) {
10420
10516
  )
10421
10517
  ] });
10422
10518
  }
10423
- var t8 = getSemanticColors("dark");
10519
+ var t9 = getSemanticColors("dark");
10424
10520
  var INDICATOR_CONFIG = {
10425
- imbalance: { Icon: ScaleIcon, color: t8["status-error"], label: "Left/right imbalance" },
10426
- overshoot: { Icon: AlertTriangleIcon, color: t8["status-error"], label: "Load overshoot" },
10427
- "velocity-loss": { Icon: TrendingDownIcon, color: t8["status-warning"], label: "Velocity loss" },
10428
- "missed-reps": { Icon: CircleSlashIcon, color: t8["status-warning"], label: "Missed reps" },
10429
- pr: { Icon: AwardIcon, color: t8["status-success"], label: "Personal record" },
10430
- info: { Icon: InfoIcon, color: t8["status-info"], label: "More info" }
10521
+ imbalance: { Icon: ScaleIcon, color: t9["status-error"], label: "Left/right imbalance" },
10522
+ overshoot: { Icon: AlertTriangleIcon, color: t9["status-error"], label: "Load overshoot" },
10523
+ "velocity-loss": { Icon: TrendingDownIcon, color: t9["status-warning"], label: "Velocity loss" },
10524
+ "missed-reps": { Icon: CircleSlashIcon, color: t9["status-warning"], label: "Missed reps" },
10525
+ pr: { Icon: AwardIcon, color: t9["status-success"], label: "Personal record" },
10526
+ info: { Icon: InfoIcon, color: t9["status-info"], label: "More info" }
10431
10527
  };
10432
10528
  var INDICATOR_PRECEDENCE = [
10433
10529
  "imbalance",
@@ -11089,7 +11185,7 @@ function SessionRail({
11089
11185
  var DEFAULTS = {
11090
11186
  label: "SS",
11091
11187
  color: getSemanticColors("dark")["brand-primary"],
11092
- bgBase: "#101010"
11188
+ bgBase: getSemanticColors("dark")["background-base"]
11093
11189
  };
11094
11190
  function SupersetWrapper({
11095
11191
  label = DEFAULTS.label,
@@ -11348,10 +11444,10 @@ function WeekRow({
11348
11444
  }
11349
11445
  );
11350
11446
  }
11351
- var t9 = getSemanticColors("dark");
11447
+ var t10 = getSemanticColors("dark");
11352
11448
  var COLORS = {
11353
- statusSuccess: t9["status-success"],
11354
- brandPrimary: t9["brand-primary"],
11449
+ statusSuccess: t10["status-success"],
11450
+ brandPrimary: t10["brand-primary"],
11355
11451
  borderDefault: "#1F1F1F",
11356
11452
  brandPrimarySubtle: "rgba(255,121,0,0.06)"
11357
11453
  };
@@ -11835,12 +11931,12 @@ function PrHistoryModal({
11835
11931
  }
11836
11932
  );
11837
11933
  }
11838
- var t10 = getSemanticColors("dark");
11839
- var BRAND_PRIMARY9 = t10["brand-primary"];
11934
+ var t11 = getSemanticColors("dark");
11935
+ var BRAND_PRIMARY9 = t11["brand-primary"];
11840
11936
  var BRAND_PRIMARY_SUBTLE = "rgba(255,121,0,0.12)";
11841
- var STATUS_SUCCESS2 = t10["status-success"];
11842
- var STATUS_WARNING2 = t10["status-warning"];
11843
- var STATUS_ERROR2 = t10["status-error"];
11937
+ var STATUS_SUCCESS2 = t11["status-success"];
11938
+ var STATUS_WARNING2 = t11["status-warning"];
11939
+ var STATUS_ERROR2 = t11["status-error"];
11844
11940
  var EMOJI_SETS = {
11845
11941
  sleep: ["\u{1F634}", "\u{1F610}", "\u{1F642}", "\u{1F60A}", "\u{1F929}"],
11846
11942
  soreness: ["\u{1F635}", "\u{1F623}", "\u{1F610}", "\u{1F642}", "\u{1F4AA}"],
@@ -12030,13 +12126,13 @@ function ReadinessCheck({
12030
12126
  )
12031
12127
  ] }) });
12032
12128
  }
12033
- var t11 = getSemanticColors("dark");
12034
- var BRAND_PRIMARY10 = t11["brand-primary"];
12129
+ var t12 = getSemanticColors("dark");
12130
+ var BRAND_PRIMARY10 = t12["brand-primary"];
12035
12131
  var BRAND_PRIMARY_DARK2 = MESO_ACCENT_GRADIENT_DARK;
12036
12132
  var BRAND_PRIMARY_LIGHT2 = MESO_ACCENT_GRADIENT_LIGHT;
12037
- var SUCCESS = t11["status-success"];
12038
- var WARNING = t11["status-warning"];
12039
- var ERROR = t11["status-error"];
12133
+ var SUCCESS = t12["status-success"];
12134
+ var WARNING = t12["status-warning"];
12135
+ var ERROR = t12["status-error"];
12040
12136
  var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY10, BRAND_PRIMARY_LIGHT2];
12041
12137
  var CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor("surface-elevated")} 0%, ${resolveColor("surface-raised")} 100%)`;
12042
12138
  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%)";
@@ -12407,8 +12503,8 @@ var ERROR_PILL_BORDER = "rgba(209,67,67,0.20)";
12407
12503
  var PLOT_LEFT = 26;
12408
12504
  var TOOLTIP_WIDTH = 124;
12409
12505
  function timeOf(dateStr) {
12410
- const t16 = Date.parse(dateStr);
12411
- return Number.isNaN(t16) ? 0 : t16;
12506
+ const t17 = Date.parse(dateStr);
12507
+ return Number.isNaN(t17) ? 0 : t17;
12412
12508
  }
12413
12509
  function formatValue(value) {
12414
12510
  return `${Math.round(value)}`;
@@ -12897,10 +12993,10 @@ function StrengthTrendChart({
12897
12993
  }
12898
12994
  );
12899
12995
  }
12900
- var t12 = getSemanticColors("dark");
12901
- var STATUS_SUCCESS4 = t12["status-success"];
12902
- var STATUS_WARNING4 = t12["status-warning"];
12903
- var STATUS_INFO = t12["status-info"];
12996
+ var t13 = getSemanticColors("dark");
12997
+ var STATUS_SUCCESS4 = t13["status-success"];
12998
+ var STATUS_WARNING4 = t13["status-warning"];
12999
+ var STATUS_INFO = t13["status-info"];
12904
13000
  var DOT_BORDER = "#F3F4F6";
12905
13001
  var BAND_FILL = "rgba(46,213,115,0.1)";
12906
13002
  var BAND_EDGE = "rgba(46,213,115,0.45)";
@@ -12943,8 +13039,8 @@ function interpEdge(pixels, x, key) {
12943
13039
  const a = pixels[i];
12944
13040
  const b = pixels[i + 1];
12945
13041
  if (x >= a.x && x <= b.x) {
12946
- const t16 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
12947
- return a[key] + t16 * (b[key] - a[key]);
13042
+ const t17 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
13043
+ return a[key] + t17 * (b[key] - a[key]);
12948
13044
  }
12949
13045
  }
12950
13046
  return pixels[pixels.length - 1][key];
@@ -13274,13 +13370,13 @@ function CapacityBandChart({
13274
13370
  }
13275
13371
  );
13276
13372
  }
13277
- var t13 = getSemanticColors("dark");
13373
+ var t14 = getSemanticColors("dark");
13278
13374
  function glowShadow(color) {
13279
13375
  return `0 0 5px 1px ${alpha(color, 0.3)}, 0 0 10px 3px ${alpha(color, 0.12)}`;
13280
13376
  }
13281
13377
  var DEFAULT_TRACK_COLOR = primitiveColors.charcoal[200];
13282
13378
  var DEFAULT_MARKER_COLOR2 = primitiveColors.white;
13283
- var TICK_COLOR = t13["text-tertiary"];
13379
+ var TICK_COLOR = t14["text-tertiary"];
13284
13380
  var ZONE_SIZES = {
13285
13381
  default: {
13286
13382
  trackHeight: 14,
@@ -13463,7 +13559,7 @@ function ZoneTrack({
13463
13559
  ),
13464
13560
  ticks?.map((tick, i) => {
13465
13561
  const emphasized = tick.emphasized === true;
13466
- const lineColor = tick.color ?? (emphasized ? t13["brand-primary"] : TICK_COLOR);
13562
+ const lineColor = tick.color ?? (emphasized ? t14["brand-primary"] : TICK_COLOR);
13467
13563
  const lineWidth = emphasized ? s.tickLineEmphasized : s.tickLineNormal;
13468
13564
  return /* @__PURE__ */ jsx(
13469
13565
  reactNative.View,
@@ -13494,7 +13590,7 @@ function ZoneTrack({
13494
13590
  if (tick.label == null) return null;
13495
13591
  const emphasized = tick.emphasized === true;
13496
13592
  if (!showTickLabel(i, emphasized)) return null;
13497
- const labelColor = tick.color ?? (emphasized ? t13["brand-primary"] : TICK_COLOR);
13593
+ const labelColor = tick.color ?? (emphasized ? t14["brand-primary"] : TICK_COLOR);
13498
13594
  const labelNode = /* @__PURE__ */ jsx(
13499
13595
  reactNative.Text,
13500
13596
  {
@@ -13680,7 +13776,7 @@ function VolumeLandmarkBar({
13680
13776
  }
13681
13777
  );
13682
13778
  }
13683
- var t14 = getSemanticColors("dark");
13779
+ var t15 = getSemanticColors("dark");
13684
13780
  var statusToken = {
13685
13781
  productive: "status-success",
13686
13782
  threshold: "status-warning",
@@ -13697,7 +13793,7 @@ var defaultLabel = {
13697
13793
  stop: "Stop"
13698
13794
  };
13699
13795
  function statusPillColor(status) {
13700
- return t14[statusToken[status]];
13796
+ return t15[statusToken[status]];
13701
13797
  }
13702
13798
  function StatusPill2({ status, label, className, style, ...props }) {
13703
13799
  const color = statusPillColor(status);
@@ -13730,7 +13826,7 @@ function StatusPill2({ status, label, className, style, ...props }) {
13730
13826
  }
13731
13827
  );
13732
13828
  }
13733
- var t15 = getSemanticColors("dark");
13829
+ var t16 = getSemanticColors("dark");
13734
13830
  var categoryToken = {
13735
13831
  productive: null,
13736
13832
  threshold: "status-warning",
@@ -13743,7 +13839,7 @@ var floodOpacity = {
13743
13839
  };
13744
13840
  function liveAuraColor(category) {
13745
13841
  const token = categoryToken[category];
13746
- return token ? t15[token] : null;
13842
+ return token ? t16[token] : null;
13747
13843
  }
13748
13844
  function LiveAuraFrame({
13749
13845
  category,
@@ -13772,9 +13868,9 @@ function LiveAuraFrame({
13772
13868
  position: "relative",
13773
13869
  overflow: "hidden",
13774
13870
  borderRadius: 10,
13775
- backgroundColor: t15["background-base"],
13871
+ backgroundColor: t16["background-base"],
13776
13872
  borderWidth: 1,
13777
- borderColor: t15["border-default"]
13873
+ borderColor: t16["border-default"]
13778
13874
  },
13779
13875
  style
13780
13876
  ],
@@ -14001,28 +14097,28 @@ function Scatter({
14001
14097
  testID: "scatter-canvas",
14002
14098
  style: { position: "absolute", top: 0, left: 0, width, height, overflow: "hidden" },
14003
14099
  children: [
14004
- ticksOf(yd, TICK_COUNT).map((t16, i) => {
14005
- const y = toY(t16);
14100
+ ticksOf(yd, TICK_COUNT).map((t17, i) => {
14101
+ const y = toY(t17);
14006
14102
  return /* @__PURE__ */ jsx(
14007
14103
  reactNative.View,
14008
14104
  {
14009
14105
  accessibilityElementsHidden: true,
14010
14106
  testID: "scatter-gridline-y",
14011
14107
  style: { position: "absolute", left: PLOT_LEFT2, width: innerW, top: y, height: 1, backgroundColor: GRID_LINE2 },
14012
- children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", left: -PLOT_LEFT2, top: -6, width: PLOT_LEFT2 - 6, textAlign: "right" }, children: formatTick(t16) })
14108
+ children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", left: -PLOT_LEFT2, top: -6, width: PLOT_LEFT2 - 6, textAlign: "right" }, children: formatTick(t17) })
14013
14109
  },
14014
14110
  `y-${i}`
14015
14111
  );
14016
14112
  }),
14017
- ticksOf(xd, TICK_COUNT).map((t16, i) => {
14018
- const x = toX(t16);
14113
+ ticksOf(xd, TICK_COUNT).map((t17, i) => {
14114
+ const x = toX(t17);
14019
14115
  return /* @__PURE__ */ jsx(
14020
14116
  reactNative.View,
14021
14117
  {
14022
14118
  accessibilityElementsHidden: true,
14023
14119
  testID: "scatter-gridline-x",
14024
14120
  style: { position: "absolute", top: PLOT_TOP, height: innerH, left: x, width: 1, backgroundColor: GRID_LINE2 },
14025
- children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t16) })
14121
+ children: /* @__PURE__ */ jsx(reactNative.Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t17) })
14026
14122
  },
14027
14123
  `x-${i}`
14028
14124
  );
@@ -14157,23 +14253,23 @@ function Gauge2({
14157
14253
  testID: "gauge",
14158
14254
  ...props,
14159
14255
  children: [
14160
- ticks.map((t16) => /* @__PURE__ */ jsx(
14256
+ ticks.map((t17) => /* @__PURE__ */ jsx(
14161
14257
  reactNative.View,
14162
14258
  {
14163
14259
  accessibilityElementsHidden: true,
14164
14260
  testID: "gauge-segment",
14165
14261
  style: {
14166
14262
  position: "absolute",
14167
- left: t16.left - tickThickness / 2,
14168
- top: t16.top - tickLength / 2,
14263
+ left: t17.left - tickThickness / 2,
14264
+ top: t17.top - tickLength / 2,
14169
14265
  width: tickThickness,
14170
14266
  height: tickLength,
14171
14267
  borderRadius: tickThickness / 2,
14172
- backgroundColor: t16.color,
14173
- transform: [{ rotate: t16.rotate }]
14268
+ backgroundColor: t17.color,
14269
+ transform: [{ rotate: t17.rotate }]
14174
14270
  }
14175
14271
  },
14176
- t16.key
14272
+ t17.key
14177
14273
  )),
14178
14274
  /* @__PURE__ */ jsxs(reactNative.View, { style: { position: "absolute", top: 0, left: 0, width: size, height: size }, className: "items-center justify-center", children: [
14179
14275
  /* @__PURE__ */ jsxs(reactNative.View, { className: "flex-row items-baseline gap-0.5", children: [
@@ -14707,6 +14803,7 @@ exports.ModalTitle = ModalTitle;
14707
14803
  exports.MuscleGroupChip = MuscleGroupChip;
14708
14804
  exports.NavItem = NavItem;
14709
14805
  exports.Overline = Overline;
14806
+ exports.PRESSED_ELEVATION_LEVEL = PRESSED_ELEVATION_LEVEL;
14710
14807
  exports.Paragraph = Paragraph;
14711
14808
  exports.PasswordInput = PasswordInput;
14712
14809
  exports.PersonStandingIcon = PersonStandingIcon;
@@ -14810,6 +14907,7 @@ exports.ZoneTrack = ZoneTrack;
14810
14907
  exports.alpha = alpha;
14811
14908
  exports.applyThemePreset = applyThemePreset;
14812
14909
  exports.audiobookPreset = audiobookPreset;
14910
+ exports.backgroundFrameDark = backgroundFrameDark;
14813
14911
  exports.bestTextColor = bestTextColor;
14814
14912
  exports.buttonSizes = buttonSizes;
14815
14913
  exports.calculateMeanVelocity = calculateMeanVelocity;
@@ -14848,6 +14946,7 @@ exports.getFieldValidationProps = getFieldValidationProps;
14848
14946
  exports.getGlowShadow = getGlowShadow;
14849
14947
  exports.getHoverColors = getHoverColors;
14850
14948
  exports.getLuminance = getLuminance;
14949
+ exports.getPressedRecessShadow = getPressedRecessShadow;
14851
14950
  exports.getResultColor = getResultColor;
14852
14951
  exports.getSemanticColors = getSemanticColors;
14853
14952
  exports.getStatusColor = getStatusColor;
@@ -14872,6 +14971,7 @@ exports.neumorphicShadows = neumorphicShadows;
14872
14971
  exports.onSurfaceColors = onSurfaceColors;
14873
14972
  exports.paceTone = paceTone;
14874
14973
  exports.paceToneColor = paceToneColor;
14974
+ exports.pressedLevel = pressedLevel;
14875
14975
  exports.primitiveBorderRadius = primitiveBorderRadius;
14876
14976
  exports.primitiveBreakpoints = primitiveBreakpoints;
14877
14977
  exports.primitiveColors = primitiveColors;
@@ -14896,6 +14996,7 @@ exports.shadowColors = shadowColors;
14896
14996
  exports.statusPillColor = statusPillColor;
14897
14997
  exports.surfaceBackground = surfaceBackground;
14898
14998
  exports.surfaceGradient = surfaceGradient;
14999
+ exports.surfaceRampDark = surfaceRampDark;
14899
15000
  exports.useOnSurfaceColor = useOnSurfaceColor;
14900
15001
  exports.useSurface = useSurface;
14901
15002
  exports.useSurfaceMode = useSurfaceMode;