@titan-design/react-ui 0.6.0 → 0.8.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 (258) hide show
  1. package/dist/bodymap.js +12 -7
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +12 -7
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +956 -128
  6. package/dist/index.d.ts +956 -128
  7. package/dist/index.js +2873 -981
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +2826 -982
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/{pages-MO0JCySL.d.mts → pages-DCFBqp79.d.mts} +289 -57
  12. package/dist/{pages-D7Jlssvp.d.ts → pages-_fI3-x7Z.d.ts} +289 -57
  13. package/dist/pages.d.mts +1 -1
  14. package/dist/pages.d.ts +1 -1
  15. package/dist/pages.js +1659 -799
  16. package/dist/pages.js.map +1 -1
  17. package/dist/pages.mjs +1660 -800
  18. package/dist/pages.mjs.map +1 -1
  19. package/dist/theme/index.d.mts +16 -82
  20. package/dist/theme/index.d.ts +16 -82
  21. package/dist/theme/index.js +13 -115
  22. package/dist/theme/index.js.map +1 -1
  23. package/dist/theme/index.mjs +13 -115
  24. package/dist/theme/index.mjs.map +1 -1
  25. package/dist/theme/tokens-css.js +14 -6
  26. package/dist/theme/tokens-css.js.map +1 -1
  27. package/dist/theme/tokens-css.mjs +14 -6
  28. package/dist/theme/tokens-css.mjs.map +1 -1
  29. package/package.json +1 -1
  30. package/src/arch/Architecture.stories.tsx +870 -0
  31. package/src/arch/annotations.json +48 -0
  32. package/src/arch/arch-graph.json +4301 -0
  33. package/src/components/custom/CircularTimer/CircularTimer.stories.tsx +90 -0
  34. package/src/components/custom/CircularTimer/CircularTimer.test.tsx +62 -0
  35. package/src/components/custom/CircularTimer/CircularTimer.tsx +112 -0
  36. package/src/components/custom/CircularTimer/index.ts +1 -0
  37. package/src/components/custom/DateTime/DateTime.stories.tsx +1 -1
  38. package/src/components/custom/EmptyState/EmptyState.stories.tsx +1 -1
  39. package/src/components/custom/Gauge/Gauge.stories.tsx +1 -1
  40. package/src/components/custom/Metric/Metric.stories.tsx +1 -1
  41. package/src/components/custom/Scatter/Scatter.stories.tsx +1 -1
  42. package/src/components/custom/Sidebar/Sidebar.stories.tsx +1 -1
  43. package/src/components/custom/Table/Table.stories.tsx +1 -1
  44. package/src/components/custom/TimerReadout/TimerReadout.stories.tsx +62 -0
  45. package/src/components/custom/TimerReadout/TimerReadout.test.tsx +72 -0
  46. package/src/components/custom/TimerReadout/TimerReadout.tsx +75 -0
  47. package/src/components/custom/TimerReadout/index.ts +1 -0
  48. package/src/components/custom/Treemap/Treemap.stories.tsx +1 -1
  49. package/src/components/custom/Typography/Typography.stories.tsx +1 -1
  50. package/src/components/custom/Workout/ActiveWorkoutPage.stories.tsx +21 -13
  51. package/src/components/custom/Workout/ActiveWorkoutPage.test.tsx +16 -13
  52. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +9 -15
  53. package/src/components/custom/Workout/BaseBadge.stories.tsx +1 -1
  54. package/src/components/custom/Workout/BodyMap.stories.tsx +1 -1
  55. package/src/components/custom/Workout/BodyMapDetailPanel.stories.tsx +1 -1
  56. package/src/components/custom/Workout/CapacityBandChart.stories.tsx +1 -1
  57. package/src/components/custom/Workout/DeviationBar.stories.tsx +1 -1
  58. package/src/components/custom/Workout/ExerciseCard.stories.tsx +51 -66
  59. package/src/components/custom/Workout/ExerciseCard.test.tsx +146 -143
  60. package/src/components/custom/Workout/ExerciseCard.tsx +176 -198
  61. package/src/components/custom/Workout/ExerciseCardHeading.stories.tsx +99 -0
  62. package/src/components/custom/Workout/ExerciseCardHeading.test.tsx +72 -0
  63. package/src/components/custom/Workout/ExerciseCardHeading.tsx +43 -0
  64. package/src/components/custom/Workout/ExerciseCardUnified.stories.tsx +151 -0
  65. package/src/components/custom/Workout/ExerciseDetailPage.stories.tsx +5 -3
  66. package/src/components/custom/Workout/ExerciseDetailPage.test.tsx +4 -4
  67. package/src/components/custom/Workout/ExerciseDetailPage.tsx +4 -5
  68. package/src/components/custom/Workout/ExerciseHeading.stories.tsx +81 -0
  69. package/src/components/custom/Workout/ExerciseHeading.test.tsx +77 -0
  70. package/src/components/custom/Workout/ExerciseHeading.tsx +85 -0
  71. package/src/components/custom/Workout/ExerciseIndicator.stories.tsx +110 -0
  72. package/src/components/custom/Workout/ExerciseIndicator.test.tsx +93 -0
  73. package/src/components/custom/Workout/ExerciseIndicator.tsx +120 -0
  74. package/src/components/custom/Workout/FatigueMeter.stories.tsx +51 -0
  75. package/src/components/custom/Workout/FatigueMeter.test.tsx +85 -0
  76. package/src/components/custom/Workout/FatigueMeter.tsx +86 -0
  77. package/src/components/custom/Workout/InputBar.stories.tsx +1 -1
  78. package/src/components/custom/Workout/IntensityBar.stories.tsx +1 -1
  79. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +153 -0
  80. package/src/components/custom/Workout/LiveAuraFrame.test.tsx +74 -0
  81. package/src/components/custom/Workout/LiveAuraFrame.tsx +105 -0
  82. package/src/components/custom/Workout/MesoCard.stories.tsx +1 -1
  83. package/src/components/custom/Workout/MesoProgressBar.stories.tsx +1 -1
  84. package/src/components/custom/Workout/MesoStatusCard.stories.tsx +1 -1
  85. package/src/components/custom/Workout/MetricTiles.stories.tsx +60 -0
  86. package/src/components/custom/Workout/MetricTiles.test.tsx +58 -0
  87. package/src/components/custom/Workout/MetricTiles.tsx +48 -0
  88. package/src/components/custom/Workout/MuscleGroupChip.stories.tsx +1 -1
  89. package/src/components/custom/Workout/PlaceholderStrip.stories.tsx +1 -1
  90. package/src/components/custom/Workout/PrBadge.stories.tsx +1 -1
  91. package/src/components/custom/Workout/PrHistoryModal.stories.tsx +1 -1
  92. package/src/components/custom/Workout/ProgramPlanningPage.stories.tsx +4 -16
  93. package/src/components/custom/Workout/ProgramPlanningPage.tsx +8 -6
  94. package/src/components/custom/Workout/README.md +193 -4
  95. package/src/components/custom/Workout/ReadinessCheck.stories.tsx +1 -1
  96. package/src/components/custom/Workout/RestTimer.stories.tsx +133 -3
  97. package/src/components/custom/Workout/RestTimer.test.tsx +73 -0
  98. package/src/components/custom/Workout/RestTimer.tsx +155 -59
  99. package/src/components/custom/Workout/RowInventory.stories.tsx +405 -0
  100. package/src/components/custom/Workout/S3FullRail.stories.tsx +34 -0
  101. package/src/components/custom/Workout/S3SessionPace.stories.tsx +95 -0
  102. package/src/components/custom/Workout/S3SessionRailHeading.stories.tsx +61 -0
  103. package/src/components/custom/Workout/S3SetTypes.stories.tsx +176 -0
  104. package/src/components/custom/Workout/S3WorkoutExpansion.stories.tsx +240 -0
  105. package/src/components/custom/Workout/ScheduleTiles.stories.tsx +40 -0
  106. package/src/components/custom/Workout/ScheduleTiles.test.tsx +34 -0
  107. package/src/components/custom/Workout/ScheduleTiles.tsx +70 -0
  108. package/src/components/custom/Workout/SegmentedBar.stories.tsx +99 -0
  109. package/src/components/custom/Workout/SegmentedBar.test.tsx +77 -0
  110. package/src/components/custom/Workout/SegmentedBar.tsx +172 -0
  111. package/src/components/custom/Workout/SegmentedProgressBar.stories.tsx +50 -0
  112. package/src/components/custom/Workout/SegmentedProgressBar.test.tsx +80 -0
  113. package/src/components/custom/Workout/SegmentedProgressBar.tsx +67 -0
  114. package/src/components/custom/Workout/SessionHeader.stories.tsx +121 -0
  115. package/src/components/custom/Workout/SessionHeader.test.tsx +122 -0
  116. package/src/components/custom/Workout/SessionHeader.tsx +152 -0
  117. package/src/components/custom/Workout/SessionRail.stories.tsx +153 -0
  118. package/src/components/custom/Workout/SessionRail.test.tsx +86 -0
  119. package/src/components/custom/Workout/SessionRail.tsx +126 -0
  120. package/src/components/custom/Workout/SetBar.stories.tsx +124 -0
  121. package/src/components/custom/Workout/SetBar.test.tsx +123 -0
  122. package/src/components/custom/Workout/SetBar.tsx +171 -0
  123. package/src/components/custom/Workout/SetRow.stories.tsx +50 -100
  124. package/src/components/custom/Workout/SetRow.test.tsx +94 -166
  125. package/src/components/custom/Workout/SetRow.tsx +169 -232
  126. package/src/components/custom/Workout/SetStrip.stories.tsx +154 -0
  127. package/src/components/custom/Workout/SetStrip.test.tsx +109 -0
  128. package/src/components/custom/Workout/SetStrip.tsx +71 -0
  129. package/src/components/custom/Workout/SetTableHeader.stories.tsx +66 -0
  130. package/src/components/custom/Workout/SetTableHeader.test.tsx +47 -0
  131. package/src/components/custom/Workout/SetTableHeader.tsx +88 -0
  132. package/src/components/custom/Workout/SetsRepsLoad.stories.tsx +47 -0
  133. package/src/components/custom/Workout/SetsRepsLoad.test.tsx +44 -0
  134. package/src/components/custom/Workout/SetsRepsLoad.tsx +52 -0
  135. package/src/components/custom/Workout/Sparkline.stories.tsx +1 -1
  136. package/src/components/custom/Workout/StatusDot.stories.tsx +1 -1
  137. package/src/components/custom/Workout/StatusPill.stories.tsx +59 -0
  138. package/src/components/custom/Workout/StatusPill.test.tsx +63 -0
  139. package/src/components/custom/Workout/StatusPill.tsx +88 -0
  140. package/src/components/custom/Workout/StrengthTrendChart.stories.tsx +1 -1
  141. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +1 -1
  142. package/src/components/custom/Workout/TempoBar.stories.tsx +70 -1
  143. package/src/components/custom/Workout/TempoBar.test.tsx +119 -4
  144. package/src/components/custom/Workout/TempoBar.tsx +107 -22
  145. package/src/components/custom/Workout/TempoDisplay.stories.tsx +12 -1
  146. package/src/components/custom/Workout/TempoDisplay.tsx +23 -33
  147. package/src/components/custom/Workout/TrainingStatusPage.stories.tsx +1 -1
  148. package/src/components/custom/Workout/VelocityStrip.modalities.stories.tsx +254 -0
  149. package/src/components/custom/Workout/VelocityStrip.responsive.stories.tsx +145 -0
  150. package/src/components/custom/Workout/VelocityStrip.stories.tsx +262 -56
  151. package/src/components/custom/Workout/VelocityStrip.test.tsx +440 -141
  152. package/src/components/custom/Workout/VelocityStrip.tsx +776 -141
  153. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +73 -0
  154. package/src/components/custom/Workout/VolumeLandmarkBar.test.tsx +119 -0
  155. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +154 -0
  156. package/src/components/custom/Workout/WeekRow.stories.tsx +1 -1
  157. package/src/components/custom/Workout/WeightBadge.stories.tsx +1 -1
  158. package/src/components/custom/Workout/WorkoutCard.stories.tsx +2 -6
  159. package/src/components/custom/Workout/WorkoutCard.test.tsx +13 -46
  160. package/src/components/custom/Workout/WorkoutPill.stories.tsx +1 -1
  161. package/src/components/custom/Workout/ZoneTrack.stories.tsx +139 -0
  162. package/src/components/custom/Workout/ZoneTrack.test.tsx +234 -0
  163. package/src/components/custom/Workout/ZoneTrack.tsx +373 -0
  164. package/src/components/custom/Workout/index.ts +55 -2
  165. package/src/components/custom/Workout/metricText.stories.tsx +69 -0
  166. package/src/components/custom/Workout/metricText.tsx +34 -0
  167. package/src/components/custom/Workout/paceTone.test.ts +29 -0
  168. package/src/components/custom/Workout/paceTone.ts +27 -0
  169. package/src/components/custom/Workout/setHeadingKit.tsx +177 -0
  170. package/src/components/custom/index.ts +2 -0
  171. package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
  172. package/src/components/icons/icons.stories.tsx +67 -2
  173. package/src/components/icons/icons.test.tsx +32 -2
  174. package/src/components/icons/icons.tsx +108 -0
  175. package/src/components/shell/BrandLockup.stories.tsx +3 -3
  176. package/src/components/shell/DashboardShell.stories.tsx +65 -0
  177. package/src/components/shell/DashboardShell.test.tsx +42 -0
  178. package/src/components/shell/DashboardShell.tsx +74 -0
  179. package/src/components/shell/DeviceIndicator.stories.tsx +2 -2
  180. package/src/components/shell/DeviceMenu.stories.tsx +5 -5
  181. package/src/components/shell/DeviceRow.stories.tsx +3 -3
  182. package/src/components/shell/NavItem.stories.tsx +52 -0
  183. package/src/components/shell/NavItem.test.tsx +35 -0
  184. package/src/components/shell/NavItem.tsx +75 -0
  185. package/src/components/shell/README.md +30 -0
  186. package/src/components/shell/SessionRailSpecimen.stories.tsx +753 -0
  187. package/src/components/shell/SessionStatePill.stories.tsx +3 -3
  188. package/src/components/shell/SessionStatePill.tsx +1 -1
  189. package/src/components/shell/SideNav.stories.tsx +81 -0
  190. package/src/components/shell/SideNav.test.tsx +51 -0
  191. package/src/components/shell/SideNav.tsx +74 -0
  192. package/src/components/shell/TopBar.stories.tsx +5 -5
  193. package/src/components/shell/index.ts +5 -0
  194. package/src/components/ui/alert/Alert.stories.tsx +86 -3
  195. package/src/components/ui/alert/Alert.test.tsx +52 -0
  196. package/src/components/ui/alert/Alert.tsx +54 -20
  197. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
  198. package/src/components/ui/avatar/Avatar.stories.tsx +1 -1
  199. package/src/components/ui/badge/Badge.stories.tsx +1 -1
  200. package/src/components/ui/breadcrumbs/Breadcrumbs.stories.tsx +1 -1
  201. package/src/components/ui/button/Button.stories.tsx +1 -1
  202. package/src/components/ui/card/Card.stories.tsx +1 -1
  203. package/src/components/ui/checkbox/Checkbox.stories.tsx +1 -1
  204. package/src/components/ui/chip/Chip.stories.tsx +1 -1
  205. package/src/components/ui/collapse/Collapse.stories.tsx +1 -1
  206. package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
  207. package/src/components/ui/divider/Divider.stories.tsx +1 -1
  208. package/src/components/ui/drawer/Drawer.stories.tsx +1 -1
  209. package/src/components/ui/form-field/FormField.stories.tsx +1 -1
  210. package/src/components/ui/help-tip/HelpTip.stories.tsx +1 -1
  211. package/src/components/ui/icon-box/IconBox.stories.tsx +1 -1
  212. package/src/components/ui/index.ts +1 -0
  213. package/src/components/ui/indicator/Indicator.stories.tsx +2 -2
  214. package/src/components/ui/indicator/Indicator.test.tsx +1 -0
  215. package/src/components/ui/indicator/Indicator.tsx +6 -1
  216. package/src/components/ui/input/Input.stories.tsx +1 -1
  217. package/src/components/ui/link/Link.stories.tsx +1 -1
  218. package/src/components/ui/list-item/ListItem.stories.tsx +1 -1
  219. package/src/components/ui/menu/Menu.stories.tsx +1 -1
  220. package/src/components/ui/modal/Modal.stories.tsx +1 -1
  221. package/src/components/ui/pill/Pill.stories.tsx +1 -1
  222. package/src/components/ui/popover/Popover.stories.tsx +1 -1
  223. package/src/components/ui/progress/Progress.stories.tsx +1 -1
  224. package/src/components/ui/progress/Progress.tsx +47 -22
  225. package/src/components/ui/radio/Radio.stories.tsx +1 -1
  226. package/src/components/ui/section/Section.stories.tsx +1 -1
  227. package/src/components/ui/select/Select.stories.tsx +1 -1
  228. package/src/components/ui/skeleton/Skeleton.stories.tsx +1 -1
  229. package/src/components/ui/spinner/Spinner.stories.tsx +1 -1
  230. package/src/components/ui/stack/Stack.stories.tsx +1 -1
  231. package/src/components/ui/surface/Surface.stories.tsx +1 -1
  232. package/src/components/ui/switch/Switch.stories.tsx +1 -1
  233. package/src/components/ui/tabs/Tabs.stories.tsx +1 -1
  234. package/src/components/ui/tile/Tile.stories.tsx +79 -0
  235. package/src/components/ui/tile/Tile.test.tsx +48 -0
  236. package/src/components/ui/tile/Tile.tsx +64 -0
  237. package/src/components/ui/tile/index.ts +2 -0
  238. package/src/components/ui/toast/Toast.stories.tsx +1 -1
  239. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +1 -1
  240. package/src/components/ui/tooltip/Tooltip.stories.tsx +1 -1
  241. package/src/examples/react-hook-form/ReactHookForm.stories.tsx +1 -1
  242. package/src/hooks/index.ts +2 -0
  243. package/src/hooks/useTimer.test.ts +150 -0
  244. package/src/hooks/useTimer.ts +77 -0
  245. package/src/index.ts +3 -0
  246. package/src/pages.ts +1 -1
  247. package/src/stories/PresetShowcase.stories.tsx +1 -1
  248. package/src/stories/ThemePresets.stories.tsx +1 -1
  249. package/src/theme/ColorSystem.stories.tsx +1 -1
  250. package/src/theme/Colors.stories.tsx +5 -8
  251. package/src/theme/config.ts +4 -0
  252. package/src/theme/elevation.stories.tsx +1 -1
  253. package/src/theme/global.css +5 -1
  254. package/src/theme/shadows.stories.tsx +1 -1
  255. package/src/theme/tokens/primitives.ts +11 -107
  256. package/src/theme/tokens/semantic.ts +8 -0
  257. package/src/theme/workout-tokens.ts +11 -7
  258. package/tailwind.config.js +5 -0
@@ -2,20 +2,6 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ViewProps } from 'react-native';
3
3
  import { c as MesoStatusCardProps } from './MesoStatusCard-CQk71hSi.mjs';
4
4
 
5
- type PRType = 'e1rm' | 'weight' | 'reps' | 'volume' | 'velocity';
6
- interface PrBadgeProps extends ViewProps {
7
- /** PR type determines auto-generated label */
8
- type?: PRType;
9
- /** Display label (e.g., "PR e1RM", "PR 5RM"). Auto-generated from type if omitted. */
10
- label?: string;
11
- /** Show only the star icon, no text label */
12
- compact?: boolean;
13
- /** Trigger pop animation on mount */
14
- animate?: boolean;
15
- className?: string;
16
- }
17
- declare function PrBadge({ type, label: labelProp, compact, animate, className, ...props }: PrBadgeProps): react_jsx_runtime.JSX.Element;
18
-
19
5
  /**
20
6
  * Spec statuses: completed | current | upcoming | deload.
21
7
  * `next` and `missed` are additive extras supported by this implementation.
@@ -59,8 +45,20 @@ interface VelocityStripProps extends ViewProps {
59
45
  * Drives both bar height and — in the default path — zone color. Callers must
60
46
  * feed mean (not peak) concentric velocity so bar color, height, and the
61
47
  * summary label all describe one metric.
48
+ *
49
+ * Optional: provide exactly one of `velocities` or {@link VelocityStripProps.set}.
50
+ * When neither is given the strip renders nothing.
62
51
  */
63
- velocities: number[];
52
+ velocities?: number[];
53
+ /**
54
+ * Optional structured strength-training set descriptor (see {@link VelocitySet}).
55
+ * When present it supersedes `velocities`: the done-velocity array is derived
56
+ * from the set (so mean / loss / zone summaries still work) and the strip is
57
+ * drawn as a typed slot list — grey todo, cyan variable / continue windows and
58
+ * the wide-gap chunking that distinguishes drop / myo / cluster sets. Provide
59
+ * exactly one of `velocities` or `set`.
60
+ */
61
+ set?: VelocitySet;
64
62
  /**
65
63
  * Optional velocity-zone bands (shape-compatible with WA's
66
64
  * `VelocityZones.bands`). When provided, bar color and the summary zone label
@@ -73,13 +71,45 @@ interface VelocityStripProps extends ViewProps {
73
71
  * Live mode: index of the most-recently-completed rep. That bar animates in
74
72
  * with a "pop"; if it is also the current set peak (a new best), it "bounces"
75
73
  * instead. Only the latest bar animates. Honors `prefers-reduced-motion`.
76
- * Full variant only.
74
+ * Framed `expanded` chart only (interactive tap-to-expand use).
77
75
  */
78
76
  liveRepIndex?: number;
77
+ /**
78
+ * `expanded` variant: whether the chart is OPEN. Default true (the variant shows
79
+ * its chart). Toggle it (with {@link onToggle}) for the interactive tap-to-expand
80
+ * collapse↔chart animation; a static open chart (no `onToggle`) does not animate.
81
+ */
79
82
  expanded?: boolean;
80
83
  onToggle?: () => void;
81
84
  onRepPress?: (index: number, velocity: number) => void;
82
- variant?: 'full' | 'mini';
85
+ /**
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.
94
+ */
95
+ variant?: 'mini' | 'expanded' | 'hero';
96
+ /** `expanded` / `hero` plot height in px (bars scale to this). Default 60 (`expanded`) / 220 (`hero`). */
97
+ height?: number;
98
+ /**
99
+ * `hero` only: the set's planned rep count. Reps beyond {@link velocities} draw as
100
+ * dashed placeholder stubs so the wall reads "3 of 8 done" at a glance. Ignored
101
+ * (and no placeholders drawn) when absent or ≤ the performed-rep count.
102
+ */
103
+ targetReps?: number;
104
+ /**
105
+ * `expanded` / `hero` bar scaling. `peak` (default) scales to the set's own max
106
+ * (+15% headroom). `fixed` scales to a fixed velocity ceiling so bar heights read
107
+ * the same absolute velocity across sets (the spotlight).
108
+ */
109
+ scale?: 'peak' | 'fixed';
110
+ /** `expanded` framed chart: per-bar m/s labels. Default true. */
111
+ showNumbers?: boolean;
112
+ /** `expanded` framed chart: the mean/loss info row. Default true. */
83
113
  showInfo?: boolean;
84
114
  className?: string;
85
115
  }
@@ -93,46 +123,232 @@ declare function getVelocityZoneName(velocity: number): string;
93
123
  declare function calculateVelocityLoss(velocities: number[]): number;
94
124
  /** Arithmetic mean of the per-rep mean-concentric velocities. */
95
125
  declare function calculateMeanVelocity(velocities: number[]): number;
96
- declare function VelocityStrip({ velocities, zones, liveRepIndex, expanded, onToggle, onRepPress, variant, showInfo, className, ...props }: VelocityStripProps): react_jsx_runtime.JSX.Element;
126
+ /**
127
+ * A structured strength-training set. Supply as {@link VelocityStripProps.set} to
128
+ * render its set-type encoding; the done-velocity array (used for the mean / loss
129
+ * / zone summary) is derived from the type's velocity fields.
130
+ */
131
+ type VelocitySet =
132
+ /** Fixed reps at a fixed load: done reps colored + a grey todo remainder to `planned`. */
133
+ {
134
+ type: 'straight';
135
+ velocities: number[];
136
+ planned?: number;
137
+ }
138
+ /** Bounded reps: committed slots `0..floor`, then a cyan variable window `floor..max`. */
139
+ | {
140
+ type: 'range';
141
+ velocities: number[];
142
+ floor: number;
143
+ max: number;
144
+ }
145
+ /** As-many-reps-as-possible: done reps + a trailing cyan "continue" slot that never closes. */
146
+ | {
147
+ type: 'amrap';
148
+ velocities: number[];
149
+ target?: number;
150
+ }
151
+ /** Load drops with no rest: each sub-load's reps, split by a WIDE notch gap. */
152
+ | {
153
+ type: 'drop';
154
+ subloads: number[][];
155
+ }
156
+ /** Rest-pause: an activation chunk + mini-clusters split by WIDE gaps; `open` adds a cyan continue. */
157
+ | {
158
+ type: 'myo';
159
+ activation: number[];
160
+ clusters: number[][];
161
+ open?: boolean;
162
+ }
163
+ /** Fixed count broken by intra-set rests: reps grouped by `groupSize` with WIDE intra-rest gaps. */
164
+ | {
165
+ type: 'cluster';
166
+ velocities: number[];
167
+ groupSize: number;
168
+ planned?: number;
169
+ };
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;
97
171
 
98
- type SetRowMode = 'active' | 'completed' | 'history';
99
- interface SetRowProps {
100
- mode: SetRowMode;
172
+ type SetRowUnit = 'lbs' | 'kg';
173
+ /** A set's lifecycle: logged (`done`), being performed now (`live`), or planned (`todo`). */
174
+ type SetRowState = 'done' | 'live' | 'todo';
175
+ interface SetRowBase {
101
176
  setNumber: number;
102
- previous?: {
177
+ unit: SetRowUnit;
178
+ /** Optional set-type marker (e.g. "DROP", "AMRAP") shown in the SET cell. */
179
+ setType?: string;
180
+ /** Optional velocity-zone bands (WA `VelocityZones.bands`); default scale when absent. */
181
+ velocityZones?: readonly VelocityZoneBandProp[];
182
+ }
183
+ /**
184
+ * One row of the unified expanded exercise table (SET · REPS · LBS · RPE + a
185
+ * per-row velocity strip), as a lifecycle discriminated union:
186
+ * - `done` — a logged set: recorded reps / weight / rpe, a flat `mini` strip.
187
+ * - `live` — performed right now: shows its TARGET (never "reps-done/target"),
188
+ * stands out by brightness, and a compact velocity-HEIGHT spotlight strip.
189
+ * - `todo` — planned: shows its target, muted, a flat grey `mini` stub strip.
190
+ *
191
+ * `done` + `todo` share ONE muted treatment; only `live` is brightened. There is
192
+ * no PREV column (dropped in the unified design).
193
+ */
194
+ type SetRowProps = (SetRowBase & {
195
+ state: 'done';
196
+ reps: number;
197
+ weight: number;
198
+ rpe?: number | null;
199
+ /** Per-rep MEAN concentric velocities (m/s). */
200
+ velocities: number[];
201
+ }) | (SetRowBase & {
202
+ state: 'live';
203
+ /** The prescribed target shown in the REPS / LBS cells (no live "5/10"). */
204
+ target: {
103
205
  reps: number;
104
206
  weight: number;
105
- } | null;
106
- reps: number | null;
107
- weight: number | null;
207
+ };
208
+ /** Reps / weight committed so far (available to hosts; the display shows `target`). */
209
+ reps: number;
210
+ weight: number;
108
211
  rpe?: number | null;
109
- unit: 'lbs' | 'kg';
110
- /** Per-rep MEAN concentric velocities (m/s). */
111
- velocities?: number[];
112
- /** Optional velocity-zone bands (WA `VelocityZones.bands`); default scale when absent. */
113
- velocityZones?: readonly VelocityZoneBandProp[];
114
- /** Live mode: index of the newest rep bar to animate (pop / new-peak bounce). */
115
- velocityLiveRepIndex?: number;
116
- velocityExpanded?: boolean;
117
- onVelocityToggle?: () => void;
118
- setType?: string;
119
- prBadges?: Array<{
120
- type: PRType;
121
- label: string;
122
- }>;
123
- isNextSet?: boolean;
124
- targets?: {
212
+ /** Per-rep MEAN concentric velocities logged so far this set. */
213
+ velocities: number[];
214
+ /** Newest rep index — reserved; the compact spotlight strip is static. */
215
+ liveRepIndex?: number;
216
+ }) | (SetRowBase & {
217
+ state: 'todo';
218
+ /** The prescribed target shown in the REPS / LBS cells. */
219
+ target: {
125
220
  reps: number;
126
221
  weight: number;
127
222
  };
223
+ /** Planned rep count backing the grey stub strip. Default `target.reps`. */
224
+ planned?: number;
225
+ });
226
+ /**
227
+ * ONE set row of the unified expanded exercise table. SET · REPS · LBS · RPE over
228
+ * a per-row {@link VelocityStrip}; `live` stands out by brightness with a compact
229
+ * velocity-height spotlight, `done`/`todo` are muted with a flat mini strip. Its
230
+ * column widths mirror {@link SetTableHeader}(`showPrevious={false}`).
231
+ */
232
+ declare function SetRow(set: SetRowProps): react_jsx_runtime.JSX.Element;
233
+
234
+ /**
235
+ * The four canonical rep-intensity zone pins (real titan ramp pins). A rep's mean
236
+ * velocity ratio maps to one of these; butted together they form a set's bar.
237
+ */
238
+ declare const SET_STRIP_ZONES: {
239
+ readonly slow: "#D14343";
240
+ readonly moderate: "#FF7900";
241
+ readonly fast: "#F9B415";
242
+ readonly fastest: "#2ED573";
243
+ };
244
+ /**
245
+ * The learned "variable / unknown / opportunity" semantic (cyan-900, a real ramp
246
+ * pin): an unperformed rep in a range's variable zone, and the fading trail of a
247
+ * myo set whose cluster count isn't yet known.
248
+ */
249
+ declare const SET_STRIP_VARIABLE_COLOR: "#0B3149";
250
+ /** Map a per-rep mean-velocity ratio to its zone pin (fastest = green, slowest = red). */
251
+ declare function velocityZoneColor(v: number): string;
252
+ /**
253
+ * One set's data. Flat variants: `done` = every rep performed; `active` = reps-so-far
254
+ * performed against a planned count (remainder greyed, performed reps pulse); `todo` =
255
+ * a planned but unstarted set (solid grey bar). Set-type variants:
256
+ * - `range` — variable rep-range (e.g. 15–20): `max` segments; committed zone
257
+ * `0..floor` (done = velocity, todo = grey), variable zone `floor..max` (done =
258
+ * velocity, todo = the variable/opportunity cyan). `doneVels` may run past `floor`.
259
+ * - `drop` — one set, no rest: `subloads` butted internally, split by 2px notches.
260
+ * - `myo` — done rest-pause: `activation` chunk + `clusters`, split by 3px cluster gaps.
261
+ * - `myo-upcoming` — planned myo, length unknown: grey activation (`activationLen`) +
262
+ * a fading cyan "clusters-to-failure" trail with the right edge left open.
263
+ */
264
+ type SetStripSet = {
265
+ status: 'done';
266
+ velocities: number[];
267
+ } | {
268
+ status: 'active';
269
+ velocities: number[];
270
+ planned: number;
271
+ } | {
272
+ status: 'todo';
273
+ planned: number;
274
+ } | {
275
+ status: 'range';
276
+ floor: number;
277
+ max: number;
278
+ doneVels: number[];
279
+ } | {
280
+ status: 'drop';
281
+ subloads: number[][];
282
+ } | {
283
+ status: 'myo';
284
+ activation: number[];
285
+ clusters: number[][];
286
+ } | {
287
+ status: 'myo-upcoming';
288
+ activationLen: number;
289
+ clusterCount?: number;
290
+ };
291
+ interface SetBarProps {
292
+ /** One set's performance state (done / active / todo). */
293
+ set: SetStripSet;
294
+ /** Bar height in px. Default 8. */
295
+ height?: number;
128
296
  }
129
- declare function SetRow({ mode, setNumber, previous, reps, weight, rpe, unit, velocities, velocityZones, velocityLiveRepIndex, velocityExpanded, onVelocityToggle, setType, prBadges, isNextSet, targets, }: SetRowProps): react_jsx_runtime.JSX.Element;
297
+ /**
298
+ * ONE set's multi-coloured bar: the butted per-rep colour segments for a single
299
+ * set (`done` = velocity-coloured reps · `active` = performed reps pulsing + grey
300
+ * remainder · `todo` = a solid grey bar), composed over {@link SegmentedBar}.
301
+ * Fills its flex slot; {@link SetStrip} lays several side by side. Colours are the
302
+ * real titan ramp pins.
303
+ */
304
+ declare function SetBar({ set, height }: SetBarProps): react_jsx_runtime.JSX.Element;
305
+
306
+ /**
307
+ * The LOCKED 6-kind indicator taxonomy (TD-03.51). One precedence-ranked slot is
308
+ * ever shown per exercise, resolved by {@link resolveIndicator}. Glyph = the
309
+ * specific signal; color = the severity tier (danger/warning/success/info, bound
310
+ * to titan status tokens). Outlined (border + glyph, no fill) so a chip never
311
+ * collides with the filled velocity strip beside it.
312
+ */
313
+ type ExerciseIndicatorKind = 'imbalance' | 'overshoot' | 'velocity-loss' | 'missed-reps' | 'pr' | 'info';
314
+ /**
315
+ * Precedence order (1=highest → last=lowest). A single chip is shown, so when
316
+ * several signals are true the highest-ranked wins. Alerts outrank `pr`; `info`
317
+ * is the floor. This ordering is LOCKED — do not reshuffle.
318
+ */
319
+ declare const INDICATOR_PRECEDENCE: readonly ExerciseIndicatorKind[];
320
+ /**
321
+ * Given the signals currently true for an exercise, pick the single
322
+ * highest-precedence kind to surface (or `undefined` when none apply). Order and
323
+ * duplicates in `candidates` don't matter — {@link INDICATOR_PRECEDENCE} decides.
324
+ */
325
+ declare function resolveIndicator(candidates: ExerciseIndicatorKind[]): ExerciseIndicatorKind | undefined;
326
+ interface ExerciseIndicatorProps extends Omit<ViewProps, 'children'> {
327
+ kind: ExerciseIndicatorKind;
328
+ /** Optional tap handler (surfaces detail — PR history / alert / info). */
329
+ onPress?: () => void;
330
+ className?: string;
331
+ }
332
+ /**
333
+ * A small circular outlined chip for an exercise heading. Presentational and
334
+ * static (chips are chrome — no pulse); the tap detail (tooltip/sheet) is wired
335
+ * by the consumer.
336
+ */
337
+ declare function ExerciseIndicator({ kind, onPress, className, ...props }: ExerciseIndicatorProps): react_jsx_runtime.JSX.Element;
130
338
 
131
- type ExerciseCardState = 'collapsed' | 'expanded' | 'upcoming';
132
339
  interface ExerciseCardProps {
133
340
  name: string;
134
- state: ExerciseCardState;
135
- onToggle: () => void;
341
+ /**
342
+ * The dimmed, not-yet-reached representation (prescription + previous-best line).
343
+ * Overrides the expand state — an upcoming card never expands.
344
+ */
345
+ upcoming?: boolean;
346
+ /** Controlled expand state. Omit to run uncontrolled (see {@link defaultExpanded}). */
347
+ expanded?: boolean;
348
+ /** Uncontrolled initial expand state. Default false. Ignored when `expanded` is set. */
349
+ defaultExpanded?: boolean;
350
+ /** Notified when the user toggles the card between collapsed and expanded. */
351
+ onExpandedChange?: (expanded: boolean) => void;
136
352
  onNavigateDetail?: () => void;
137
353
  summary?: {
138
354
  sets: number;
@@ -140,23 +356,38 @@ interface ExerciseCardProps {
140
356
  weight: number;
141
357
  unit: 'lbs' | 'kg';
142
358
  };
143
- e1rm?: {
144
- value: number;
145
- unit: 'lbs' | 'kg';
146
- };
147
359
  isPR?: boolean;
360
+ /** Collapsed glance: per-set logged velocities (drives the mini strips). */
148
361
  setVelocities?: number[][];
149
362
  /** Optional velocity-zone bands shared across this exercise's sets (WA bands). */
150
363
  velocityZones?: readonly VelocityZoneBandProp[];
364
+ /** Collapsed glance: total planned sets (placeholder strips fill the remainder). */
151
365
  totalPlannedSets?: number;
366
+ /** Expanded body: the per-set rows (done / live / todo). */
152
367
  sets?: SetRowProps[];
153
368
  tempo?: [number, number, number, number];
154
369
  prescription?: string;
155
370
  previousBest?: string;
156
371
  supersetPosition?: 'first' | 'last' | 'middle' | null;
157
372
  supersetColor?: string;
373
+ /** Expanded header per-set strip override; derived from `sets` when omitted. */
374
+ setStates?: SetStripSet[];
375
+ /** A small PR / issue / info chip in the title line (expanded header). */
376
+ indicator?: ExerciseIndicatorKind;
377
+ /** Expanded header strip height in px. Default 8. */
378
+ stripHeight?: number;
158
379
  }
159
- declare function ExerciseCard(props: ExerciseCardProps): react_jsx_runtime.JSX.Element;
380
+ /**
381
+ * The data-contract exercise card, in three representations:
382
+ * - `upcoming` — a dimmed, not-yet-reached row (prescription + previous best).
383
+ * - collapsed — a glance: name + summary + per-set velocity strips.
384
+ * - expanded — the unified card: the real {@link ExerciseCardHeading} header over
385
+ * the SET · REPS · LBS · RPE body (one {@link SetRow} per set).
386
+ *
387
+ * Expand is controlled (`expanded` + `onExpandedChange`) or uncontrolled
388
+ * (`defaultExpanded`, internal state). `upcoming` overrides expand.
389
+ */
390
+ declare function ExerciseCard({ upcoming, expanded, defaultExpanded, onExpandedChange, ...rest }: ExerciseCardProps): react_jsx_runtime.JSX.Element;
160
391
 
161
392
  type MesoStatus = 'completed' | 'current' | 'upcoming';
162
393
  interface Meso {
@@ -564,8 +795,11 @@ interface ExerciseDetailEntry {
564
795
  title: string;
565
796
  /** Collapsed summary (sets × reps @ weight). */
566
797
  summary?: ExerciseCardProps['summary'];
567
- /** Estimated one-rep max badge. */
568
- e1rm?: ExerciseCardProps['e1rm'];
798
+ /** Estimated one-rep max, feeding the page's best-e1RM stat. */
799
+ e1rm?: {
800
+ value: number;
801
+ unit: 'lbs' | 'kg';
802
+ };
569
803
  /** Flags a personal-record entry. */
570
804
  isPR?: boolean;
571
805
  /** Prescribed tempo, revealed when expanded. */
@@ -681,8 +915,6 @@ interface ActiveWorkoutExercise {
681
915
  totalPlannedSets: number;
682
916
  /** Collapsed summary (sets × reps @ weight) for a completed exercise. */
683
917
  summary?: ExerciseCardProps['summary'];
684
- /** Estimated one-rep max badge. */
685
- e1rm?: ExerciseCardProps['e1rm'];
686
918
  /** Flags a personal-record exercise. */
687
919
  isPR?: boolean;
688
920
  /** Prescribed tempo, revealed when expanded. */
@@ -768,8 +1000,8 @@ declare function countCompletedSets(exercise: ActiveWorkoutExercise): number;
768
1000
  declare function deriveWorkoutProgress(exercises: ActiveWorkoutExercise[]): WorkoutProgress;
769
1001
  /** The active exercise anchors the bottom bar; find it, or null (pure). */
770
1002
  declare function findActiveExercise(exercises: ActiveWorkoutExercise[]): ActiveWorkoutExercise | null;
771
- /** Map an exercise's status + focus onto an `ExerciseCard` visual state (pure). */
772
- declare function statusToCardState(status: ActiveExerciseStatus, focused: boolean): ExerciseCardState;
1003
+ /** Whether an exercise renders as the dimmed, not-yet-reached representation (pure). */
1004
+ declare function isUpcomingExercise(status: ActiveExerciseStatus): boolean;
773
1005
  /** Project an exercise onto ExerciseCard props, wiring zoom focus (pure). */
774
1006
  declare function toActiveCardProps(exercise: ActiveWorkoutExercise, focused: boolean, onToggle: () => void, supersetPosition?: ExerciseCardProps['supersetPosition'], supersetColor?: string): ExerciseCardProps;
775
1007
  /** Fold consecutive same-superset exercises into render groups (pure). */
@@ -788,4 +1020,4 @@ declare function groupExercises(exercises: ActiveWorkoutExercise[], supersets: A
788
1020
  */
789
1021
  declare function ActiveWorkoutPage({ title, subtitle, exercises, supersets, input, rest, initialResting, className, ...props }: ActiveWorkoutPageProps): react_jsx_runtime.JSX.Element;
790
1022
 
791
- export { type WorkoutCardProps as $, type ActiveExerciseStatus as A, type PlanWorkout as B, CapacityBandChart as C, PrBadge as D, ExerciseCard as E, type PrBadgeProps as F, type ProgramBreadcrumb as G, type ProgramNavLevel as H, type ProgramPlanningPageProps as I, type ProgramSelection as J, type SetRowMode as K, type SetRowProps as L, type Meso as M, StrengthTrendChart as N, type StrengthTrendChartMesoBoundary as O, type PRType as P, type StrengthTrendChartProps as Q, type StrengthTrendDataPoint as R, SetRow as S, VelocityStrip as T, type VelocityStripProps as U, type VbtSummary as V, type VelocityZoneBandProp as W, WeekRow as X, type WeekRowProps as Y, type WeekRowWorkout as Z, WorkoutCard as _, type ActiveWorkoutExercise as a, type WorkoutDot as a0, type WorkoutDotStatus as a1, type WorkoutGroup as a2, type WorkoutMuscleGroup as a3, type WorkoutMuscleVolumeStatus as a4, WorkoutPill as a5, type WorkoutPillProps as a6, type WorkoutPillStatus as a7, type WorkoutProgress as a8, type WorkoutStatus as a9, calculateMeanVelocity as aa, calculateVelocityLoss as ab, getVelocityZoneColor as ac, getVelocityZoneName as ad, ActiveWorkoutPage as ae, EXERCISE_DETAIL_TABS as af, ExerciseDetailPage as ag, ProgramPlanningPage as ah, buildBreadcrumbs as ai, countCompletedSets as aj, deriveExerciseStats as ak, deriveNavLevel as al, deriveWorkoutProgress as am, findActiveExercise as an, findMeso as ao, findWeek as ap, findWorkout as aq, groupExercises as ar, statusToCardState as as, summarizeVbt as at, toActiveCardProps as au, toExerciseCardProps as av, toProgressBarMesos as aw, 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, type ExerciseCardProps as i, type ExerciseCardState as j, type ExerciseDetailEntry as k, type ExerciseDetailHeader as l, type ExerciseDetailPageProps as m, type ExerciseDetailStats as n, type ExerciseDetailTab as o, type ExerciseTrend as p, type ExerciseVbt as q, type ExerciseVbtSet as r, MesoCard as s, type MesoCardProps as t, MesoProgressBar as u, type MesoProgressBarProps as v, type MesoStatus as w, type MesoVolumeHeatmapEntry as x, type PlanMeso as y, type PlanWeek as z };
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 };