@titan-design/react-ui 0.10.0 → 0.11.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 (84) hide show
  1. package/dist/index.d.mts +399 -4
  2. package/dist/index.d.ts +399 -4
  3. package/dist/index.js +2295 -895
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.mjs +2279 -905
  6. package/dist/index.mjs.map +1 -1
  7. package/dist/{pages-DyEx-lBf.d.ts → pages-B1hqnGIC.d.ts} +149 -15
  8. package/dist/{pages-D7hOD4Vj.d.mts → pages-CvsFqNtx.d.mts} +149 -15
  9. package/dist/pages.d.mts +1 -1
  10. package/dist/pages.d.ts +1 -1
  11. package/dist/pages.js +1974 -1740
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +1975 -1741
  14. package/dist/pages.mjs.map +1 -1
  15. package/package.json +8 -3
  16. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +258 -0
  17. package/src/components/custom/Fatigue/DualGhostSpark.test.tsx +138 -0
  18. package/src/components/custom/Fatigue/DualGhostSpark.tsx +208 -0
  19. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +74 -0
  20. package/src/components/custom/Fatigue/FatigueLights.test.tsx +33 -0
  21. package/src/components/custom/Fatigue/FatigueLights.tsx +83 -0
  22. package/src/components/custom/Fatigue/GhostBand.test.tsx +235 -0
  23. package/src/components/custom/Fatigue/GhostBand.tsx +246 -0
  24. package/src/components/custom/Fatigue/GhostBloom.tsx +132 -0
  25. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +175 -0
  26. package/src/components/custom/Fatigue/GhostSpark.test.tsx +45 -0
  27. package/src/components/custom/Fatigue/GhostSpark.tsx +126 -0
  28. package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +126 -0
  29. package/src/components/custom/Fatigue/LiveFatigueCard.test.tsx +28 -0
  30. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +86 -0
  31. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +95 -0
  32. package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +151 -0
  33. package/src/components/custom/Fatigue/README.md +93 -0
  34. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +94 -0
  35. package/src/components/custom/Fatigue/RomProgressionChart.test.tsx +31 -0
  36. package/src/components/custom/Fatigue/RomProgressionChart.tsx +132 -0
  37. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +226 -0
  38. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +70 -0
  39. package/src/components/custom/Fatigue/VelocityHero.test.tsx +26 -0
  40. package/src/components/custom/Fatigue/VelocityHero.tsx +46 -0
  41. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +59 -0
  42. package/src/components/custom/Fatigue/VerdictHero.test.tsx +49 -0
  43. package/src/components/custom/Fatigue/VerdictHero.tsx +79 -0
  44. package/src/components/custom/Fatigue/fatigue-mock.test.ts +59 -0
  45. package/src/components/custom/Fatigue/fatigue-mock.ts +268 -0
  46. package/src/components/custom/Fatigue/fatigue-model.ts +129 -0
  47. package/src/components/custom/Fatigue/fatigue-tokens.test.ts +70 -0
  48. package/src/components/custom/Fatigue/fatigue-tokens.ts +180 -0
  49. package/src/components/custom/Fatigue/index.ts +41 -0
  50. package/src/components/custom/Fatigue/tempo-pacing.test.ts +176 -0
  51. package/src/components/custom/Fatigue/tempo-pacing.ts +112 -0
  52. package/src/components/custom/Workout/DualVelocityStrip.test.tsx +685 -0
  53. package/src/components/custom/Workout/ExerciseCard.test.tsx +4 -4
  54. package/src/components/custom/Workout/ExerciseCard.tsx +3 -1
  55. package/src/components/custom/Workout/ExerciseDetailPage.tsx +7 -1
  56. package/src/components/custom/Workout/README.md +62 -16
  57. package/src/components/custom/Workout/SegmentedBar.stories.tsx +3 -3
  58. package/src/components/custom/Workout/SessionRail.test.tsx +43 -0
  59. package/src/components/custom/Workout/SessionRail.tsx +50 -13
  60. package/src/components/custom/Workout/SetRow.test.tsx +6 -6
  61. package/src/components/custom/Workout/SetRow.tsx +9 -2
  62. package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +191 -0
  63. package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +186 -0
  64. package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +296 -0
  65. package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +259 -0
  66. package/src/components/custom/Workout/VelocityStrip.stories.tsx +217 -250
  67. package/src/components/custom/Workout/VelocityStrip.test.tsx +196 -79
  68. package/src/components/custom/Workout/VelocityStrip.tsx +953 -609
  69. package/src/components/custom/Workout/index.ts +3 -0
  70. package/src/components/custom/Workout/velocity-story-kit.tsx +438 -0
  71. package/src/components/custom/charts/SetBarChart.test.tsx +275 -0
  72. package/src/components/custom/charts/SetBarChart.tsx +651 -0
  73. package/src/components/custom/charts/live-rep-growth.ts +91 -0
  74. package/src/components/custom/index.ts +1 -0
  75. package/src/test/raw-color-patterns.test.ts +71 -0
  76. package/src/theme/ColorPalettes.stories.tsx +871 -0
  77. package/src/theme/ColorPrimitives.stories.tsx +300 -0
  78. package/src/theme/bar-paper.ts +59 -0
  79. package/src/theme/color-stories.coverage.test.ts +130 -0
  80. package/src/theme/color-story-kit.tsx +170 -0
  81. package/src/components/custom/Workout/VelocityStrip.modalities.stories.tsx +0 -254
  82. package/src/components/custom/Workout/VelocityStrip.responsive.stories.tsx +0 -145
  83. package/src/theme/ColorSystem.stories.tsx +0 -508
  84. package/src/theme/Colors.stories.tsx +0 -323
@@ -18,6 +18,22 @@ interface WorkoutPillProps extends ViewProps {
18
18
  }
19
19
  declare function WorkoutPill({ name, status, pulse, onPress, highlighted, className, ...props }: WorkoutPillProps): react_jsx_runtime.JSX.Element;
20
20
 
21
+ /**
22
+ * One drawn cell of the chart. `rep` carries a `value` and draws a value-height bar;
23
+ * `todo` / `variable` / `continue` are the set-type window stubs (planned remainder, the
24
+ * range floor..max window, the AMRAP/myo open tail); `empty` is a rep COLUMN a side didn't
25
+ * log — a faint constant-contrast placeholder that keeps the two diverging wings index-locked
26
+ * (a lagging side's missing rep sits at the SAME column index as the other side's rep).
27
+ * `leadingGap` adds spacing BEFORE the cell beyond the uniform inter-bar gap — the WIDE
28
+ * chunk-notch that splits drop sub-loads / myo clusters / cluster intra-rests. Absent
29
+ * `leadingGap` = the ordinary rep gap.
30
+ */
31
+ interface SetSlot {
32
+ kind: 'rep' | 'todo' | 'variable' | 'continue' | 'empty';
33
+ value?: number;
34
+ leadingGap?: number;
35
+ }
36
+
21
37
  /**
22
38
  * Structural velocity-zone band accepted from an upstream analytics source
23
39
  * (e.g. workout-analytics' `VelocityZones.bands`).
@@ -68,10 +84,63 @@ interface VelocityStripProps extends ViewProps {
68
84
  */
69
85
  zones?: readonly VelocityZoneBandProp[];
70
86
  /**
71
- * Live mode: index of the most-recently-completed rep. That bar animates in
72
- * with a "pop"; if it is also the current set peak (a new best), it "bounces"
73
- * instead. Only the latest bar animates. Honors `prefers-reduced-motion`.
74
- * Framed `expanded` chart only (interactive tap-to-expand use).
87
+ * Bar-fill coloring mode. `loss` (DEFAULT) color each performed bar by its
88
+ * velocity LOSS from the set's OWN best (see {@link getVelocityLossColor}), so a
89
+ * fatiguing set reads green→red by loss regardless of its absolute speed; ignores
90
+ * {@link zones} (it is a wholly separate scale). `zone` color from the absolute
91
+ * velocity-zone scale ({@link zones} when provided, else the built-in
92
+ * ≥1.0/≥0.75/≥0.5 default). `todo`/`variable`/`continue` slots are unaffected either way.
93
+ */
94
+ barColor?: 'zone' | 'loss';
95
+ /**
96
+ * `hero` only: draw the VL20 / VL30 velocity-loss decision bands behind the bars
97
+ * (see {@link VelocityLossBands}). Defaults to on when {@link barColor} is `loss`
98
+ * (the default), off for `zone` — the bands and the loss bar-fill are the two
99
+ * halves of the same loss-relative language.
100
+ */
101
+ showLossBands?: boolean;
102
+ /**
103
+ * `hero` only: `up` (default) grows bars UP from a bottom baseline; `down` mirrors
104
+ * the whole plot (bars grow DOWN from a top baseline, text upright). The diverging
105
+ * dual is just an `up` hero over a `down` hero sharing one axis — so any hero
106
+ * improvement reaches the dual for free.
107
+ */
108
+ orientation?: 'up' | 'down';
109
+ /**
110
+ * `hero` only: OVERRIDE the height-scaling denominator with `scaleMax * headroom` instead of
111
+ * this strip's own `peak`/`fixed` scale. Affects BAR HEIGHT ONLY — velocity-LOSS coloring and
112
+ * the running-best reference line still measure off THIS strip's own velocities. The diverging
113
+ * dual passes the pair's shared max here so a stronger arm's bars read TALLER against one common
114
+ * scale while each arm still colors by its own loss.
115
+ */
116
+ scaleMax?: number;
117
+ /**
118
+ * `hero` only (internal): suppress this strip's own 2px baseline border. The diverging dual sets
119
+ * it on BOTH composed wings and draws ONE shared centre axis where they meet, so the axis is a
120
+ * single crisp line rather than two abutting baselines reading as a double-thick rule.
121
+ */
122
+ hideBaseline?: boolean;
123
+ /**
124
+ * `hero` only (internal): the EXACT rendered column structure, overriding this strip's own
125
+ * slot-building. The diverging dual builds ONE index-locked structure shared by both wings (same
126
+ * rep indices, same WIDE-gap positions, same column count; a column a side didn't log renders
127
+ * `empty`) and passes it here so bars line up column-for-column across the centre axis. Bar
128
+ * height / color / the running-best reference still read this strip's own `velocities`.
129
+ */
130
+ columnSlots?: SetSlot[];
131
+ /**
132
+ * `hero` only: an optional stream / slot NAME (e.g. "Left Arm"), rendered as a rotated vertical
133
+ * edge label down the chart's left gutter — the same treatment the diverging dual gives each wing,
134
+ * so a single hero and a dual read consistently. Omitted → no gutter.
135
+ */
136
+ label?: string;
137
+ /**
138
+ * Live mode: index of the most-recently-completed rep. That bar GROWS UP FROM
139
+ * THE BASELINE to its full height as it enters, tracking the rep as it lands;
140
+ * if it is also the current set peak (a new best) the growth slightly
141
+ * overshoots then settles, reading as a small bounce. Only the latest bar
142
+ * animates. Honors `prefers-reduced-motion`. Framed `expanded` chart and
143
+ * `hero` only (interactive tap-to-expand use).
75
144
  */
76
145
  liveRepIndex?: number;
77
146
  /**
@@ -83,16 +152,17 @@ interface VelocityStripProps extends ViewProps {
83
152
  onToggle?: () => void;
84
153
  onRepPress?: (index: number, velocity: number) => void;
85
154
  /**
86
- * `mini` — a flat 3px static strip (set-type aware). `expanded` the velocity-
87
- * HEIGHT bar chart (rounded tops), whose chrome is prop-driven: with
88
- * {@link showNumbers} or {@link showInfo} on it's the framed chart (raised surface,
89
- * padding, per-bar m/s labels, mean/loss info row, interactive collapse); with both
90
- * off it's a bare strip — the active-set "spotlight" of {@link ExerciseCard}. `hero`
91
- * — the across-the-room, single-set wall treatment: tall bars, a per-bar m/s value
92
- * label, a dashed running-best reference line, and dashed placeholders for the reps
93
- * still to come (see {@link targetReps}). Reuses the zone scale and the live-rep pop.
155
+ * `compact` — the flat resting strip: {@link SetBarChart} in FLAT mode (uniform short bars, no
156
+ * value labels), sharing hero's exact geometry (colors, paper, spacing, chunk-notch, slots, gutter).
157
+ * `expanded` the velocity-HEIGHT bar chart (rounded tops), whose chrome is prop-driven: with
158
+ * {@link showNumbers} or {@link showInfo} on it's the framed chart (raised surface, padding, per-bar
159
+ * m/s labels, mean/loss info row, interactive collapse); with both off it's a bare strip — the
160
+ * active-set "spotlight" of {@link ExerciseCard}. `hero` — the across-the-room, single-set wall
161
+ * treatment: tall bars, a per-bar m/s value label, a dashed running-best reference line, and dashed
162
+ * placeholders for the reps still to come (see {@link targetReps}). All three share SetBarChart, so
163
+ * bars align across compact / expanded / hero.
94
164
  */
95
- variant?: 'mini' | 'expanded' | 'hero';
165
+ variant?: 'compact' | 'expanded' | 'hero';
96
166
  /** `expanded` / `hero` plot height in px (bars scale to this). Default 60 (`expanded`) / 220 (`hero`). */
97
167
  height?: number;
98
168
  /**
@@ -167,7 +237,71 @@ type VelocitySet =
167
237
  groupSize: number;
168
238
  planned?: number;
169
239
  };
170
- declare function VelocityStrip({ velocities, set, zones, liveRepIndex, expanded, onToggle, onRepPress, variant, height, targetReps, scale, showNumbers, showInfo, className, ...props }: VelocityStripProps): react_jsx_runtime.JSX.Element | null;
240
+ /** One voltra's velocity stream the SAME shape VelocityStrip accepts (one of these). */
241
+ interface DualVelocityStream {
242
+ /** Per-rep MEAN concentric velocity (m/s) for this side. */
243
+ velocities?: number[];
244
+ /** A structured set descriptor for this side (drives the typed slot vocabulary). */
245
+ set?: VelocitySet;
246
+ /**
247
+ * The side's SLOT NAME (e.g. "Left Arm"), rendered as the vertical edge label. This is
248
+ * the slot's identity supplied by data — there is no hardcoded LEFT/RIGHT fallback. When
249
+ * absent or empty, that side renders no label.
250
+ */
251
+ label?: string;
252
+ }
253
+ interface DualVelocityStripProps extends ViewProps {
254
+ /** The up-wing stream — drawn growing UP from the centre axis; its edge name comes from `left.label`. */
255
+ left: DualVelocityStream;
256
+ /** The down-wing stream — drawn growing DOWN from the centre axis; its edge name comes from `right.label`. */
257
+ right: DualVelocityStream;
258
+ /**
259
+ * Optional velocity-zone bands (shape-compatible with WA's `VelocityZones.bands`),
260
+ * shared with {@link VelocityStrip}. Colors the reps by zone on BOTH sides; side is
261
+ * never encoded by hue. When omitted the built-in default scale is used.
262
+ */
263
+ zones?: readonly VelocityZoneBandProp[];
264
+ /**
265
+ * Bar-fill coloring mode, matching {@link VelocityStrip}. `loss` (DEFAULT) — each
266
+ * wing colors by its velocity LOSS from THAT arm's own best (per-wing, since arms
267
+ * fatigue independently). `zone` — the shared absolute zone scale. Side is never
268
+ * encoded by hue either way.
269
+ */
270
+ barColor?: 'zone' | 'loss';
271
+ /**
272
+ * Planned rep count. Reps beyond a side's performed count draw as mirrored dashed
273
+ * todo stubs (same "3 of 8 done" read as the single hero), on both wings.
274
+ */
275
+ targetReps?: number;
276
+ /** Index of the most-recently-completed rep; that mirrored pair animates in (hero only). */
277
+ liveRepIndex?: number;
278
+ /**
279
+ * `hero` — the across-the-room wall scale: tall wings, per-rep m/s value labels, and a dashed
280
+ * running-best reference line per side. `compact` — the flat resting form: dual-hero but flat +
281
+ * no labels (both wings are the `compact` VelocityStrip variant), same aligned structure + shared
282
+ * gutter + axis. `rail` — the compact rail-expanded lean renderer, no labels / reference lines.
283
+ */
284
+ variant?: 'hero' | 'compact' | 'rail';
285
+ /**
286
+ * Bar-height scaling, shared across BOTH wings so the L/R asymmetry reads as bar
287
+ * length against one scale. `peak` (default) = the pair's max +headroom; `fixed` =
288
+ * a fixed velocity ceiling.
289
+ */
290
+ scale?: 'peak' | 'fixed';
291
+ /** Total plot height (px), split evenly into the up (L) and down (R) wings. */
292
+ height?: number;
293
+ className?: string;
294
+ }
295
+ /**
296
+ * The dual-voltra (bilateral) DIVERGING per-rep velocity chart. The up-wing stream grows UP, the
297
+ * down-wing stream grows DOWN from one shared centre axis. The `hero` variant COMPOSES two single
298
+ * {@link VelocityStrip} heroes (see {@link DualVelocityHero}) so any hero improvement reaches the
299
+ * dual for free; `rail` uses a lean value-height renderer ({@link DualVelocityRail}); `compact` folds
300
+ * the pair into one 8px strip ({@link DualVelocityCompactStrip}). Single-voltra sets keep using
301
+ * {@link VelocityStrip} (`variant="hero"`) — unchanged.
302
+ */
303
+ declare function DualVelocityStrip({ left, right, zones, barColor, targetReps, liveRepIndex, variant, scale, height, className, ...props }: DualVelocityStripProps): react_jsx_runtime.JSX.Element;
304
+ declare function VelocityStrip({ velocities, set, zones, barColor, showLossBands, orientation, scaleMax, hideBaseline, columnSlots, label, liveRepIndex, expanded, onToggle, onRepPress, variant, height, targetReps, scale, showNumbers, showInfo, className, ...props }: VelocityStripProps): react_jsx_runtime.JSX.Element | null;
171
305
 
172
306
  type SetRowUnit = 'lbs' | 'kg';
173
307
  /** A set's lifecycle: logged (`done`), being performed now (`live`), or planned (`todo`). */
@@ -1020,4 +1154,4 @@ declare function groupExercises(exercises: ActiveWorkoutExercise[], supersets: A
1020
1154
  */
1021
1155
  declare function ActiveWorkoutPage({ title, subtitle, exercises, supersets, input, rest, initialResting, className, ...props }: ActiveWorkoutPageProps): react_jsx_runtime.JSX.Element;
1022
1156
 
1023
- export { VelocityStrip as $, type ActiveExerciseStatus as A, type PlanWeek as B, CapacityBandChart as C, type PlanWorkout as D, type ExerciseIndicatorKind as E, type ProgramBreadcrumb as F, type ProgramNavLevel as G, type ProgramPlanningPageProps as H, INDICATOR_PRECEDENCE as I, type ProgramSelection as J, SET_STRIP_VARIABLE_COLOR as K, SET_STRIP_ZONES as L, type Meso as M, SetBar as N, type SetBarProps as O, type PlanMeso as P, SetRow as Q, type SetRowProps as R, type SetStripSet as S, type SetRowState as T, type SetRowUnit as U, StrengthTrendChart as V, type StrengthTrendChartMesoBoundary as W, type StrengthTrendChartProps as X, type StrengthTrendDataPoint as Y, type VbtSummary as Z, type VelocitySet as _, type ActiveWorkoutExercise as a, type VelocityStripProps as a0, type VelocityZoneBandProp as a1, WeekRow as a2, type WeekRowProps as a3, type WeekRowWorkout as a4, WorkoutCard as a5, type WorkoutCardProps as a6, type WorkoutDot as a7, type WorkoutDotStatus as a8, type WorkoutGroup as a9, groupExercises as aA, isUpcomingExercise as aB, summarizeVbt as aC, toActiveCardProps as aD, toExerciseCardProps as aE, toProgressBarMesos as aF, type WorkoutMuscleGroup as aa, type WorkoutMuscleVolumeStatus as ab, WorkoutPill as ac, type WorkoutPillProps as ad, type WorkoutPillStatus as ae, type WorkoutProgress as af, type WorkoutStatus as ag, calculateMeanVelocity as ah, calculateVelocityLoss as ai, getVelocityZoneColor as aj, getVelocityZoneName as ak, resolveIndicator as al, velocityZoneColor as am, ActiveWorkoutPage as an, EXERCISE_DETAIL_TABS as ao, ExerciseDetailPage as ap, ProgramPlanningPage as aq, buildBreadcrumbs as ar, countCompletedSets as as, deriveExerciseStats as at, deriveNavLevel as au, deriveWorkoutProgress as av, findActiveExercise as aw, findMeso as ax, findWeek as ay, findWorkout as az, type ActiveWorkoutInput as b, type ActiveWorkoutPageProps as c, type ActiveWorkoutRest as d, type ActiveWorkoutSuperset as e, type CapacityBandChartProps as f, type CapacityBandDataPoint as g, type CapacityBandProjection as h, ExerciseCard as i, type ExerciseCardProps as j, type ExerciseDetailEntry as k, type ExerciseDetailHeader as l, type ExerciseDetailPageProps as m, type ExerciseDetailStats as n, type ExerciseDetailTab as o, ExerciseIndicator as p, type ExerciseIndicatorProps as q, type ExerciseTrend as r, type ExerciseVbt as s, type ExerciseVbtSet as t, MesoCard as u, type MesoCardProps as v, MesoProgressBar as w, type MesoProgressBarProps as x, type MesoStatus as y, type MesoVolumeHeatmapEntry as z };
1157
+ export { type StrengthTrendDataPoint as $, type ActiveExerciseStatus as A, type MesoProgressBarProps as B, CapacityBandChart as C, type DualVelocityStream as D, type ExerciseIndicatorKind as E, type MesoStatus as F, type MesoVolumeHeatmapEntry as G, type PlanWeek as H, INDICATOR_PRECEDENCE as I, type PlanWorkout as J, type ProgramBreadcrumb as K, type ProgramNavLevel as L, type Meso as M, type ProgramPlanningPageProps as N, type ProgramSelection as O, type PlanMeso as P, SET_STRIP_VARIABLE_COLOR as Q, SET_STRIP_ZONES as R, type SetStripSet as S, SetBar as T, type SetBarProps as U, SetRow as V, type SetRowState as W, type SetRowUnit as X, StrengthTrendChart as Y, type StrengthTrendChartMesoBoundary as Z, type StrengthTrendChartProps as _, type SetRowProps as a, type VbtSummary as a0, type VelocitySet as a1, VelocityStrip as a2, type VelocityStripProps as a3, type VelocityZoneBandProp as a4, WeekRow as a5, type WeekRowProps as a6, type WeekRowWorkout as a7, WorkoutCard as a8, type WorkoutCardProps as a9, findMeso as aA, findWeek as aB, findWorkout as aC, groupExercises as aD, isUpcomingExercise as aE, summarizeVbt as aF, toActiveCardProps as aG, toExerciseCardProps as aH, toProgressBarMesos as aI, type WorkoutDot as aa, type WorkoutDotStatus as ab, type WorkoutGroup as ac, type WorkoutMuscleGroup as ad, type WorkoutMuscleVolumeStatus as ae, WorkoutPill as af, type WorkoutPillProps as ag, type WorkoutPillStatus as ah, type WorkoutProgress as ai, type WorkoutStatus as aj, calculateMeanVelocity as ak, calculateVelocityLoss as al, getVelocityZoneColor as am, getVelocityZoneName as an, resolveIndicator as ao, velocityZoneColor as ap, ActiveWorkoutPage as aq, EXERCISE_DETAIL_TABS as ar, ExerciseDetailPage as as, ProgramPlanningPage as at, buildBreadcrumbs as au, countCompletedSets as av, deriveExerciseStats as aw, deriveNavLevel as ax, deriveWorkoutProgress as ay, findActiveExercise as az, type ActiveWorkoutExercise as b, type ActiveWorkoutInput as c, type ActiveWorkoutPageProps as d, type ActiveWorkoutRest as e, type ActiveWorkoutSuperset as f, type CapacityBandChartProps as g, type CapacityBandDataPoint as h, type CapacityBandProjection as i, DualVelocityStrip as j, type DualVelocityStripProps as k, ExerciseCard as l, type ExerciseCardProps as m, type ExerciseDetailEntry as n, type ExerciseDetailHeader as o, type ExerciseDetailPageProps as p, type ExerciseDetailStats as q, type ExerciseDetailTab as r, ExerciseIndicator as s, type ExerciseIndicatorProps as t, type ExerciseTrend as u, type ExerciseVbt as v, type ExerciseVbtSet as w, MesoCard as x, type MesoCardProps as y, MesoProgressBar as z };
@@ -18,6 +18,22 @@ interface WorkoutPillProps extends ViewProps {
18
18
  }
19
19
  declare function WorkoutPill({ name, status, pulse, onPress, highlighted, className, ...props }: WorkoutPillProps): react_jsx_runtime.JSX.Element;
20
20
 
21
+ /**
22
+ * One drawn cell of the chart. `rep` carries a `value` and draws a value-height bar;
23
+ * `todo` / `variable` / `continue` are the set-type window stubs (planned remainder, the
24
+ * range floor..max window, the AMRAP/myo open tail); `empty` is a rep COLUMN a side didn't
25
+ * log — a faint constant-contrast placeholder that keeps the two diverging wings index-locked
26
+ * (a lagging side's missing rep sits at the SAME column index as the other side's rep).
27
+ * `leadingGap` adds spacing BEFORE the cell beyond the uniform inter-bar gap — the WIDE
28
+ * chunk-notch that splits drop sub-loads / myo clusters / cluster intra-rests. Absent
29
+ * `leadingGap` = the ordinary rep gap.
30
+ */
31
+ interface SetSlot {
32
+ kind: 'rep' | 'todo' | 'variable' | 'continue' | 'empty';
33
+ value?: number;
34
+ leadingGap?: number;
35
+ }
36
+
21
37
  /**
22
38
  * Structural velocity-zone band accepted from an upstream analytics source
23
39
  * (e.g. workout-analytics' `VelocityZones.bands`).
@@ -68,10 +84,63 @@ interface VelocityStripProps extends ViewProps {
68
84
  */
69
85
  zones?: readonly VelocityZoneBandProp[];
70
86
  /**
71
- * Live mode: index of the most-recently-completed rep. That bar animates in
72
- * with a "pop"; if it is also the current set peak (a new best), it "bounces"
73
- * instead. Only the latest bar animates. Honors `prefers-reduced-motion`.
74
- * Framed `expanded` chart only (interactive tap-to-expand use).
87
+ * Bar-fill coloring mode. `loss` (DEFAULT) color each performed bar by its
88
+ * velocity LOSS from the set's OWN best (see {@link getVelocityLossColor}), so a
89
+ * fatiguing set reads green→red by loss regardless of its absolute speed; ignores
90
+ * {@link zones} (it is a wholly separate scale). `zone` color from the absolute
91
+ * velocity-zone scale ({@link zones} when provided, else the built-in
92
+ * ≥1.0/≥0.75/≥0.5 default). `todo`/`variable`/`continue` slots are unaffected either way.
93
+ */
94
+ barColor?: 'zone' | 'loss';
95
+ /**
96
+ * `hero` only: draw the VL20 / VL30 velocity-loss decision bands behind the bars
97
+ * (see {@link VelocityLossBands}). Defaults to on when {@link barColor} is `loss`
98
+ * (the default), off for `zone` — the bands and the loss bar-fill are the two
99
+ * halves of the same loss-relative language.
100
+ */
101
+ showLossBands?: boolean;
102
+ /**
103
+ * `hero` only: `up` (default) grows bars UP from a bottom baseline; `down` mirrors
104
+ * the whole plot (bars grow DOWN from a top baseline, text upright). The diverging
105
+ * dual is just an `up` hero over a `down` hero sharing one axis — so any hero
106
+ * improvement reaches the dual for free.
107
+ */
108
+ orientation?: 'up' | 'down';
109
+ /**
110
+ * `hero` only: OVERRIDE the height-scaling denominator with `scaleMax * headroom` instead of
111
+ * this strip's own `peak`/`fixed` scale. Affects BAR HEIGHT ONLY — velocity-LOSS coloring and
112
+ * the running-best reference line still measure off THIS strip's own velocities. The diverging
113
+ * dual passes the pair's shared max here so a stronger arm's bars read TALLER against one common
114
+ * scale while each arm still colors by its own loss.
115
+ */
116
+ scaleMax?: number;
117
+ /**
118
+ * `hero` only (internal): suppress this strip's own 2px baseline border. The diverging dual sets
119
+ * it on BOTH composed wings and draws ONE shared centre axis where they meet, so the axis is a
120
+ * single crisp line rather than two abutting baselines reading as a double-thick rule.
121
+ */
122
+ hideBaseline?: boolean;
123
+ /**
124
+ * `hero` only (internal): the EXACT rendered column structure, overriding this strip's own
125
+ * slot-building. The diverging dual builds ONE index-locked structure shared by both wings (same
126
+ * rep indices, same WIDE-gap positions, same column count; a column a side didn't log renders
127
+ * `empty`) and passes it here so bars line up column-for-column across the centre axis. Bar
128
+ * height / color / the running-best reference still read this strip's own `velocities`.
129
+ */
130
+ columnSlots?: SetSlot[];
131
+ /**
132
+ * `hero` only: an optional stream / slot NAME (e.g. "Left Arm"), rendered as a rotated vertical
133
+ * edge label down the chart's left gutter — the same treatment the diverging dual gives each wing,
134
+ * so a single hero and a dual read consistently. Omitted → no gutter.
135
+ */
136
+ label?: string;
137
+ /**
138
+ * Live mode: index of the most-recently-completed rep. That bar GROWS UP FROM
139
+ * THE BASELINE to its full height as it enters, tracking the rep as it lands;
140
+ * if it is also the current set peak (a new best) the growth slightly
141
+ * overshoots then settles, reading as a small bounce. Only the latest bar
142
+ * animates. Honors `prefers-reduced-motion`. Framed `expanded` chart and
143
+ * `hero` only (interactive tap-to-expand use).
75
144
  */
76
145
  liveRepIndex?: number;
77
146
  /**
@@ -83,16 +152,17 @@ interface VelocityStripProps extends ViewProps {
83
152
  onToggle?: () => void;
84
153
  onRepPress?: (index: number, velocity: number) => void;
85
154
  /**
86
- * `mini` — a flat 3px static strip (set-type aware). `expanded` the velocity-
87
- * HEIGHT bar chart (rounded tops), whose chrome is prop-driven: with
88
- * {@link showNumbers} or {@link showInfo} on it's the framed chart (raised surface,
89
- * padding, per-bar m/s labels, mean/loss info row, interactive collapse); with both
90
- * off it's a bare strip — the active-set "spotlight" of {@link ExerciseCard}. `hero`
91
- * — the across-the-room, single-set wall treatment: tall bars, a per-bar m/s value
92
- * label, a dashed running-best reference line, and dashed placeholders for the reps
93
- * still to come (see {@link targetReps}). Reuses the zone scale and the live-rep pop.
155
+ * `compact` — the flat resting strip: {@link SetBarChart} in FLAT mode (uniform short bars, no
156
+ * value labels), sharing hero's exact geometry (colors, paper, spacing, chunk-notch, slots, gutter).
157
+ * `expanded` the velocity-HEIGHT bar chart (rounded tops), whose chrome is prop-driven: with
158
+ * {@link showNumbers} or {@link showInfo} on it's the framed chart (raised surface, padding, per-bar
159
+ * m/s labels, mean/loss info row, interactive collapse); with both off it's a bare strip — the
160
+ * active-set "spotlight" of {@link ExerciseCard}. `hero` — the across-the-room, single-set wall
161
+ * treatment: tall bars, a per-bar m/s value label, a dashed running-best reference line, and dashed
162
+ * placeholders for the reps still to come (see {@link targetReps}). All three share SetBarChart, so
163
+ * bars align across compact / expanded / hero.
94
164
  */
95
- variant?: 'mini' | 'expanded' | 'hero';
165
+ variant?: 'compact' | 'expanded' | 'hero';
96
166
  /** `expanded` / `hero` plot height in px (bars scale to this). Default 60 (`expanded`) / 220 (`hero`). */
97
167
  height?: number;
98
168
  /**
@@ -167,7 +237,71 @@ type VelocitySet =
167
237
  groupSize: number;
168
238
  planned?: number;
169
239
  };
170
- declare function VelocityStrip({ velocities, set, zones, liveRepIndex, expanded, onToggle, onRepPress, variant, height, targetReps, scale, showNumbers, showInfo, className, ...props }: VelocityStripProps): react_jsx_runtime.JSX.Element | null;
240
+ /** One voltra's velocity stream the SAME shape VelocityStrip accepts (one of these). */
241
+ interface DualVelocityStream {
242
+ /** Per-rep MEAN concentric velocity (m/s) for this side. */
243
+ velocities?: number[];
244
+ /** A structured set descriptor for this side (drives the typed slot vocabulary). */
245
+ set?: VelocitySet;
246
+ /**
247
+ * The side's SLOT NAME (e.g. "Left Arm"), rendered as the vertical edge label. This is
248
+ * the slot's identity supplied by data — there is no hardcoded LEFT/RIGHT fallback. When
249
+ * absent or empty, that side renders no label.
250
+ */
251
+ label?: string;
252
+ }
253
+ interface DualVelocityStripProps extends ViewProps {
254
+ /** The up-wing stream — drawn growing UP from the centre axis; its edge name comes from `left.label`. */
255
+ left: DualVelocityStream;
256
+ /** The down-wing stream — drawn growing DOWN from the centre axis; its edge name comes from `right.label`. */
257
+ right: DualVelocityStream;
258
+ /**
259
+ * Optional velocity-zone bands (shape-compatible with WA's `VelocityZones.bands`),
260
+ * shared with {@link VelocityStrip}. Colors the reps by zone on BOTH sides; side is
261
+ * never encoded by hue. When omitted the built-in default scale is used.
262
+ */
263
+ zones?: readonly VelocityZoneBandProp[];
264
+ /**
265
+ * Bar-fill coloring mode, matching {@link VelocityStrip}. `loss` (DEFAULT) — each
266
+ * wing colors by its velocity LOSS from THAT arm's own best (per-wing, since arms
267
+ * fatigue independently). `zone` — the shared absolute zone scale. Side is never
268
+ * encoded by hue either way.
269
+ */
270
+ barColor?: 'zone' | 'loss';
271
+ /**
272
+ * Planned rep count. Reps beyond a side's performed count draw as mirrored dashed
273
+ * todo stubs (same "3 of 8 done" read as the single hero), on both wings.
274
+ */
275
+ targetReps?: number;
276
+ /** Index of the most-recently-completed rep; that mirrored pair animates in (hero only). */
277
+ liveRepIndex?: number;
278
+ /**
279
+ * `hero` — the across-the-room wall scale: tall wings, per-rep m/s value labels, and a dashed
280
+ * running-best reference line per side. `compact` — the flat resting form: dual-hero but flat +
281
+ * no labels (both wings are the `compact` VelocityStrip variant), same aligned structure + shared
282
+ * gutter + axis. `rail` — the compact rail-expanded lean renderer, no labels / reference lines.
283
+ */
284
+ variant?: 'hero' | 'compact' | 'rail';
285
+ /**
286
+ * Bar-height scaling, shared across BOTH wings so the L/R asymmetry reads as bar
287
+ * length against one scale. `peak` (default) = the pair's max +headroom; `fixed` =
288
+ * a fixed velocity ceiling.
289
+ */
290
+ scale?: 'peak' | 'fixed';
291
+ /** Total plot height (px), split evenly into the up (L) and down (R) wings. */
292
+ height?: number;
293
+ className?: string;
294
+ }
295
+ /**
296
+ * The dual-voltra (bilateral) DIVERGING per-rep velocity chart. The up-wing stream grows UP, the
297
+ * down-wing stream grows DOWN from one shared centre axis. The `hero` variant COMPOSES two single
298
+ * {@link VelocityStrip} heroes (see {@link DualVelocityHero}) so any hero improvement reaches the
299
+ * dual for free; `rail` uses a lean value-height renderer ({@link DualVelocityRail}); `compact` folds
300
+ * the pair into one 8px strip ({@link DualVelocityCompactStrip}). Single-voltra sets keep using
301
+ * {@link VelocityStrip} (`variant="hero"`) — unchanged.
302
+ */
303
+ declare function DualVelocityStrip({ left, right, zones, barColor, targetReps, liveRepIndex, variant, scale, height, className, ...props }: DualVelocityStripProps): react_jsx_runtime.JSX.Element;
304
+ declare function VelocityStrip({ velocities, set, zones, barColor, showLossBands, orientation, scaleMax, hideBaseline, columnSlots, label, liveRepIndex, expanded, onToggle, onRepPress, variant, height, targetReps, scale, showNumbers, showInfo, className, ...props }: VelocityStripProps): react_jsx_runtime.JSX.Element | null;
171
305
 
172
306
  type SetRowUnit = 'lbs' | 'kg';
173
307
  /** A set's lifecycle: logged (`done`), being performed now (`live`), or planned (`todo`). */
@@ -1020,4 +1154,4 @@ declare function groupExercises(exercises: ActiveWorkoutExercise[], supersets: A
1020
1154
  */
1021
1155
  declare function ActiveWorkoutPage({ title, subtitle, exercises, supersets, input, rest, initialResting, className, ...props }: ActiveWorkoutPageProps): react_jsx_runtime.JSX.Element;
1022
1156
 
1023
- export { VelocityStrip as $, type ActiveExerciseStatus as A, type PlanWeek as B, CapacityBandChart as C, type PlanWorkout as D, type ExerciseIndicatorKind as E, type ProgramBreadcrumb as F, type ProgramNavLevel as G, type ProgramPlanningPageProps as H, INDICATOR_PRECEDENCE as I, type ProgramSelection as J, SET_STRIP_VARIABLE_COLOR as K, SET_STRIP_ZONES as L, type Meso as M, SetBar as N, type SetBarProps as O, type PlanMeso as P, SetRow as Q, type SetRowProps as R, type SetStripSet as S, type SetRowState as T, type SetRowUnit as U, StrengthTrendChart as V, type StrengthTrendChartMesoBoundary as W, type StrengthTrendChartProps as X, type StrengthTrendDataPoint as Y, type VbtSummary as Z, type VelocitySet as _, type ActiveWorkoutExercise as a, type VelocityStripProps as a0, type VelocityZoneBandProp as a1, WeekRow as a2, type WeekRowProps as a3, type WeekRowWorkout as a4, WorkoutCard as a5, type WorkoutCardProps as a6, type WorkoutDot as a7, type WorkoutDotStatus as a8, type WorkoutGroup as a9, groupExercises as aA, isUpcomingExercise as aB, summarizeVbt as aC, toActiveCardProps as aD, toExerciseCardProps as aE, toProgressBarMesos as aF, type WorkoutMuscleGroup as aa, type WorkoutMuscleVolumeStatus as ab, WorkoutPill as ac, type WorkoutPillProps as ad, type WorkoutPillStatus as ae, type WorkoutProgress as af, type WorkoutStatus as ag, calculateMeanVelocity as ah, calculateVelocityLoss as ai, getVelocityZoneColor as aj, getVelocityZoneName as ak, resolveIndicator as al, velocityZoneColor as am, ActiveWorkoutPage as an, EXERCISE_DETAIL_TABS as ao, ExerciseDetailPage as ap, ProgramPlanningPage as aq, buildBreadcrumbs as ar, countCompletedSets as as, deriveExerciseStats as at, deriveNavLevel as au, deriveWorkoutProgress as av, findActiveExercise as aw, findMeso as ax, findWeek as ay, findWorkout as az, type ActiveWorkoutInput as b, type ActiveWorkoutPageProps as c, type ActiveWorkoutRest as d, type ActiveWorkoutSuperset as e, type CapacityBandChartProps as f, type CapacityBandDataPoint as g, type CapacityBandProjection as h, ExerciseCard as i, type ExerciseCardProps as j, type ExerciseDetailEntry as k, type ExerciseDetailHeader as l, type ExerciseDetailPageProps as m, type ExerciseDetailStats as n, type ExerciseDetailTab as o, ExerciseIndicator as p, type ExerciseIndicatorProps as q, type ExerciseTrend as r, type ExerciseVbt as s, type ExerciseVbtSet as t, MesoCard as u, type MesoCardProps as v, MesoProgressBar as w, type MesoProgressBarProps as x, type MesoStatus as y, type MesoVolumeHeatmapEntry as z };
1157
+ export { type StrengthTrendDataPoint as $, type ActiveExerciseStatus as A, type MesoProgressBarProps as B, CapacityBandChart as C, type DualVelocityStream as D, type ExerciseIndicatorKind as E, type MesoStatus as F, type MesoVolumeHeatmapEntry as G, type PlanWeek as H, INDICATOR_PRECEDENCE as I, type PlanWorkout as J, type ProgramBreadcrumb as K, type ProgramNavLevel as L, type Meso as M, type ProgramPlanningPageProps as N, type ProgramSelection as O, type PlanMeso as P, SET_STRIP_VARIABLE_COLOR as Q, SET_STRIP_ZONES as R, type SetStripSet as S, SetBar as T, type SetBarProps as U, SetRow as V, type SetRowState as W, type SetRowUnit as X, StrengthTrendChart as Y, type StrengthTrendChartMesoBoundary as Z, type StrengthTrendChartProps as _, type SetRowProps as a, type VbtSummary as a0, type VelocitySet as a1, VelocityStrip as a2, type VelocityStripProps as a3, type VelocityZoneBandProp as a4, WeekRow as a5, type WeekRowProps as a6, type WeekRowWorkout as a7, WorkoutCard as a8, type WorkoutCardProps as a9, findMeso as aA, findWeek as aB, findWorkout as aC, groupExercises as aD, isUpcomingExercise as aE, summarizeVbt as aF, toActiveCardProps as aG, toExerciseCardProps as aH, toProgressBarMesos as aI, type WorkoutDot as aa, type WorkoutDotStatus as ab, type WorkoutGroup as ac, type WorkoutMuscleGroup as ad, type WorkoutMuscleVolumeStatus as ae, WorkoutPill as af, type WorkoutPillProps as ag, type WorkoutPillStatus as ah, type WorkoutProgress as ai, type WorkoutStatus as aj, calculateMeanVelocity as ak, calculateVelocityLoss as al, getVelocityZoneColor as am, getVelocityZoneName as an, resolveIndicator as ao, velocityZoneColor as ap, ActiveWorkoutPage as aq, EXERCISE_DETAIL_TABS as ar, ExerciseDetailPage as as, ProgramPlanningPage as at, buildBreadcrumbs as au, countCompletedSets as av, deriveExerciseStats as aw, deriveNavLevel as ax, deriveWorkoutProgress as ay, findActiveExercise as az, type ActiveWorkoutExercise as b, type ActiveWorkoutInput as c, type ActiveWorkoutPageProps as d, type ActiveWorkoutRest as e, type ActiveWorkoutSuperset as f, type CapacityBandChartProps as g, type CapacityBandDataPoint as h, type CapacityBandProjection as i, DualVelocityStrip as j, type DualVelocityStripProps as k, ExerciseCard as l, type ExerciseCardProps as m, type ExerciseDetailEntry as n, type ExerciseDetailHeader as o, type ExerciseDetailPageProps as p, type ExerciseDetailStats as q, type ExerciseDetailTab as r, ExerciseIndicator as s, type ExerciseIndicatorProps as t, type ExerciseTrend as u, type ExerciseVbt as v, type ExerciseVbtSet as w, MesoCard as x, type MesoCardProps as y, MesoProgressBar as z };
package/dist/pages.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ActiveExerciseStatus, a as ActiveWorkoutExercise, b as ActiveWorkoutInput, an as ActiveWorkoutPage, c as ActiveWorkoutPageProps, d as ActiveWorkoutRest, e as ActiveWorkoutSuperset, ao as EXERCISE_DETAIL_TABS, k as ExerciseDetailEntry, l as ExerciseDetailHeader, ap as ExerciseDetailPage, m as ExerciseDetailPageProps, n as ExerciseDetailStats, o as ExerciseDetailTab, r as ExerciseTrend, s as ExerciseVbt, t as ExerciseVbtSet, P as PlanMeso, B as PlanWeek, D as PlanWorkout, F as ProgramBreadcrumb, G as ProgramNavLevel, aq as ProgramPlanningPage, H as ProgramPlanningPageProps, J as ProgramSelection, Z as VbtSummary, a9 as WorkoutGroup, af as WorkoutProgress, ar as buildBreadcrumbs, as as countCompletedSets, at as deriveExerciseStats, au as deriveNavLevel, av as deriveWorkoutProgress, aw as findActiveExercise, ax as findMeso, ay as findWeek, az as findWorkout, aA as groupExercises, aB as isUpcomingExercise, aC as summarizeVbt, aD as toActiveCardProps, aE as toExerciseCardProps, aF as toProgressBarMesos } from './pages-D7hOD4Vj.mjs';
1
+ export { A as ActiveExerciseStatus, b as ActiveWorkoutExercise, c as ActiveWorkoutInput, aq as ActiveWorkoutPage, d as ActiveWorkoutPageProps, e as ActiveWorkoutRest, f as ActiveWorkoutSuperset, ar as EXERCISE_DETAIL_TABS, n as ExerciseDetailEntry, o as ExerciseDetailHeader, as as ExerciseDetailPage, p as ExerciseDetailPageProps, q as ExerciseDetailStats, r as ExerciseDetailTab, u as ExerciseTrend, v as ExerciseVbt, w as ExerciseVbtSet, P as PlanMeso, H as PlanWeek, J as PlanWorkout, K as ProgramBreadcrumb, L as ProgramNavLevel, at as ProgramPlanningPage, N as ProgramPlanningPageProps, O as ProgramSelection, a0 as VbtSummary, ac as WorkoutGroup, ai as WorkoutProgress, au as buildBreadcrumbs, av as countCompletedSets, aw as deriveExerciseStats, ax as deriveNavLevel, ay as deriveWorkoutProgress, az as findActiveExercise, aA as findMeso, aB as findWeek, aC as findWorkout, aD as groupExercises, aE as isUpcomingExercise, aF as summarizeVbt, aG as toActiveCardProps, aH as toExerciseCardProps, aI as toProgressBarMesos } from './pages-CvsFqNtx.mjs';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react-native';
4
4
  import './MesoStatusCard-CQk71hSi.mjs';
package/dist/pages.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { A as ActiveExerciseStatus, a as ActiveWorkoutExercise, b as ActiveWorkoutInput, an as ActiveWorkoutPage, c as ActiveWorkoutPageProps, d as ActiveWorkoutRest, e as ActiveWorkoutSuperset, ao as EXERCISE_DETAIL_TABS, k as ExerciseDetailEntry, l as ExerciseDetailHeader, ap as ExerciseDetailPage, m as ExerciseDetailPageProps, n as ExerciseDetailStats, o as ExerciseDetailTab, r as ExerciseTrend, s as ExerciseVbt, t as ExerciseVbtSet, P as PlanMeso, B as PlanWeek, D as PlanWorkout, F as ProgramBreadcrumb, G as ProgramNavLevel, aq as ProgramPlanningPage, H as ProgramPlanningPageProps, J as ProgramSelection, Z as VbtSummary, a9 as WorkoutGroup, af as WorkoutProgress, ar as buildBreadcrumbs, as as countCompletedSets, at as deriveExerciseStats, au as deriveNavLevel, av as deriveWorkoutProgress, aw as findActiveExercise, ax as findMeso, ay as findWeek, az as findWorkout, aA as groupExercises, aB as isUpcomingExercise, aC as summarizeVbt, aD as toActiveCardProps, aE as toExerciseCardProps, aF as toProgressBarMesos } from './pages-DyEx-lBf.js';
1
+ export { A as ActiveExerciseStatus, b as ActiveWorkoutExercise, c as ActiveWorkoutInput, aq as ActiveWorkoutPage, d as ActiveWorkoutPageProps, e as ActiveWorkoutRest, f as ActiveWorkoutSuperset, ar as EXERCISE_DETAIL_TABS, n as ExerciseDetailEntry, o as ExerciseDetailHeader, as as ExerciseDetailPage, p as ExerciseDetailPageProps, q as ExerciseDetailStats, r as ExerciseDetailTab, u as ExerciseTrend, v as ExerciseVbt, w as ExerciseVbtSet, P as PlanMeso, H as PlanWeek, J as PlanWorkout, K as ProgramBreadcrumb, L as ProgramNavLevel, at as ProgramPlanningPage, N as ProgramPlanningPageProps, O as ProgramSelection, a0 as VbtSummary, ac as WorkoutGroup, ai as WorkoutProgress, au as buildBreadcrumbs, av as countCompletedSets, aw as deriveExerciseStats, ax as deriveNavLevel, ay as deriveWorkoutProgress, az as findActiveExercise, aA as findMeso, aB as findWeek, aC as findWorkout, aD as groupExercises, aE as isUpcomingExercise, aF as summarizeVbt, aG as toActiveCardProps, aH as toExerciseCardProps, aI as toProgressBarMesos } from './pages-B1hqnGIC.js';
2
2
  import 'react/jsx-runtime';
3
3
  import 'react-native';
4
4
  import './MesoStatusCard-CQk71hSi.js';