@titan-design/react-ui 0.8.0 → 0.9.1

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 (30) hide show
  1. package/dist/index.d.mts +19 -59
  2. package/dist/index.d.ts +19 -59
  3. package/dist/index.js +248 -371
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +249 -368
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/{pages-DCFBqp79.d.mts → pages-D7hOD4Vj.d.mts} +1 -1
  8. package/dist/{pages-_fI3-x7Z.d.ts → pages-DyEx-lBf.d.ts} +1 -1
  9. package/dist/pages.d.mts +1 -1
  10. package/dist/pages.d.ts +1 -1
  11. package/dist/pages.js +199 -161
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +199 -161
  14. package/dist/pages.mjs.map +1 -1
  15. package/package.json +2 -1
  16. package/src/components/custom/Workout/ExerciseIndicator.tsx +1 -1
  17. package/src/components/custom/Workout/README.md +33 -13
  18. package/src/components/custom/Workout/SetsRepsLoad.test.tsx +6 -0
  19. package/src/components/custom/Workout/SetsRepsLoad.tsx +15 -6
  20. package/src/components/custom/Workout/TempoDisplay.stories.tsx +240 -65
  21. package/src/components/custom/Workout/TempoDisplay.test.tsx +61 -16
  22. package/src/components/custom/Workout/TempoDisplay.tsx +173 -60
  23. package/src/components/custom/Workout/VelocityStrip.test.tsx +3 -3
  24. package/src/components/custom/Workout/VelocityStrip.tsx +45 -11
  25. package/src/components/custom/Workout/ZoneTrack.tsx +15 -1
  26. package/src/components/custom/Workout/index.ts +1 -9
  27. package/src/test/no-device-internals.test.ts +51 -0
  28. package/src/components/custom/Workout/TempoBar.stories.tsx +0 -164
  29. package/src/components/custom/Workout/TempoBar.test.tsx +0 -218
  30. package/src/components/custom/Workout/TempoBar.tsx +0 -300
package/dist/index.mjs CHANGED
@@ -5256,7 +5256,7 @@ function ToastProvider({
5256
5256
  return id;
5257
5257
  }, [defaultDuration, maxToasts]);
5258
5258
  const removeToast = useCallback((id) => {
5259
- setToasts((prev) => prev.filter((t18) => t18.id !== id));
5259
+ setToasts((prev) => prev.filter((t17) => t17.id !== id));
5260
5260
  }, []);
5261
5261
  const removeAllToasts = useCallback(() => {
5262
5262
  setToasts([]);
@@ -7810,189 +7810,6 @@ function getLuminance(color) {
7810
7810
  function getContrastText(backgroundColor) {
7811
7811
  return getLuminance(backgroundColor) === "light" ? "#000000" : "#FFFFFF";
7812
7812
  }
7813
- var t2 = getSemanticColors("dark");
7814
- var TEMPO_PACING = {
7815
- behindThresholdPct: 0.15,
7816
- minPhaseDurationMs: 500
7817
- };
7818
- function formatTempoDelta(remainingMs) {
7819
- const s = remainingMs / 1e3;
7820
- const rounded = Math.abs(s) < 0.05 ? 0 : s;
7821
- return rounded.toFixed(1);
7822
- }
7823
- function getTempoPacingState(elapsedMs, targetMs) {
7824
- if (!targetMs || targetMs < TEMPO_PACING.minPhaseDurationMs) return "none";
7825
- const ratio = elapsedMs / targetMs;
7826
- if (ratio > 1 + TEMPO_PACING.behindThresholdPct) return "behind";
7827
- return "on-pace";
7828
- }
7829
- function getTempoFillPct(elapsedMs, targetMs) {
7830
- if (!targetMs) return 100;
7831
- return Math.min(100, elapsedMs / targetMs * 100);
7832
- }
7833
- var PHASE_ORDER = ["concentric", "hold", "eccentric"];
7834
- var PHASE_CONFIG = {
7835
- concentric: { label: "Con", wallLabel: "Concentric", color: t2["status-success"], flex: 2 },
7836
- hold: { label: "Hold", wallLabel: "Hold", color: t2["brand-primary"], flex: 1 },
7837
- eccentric: { label: "Ecc", wallLabel: "Eccentric", color: t2["status-warning"], flex: 3 }
7838
- };
7839
- var TEMPO_SIZES = {
7840
- default: { labelMargin: 4, labelFont: 10, barGap: 2, barHeight: 20, radius: 4, segFont: 12 },
7841
- wall: { labelMargin: 8, labelFont: 15, barGap: 4, barHeight: 40, radius: 6, segFont: 22 }
7842
- };
7843
- function TempoBar({
7844
- activePhase,
7845
- phaseElapsedMs,
7846
- completed,
7847
- target,
7848
- size = "default",
7849
- activeDisplay = "time",
7850
- className,
7851
- ...props
7852
- }) {
7853
- const s = TEMPO_SIZES[size];
7854
- const [display, setDisplay] = useState(activeDisplay);
7855
- const toggleDisplay = () => setDisplay((d) => d === "time" ? "delta" : "time");
7856
- return /* @__PURE__ */ jsxs(View, { className, testID: "tempo-bar", ...props, children: [
7857
- /* @__PURE__ */ jsx(View, { style: { flexDirection: "row", marginBottom: s.labelMargin }, children: PHASE_ORDER.map((phase) => {
7858
- const config = PHASE_CONFIG[phase];
7859
- return /* @__PURE__ */ jsx(View, { style: { flex: config.flex, alignItems: "center" }, children: /* @__PURE__ */ jsx(Text, { numberOfLines: 1, style: { fontSize: s.labelFont, color: t2["text-disabled"] }, children: size === "wall" ? config.wallLabel : config.label }) }, phase);
7860
- }) }),
7861
- /* @__PURE__ */ jsx(View, { style: { flexDirection: "row", gap: s.barGap, height: s.barHeight }, children: PHASE_ORDER.map((phase) => {
7862
- const config = PHASE_CONFIG[phase];
7863
- const isActive = activePhase === phase;
7864
- const completedMs = completed?.[phase];
7865
- const targetSec = target?.[phase];
7866
- const targetMs = targetSec != null ? targetSec * 1e3 : null;
7867
- return /* @__PURE__ */ jsx(
7868
- View,
7869
- {
7870
- style: {
7871
- flex: config.flex,
7872
- backgroundColor: alpha("#ffffff", 0.06),
7873
- borderRadius: s.radius,
7874
- overflow: "hidden"
7875
- },
7876
- children: isActive ? /* @__PURE__ */ jsx(
7877
- ActiveSegment,
7878
- {
7879
- config,
7880
- phaseElapsedMs,
7881
- targetMs,
7882
- radius: s.radius,
7883
- font: s.segFont,
7884
- display,
7885
- onToggleDisplay: toggleDisplay
7886
- }
7887
- ) : completedMs != null ? /* @__PURE__ */ jsx(
7888
- CompletedSegment,
7889
- {
7890
- config,
7891
- completedMs,
7892
- targetMs,
7893
- font: s.segFont
7894
- }
7895
- ) : null
7896
- },
7897
- phase
7898
- );
7899
- }) })
7900
- ] });
7901
- }
7902
- function ActiveSegment({
7903
- config,
7904
- phaseElapsedMs,
7905
- targetMs,
7906
- radius,
7907
- font,
7908
- display,
7909
- onToggleDisplay
7910
- }) {
7911
- const pacing = getTempoPacingState(phaseElapsedMs, targetMs);
7912
- const barColor = pacing === "behind" ? t2["status-error"] : config.color;
7913
- const fillPct = getTempoFillPct(phaseElapsedMs, targetMs);
7914
- const label = display === "delta" && targetMs != null ? formatTempoDelta(targetMs - phaseElapsedMs) : targetMs != null ? `${formatDuration2(phaseElapsedMs)} / ${formatDuration2(targetMs)}` : formatDuration2(phaseElapsedMs);
7915
- return /* @__PURE__ */ jsxs(
7916
- Pressable,
7917
- {
7918
- onPress: onToggleDisplay,
7919
- style: { height: "100%", position: "relative" },
7920
- accessibilityRole: "button",
7921
- accessibilityLabel: `Tempo readout: ${display === "delta" ? "delta" : "time"} \u2014 tap to switch`,
7922
- testID: `tempo-segment-active-${config.label}`,
7923
- children: [
7924
- /* @__PURE__ */ jsx(
7925
- View,
7926
- {
7927
- style: {
7928
- position: "absolute",
7929
- left: 0,
7930
- top: 0,
7931
- bottom: 0,
7932
- width: `${fillPct}%`,
7933
- backgroundColor: alpha(barColor, 0.3),
7934
- borderRadius: radius
7935
- }
7936
- }
7937
- ),
7938
- /* @__PURE__ */ jsx(
7939
- View,
7940
- {
7941
- style: {
7942
- height: "100%",
7943
- flexDirection: "row",
7944
- alignItems: "center",
7945
- justifyContent: "center"
7946
- },
7947
- children: /* @__PURE__ */ jsx(Text, { style: { fontSize: font, fontWeight: "700", color: barColor }, children: label })
7948
- }
7949
- )
7950
- ]
7951
- }
7952
- );
7953
- }
7954
- function CompletedSegment({
7955
- config,
7956
- completedMs,
7957
- targetMs,
7958
- font
7959
- }) {
7960
- const pacing = getTempoPacingState(completedMs, targetMs);
7961
- const hitTarget = pacing !== "behind";
7962
- const indicator = targetMs && targetMs >= TEMPO_PACING.minPhaseDurationMs ? hitTarget ? " \u2713" : " \u2717" : "";
7963
- const cueColor = hitTarget ? config.color : t2["status-error"];
7964
- return /* @__PURE__ */ jsx(
7965
- View,
7966
- {
7967
- style: {
7968
- height: "100%",
7969
- flexDirection: "row",
7970
- alignItems: "center",
7971
- justifyContent: "center",
7972
- backgroundColor: alpha(cueColor, 0.15)
7973
- },
7974
- testID: `tempo-segment-completed-${config.label}`,
7975
- children: /* @__PURE__ */ jsxs(
7976
- Text,
7977
- {
7978
- style: {
7979
- fontSize: font,
7980
- fontWeight: "500",
7981
- color: hitTarget ? alpha(config.color, 0.7) : cueColor
7982
- },
7983
- children: [
7984
- formatDuration2(completedMs),
7985
- indicator
7986
- ]
7987
- }
7988
- )
7989
- }
7990
- );
7991
- }
7992
- function formatDuration2(ms) {
7993
- const s = ms / 1e3;
7994
- return s < 10 ? s.toFixed(1) : Math.round(s).toString();
7995
- }
7996
7813
  var METRIC_FONT = "Inter, sans-serif";
7997
7814
  function MetricCell({ children, color, fontSize = 11 }) {
7998
7815
  return /* @__PURE__ */ jsx(
@@ -8011,14 +7828,32 @@ function MetricCell({ children, color, fontSize = 11 }) {
8011
7828
  }
8012
7829
 
8013
7830
  // src/components/custom/Workout/TempoDisplay.tsx
8014
- var t3 = getSemanticColors("dark");
7831
+ var t2 = getSemanticColors("dark");
8015
7832
  var INTER = "Inter, sans-serif";
8016
7833
  var TEXT_TERTIARY = "#6B7280";
8017
- var STATUS_ERROR = t3["status-error"];
7834
+ var STATUS_ERROR = t2["status-error"];
7835
+ var STATUS_SUCCESS = t2["status-success"];
7836
+ var STATUS_WARNING = t2["status-warning"];
7837
+ var ON_TARGET_MS = 100;
7838
+ function getTempoFillPct(elapsedMs, targetMs) {
7839
+ if (!targetMs) return 100;
7840
+ return Math.min(100, elapsedMs / targetMs * 100);
7841
+ }
7842
+ function activeNumberTone(elapsedMs, targetMs) {
7843
+ if (targetMs == null) return t2["text-primary"];
7844
+ const remainingMs = targetMs - elapsedMs;
7845
+ if (remainingMs > ON_TARGET_MS) return STATUS_WARNING;
7846
+ if (remainingMs >= -ON_TARGET_MS) return STATUS_SUCCESS;
7847
+ return STATUS_ERROR;
7848
+ }
7849
+ function liveReadoutText(elapsedMs, targetMs, readout) {
7850
+ const seconds = readout === "countup" ? elapsedMs / 1e3 : (targetMs - elapsedMs) / 1e3;
7851
+ return seconds.toFixed(1);
7852
+ }
8018
7853
  var phaseColors = {
8019
- eccentric: t3["status-warning"],
7854
+ eccentric: primitiveRamps.magenta[400],
8020
7855
  pauseBottom: TEXT_TERTIARY,
8021
- concentric: t3["status-success"],
7856
+ concentric: primitiveRamps.cyan[300],
8022
7857
  pauseTop: TEXT_TERTIARY,
8023
7858
  dash: TEXT_TERTIARY
8024
7859
  };
@@ -8038,63 +7873,98 @@ var LIVE_PHASES = [
8038
7873
  { key: "concentric", color: phaseColors.concentric },
8039
7874
  { key: "pauseTop", color: phaseColors.pauseTop }
8040
7875
  ];
7876
+ function CellFill({ color, pct: pct2 }) {
7877
+ return /* @__PURE__ */ jsx(
7878
+ View,
7879
+ {
7880
+ style: {
7881
+ position: "absolute",
7882
+ left: 2,
7883
+ right: 2,
7884
+ bottom: 0,
7885
+ height: `${pct2}%`,
7886
+ backgroundColor: alpha(color, 0.28),
7887
+ borderRadius: 3
7888
+ }
7889
+ }
7890
+ );
7891
+ }
7892
+ var MONO = "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace";
7893
+ var READOUT_MAX_CHARS = 5;
8041
7894
  function LiveTempoCell({
8042
7895
  value,
8043
7896
  color,
8044
- isActive,
7897
+ status,
8045
7898
  phaseElapsedMs,
8046
- fontSize
7899
+ completedMs,
7900
+ fontSize,
7901
+ readout
8047
7902
  }) {
8048
- if (!isActive) {
8049
- return /* @__PURE__ */ jsx(TempoValue, { value, color: alpha(color, 0.35), fontSize });
8050
- }
8051
7903
  const targetMs = value > 0 ? value * 1e3 : null;
8052
- const barColor = getTempoPacingState(phaseElapsedMs, targetMs) === "behind" ? STATUS_ERROR : color;
7904
+ const cellW = Math.ceil(fontSize * 0.62 * READOUT_MAX_CHARS);
7905
+ const wrap = {
7906
+ position: "relative",
7907
+ width: cellW,
7908
+ minHeight: Math.round(fontSize * 1.25),
7909
+ alignItems: "center",
7910
+ justifyContent: "center"
7911
+ };
7912
+ const num = (c, text) => /* @__PURE__ */ jsx(Text, { style: { fontFamily: MONO, fontSize, color: c, fontWeight: "700" }, children: text });
7913
+ if (status === "upcoming") {
7914
+ const targetText = targetMs != null ? (targetMs / 1e3).toFixed(1) : String(value);
7915
+ return /* @__PURE__ */ jsx(View, { style: wrap, children: num(color, targetText) });
7916
+ }
7917
+ if (status === "done") {
7918
+ const finalMs = completedMs ?? targetMs ?? 0;
7919
+ const finalText = targetMs != null ? liveReadoutText(finalMs, targetMs, readout) : String(value);
7920
+ const finalTone = targetMs != null ? activeNumberTone(finalMs, targetMs) : color;
7921
+ return /* @__PURE__ */ jsxs(View, { style: wrap, testID: "tempo-live-done", children: [
7922
+ /* @__PURE__ */ jsx(CellFill, { color, pct: 100 }),
7923
+ num(finalTone, finalText)
7924
+ ] });
7925
+ }
7926
+ const numberTone = activeNumberTone(phaseElapsedMs, targetMs);
8053
7927
  const fillPct = getTempoFillPct(phaseElapsedMs, targetMs);
8054
- return /* @__PURE__ */ jsxs(View, { style: { position: "relative" }, testID: "tempo-live-active", children: [
8055
- /* @__PURE__ */ jsx(
8056
- View,
8057
- {
8058
- style: {
8059
- position: "absolute",
8060
- left: 0,
8061
- top: 0,
8062
- bottom: 0,
8063
- width: `${fillPct}%`,
8064
- backgroundColor: alpha(barColor, 0.3),
8065
- borderRadius: 2
8066
- }
8067
- }
8068
- ),
8069
- /* @__PURE__ */ jsx(TempoValue, { value, color: barColor, fontSize })
7928
+ const activeText = targetMs != null ? liveReadoutText(phaseElapsedMs, targetMs, readout) : String(value);
7929
+ return /* @__PURE__ */ jsxs(View, { style: wrap, testID: "tempo-live-active", children: [
7930
+ /* @__PURE__ */ jsx(CellFill, { color, pct: fillPct }),
7931
+ num(numberTone, activeText)
8070
7932
  ] });
8071
7933
  }
8072
7934
  function LiveTempoRow({
8073
7935
  values,
8074
7936
  live,
8075
- fontSize
8076
- }) {
8077
- return /* @__PURE__ */ jsx(Fragment, { children: LIVE_PHASES.map((phase, i) => /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row" }, children: [
8078
- i > 0 && /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8079
- /* @__PURE__ */ jsx(
8080
- LiveTempoCell,
8081
- {
8082
- value: values[i],
8083
- color: phase.color,
8084
- isActive: live.activePhase === phase.key,
8085
- phaseElapsedMs: live.phaseElapsedMs,
8086
- fontSize
8087
- }
8088
- )
8089
- ] }, phase.key)) });
7937
+ fontSize,
7938
+ readout
7939
+ }) {
7940
+ const activeIndex = live.activePhase ? LIVE_PHASES.findIndex((p) => p.key === live.activePhase) : -1;
7941
+ return /* @__PURE__ */ jsx(Fragment, { children: LIVE_PHASES.map((phase, i) => {
7942
+ const status = activeIndex < 0 || i > activeIndex ? "upcoming" : i < activeIndex ? "done" : "active";
7943
+ return /* @__PURE__ */ jsxs(View, { style: { flexDirection: "row", alignItems: "center" }, children: [
7944
+ i > 0 && /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
7945
+ /* @__PURE__ */ jsx(
7946
+ LiveTempoCell,
7947
+ {
7948
+ value: values[i],
7949
+ color: phase.color,
7950
+ status,
7951
+ phaseElapsedMs: live.phaseElapsedMs,
7952
+ completedMs: live.completed?.[phase.key],
7953
+ fontSize,
7954
+ readout
7955
+ }
7956
+ )
7957
+ ] }, phase.key);
7958
+ }) });
8090
7959
  }
8091
7960
  function TempoDisplay({
8092
7961
  tempo,
8093
7962
  size = "md",
8094
- colored = true,
7963
+ fontSize: fontSizeProp,
8095
7964
  showLabel = true,
8096
7965
  showInfo = true,
8097
7966
  live,
7967
+ liveReadout = "countdown",
8098
7968
  onPress,
8099
7969
  className,
8100
7970
  ...props
@@ -8102,8 +7972,11 @@ function TempoDisplay({
8102
7972
  const [showTooltip, setShowTooltip] = useState(false);
8103
7973
  const [eccentric, pauseBottom, concentric, pauseTop] = roundTempo(tempo);
8104
7974
  const isSm = size === "sm";
8105
- const fontSize = isSm ? 9 : 11;
8106
- const monoColor = TEXT_TERTIARY;
7975
+ const fontSize = fontSizeProp ?? (isSm ? 9 : 11);
7976
+ const chromePadX = Math.round(fontSize * 0.6);
7977
+ const chromePadY = Math.round(fontSize * 0.3);
7978
+ const chromeRadius = Math.round(fontSize * 0.4);
7979
+ const labelFont = Math.max(9, Math.round(fontSize * 0.5));
8107
7980
  const handlePress = useCallback(() => {
8108
7981
  if (onPress) {
8109
7982
  onPress();
@@ -8120,9 +7993,9 @@ function TempoDisplay({
8120
7993
  flexDirection: "row",
8121
7994
  alignItems: "center",
8122
7995
  backgroundColor: "#1C1C1C",
8123
- paddingHorizontal: isSm ? 6 : 8,
8124
- paddingVertical: 3,
8125
- borderRadius: 4
7996
+ paddingHorizontal: chromePadX,
7997
+ paddingVertical: chromePadY,
7998
+ borderRadius: chromeRadius
8126
7999
  },
8127
8000
  ...props,
8128
8001
  children: [
@@ -8131,12 +8004,13 @@ function TempoDisplay({
8131
8004
  {
8132
8005
  style: {
8133
8006
  fontFamily: INTER,
8134
- fontSize: 9,
8007
+ fontSize: labelFont,
8135
8008
  fontWeight: "500",
8136
- color: TEXT_TERTIARY,
8009
+ // Live-muted green while a rep is running, tertiary at rest.
8010
+ color: live ? t2["status-live-muted"] : TEXT_TERTIARY,
8137
8011
  letterSpacing: 0.5,
8138
8012
  textTransform: "uppercase",
8139
- marginRight: 6
8013
+ marginRight: Math.round(fontSize * 0.5)
8140
8014
  },
8141
8015
  children: "TEMPO"
8142
8016
  }
@@ -8146,36 +8020,20 @@ function TempoDisplay({
8146
8020
  {
8147
8021
  values: [eccentric, pauseBottom, concentric, pauseTop],
8148
8022
  live,
8149
- fontSize
8150
- }
8151
- ) : colored ? /* @__PURE__ */ jsxs(Fragment, { children: [
8152
- /* @__PURE__ */ jsx(TempoValue, { value: eccentric, color: phaseColors.eccentric, fontSize }),
8153
- /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8154
- /* @__PURE__ */ jsx(TempoValue, { value: pauseBottom, color: phaseColors.pauseBottom, fontSize }),
8155
- /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8156
- /* @__PURE__ */ jsx(TempoValue, { value: concentric, color: phaseColors.concentric, fontSize }),
8157
- /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8158
- /* @__PURE__ */ jsx(TempoValue, { value: pauseTop, color: phaseColors.pauseTop, fontSize })
8159
- ] }) : /* @__PURE__ */ jsxs(
8160
- Text,
8161
- {
8162
- style: {
8163
- fontFamily: INTER,
8164
- fontSize,
8165
- color: monoColor,
8166
- fontWeight: "600",
8167
- letterSpacing: 1
8168
- },
8169
- children: [
8170
- eccentric,
8171
- "-",
8172
- pauseBottom,
8173
- "-",
8174
- concentric,
8175
- "-",
8176
- pauseTop
8177
- ]
8023
+ fontSize,
8024
+ readout: liveReadout
8178
8025
  }
8026
+ ) : (
8027
+ // Static prescription: the phase-coloured lockup (the same colours the live row rests at).
8028
+ /* @__PURE__ */ jsxs(Fragment, { children: [
8029
+ /* @__PURE__ */ jsx(TempoValue, { value: eccentric, color: phaseColors.eccentric, fontSize }),
8030
+ /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8031
+ /* @__PURE__ */ jsx(TempoValue, { value: pauseBottom, color: phaseColors.pauseBottom, fontSize }),
8032
+ /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8033
+ /* @__PURE__ */ jsx(TempoValue, { value: concentric, color: phaseColors.concentric, fontSize }),
8034
+ /* @__PURE__ */ jsx(TempoSeparator, { color: phaseColors.dash, fontSize }),
8035
+ /* @__PURE__ */ jsx(TempoValue, { value: pauseTop, color: phaseColors.pauseTop, fontSize })
8036
+ ] })
8179
8037
  ) })
8180
8038
  ]
8181
8039
  }
@@ -8260,13 +8118,13 @@ function TempoDisplay({
8260
8118
  }
8261
8119
  );
8262
8120
  }
8263
- var t4 = getSemanticColors("dark");
8121
+ var t3 = getSemanticColors("dark");
8264
8122
  function getDotColor(deviation) {
8265
8123
  const abs = Math.abs(deviation);
8266
- if (deviation < -0.3) return t4["status-success"];
8124
+ if (deviation < -0.3) return t3["status-success"];
8267
8125
  if (abs <= 0.3) return "#6B7280";
8268
- if (abs <= 0.7) return t4["status-warning"];
8269
- return t4["status-error"];
8126
+ if (abs <= 0.7) return t3["status-warning"];
8127
+ return t3["status-error"];
8270
8128
  }
8271
8129
  function getDeviationDescription(deviation) {
8272
8130
  if (deviation < -0.3) return "lighter than planned";
@@ -8334,19 +8192,19 @@ function DeviationBar({
8334
8192
  }
8335
8193
  );
8336
8194
  }
8337
- var t5 = getSemanticColors("dark");
8195
+ var t4 = getSemanticColors("dark");
8338
8196
  var TRACK_BG = "#333333";
8339
8197
  var LABEL_COLOR = "#6B7280";
8340
8198
  var TARGET_LINE_COLOR = "rgba(33, 150, 243, 0.5)";
8341
8199
  var AT_TARGET_GLOW = "0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)";
8342
8200
  var ZONE = {
8343
- building: t5["status-success"],
8201
+ building: t4["status-success"],
8344
8202
  // below target ramp-up
8345
- approaching: t5["status-warning"],
8203
+ approaching: t4["status-warning"],
8346
8204
  // nearing target
8347
- target: t5["brand-primary"],
8205
+ target: t4["brand-primary"],
8348
8206
  // exactly at target
8349
- over1: t5["status-error"],
8207
+ over1: t4["status-error"],
8350
8208
  // mild over-target
8351
8209
  over2: WORKOUT_TOKENS.intensity.over2,
8352
8210
  // moderate over-target
@@ -8515,7 +8373,7 @@ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
8515
8373
  var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
8516
8374
 
8517
8375
  // src/components/custom/Workout/WorkoutPill.tsx
8518
- var t6 = getSemanticColors("dark");
8376
+ var t5 = getSemanticColors("dark");
8519
8377
  var statusBgColors = {
8520
8378
  completed: "rgba(46,213,115,0.15)",
8521
8379
  current: "rgba(255,121,0,0.15)",
@@ -8533,9 +8391,9 @@ var statusBorderStyles = {
8533
8391
  deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
8534
8392
  };
8535
8393
  var textColors = {
8536
- completed: t6["status-success"],
8537
- current: t6["brand-primary"],
8538
- next: t6["brand-primary"],
8394
+ completed: t5["status-success"],
8395
+ current: t5["brand-primary"],
8396
+ next: t5["brand-primary"],
8539
8397
  upcoming: "#6B7280",
8540
8398
  missed: "rgba(209,67,67,0.7)",
8541
8399
  deload: WORKOUT_PILL_DELOAD
@@ -9078,13 +8936,15 @@ var BARE_STUB_HEIGHT = 3;
9078
8936
  var HERO_HEIGHT = 220;
9079
8937
  var HERO_LABEL_HEADROOM = 20;
9080
8938
  var HERO_BAR_GAP = 8;
9081
- var HERO_BAR_MAX_WIDTH = 52;
8939
+ var HERO_BAR_MAX_WIDTH = 120;
8940
+ var HERO_LABEL_MIN_BAR_WIDTH = 30;
9082
8941
  var HERO_BAR_RADIUS = 5;
9083
8942
  var HERO_MIN_BAR_HEIGHT = 4;
9084
8943
  var HERO_PENDING_COLOR = primitiveColors.charcoal[100];
9085
8944
  var HERO_REFERENCE_COLOR = primitiveColors.charcoal[0];
8945
+ var PEAK_HEADROOM = 1.06;
9086
8946
  function scaleDenominator(scale, maxVelocity) {
9087
- return scale === "fixed" ? FIXED_MAX_VELOCITY : maxVelocity * 1.15;
8947
+ return scale === "fixed" ? FIXED_MAX_VELOCITY : maxVelocity * PEAK_HEADROOM;
9088
8948
  }
9089
8949
  function bareSlotHeight(slot, height, denom) {
9090
8950
  if (slot.kind !== "rep" || denom <= 0) return BARE_STUB_HEIGHT;
@@ -9161,10 +9021,21 @@ function HeroVelocityChart({
9161
9021
  }) {
9162
9022
  const liveVelocity = liveRepIndex != null ? doneVelocities[liveRepIndex] : void 0;
9163
9023
  const liveScale = useLiveRepPop(true, liveRepIndex, liveVelocity, isNewPeak);
9024
+ const [plotW, setPlotW] = useState(0);
9025
+ const onPlotLayout = (e) => setPlotW(e.nativeEvent.layout.width);
9164
9026
  const plotHeight = Math.max(0, height - HERO_LABEL_HEADROOM);
9165
9027
  const barHeight = (velocity) => scaleDenom > 0 ? Math.max(HERO_MIN_BAR_HEIGHT, Math.min(1, velocity / scaleDenom) * plotHeight) : HERO_MIN_BAR_HEIGHT;
9166
9028
  const pendingCount = Math.max(0, (targetReps ?? 0) - doneVelocities.length);
9167
9029
  const referencePx = referenceVelocity > 0 && scaleDenom > 0 ? Math.min(plotHeight, referenceVelocity / scaleDenom * plotHeight) : 0;
9030
+ const totalSlots = doneVelocities.length + pendingCount;
9031
+ const barWidth = plotW > 0 && totalSlots > 0 ? Math.min(HERO_BAR_MAX_WIDTH, (plotW - HERO_BAR_GAP * (totalSlots - 1)) / totalSlots) : HERO_BAR_MAX_WIDTH;
9032
+ const labelsCrowded = plotW > 0 && barWidth < HERO_LABEL_MIN_BAR_WIDTH;
9033
+ const heroGap = plotW === 0 ? HERO_BAR_GAP : barWidth < 16 ? 2 : barWidth < 28 ? 4 : HERO_BAR_GAP;
9034
+ const peakIndex = doneVelocities.reduce(
9035
+ (best, v, i) => v > doneVelocities[best] ? i : best,
9036
+ 0
9037
+ );
9038
+ const showBarLabel = (i) => !labelsCrowded || i === peakIndex || i === liveRepIndex;
9168
9039
  const repCount = doneVelocities.length;
9169
9040
  const total = Math.max(repCount, targetReps ?? repCount);
9170
9041
  const label = referenceVelocity > 0 ? `Velocity chart, ${repCount} of ${total} reps, best ${formatVelocity(referenceVelocity)} meters per second` : `Velocity chart, ${repCount} of ${total} reps`;
@@ -9181,11 +9052,12 @@ function HeroVelocityChart({
9181
9052
  children: /* @__PURE__ */ jsxs(
9182
9053
  View,
9183
9054
  {
9055
+ onLayout: onPlotLayout,
9184
9056
  style: {
9185
9057
  flex: 1,
9186
9058
  flexDirection: "row",
9187
9059
  alignItems: "flex-end",
9188
- gap: HERO_BAR_GAP,
9060
+ gap: heroGap,
9189
9061
  position: "relative",
9190
9062
  borderBottomWidth: 2,
9191
9063
  borderBottomColor: HERO_PENDING_COLOR
@@ -9222,7 +9094,7 @@ function HeroVelocityChart({
9222
9094
  justifyContent: "flex-end"
9223
9095
  },
9224
9096
  children: [
9225
- /* @__PURE__ */ jsx(
9097
+ showBarLabel(i) && /* @__PURE__ */ jsx(
9226
9098
  Text,
9227
9099
  {
9228
9100
  className: "text-text-primary",
@@ -9668,13 +9540,13 @@ function VelocityStrip({
9668
9540
  }
9669
9541
  return stripContent;
9670
9542
  }
9671
- var t7 = getSemanticColors("dark");
9543
+ var t6 = getSemanticColors("dark");
9672
9544
  var dotColorMap = {
9673
9545
  untrained: "#2C2C2C",
9674
- behind: t7["brand-secondary"],
9675
- ontrack: t7["status-success"],
9676
- target: t7["brand-primary"],
9677
- over: t7["status-error"]
9546
+ behind: t6["brand-secondary"],
9547
+ ontrack: t6["status-success"],
9548
+ target: t6["brand-primary"],
9549
+ over: t6["status-error"]
9678
9550
  };
9679
9551
  function MuscleGroupChip({
9680
9552
  name,
@@ -10377,7 +10249,7 @@ function RestTimer({
10377
10249
  }
10378
10250
  );
10379
10251
  }
10380
- var t8 = getSemanticColors("dark");
10252
+ var t7 = getSemanticColors("dark");
10381
10253
  var TIMES = "\xD7";
10382
10254
  var AT = "@";
10383
10255
  function SetsRepsLoad({
@@ -10385,11 +10257,12 @@ function SetsRepsLoad({
10385
10257
  reps,
10386
10258
  load,
10387
10259
  unit = "lb",
10260
+ fontSize,
10388
10261
  className,
10389
10262
  ...props
10390
10263
  }) {
10391
- const value = t8["text-primary"];
10392
- const sep = t8["text-tertiary"];
10264
+ const value = t7["text-primary"];
10265
+ const sep = t7["text-tertiary"];
10393
10266
  return /* @__PURE__ */ jsxs(
10394
10267
  View,
10395
10268
  {
@@ -10399,12 +10272,12 @@ function SetsRepsLoad({
10399
10272
  testID: "sets-reps-load",
10400
10273
  ...props,
10401
10274
  children: [
10402
- /* @__PURE__ */ jsx(MetricCell, { color: value, children: sets }),
10403
- /* @__PURE__ */ jsx(MetricCell, { color: sep, children: ` ${TIMES} ` }),
10404
- /* @__PURE__ */ jsx(MetricCell, { color: value, children: reps }),
10405
- /* @__PURE__ */ jsx(MetricCell, { color: sep, children: ` ${AT} ` }),
10406
- /* @__PURE__ */ jsx(MetricCell, { color: value, children: load }),
10407
- /* @__PURE__ */ jsx(MetricCell, { color: sep, children: ` ${unit}` })
10275
+ /* @__PURE__ */ jsx(MetricCell, { color: value, fontSize, children: sets }),
10276
+ /* @__PURE__ */ jsx(MetricCell, { color: sep, fontSize, children: ` ${TIMES} ` }),
10277
+ /* @__PURE__ */ jsx(MetricCell, { color: value, fontSize, children: reps }),
10278
+ /* @__PURE__ */ jsx(MetricCell, { color: sep, fontSize, children: ` ${AT} ` }),
10279
+ /* @__PURE__ */ jsx(MetricCell, { color: value, fontSize, children: load }),
10280
+ /* @__PURE__ */ jsx(MetricCell, { color: sep, fontSize, children: ` ${unit}` })
10408
10281
  ]
10409
10282
  }
10410
10283
  );
@@ -10502,14 +10375,14 @@ function ScheduleTiles({ when, now, gap = 1, ...props }) {
10502
10375
  )
10503
10376
  ] });
10504
10377
  }
10505
- var t9 = getSemanticColors("dark");
10378
+ var t8 = getSemanticColors("dark");
10506
10379
  var INDICATOR_CONFIG = {
10507
- imbalance: { Icon: ScaleIcon, color: t9["status-error"], label: "Left/right imbalance" },
10508
- overshoot: { Icon: AlertTriangleIcon, color: t9["status-error"], label: "Load overshoot" },
10509
- "velocity-loss": { Icon: TrendingDownIcon, color: t9["status-warning"], label: "Velocity loss" },
10510
- "missed-reps": { Icon: CircleSlashIcon, color: t9["status-warning"], label: "Missed reps" },
10511
- pr: { Icon: AwardIcon, color: t9["status-success"], label: "Personal record" },
10512
- info: { Icon: InfoIcon, color: t9["status-info"], label: "More info" }
10380
+ imbalance: { Icon: ScaleIcon, color: t8["status-error"], label: "Left/right imbalance" },
10381
+ overshoot: { Icon: AlertTriangleIcon, color: t8["status-error"], label: "Load overshoot" },
10382
+ "velocity-loss": { Icon: TrendingDownIcon, color: t8["status-warning"], label: "Velocity loss" },
10383
+ "missed-reps": { Icon: CircleSlashIcon, color: t8["status-warning"], label: "Missed reps" },
10384
+ pr: { Icon: AwardIcon, color: t8["status-success"], label: "Personal record" },
10385
+ info: { Icon: InfoIcon, color: t8["status-info"], label: "More info" }
10513
10386
  };
10514
10387
  var INDICATOR_PRECEDENCE = [
10515
10388
  "imbalance",
@@ -10984,7 +10857,7 @@ function ExerciseCard({
10984
10857
  if (upcoming) return /* @__PURE__ */ jsx(UpcomingCard, { ...rest, onToggle });
10985
10858
  return isExpanded ? /* @__PURE__ */ jsx(ExpandedCard, { ...rest, onToggle }) : /* @__PURE__ */ jsx(CollapsedCard, { ...rest, onToggle });
10986
10859
  }
10987
- var t10 = getSemanticColors("dark");
10860
+ var t9 = getSemanticColors("dark");
10988
10861
  var RAISED = primitiveColors.charcoal[400];
10989
10862
  var BAR_HEIGHT = 9;
10990
10863
  var BAR_GAP = 3;
@@ -11006,7 +10879,7 @@ function SessionHeader({
11006
10879
  const hasPace = !upcoming && budgetMs != null && elapsedMs != null;
11007
10880
  const target = hasPace ? elapsedMs / budgetMs : void 0;
11008
10881
  const setsLabel = upcoming ? `${totalSets} sets` : `${Math.floor(setsDone)}/${totalSets} sets`;
11009
- const setsLabelColor = upcoming ? t10["text-secondary"] : paceToneColor(paceTone(totalSets > 0 ? setsDone / totalSets : 0, target));
10882
+ const setsLabelColor = upcoming ? t9["text-secondary"] : paceToneColor(paceTone(totalSets > 0 ? setsDone / totalSets : 0, target));
11010
10883
  return /* @__PURE__ */ jsxs(
11011
10884
  View,
11012
10885
  {
@@ -11034,7 +10907,7 @@ function SessionHeader({
11034
10907
  lineHeight: 18,
11035
10908
  fontWeight: "700",
11036
10909
  fontFamily: '"Space Grotesk", sans-serif',
11037
- color: t10["text-primary"],
10910
+ color: t9["text-primary"],
11038
10911
  marginBottom: 10
11039
10912
  },
11040
10913
  testID: "session-rail-title",
@@ -11429,10 +11302,10 @@ function WeekRow({
11429
11302
  }
11430
11303
  );
11431
11304
  }
11432
- var t11 = getSemanticColors("dark");
11305
+ var t10 = getSemanticColors("dark");
11433
11306
  var COLORS = {
11434
- statusSuccess: t11["status-success"],
11435
- brandPrimary: t11["brand-primary"],
11307
+ statusSuccess: t10["status-success"],
11308
+ brandPrimary: t10["brand-primary"],
11436
11309
  borderDefault: "#1F1F1F",
11437
11310
  brandPrimarySubtle: "rgba(255,121,0,0.06)"
11438
11311
  };
@@ -11916,12 +11789,12 @@ function PrHistoryModal({
11916
11789
  }
11917
11790
  );
11918
11791
  }
11919
- var t12 = getSemanticColors("dark");
11920
- var BRAND_PRIMARY9 = t12["brand-primary"];
11792
+ var t11 = getSemanticColors("dark");
11793
+ var BRAND_PRIMARY9 = t11["brand-primary"];
11921
11794
  var BRAND_PRIMARY_SUBTLE = "rgba(255,121,0,0.12)";
11922
- var STATUS_SUCCESS = t12["status-success"];
11923
- var STATUS_WARNING = t12["status-warning"];
11924
- var STATUS_ERROR2 = t12["status-error"];
11795
+ var STATUS_SUCCESS2 = t11["status-success"];
11796
+ var STATUS_WARNING2 = t11["status-warning"];
11797
+ var STATUS_ERROR2 = t11["status-error"];
11925
11798
  var EMOJI_SETS = {
11926
11799
  sleep: ["\u{1F634}", "\u{1F610}", "\u{1F642}", "\u{1F60A}", "\u{1F929}"],
11927
11800
  soreness: ["\u{1F635}", "\u{1F623}", "\u{1F610}", "\u{1F642}", "\u{1F4AA}"],
@@ -11931,8 +11804,8 @@ var EMOJI_SETS = {
11931
11804
  var DEFAULT_EMOJI_SET = ["\u{1F61E}", "\u{1F615}", "\u{1F610}", "\u{1F642}", "\u{1F604}"];
11932
11805
  function scoreColor(score) {
11933
11806
  if (score < 40) return STATUS_ERROR2;
11934
- if (score < 70) return STATUS_WARNING;
11935
- return STATUS_SUCCESS;
11807
+ if (score < 70) return STATUS_WARNING2;
11808
+ return STATUS_SUCCESS2;
11936
11809
  }
11937
11810
  var WARMUP_BADGE = {
11938
11811
  good: { color: "success", label: "Good" },
@@ -12111,13 +11984,13 @@ function ReadinessCheck({
12111
11984
  )
12112
11985
  ] }) });
12113
11986
  }
12114
- var t13 = getSemanticColors("dark");
12115
- var BRAND_PRIMARY10 = t13["brand-primary"];
11987
+ var t12 = getSemanticColors("dark");
11988
+ var BRAND_PRIMARY10 = t12["brand-primary"];
12116
11989
  var BRAND_PRIMARY_DARK2 = MESO_ACCENT_GRADIENT_DARK;
12117
11990
  var BRAND_PRIMARY_LIGHT2 = MESO_ACCENT_GRADIENT_LIGHT;
12118
- var SUCCESS = t13["status-success"];
12119
- var WARNING = t13["status-warning"];
12120
- var ERROR = t13["status-error"];
11991
+ var SUCCESS = t12["status-success"];
11992
+ var WARNING = t12["status-warning"];
11993
+ var ERROR = t12["status-error"];
12121
11994
  var ACCENT_STOPS2 = [BRAND_PRIMARY_DARK2, BRAND_PRIMARY10, BRAND_PRIMARY_LIGHT2];
12122
11995
  var CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor("surface-elevated")} 0%, ${resolveColor("surface-raised")} 100%)`;
12123
11996
  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%)";
@@ -12477,9 +12350,9 @@ function MesoStatusCard({
12477
12350
  var sem = getSemanticColors("dark");
12478
12351
  var BRAND_PRIMARY11 = sem["brand-primary"];
12479
12352
  var PROJECTION_LINE_COLOR = resolveColor("text-tertiary");
12480
- var STATUS_SUCCESS2 = sem["status-success"];
12353
+ var STATUS_SUCCESS3 = sem["status-success"];
12481
12354
  var STATUS_ERROR3 = sem["status-error"];
12482
- var STATUS_WARNING2 = sem["status-warning"];
12355
+ var STATUS_WARNING3 = sem["status-warning"];
12483
12356
  var GRID_LINE = "rgba(255,255,255,0.06)";
12484
12357
  var SUCCESS_PILL_BG = "rgba(46,213,115,0.10)";
12485
12358
  var SUCCESS_PILL_BORDER = "rgba(46,213,115,0.20)";
@@ -12488,8 +12361,8 @@ var ERROR_PILL_BORDER = "rgba(209,67,67,0.20)";
12488
12361
  var PLOT_LEFT = 26;
12489
12362
  var TOOLTIP_WIDTH = 124;
12490
12363
  function timeOf(dateStr) {
12491
- const t18 = Date.parse(dateStr);
12492
- return Number.isNaN(t18) ? 0 : t18;
12364
+ const t17 = Date.parse(dateStr);
12365
+ return Number.isNaN(t17) ? 0 : t17;
12493
12366
  }
12494
12367
  function formatValue(value) {
12495
12368
  return `${Math.round(value)}`;
@@ -12785,7 +12658,7 @@ function StrengthTrendChart({
12785
12658
  left: c.x - 7,
12786
12659
  top: c.y - 20,
12787
12660
  fontSize: 12,
12788
- color: STATUS_WARNING2
12661
+ color: STATUS_WARNING3
12789
12662
  },
12790
12663
  children: "\u2605"
12791
12664
  },
@@ -12878,7 +12751,7 @@ function StrengthTrendChart({
12878
12751
  marginTop: 1,
12879
12752
  fontSize: 10,
12880
12753
  fontFamily: "Inter, sans-serif",
12881
- color: selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0 ? STATUS_SUCCESS2 : STATUS_ERROR3
12754
+ color: selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0 ? STATUS_SUCCESS3 : STATUS_ERROR3
12882
12755
  },
12883
12756
  children: `${selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0 ? "+" : "-"}${Math.abs(
12884
12757
  selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm
@@ -12934,7 +12807,7 @@ function StrengthTrendChart({
12934
12807
  fontSize: 11,
12935
12808
  fontFamily: "Inter, sans-serif",
12936
12809
  fontWeight: "600",
12937
- color: trend.positive ? STATUS_SUCCESS2 : STATUS_ERROR3
12810
+ color: trend.positive ? STATUS_SUCCESS3 : STATUS_ERROR3
12938
12811
  },
12939
12812
  children: trendText
12940
12813
  }
@@ -12968,7 +12841,7 @@ function StrengthTrendChart({
12968
12841
  /* @__PURE__ */ jsx(Text, { className: "text-text-secondary", style: { fontSize: 10, fontFamily: "Inter, sans-serif" }, children: "Projected" })
12969
12842
  ] }),
12970
12843
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-center", style: { gap: 5 }, children: [
12971
- /* @__PURE__ */ jsx(Text, { style: { fontSize: 12, color: STATUS_WARNING2 }, children: "\u2605" }),
12844
+ /* @__PURE__ */ jsx(Text, { style: { fontSize: 12, color: STATUS_WARNING3 }, children: "\u2605" }),
12972
12845
  /* @__PURE__ */ jsx(Text, { className: "text-text-secondary", style: { fontSize: 10, fontFamily: "Inter, sans-serif" }, children: "PR" })
12973
12846
  ] })
12974
12847
  ]
@@ -12978,10 +12851,10 @@ function StrengthTrendChart({
12978
12851
  }
12979
12852
  );
12980
12853
  }
12981
- var t14 = getSemanticColors("dark");
12982
- var STATUS_SUCCESS3 = t14["status-success"];
12983
- var STATUS_WARNING3 = t14["status-warning"];
12984
- var STATUS_INFO = t14["status-info"];
12854
+ var t13 = getSemanticColors("dark");
12855
+ var STATUS_SUCCESS4 = t13["status-success"];
12856
+ var STATUS_WARNING4 = t13["status-warning"];
12857
+ var STATUS_INFO = t13["status-info"];
12985
12858
  var DOT_BORDER = "#F3F4F6";
12986
12859
  var BAND_FILL = "rgba(46,213,115,0.1)";
12987
12860
  var BAND_EDGE = "rgba(46,213,115,0.45)";
@@ -12993,8 +12866,8 @@ var PADDING_BOTTOM = 16;
12993
12866
  var COLUMN_STEP = 4;
12994
12867
  var DOT_SIZE = 8;
12995
12868
  var DOT_COLORS = {
12996
- within: STATUS_SUCCESS3,
12997
- above: STATUS_WARNING3,
12869
+ within: STATUS_SUCCESS4,
12870
+ above: STATUS_WARNING4,
12998
12871
  below: STATUS_INFO
12999
12872
  };
13000
12873
  var STATUS_PHRASES = {
@@ -13024,8 +12897,8 @@ function interpEdge(pixels, x, key) {
13024
12897
  const a = pixels[i];
13025
12898
  const b = pixels[i + 1];
13026
12899
  if (x >= a.x && x <= b.x) {
13027
- const t18 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
13028
- return a[key] + t18 * (b[key] - a[key]);
12900
+ const t17 = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x);
12901
+ return a[key] + t17 * (b[key] - a[key]);
13029
12902
  }
13030
12903
  }
13031
12904
  return pixels[pixels.length - 1][key];
@@ -13219,8 +13092,8 @@ function CapacityBandChart({
13219
13092
  projection && /* @__PURE__ */ jsxs(View, { testID: "capacity-band-chart-projection", children: [
13220
13093
  renderColumns(buildColumns2(trainingPixels, COLUMN_STEP), PROJECTION_FILL, "capacity-band-chart-projection-fill"),
13221
13094
  renderColumns(buildColumns2(restPixels, COLUMN_STEP), PROJECTION_FILL, "capacity-band-chart-projection-fill"),
13222
- renderEdges(buildEdges(trainingPixels, "yHigh"), STATUS_SUCCESS3, true, "capacity-band-chart-projection-training"),
13223
- renderEdges(buildEdges(trainingPixels, "yLow"), STATUS_SUCCESS3, true, "capacity-band-chart-projection-training"),
13095
+ renderEdges(buildEdges(trainingPixels, "yHigh"), STATUS_SUCCESS4, true, "capacity-band-chart-projection-training"),
13096
+ renderEdges(buildEdges(trainingPixels, "yLow"), STATUS_SUCCESS4, true, "capacity-band-chart-projection-training"),
13224
13097
  renderEdges(buildEdges(restPixels, "yHigh"), STATUS_INFO, true, "capacity-band-chart-projection-rest"),
13225
13098
  renderEdges(buildEdges(restPixels, "yLow"), STATUS_INFO, true, "capacity-band-chart-projection-rest"),
13226
13099
  /* @__PURE__ */ jsx(
@@ -13232,7 +13105,7 @@ function CapacityBandChart({
13232
13105
  top: trainingPixels[trainingPixels.length - 1]?.yHigh - 12,
13233
13106
  fontSize: 9,
13234
13107
  fontFamily: "Inter, sans-serif",
13235
- color: STATUS_SUCCESS3
13108
+ color: STATUS_SUCCESS4
13236
13109
  },
13237
13110
  testID: "capacity-band-chart-projection-training-label",
13238
13111
  children: "Training"
@@ -13355,13 +13228,13 @@ function CapacityBandChart({
13355
13228
  }
13356
13229
  );
13357
13230
  }
13358
- var t15 = getSemanticColors("dark");
13231
+ var t14 = getSemanticColors("dark");
13359
13232
  function glowShadow(color) {
13360
13233
  return `0 0 5px 1px ${alpha(color, 0.3)}, 0 0 10px 3px ${alpha(color, 0.12)}`;
13361
13234
  }
13362
13235
  var DEFAULT_TRACK_COLOR = primitiveColors.charcoal[200];
13363
13236
  var DEFAULT_MARKER_COLOR2 = primitiveColors.white;
13364
- var TICK_COLOR = t15["text-tertiary"];
13237
+ var TICK_COLOR = t14["text-tertiary"];
13365
13238
  var ZONE_SIZES = {
13366
13239
  default: {
13367
13240
  trackHeight: 14,
@@ -13418,6 +13291,12 @@ function ZoneTrack({
13418
13291
  const s = ZONE_SIZES[size];
13419
13292
  const trackHeight = trackHeightProp ?? s.trackHeight;
13420
13293
  const needleOverhang = needleOverhangProp ?? s.needleOverhang;
13294
+ const [trackW, setTrackW] = useState(0);
13295
+ const onTrackLayout = (e) => setTrackW(e.nativeEvent.layout.width);
13296
+ const tickCount = ticks?.length ?? 0;
13297
+ const tickSpacing = trackW > 0 && tickCount > 0 ? trackW / tickCount : Infinity;
13298
+ const tickStep = tickSpacing < s.tickCellWidth ? Math.ceil(s.tickCellWidth / tickSpacing) : 1;
13299
+ const showTickLabel = (i, emphasized) => tickStep <= 1 || i === 0 || i === tickCount - 1 || i % tickStep === 0 || emphasized;
13421
13300
  const isNeedle = marker?.type === "needle";
13422
13301
  const markerHeight = isNeedle ? trackHeight + needleOverhang * 2 : trackHeight;
13423
13302
  const markerFrac = marker != null ? fraction(marker.value, min, max) : 0;
@@ -13436,6 +13315,7 @@ function ZoneTrack({
13436
13315
  accessibilityValue: marker != null ? { min, max, now: marker.value } : { min, max, now: min },
13437
13316
  accessibilityLabel: accessibilityLabel2 ?? `Zone track: ${marker?.value ?? min}`,
13438
13317
  testID: "zone-track",
13318
+ onLayout: onTrackLayout,
13439
13319
  ...props,
13440
13320
  children: [
13441
13321
  /* @__PURE__ */ jsxs(View, { style: { position: "relative", height: markerHeight }, children: [
@@ -13537,7 +13417,7 @@ function ZoneTrack({
13537
13417
  ),
13538
13418
  ticks?.map((tick, i) => {
13539
13419
  const emphasized = tick.emphasized === true;
13540
- const lineColor = tick.color ?? (emphasized ? t15["brand-primary"] : TICK_COLOR);
13420
+ const lineColor = tick.color ?? (emphasized ? t14["brand-primary"] : TICK_COLOR);
13541
13421
  const lineWidth = emphasized ? s.tickLineEmphasized : s.tickLineNormal;
13542
13422
  return /* @__PURE__ */ jsx(
13543
13423
  View,
@@ -13567,7 +13447,8 @@ function ZoneTrack({
13567
13447
  children: ticks.map((tick, i) => {
13568
13448
  if (tick.label == null) return null;
13569
13449
  const emphasized = tick.emphasized === true;
13570
- const labelColor = tick.color ?? (emphasized ? t15["brand-primary"] : TICK_COLOR);
13450
+ if (!showTickLabel(i, emphasized)) return null;
13451
+ const labelColor = tick.color ?? (emphasized ? t14["brand-primary"] : TICK_COLOR);
13571
13452
  const labelNode = /* @__PURE__ */ jsx(
13572
13453
  Text,
13573
13454
  {
@@ -13651,7 +13532,7 @@ function FatigueMeter({
13651
13532
  }
13652
13533
  var HEAT = WORKOUT_TOKENS.heatmap;
13653
13534
  var NEUTRAL_TRACK = primitiveColors.charcoal[200];
13654
- var MONO = "monospace";
13535
+ var MONO2 = "monospace";
13655
13536
  var HEAT_BY_ZONE = {
13656
13537
  under: HEAT.under,
13657
13538
  maintenance: HEAT.maintenance,
@@ -13710,7 +13591,7 @@ function VolumeLandmarkBar({
13710
13591
  Text,
13711
13592
  {
13712
13593
  testID: "volume-landmark-pct",
13713
- style: { fontSize: 14, fontWeight: "700", fontFamily: MONO, color: fillColor },
13594
+ style: { fontSize: 14, fontWeight: "700", fontFamily: MONO2, color: fillColor },
13714
13595
  children: [
13715
13596
  pct2,
13716
13597
  "%"
@@ -13753,7 +13634,7 @@ function VolumeLandmarkBar({
13753
13634
  }
13754
13635
  );
13755
13636
  }
13756
- var t16 = getSemanticColors("dark");
13637
+ var t15 = getSemanticColors("dark");
13757
13638
  var statusToken = {
13758
13639
  productive: "status-success",
13759
13640
  threshold: "status-warning",
@@ -13770,7 +13651,7 @@ var defaultLabel = {
13770
13651
  stop: "Stop"
13771
13652
  };
13772
13653
  function statusPillColor(status) {
13773
- return t16[statusToken[status]];
13654
+ return t15[statusToken[status]];
13774
13655
  }
13775
13656
  function StatusPill2({ status, label, className, style, ...props }) {
13776
13657
  const color = statusPillColor(status);
@@ -13803,7 +13684,7 @@ function StatusPill2({ status, label, className, style, ...props }) {
13803
13684
  }
13804
13685
  );
13805
13686
  }
13806
- var t17 = getSemanticColors("dark");
13687
+ var t16 = getSemanticColors("dark");
13807
13688
  var categoryToken = {
13808
13689
  productive: null,
13809
13690
  threshold: "status-warning",
@@ -13816,7 +13697,7 @@ var floodOpacity = {
13816
13697
  };
13817
13698
  function liveAuraColor(category) {
13818
13699
  const token = categoryToken[category];
13819
- return token ? t17[token] : null;
13700
+ return token ? t16[token] : null;
13820
13701
  }
13821
13702
  function LiveAuraFrame({
13822
13703
  category,
@@ -13845,9 +13726,9 @@ function LiveAuraFrame({
13845
13726
  position: "relative",
13846
13727
  overflow: "hidden",
13847
13728
  borderRadius: 10,
13848
- backgroundColor: t17["background-base"],
13729
+ backgroundColor: t16["background-base"],
13849
13730
  borderWidth: 1,
13850
- borderColor: t17["border-default"]
13731
+ borderColor: t16["border-default"]
13851
13732
  },
13852
13733
  style
13853
13734
  ],
@@ -14074,28 +13955,28 @@ function Scatter({
14074
13955
  testID: "scatter-canvas",
14075
13956
  style: { position: "absolute", top: 0, left: 0, width, height, overflow: "hidden" },
14076
13957
  children: [
14077
- ticksOf(yd, TICK_COUNT).map((t18, i) => {
14078
- const y = toY(t18);
13958
+ ticksOf(yd, TICK_COUNT).map((t17, i) => {
13959
+ const y = toY(t17);
14079
13960
  return /* @__PURE__ */ jsx(
14080
13961
  View,
14081
13962
  {
14082
13963
  accessibilityElementsHidden: true,
14083
13964
  testID: "scatter-gridline-y",
14084
13965
  style: { position: "absolute", left: PLOT_LEFT2, width: innerW, top: y, height: 1, backgroundColor: GRID_LINE2 },
14085
- 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(t18) })
13966
+ 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(t17) })
14086
13967
  },
14087
13968
  `y-${i}`
14088
13969
  );
14089
13970
  }),
14090
- ticksOf(xd, TICK_COUNT).map((t18, i) => {
14091
- const x = toX(t18);
13971
+ ticksOf(xd, TICK_COUNT).map((t17, i) => {
13972
+ const x = toX(t17);
14092
13973
  return /* @__PURE__ */ jsx(
14093
13974
  View,
14094
13975
  {
14095
13976
  accessibilityElementsHidden: true,
14096
13977
  testID: "scatter-gridline-x",
14097
13978
  style: { position: "absolute", top: PLOT_TOP, height: innerH, left: x, width: 1, backgroundColor: GRID_LINE2 },
14098
- children: /* @__PURE__ */ jsx(Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t18) })
13979
+ children: /* @__PURE__ */ jsx(Text, { className: "text-[9px] text-text-tertiary", style: { position: "absolute", top: innerH + 4, left: -16, width: 32, textAlign: "center" }, children: formatTick(t17) })
14099
13980
  },
14100
13981
  `x-${i}`
14101
13982
  );
@@ -14156,14 +14037,14 @@ function Scatter({
14156
14037
  ] });
14157
14038
  }
14158
14039
  var sem2 = getSemanticColors("dark");
14159
- var STATUS_SUCCESS4 = sem2["status-success"];
14160
- var STATUS_WARNING4 = sem2["status-warning"];
14040
+ var STATUS_SUCCESS5 = sem2["status-success"];
14041
+ var STATUS_WARNING5 = sem2["status-warning"];
14161
14042
  var STATUS_ERROR4 = sem2["status-error"];
14162
14043
  var TRACK = "rgba(255,255,255,0.08)";
14163
14044
  var DEFAULT_THRESHOLDS2 = [
14164
14045
  { value: 0, color: STATUS_ERROR4 },
14165
- { value: 60, color: STATUS_WARNING4 },
14166
- { value: 80, color: STATUS_SUCCESS4 }
14046
+ { value: 60, color: STATUS_WARNING5 },
14047
+ { value: 80, color: STATUS_SUCCESS5 }
14167
14048
  ];
14168
14049
  var ARC_START = 135;
14169
14050
  var ARC_SWEEP = 270;
@@ -14178,7 +14059,7 @@ function formatValue2(v) {
14178
14059
  function bandColor2(fraction2, bands, min, max) {
14179
14060
  const value = min + fraction2 * (max - min);
14180
14061
  const sorted = [...bands].sort((a, b) => a.value - b.value);
14181
- let color = sorted[0]?.color ?? STATUS_SUCCESS4;
14062
+ let color = sorted[0]?.color ?? STATUS_SUCCESS5;
14182
14063
  for (const band of sorted) {
14183
14064
  if (value >= band.value) color = band.color;
14184
14065
  }
@@ -14230,23 +14111,23 @@ function Gauge2({
14230
14111
  testID: "gauge",
14231
14112
  ...props,
14232
14113
  children: [
14233
- ticks.map((t18) => /* @__PURE__ */ jsx(
14114
+ ticks.map((t17) => /* @__PURE__ */ jsx(
14234
14115
  View,
14235
14116
  {
14236
14117
  accessibilityElementsHidden: true,
14237
14118
  testID: "gauge-segment",
14238
14119
  style: {
14239
14120
  position: "absolute",
14240
- left: t18.left - tickThickness / 2,
14241
- top: t18.top - tickLength / 2,
14121
+ left: t17.left - tickThickness / 2,
14122
+ top: t17.top - tickLength / 2,
14242
14123
  width: tickThickness,
14243
14124
  height: tickLength,
14244
14125
  borderRadius: tickThickness / 2,
14245
- backgroundColor: t18.color,
14246
- transform: [{ rotate: t18.rotate }]
14126
+ backgroundColor: t17.color,
14127
+ transform: [{ rotate: t17.rotate }]
14247
14128
  }
14248
14129
  },
14249
- t18.key
14130
+ t17.key
14250
14131
  )),
14251
14132
  /* @__PURE__ */ jsxs(View, { style: { position: "absolute", top: 0, left: 0, width: size, height: size }, className: "items-center justify-center", children: [
14252
14133
  /* @__PURE__ */ jsxs(View, { className: "flex-row items-baseline gap-0.5", children: [
@@ -14666,6 +14547,6 @@ function composeValidators(...validators) {
14666
14547
  };
14667
14548
  }
14668
14549
 
14669
- export { Accordion, AccordionButton, AccordionItem, AccordionPanel, ActivityIcon, Alert, AlertDescription, AlertTitle, AlertTriangleIcon, Autocomplete, Avatar, AvatarBadge, AvatarGroup, AwardIcon, 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, CircleSlashIcon, CircularProgress, CircularTimer, Collapse, CollapseButton, CollapseContent, DashboardShell, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DumbbellIcon, EmptyState, ExerciseCard, ExerciseCardHeading, ExerciseHeading, ExerciseIndicator, FatigueMeter, FormActions, FormField, FormRow, FormSection, Gauge2 as Gauge, HStack, Heading, HelpTip, HistoryIcon, INDICATOR_PRECEDENCE, IconBox, Indicator, InfoIcon, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, LayersIcon, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, LiveAuraFrame, METRIC_FONT, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricCell, MetricGroup, MetricTiles, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, NavItem, Overline, Paragraph, PasswordInput, PersonStandingIcon, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, Radio, RadioGroup, ReadinessCheck, RestTimer, SET_STRIP_VARIABLE_COLOR, SET_STRIP_ZONES, ScaleIcon, Scatter, ScheduleTiles, Section, SectionContent, SectionHeader, SegmentedBar, SegmentedProgressBar, Select, SessionHeader, SessionRail, SessionStatePill, SetBar, SetRow, SetStrip, SetTableHeader, SetsRepsLoad, SideNav, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StatusPill2 as StatusPill, 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, Tile, TimerReadout, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, TrendingDownIcon, Typography, VStack, VelocityStrip, VoltrasMark, VolumeLandmarkBar, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, ZoneTrack, alpha, applyThemePreset, audiobookPreset, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultNavItems, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatDuration, 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, liveAuraColor, neumorphicShadows, paceTone, paceToneColor, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, resolveIndicator, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, statusPillColor, surfaceGradient, useTable, useTimer, useToast, useToolbarButton, validateCssPropertyManifest, validationRules, velocityZoneColor };
14550
+ export { Accordion, AccordionButton, AccordionItem, AccordionPanel, ActivityIcon, Alert, AlertDescription, AlertTitle, AlertTriangleIcon, Autocomplete, Avatar, AvatarBadge, AvatarGroup, AwardIcon, 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, CircleSlashIcon, CircularProgress, CircularTimer, Collapse, CollapseButton, CollapseContent, DashboardShell, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DumbbellIcon, EmptyState, ExerciseCard, ExerciseCardHeading, ExerciseHeading, ExerciseIndicator, FatigueMeter, FormActions, FormField, FormRow, FormSection, Gauge2 as Gauge, HStack, Heading, HelpTip, HistoryIcon, INDICATOR_PRECEDENCE, IconBox, Indicator, InfoIcon, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, LayersIcon, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, LiveAuraFrame, METRIC_FONT, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricCell, MetricGroup, MetricTiles, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, NavItem, Overline, Paragraph, PasswordInput, PersonStandingIcon, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, Radio, RadioGroup, ReadinessCheck, RestTimer, SET_STRIP_VARIABLE_COLOR, SET_STRIP_ZONES, ScaleIcon, Scatter, ScheduleTiles, Section, SectionContent, SectionHeader, SegmentedBar, SegmentedProgressBar, Select, SessionHeader, SessionRail, SessionStatePill, SetBar, SetRow, SetStrip, SetTableHeader, SetsRepsLoad, SideNav, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StatusPill2 as StatusPill, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, SvgIcon, Switch, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoDisplay, Tile, TimerReadout, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, TrendingDownIcon, Typography, VStack, VelocityStrip, VoltrasMark, VolumeLandmarkBar, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, ZoneTrack, alpha, applyThemePreset, audiobookPreset, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultNavItems, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatDuration, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getCategoricalColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getResultColor, getSemanticColors, getStatusColor, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, gluestackConfig, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, linearGradient, liveAuraColor, neumorphicShadows, paceTone, paceToneColor, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, resolveIndicator, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, statusPillColor, surfaceGradient, useTable, useTimer, useToast, useToolbarButton, validateCssPropertyManifest, validationRules, velocityZoneColor };
14670
14551
  //# sourceMappingURL=index.mjs.map
14671
14552
  //# sourceMappingURL=index.mjs.map