@titan-design/react-ui 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/MesoStatusCard-CQk71hSi.d.mts +77 -0
- package/dist/MesoStatusCard-CQk71hSi.d.ts +77 -0
- package/dist/bodymap.d.mts +246 -3
- package/dist/bodymap.d.ts +246 -3
- package/dist/bodymap.js +232 -185
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +1963 -11
- package/dist/bodymap.mjs.map +1 -1
- package/dist/index.d.mts +193 -744
- package/dist/index.d.ts +193 -744
- package/dist/index.js +1551 -1856
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10770 -8213
- package/dist/index.mjs.map +1 -1
- package/dist/pages-D7Jlssvp.d.ts +791 -0
- package/dist/pages-MO0JCySL.d.mts +791 -0
- package/dist/pages.d.mts +4 -0
- package/dist/pages.d.ts +4 -0
- package/dist/pages.js +6694 -0
- package/dist/pages.js.map +1 -0
- package/dist/pages.mjs +6674 -0
- package/dist/pages.mjs.map +1 -0
- package/dist/theme/index.d.mts +473 -211
- package/dist/theme/index.d.ts +473 -211
- package/dist/theme/index.js +341 -127
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +2085 -2
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/tokens-css.js +148 -139
- package/dist/theme/tokens-css.js.map +1 -1
- package/dist/theme/tokens-css.mjs +582 -1
- package/dist/theme/tokens-css.mjs.map +1 -1
- package/package.json +11 -7
- package/src/components/custom/DateTime/DateTime.stories.tsx +82 -6
- package/src/components/custom/DateTime/DateTime.test.tsx +29 -3
- package/src/components/custom/DateTime/DateTime.tsx +55 -15
- package/src/components/custom/Gauge/Gauge.test.tsx +2 -2
- package/src/components/custom/Gauge/Gauge.tsx +6 -3
- package/src/components/custom/Scatter/Scatter.tsx +3 -5
- package/src/components/custom/Treemap/Treemap.tsx +3 -5
- package/src/components/custom/Typography/Typography.stories.tsx +45 -27
- package/src/components/custom/Typography/Typography.test.tsx +13 -3
- package/src/components/custom/Typography/Typography.tsx +5 -0
- package/src/components/custom/Workout/ActiveWorkoutPage.tsx +2 -1
- package/src/components/custom/Workout/BaseBadge.stories.tsx +3 -3
- package/src/components/custom/Workout/BaseBadge.test.tsx +1 -1
- package/src/components/custom/Workout/BaseBadge.tsx +1 -1
- package/src/components/custom/Workout/BodyMap.tsx +6 -3
- package/src/components/custom/Workout/BodyMapDetailPanel.tsx +6 -3
- package/src/components/custom/Workout/CapacityBandChart.test.tsx +2 -2
- package/src/components/custom/Workout/CapacityBandChart.tsx +9 -6
- package/src/components/custom/Workout/DeviationBar.test.tsx +1 -1
- package/src/components/custom/Workout/DeviationBar.tsx +7 -4
- package/src/components/custom/Workout/ExerciseCard.tsx +5 -1
- package/src/components/custom/Workout/ExerciseDetailPage.tsx +19 -5
- package/src/components/custom/Workout/InputBar.tsx +2 -1
- package/src/components/custom/Workout/IntensityBar.test.tsx +112 -60
- package/src/components/custom/Workout/IntensityBar.tsx +113 -58
- package/src/components/custom/Workout/MesoCard.tsx +8 -3
- package/src/components/custom/Workout/MesoProgressBar.test.tsx +1 -1
- package/src/components/custom/Workout/MesoProgressBar.tsx +3 -2
- package/src/components/custom/Workout/MesoStatusCard.tsx +20 -13
- package/src/components/custom/Workout/MuscleGroupChip.tsx +7 -4
- package/src/components/custom/Workout/PlaceholderStrip.tsx +5 -9
- package/src/components/custom/Workout/PrBadge.tsx +7 -4
- package/src/components/custom/Workout/PrHistoryModal.tsx +6 -5
- package/src/components/custom/Workout/ProgramPlanningPage.tsx +2 -1
- package/src/components/custom/Workout/README.md +50 -0
- package/src/components/custom/Workout/ReadinessCheck.tsx +7 -4
- package/src/components/custom/Workout/RestTimer.test.tsx +41 -10
- package/src/components/custom/Workout/RestTimer.tsx +50 -44
- package/src/components/custom/Workout/SetRow.tsx +12 -2
- package/src/components/custom/Workout/Sparkline.tsx +2 -1
- package/src/components/custom/Workout/StatusDot.test.tsx +2 -2
- package/src/components/custom/Workout/StatusDot.tsx +12 -9
- package/src/components/custom/Workout/StrengthTrendChart.tsx +9 -6
- package/src/components/custom/Workout/SupersetWrapper.tsx +2 -1
- package/src/components/custom/Workout/TempoDisplay.stories.tsx +69 -2
- package/src/components/custom/Workout/TempoDisplay.test.tsx +35 -0
- package/src/components/custom/Workout/TempoDisplay.tsx +109 -3
- package/src/components/custom/Workout/VelocityStrip.test.tsx +89 -2
- package/src/components/custom/Workout/VelocityStrip.tsx +203 -38
- package/src/components/custom/Workout/WeekRow.test.tsx +2 -2
- package/src/components/custom/Workout/WeekRow.tsx +3 -2
- package/src/components/custom/Workout/WeightBadge.test.tsx +2 -2
- package/src/components/custom/Workout/WeightBadge.tsx +8 -4
- package/src/components/custom/Workout/WorkoutCard.tsx +5 -2
- package/src/components/custom/Workout/WorkoutPill.tsx +12 -8
- package/src/components/custom/Workout/icons.tsx +7 -0
- package/src/components/custom/Workout/index.ts +38 -47
- package/src/components/icons/SvgIcon.tsx +50 -0
- package/src/components/icons/icons.stories.tsx +57 -0
- package/src/components/icons/icons.test.tsx +43 -0
- package/src/components/icons/icons.tsx +45 -0
- package/src/components/icons/index.ts +4 -0
- package/src/components/index.ts +6 -0
- package/src/components/shell/BrandLockup.stories.tsx +27 -0
- package/src/components/shell/BrandLockup.test.tsx +23 -0
- package/src/components/shell/BrandLockup.tsx +47 -0
- package/src/components/shell/DeviceIndicator.stories.tsx +28 -0
- package/src/components/shell/DeviceIndicator.test.tsx +26 -0
- package/src/components/shell/DeviceIndicator.tsx +52 -0
- package/src/components/shell/DeviceMenu.stories.tsx +47 -0
- package/src/components/shell/DeviceMenu.test.tsx +40 -0
- package/src/components/shell/DeviceMenu.tsx +65 -0
- package/src/components/shell/DeviceRow.stories.tsx +38 -0
- package/src/components/shell/DeviceRow.test.tsx +37 -0
- package/src/components/shell/DeviceRow.tsx +58 -0
- package/src/components/shell/README.md +86 -0
- package/src/components/shell/SessionStatePill.stories.tsx +27 -0
- package/src/components/shell/SessionStatePill.test.tsx +25 -0
- package/src/components/shell/SessionStatePill.tsx +46 -0
- package/src/components/shell/TopBar.stories.tsx +49 -0
- package/src/components/shell/TopBar.test.tsx +36 -0
- package/src/components/shell/TopBar.tsx +89 -0
- package/src/components/shell/index.ts +8 -0
- package/src/components/ui/indicator/Indicator.stories.tsx +37 -1
- package/src/components/ui/indicator/Indicator.test.tsx +19 -1
- package/src/components/ui/indicator/Indicator.tsx +45 -6
- package/src/components/ui/indicator/index.ts +1 -1
- package/src/components/ui/spinner/Spinner.tsx +3 -2
- package/src/components/ui/toolbar-button/ToolbarButton.tsx +2 -1
- package/src/index.ts +3 -2
- package/src/pages.ts +61 -0
- package/src/test/stories-smoke.test.tsx +50 -0
- package/src/theme/ColorSystem.stories.tsx +323 -0
- package/src/theme/Colors.stories.tsx +69 -1
- package/src/theme/barrel.ts +54 -0
- package/src/theme/config.ts +16 -3
- package/src/theme/extracted-colors-dataviz.ts +21 -0
- package/src/theme/extracted-colors-ui.ts +20 -0
- package/src/theme/global.css +64 -52
- package/src/theme/gradients.test.ts +25 -0
- package/src/theme/gradients.ts +36 -0
- package/src/theme/index.ts +8 -43
- package/src/theme/native-theming-guard.test.ts +117 -0
- package/src/theme/tokens/primitives.test.ts +232 -0
- package/src/theme/tokens/primitives.ts +247 -0
- package/src/theme/tokens/semantic.ts +93 -81
- package/src/theme/workout-tokens.ts +22 -21
- package/src/utils/avatar-color.ts +3 -3
- package/tailwind.config.js +10 -3
- package/dist/bodymap-BhG55xHM.d.mts +0 -318
- package/dist/bodymap-BhG55xHM.d.ts +0 -318
- package/dist/chunk-2SISKTWM.mjs +0 -1027
- package/dist/chunk-2SISKTWM.mjs.map +0 -1
- package/dist/chunk-7XPB4NAO.mjs +0 -1013
- package/dist/chunk-7XPB4NAO.mjs.map +0 -1
- package/dist/chunk-SNVKL5WZ.mjs +0 -883
- package/dist/chunk-SNVKL5WZ.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/tokens/primitives.ts","../src/theme/workout-tokens.ts","../src/utils/workout-format.ts","../src/web-jsx/jsx-runtime.ts","../src/components/custom/Workout/VelocityStrip.tsx","../src/utils/cn.ts","../src/components/custom/Workout/PlaceholderStrip.tsx","../src/components/icons/SvgIcon.tsx","../src/components/icons/icons.tsx","../src/components/custom/Workout/BaseBadge.tsx","../src/theme/tokens/semantic.ts","../src/components/custom/Workout/WeightBadge.tsx","../src/components/custom/Workout/PrBadge.tsx","../src/theme/shadows.ts","../src/utils/colors.ts","../src/components/custom/Workout/TempoBar.tsx","../src/components/custom/Workout/TempoDisplay.tsx","../src/components/custom/Workout/SetRow.tsx","../src/theme/resolve-color.ts","../src/components/custom/Workout/ExerciseCard.tsx","../src/components/custom/Workout/InputBar.tsx","../src/components/custom/Workout/RestTimer.tsx","../src/components/custom/Workout/SupersetWrapper.tsx","../src/components/custom/Workout/ActiveWorkoutPage.tsx","../src/theme/elevation.ts","../src/utils/useTheme.ts","../src/components/ui/card/Card.tsx","../src/components/custom/Workout/StatusDot.tsx","../src/theme/extracted-colors-dataviz.ts","../src/components/custom/Workout/MesoStatusCard.tsx","../src/components/custom/Workout/StrengthTrendChart.tsx","../src/components/custom/Workout/CapacityBandChart.tsx","../src/components/custom/Workout/ExerciseDetailPage.tsx","../src/components/custom/Workout/MesoProgressBar.tsx","../src/components/ui/indicator/Indicator.tsx","../src/components/ui/badge/Badge.tsx","../src/components/custom/Workout/WorkoutPill.tsx","../src/components/custom/Workout/IntensityBar.tsx","../src/components/custom/Workout/WeekRow.tsx","../src/components/custom/Workout/MesoCard.tsx","../src/components/custom/Workout/MuscleGroupChip.tsx","../src/components/custom/Workout/WorkoutCard.tsx","../src/components/custom/Workout/ProgramPlanningPage.tsx"],"names":["cn","reactJsx","reactJsxs","View","useState","Animated","Pressable","Text","useEffect","Easing","t","Platform","formatAccessibilityLabel","BRAND_PRIMARY","intensityConfig","useMemo","Fragment","STATUS_ERROR","STATUS_SUCCESS","STATUS_WARNING","toX","toY","sizeStyles","BRAND_PRIMARY_DARK","BRAND_PRIMARY_LIGHT","ACCENT_STOPS"],"mappings":"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","file":"pages.mjs","sourcesContent":["/**\n * Primitive Design Tokens\n *\n * Raw values with no semantic meaning. These are the foundation of the design system\n * and should rarely be used directly in components. Use semantic tokens instead.\n */\n\nexport const primitiveColors = {\n // Blue scale (primary brand)\n blue: {\n 50: '#EFF6FF',\n 100: '#DBEAFE',\n 200: '#BFDBFE',\n 300: '#93C5FD',\n 400: '#60A5FA',\n 500: '#3B82F6',\n 600: '#5048E5', // Primary main\n 700: '#3832A0', // Primary dark\n 800: '#1E40AF',\n 900: '#1E3A8A',\n },\n\n // Green scale (secondary brand)\n green: {\n 50: '#ECFDF5',\n 100: '#D1FAE5',\n 200: '#A7F3D0',\n 300: '#6EE7B7',\n 400: '#3FC79A', // Secondary light\n 500: '#10B981', // Secondary main\n 600: '#059669',\n 700: '#0B815A', // Secondary dark\n 800: '#065F46',\n 900: '#064E3B',\n },\n\n // Teal scale (success)\n teal: {\n 50: '#F0FDFA',\n 100: '#CCFBF1',\n 200: '#99F6E4',\n 300: '#5EEAD4',\n 400: '#43C6B7', // Success light\n 500: '#14B8A6', // Success main\n 600: '#0D9488',\n 700: '#0E8074', // Success dark\n 800: '#115E59',\n 900: '#134E4A',\n },\n\n // Red scale (error)\n red: {\n 50: '#FEF2F2',\n 100: '#FEE2E2',\n 200: '#FECACA',\n 300: '#FCA5A5',\n 400: '#DA6868', // Error light\n 500: '#EF4444',\n 600: '#D14343', // Error main\n 700: '#922E2E', // Error dark\n 800: '#991B1B',\n 900: '#7F1D1D',\n },\n\n // Vivid green scale (live/go success)\n greenVivid: {\n 50: '#E9FBF0',\n 100: '#C8F7DA',\n 200: '#9FF0BF',\n 300: '#6BE79D',\n 400: '#47DE84', // Success vivid light\n 500: '#2ED573', // Success vivid main\n 600: '#22B85F',\n 700: '#1A9950', // Success vivid dark\n 800: '#157A40',\n 900: '#105C30',\n },\n\n // Vivid red scale (alert)\n redVivid: {\n 50: '#FFECEE',\n 100: '#FFD6DB',\n 200: '#FFB3BC',\n 300: '#FF8593',\n 400: '#FF6070', // Error vivid light\n 500: '#FF4757', // Error vivid main\n 600: '#E63548',\n 700: '#C42539', // Error vivid dark\n 800: '#9E1C2C',\n 900: '#7A1520',\n },\n\n // Amber scale (warning)\n amber: {\n 50: '#FFFBEB',\n 100: '#FEF3C7',\n 200: '#FDE68A',\n 300: '#FCD34D',\n 400: '#FFBF4C', // Warning light\n 500: '#FFB020', // Warning main\n 600: '#B27B16', // Warning dark\n 700: '#B45309',\n 800: '#92400E',\n 900: '#78350F',\n },\n\n // Sky/Blue scale (info)\n sky: {\n 50: '#F0F9FF',\n 100: '#E0F2FE',\n 200: '#BAE6FD',\n 300: '#7DD3FC',\n 400: '#64B6F7', // Info light\n 500: '#2196F3', // Info main\n 600: '#0284C7',\n 700: '#0B79D0', // Info dark\n 800: '#075985',\n 900: '#0C4A6E',\n },\n\n // Neutral/Gray scale\n neutral: {\n 50: '#FAFAFA',\n 100: '#F3F4F6',\n 200: '#E5E7EB',\n 300: '#D1D5DB',\n 400: '#9CA3AF',\n 500: '#6B7280',\n 600: '#4B5563',\n 700: '#374151',\n 800: '#1F2937',\n 900: '#111827',\n 950: '#030712',\n },\n\n // Orange scale (accent/brand color)\n accent: {\n 100: '#FFA860',\n 200: '#FF9630',\n 300: '#FF8500',\n 400: '#FF7900',\n 500: '#F56C00',\n 600: '#E06D10',\n 700: '#D0620C',\n 800: '#B75500',\n 900: '#A34900',\n },\n\n // Charcoal scale (dark backgrounds)\n charcoal: {\n 0: '#6E6E6E',\n 50: '#5D5D5D',\n 100: '#4C4C4C',\n 200: '#3C3C3C',\n 300: '#2C2C2C',\n 400: '#1F1F1F',\n 500: '#1C1C1C',\n 600: '#191919',\n 700: '#161616',\n 800: '#131313',\n 900: '#101010',\n },\n\n // Steel scale (cool accent)\n steel: {\n 100: '#8AA4B8',\n 200: '#7894A8',\n 300: '#678498',\n 400: '#557488',\n 500: '#406D87',\n 600: '#39617A',\n 700: '#32556D',\n 800: '#243D53',\n 900: '#1D3146',\n },\n\n // Pure colors\n white: '#FFFFFF',\n black: '#000000',\n transparent: 'transparent',\n} as const\n\n/**\n * Derived tonal ramps (TD-05.09 color foundations)\n *\n * Seven OKLCH-generated hue ramps, 11 perceptual lightness steps each (50 -> 950).\n * Built with hue-torsion + a chroma arc, anchored through existing brand/semantic\n * hexes. `pin` marks the step each ramp flows through its anchor.\n * This is the single source of truth for chromatic hexes — the categorical palette\n * below references these steps rather than duplicating values.\n * See coordination/design-explorations/foundations.\n */\nexport const primitiveRamps = {\n red: {\n 50: '#FFF4F4',\n 100: '#FFE3E5',\n 200: '#FFC2C5',\n 300: '#FF9A9D',\n 400: '#F77175',\n 500: '#E05254',\n 600: '#D14343', // pin\n 700: '#A4221C',\n 800: '#7E1002',\n 900: '#5A0900',\n 950: '#3D0400',\n },\n orange: {\n 50: '#FFF5ED',\n 100: '#FFE6D4',\n 200: '#FFC7A2',\n 300: '#FFA063',\n 400: '#FF7900', // pin\n 500: '#DA5F00',\n 600: '#B94A00',\n 700: '#983804',\n 800: '#6F290F',\n 900: '#4E1C0C',\n 950: '#331107',\n },\n amber: {\n 50: '#FFF7DD',\n 100: '#FFEAA9',\n 200: '#FFD352',\n 300: '#F9B415', // pin\n 400: '#E08C00',\n 500: '#C27400',\n 600: '#A45E00',\n 700: '#814D14',\n 800: '#5B3A1A',\n 900: '#442503',\n 950: '#301500',\n },\n green: {\n 50: '#E3FFEE',\n 100: '#B5FFD2',\n 200: '#58F69E',\n 300: '#2ED573', // pin\n 400: '#21C05D',\n 500: '#22A444',\n 600: '#298732',\n 700: '#2B6B25',\n 800: '#264D1C',\n 900: '#1B3515',\n 950: '#11220D',\n },\n cyan: {\n 50: '#E6FBFF',\n 100: '#C2F6FF',\n 200: '#62EAFF',\n 300: '#22D3EE', // pin\n 400: '#01B5D1',\n 500: '#2697B7',\n 600: '#307B9B',\n 700: '#2A617F',\n 800: '#22465F',\n 900: '#0B3149',\n 950: '#001F36',\n },\n blue: {\n 50: '#EFF8FF',\n 100: '#D9EFFF',\n 200: '#ACDBFF',\n 300: '#78C2FF',\n 400: '#3CA8FF',\n 500: '#2196F3', // pin\n 600: '#1072CB',\n 700: '#135AA8',\n 800: '#14407E',\n 900: '#112C5A',\n 950: '#091B3C',\n },\n magenta: {\n 50: '#FFF3F9',\n 100: '#FFE2F1',\n 200: '#FFBDE2',\n 300: '#FF8FD5',\n 400: '#ED69C3',\n 500: '#D548AF',\n 600: '#BA2996',\n 700: '#9C0D7A', // pin\n 800: '#77005A',\n 900: '#56003F',\n 950: '#3B0029',\n },\n} as const\n\n/**\n * Categorical (qualitative) palette — an ordered, CVD-safe series expressed as\n * references into {@link primitiveRamps} (one source of truth; the palette moves\n * with the ramps).\n *\n * Design: a single canonical hue order (blue, magenta, red, orange, green, cyan,\n * amber), with steps chosen vivid-midtone-first and fanned lighter/darker as the\n * series grows to preserve separation. The sequence is nested-stable — a chart\n * with N series uses the first N colors, and the series index is stable as N\n * changes. Colorblind-safe worst-case deuteranopia/protanopia floor 8 holds\n * through {@link CATEGORICAL_CVD_SAFE_MAX} colors; the 7th is an extended color\n * that should be paired with a legend or other secondary encoding.\n *\n * Two variants: `default` (vivid, sits on neutral/light surfaces, legible under\n * black text) and `dark` (deeper shades legible under white text on a fill). A\n * separate \"light\" variant was dropped — the vivid `default` picks already clear\n * black-text contrast, so it doubles as the light-context palette.\n */\nexport const categoricalPalette = {\n default: [\n primitiveRamps.blue[500],\n primitiveRamps.magenta[500],\n primitiveRamps.red[500],\n primitiveRamps.orange[400],\n primitiveRamps.green[300],\n primitiveRamps.cyan[300],\n primitiveRamps.amber[600], // extended (7th) — pair with a legend\n ],\n dark: [\n primitiveRamps.blue[600],\n primitiveRamps.magenta[600],\n primitiveRamps.red[500],\n primitiveRamps.orange[600],\n primitiveRamps.green[800],\n primitiveRamps.cyan[800],\n primitiveRamps.amber[500], // extended (7th) — pair with a legend\n ],\n} as const\n\n/** Largest series count that holds the CVD floor without a legend. */\nexport const CATEGORICAL_CVD_SAFE_MAX = 6\n\n/**\n * Categorical palette variant.\n * - `default` : vivid; neutral/light surfaces, legible under black text\n * - `dark` : deeper shades, legible under white text on a filled swatch\n */\nexport type CategoricalVariant = keyof typeof categoricalPalette\n\n/**\n * Get a color from the ordered categorical palette by series index.\n * The palette is nested-stable, so the color for a given index does not change\n * with the total series count; `index` simply wraps past the end.\n *\n * @param index - 0-based series index (wraps past the end)\n * @param variant - `default` (black-text / light surfaces) or `dark` (white text)\n * @returns The hex color string\n */\nexport function getCategoricalColor(index: number, variant: CategoricalVariant = 'default'): string {\n const palette = categoricalPalette[variant]\n index = Math.max(0, Math.floor(index))\n return palette[index % palette.length]\n}\n\n/**\n * Diverging status scale (BodyMap training-status: under → optimal → over) as\n * references into {@link primitiveRamps}. A true diverging shape — `optimal` is\n * the lightest center, the extremes go darker — so the signal reads in lightness\n * (colorblind-robust; worst-case deut/protanopia min ΔE ~10.9) and the direction\n * reads in the blue↔red axis (the CVD-safe hue pair).\n *\n * Tuned so every stop is dark enough for the fill yet light enough that BLACK\n * text clears 4.5:1 on all five — no per-cell white/black flipping. The value\n * valley is symmetric: the two mid-arms (maintenance / approaching) sit at equal\n * lightness (both ~0.53 relative luminance), the ends darker.\n */\nexport const divergingScale = [\n primitiveRamps.blue[500], // under\n primitiveRamps.cyan[300], // maintenance\n primitiveRamps.green[200], // optimal (light center)\n primitiveRamps.amber[300], // approaching\n primitiveRamps.red[600], // over\n] as const\n\n/**\n * Sequential \"effort\" scale (low → high intensity: green → yellow → orange → red)\n * as references into {@link primitiveRamps}. A 6-stop ordinal palette; the\n * velocity/RPE strip sub-samples it. Every adjacent pair clears the CVD floor\n * (min deut/protan ΔE ≥ 4.5), and within that the hue walk is kept smooth —\n * the amber-200 → amber-300 → orange-400 run steps the yellow→orange transition\n * gradually rather than lurching. Order encodes magnitude, so it tolerates the\n * green↔red CVD pair. Stops 0–3 take black text; the dark reds take white.\n */\nexport const sequentialEffort = [\n primitiveRamps.green[300],\n primitiveRamps.amber[200],\n primitiveRamps.amber[300],\n primitiveRamps.orange[400],\n primitiveRamps.red[600],\n primitiveRamps.red[700],\n] as const\n\n/**\n * Best-contrast text color (black or white) for a solid fill — for labels sitting\n * on categorical/diverging/effort swatches. Uses the WCAG relative-luminance ratio.\n */\nexport function bestTextColor(hex: string): '#000000' | '#FFFFFF' {\n const [r, g, b] = [0, 2, 4].map((i) => {\n const c = parseInt(hex.replace('#', '').slice(i, i + 2), 16) / 255\n return c >= 0.04045 ? ((c + 0.055) / 1.055) ** 2.4 : c / 12.92\n })\n const l = 0.2126 * r + 0.7152 * g + 0.0722 * b\n return (l + 0.05) / 0.05 >= 1.05 / (l + 0.05) ? '#000000' : '#FFFFFF'\n}\n\n/**\n * Discrete rainbow palette for data visualization\n * Based on Paul Tol's color schemes: https://personal.sron.nl/~pault/#fig:scheme_rainbow_discrete\n */\nexport const discreteRainbow = [\n '#E8ECFB',\n '#D9CCE3',\n '#D1BBD7',\n '#CAACCB',\n '#BA8DB4',\n '#AE76A3',\n '#AA6F9E',\n '#994F88',\n '#882E72',\n '#1965B0',\n '#437DBF',\n '#5289C7',\n '#6195CF',\n '#7BAFDE',\n '#4EB265',\n '#90C987',\n '#CAE0AB',\n '#F7F056',\n '#F7CB45',\n '#F6C141',\n '#F4A736',\n '#F1932D',\n '#EE8026',\n '#E8601C',\n '#E65518',\n '#DC050C',\n '#A5170E',\n '#72190E',\n '#42150A',\n] as const\n\n/**\n * Palette indices for discrete rainbow colors at different palette sizes.\n * For a given palette size (index + 1), returns the indices of colors to use.\n */\nconst discreteRainbowPalettes: number[][] = [\n [10],\n [10, 26],\n [10, 18, 26],\n [10, 15, 18, 26],\n [10, 14, 15, 18, 26],\n [10, 14, 15, 17, 18, 26],\n [9, 10, 14, 15, 17, 18, 26],\n [9, 10, 14, 15, 17, 18, 23, 26],\n [9, 10, 14, 15, 17, 18, 23, 26, 28],\n [9, 10, 14, 15, 17, 18, 21, 24, 26, 28],\n [9, 10, 12, 14, 15, 17, 18, 21, 24, 26, 28],\n [3, 6, 9, 10, 12, 14, 15, 17, 18, 21, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 21, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26],\n [3, 6, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 28],\n [3, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 12, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 20, 22, 24, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28],\n [2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],\n [1, 2, 4, 5, 7, 8, 9, 10, 11, 13, 14, 15, 16, 17, 18, 19, 21, 23, 25, 26, 27, 28, 29],\n]\n\n/**\n * Get a color from the discrete rainbow palette for a given index and palette size.\n * Colors are optimized for visual distinction at each palette size.\n *\n * @param index - The index of the color in the series (0-based)\n * @param size - The total number of colors needed (1-23)\n * @returns The hex color string\n */\nexport function getDiscreteRainbowColor(index: number, size: number): string {\n index = Math.max(0, index)\n size = Math.min(Math.max(1, size), discreteRainbowPalettes.length)\n\n const palette = discreteRainbowPalettes[size - 1]\n if (index >= palette.length) index = index % palette.length\n\n return discreteRainbow[palette[index] - 1]\n}\n\nexport const primitiveTypography = {\n fontFamilies: {\n sans: ['Inter', '-apple-system', 'BlinkMacSystemFont', 'Segoe UI', 'Helvetica', 'Arial', 'sans-serif'],\n body: ['Nunito Sans', 'sans-serif'],\n heading: ['Space Grotesk', 'sans-serif'],\n mono: ['SF Mono', 'Monaco', 'Inconsolata', 'Fira Mono', 'Droid Sans Mono', 'Source Code Pro', 'monospace'],\n },\n fontSizes: {\n xs: '0.75rem', // 12px\n sm: '0.875rem', // 14px\n base: '1rem', // 16px\n lg: '1.125rem', // 18px\n xl: '1.5rem', // 24px\n '2xl': '2rem', // 32px\n '3xl': '2.25rem', // 36px\n '4xl': '3rem', // 48px\n '5xl': '3.5rem', // 56px\n },\n fontWeights: {\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeights: {\n none: 1,\n tight: 1.375,\n snug: 1.5,\n normal: 1.57,\n relaxed: 1.66,\n loose: 1.75,\n },\n letterSpacing: {\n tighter: '-0.05em',\n tight: '-0.025em',\n normal: '0em',\n wide: '0.025em',\n wider: '0.05em',\n widest: '0.5px',\n },\n} as const\n\nexport const primitiveSpacing = {\n 0: '0',\n px: '1px',\n 0.5: '0.125rem', // 2px\n 1: '0.25rem', // 4px\n 1.5: '0.375rem', // 6px\n 2: '0.5rem', // 8px\n 2.5: '0.625rem', // 10px\n 3: '0.75rem', // 12px\n 3.5: '0.875rem', // 14px\n 4: '1rem', // 16px\n 5: '1.25rem', // 20px\n 6: '1.5rem', // 24px\n 7: '1.75rem', // 28px\n 8: '2rem', // 32px\n 9: '2.25rem', // 36px\n 10: '2.5rem', // 40px\n 11: '2.75rem', // 44px\n 12: '3rem', // 48px\n 14: '3.5rem', // 56px\n 16: '4rem', // 64px\n 20: '5rem', // 80px\n 24: '6rem', // 96px\n 28: '7rem', // 112px\n 32: '8rem', // 128px\n} as const\n\nexport const primitiveBorderRadius = {\n none: '0',\n sm: '4px',\n DEFAULT: '8px',\n md: '8px',\n lg: '12px',\n xl: '16px',\n '2xl': '24px',\n full: '9999px',\n} as const\n\nexport const primitiveShadows = {\n none: 'none',\n sm: '0px 1px 2px rgba(100, 116, 139, 0.12)',\n DEFAULT: '0px 1px 3px rgba(100, 116, 139, 0.12), 0px 1px 2px rgba(100, 116, 139, 0.24)',\n md: '0px 4px 6px rgba(100, 116, 139, 0.12)',\n lg: '0px 10px 15px rgba(100, 116, 139, 0.12)',\n xl: '0px 20px 25px rgba(100, 116, 139, 0.12)',\n '2xl': '0px 25px 50px rgba(100, 116, 139, 0.25)',\n inner: 'inset 0 2px 4px 0 rgba(0, 0, 0, 0.06)',\n} as const\n\nexport const primitiveBreakpoints = {\n xs: 0,\n sm: 600,\n md: 1000,\n lg: 1200,\n xl: 1920,\n} as const\n\nexport const primitiveZIndex = {\n hide: -1,\n auto: 'auto',\n base: 0,\n docked: 10,\n dropdown: 1000,\n sticky: 1100,\n drawer: 1100,\n banner: 1200,\n appBar: 1200,\n overlay: 1300,\n modal: 1400,\n popover: 1500,\n skipLink: 1600,\n toast: 1700,\n tooltip: 1800,\n} as const\n","/**\n * Workout-specific tokens not yet in the main Tailwind config.\n * Use these inline instead of Tailwind classes.\n */\nimport { divergingScale, sequentialEffort, primitiveRamps as ramp } from './tokens/primitives'\n\nexport const WORKOUT_TOKENS = {\n // Canonical 4-band performance scale — the single source for BOTH the\n // VelocityStrip zone bars and the SetRow RPE color (TD-03.43). The direction\n // is intentionally inverted between the two consumers: for velocity, green =\n // fastest/best; for RPE, green = easiest. This is the [0,1,2,4] subsample of\n // the canonical `sequentialEffort` primitive. The `orange` key is the band\n // label. Consumed inline (RN).\n scale: {\n green: sequentialEffort[0],\n yellow: sequentialEffort[1],\n orange: sequentialEffort[2], // gold band\n red: sequentialEffort[4],\n },\n\n // BodyMap volume heatmap — the canonical `divergingScale` (under → optimal →\n // over): a true diverging shape with a light green center, cool-blue under-\n // trained end and warm-red over-reaching end (colorblind-robust in lightness).\n heatmap: {\n none: '#E0E0E0', // no training data\n under: divergingScale[0], // below MEV\n maintenance: divergingScale[1], // MEV to MAV\n productive: divergingScale[2], // optimal center — MAV to MRV\n approaching: divergingScale[3], // near MRV\n over: divergingScale[4], // over MRV\n },\n\n // Badge border-radius (rounded-sm is 4px, we need 2px)\n badgeRadius: 2,\n\n // Surface and border colors were removed here: those flip with the theme, so\n // components use the CSS custom properties (var(--color-surface-*/border-*))\n // directly. Only theme-independent data-viz values remain below.\n\n // Intensity bar specific — over-target tiers deepen along the red ramp.\n intensity: {\n track: '#333333',\n over1: ramp.red[600], // matches status-error\n over2: ramp.red[700],\n over3: ramp.red[800],\n targetLine: 'rgba(33, 150, 243, 0.5)',\n atTargetGlow:\n '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)',\n },\n\n // Placeholder strip\n placeholder: {\n fill: '#3A3A3A',\n },\n\n // Deviation bar\n deviation: {\n track: '#333333',\n },\n} as const\n","// Font mapping context: presentation-only helpers, no rendering.\nimport { WORKOUT_TOKENS } from '../theme/workout-tokens'\n\n/**\n * Presentation helpers for workout metrics.\n *\n * The data layer (`@voltras/workout-analytics` view-model derivations) supplies\n * EXACT, unrounded values; these turn them into the rounded / banded / formatted\n * forms a view renders. Keeping display munging here — in the design system, not\n * the analytics layer — is the render half of the model↔render split: one view\n * can round while another (or a hover) shows the exact value from the same real\n * data. Workout components consume these so the rules live in one place.\n */\n\n/** Round an exact RPE onto its conventional 0.5 granularity for display. */\nexport function roundRpe(rpe: number): number {\n return Math.round(rpe * 2) / 2\n}\n\n/**\n * Color band for an RPE on the canonical performance scale. Higher RPE = harder\n * = red (direction inverted vs velocity, which shares the same scale). Bands:\n * `<7` green, `7–8.5` yellow, `8.5–9.5` orange, `≥9.5` red.\n */\nexport function rpeColor(rpe: number): string {\n if (rpe >= 9.5) return WORKOUT_TOKENS.scale.red\n if (rpe >= 8.5) return WORKOUT_TOKENS.scale.orange\n if (rpe >= 7) return WORKOUT_TOKENS.scale.yellow\n return WORKOUT_TOKENS.scale.green\n}\n\n/** Round a weight or e1RM to a whole unit for compact display. */\nexport function roundWeight(weight: number): number {\n return Math.round(weight)\n}\n\n/** Format an exact velocity (m/s) to the 2-dp string shown on the velocity strip. */\nexport function formatVelocity(velocity: number): string {\n return velocity.toFixed(2)\n}\n\n/** Round an exact tempo tuple (seconds) to 1 dp per phase for display. */\nexport function roundTempo(\n tempo: [number, number, number, number]\n): [number, number, number, number] {\n return tempo.map((v) => Math.round(v * 10) / 10) as [number, number, number, number]\n}\n\n/** Signed percentage label for a deviation ratio, e.g. `+9%` / `-5%` / `0%`. */\nexport function formatSignedPct(ratio: number): string {\n const pct = Math.round(ratio * 100)\n return `${pct > 0 ? '+' : ''}${pct}%`\n}\n\n/** Structured prescription for the active exercise (from the plan). */\nexport interface PrescriptionInput {\n repsLow?: number\n repsHigh?: number\n weightLbs?: number\n rpe?: number\n}\n\n/**\n * Human prescription string, e.g. `\"8–10 @ 62 lb · RPE 8\"`. `null` when there is\n * nothing to show. Presentation-only: the plan supplies the numbers, this shapes\n * the label.\n */\nexport function formatPrescription(p: PrescriptionInput | null | undefined): string | null {\n if (p == null) return null\n let reps: string | null = null\n if (p.repsLow != null && p.repsHigh != null) {\n reps = p.repsLow === p.repsHigh ? `${p.repsLow}` : `${p.repsLow}–${p.repsHigh}`\n } else if (p.repsLow != null) {\n reps = `${p.repsLow}`\n }\n const weight = p.weightLbs != null ? `${p.weightLbs} lb` : null\n const head = [reps, weight].filter((s): s is string => s != null).join(' @ ')\n const rpe = p.rpe != null ? `RPE ${p.rpe}` : null\n const full = [head.length > 0 ? head : null, rpe]\n .filter((s): s is string => s != null)\n .join(' · ')\n return full.length > 0 ? full : null\n}\n","/**\n * Custom JSX runtime for titan-design's web distribution.\n *\n * Converts className props to $$css style objects at build time,\n * eliminating the need for NativeWind's runtime interopComponents\n * Map lookup. RNW's styleq recognizes $$css objects and applies\n * their values as CSS class names on DOM elements.\n *\n * This file is NOT used by source builds (specimen, storybook,\n * native Metro). It is only inlined into the dist by tsup via\n * an esbuild onResolve plugin.\n */\nimport {\n jsx as reactJsx,\n jsxs as reactJsxs,\n Fragment,\n} from 'react/jsx-runtime'\nimport type { StyleProp } from 'react-native'\n\ntype JsxFn = typeof reactJsx\n\nfunction wrapJsx(fn: JsxFn): JsxFn {\n return function (type, props: Record<string, any>, ...rest) {\n if (props && typeof props.className === 'string' && props.className) {\n const cn = props.className\n const cssStyle = { $$css: true, [cn]: cn } as unknown as StyleProp<any>\n const existing = props.style\n props = {\n ...props,\n style: existing ? [cssStyle, existing] : cssStyle,\n }\n delete props.className\n }\n return fn(type, props, ...rest)\n } as JsxFn\n}\n\nconst jsx = wrapJsx(reactJsx)\nconst jsxs = wrapJsx(reactJsxs)\n\nexport { jsx, jsxs, Fragment }\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps, type ViewStyle } from 'react-native'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\nimport { formatVelocity } from '../../../utils/workout-format'\n\n/**\n * Structural velocity-zone band accepted from an upstream analytics source\n * (e.g. workout-analytics' `VelocityZones.bands`).\n *\n * Deliberately a plain structural shape — titan never imports the analytics\n * package (same policy as TempoBar's presentational phase key). Any object with\n * this shape can be passed, so `zones={waVelocityZones.bands}` works directly.\n * Bands are ordered slow → fast, contiguous, and cover `[0, ∞)` with the top\n * band's `max === null`. Bands carry NO color — color is a UI concern resolved\n * here via {@link zoneIdToScaleToken}.\n */\nexport interface VelocityZoneBandProp {\n /** Stable zone identity (e.g. WA's `VelocityZoneId`). Drives color mapping. */\n id: string\n /** Human-readable label shown in the summary row. */\n label: string\n /** Inclusive lower bound (m/s mean concentric velocity). */\n min: number\n /** Exclusive upper bound (m/s); `null` marks the open top band. */\n max: number | null\n}\n\nexport interface VelocityStripProps extends ViewProps {\n /**\n * Per-rep MEAN concentric velocity (m/s), one entry per rep (brain WA-D02).\n * Drives both bar height and — in the default path — zone color. Callers must\n * feed mean (not peak) concentric velocity so bar color, height, and the\n * summary label all describe one metric.\n */\n velocities: number[]\n /**\n * Optional velocity-zone bands (shape-compatible with WA's\n * `VelocityZones.bands`). When provided, bar color and the summary zone label\n * come from these bands via {@link zoneIdToScaleToken}. When omitted, the\n * built-in default scale (≥1.0 / ≥0.75 / ≥0.5) is used — identical to prior\n * releases. Colors NEVER come from the bands themselves.\n */\n zones?: readonly VelocityZoneBandProp[]\n /**\n * Live mode: index of the most-recently-completed rep. That bar animates in\n * with a \"pop\"; if it is also the current set peak (a new best), it \"bounces\"\n * instead. Only the latest bar animates. Honors `prefers-reduced-motion`.\n * Full variant only.\n */\n liveRepIndex?: number\n expanded?: boolean\n onToggle?: () => void\n onRepPress?: (index: number, velocity: number) => void\n variant?: 'full' | 'mini'\n showInfo?: boolean\n className?: string\n}\n\n// Canonical 4-color performance scale shared with SetRow's RPE color\n// (see theme/workout-tokens.ts). green = fastest, red = slowest/grinding.\nconst VEL_COLORS = WORKOUT_TOKENS.scale\n\n/**\n * Map a velocity-zone id (WA's 5-band taxonomy) onto the canonical 4-color\n * scale. The scale has 4 hues but the taxonomy has 5 bands, so the two slowest\n * bands — `maximalStrength` and `grinding` — intentionally share `red`: both\n * read as \"heavy / effortful\" and there is no distinct 5th data-viz hue. The\n * top three bands align 1:1 with the legacy default scale so an exercise moving\n * from default to profile-derived zones never shifts its fast-end colors.\n *\n * Legacy default parity: speed=green, power=yellow, strengthSpeed=orange, and\n * the old sub-0.5 \"Strength\" band (now split into maximalStrength + grinding)\n * stays red.\n *\n * Unknown ids fall back to `green` (matching the historical default-path\n * fallback), so a forward-compatible band id never renders an empty bar.\n */\nconst zoneIdToScaleToken: Record<string, keyof typeof VEL_COLORS> = {\n speed: 'green',\n power: 'yellow',\n strengthSpeed: 'orange',\n maximalStrength: 'red',\n grinding: 'red',\n}\n\n// --- Default (no-zones) scale ------------------------------------------------\n// Retained as named exports for back-compat; they define the default path.\n\nexport function getVelocityZoneColor(velocity: number): string {\n if (velocity >= 1.0) return 'vel-green'\n if (velocity >= 0.75) return 'vel-yellow'\n if (velocity >= 0.5) return 'vel-orange'\n return 'vel-red'\n}\n\nexport function getVelocityZoneName(velocity: number): string {\n if (velocity >= 1.0) return 'Speed'\n if (velocity >= 0.75) return 'Power'\n if (velocity >= 0.5) return 'Strength-Speed'\n return 'Strength'\n}\n\nconst zoneHexMap: Record<string, string> = {\n 'vel-green': VEL_COLORS.green,\n 'vel-yellow': VEL_COLORS.yellow,\n 'vel-orange': VEL_COLORS.orange,\n 'vel-red': VEL_COLORS.red,\n}\n\n/**\n * Velocity loss for a set, as a whole percentage. Uses the running-best rep as\n * the reference (matching WA-02.05 / brain WA-D01): `(vBest − vLast) / vBest`,\n * clamped to ≥ 0 so a set that ends on its best rep reports 0 loss.\n */\nexport function calculateVelocityLoss(velocities: number[]): number {\n if (velocities.length < 2) return 0\n const best = Math.max(...velocities)\n if (best <= 0) return 0\n const last = velocities[velocities.length - 1]\n return Math.max(0, Math.round(((best - last) / best) * 100))\n}\n\n/** Arithmetic mean of the per-rep mean-concentric velocities. */\nexport function calculateMeanVelocity(velocities: number[]): number {\n if (velocities.length === 0) return 0\n const sum = velocities.reduce((acc, v) => acc + v, 0)\n return sum / velocities.length\n}\n\n/** Classify a velocity into its band (slow → fast, min inclusive / max exclusive). */\nfunction classifyBand(\n velocity: number,\n bands: readonly VelocityZoneBandProp[],\n): VelocityZoneBandProp | undefined {\n for (const band of bands) {\n if (band.max === null || velocity < band.max) return band\n }\n return bands[bands.length - 1]\n}\n\nfunction bandColor(band: VelocityZoneBandProp): string {\n const token = zoneIdToScaleToken[band.id]\n return token ? VEL_COLORS[token] : VEL_COLORS.green\n}\n\nfunction getLossStyle(loss: number): Record<string, string> | null {\n if (loss > 25) return { color: VEL_COLORS.red }\n if (loss > 20) return { color: VEL_COLORS.orange }\n return null\n}\n\nfunction getReducedMotionPreference(): boolean {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches\n}\n\n/** Track the OS \"reduce motion\" preference; falls back to `false` (jsdom/SSR). */\nfunction usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(getReducedMotionPreference)\n useEffect(() => {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return\n const mq = window.matchMedia('(prefers-reduced-motion: reduce)')\n const handler = () => setReduced(mq.matches)\n handler()\n mq.addEventListener?.('change', handler)\n return () => mq.removeEventListener?.('change', handler)\n }, [])\n return reduced\n}\n\nconst ANIMATION_DURATION = 400\nconst ANIMATION_EASING = Easing.bezier(0.22, 1, 0.36, 1)\nconst POP_EASING = Easing.bezier(0.34, 1.56, 0.64, 1)\n\nexport function VelocityStrip({\n velocities,\n zones,\n liveRepIndex,\n expanded = false,\n onToggle,\n onRepPress,\n variant = 'full',\n showInfo = true,\n className,\n ...props\n}: VelocityStripProps) {\n const maxVelocity = Math.max(...velocities, 0)\n const meanVelocity = calculateMeanVelocity(velocities)\n const loss = calculateVelocityLoss(velocities)\n\n const hasZones = zones != null && zones.length > 0\n const barColorFor = (v: number): string =>\n hasZones ? bandColor(classifyBand(v, zones)!) : zoneHexMap[getVelocityZoneColor(v)]\n const meanZone = hasZones\n ? (classifyBand(meanVelocity, zones)?.label ?? '')\n : getVelocityZoneName(meanVelocity)\n\n const prefersReducedMotion = usePrefersReducedMotion()\n const [heightAnim] = useState(() => new Animated.Value(expanded ? 60 : 3))\n const [labelOpacity] = useState(() => new Animated.Value(expanded ? 1 : 0))\n const [infoOpacity] = useState(() => new Animated.Value(expanded ? 1 : 0))\n const [liveScale] = useState(() => new Animated.Value(1))\n\n // Newest-rep animation: pop for a normal rep, bounce when it sets a new peak.\n const liveVelocity = liveRepIndex != null ? velocities[liveRepIndex] : undefined\n const isNewPeak = liveVelocity != null && maxVelocity > 0 && liveVelocity === maxVelocity\n useEffect(() => {\n if (variant === 'mini' || liveRepIndex == null || liveVelocity == null) return\n if (prefersReducedMotion) {\n liveScale.setValue(1)\n return\n }\n if (isNewPeak) {\n liveScale.setValue(1)\n Animated.sequence([\n Animated.timing(liveScale, {\n toValue: 1.25,\n duration: 150,\n easing: Easing.out(Easing.quad),\n useNativeDriver: true,\n }),\n Animated.spring(liveScale, {\n toValue: 1,\n friction: 3,\n tension: 140,\n useNativeDriver: true,\n }),\n ]).start()\n } else {\n liveScale.setValue(0.8)\n Animated.timing(liveScale, {\n toValue: 1,\n duration: 300,\n easing: POP_EASING,\n useNativeDriver: true,\n }).start()\n }\n }, [variant, liveRepIndex, liveVelocity, isNewPeak, prefersReducedMotion, liveScale])\n\n useEffect(() => {\n if (variant === 'mini') return\n\n Animated.parallel([\n Animated.timing(heightAnim, {\n toValue: expanded ? 60 : 3,\n duration: ANIMATION_DURATION,\n easing: ANIMATION_EASING,\n useNativeDriver: false,\n }),\n Animated.timing(labelOpacity, {\n toValue: expanded ? 1 : 0,\n duration: 300,\n delay: expanded ? 150 : 0,\n useNativeDriver: false,\n }),\n Animated.timing(infoOpacity, {\n toValue: expanded ? 1 : 0,\n duration: 300,\n delay: expanded ? 200 : 0,\n useNativeDriver: false,\n }),\n ]).start()\n }, [expanded, variant, heightAnim, labelOpacity, infoOpacity])\n\n if (variant === 'mini') {\n const { style: externalStyle, ...restProps } = props\n return (\n <View\n className={className}\n style={[{ flexDirection: 'row', height: 3, gap: 2, borderRadius: 2, overflow: 'hidden' }, externalStyle]}\n accessibilityRole=\"image\"\n accessibilityLabel={`Velocity strip, ${velocities.length} reps`}\n testID=\"velocity-strip-mini\"\n {...restProps}\n >\n {velocities.map((v, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n backgroundColor: barColorFor(v),\n borderRadius: 1,\n minWidth: 4,\n height: '100%' as unknown as number,\n }}\n accessibilityElementsHidden\n testID={`velocity-bar-${i}`}\n />\n ))}\n </View>\n )\n }\n\n const stripLabel = `Velocity chart for set, ${velocities.length} reps, tap to ${expanded ? 'collapse' : 'expand'}`\n // When onToggle wraps the strip or individual reps are interactive, the container itself is not a button\n const hasInteractiveContainer = onToggle != null\n const hasInteractiveReps = onRepPress != null && expanded\n\n const stripContent = (\n <Animated.View\n className={[className, expanded ? 'bg-surface-raised' : 'bg-transparent']\n .filter(Boolean)\n .join(' ')}\n style={[\n {\n height: heightAnim,\n width: '100%',\n gap: 2,\n borderRadius: expanded ? 6 : 2,\n paddingTop: expanded ? 16 : 0,\n paddingBottom: expanded ? 24 : 0,\n paddingHorizontal: expanded ? 6 : 0,\n paddingVertical: expanded ? undefined : 8,\n overflow: expanded ? 'visible' : 'hidden',\n },\n ]}\n accessibilityRole={hasInteractiveContainer || hasInteractiveReps ? 'none' : 'button'}\n accessibilityLabel={hasInteractiveContainer || hasInteractiveReps ? undefined : stripLabel}\n testID=\"velocity-strip\"\n {...props}\n >\n <View\n style={{ flexDirection: 'row', flex: 1, gap: 2, alignItems: 'flex-end' }}\n >\n {velocities.map((v, i) => {\n const barBackground = barColorFor(v)\n // Guard all-zero velocities (idle / pre-rep): maxVelocity === 0 makes\n // this 0 / 0 === NaN and emits height:'NaN%'. Flatten the bars instead.\n const barHeightPct =\n maxVelocity > 0 ? Math.round((v / (maxVelocity * 1.15)) * 100) : 0\n const isLive = liveRepIndex === i\n const liveLabelSuffix = isLive\n ? isNewPeak\n ? ', latest rep, new set peak'\n : ', latest rep'\n : ''\n\n const barStyle: ViewStyle = expanded\n ? { height: `${barHeightPct}%`, minHeight: 2, borderTopLeftRadius: 2, borderTopRightRadius: 2, backgroundColor: barBackground }\n : {\n minHeight: '100%' as unknown as number,\n borderTopLeftRadius: 2,\n borderTopRightRadius: 2,\n borderBottomLeftRadius: 0,\n borderBottomRightRadius: 0,\n backgroundColor: barBackground,\n }\n\n const barInner = isLive ? (\n <Animated.View\n style={[barStyle, { transform: [{ scale: liveScale }] }]}\n testID={`velocity-bar-${i}`}\n accessibilityRole=\"image\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second${liveLabelSuffix}`}\n />\n ) : (\n <View\n style={barStyle}\n testID={`velocity-bar-${i}`}\n accessibilityRole=\"image\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second`}\n />\n )\n\n const bar = (\n <View\n key={i}\n style={{ flex: 1, height: '100%', justifyContent: 'flex-end', position: 'relative' }}\n >\n {expanded && (\n <Animated.View style={{ opacity: labelOpacity, alignItems: 'center', position: 'absolute', top: -13, left: 0, right: 0 }} accessibilityElementsHidden>\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 8, fontWeight: '600' }}\n testID={`velocity-label-${i}`}\n >\n {formatVelocity(v)}\n </Text>\n </Animated.View>\n )}\n {barInner}\n </View>\n )\n\n if (onRepPress && expanded) {\n return (\n <Pressable\n key={i}\n style={{ flex: 1, height: '100%' }}\n onPress={() => onRepPress(i, v)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Rep ${i + 1}: ${formatVelocity(v)} meters per second, tap for details`}\n testID={`velocity-bar-pressable-${i}`}\n >\n {bar}\n </Pressable>\n )\n }\n\n return bar\n })}\n </View>\n {expanded && showInfo && (\n <Animated.View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n opacity: infoOpacity,\n position: 'absolute',\n bottom: 4,\n left: 6,\n right: 6,\n }}\n testID=\"velocity-info-row\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {meanZone} {'·'} {formatVelocity(meanVelocity)} m/s\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n ...getLossStyle(loss),\n }}\n >\n Loss: {loss}%\n </Text>\n </Animated.View>\n )}\n </Animated.View>\n )\n\n if (onToggle) {\n return (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={stripLabel}\n testID=\"velocity-strip-pressable\"\n >\n {stripContent}\n </Pressable>\n )\n }\n\n return stripContent\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Utility function to merge Tailwind CSS classes with proper conflict resolution.\n * Combines clsx for conditional classes with tailwind-merge for deduplication.\n *\n * @example\n * cn('p-4 bg-red-500', isActive && 'bg-blue-500', className)\n * // If isActive is true, returns 'p-4 bg-blue-500' (not 'p-4 bg-red-500 bg-blue-500')\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nexport interface PlaceholderStripProps extends ViewProps {\n width?: number | string\n /** Render as single solid strip or segmented mini-strip */\n mode?: 'single' | 'segmented'\n /** Number of segments when mode is 'segmented' */\n segments?: number\n className?: string\n}\n\nfunction SingleStrip({\n width,\n className,\n ...props\n}: Omit<PlaceholderStripProps, 'mode' | 'segments'>) {\n return (\n <View\n className={className}\n style={[\n {\n height: 3,\n backgroundColor: WORKOUT_TOKENS.placeholder.fill,\n borderRadius: 2,\n opacity: 0.5,\n },\n width != null ? { width: width as number } : { flex: 1 },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Planned set, not yet completed\"\n testID=\"placeholder-strip\"\n {...props}\n />\n )\n}\n\nfunction SegmentedStrip({\n segments = 3,\n width,\n className,\n ...props\n}: Omit<PlaceholderStripProps, 'mode'>) {\n return (\n <View\n className={cn('flex-row', className)}\n style={[\n { height: 3, gap: 2, opacity: 0.5 },\n width != null ? { width: width as number } : { flex: 1 },\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Planned set, not yet completed\"\n testID=\"placeholder-strip\"\n {...props}\n >\n {Array.from({ length: segments }, (_, i) => (\n <View\n key={i}\n style={{\n flex: 1,\n height: 3,\n backgroundColor: WORKOUT_TOKENS.placeholder.fill,\n borderRadius: 1,\n minWidth: 4,\n }}\n accessibilityElementsHidden\n testID=\"placeholder-segment\"\n />\n ))}\n </View>\n )\n}\n\nexport function PlaceholderStrip({\n mode = 'single',\n segments,\n ...props\n}: PlaceholderStripProps) {\n if (mode === 'segmented') {\n return <SegmentedStrip segments={segments} {...props} />\n }\n return <SingleStrip {...props} />\n}\n","import type { ReactNode } from 'react'\n\nexport interface IconProps {\n /** Rendered width/height in px (viewBox is fixed 24×24). */\n size?: number\n /** Stroke color (or fill, for solid icons). Defaults to `currentColor` so a wrapper's text token drives it. */\n color?: string\n /** Stroke width for outline icons. */\n strokeWidth?: number\n /** Fill color; defaults to `none` (outline). */\n fill?: string\n /** Accessible title — sets `role=\"img\"` + `<title>`. Omit for a decorative icon (hidden from AT). */\n title?: string\n}\n\nexport interface SvgIconProps extends IconProps {\n children: ReactNode\n}\n\n/**\n * Base SVG wrapper for the titan icon set — a 24×24 web-`<svg>` with the shared\n * accessibility contract (titled → `role=\"img\"` + `<title>`; untitled →\n * `aria-hidden`) and `currentColor` inheritance. Icons pass their paths as\n * children plus their stroke/fill defaults.\n */\nexport function SvgIcon({\n size = 24,\n color = 'currentColor',\n strokeWidth = 2,\n fill = 'none',\n title,\n children,\n}: SvgIconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={fill}\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n {...(title ? { role: 'img', 'aria-label': title } : { 'aria-hidden': true })}\n >\n {title ? <title>{title}</title> : null}\n {children}\n </svg>\n )\n}\n","import { SvgIcon, type IconProps } from './SvgIcon'\n\n/**\n * Voltras brand mark — the ◇ diamond (outline). Pass `fill` for a solid mark.\n */\nexport function VoltrasMark({ size = 14, ...props }: IconProps) {\n return (\n <SvgIcon size={size} {...props}>\n <path d=\"M12 2 22 12 12 22 2 12Z\" />\n </SvgIcon>\n )\n}\n\n/**\n * Bluetooth glyph (stroked) — e.g. device-connection state (color via `currentColor`).\n */\nexport function BluetoothIcon({ size = 18, ...props }: IconProps) {\n return (\n <SvgIcon size={size} {...props}>\n <path d=\"M7 7 17 17 12 22 12 2 17 7 7 17\" />\n </SvgIcon>\n )\n}\n\n/** Dumbbell glyph (mirrors lucide-react `Dumbbell`). Outline-only by default. */\nexport function DumbbellIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M14.4 14.4 9.6 9.6\" />\n <path d=\"M18.657 21.485a2 2 0 1 1-2.829-2.828l-1.767 1.768a2 2 0 1 1-2.829-2.829l6.364-6.364a2 2 0 1 1 2.829 2.829l-1.768 1.767a2 2 0 1 1 2.828 2.829z\" />\n <path d=\"m21.5 21.5-1.4-1.4\" />\n <path d=\"M3.9 3.9 2.5 2.5\" />\n <path d=\"M6.404 12.768a2 2 0 1 1-2.829-2.829l1.768-1.767a2 2 0 1 1-2.828-2.829l2.828-2.828a2 2 0 1 1 2.829 2.828l1.767-1.768a2 2 0 1 1 2.829 2.829z\" />\n </SvgIcon>\n )\n}\n\n/** Star glyph (mirrors lucide-react `Star`). Pass `fill` for a solid star. */\nexport function StarIcon(props: IconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </SvgIcon>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState, type ReactNode } from 'react'\nimport { View, Pressable, Animated, type ViewProps } from 'react-native'\n\nexport type BaseBadgeVariant = 'plain' | 'pr'\nexport type BaseBadgeSize = 'sm' | 'md' | 'lg'\n\nexport interface BaseBadgeProps extends ViewProps {\n /** Visual variant — plain (neutral) or pr (brand-primary-subtle) */\n variant?: BaseBadgeVariant\n /** Size variant */\n size?: BaseBadgeSize\n /** Optional icon rendered left of children; hidden from a11y tree */\n icon?: ReactNode\n onPress?: () => void\n className?: string\n children?: ReactNode\n}\n\nexport const baseBadgeSizeConfig: Record<\n BaseBadgeSize,\n { fontSize: number; paddingH: number; paddingV: number; iconSize: number }\n> = {\n sm: { fontSize: 9, paddingH: 6, paddingV: 2, iconSize: 10 },\n md: { fontSize: 10, paddingH: 8, paddingV: 2, iconSize: 12 },\n lg: { fontSize: 12, paddingH: 10, paddingV: 4, iconSize: 14 },\n}\n\nconst variantColors: Record<\n BaseBadgeVariant,\n { backgroundColor: string; borderColor: string }\n> = {\n plain: { backgroundColor: '#1C1C1C', borderColor: '#1F1F1F' },\n pr: {\n backgroundColor: 'rgba(255, 121, 0, 0.12)',\n borderColor: 'rgba(255, 121, 0, 0.3)',\n },\n}\n\nexport function BaseBadge({\n variant = 'plain',\n size = 'md',\n icon,\n onPress,\n className,\n children,\n ...props\n}: BaseBadgeProps) {\n const [scaleAnim] = useState(() => new Animated.Value(1))\n const config = baseBadgeSizeConfig[size]\n const colors = variantColors[variant]\n\n const handlePressIn = () => {\n Animated.timing(scaleAnim, {\n toValue: 0.97,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const handlePressOut = () => {\n Animated.timing(scaleAnim, {\n toValue: 1,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const badge = (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 3,\n // borderRadius 2 is intentional per workout-tokens.ts (squared-off pill)\n borderRadius: 2,\n borderWidth: 1,\n borderColor: colors.borderColor,\n backgroundColor: colors.backgroundColor,\n paddingHorizontal: config.paddingH,\n paddingVertical: config.paddingV,\n }}\n {...props}\n >\n {icon != null && (\n <View accessibilityElementsHidden testID=\"base-badge-icon\">\n {icon}\n </View>\n )}\n {children}\n </View>\n )\n\n if (onPress) {\n return (\n <Animated.View style={{ transform: [{ scale: scaleAnim }] }}>\n <Pressable\n onPress={onPress}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole=\"button\"\n accessibilityLabel={props.accessibilityLabel}\n testID=\"base-badge-pressable\"\n >\n {badge}\n </Pressable>\n </Animated.View>\n )\n }\n\n return badge\n}\n","/**\n * Semantic Design Tokens\n *\n * Meaningful tokens following DTCG (Design Tokens Community Group) naming conventions.\n * Pattern: {category}-{intent}-{variant?}-{state?}\n *\n * Categories:\n * - brand-* : Brand colors (primary, secondary, accent)\n * - status-* : Feedback colors (success, error, warning, info)\n * - result-* : Outcome indicators (improve, degrade, inconclusive, neutral)\n * - data-* : Data visualization colors (chart series)\n * - on-* : Text on colored backgrounds\n * - surface-* : Elevated containers (NOT \"paper\")\n * - background-* : Page backgrounds\n * - text-* : Text colors\n * - border-* : Border colors\n * - interactive-* : Hover/focus/active/disabled states\n */\n\nimport { primitiveColors as p, primitiveRamps as ramp, discreteRainbow } from './primitives'\n\n// Light mode semantic colors (default)\nexport const semanticColorsLight = {\n // Brand colors (brand-*)\n 'brand-primary': ramp.orange[400],\n 'brand-primary-light': ramp.orange[300],\n 'brand-primary-dark': ramp.orange[500],\n 'brand-primary-subtle': 'rgba(255, 121, 0, 0.08)',\n 'brand-primary-hover': ramp.orange[500],\n 'brand-primary-active': ramp.orange[600],\n\n 'brand-secondary': ramp.cyan[600],\n 'brand-secondary-light': ramp.cyan[500],\n 'brand-secondary-dark': ramp.cyan[700],\n 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.08)',\n 'brand-secondary-hover': ramp.cyan[700],\n 'brand-secondary-active': ramp.cyan[800],\n\n // Text on brand backgrounds (on-*)\n 'on-brand-primary': p.white,\n 'on-brand-secondary': p.white,\n\n // Status colors (status-*)\n 'status-success': ramp.green[300],\n 'status-success-light': ramp.green[200],\n 'status-success-dark': ramp.green[600],\n 'status-success-subtle': ramp.green[50],\n\n 'status-error': ramp.red[600],\n 'status-error-light': ramp.red[500],\n 'status-error-dark': ramp.red[700],\n 'status-error-subtle': ramp.red[50],\n\n 'status-error-vivid': p.redVivid[500], // vivid alert red\n 'status-error-vivid-light': p.redVivid[400],\n 'status-error-vivid-dark': p.redVivid[700],\n 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',\n\n 'status-warning': ramp.amber[300],\n 'status-warning-light': ramp.amber[200],\n 'status-warning-dark': ramp.amber[500],\n 'status-warning-subtle': ramp.amber[50],\n\n 'status-info': ramp.blue[500],\n 'status-info-light': ramp.blue[300],\n 'status-info-dark': ramp.blue[600],\n 'status-info-subtle': ramp.blue[50],\n\n // Text on status backgrounds (on-status-*)\n 'on-status-success': p.white,\n 'on-status-error': p.white,\n 'on-status-warning': p.white,\n 'on-status-info': p.white,\n\n // Result/outcome indicators (result-*)\n 'result-improve': '#4caf50', // Green - positive outcome\n 'result-improve-light': 'rgba(76, 175, 80, 0.12)',\n 'result-improve-dark': '#248a24',\n 'result-degrade': '#ef5350', // Red - negative outcome\n 'result-degrade-light': 'rgba(239, 83, 80, 0.12)',\n 'result-degrade-dark': '#b30000',\n 'result-inconclusive': '#9E9A97', // Gray - no clear result\n 'result-inconclusive-light': 'rgba(158, 154, 151, 0.12)',\n 'result-neutral': p.neutral[500], // Neutral baseline\n\n // Text on result backgrounds (on-result-*)\n 'on-result-improve': p.white,\n 'on-result-degrade': p.white,\n 'on-result-inconclusive': p.white,\n\n // Data visualization colors (data-*)\n // First 10 colors from discrete rainbow optimized for charts\n 'data-1': discreteRainbow[9], // Blue\n 'data-2': discreteRainbow[14], // Green\n 'data-3': discreteRainbow[17], // Yellow\n 'data-4': discreteRainbow[25], // Red\n 'data-5': discreteRainbow[8], // Purple\n 'data-6': discreteRainbow[20], // Orange\n 'data-7': discreteRainbow[13], // Light Blue\n 'data-8': discreteRainbow[15], // Light Green\n 'data-9': discreteRainbow[3], // Lavender\n 'data-10': discreteRainbow[22], // Dark Orange\n\n // Text colors (text-*)\n 'text-primary': '#121828',\n 'text-secondary': '#65748B',\n 'text-tertiary': p.neutral[400],\n 'text-disabled': 'rgba(55, 65, 81, 0.48)',\n 'text-inverse': p.white,\n 'text-link': p.blue[600],\n 'text-link-hover': p.blue[700],\n\n // Surface colors (surface-*) - for elevated containers\n 'surface-base': p.white,\n 'surface-elevated': p.neutral[50], // slightly off-white for elevated cards\n 'surface-raised': p.neutral[100], // light gray for raised cards\n 'surface-overlay': p.white,\n 'surface-input': p.neutral[50], // Input field background (filled variant)\n\n // Background colors (background-*)\n 'background-base': '#EBEBEB',\n 'background-default': p.white,\n 'background-subtle': p.neutral[50],\n\n // Border colors (border-*)\n 'border-default': '#E8E9EB',\n 'border-subtle': p.neutral[100],\n 'border-strong': p.neutral[300],\n 'border-prominent': p.neutral[400], // high-visibility divider\n 'border-focus': p.blue[600],\n 'border-input': p.neutral[300], // Input field border\n 'border-input-hover': p.neutral[400], // Input field border on hover\n 'border-input-focus': p.blue[600], // Input field border on focus\n 'border-input-error': p.red[600], // Input field border on error\n\n // Interactive states (interactive-*)\n 'interactive-hover': 'rgba(55, 65, 81, 0.04)',\n 'interactive-focus': 'rgba(55, 65, 81, 0.12)',\n 'interactive-active': 'rgba(55, 65, 81, 0.16)',\n 'interactive-selected': 'rgba(55, 65, 81, 0.08)',\n 'interactive-disabled': 'rgba(55, 65, 81, 0.12)',\n 'interactive-disabled-text': 'rgba(55, 65, 81, 0.26)',\n\n // Divider\n 'divider': '#E8E9EB',\n\n // Avatar default\n 'avatar-background': p.neutral[500],\n 'avatar-text': p.white,\n} as const\n\n// Dark mode semantic colors\nexport const semanticColorsDark = {\n // Brand colors stay the same in dark mode\n 'brand-primary': ramp.orange[400],\n 'brand-primary-light': ramp.orange[300],\n 'brand-primary-dark': ramp.orange[500],\n 'brand-primary-subtle': 'rgba(255, 121, 0, 0.12)',\n 'brand-primary-hover': ramp.orange[300],\n 'brand-primary-active': ramp.orange[200],\n\n 'brand-secondary': ramp.cyan[600],\n 'brand-secondary-light': ramp.cyan[500],\n 'brand-secondary-dark': ramp.cyan[700],\n 'brand-secondary-subtle': 'rgba(48, 123, 155, 0.12)',\n 'brand-secondary-hover': ramp.cyan[500],\n 'brand-secondary-active': ramp.cyan[400],\n\n // Text on brand backgrounds\n 'on-brand-primary': p.white,\n 'on-brand-secondary': p.white,\n\n // Status colors\n 'status-success': ramp.green[300],\n 'status-success-light': ramp.green[200],\n 'status-success-dark': ramp.green[600],\n 'status-success-subtle': 'rgba(46, 213, 115, 0.12)',\n\n 'status-error': ramp.red[600],\n 'status-error-light': ramp.red[500],\n 'status-error-dark': ramp.red[700],\n 'status-error-subtle': 'rgba(209, 67, 67, 0.12)',\n\n 'status-error-vivid': p.redVivid[500],\n 'status-error-vivid-light': p.redVivid[400],\n 'status-error-vivid-dark': p.redVivid[700],\n 'status-error-vivid-subtle': 'rgba(255, 71, 87, 0.12)',\n\n 'status-warning': ramp.amber[300],\n 'status-warning-light': ramp.amber[200],\n 'status-warning-dark': ramp.amber[500],\n 'status-warning-subtle': 'rgba(249, 180, 21, 0.12)',\n\n 'status-info': ramp.blue[500],\n 'status-info-light': ramp.blue[300],\n 'status-info-dark': ramp.blue[600],\n 'status-info-subtle': 'rgba(33, 150, 243, 0.12)',\n\n // Text on status backgrounds\n 'on-status-success': p.white,\n 'on-status-error': p.white,\n 'on-status-warning': p.white,\n 'on-status-info': p.white,\n\n // Result/outcome indicators (result-*)\n 'result-improve': '#4caf50',\n 'result-improve-light': 'rgba(76, 175, 80, 0.16)',\n 'result-improve-dark': '#248a24',\n 'result-degrade': '#ef5350',\n 'result-degrade-light': 'rgba(239, 83, 80, 0.16)',\n 'result-degrade-dark': '#b30000',\n 'result-inconclusive': '#9E9A97',\n 'result-inconclusive-light': 'rgba(158, 154, 151, 0.16)',\n 'result-neutral': p.neutral[400],\n\n // Text on result backgrounds\n 'on-result-improve': p.white,\n 'on-result-degrade': p.white,\n 'on-result-inconclusive': p.white,\n\n // Data visualization colors (same in dark mode for consistency)\n 'data-1': discreteRainbow[9],\n 'data-2': discreteRainbow[14],\n 'data-3': discreteRainbow[17],\n 'data-4': discreteRainbow[25],\n 'data-5': discreteRainbow[8],\n 'data-6': discreteRainbow[20],\n 'data-7': discreteRainbow[13],\n 'data-8': discreteRainbow[15],\n 'data-9': discreteRainbow[3],\n 'data-10': discreteRainbow[22],\n\n // Text colors - inverted for dark mode\n 'text-primary': p.neutral[100],\n 'text-secondary': p.neutral[400],\n 'text-tertiary': p.neutral[500],\n 'text-disabled': 'rgba(255, 255, 255, 0.38)',\n 'text-inverse': p.neutral[900],\n 'text-link': '#828DF8',\n 'text-link-hover': p.blue[400],\n\n // Surface colors - dark backgrounds\n 'surface-base': p.charcoal[700], // main surface\n 'surface-elevated': p.charcoal[600], // elevated surface\n 'surface-raised': p.charcoal[500], // raised surface\n 'surface-overlay': p.charcoal[600], // overlay surface\n 'surface-input': p.charcoal[600], // input surface\n\n // Background colors\n 'background-base': p.charcoal[900], // darkest charcoal\n 'background-default': p.charcoal[700], // main background\n 'background-subtle': p.charcoal[500], // subtle background\n\n // Border colors\n 'border-default': p.charcoal[400], // default border\n 'border-subtle': p.charcoal[500], // subtle border\n 'border-strong': p.charcoal[300], // strong border\n 'border-prominent': p.charcoal[200], // high-visibility divider\n 'border-focus': '#828DF8',\n 'border-input': p.neutral[600],\n 'border-input-hover': p.neutral[500],\n 'border-input-focus': '#828DF8',\n 'border-input-error': p.red[500],\n\n // Interactive states\n 'interactive-hover': 'rgba(255, 255, 255, 0.04)',\n 'interactive-focus': 'rgba(255, 255, 255, 0.12)',\n 'interactive-active': 'rgba(255, 255, 255, 0.16)',\n 'interactive-selected': 'rgba(255, 255, 255, 0.08)',\n 'interactive-disabled': 'rgba(255, 255, 255, 0.12)',\n 'interactive-disabled-text': 'rgba(255, 255, 255, 0.26)',\n\n // Divider\n 'divider': p.charcoal[400], // divider color\n\n // Avatar default\n 'avatar-background': p.neutral[600],\n 'avatar-text': p.white,\n} as const\n\n// Typography tokens matching existing app\nexport const semanticTypography = {\n // Headings (Space Grotesk)\n h1: {\n fontFamily: 'heading',\n fontSize: '3.5rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h2: {\n fontFamily: 'heading',\n fontSize: '3rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h3: {\n fontFamily: 'heading',\n fontSize: '2.25rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h4: {\n fontFamily: 'heading',\n fontSize: '2rem',\n fontWeight: 700,\n lineHeight: 1.375,\n },\n h5: {\n fontFamily: 'heading',\n fontSize: '1.5rem',\n fontWeight: 600,\n lineHeight: 1.375,\n },\n h6: {\n fontFamily: 'heading',\n fontSize: '1.125rem',\n fontWeight: 600,\n lineHeight: 1.375,\n },\n\n // Body text (Nunito Sans)\n body1: {\n fontFamily: 'body',\n fontSize: '1rem',\n fontWeight: 400,\n lineHeight: 1.5,\n },\n body2: {\n fontFamily: 'body',\n fontSize: '0.875rem',\n fontWeight: 400,\n lineHeight: 1.57,\n },\n subtitle1: {\n fontFamily: 'body',\n fontSize: '1rem',\n fontWeight: 500,\n lineHeight: 1.75,\n },\n subtitle2: {\n fontFamily: 'body',\n fontSize: '0.875rem',\n fontWeight: 500,\n lineHeight: 1.57,\n },\n caption: {\n fontFamily: 'body',\n fontSize: '0.75rem',\n fontWeight: 400,\n lineHeight: 1.66,\n },\n overline: {\n fontFamily: 'body',\n fontSize: '0.75rem',\n fontWeight: 600,\n lineHeight: 2.5,\n letterSpacing: '0.5px',\n textTransform: 'uppercase' as const,\n },\n button: {\n fontFamily: 'sans',\n fontSize: '0.875rem',\n fontWeight: 600,\n lineHeight: 1.75,\n },\n} as const\n\n// Button size tokens\nexport const buttonSizes = {\n sm: {\n paddingX: '16px',\n paddingY: '6px',\n fontSize: '0.875rem',\n },\n md: {\n paddingX: '20px',\n paddingY: '8px',\n fontSize: '0.875rem',\n },\n lg: {\n paddingX: '24px',\n paddingY: '11px',\n fontSize: '1rem',\n },\n} as const\n\n// Export type for theme mode\nexport type ThemeMode = 'light' | 'dark'\n\n// Helper to get semantic colors based on mode\nexport function getSemanticColors(mode: ThemeMode) {\n return mode === 'dark' ? semanticColorsDark : semanticColorsLight\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { Text } from 'react-native'\nimport { DumbbellIcon } from './icons'\nimport {\n BaseBadge,\n baseBadgeSizeConfig,\n type BaseBadgeSize,\n type BaseBadgeProps,\n} from './BaseBadge'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport type WeightBadgeSize = BaseBadgeSize\n\nexport interface WeightBadgeProps\n extends Omit<BaseBadgeProps, 'variant' | 'icon' | 'children'> {\n value: number\n unit?: 'lbs' | 'kg'\n /**\n * When given, this is an N-rep max (e.g. \"5RM\"). When omitted, it is an\n * estimated 1RM / e1RM.\n */\n reps?: number\n /** Percentage delta from previous mesocycle */\n delta?: number\n isPr?: boolean\n /** Show the weight icon */\n showIcon?: boolean\n size?: WeightBadgeSize\n onPress?: () => void\n className?: string\n}\n\nexport function WeightBadge({\n value,\n unit = 'lbs',\n reps,\n delta,\n isPr,\n showIcon = true,\n size = 'md',\n onPress,\n className,\n ...props\n}: WeightBadgeProps) {\n const config = baseBadgeSizeConfig[size]\n const textColor = isPr ? getSemanticColors('dark')['brand-primary'] : '#9CA3AF'\n // Dumbbell reads clearly as a weight/strength metric and is unit-agnostic\n // across estimated-1RM and N-rep-max contexts (vs. TrendingUp which implies\n // change/trend rather than a load value).\n const iconColor = textColor\n\n const repMaxClause = reps != null ? `${reps} rep max` : 'Estimated one rep max'\n const deltaLabel =\n delta != null ? `, ${delta >= 0 ? '+' : ''}${delta}% change` : ''\n const fullLabel = `${repMaxClause}: ${value} ${unit}${deltaLabel}`\n\n return (\n <BaseBadge\n variant={isPr ? 'pr' : 'plain'}\n size={size}\n onPress={onPress}\n className={className}\n icon={\n showIcon ? (\n <DumbbellIcon size={config.iconSize} color={iconColor} strokeWidth={2} />\n ) : undefined\n }\n accessibilityLabel={fullLabel}\n testID=\"weight-badge\"\n {...props}\n >\n <Text\n style={{\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '600',\n fontSize: config.fontSize,\n color: textColor,\n }}\n >\n {isPr ? '✳ ' : ''}\n {value} {unit}\n </Text>\n {reps != null && (\n <Text\n style={{\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '600',\n fontSize: config.fontSize,\n marginLeft: 2,\n color: textColor,\n opacity: 0.7,\n }}\n testID=\"weight-badge-repmax\"\n >\n {reps}RM\n </Text>\n )}\n {delta != null && (\n <Text\n style={{\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontSize: config.fontSize,\n marginLeft: 4,\n color:\n delta >= 0\n ? getSemanticColors('dark')['result-improve']\n : getSemanticColors('dark')['result-degrade'],\n }}\n testID=\"weight-badge-delta\"\n >\n {delta >= 0 ? '+' : ''}\n {delta}%\n </Text>\n )}\n </BaseBadge>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Animated, Easing, type ViewProps } from 'react-native'\nimport { StarIcon } from './icons'\nimport { BaseBadge } from './BaseBadge'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport type PRType = 'e1rm' | 'weight' | 'reps' | 'volume' | 'velocity'\n\nexport interface PrBadgeProps extends ViewProps {\n /** PR type determines auto-generated label */\n type?: PRType\n /** Display label (e.g., \"PR e1RM\", \"PR 5RM\"). Auto-generated from type if omitted. */\n label?: string\n /** Show only the star icon, no text label */\n compact?: boolean\n /** Trigger pop animation on mount */\n animate?: boolean\n className?: string\n}\n\nconst typeLabels: Record<PRType, string> = {\n e1rm: 'PR e1RM',\n weight: 'PR Weight',\n reps: 'PR Reps',\n volume: 'PR Volume',\n velocity: 'PR Velocity',\n}\n\nexport function PrBadge({\n type = 'e1rm',\n label: labelProp,\n compact = false,\n animate = true,\n className,\n ...props\n}: PrBadgeProps) {\n const resolvedLabel = labelProp ?? typeLabels[type]\n const [scale] = useState(() => new Animated.Value(animate ? 0.8 : 1))\n const [opacity] = useState(() => new Animated.Value(animate ? 0 : 1))\n\n useEffect(() => {\n if (!animate) return\n\n // HTML demo uses a 3-keyframe sequence; bezier approximation is close enough for native\n Animated.parallel([\n Animated.timing(scale, {\n toValue: 1,\n duration: 400,\n easing: Easing.bezier(0.34, 1.56, 0.64, 1),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 400,\n easing: Easing.bezier(0.34, 1.56, 0.64, 1),\n useNativeDriver: true,\n }),\n ]).start()\n }, [animate, scale, opacity])\n\n const badge = compact ? (\n <View\n className={className}\n accessibilityRole=\"image\"\n accessibilityLabel={`Personal record: ${resolvedLabel}`}\n testID=\"pr-badge-star\"\n {...props}\n >\n <StarIcon size={14} color={BRAND_PRIMARY} fill={BRAND_PRIMARY} strokeWidth={2} />\n </View>\n ) : (\n <BaseBadge\n variant=\"pr\"\n className={className}\n accessibilityLabel={`Personal record: ${resolvedLabel}`}\n {...props}\n >\n <Text\n style={{\n fontSize: 12,\n color: BRAND_PRIMARY,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {'\\u2605'} {resolvedLabel}\n </Text>\n </BaseBadge>\n )\n\n if (animate) {\n return (\n <Animated.View\n style={{ transform: [{ scale }], opacity }}\n testID=\"pr-badge-animated\"\n >\n {badge}\n </Animated.View>\n )\n }\n\n return badge\n}\n","/**\n * Neumorphic Shadow Utilities\n * \n * Neumorphism creates soft, extruded UI using dual opposing shadows.\n * - Light source assumed from top-left\n * - Raised elements: dark shadow bottom-right, light highlight top-left\n * - Pressed elements: inverted with `inset` shadows\n */\n\nimport { Platform, type ViewStyle } from 'react-native'\n\n// ============================================================================\n// Color Math Utilities\n// ============================================================================\n\n/**\n * Parse a hex color to RGB values (0-255).\n * Supports both #RGB and #RRGGBB formats.\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const cleaned = hex.replace('#', '')\n \n let r: number, g: number, b: number\n \n if (cleaned.length === 3) {\n r = parseInt(cleaned[0] + cleaned[0], 16)\n g = parseInt(cleaned[1] + cleaned[1], 16)\n b = parseInt(cleaned[2] + cleaned[2], 16)\n } else if (cleaned.length === 6) {\n r = parseInt(cleaned.slice(0, 2), 16)\n g = parseInt(cleaned.slice(2, 4), 16)\n b = parseInt(cleaned.slice(4, 6), 16)\n } else {\n return null\n }\n \n return { r, g, b }\n}\n\n/**\n * Convert RGB (0-255) to HSV (h: 0-360, s: 0-1, v: 0-1).\n */\nexport function rgbToHsv(r: number, g: number, b: number): { h: number; s: number; v: number } {\n const rNorm = r / 255\n const gNorm = g / 255\n const bNorm = b / 255\n \n const max = Math.max(rNorm, gNorm, bNorm)\n const min = Math.min(rNorm, gNorm, bNorm)\n const delta = max - min\n \n // Value\n const v = max\n \n // Saturation\n const s = max === 0 ? 0 : delta / max\n \n // Hue\n let h = 0\n if (delta !== 0) {\n if (max === rNorm) {\n h = 60 * (((gNorm - bNorm) / delta) % 6)\n } else if (max === gNorm) {\n h = 60 * ((bNorm - rNorm) / delta + 2)\n } else {\n h = 60 * ((rNorm - gNorm) / delta + 4)\n }\n }\n if (h < 0) h += 360\n \n return { h, s, v }\n}\n\n/**\n * Convert HSV (h: 0-360, s: 0-1, v: 0-1) to RGB (0-255).\n */\nexport function hsvToRgb(h: number, s: number, v: number): { r: number; g: number; b: number } {\n const c = v * s\n const x = c * (1 - Math.abs((h / 60) % 2 - 1))\n const m = v - c\n \n let rPrime: number, gPrime: number, bPrime: number\n\n if (h >= 0 && h < 60) {\n rPrime = c; gPrime = x; bPrime = 0\n } else if (h >= 60 && h < 120) {\n rPrime = x; gPrime = c; bPrime = 0\n } else if (h >= 120 && h < 180) {\n rPrime = 0; gPrime = c; bPrime = x\n } else if (h >= 180 && h < 240) {\n rPrime = 0; gPrime = x; bPrime = c\n } else if (h >= 240 && h < 300) {\n rPrime = x; gPrime = 0; bPrime = c\n } else {\n rPrime = c; gPrime = 0; bPrime = x\n }\n \n return {\n r: Math.round((rPrime + m) * 255),\n g: Math.round((gPrime + m) * 255),\n b: Math.round((bPrime + m) * 255),\n }\n}\n\n/**\n * Convert RGB values to hex string.\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n const toHex = (n: number) => {\n const clamped = Math.max(0, Math.min(255, Math.round(n)))\n return clamped.toString(16).padStart(2, '0')\n }\n return `#${toHex(r)}${toHex(g)}${toHex(b)}`\n}\n\n/**\n * Lighten a color by increasing its HSV Value component.\n * \n * @param hex - The hex color to lighten\n * @param amount - Amount to increase V by (0-1)\n */\nexport function lighten(hex: string, amount: number = 0.1): string {\n const rgb = hexToRgb(hex)\n if (!rgb) return hex\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const newV = Math.min(1, hsv.v + amount)\n \n const newRgb = hsvToRgb(hsv.h, hsv.s, newV)\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n}\n\n/**\n * Darken a color by decreasing its HSV Value component.\n * \n * @param hex - The hex color to darken\n * @param amount - Amount to decrease V by (0-1)\n */\nexport function darken(hex: string, amount: number = 0.1): string {\n const rgb = hexToRgb(hex)\n if (!rgb) return hex\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const newV = Math.max(0, hsv.v - amount)\n \n const newRgb = hsvToRgb(hsv.h, hsv.s, newV)\n return rgbToHex(newRgb.r, newRgb.g, newRgb.b)\n}\n\n/**\n * Get hover colors for a button based on its background color.\n * Automatically adapts intensity based on the color's luminance.\n * \n * @param bgColor - The button's background color (hex)\n * @param intensity - How strong the hover effect should be ('subtle' | 'medium' | 'strong')\n */\nexport function getHoverColors(\n bgColor: string, \n intensity: 'subtle' | 'medium' | 'strong' = 'medium'\n): { raised: string; pressed: string } {\n const amounts = {\n subtle: 0.01,\n medium: 0.02,\n strong: 0.03,\n }\n \n const amount = amounts[intensity]\n \n return {\n raised: lighten(bgColor, amount), // Raised hover: lighten (lifting up)\n pressed: darken(bgColor, amount), // Pressed hover: darken (pressing down)\n }\n}\n\n/**\n * Check if a color is considered \"dark\" (for choosing text color).\n * Uses HSV Value component for simplicity.\n */\nexport function isDark(hex: string): boolean {\n const rgb = hexToRgb(hex)\n if (!rgb) return true\n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n return hsv.v < 0.6\n}\n\n/**\n * Shadow configuration for different surface colors.\n * Each surface needs calibrated light/dark shadow colors.\n * \n * - dark: soft shadow for depth (bottom-right)\n * - light: sharp rim highlight (top-left) - higher opacity for crisp edge\n * - darker: deeper shadow for pressed/inset states\n */\nexport const shadowColors = {\n // For charcoal surfaces (~#2C2C2C to #3C3C3C)\n charcoal: {\n dark: 'rgba(0, 0, 0, 0.5)',\n light: 'rgba(255, 255, 255, 0.12)', // brighter for crisp rim light\n darker: 'rgba(0, 0, 0, 0.6)',\n },\n // For neutral dark surfaces (~#1F2937)\n neutralDark: {\n dark: 'rgba(0, 0, 0, 0.4)',\n light: 'rgba(255, 255, 255, 0.08)',\n darker: 'rgba(0, 0, 0, 0.5)',\n },\n // For light surfaces (white/light gray backgrounds)\n neutralLight: {\n dark: 'rgba(0, 0, 0, 0.15)', // Visible dark shadow for depth on light backgrounds\n light: 'rgba(255, 255, 255, 1)', // Bright highlight for raised effect (visible on light gray)\n darker: 'rgba(0, 0, 0, 0.2)', // Deeper shadow for pressed states\n },\n}\n\nexport type ShadowIntensity = 'subtle' | 'medium' | 'strong'\nexport type ShadowSurface = keyof typeof shadowColors\n\ninterface ShadowConfig {\n offset: number\n blur: number\n}\n\nconst intensityConfig: Record<ShadowIntensity, ShadowConfig> = {\n subtle: { offset: 1, blur: 2 }, // very light, barely visible\n medium: { offset: 2, blur: 4 }, // noticeable but restrained\n strong: { offset: 2, blur: 5 }, // slightly deeper blur, same offset as medium\n}\n\n/**\n * Creates a raised (elevated) neumorphic shadow.\n * Element appears to float above the surface.\n * \n * Uses a soft dark shadow (bottom-right) and a sharp rim light (top-left).\n */\nexport function createRaisedShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Rim light is sharper: same offset as shadow, but minimal blur for crisp edge\n const rimBlur = 1 // Very tight blur for crisp rim\n \n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n // React Native shadow approximation (limited compared to web)\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a pressed (inset) neumorphic shadow.\n * Element appears pushed into the surface.\n * \n * Uses a soft dark inset shadow (top-left) and a thin sharp rim light (bottom-right).\n */\nexport function createPressedShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Rim light is always thin and subtle for pressed states\n const rimOffset = 1 // Fixed thin rim\n const rimBlur = 1 // Very tight blur for crisp edge\n \n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${colors.darker}, inset -${rimOffset}px -${rimOffset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n // React Native doesn't support inset shadows, approximate with darker bg\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a flat (no shadow) style for hover states.\n */\nexport function createFlatShadow(): ViewStyle {\n return Platform.select({\n web: {\n boxShadow: 'none',\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a hover shadow for raised elements.\n * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.\n */\nexport function createRaisedHoverShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Reduce shadow depth by half for hover, keep minimal rim light\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n const rimBlur = 1\n \n return Platform.select({\n web: {\n // Keep same offsets as normal state for rim to prevent \"shrinking\" effect\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.dark}, -${offset}px -${offset}px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n}\n\n/**\n * Creates a hover shadow for pressed elements.\n * Reduces shadow depth but keeps a subtle rim light to maintain visual boundary.\n */\nexport function createPressedHoverShadow(\n surface: ShadowSurface = 'charcoal',\n intensity: ShadowIntensity = 'medium'\n): ViewStyle {\n const colors = shadowColors[surface]\n const { offset, blur } = intensityConfig[intensity]\n \n // Reduce shadow depth by half for hover, keep minimal rim light\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n const rimBlur = 1\n \n return Platform.select({\n web: {\n // Keep rim offset at 1px (same as pressed normal) to prevent \"shrinking\" effect\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${colors.darker}, inset -1px -1px ${rimBlur}px ${colors.light}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n}\n\n/**\n * Pre-built shadow presets for common use cases.\n */\nexport const neumorphicShadows = {\n // Charcoal surface shadows (for dark toolbars, cards)\n charcoal: {\n raised: {\n subtle: createRaisedShadow('charcoal', 'subtle'),\n medium: createRaisedShadow('charcoal', 'medium'),\n strong: createRaisedShadow('charcoal', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('charcoal', 'subtle'),\n medium: createRaisedHoverShadow('charcoal', 'medium'),\n strong: createRaisedHoverShadow('charcoal', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('charcoal', 'subtle'),\n medium: createPressedShadow('charcoal', 'medium'),\n strong: createPressedShadow('charcoal', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('charcoal', 'subtle'),\n medium: createPressedHoverShadow('charcoal', 'medium'),\n strong: createPressedHoverShadow('charcoal', 'strong'),\n },\n flat: createFlatShadow(),\n },\n // Neutral dark surface shadows\n neutralDark: {\n raised: {\n subtle: createRaisedShadow('neutralDark', 'subtle'),\n medium: createRaisedShadow('neutralDark', 'medium'),\n strong: createRaisedShadow('neutralDark', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('neutralDark', 'subtle'),\n medium: createRaisedHoverShadow('neutralDark', 'medium'),\n strong: createRaisedHoverShadow('neutralDark', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('neutralDark', 'subtle'),\n medium: createPressedShadow('neutralDark', 'medium'),\n strong: createPressedShadow('neutralDark', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('neutralDark', 'subtle'),\n medium: createPressedHoverShadow('neutralDark', 'medium'),\n strong: createPressedHoverShadow('neutralDark', 'strong'),\n },\n flat: createFlatShadow(),\n },\n // Neutral light surface shadows\n neutralLight: {\n raised: {\n subtle: createRaisedShadow('neutralLight', 'subtle'),\n medium: createRaisedShadow('neutralLight', 'medium'),\n strong: createRaisedShadow('neutralLight', 'strong'),\n },\n raisedHover: {\n subtle: createRaisedHoverShadow('neutralLight', 'subtle'),\n medium: createRaisedHoverShadow('neutralLight', 'medium'),\n strong: createRaisedHoverShadow('neutralLight', 'strong'),\n },\n pressed: {\n subtle: createPressedShadow('neutralLight', 'subtle'),\n medium: createPressedShadow('neutralLight', 'medium'),\n strong: createPressedShadow('neutralLight', 'strong'),\n },\n pressedHover: {\n subtle: createPressedHoverShadow('neutralLight', 'subtle'),\n medium: createPressedHoverShadow('neutralLight', 'medium'),\n strong: createPressedHoverShadow('neutralLight', 'strong'),\n },\n flat: createFlatShadow(),\n },\n}\n","/**\n * Color utility functions for the design system\n *\n * lighten/darken are re-exported from shadows.ts which uses HSV-based\n * color math for more perceptually consistent results across hues.\n */\n\nexport { lighten, darken } from '../theme/shadows'\n\nexport type StatusType = 'success' | 'error' | 'warning' | 'info'\nexport type ResultType = 'improve' | 'degrade' | 'inconclusive' | 'neutral'\n\n/**\n * Get the semantic color token for a status type.\n *\n * @param status - The status type\n * @returns The CSS variable reference for the status color\n *\n * @example\n * const color = getStatusColor('success') // 'var(--color-status-success)'\n */\nexport function getStatusColor(status: StatusType): string {\n return `var(--color-status-${status})`\n}\n\n/**\n * Get the semantic color token for a result type.\n *\n * @param result - The result type\n * @returns The CSS variable reference for the result color\n *\n * @example\n * const color = getResultColor('improve') // 'var(--color-result-improve)'\n */\nexport function getResultColor(result: ResultType): string {\n return `var(--color-result-${result})`\n}\n\n/**\n * Apply alpha/opacity to a color.\n * Works with hex colors and rgb values.\n *\n * @param color - The color value (hex or rgb)\n * @param opacity - Opacity value between 0 and 1\n * @returns The color with alpha applied\n *\n * @example\n * alpha('#5048E5', 0.5) // 'rgba(80, 72, 229, 0.5)'\n * alpha('rgb(80, 72, 229)', 0.5) // 'rgba(80, 72, 229, 0.5)'\n */\nexport function alpha(color: string, opacity: number): string {\n // Clamp opacity between 0 and 1\n const clampedOpacity = Math.max(0, Math.min(1, opacity))\n\n // Handle hex colors\n if (color.startsWith('#')) {\n const hex = color.slice(1)\n let r: number, g: number, b: number\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16)\n g = parseInt(hex[1] + hex[1], 16)\n b = parseInt(hex[2] + hex[2], 16)\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16)\n g = parseInt(hex.slice(2, 4), 16)\n b = parseInt(hex.slice(4, 6), 16)\n } else {\n return color\n }\n\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n // Handle rgb colors\n const rgbMatch = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/)\n if (rgbMatch) {\n const [, r, g, b] = rgbMatch\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n // Handle rgba colors - replace the alpha value\n const rgbaMatch = color.match(/rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*[\\d.]+\\)/)\n if (rgbaMatch) {\n const [, r, g, b] = rgbaMatch\n return `rgba(${r}, ${g}, ${b}, ${clampedOpacity})`\n }\n\n return color\n}\n\n/**\n * Determine if a color is light or dark.\n * Useful for determining text color contrast.\n *\n * @param color - Hex color value\n * @returns 'light' or 'dark'\n *\n * @example\n * getLuminance('#FFFFFF') // 'light'\n * getLuminance('#000000') // 'dark'\n */\nexport function getLuminance(color: string): 'light' | 'dark' {\n if (!color.startsWith('#')) return 'dark'\n\n const hex = color.slice(1)\n let r: number, g: number, b: number\n\n if (hex.length === 3) {\n r = parseInt(hex[0] + hex[0], 16)\n g = parseInt(hex[1] + hex[1], 16)\n b = parseInt(hex[2] + hex[2], 16)\n } else if (hex.length === 6) {\n r = parseInt(hex.slice(0, 2), 16)\n g = parseInt(hex.slice(2, 4), 16)\n b = parseInt(hex.slice(4, 6), 16)\n } else {\n return 'dark'\n }\n\n // Calculate relative luminance using sRGB\n const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255\n\n return luminance > 0.5 ? 'light' : 'dark'\n}\n\n/**\n * Get a contrasting text color for a given background.\n *\n * @param backgroundColor - The background color (hex)\n * @returns 'white' or 'black' for contrast\n *\n * @example\n * getContrastText('#5048E5') // 'white'\n * getContrastText('#FFFFFF') // 'black'\n */\nexport function getContrastText(backgroundColor: string): string {\n return getLuminance(backgroundColor) === 'light' ? '#000000' : '#FFFFFF'\n}\n\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { alpha } from '../../../utils/colors'\n\nconst t = getSemanticColors('dark')\n\n/**\n * Titan-local phase key. Consumers map their own movement-phase enum onto this\n * presentational key at the call site — TempoBar owns rendering only.\n */\nexport type TempoPhaseKey = 'concentric' | 'hold' | 'eccentric'\n\n/** Pacing tuning shared with the fill/pacing helpers below. */\nexport const TEMPO_PACING = {\n behindThresholdPct: 0.15,\n minPhaseDurationMs: 500,\n} as const\n\nexport type TempoPacingState = 'none' | 'on-pace' | 'behind'\n\n/**\n * Classify how a phase's elapsed time tracks against its target duration.\n * `none` when there is no meaningful target; `behind` once elapsed exceeds the\n * target by more than the behind threshold; `on-pace` otherwise.\n */\nexport function getTempoPacingState(\n elapsedMs: number,\n targetMs: number | null,\n): TempoPacingState {\n if (!targetMs || targetMs < TEMPO_PACING.minPhaseDurationMs) return 'none'\n const ratio = elapsedMs / targetMs\n if (ratio > 1 + TEMPO_PACING.behindThresholdPct) return 'behind'\n return 'on-pace'\n}\n\n/** Fill percentage (0–100) for the active phase; full when no target is set. */\nexport function getTempoFillPct(elapsedMs: number, targetMs: number | null): number {\n if (!targetMs) return 100\n return Math.min(100, (elapsedMs / targetMs) * 100)\n}\n\ninterface PhaseConfig {\n label: string\n color: string\n flex: number\n}\n\nconst PHASE_ORDER: TempoPhaseKey[] = ['concentric', 'hold', 'eccentric']\n\nconst PHASE_CONFIG: Record<TempoPhaseKey, PhaseConfig> = {\n concentric: { label: 'Con', color: t['status-success'], flex: 2 },\n hold: { label: 'Hold', color: t['brand-primary'], flex: 1 },\n eccentric: { label: 'Ecc', color: t['status-warning'], flex: 3 },\n}\n\nexport interface TempoBarProps extends ViewProps {\n /** Phase currently in progress, or null when idle/at rest. */\n activePhase: TempoPhaseKey | null\n /** Elapsed time (ms) within the active phase. */\n phaseElapsedMs: number\n /** Completed phase durations (ms) for the current rep, keyed by phase. */\n completed?: Partial<Record<TempoPhaseKey, number>>\n /** Optional per-phase target durations (seconds) for pacing feedback. */\n target?: Partial<Record<TempoPhaseKey, number>>\n className?: string\n}\n\n/**\n * TempoBar — live rep phase progression indicator.\n *\n * Renders a segmented bar (Con → Hold → Ecc) where the active phase fills in\n * real time and completed phases show their duration with a ✓/✗ pacing mark.\n * Presentational only: the consumer derives which phase is active, its elapsed\n * time, and completed durations, then feeds them in.\n */\nexport function TempoBar({\n activePhase,\n phaseElapsedMs,\n completed,\n target,\n className,\n ...props\n}: TempoBarProps) {\n return (\n <View className={className} testID=\"tempo-bar\" {...props}>\n {/* Phase labels */}\n <View style={{ flexDirection: 'row', marginBottom: 4 }}>\n {PHASE_ORDER.map((phase) => {\n const config = PHASE_CONFIG[phase]\n return (\n <View key={phase} style={{ flex: config.flex, alignItems: 'center' }}>\n <Text style={{ fontSize: 10, color: t['text-disabled'] }}>{config.label}</Text>\n </View>\n )\n })}\n </View>\n\n {/* Segmented bar */}\n <View style={{ flexDirection: 'row', gap: 2, height: 20 }}>\n {PHASE_ORDER.map((phase) => {\n const config = PHASE_CONFIG[phase]\n const isActive = activePhase === phase\n const completedMs = completed?.[phase]\n const targetSec = target?.[phase]\n const targetMs = targetSec != null ? targetSec * 1000 : null\n\n return (\n <View\n key={phase}\n style={{\n flex: config.flex,\n backgroundColor: alpha('#ffffff', 0.06),\n borderRadius: 4,\n overflow: 'hidden',\n }}\n >\n {isActive ? (\n <ActiveSegment\n config={config}\n phaseElapsedMs={phaseElapsedMs}\n targetMs={targetMs}\n />\n ) : completedMs != null ? (\n <CompletedSegment config={config} completedMs={completedMs} targetMs={targetMs} />\n ) : null}\n </View>\n )\n })}\n </View>\n </View>\n )\n}\n\nfunction ActiveSegment({\n config,\n phaseElapsedMs,\n targetMs,\n}: {\n config: PhaseConfig\n phaseElapsedMs: number\n targetMs: number | null\n}) {\n const pacing = getTempoPacingState(phaseElapsedMs, targetMs)\n const barColor = pacing === 'behind' ? t['status-error'] : config.color\n const fillPct = getTempoFillPct(phaseElapsedMs, targetMs)\n\n const label = targetMs\n ? `${formatDuration(phaseElapsedMs)} / ${formatDuration(targetMs)}`\n : formatDuration(phaseElapsedMs)\n\n return (\n <View style={{ height: '100%', position: 'relative' }} testID={`tempo-segment-active-${config.label}`}>\n <View\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${fillPct}%`,\n backgroundColor: alpha(barColor, 0.3),\n borderRadius: 4,\n }}\n />\n <View\n style={{\n height: '100%',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Text style={{ fontSize: 12, fontWeight: '700', color: barColor }}>{label}</Text>\n </View>\n </View>\n )\n}\n\nfunction CompletedSegment({\n config,\n completedMs,\n targetMs,\n}: {\n config: PhaseConfig\n completedMs: number\n targetMs: number | null\n}) {\n const pacing = getTempoPacingState(completedMs, targetMs)\n const hitTarget = pacing !== 'behind'\n const indicator =\n targetMs && targetMs >= TEMPO_PACING.minPhaseDurationMs ? (hitTarget ? ' ✓' : ' ✗') : ''\n\n return (\n <View\n style={{\n height: '100%',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: alpha(config.color, 0.15),\n }}\n testID={`tempo-segment-completed-${config.label}`}\n >\n <Text style={{ fontSize: 12, fontWeight: '500', color: alpha(config.color, 0.7) }}>\n {formatDuration(completedMs)}\n {indicator}\n </Text>\n </View>\n )\n}\n\nfunction formatDuration(ms: number): string {\n const s = ms / 1000\n return s < 10 ? s.toFixed(1) : Math.round(s).toString()\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState, useCallback } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { roundTempo } from '../../../utils/workout-format'\nimport { alpha } from '../../../utils/colors'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { getTempoFillPct, getTempoPacingState } from './TempoBar'\n\nconst t = getSemanticColors('dark')\n\n/** The four tempo phases, in the order the display renders them. */\nexport type TempoLivePhase = 'eccentric' | 'pauseBottom' | 'concentric' | 'pauseTop'\n\n/**\n * Live rep state driving the phase-fill overlay. Controlled by the consumer\n * (matching titan's `elapsedMs`-in convention) so the same real timer feeds\n * both web dashboard and native app — TempoDisplay owns rendering only.\n */\nexport interface TempoLiveState {\n /** Phase currently in progress, or null when idle/at rest. */\n activePhase: TempoLivePhase | null\n /** Elapsed time (ms) within the active phase. */\n phaseElapsedMs: number\n}\n\nexport interface TempoDisplayProps extends ViewProps {\n /** Tempo values: [eccentric, pauseBottom, concentric, pauseTop] in seconds */\n tempo: [number, number, number, number]\n size?: 'sm' | 'md'\n /** Colored phases or mono (all gray) */\n colored?: boolean\n /** Show info tooltip on press */\n showInfo?: boolean\n /**\n * When set, renders a live phase-fill: the active phase digit fills against\n * its prescribed duration and inactive phases dim. Omit for the static\n * prescription string (default, backward compatible).\n */\n live?: TempoLiveState\n onPress?: () => void\n className?: string\n}\n\nconst INTER = 'Inter, sans-serif'\nconst TEXT_TERTIARY = '#6B7280'\nconst STATUS_ERROR = t['status-error'] // shown when a phase runs behind pace\n\n// Phase colors: [eccentric, pauseBottom, concentric, pauseTop]\nconst phaseColors = {\n eccentric: t['status-warning'],\n pauseBottom: TEXT_TERTIARY,\n concentric: t['status-success'],\n pauseTop: TEXT_TERTIARY,\n dash: TEXT_TERTIARY,\n}\n\nfunction TempoValue({\n value,\n color,\n fontSize,\n}: {\n value: number\n color: string\n fontSize: number\n}) {\n return (\n <Text\n style={{\n fontFamily: INTER,\n fontSize,\n color,\n fontWeight: '600',\n letterSpacing: 1,\n }}\n >\n {value}\n </Text>\n )\n}\n\nfunction TempoSeparator({ color, fontSize }: { color: string; fontSize: number }) {\n return (\n <Text\n style={{\n fontFamily: INTER,\n fontSize,\n color,\n fontWeight: '600',\n letterSpacing: 1,\n }}\n >\n -\n </Text>\n )\n}\n\n// Phase order + color matching the tempo tuple, for the live phase-fill row.\nconst LIVE_PHASES: { key: TempoLivePhase; color: string }[] = [\n { key: 'eccentric', color: phaseColors.eccentric },\n { key: 'pauseBottom', color: phaseColors.pauseBottom },\n { key: 'concentric', color: phaseColors.concentric },\n { key: 'pauseTop', color: phaseColors.pauseTop },\n]\n\nfunction LiveTempoCell({\n value,\n color,\n isActive,\n phaseElapsedMs,\n fontSize,\n}: {\n value: number\n color: string\n isActive: boolean\n phaseElapsedMs: number\n fontSize: number\n}) {\n if (!isActive) {\n return <TempoValue value={value} color={alpha(color, 0.35)} fontSize={fontSize} />\n }\n const targetMs = value > 0 ? value * 1000 : null\n const barColor = getTempoPacingState(phaseElapsedMs, targetMs) === 'behind' ? STATUS_ERROR : color\n const fillPct = getTempoFillPct(phaseElapsedMs, targetMs)\n return (\n <View style={{ position: 'relative' }} testID=\"tempo-live-active\">\n <View\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${fillPct}%`,\n backgroundColor: alpha(barColor, 0.3),\n borderRadius: 2,\n }}\n />\n <TempoValue value={value} color={barColor} fontSize={fontSize} />\n </View>\n )\n}\n\nfunction LiveTempoRow({\n values,\n live,\n fontSize,\n}: {\n values: [number, number, number, number]\n live: TempoLiveState\n fontSize: number\n}) {\n return (\n <>\n {LIVE_PHASES.map((phase, i) => (\n <View key={phase.key} style={{ flexDirection: 'row' }}>\n {i > 0 && <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />}\n <LiveTempoCell\n value={values[i]}\n color={phase.color}\n isActive={live.activePhase === phase.key}\n phaseElapsedMs={live.phaseElapsedMs}\n fontSize={fontSize}\n />\n </View>\n ))}\n </>\n )\n}\n\nexport function TempoDisplay({\n tempo,\n size = 'md',\n colored = true,\n showInfo = true,\n live,\n onPress,\n className,\n ...props\n}: TempoDisplayProps) {\n const [showTooltip, setShowTooltip] = useState(false)\n // Round exact (unrounded) tempo seconds to the 1-dp display granularity.\n const [eccentric, pauseBottom, concentric, pauseTop] = roundTempo(tempo)\n const isSm = size === 'sm'\n const fontSize = isSm ? 9 : 11\n const monoColor = TEXT_TERTIARY\n\n const handlePress = useCallback(() => {\n if (onPress) {\n onPress()\n }\n if (showInfo) {\n setShowTooltip((prev) => !prev)\n }\n }, [onPress, showInfo])\n\n const content = (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n backgroundColor: '#1C1C1C',\n paddingHorizontal: isSm ? 6 : 8,\n paddingVertical: 3,\n borderRadius: 4,\n }}\n {...props}\n >\n <Text\n style={{\n fontFamily: INTER,\n fontSize: 9,\n fontWeight: '500',\n color: TEXT_TERTIARY,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n marginRight: 6,\n }}\n >\n TEMPO\n </Text>\n <View style={{ flexDirection: 'row' }} testID=\"tempo-value\">\n {live ? (\n <LiveTempoRow\n values={[eccentric, pauseBottom, concentric, pauseTop]}\n live={live}\n fontSize={fontSize}\n />\n ) : colored ? (\n <>\n <TempoValue value={eccentric} color={phaseColors.eccentric} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={pauseBottom} color={phaseColors.pauseBottom} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={concentric} color={phaseColors.concentric} fontSize={fontSize} />\n <TempoSeparator color={phaseColors.dash} fontSize={fontSize} />\n <TempoValue value={pauseTop} color={phaseColors.pauseTop} fontSize={fontSize} />\n </>\n ) : (\n <Text\n style={{\n fontFamily: INTER,\n fontSize,\n color: monoColor,\n fontWeight: '600',\n letterSpacing: 1,\n }}\n >\n {eccentric}-{pauseBottom}-{concentric}-{pauseTop}\n </Text>\n )}\n </View>\n </View>\n )\n\n return (\n <Pressable\n accessibilityLabel={`Tempo: ${eccentric} second eccentric, ${pauseBottom} second pause, ${concentric} second concentric, ${pauseTop} second pause`}\n accessibilityRole=\"button\"\n onPress={handlePress}\n testID=\"tempo-display\"\n >\n {content}\n {showTooltip && (\n <View\n style={{\n position: 'absolute',\n bottom: '100%',\n left: '50%',\n transform: [{ translateX: '-50%' as unknown as number }],\n marginBottom: 8,\n zIndex: 20,\n alignItems: 'center',\n }}\n testID=\"tempo-tooltip\"\n >\n <View\n style={{\n backgroundColor: '#191919',\n borderRadius: 6,\n paddingVertical: 8,\n paddingHorizontal: 12,\n borderWidth: 1,\n borderColor: '#2C2C2C',\n }}\n >\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Eccentric: {eccentric}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Pause (bottom): {pauseBottom}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Concentric: {concentric}s\n </Text>\n <Text style={{ fontSize: 10, lineHeight: 16, color: '#9CA3AF', fontFamily: INTER }}>\n Pause (top): {pauseTop}s\n </Text>\n </View>\n <View\n style={{\n width: 0,\n height: 0,\n borderLeftWidth: 5,\n borderRightWidth: 5,\n borderTopWidth: 5,\n borderLeftColor: 'transparent',\n borderRightColor: 'transparent',\n borderTopColor: '#2C2C2C',\n }}\n />\n </View>\n )}\n </Pressable>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text } from 'react-native'\nimport { VelocityStrip, type VelocityZoneBandProp } from './VelocityStrip'\nimport { PrBadge, type PRType } from './PrBadge'\nimport { roundRpe, rpeColor, roundWeight } from '../../../utils/workout-format'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nexport type SetRowMode = 'active' | 'completed' | 'history'\n\nexport interface SetRowProps {\n mode: SetRowMode\n setNumber: number\n previous?: { reps: number; weight: number } | null\n reps: number | null\n weight: number | null\n rpe?: number | null\n unit: 'lbs' | 'kg'\n /** Per-rep MEAN concentric velocities (m/s). */\n velocities?: number[]\n /** Optional velocity-zone bands (WA `VelocityZones.bands`); default scale when absent. */\n velocityZones?: readonly VelocityZoneBandProp[]\n /** Live mode: index of the newest rep bar to animate (pop / new-peak bounce). */\n velocityLiveRepIndex?: number\n velocityExpanded?: boolean\n onVelocityToggle?: () => void\n setType?: string\n prBadges?: Array<{ type: PRType; label: string }>\n isNextSet?: boolean\n targets?: { reps: number; weight: number }\n}\n\nfunction formatAccessibilityLabel(\n setNumber: number,\n reps: number | null,\n weight: number | null,\n unit: string,\n): string {\n const repsText = reps != null ? `${reps} reps` : 'no reps'\n const weightText = weight != null ? `at ${roundWeight(weight)} ${unit}` : ''\n return `Set ${setNumber}: ${repsText}${weightText ? ` ${weightText}` : ''}`\n}\n\nexport function SetRow({\n mode,\n setNumber,\n previous,\n reps,\n weight,\n rpe,\n unit,\n velocities,\n velocityZones,\n velocityLiveRepIndex,\n velocityExpanded,\n onVelocityToggle,\n setType,\n prBadges,\n isNextSet,\n targets,\n}: SetRowProps) {\n const isActive = mode === 'active'\n const isCompleted = mode === 'completed'\n\n const rowStyle: Record<string, unknown> = {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n padding: 7,\n paddingHorizontal: 8,\n gap: 8,\n borderRadius: 8,\n }\n\n if (isActive && isNextSet) {\n rowStyle.backgroundColor = 'rgba(255,121,0,0.06)'\n rowStyle.borderWidth = 1\n rowStyle.borderColor = 'rgba(255,121,0,0.15)'\n }\n\n if (isCompleted && !isNextSet) {\n rowStyle.opacity = 0.55\n }\n\n return (\n <View\n style={rowStyle}\n accessibilityLabel={formatAccessibilityLabel(\n setNumber,\n reps,\n weight,\n unit,\n )}\n testID=\"set-row\"\n >\n <View\n style={{ width: 36, alignItems: 'center', justifyContent: 'center' }}\n testID=\"set-row-set-number\"\n >\n {setType ? (\n <Text\n style={{\n fontSize: 10,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: WORKOUT_TOKENS.scale.orange,\n backgroundColor: 'rgba(255,165,2,0.12)',\n paddingVertical: 1,\n paddingHorizontal: 5,\n borderRadius: 3,\n overflow: 'hidden',\n }}\n testID=\"set-row-type-badge\"\n >\n {setType}\n </Text>\n ) : (\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 13,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {setNumber}\n </Text>\n )}\n </View>\n\n <View\n className=\"flex-1\"\n testID=\"set-row-previous\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {previous\n ? `${previous.reps} x ${roundWeight(previous.weight)}`\n : '\\u2014'}\n </Text>\n </View>\n\n <View\n style={{ width: 44, alignItems: 'center', justifyContent: 'center' }}\n testID=\"set-row-reps\"\n >\n {isActive && reps == null && targets ? (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 13,\n fontStyle: 'italic',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"set-row-target-reps\"\n >\n {targets.reps}\n </Text>\n ) : (\n <Text\n className={reps != null ? 'text-text-primary' : 'text-text-tertiary'}\n style={{\n fontSize: 14,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {reps != null ? reps : '\\u2014'}\n </Text>\n )}\n </View>\n\n <View\n style={{ width: 56, alignItems: 'center', justifyContent: 'center' }}\n testID=\"set-row-weight\"\n >\n {isActive && weight == null && targets ? (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 13,\n fontStyle: 'italic',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"set-row-target-weight\"\n >\n {roundWeight(targets.weight)}\n </Text>\n ) : (\n <Text\n className={weight != null ? 'text-text-primary' : 'text-text-tertiary'}\n style={{\n fontSize: 14,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {weight != null ? roundWeight(weight) : '\\u2014'}\n </Text>\n )}\n </View>\n\n <View\n style={{ width: 36, alignItems: 'center', justifyContent: 'center' }}\n testID=\"set-row-rpe\"\n >\n <Text\n className={rpe != null ? undefined : 'text-text-tertiary'}\n style={{\n fontSize: 13,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n // rpeColor returns a concrete hex (native-safe); only the tertiary\n // fallback needs the className token.\n color: rpe != null ? rpeColor(rpe) : undefined,\n }}\n >\n {rpe != null ? roundRpe(rpe) : '\\u2014'}\n </Text>\n </View>\n\n {prBadges && prBadges.length > 0 && (\n <View\n className=\"flex-row items-center\"\n style={{ gap: 4 }}\n testID=\"set-row-pr-badges\"\n >\n {prBadges.map((badge, i) => (\n <PrBadge\n key={i}\n type={badge.type}\n label={badge.label}\n animate={false}\n compact\n />\n ))}\n </View>\n )}\n\n {velocities && velocities.length > 0 && (\n <View\n style={{ position: 'absolute', bottom: 0, left: 8, right: 8 }}\n testID=\"set-row-velocity-strip\"\n >\n <VelocityStrip\n velocities={velocities}\n zones={velocityZones}\n liveRepIndex={velocityLiveRepIndex}\n expanded={velocityExpanded}\n onToggle={onVelocityToggle}\n variant={onVelocityToggle ? 'full' : 'mini'}\n />\n </View>\n )}\n </View>\n )\n}\n","import { Platform } from 'react-native'\nimport { getSemanticColors, type ThemeMode } from './tokens/semantic'\n\ntype ColorToken = keyof ReturnType<typeof getSemanticColors>\n\n/**\n * Resolve a semantic color token for an inline style where a nativewind\n * className can't apply — gradients (`backgroundImage`), per-edge borders\n * (`borderTopColor`, …), SVG attributes, and conditional hex/token mixes.\n *\n * The companion to className color tokens: on **web** it returns the CSS\n * variable (`var(--color-…)`), so the dashboard's light/dark switching keeps\n * working exactly as `global.css` intends; on **native** it returns the\n * resolved hex from `getSemanticColors` (mobile is dark-only). This is why\n * these spots stay theme-correct on web while also rendering on-device.\n */\nexport function resolveColor(token: ColorToken, mode: ThemeMode = 'dark'): string {\n return Platform.OS === 'web' ? `var(--color-${token})` : getSemanticColors(mode)[token]\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState } from 'react'\nimport { View, Text, Pressable } from 'react-native'\nimport { VelocityStrip, type VelocityZoneBandProp } from './VelocityStrip'\nimport { PlaceholderStrip } from './PlaceholderStrip'\nimport { WeightBadge } from './WeightBadge'\nimport { PrBadge } from './PrBadge'\nimport { TempoDisplay } from './TempoDisplay'\nimport { SetRow, type SetRowProps } from './SetRow'\nimport { roundWeight } from '../../../utils/workout-format'\nimport { resolveColor } from '../../../theme/resolve-color'\n\nexport type ExerciseCardState = 'collapsed' | 'expanded' | 'upcoming'\n\nexport interface ExerciseCardProps {\n name: string\n state: ExerciseCardState\n onToggle: () => void\n onNavigateDetail?: () => void\n summary?: {\n sets: number\n reps: number | string\n weight: number\n unit: 'lbs' | 'kg'\n }\n e1rm?: { value: number; unit: 'lbs' | 'kg' }\n isPR?: boolean\n setVelocities?: number[][]\n /** Optional velocity-zone bands shared across this exercise's sets (WA bands). */\n velocityZones?: readonly VelocityZoneBandProp[]\n totalPlannedSets?: number\n sets?: SetRowProps[]\n tempo?: [number, number, number, number]\n prescription?: string\n previousBest?: string\n supersetPosition?: 'first' | 'last' | 'middle' | null\n supersetColor?: string\n}\n\n/** Column headers; the weight column reflects the card's unit (LBS / KG). */\nfunction buildColumnHeaders(unit: 'lbs' | 'kg'): string[] {\n return ['SET', 'PREV', 'REPS', unit.toUpperCase(), 'RPE']\n}\n\nfunction getSupersetBorderRadius(\n position: ExerciseCardProps['supersetPosition'],\n): Record<string, number> {\n switch (position) {\n case 'first':\n return {\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }\n case 'last':\n return {\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n }\n case 'middle':\n return {\n borderTopLeftRadius: 8,\n borderTopRightRadius: 8,\n borderBottomLeftRadius: 8,\n borderBottomRightRadius: 8,\n }\n default:\n return {\n borderTopLeftRadius: 12,\n borderTopRightRadius: 12,\n borderBottomLeftRadius: 12,\n borderBottomRightRadius: 12,\n }\n }\n}\n\nfunction getSupersetMargin(\n position: ExerciseCardProps['supersetPosition'],\n): Record<string, number> {\n if (position === 'first' || position === 'middle') {\n return { marginBottom: 2 }\n }\n return {}\n}\n\nfunction formatSummary(summary: ExerciseCardProps['summary']): string {\n if (!summary) return ''\n return `${summary.sets}\\u00D7${summary.reps} @ ${roundWeight(summary.weight)} ${summary.unit}`\n}\n\nfunction formatAccessibilityLabel(\n name: string,\n summary: ExerciseCardProps['summary'],\n prescription: ExerciseCardProps['prescription'],\n): string {\n if (summary) return `${name}, ${formatSummary(summary)}`\n if (prescription) return `${name}, ${prescription}`\n return name\n}\n\nfunction CollapsedCard({\n name,\n onToggle,\n summary,\n e1rm,\n isPR,\n setVelocities,\n velocityZones,\n totalPlannedSets,\n supersetPosition,\n}: ExerciseCardProps) {\n const [pressed, setPressed] = useState(false)\n const completedSets = setVelocities?.length ?? 0\n const remaining = Math.max(0, (totalPlannedSets ?? 0) - completedSets)\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n\n return (\n <Pressable\n onPress={onToggle}\n onPressIn={() => setPressed(true)}\n onPressOut={() => setPressed(false)}\n accessibilityRole=\"button\"\n accessibilityLabel={formatAccessibilityLabel(name, summary, undefined)}\n testID=\"exercise-card\"\n >\n <View\n className={pressed ? 'bg-surface-raised' : undefined}\n style={{\n padding: 12,\n paddingHorizontal: 14,\n cursor: 'pointer',\n ...borderRadius,\n ...supersetMargin,\n }}\n >\n <View\n className=\"flex-row items-center\"\n testID=\"exercise-card-header\"\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n {summary && (\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginRight: 8,\n }}\n testID=\"exercise-card-summary\"\n >\n {formatSummary(summary)}\n </Text>\n )}\n {e1rm && (\n <WeightBadge\n value={roundWeight(e1rm.value)}\n unit={e1rm.unit}\n size=\"sm\"\n showIcon={false}\n testID=\"exercise-card-e1rm\"\n />\n )}\n {isPR && (\n <View style={{ marginLeft: 4 }}>\n <PrBadge type=\"e1rm\" compact animate={false} />\n </View>\n )}\n </View>\n\n {(completedSets > 0 || remaining > 0) && (\n <View\n className=\"flex-row\"\n style={{ marginTop: 6, gap: 4 }}\n testID=\"exercise-card-strips\"\n >\n {setVelocities?.map((velocities, i) => (\n <VelocityStrip\n key={i}\n velocities={velocities}\n zones={velocityZones}\n variant=\"mini\"\n testID={`exercise-card-velocity-strip-${i}`}\n />\n ))}\n {Array.from({ length: remaining }, (_, i) => (\n <PlaceholderStrip\n key={`placeholder-${i}`}\n testID={`exercise-card-placeholder-${i}`}\n />\n ))}\n </View>\n )}\n </View>\n </Pressable>\n )\n}\n\nfunction ExpandedCard({\n name,\n onToggle,\n summary,\n e1rm,\n isPR,\n sets,\n tempo,\n supersetPosition,\n}: ExerciseCardProps) {\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n // Summary is the card-level authority for the weight column; fall back to the\n // first set's unit, then lbs. (Mixed per-set units keep the card-level label.)\n const unit = summary?.unit ?? sets?.[0]?.unit ?? 'lbs'\n const columnHeaders = buildColumnHeaders(unit)\n\n return (\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n ...borderRadius,\n ...supersetMargin,\n }}\n testID=\"exercise-card\"\n >\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={formatAccessibilityLabel(name, summary, undefined)}\n aria-expanded={true}\n testID=\"exercise-card-header\"\n >\n <View\n className=\"flex-row items-center\"\n style={{\n padding: 12,\n paddingHorizontal: 14,\n paddingBottom: 10,\n borderBottomWidth: 1,\n borderBottomColor: resolveColor('border-default'),\n }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n {summary && (\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginRight: 8,\n }}\n testID=\"exercise-card-summary\"\n >\n {formatSummary(summary)}\n </Text>\n )}\n {e1rm && (\n <WeightBadge\n value={roundWeight(e1rm.value)}\n unit={e1rm.unit}\n size=\"sm\"\n showIcon={false}\n testID=\"exercise-card-e1rm\"\n />\n )}\n {isPR && (\n <View style={{ marginLeft: 4 }}>\n <PrBadge type=\"e1rm\" compact animate={false} />\n </View>\n )}\n </View>\n </Pressable>\n\n {tempo && (\n <View style={{ marginTop: 8, paddingHorizontal: 14 }} testID=\"exercise-card-tempo\">\n <TempoDisplay tempo={tempo} size=\"sm\" />\n </View>\n )}\n\n <View\n className=\"flex-row\"\n style={{\n paddingVertical: 8,\n paddingHorizontal: 8,\n paddingBottom: 4,\n }}\n testID=\"exercise-card-column-headers\"\n >\n {columnHeaders.map((header, i) => {\n const widths = [36, undefined, 44, 56, 36]\n const width = widths[i]\n const isFlex = width === undefined\n\n return (\n <View\n key={header}\n style={{\n ...(isFlex ? {} : { width }),\n alignItems: 'center',\n justifyContent: 'center',\n gap: 8,\n }}\n {...(isFlex ? { className: 'flex-1' } : {})}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontWeight: '600',\n fontFamily: 'Inter, sans-serif',\n textTransform: 'uppercase',\n letterSpacing: 0.8,\n }}\n >\n {header}\n </Text>\n </View>\n )\n })}\n </View>\n\n {sets && (\n <View testID=\"exercise-card-sets\">\n {sets.map((setProps, i) => (\n <SetRow key={i} {...setProps} />\n ))}\n </View>\n )}\n </View>\n )\n}\n\nfunction UpcomingCard({\n name,\n prescription,\n previousBest,\n supersetPosition,\n}: ExerciseCardProps) {\n const borderRadius = getSupersetBorderRadius(supersetPosition)\n const supersetMargin = getSupersetMargin(supersetPosition)\n\n return (\n <View\n style={{\n opacity: 0.6,\n padding: 12,\n paddingHorizontal: 14,\n ...borderRadius,\n ...supersetMargin,\n }}\n accessibilityLabel={formatAccessibilityLabel(name, undefined, prescription)}\n testID=\"exercise-card\"\n >\n <View className=\"flex-row items-center\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 14,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-card-name\"\n >\n {name}\n </Text>\n {prescription && (\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n marginLeft: 8,\n }}\n testID=\"exercise-card-prescription\"\n >\n {prescription}\n </Text>\n )}\n <View className=\"flex-1\" />\n {previousBest && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"exercise-card-previous-best\"\n >\n {previousBest}\n </Text>\n )}\n </View>\n </View>\n )\n}\n\nexport function ExerciseCard(props: ExerciseCardProps) {\n switch (props.state) {\n case 'collapsed':\n return <CollapsedCard {...props} />\n case 'expanded':\n return <ExpandedCard {...props} />\n case 'upcoming':\n return <UpcomingCard {...props} />\n }\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport React from 'react'\nimport { View, Text, Pressable, TextInput } from 'react-native'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface InputBarProps {\n exerciseName: string\n setNumber: number\n totalSets: number | null\n reps: string\n weight: string\n unit: 'lbs' | 'kg'\n onRepsChange: (value: string) => void\n onWeightChange: (value: string) => void\n onRecord: () => void\n canRecord: boolean\n visible: boolean\n}\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\nconst INPUT_CLASSNAME = 'bg-surface-raised border-border-strong text-text-primary'\n\nconst inputStyle = {\n fontSize: 14,\n fontWeight: '600' as const,\n fontFamily: 'Inter, sans-serif',\n borderWidth: 1,\n borderRadius: 6,\n textAlign: 'center' as const,\n paddingVertical: 5,\n paddingHorizontal: 2,\n}\n\nexport function InputBar({\n exerciseName,\n setNumber,\n totalSets,\n reps,\n weight,\n unit,\n onRepsChange,\n onWeightChange,\n onRecord,\n canRecord,\n visible,\n}: InputBarProps) {\n if (!visible) return null\n\n const setLabel = totalSets != null ? `Set ${setNumber}/${totalSets}` : `Set ${setNumber}`\n\n return (\n <View\n className=\"bg-surface-elevated\"\n style={{\n width: '100%',\n borderTopWidth: 1,\n borderTopColor: resolveColor('border-default'),\n paddingTop: 10,\n paddingHorizontal: 16,\n paddingBottom: 12,\n flexDirection: 'row',\n alignItems: 'center',\n gap: 10,\n }}\n accessibilityRole=\"toolbar\"\n testID=\"input-bar\"\n >\n <View style={{ minWidth: 80, flexDirection: 'column' }}>\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 12,\n fontWeight: '700',\n fontFamily: '\"Space Grotesk\", sans-serif',\n }}\n testID=\"input-bar-exercise-name\"\n numberOfLines={1}\n >\n {exerciseName}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"input-bar-set-info\"\n >\n {setLabel}\n </Text>\n </View>\n\n <View className=\"flex-1 flex-row items-center\" style={{ gap: 4 }}>\n <TextInput\n value={reps}\n onChangeText={onRepsChange}\n className={INPUT_CLASSNAME}\n style={{ ...inputStyle, width: 36 }}\n accessibilityLabel=\"Reps\"\n testID=\"input-bar-reps\"\n keyboardType=\"numeric\"\n />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {'\\u00D7'}\n </Text>\n <TextInput\n value={weight}\n onChangeText={onWeightChange}\n className={INPUT_CLASSNAME}\n style={{ ...inputStyle, width: 52 }}\n accessibilityLabel={`Weight in ${unit}`}\n testID=\"input-bar-weight\"\n keyboardType=\"numeric\"\n />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 12,\n fontWeight: '500',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"input-bar-unit\"\n >\n {unit}\n </Text>\n </View>\n\n <Pressable\n onPress={onRecord}\n disabled={!canRecord}\n style={({ pressed }) => ({\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 16,\n opacity: !canRecord ? 0.4 : pressed ? 0.8 : 1,\n })}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Record set\"\n testID=\"input-bar-record\"\n >\n <Text\n style={{\n fontSize: 13,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: '#FFFFFF',\n }}\n >\n Record\n </Text>\n </Pressable>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable } from 'react-native'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport interface RestTimerProps {\n totalSeconds: number\n elapsedMs: number\n onSkip: () => void\n onAddTime: () => void\n nextSetInfo?: string\n visible: boolean\n /** Passive/poll-only mode: hides the Skip and +30s controls, keeps the countdown, progress bar, and next-set line. */\n displayOnly?: boolean\n}\n\nexport function RestTimer({\n totalSeconds,\n elapsedMs,\n onSkip,\n onAddTime,\n nextSetInfo,\n visible,\n displayOnly = false,\n}: RestTimerProps) {\n if (!visible) return null\n\n const remainingMs = Math.max(0, totalSeconds * 1000 - elapsedMs)\n const remainingSec = Math.ceil(remainingMs / 1000)\n const minutes = Math.floor(remainingSec / 60)\n const seconds = remainingSec % 60\n const timeDisplay = `${minutes}:${String(seconds).padStart(2, '0')}`\n // A zero-duration timer is already complete; guard the 0 / 0 === NaN case\n // that would otherwise emit width:'NaN%'.\n const totalMs = totalSeconds * 1000\n const progressPct = totalMs > 0 ? Math.min(100, (elapsedMs / totalMs) * 100) : 100\n\n return (\n <View\n className=\"bg-surface-raised\"\n style={{\n width: '100%',\n borderTopWidth: 1,\n borderTopColor: resolveColor('border-default'),\n paddingVertical: 12,\n paddingHorizontal: 16,\n }}\n accessibilityRole=\"timer\"\n accessibilityLabel={`Rest timer, ${remainingSec} seconds remaining`}\n testID=\"rest-timer\"\n >\n {/* Top row */}\n <View\n style={{\n flexDirection: 'row',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 8,\n }}\n >\n {/* Left side */}\n <View style={{ flexDirection: 'column' }}>\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n textTransform: 'uppercase',\n letterSpacing: 1,\n }}\n testID=\"rest-timer-label\"\n >\n REST\n </Text>\n {nextSetInfo != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n marginTop: 2,\n }}\n testID=\"rest-timer-next-set\"\n >\n {nextSetInfo}\n </Text>\n )}\n </View>\n\n {/* Right side - time display */}\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 28,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n fontVariant: ['tabular-nums'],\n letterSpacing: -0.5,\n }}\n testID=\"rest-timer-time\"\n >\n {timeDisplay}\n </Text>\n </View>\n\n {/* Progress bar */}\n <View\n className=\"bg-border\"\n style={{\n height: 3,\n borderRadius: 2,\n marginBottom: 12,\n }}\n testID=\"rest-timer-progress-track\"\n >\n <View\n style={{\n height: '100%',\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 2,\n width: `${progressPct}%`,\n }}\n testID=\"rest-timer-progress-fill\"\n />\n </View>\n\n {/* Actions row — hidden in display-only (poll-only) mode */}\n {!displayOnly && (\n <View style={{ flexDirection: 'row', gap: 8 }}>\n <Pressable\n onPress={onAddTime}\n style={{\n backgroundColor: 'rgba(255,255,255,0.06)',\n paddingVertical: 8,\n paddingHorizontal: 20,\n borderRadius: 8,\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Add 30 seconds\"\n testID=\"rest-timer-add-time\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n +30s\n </Text>\n </Pressable>\n <Pressable\n onPress={onSkip}\n style={{\n backgroundColor: 'rgba(255,121,0,0.12)',\n paddingVertical: 8,\n paddingHorizontal: 20,\n borderRadius: 8,\n }}\n accessibilityRole=\"button\"\n accessibilityLabel=\"Skip rest\"\n testID=\"rest-timer-skip\"\n >\n <Text\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: BRAND_PRIMARY,\n }}\n >\n Skip\n </Text>\n </Pressable>\n </View>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport React from 'react'\nimport { View, Text } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nexport interface SupersetWrapperProps {\n label?: string\n color?: string\n children: React.ReactNode\n}\n\nconst DEFAULTS = {\n label: 'SS',\n color: getSemanticColors('dark')['brand-primary'],\n bgBase: '#101010',\n} as const\n\nexport function SupersetWrapper({\n label = DEFAULTS.label,\n color = DEFAULTS.color,\n children,\n}: SupersetWrapperProps) {\n return (\n <View\n style={{\n position: 'relative',\n borderLeftWidth: 3,\n borderLeftColor: color,\n paddingLeft: 8,\n marginHorizontal: 12,\n marginBottom: 8,\n overflow: 'visible',\n }}\n accessibilityRole={'group' as never}\n accessibilityLabel={`Superset: ${label}`}\n testID=\"superset-wrapper\"\n >\n <Text\n style={{\n position: 'absolute',\n top: -1,\n left: -3,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n backgroundColor: color,\n color: DEFAULTS.bgBase,\n paddingVertical: 2,\n paddingHorizontal: 6,\n borderBottomRightRadius: 4,\n letterSpacing: 0.5,\n zIndex: 2,\n }}\n testID=\"superset-label\"\n >\n {label}\n </Text>\n <View style={{ gap: 2 }} testID=\"superset-children\">\n {children}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { ExerciseCard, type ExerciseCardProps, type ExerciseCardState } from './ExerciseCard'\nimport { InputBar } from './InputBar'\nimport { RestTimer } from './RestTimer'\nimport { SupersetWrapper } from './SupersetWrapper'\nimport { type SetRowProps } from './SetRow'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Where an exercise sits in the during-workout flow. */\nexport type ActiveExerciseStatus = 'completed' | 'active' | 'upcoming'\n\n/**\n * One exercise in the running workout. Projected onto an `ExerciseCard`, whose\n * visual state is driven by `status` and the page's zoom focus: completed and\n * active exercises collapse/expand, upcoming ones stay dimmed.\n */\nexport interface ActiveWorkoutExercise {\n /** Stable id for zoom-focus selection. */\n id: string\n /** Exercise name, e.g. \"Barbell Bench Press\". */\n name: string\n /** Position in the workout flow. */\n status: ActiveExerciseStatus\n /** Unit used for this exercise's loads. */\n unit: 'lbs' | 'kg'\n /** Total sets prescribed for this exercise. */\n totalPlannedSets: number\n /** Collapsed summary (sets × reps @ weight) for a completed exercise. */\n summary?: ExerciseCardProps['summary']\n /** Estimated one-rep max badge. */\n e1rm?: ExerciseCardProps['e1rm']\n /** Flags a personal-record exercise. */\n isPR?: boolean\n /** Prescribed tempo, revealed when expanded. */\n tempo?: ExerciseCardProps['tempo']\n /** Per-rep velocities for each logged set (drives collapsed strips + set count). */\n setVelocities?: number[][]\n /** Per-set breakdown revealed when expanded. */\n sets?: SetRowProps[]\n /** One-line prescription for an upcoming exercise. */\n prescription?: string\n /** Previous-best hint for an upcoming exercise. */\n previousBest?: string\n /** Groups consecutive exercises under a shared `SupersetWrapper`. */\n supersetId?: string\n}\n\n/** A superset grouping consecutive exercises that share its id. */\nexport interface ActiveWorkoutSuperset {\n /** Matches `ActiveWorkoutExercise.supersetId`. */\n id: string\n /** Corner badge label, e.g. \"SS1\". */\n label: string\n /** Accent color for the wrapper rail + label. */\n color?: string\n}\n\n/** Live-set inputs shown in the bottom `InputBar`. */\nexport interface ActiveWorkoutInput {\n /** Current reps field value. */\n reps: string\n /** Current weight field value. */\n weight: string\n}\n\n/** Rest-timer inputs shown in the bottom `RestTimer`. */\nexport interface ActiveWorkoutRest {\n /** Prescribed rest length, seconds. */\n totalSeconds: number\n /** Elapsed rest, milliseconds. */\n elapsedMs: number\n /** Next-set hint, e.g. \"Set 3 · 8 × 195 lbs\". */\n nextSetInfo?: string\n}\n\n/** Derived, page-level roll-up of workout progress. */\nexport interface WorkoutProgress {\n /** Number of exercises marked completed. */\n completedExercises: number\n /** Total exercises in the workout. */\n totalExercises: number\n /** Sets logged so far across all exercises. */\n completedSets: number\n /** Total sets prescribed across all exercises. */\n totalSets: number\n /** Fraction of prescribed sets logged, 0-1. */\n fraction: number\n}\n\n/** An ordered render group: a lone exercise or a superset of exercises. */\nexport type WorkoutGroup =\n | { type: 'single'; exercise: ActiveWorkoutExercise }\n | { type: 'superset'; superset: ActiveWorkoutSuperset; exercises: ActiveWorkoutExercise[] }\n\nexport interface ActiveWorkoutPageProps extends ViewProps {\n /** Workout name shown in the header. */\n title?: string\n /** Context line under the title, e.g. \"Push Day A · Week 6\". */\n subtitle?: string\n /** Exercises in flow order. */\n exercises: ActiveWorkoutExercise[]\n /** Superset groupings referenced by `exercise.supersetId`. */\n supersets?: ActiveWorkoutSuperset[]\n /** Seed reps/weight for the live `InputBar`. */\n input?: ActiveWorkoutInput\n /** Rest-timer state; when resting, the timer replaces the input bar. */\n rest?: ActiveWorkoutRest\n /** Start the page in the resting state (timer showing). */\n initialResting?: boolean\n className?: string\n}\n\n/** Count the sets logged for an exercise (pure). */\nexport function countCompletedSets(exercise: ActiveWorkoutExercise): number {\n if (exercise.setVelocities != null) return exercise.setVelocities.length\n if (exercise.status === 'completed') return exercise.totalPlannedSets\n return 0\n}\n\n/** Roll up the exercises into the header progress readout (pure, testable). */\nexport function deriveWorkoutProgress(exercises: ActiveWorkoutExercise[]): WorkoutProgress {\n let completedExercises = 0\n let completedSets = 0\n let totalSets = 0\n for (const exercise of exercises) {\n if (exercise.status === 'completed') completedExercises += 1\n completedSets += countCompletedSets(exercise)\n totalSets += exercise.totalPlannedSets\n }\n return {\n completedExercises,\n totalExercises: exercises.length,\n completedSets,\n totalSets,\n fraction: totalSets === 0 ? 0 : completedSets / totalSets,\n }\n}\n\n/** The active exercise anchors the bottom bar; find it, or null (pure). */\nexport function findActiveExercise(\n exercises: ActiveWorkoutExercise[]\n): ActiveWorkoutExercise | null {\n return exercises.find((exercise) => exercise.status === 'active') ?? null\n}\n\n/** Map an exercise's status + focus onto an `ExerciseCard` visual state (pure). */\nexport function statusToCardState(\n status: ActiveExerciseStatus,\n focused: boolean\n): ExerciseCardState {\n if (status === 'upcoming') return 'upcoming'\n return focused ? 'expanded' : 'collapsed'\n}\n\n/** Project an exercise onto ExerciseCard props, wiring zoom focus (pure). */\nexport function toActiveCardProps(\n exercise: ActiveWorkoutExercise,\n focused: boolean,\n onToggle: () => void,\n supersetPosition: ExerciseCardProps['supersetPosition'] = null,\n supersetColor?: string\n): ExerciseCardProps {\n const state = statusToCardState(exercise.status, focused)\n return {\n name: exercise.name,\n state,\n onToggle,\n summary: exercise.summary,\n e1rm: exercise.e1rm,\n isPR: exercise.isPR,\n tempo: exercise.tempo,\n setVelocities: exercise.setVelocities,\n totalPlannedSets: exercise.totalPlannedSets,\n sets: state === 'expanded' ? exercise.sets : undefined,\n prescription: exercise.prescription,\n previousBest: exercise.previousBest,\n supersetPosition,\n supersetColor,\n }\n}\n\n/** Fold consecutive same-superset exercises into render groups (pure). */\nexport function groupExercises(\n exercises: ActiveWorkoutExercise[],\n supersets: ActiveWorkoutSuperset[]\n): WorkoutGroup[] {\n const byId = new Map(supersets.map((superset) => [superset.id, superset]))\n const groups: WorkoutGroup[] = []\n for (const exercise of exercises) {\n const superset = exercise.supersetId != null ? byId.get(exercise.supersetId) : undefined\n const last = groups[groups.length - 1]\n if (superset != null && last?.type === 'superset' && last.superset.id === superset.id) {\n last.exercises.push(exercise)\n } else if (superset != null) {\n groups.push({ type: 'superset', superset, exercises: [exercise] })\n } else {\n groups.push({ type: 'single', exercise })\n }\n }\n return groups\n}\n\n/** Position of an exercise within its superset, for corner-radius stitching. */\nfunction supersetPositionAt(index: number, length: number): ExerciseCardProps['supersetPosition'] {\n if (length === 1) return null\n if (index === 0) return 'first'\n if (index === length - 1) return 'last'\n return 'middle'\n}\n\nfunction WorkoutHeader({\n title,\n subtitle,\n progress,\n}: {\n title: string\n subtitle?: string\n progress: WorkoutProgress\n}) {\n return (\n <View style={{ gap: 10 }} testID=\"active-workout-page-header\">\n <View className=\"flex-row items-start justify-between\" style={{ gap: 8 }}>\n <View style={{ flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"active-workout-page-title\"\n >\n {title}\n </Text>\n {subtitle != null && (\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 2,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"active-workout-page-subtitle\"\n >\n {subtitle}\n </Text>\n )}\n </View>\n <View style={{ alignItems: 'flex-end' }} testID=\"active-workout-page-progress-count\">\n <Text\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: BRAND_PRIMARY,\n fontVariant: ['tabular-nums'],\n }}\n >\n {`${progress.completedExercises}/${progress.totalExercises}`}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {`${progress.completedSets}/${progress.totalSets} sets`}\n </Text>\n </View>\n </View>\n <View\n className=\"bg-border\"\n style={{ height: 4, borderRadius: 2 }}\n testID=\"active-workout-page-progress-track\"\n >\n <View\n style={{\n height: '100%',\n width: `${Math.round(progress.fraction * 100)}%`,\n backgroundColor: BRAND_PRIMARY,\n borderRadius: 2,\n }}\n testID=\"active-workout-page-progress-fill\"\n />\n </View>\n </View>\n )\n}\n\ninterface ExerciseListProps {\n groups: WorkoutGroup[]\n focusedId: string | null\n onToggle: (id: string) => void\n}\n\nfunction ExerciseList({ groups, focusedId, onToggle }: ExerciseListProps) {\n return (\n <View style={{ gap: 10 }} testID=\"active-workout-page-exercises\">\n {groups.map((group) => {\n if (group.type === 'single') {\n return (\n <View\n key={group.exercise.id}\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n }}\n >\n <ExerciseCard\n {...toActiveCardProps(group.exercise, group.exercise.id === focusedId, () =>\n onToggle(group.exercise.id)\n )}\n />\n </View>\n )\n }\n return (\n <SupersetWrapper\n key={group.superset.id}\n label={group.superset.label}\n color={group.superset.color}\n >\n {group.exercises.map((exercise, index) => (\n <ExerciseCard\n key={exercise.id}\n {...toActiveCardProps(\n exercise,\n exercise.id === focusedId,\n () => onToggle(exercise.id),\n supersetPositionAt(index, group.exercises.length),\n group.superset.color\n )}\n />\n ))}\n </SupersetWrapper>\n )\n })}\n </View>\n )\n}\n\n/**\n * ActiveWorkoutPage — the during-workout screen, built as a zoom hierarchy over\n * `ExerciseCard`s. A header progress bar rolls up completed sets; the flow list\n * dims upcoming exercises, collapses finished ones to their velocity strips, and\n * expands exactly one focused exercise to its `SetRow` breakdown. Consecutive\n * superset exercises stitch together inside a `SupersetWrapper`. A pinned bottom\n * bar toggles between the live `InputBar` (log the next set) and the `RestTimer`.\n * Focus and rest are page-level state; children keep their own styles.\n *\n * @example\n * <ActiveWorkoutPage title=\"Push Day A\" exercises={exercises} />\n */\nexport function ActiveWorkoutPage({\n title = 'Active Workout',\n subtitle,\n exercises,\n supersets = [],\n input,\n rest,\n initialResting = false,\n className,\n ...props\n}: ActiveWorkoutPageProps) {\n const active = findActiveExercise(exercises)\n const [focusedId, setFocusedId] = useState<string | null>(active?.id ?? null)\n const [resting, setResting] = useState(initialResting)\n const [reps, setReps] = useState(input?.reps ?? '')\n const [weight, setWeight] = useState(input?.weight ?? '')\n\n const progress = useMemo(() => deriveWorkoutProgress(exercises), [exercises])\n const groups = useMemo(() => groupExercises(exercises, supersets), [exercises, supersets])\n\n const toggleFocus = (id: string) => setFocusedId((current) => (current === id ? null : id))\n\n const nextSetNumber = active != null ? countCompletedSets(active) + 1 : 1\n const canRecord = reps.trim() !== '' && weight.trim() !== ''\n const showRest = resting && rest != null\n const showInput = !showRest && active != null\n\n return (\n <View\n className={['bg-background-base', className].filter(Boolean).join(' ')}\n style={{ position: 'relative', width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={title}\n testID=\"active-workout-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"active-workout-page-content\">\n <WorkoutHeader title={title} subtitle={subtitle} progress={progress} />\n <ExerciseList groups={groups} focusedId={focusedId} onToggle={toggleFocus} />\n </View>\n\n {(showRest || showInput) && (\n <View\n style={{ borderTopWidth: 1, borderTopColor: resolveColor('border-default') }}\n testID=\"active-workout-page-bottom-bar\"\n >\n {showRest && rest != null ? (\n <RestTimer\n totalSeconds={rest.totalSeconds}\n elapsedMs={rest.elapsedMs}\n nextSetInfo={rest.nextSetInfo}\n onSkip={() => setResting(false)}\n onAddTime={() => undefined}\n visible\n />\n ) : (\n active != null && (\n <InputBar\n exerciseName={active.name}\n setNumber={nextSetNumber}\n totalSets={active.totalPlannedSets}\n reps={reps}\n weight={weight}\n unit={active.unit}\n onRepsChange={setReps}\n onWeightChange={setWeight}\n onRecord={() => {\n if (rest != null) setResting(true)\n }}\n canRecord={canRecord}\n visible\n />\n )\n )}\n </View>\n )}\n </View>\n )\n}\n","/**\n * Elevation System\n * \n * A unified depth system where each elevation level corresponds to:\n * - Calculated surface color (derived from base using lighten)\n * - Shadow intensity and style (raised/pressed)\n * - Dynamically calculated shadow colors (derived from surface color)\n * - Semantic name for reference\n * \n * Elevation range: -2 (deep inset) to +5 (floating overlay)\n * \n * Negative elevations: Inset/pressed elements (sunken into surface)\n * Zero elevation: Base surface (background/page level)\n * Positive elevations: Raised elements (floating above surface)\n * \n * All colors are calculated dynamically from a base surface color,\n * allowing for custom surfaces and consistent color relationships.\n * \n * Lighting Model: Light source from upper-right corner\n * - Raised elements are always lighter than base (consistent across themes)\n * - Base colors must allow sufficient lightening in both themes\n */\n\nimport { Platform, type ViewStyle } from 'react-native'\nimport { lighten, darken, hexToRgb, rgbToHsv, hsvToRgb, rgbToHex } from './shadows'\nimport { semanticColorsLight, semanticColorsDark } from './tokens/semantic'\n\nexport type ElevationLevel = -2 | -1 | 0 | 1 | 2 | 3 | 4 | 5\n\nexport interface ElevationConfig {\n /** Semantic name for this elevation level */\n name: string\n /** Amount to lighten base color (0-1) */\n colorAdjustment: number\n /** Shadow intensity */\n shadowIntensity: 'subtle' | 'medium' | 'strong'\n /** Shadow style: raised (floating) or pressed (inset) */\n shadowStyle: 'raised' | 'pressed'\n /** Description of use case */\n description: string\n}\n\nexport const elevationSystem: Record<ElevationLevel, ElevationConfig> = {\n // Deep inset (recessed input fields, deeply pressed buttons)\n [-2]: {\n name: 'deep-inset',\n colorAdjustment: 0,\n shadowIntensity: 'strong',\n shadowStyle: 'pressed',\n description: 'Deeply recessed elements (e.g., input fields, deeply pressed buttons)',\n },\n \n // Shallow inset (pressed buttons, sunken panels)\n [-1]: {\n name: 'inset',\n colorAdjustment: 0,\n shadowIntensity: 'medium',\n shadowStyle: 'pressed',\n description: 'Shallow inset elements (e.g., pressed buttons, sunken panels within cards)',\n },\n \n // Base level (page background, default surface)\n [0]: {\n name: 'base',\n colorAdjustment: 0,\n shadowIntensity: 'subtle',\n shadowStyle: 'raised',\n description: 'Base surface level (page background, default containers)',\n },\n \n // Level 1: Subtle elevation (outline cards, subtle containers)\n [1]: {\n name: 'subtle',\n colorAdjustment: 0.01,\n shadowIntensity: 'subtle',\n shadowStyle: 'raised',\n description: 'Subtle elevation (outline cards, subtle containers)',\n },\n \n // Level 2: Standard elevation (default cards, buttons)\n [2]: {\n name: 'standard',\n colorAdjustment: 0.02,\n shadowIntensity: 'medium',\n shadowStyle: 'raised',\n description: 'Standard elevation (default cards, raised buttons)',\n },\n \n // Level 3: Prominent elevation (important cards, modals)\n [3]: {\n name: 'prominent',\n colorAdjustment: 0.04,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'Prominent elevation (important cards, modals, dropdowns)',\n },\n \n // Level 4: High elevation (overlays, popovers)\n [4]: {\n name: 'high',\n colorAdjustment: 0.06,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'High elevation (overlays, popovers, tooltips)',\n },\n \n // Level 5: Floating (toasts, floating action buttons)\n [5]: {\n name: 'floating',\n colorAdjustment: 0.08,\n shadowIntensity: 'strong',\n shadowStyle: 'raised',\n description: 'Floating elevation (toasts, floating action buttons, highest z-index)',\n },\n}\n\n/**\n * Calculate rim light color from the BASE color.\n * Creates a consistent bright highlight with opacity that scales with elevation.\n * \n * The rim light represents light hitting the edge of raised elements from a \n * consistent light source. Uses ABSOLUTE HSV value (not relative lightening)\n * for consistent intensity across all surface colors.\n * \n * For colored surfaces: preserves hue/saturation, sets value to fixed bright level\n * For gray surfaces: uses white with appropriate opacity\n * \n * @param baseColor - The base surface color (hex)\n * @param level - Elevation level (used to scale opacity)\n */\nfunction calculateRimLightColor(baseColor: string, level: ElevationLevel): string {\n const rgb = hexToRgb(baseColor)\n if (!rgb) {\n return 'rgba(255, 255, 255, 0.5)'\n }\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const isLight = hsv.v > 0.6\n const isSaturated = hsv.s > 0.3 // Colored (not gray)\n \n // Opacity scales with elevation to compensate for lighter surfaces at higher levels\n // Range: +0% at level 1 to +20% at level 5\n const absLevel = Math.abs(level)\n const opacityBoost = Math.max(0, (absLevel - 1) * 0.05) // +5% per level above 1 (0% to 20%)\n \n if (isSaturated) {\n // For colored surfaces, preserve hue and saturation but set value to fixed bright level\n // This ensures consistent rim light intensity across all colored surfaces\n const rimLightValue = 0.95 // Fixed bright value for rim light\n const rimLightRgb = hsvToRgb(hsv.h, hsv.s * 0.3, rimLightValue) // Reduce saturation for brighter appearance\n \n // Base opacity + elevation boost, capped at 1.0\n const baseOpacity = isLight ? 0.9 : 0.5\n const finalOpacity = Math.min(1, baseOpacity + opacityBoost)\n return `rgba(${rimLightRgb.r}, ${rimLightRgb.g}, ${rimLightRgb.b}, ${finalOpacity.toFixed(2)})`\n } else {\n // For gray/neutral surfaces, use white with appropriate opacity\n const baseOpacity = isLight ? 0.9 : 0.12\n const finalOpacity = Math.min(1, baseOpacity + opacityBoost)\n return `rgba(255, 255, 255, ${finalOpacity.toFixed(2)})`\n }\n}\n\n/**\n * Calculate dark shadow colors from the surface color.\n * The dark shadow is cast BY the element, so it should match the surface color.\n * \n * Uses ABSOLUTE HSV value (not relative darkening) for consistent shadow intensity\n * across all surface colors - simulating a consistent light source.\n * \n * For colored surfaces: preserves hue/saturation, sets value to fixed dark level\n * For gray surfaces: uses black with appropriate opacity\n */\nfunction calculateDarkShadowColors(surfaceColor: string): {\n dark: string\n darker: string\n} {\n const rgb = hexToRgb(surfaceColor)\n if (!rgb) {\n return {\n dark: 'rgba(0, 0, 0, 0.3)',\n darker: 'rgba(0, 0, 0, 0.4)',\n }\n }\n \n const hsv = rgbToHsv(rgb.r, rgb.g, rgb.b)\n const isLight = hsv.v > 0.6\n const isSaturated = hsv.s > 0.3\n \n if (isSaturated) {\n // For colored surfaces, preserve hue and saturation but set value to fixed dark level\n // This ensures consistent shadow intensity across all colored surfaces\n const darkShadowValue = 0.15 // Fixed dark value for shadows\n const darkShadowRgb = hsvToRgb(hsv.h, hsv.s, darkShadowValue)\n \n if (isLight) {\n return {\n dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.3)`,\n darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.4)`,\n }\n } else {\n return {\n dark: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.5)`,\n darker: `rgba(${darkShadowRgb.r}, ${darkShadowRgb.g}, ${darkShadowRgb.b}, 0.6)`,\n }\n }\n } else {\n // For gray surfaces, use standard black shadows\n if (isLight) {\n return {\n dark: 'rgba(0, 0, 0, 0.2)',\n darker: 'rgba(0, 0, 0, 0.3)',\n }\n } else {\n return {\n dark: 'rgba(0, 0, 0, 0.5)',\n darker: 'rgba(0, 0, 0, 0.6)',\n }\n }\n }\n}\n\n/**\n * Get rim light size config.\n * Fixed 1px offset and blur for a consistent, crisp rim highlight.\n * Opacity scaling (in calculateRimLightColor) handles elevation differences.\n */\nfunction getRimLightConfig(): { offset: number; blur: number } {\n return {\n offset: 1, // Fixed 1px for crisp rim\n blur: 1, // Tight blur for crisp edge\n }\n}\n\n/**\n * Get elevation configuration for a given level\n */\nexport function getElevationConfig(level: ElevationLevel): ElevationConfig {\n return elevationSystem[level]\n}\n\n// Simple cache for elevation surface colors\nconst elevationSurfaceCache = new Map<string, string>()\nconst MAX_CACHE_SIZE = 100\n\nfunction getCacheKey(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark'): string {\n return `${baseColor}-${level}-${theme}`\n}\n\nfunction calculateElevationSurface(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark'\n): string {\n const config = elevationSystem[level]\n \n if (config.colorAdjustment === 0) {\n return baseColor\n }\n \n // For raised elevations (positive), always lighten (consistent lighting model)\n // Light source is from upper-right, so raised elements are always lighter\n // For inset elevations (negative), we keep base color (shadow creates depth)\n if (level < 0) {\n return baseColor // Inset elements use base color\n }\n \n // Always lighten for raised elements (consistent across themes)\n // Base colors must be chosen to allow sufficient lightening in dark mode\n return lighten(baseColor, config.colorAdjustment)\n}\n\n/**\n * Calculate surface color for an elevation level from a base color.\n * Results are cached to avoid redundant calculations.\n * \n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @returns Calculated surface color (hex)\n */\nexport function getElevationSurface(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark'\n): string {\n const cacheKey = getCacheKey(baseColor, level, theme)\n \n // Check cache\n if (elevationSurfaceCache.has(cacheKey)) {\n return elevationSurfaceCache.get(cacheKey)!\n }\n \n // Calculate\n const result = calculateElevationSurface(baseColor, level, theme)\n \n // Cache result (with size limit to prevent memory leaks)\n if (elevationSurfaceCache.size >= MAX_CACHE_SIZE) {\n // Remove oldest entry (simple FIFO)\n const firstKey = elevationSurfaceCache.keys().next().value!\n elevationSurfaceCache.delete(firstKey)\n }\n elevationSurfaceCache.set(cacheKey, result)\n \n return result\n}\n\n// Cache for shadow styles (less frequently used, smaller cache)\nconst elevationShadowCache = new Map<string, ViewStyle>()\nconst MAX_SHADOW_CACHE_SIZE = 50\n\nfunction getShadowCacheKey(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark', isHovered: boolean): string {\n return `${baseColor}-${level}-${theme}-${isHovered}`\n}\n\nfunction calculateElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const config = elevationSystem[level]\n \n // Base level has no shadow\n if (level === 0) {\n return {}\n }\n \n // Calculate the actual elevated surface color\n const elevatedSurfaceColor = calculateElevationSurface(baseColor, level, theme)\n \n // Rim light: calculated from BASE color (consistent across all elevations)\n // This represents a consistent light source - only size changes with elevation\n const rimLightColor = calculateRimLightColor(baseColor, level)\n \n // Dark shadow: calculated from ELEVATED surface color\n // The shadow is cast by the element, so it should match the surface\n const darkShadowColors = calculateDarkShadowColors(elevatedSurfaceColor)\n \n // Get shadow intensity config (for dark shadow)\n const intensityConfig = {\n subtle: { offset: 1, blur: 2 },\n medium: { offset: 2, blur: 4 },\n strong: { offset: 2, blur: 5 },\n }\n \n const { offset, blur } = intensityConfig[config.shadowIntensity]\n \n // Get rim light config (scales with elevation level)\n const rimConfig = getRimLightConfig()\n \n if (config.shadowStyle === 'pressed') {\n // Inset shadow (pressed elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n }\n \n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n } else {\n // Raised shadow (floating elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n }\n \n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n }\n}\n\n/**\n * Get shadow style for an elevation level, calculated dynamically from surface color.\n * Results are cached to avoid redundant calculations.\n * \n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @param isHovered - Whether element is hovered\n * @returns ViewStyle with shadow properties\n */\nexport function getElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const cacheKey = getShadowCacheKey(baseColor, level, theme, isHovered)\n \n // Check cache\n if (elevationShadowCache.has(cacheKey)) {\n return elevationShadowCache.get(cacheKey)!\n }\n \n // Calculate shadow\n const result = calculateElevationShadow(baseColor, level, theme, isHovered)\n \n // Cache result\n if (elevationShadowCache.size >= MAX_SHADOW_CACHE_SIZE) {\n const firstKey = elevationShadowCache.keys().next().value!\n elevationShadowCache.delete(firstKey)\n }\n elevationShadowCache.set(cacheKey, result)\n \n return result\n}\n\n/**\n * Get base surface color from theme.\n * This is the foundation color that all elevations are calculated from.\n * \n * IMPORTANT: Base colors must be chosen to allow sufficient lightening.\n * \n * **Light Mode**: Cannot use `#FFFFFF` (white) - cannot lighten white!\n * - Use `#F3F4F6` (neutral[100]) - can lighten to `#FAFAFA` → `#FFFFFF`\n * - This allows raised elevations to be lighter (closer to white)\n * \n * **Dark Mode**: Need lighter base to allow sufficient lightening\n * - Use `#191919` (charcoal[600]) - allows lightening to `#2A2A2A` at max elevation\n * \n * Can be overridden to use custom base colors for special cases.\n */\nexport function getBaseSurfaceColor(theme: 'light' | 'dark'): string {\n // Use semantic token values so elevation colors stay in sync with the token pipeline.\n // Light mode: surface-raised (#F3F4F6 / neutral[100]) - NOT white, so we can lighten it\n // Dark mode: surface-elevated (#191919 / charcoal[600]) - allows sufficient lightening\n\n return theme === 'light'\n ? semanticColorsLight['surface-raised']\n : semanticColorsDark['surface-elevated']\n}\n\n/**\n * Component-specific elevation ranges\n * Defines which elevation levels each component type can use\n */\nexport const componentElevationRanges = {\n button: {\n allowed: [2] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n card: {\n allowed: [1, 2, 3] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n input: {\n allowed: [-2, -1, 0] as const,\n default: -1 as const,\n },\n overlay: {\n allowed: [4, 5] as const,\n default: 4 as const,\n },\n} as const\n\nexport type ComponentType = keyof typeof componentElevationRanges\n\n/**\n * Validate and clamp elevation to component's allowed range\n */\nexport function getValidatedElevation(\n component: ComponentType,\n requested: ElevationLevel\n): ElevationLevel {\n const range = componentElevationRanges[component]\n if ((range.allowed as readonly ElevationLevel[]).includes(requested)) {\n return requested\n }\n // Clamp to nearest allowed elevation\n const sorted = [...range.allowed].sort((a, b) => a - b)\n if (requested < sorted[0]) return sorted[0]\n if (requested > sorted[sorted.length - 1]) return sorted[sorted.length - 1]\n // Find closest\n return sorted.reduce((prev, curr) =>\n Math.abs(curr - requested) < Math.abs(prev - requested) ? curr : prev\n ) as ElevationLevel\n}\n\n// =============================================================================\n// Glow Shadow Support\n// =============================================================================\n\nexport type GlowIntensity = 'subtle' | 'medium' | 'strong'\n\nconst glowConfig: Record<GlowIntensity, { blur: number; spread: number; opacity: number }> = {\n subtle: { blur: 12, spread: 0, opacity: 0.25 },\n medium: { blur: 20, spread: 2, opacity: 0.4 },\n strong: { blur: 30, spread: 4, opacity: 0.55 },\n}\n\n/**\n * Get a glow shadow style for emphasis/active states.\n *\n * Creates a colored radial glow around an element, useful for:\n * - Active recording indicators (orange glow)\n * - Success states (green glow)\n * - Error/danger indicators (red glow)\n * - Focus rings and attention-drawing elements\n *\n * @param color - Glow color (hex string, e.g. '#FF7900')\n * @param intensity - Glow intensity level\n * @returns ViewStyle with platform-specific shadow properties\n */\nexport function getGlowShadow(\n color: string,\n intensity: GlowIntensity = 'medium'\n): ViewStyle {\n const config = glowConfig[intensity]\n const rgb = hexToRgb(color)\n if (!rgb) return {}\n\n return Platform.select({\n web: {\n boxShadow: `0 0 ${config.blur}px ${config.spread}px rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${config.opacity})`,\n } as any,\n default: {\n shadowColor: color,\n shadowOffset: { width: 0, height: 0 },\n shadowOpacity: config.opacity,\n shadowRadius: config.blur / 2,\n elevation: 0,\n },\n }) as ViewStyle\n}\n","import { useSyncExternalStore } from 'react'\n\n/**\n * Utility function to detect the current theme.\n * Checks for the 'light' class on the html element (set by Storybook's theme addon).\n * \n * NOTE: This function reads the theme at call time. For reactive theme detection\n * that re-renders when the theme changes, use the `useTheme` hook instead.\n * \n * @returns 'light' if light theme is active, 'dark' otherwise\n */\nexport function getTheme(): 'light' | 'dark' {\n if (typeof document === 'undefined') return 'dark'\n return document.documentElement.classList.contains('light') ? 'light' : 'dark'\n}\n\n// Subscribers for theme changes\nlet listeners: Array<() => void> = []\n\nfunction subscribe(listener: () => void) {\n listeners = [...listeners, listener]\n \n // Set up MutationObserver to watch for class changes on html element\n if (typeof document !== 'undefined' && listeners.length === 1) {\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n // Notify all listeners when class changes\n listeners.forEach(l => l())\n }\n }\n })\n \n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n })\n \n // Store observer for cleanup\n ;(subscribe as any)._observer = observer\n }\n \n return () => {\n listeners = listeners.filter(l => l !== listener)\n \n // Clean up observer when no more listeners\n if (listeners.length === 0 && (subscribe as any)._observer) {\n ;(subscribe as any)._observer.disconnect()\n ;(subscribe as any)._observer = null\n }\n }\n}\n\nfunction getSnapshot(): 'light' | 'dark' {\n return getTheme()\n}\n\nfunction getServerSnapshot(): 'light' | 'dark' {\n return 'dark'\n}\n\n/**\n * React hook for reactive theme detection.\n * Automatically re-renders when the theme changes (via class changes on html element).\n * \n * Uses useSyncExternalStore for proper React 18 concurrent mode support.\n * \n * @returns 'light' if light theme is active, 'dark' otherwise\n */\nexport function useTheme(): 'light' | 'dark' {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","import React, { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { \n getElevationSurface, \n getElevationShadow, \n getBaseSurfaceColor,\n getValidatedElevation,\n type ElevationLevel \n} from '../../../theme'\nimport { useTheme } from '../../../utils/useTheme'\n\nexport type CardVariant = 'elevated' | 'outline' | 'filled' | 'accent' | 'subtle'\nexport type CardElevation = 1 | 2 | 3 // subtle, standard, prominent\n\nexport interface CardProps extends ViewProps {\n /** Visual variant */\n variant?: CardVariant\n /** Elevation level (1=subtle, 2=standard, 3=prominent) */\n elevation?: CardElevation\n /** Whether the card is interactive (hoverable/pressable) */\n isInteractive?: boolean\n /** Whether the card is in a loading state (renders skeleton) */\n isLoading?: boolean\n /** Callback when card is pressed (makes card interactive) */\n onPress?: () => void\n /** Custom border color (hex, rgb, or CSS color). Useful for status cards. */\n borderColor?: string\n /** Custom background color (hex, rgb, or CSS color). Useful for colored cards. */\n bgColor?: string\n /** Accent stripe color for accent variant (CSS color or hex) */\n accentColor?: string\n /** Accent stripe width for accent variant in pixels (default: 3) */\n accentWidth?: number\n /** Additional className */\n className?: string\n children?: React.ReactNode\n /** Show header skeleton when loading (default: true) */\n skeletonHasHeader?: boolean\n /** Show footer skeleton when loading (default: false) */\n skeletonHasFooter?: boolean\n /** Number of content lines in skeleton when loading (default: 3) */\n skeletonContentLines?: number\n}\n\nconst variantStyles: Record<CardVariant, string> = {\n elevated: '', // Will be set dynamically via elevation system\n outline: 'border-2 border-border-strong', // Thicker border with stronger contrast\n filled: '', // Will be set dynamically via elevation system\n accent: 'border border-border',\n subtle: 'border border-border-subtle',\n}\n\n/**\n * Card component for containing related content.\n *\n * @example\n * <Card>\n * <CardHeader>\n * <CardTitle>Card Title</CardTitle>\n * <CardDescription>Card description</CardDescription>\n * </CardHeader>\n * <CardContent>\n * <Text>Card content goes here</Text>\n * </CardContent>\n * <CardFooter>\n * <Button>Action</Button>\n * </CardFooter>\n * </Card>\n *\n * // Interactive card\n * <Card isInteractive onPress={() => console.log('pressed')}>\n * <CardContent>Click me</CardContent>\n * </Card>\n */\nexport function Card({\n variant = 'elevated',\n elevation = 2,\n isInteractive = false,\n isLoading = false,\n onPress,\n borderColor,\n bgColor,\n accentColor,\n accentWidth,\n className,\n children,\n style,\n skeletonHasHeader = true,\n skeletonHasFooter = false,\n skeletonContentLines = 3,\n ...props\n}: CardProps) {\n const isClickable = isInteractive || !!onPress\n const [isHovered, setIsHovered] = useState(false)\n const theme = useTheme()\n\n // Get elevation level (validate and clamp to card's allowed range)\n const elevationLevel = useMemo(() => {\n const validated = getValidatedElevation('card', elevation as ElevationLevel)\n // Map variant to elevation if needed\n if (variant === 'outline' || variant === 'accent' || variant === 'subtle') {\n return 1 as ElevationLevel // These border variants use subtle elevation\n }\n return validated\n }, [variant, elevation])\n\n // Get base surface color for theme\n const baseColor = useMemo(() => getBaseSurfaceColor(theme), [theme])\n\n // Calculate surface color and shadow from elevation\n const surfaceColor = useMemo(() => {\n // Outline variant in light mode uses a specific off-white for clear visibility\n if ((variant === 'outline' || variant === 'accent') && theme === 'light') {\n return '#FAFAFA' // Matches --color-surface-elevated in light mode\n }\n // Subtle variant uses the base surface color without elevation lift\n if (variant === 'subtle') {\n return getElevationSurface(baseColor, 0 as ElevationLevel, theme)\n }\n return getElevationSurface(baseColor, elevationLevel, theme)\n }, [baseColor, elevationLevel, theme, variant])\n\n const shadowStyle = useMemo(() => {\n // Only apply hover shadow if card is actually clickable\n const shouldHover = isHovered && isClickable\n return getElevationShadow(baseColor, elevationLevel, theme, shouldHover)\n }, [baseColor, elevationLevel, theme, isHovered, isClickable])\n\n // Render skeleton content when loading, otherwise render children\n const cardContent = isLoading ? (\n <>\n {skeletonHasHeader && (\n <CardHeader>\n <View className=\"h-5 w-1/3 bg-interactive-disabled rounded\" />\n <View className=\"mt-2 h-4 w-2/3 bg-interactive-disabled rounded\" />\n </CardHeader>\n )}\n <CardContent>\n {Array.from({ length: skeletonContentLines }).map((_, i) => (\n <View\n key={i}\n className={cn(\n 'h-4 bg-interactive-disabled rounded',\n i < skeletonContentLines - 1 ? 'mb-2 w-full' : 'w-4/5'\n )}\n />\n ))}\n </CardContent>\n {skeletonHasFooter && (\n <CardFooter>\n <View className=\"h-9 w-24 bg-interactive-disabled rounded\" />\n </CardFooter>\n )}\n </>\n ) : (\n children\n )\n\n const baseClassName = cn(\n 'rounded-lg overflow-hidden relative',\n // Apply variant styles, but only use default border color if no custom borderColor\n variant === 'outline'\n ? borderColor\n ? 'border-2' // Just the border width, color via style\n : variantStyles[variant] // Full variant styles including color\n : variantStyles[variant],\n // Remove Tailwind shadow classes - we're using elevation shadows via style prop\n isClickable && 'web:cursor-pointer web:transition-all web:duration-150',\n isClickable && 'web:hover:-translate-y-0.5 active:scale-[0.99]',\n isLoading && 'pointer-events-none animate-pulse',\n className\n )\n\n // Accent variant: left stripe via borderLeft override\n const accentStyle = useMemo(() => variant === 'accent' ? {\n borderLeftWidth: accentWidth ?? 3,\n borderLeftColor: accentColor ?? 'var(--color-brand-primary)',\n } : {}, [variant, accentWidth, accentColor])\n\n // Merge styles: background color from elevation + shadow style + custom colors + custom style\n const mergedStyle = useMemo(() => {\n const elevationStyle: Record<string, any> = {\n backgroundColor: bgColor || surfaceColor,\n borderRadius: 8,\n overflow: 'hidden' as const,\n ...shadowStyle,\n ...accentStyle,\n }\n\n // Add custom border color if provided\n if (borderColor) {\n elevationStyle.borderColor = borderColor\n }\n\n if (!style) return elevationStyle\n // User style takes precedence over elevation defaults (e.g. maxWidth, custom bg)\n return [elevationStyle, style]\n }, [style, surfaceColor, shadowStyle, borderColor, bgColor, accentStyle])\n\n if (isClickable) {\n return (\n <Pressable\n onPress={onPress}\n onHoverIn={() => setIsHovered(true)}\n onHoverOut={() => setIsHovered(false)}\n accessibilityRole=\"button\"\n className={baseClassName}\n style={mergedStyle}\n {...props}\n >\n {cardContent}\n </Pressable>\n )\n }\n\n return (\n <View className={baseClassName} style={mergedStyle} {...props}>\n {cardContent}\n </View>\n )\n}\n\nexport interface CardHeaderProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Header section of a Card.\n */\nexport function CardHeader({ children, className }: CardHeaderProps) {\n return (\n <View className={cn('px-6 py-6', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardTitleProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Title for CardHeader.\n */\nexport function CardTitle({ children, className }: CardTitleProps) {\n return (\n <Text\n accessibilityRole=\"header\"\n className={cn('text-lg font-semibold text-text-primary font-heading', className)}\n >\n {children}\n </Text>\n )\n}\n\nexport interface CardDescriptionProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Description for CardHeader.\n */\nexport function CardDescription({ children, className }: CardDescriptionProps) {\n return (\n <Text className={cn('mt-1.5 text-sm text-text-secondary', className)}>\n {children}\n </Text>\n )\n}\n\nexport interface CardContentProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Content section of a Card.\n */\nexport function CardContent({ children, className }: CardContentProps) {\n return (\n <View className={cn('px-6 py-4', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardFooterProps {\n children?: React.ReactNode\n className?: string\n}\n\n/**\n * Footer section of a Card.\n */\nexport function CardFooter({ children, className }: CardFooterProps) {\n return (\n <View className={cn('px-6 py-4 flex-row items-center gap-2', className)}>\n {children}\n </View>\n )\n}\n\nexport interface CardSkeletonProps {\n /** Whether to show header skeleton */\n hasHeader?: boolean\n /** Whether to show footer skeleton */\n hasFooter?: boolean\n /** Number of content lines */\n contentLines?: number\n /** Additional className */\n className?: string\n}\n\n/**\n * Skeleton placeholder for Card loading state.\n */\nexport function CardSkeleton({\n hasHeader = true,\n hasFooter = false,\n contentLines = 3,\n className,\n}: CardSkeletonProps) {\n return (\n <Card variant=\"elevated\" elevation={2} className={cn('animate-pulse', className)}>\n {hasHeader && (\n <CardHeader>\n <View className=\"h-5 w-1/3 bg-interactive-disabled rounded\" />\n <View className=\"mt-2 h-4 w-2/3 bg-interactive-disabled rounded\" />\n </CardHeader>\n )}\n <CardContent>\n {Array.from({ length: contentLines }).map((_, i) => (\n <View\n key={i}\n className={cn(\n 'h-4 bg-interactive-disabled rounded',\n i < contentLines - 1 ? 'mb-2 w-full' : 'w-4/5'\n )}\n />\n ))}\n </CardContent>\n {hasFooter && (\n <CardFooter>\n <View className=\"h-9 w-24 bg-interactive-disabled rounded\" />\n </CardFooter>\n )}\n </Card>\n )\n}\n\nexport interface CardInsetProps extends ViewProps {\n /** Elevation level for inset (-2=deep, -1=shallow) */\n elevation?: -2 | -1\n /** Additional className */\n className?: string\n children?: React.ReactNode\n}\n\n/**\n * Inset element within a Card. Applies pressed neumorphic shadow\n * to create a sunken/recessed appearance.\n * \n * @example\n * <Card elevation={2}>\n * <CardContent>\n * <CardInset elevation={-1}>\n * <Text>This content appears inset/sunken</Text>\n * </CardInset>\n * </CardContent>\n * </Card>\n */\nexport function CardInset({\n elevation = -1,\n className,\n children,\n style,\n ...props\n}: CardInsetProps) {\n const theme = useTheme()\n const baseColor = useMemo(() => getBaseSurfaceColor(theme), [theme])\n const surfaceColor = useMemo(() => {\n return getElevationSurface(baseColor, elevation as ElevationLevel, theme)\n }, [baseColor, elevation, theme])\n const shadowStyle = useMemo(() => {\n return getElevationShadow(baseColor, elevation as ElevationLevel, theme)\n }, [baseColor, elevation, theme])\n \n return (\n <View\n className={cn('rounded', className)}\n style={[{ backgroundColor: surfaceColor }, shadowStyle, style]}\n {...props}\n >\n {children}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type StatusDotVariant =\n | 'success'\n | 'warning'\n | 'error'\n | 'neutral'\n | 'on-track'\n | 'deviation'\n | 'future'\n\nexport interface StatusDotProps extends ViewProps {\n variant: StatusDotVariant\n /** Center glyph. Only rendered at size=\"md\"; the 8px \"sm\" dot is too small to fit one. */\n icon?: 'check' | 'exclamation' | 'dash'\n size?: 'sm' | 'md'\n /** Adds a subtle glow effect in the variant color */\n glow?: boolean\n label?: string\n className?: string\n}\n\nconst solidVariantColors: Record<string, string> = {\n success: t['status-success'],\n warning: t['status-warning'],\n error: t['status-error'],\n neutral: '#6B7280',\n}\n\nconst ringVariantStyles: Record<string, Record<string, unknown>> = {\n 'on-track': {\n backgroundColor: 'rgba(46,213,115,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(46,213,115,0.3)',\n },\n deviation: {\n backgroundColor: 'rgba(245,158,11,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(245,158,11,0.25)',\n },\n future: {\n backgroundColor: 'rgba(107,114,128,0.1)',\n borderWidth: 1,\n borderStyle: 'dashed',\n borderColor: 'rgba(107,114,128,0.2)',\n },\n}\n\nconst glowStyles: Record<StatusDotVariant, Record<string, unknown>> = {\n success: { boxShadow: '0 0 4px rgba(46,213,115,0.4)' },\n warning: { boxShadow: '0 0 4px rgba(245,158,11,0.4)' },\n error: { boxShadow: '0 0 4px rgba(239,68,68,0.4)' },\n neutral: { boxShadow: '0 0 4px rgba(107,114,128,0.4)' },\n 'on-track': { boxShadow: '0 0 4px rgba(46,213,115,0.4)' },\n deviation: { boxShadow: '0 0 4px rgba(245,158,11,0.4)' },\n future: { boxShadow: '0 0 4px rgba(107,114,128,0.4)' },\n}\n\nconst iconChars: Record<string, string> = {\n check: '\\u2713',\n exclamation: '!',\n dash: '\\u2014',\n}\n\n/** Color-matched icon colors: dark on solid bg, light on transparent bg */\nconst iconColors: Record<StatusDotVariant, string> = {\n success: '#0A5C52',\n warning: '#6B4000',\n error: '#5C1A1A',\n neutral: '#D1D5DB',\n 'on-track': t['status-success'],\n deviation: t['status-warning'],\n future: '#6B7280',\n}\n\nconst sizeDimensions = {\n sm: { size: 8, showIcon: false },\n md: { size: 18, showIcon: true },\n}\n\nfunction isSolidVariant(variant: StatusDotVariant): boolean {\n return variant in solidVariantColors\n}\n\nexport function StatusDot({\n variant,\n icon,\n size = 'sm',\n glow,\n label,\n className,\n ...props\n}: StatusDotProps) {\n const config = sizeDimensions[size]\n const solid = isSolidVariant(variant)\n const ring = ringVariantStyles[variant]\n\n const glowStyle = glow ? glowStyles[variant] : null\n\n const dot = (\n <View\n style={[\n {\n width: config.size,\n height: config.size,\n borderRadius: 9999,\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n },\n solid ? { backgroundColor: solidVariantColors[variant] } : undefined,\n ring ? (ring as Record<string, unknown>) : undefined,\n glowStyle ? (glowStyle as Record<string, unknown>) : undefined,\n ]}\n accessibilityRole=\"image\"\n accessibilityLabel={`${variant} status`}\n testID=\"status-dot\"\n >\n {config.showIcon && icon && (\n <Text\n style={{\n fontSize: 11,\n lineHeight: 11,\n fontWeight: '900',\n color: iconColors[variant],\n }}\n accessibilityElementsHidden\n >\n {iconChars[icon]}\n </Text>\n )}\n </View>\n )\n\n if (label) {\n return (\n <View\n className={className}\n style={{ flexDirection: 'row', alignItems: 'center', gap: 6 }}\n accessibilityLabel={`${variant} status: ${label}`}\n {...props}\n >\n <View accessibilityElementsHidden>{dot}</View>\n <Text\n style={{ fontSize: 12, lineHeight: 16, color: '#9CA3AF' }}\n accessibilityElementsHidden\n >\n {label}\n </Text>\n </View>\n )\n }\n\n return (\n <View className={className} {...props}>\n {dot}\n </View>\n )\n}\n","/**\n * Data-viz / status / brand fills, sourced from the color foundations.\n */\n\nimport { categoricalPalette, primitiveRamps as ramp } from './tokens/primitives'\n\n/**\n * Titan categorical fallback palette shared by Treemap and Scatter — the\n * canonical {@link categoricalPalette} (ordered, nested-stable, CVD-safe).\n * Components index into it modulo length, so the 7-color series is sufficient.\n */\nexport const DATAVIZ_CATEGORICAL_PALETTE = categoricalPalette.default\n\n/**\n * MesoCard / MesoStatusCard 3px top-accent gradient stops (dark → primary →\n * light), on the orange ramp that brand-primary (orange-400) lives in.\n */\nexport const MESO_ACCENT_GRADIENT_DARK = ramp.orange[500]\nexport const MESO_ACCENT_GRADIENT_LIGHT = ramp.orange[300]\n\nexport const WORKOUT_PILL_DELOAD = ramp.magenta[600]\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { Fragment, type ReactNode } from 'react'\nimport { View, Text, type ViewProps, type ViewStyle } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { StatusDot } from './StatusDot'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MESO_ACCENT_GRADIENT_DARK,\n MESO_ACCENT_GRADIENT_LIGHT,\n} from '../../../theme/extracted-colors-dataviz'\n\nconst t = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = t['brand-primary']\nconst BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK\nconst BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT\n\nconst SUCCESS = t['status-success']\nconst WARNING = t['status-warning']\nconst ERROR = t['status-error']\n\n/** Gradient stops for the 3px top accent: dark -> primary -> light (matches MesoCard). */\nconst ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY, BRAND_PRIMARY_LIGHT]\n\n/**\n * Card surface gradient: elevated -> raised at 135deg. Uses resolved dark-theme\n * hexes (a gradient string can't carry a className token, and var() renders\n * black on native).\n */\nconst CARD_GRADIENT = `linear-gradient(135deg, ${resolveColor('surface-elevated')} 0%, ${resolveColor('surface-raised')} 100%)`\n\n/** Gauge track gradient (teal -> amber -> red) at 0.25 alpha. */\nconst GAUGE_GRADIENT =\n 'linear-gradient(90deg, rgba(46,213,115,0.25) 0%, rgba(249,180,21,0.25) 50%, rgba(209,67,67,0.25) 100%)'\n\nexport type MesoStatusBadgeVariant = 'success' | 'warning' | 'error'\n\nconst STATUS_VARIANTS: Record<\n MesoStatusBadgeVariant,\n { bg: string; border: string; text: string }\n> = {\n success: { bg: 'rgba(46,213,115,0.15)', border: 'rgba(46,213,115,0.3)', text: SUCCESS },\n warning: { bg: 'rgba(249,180,21,0.15)', border: 'rgba(249,180,21,0.3)', text: WARNING },\n error: { bg: 'rgba(209,67,67,0.15)', border: 'rgba(209,67,67,0.25)', text: ERROR },\n}\n\nexport interface MesoStatusBadge {\n /** Short status label, e.g. \"On Track\". */\n label: string\n /** Color treatment for the badge. */\n variant: MesoStatusBadgeVariant\n}\n\nexport interface MesoStatusMetric {\n /** Cell label, e.g. \"Prescribed\". */\n label: string\n /** Cell value, e.g. \"3×8 @ RPE 8\". */\n value: string\n}\n\nexport interface MesoStatusGauge {\n /** Gauge label, e.g. \"Intensity\". */\n label: string\n /** Fill position 0-1; the 14px marker sits at this level. */\n level: number\n /** Optional right-aligned sublabel, e.g. \"Prescribed\". */\n sublabel?: string\n}\n\nexport interface MesoStatusCoaching {\n /** Coaching recommendation copy. */\n text: string\n /** Substrings within `text` to render in bold. */\n highlights?: string[]\n}\n\nexport interface MesoStatusNextTarget {\n /** Leading glyph/emoji, e.g. \"→\" or \"🎯\". */\n icon: string\n /** Next-session target copy. */\n text: string\n}\n\nexport interface MesoStatusCardProps extends ViewProps {\n /** Mesocycle name, e.g. \"Hypertrophy Block\". */\n mesoName: string\n /** Context line, e.g. \"Week 6 of 8 · Upper/Lower\". */\n mesoSubtitle: string\n /** Status pill in the header. */\n statusBadge: MesoStatusBadge\n /** Prescription-vs-actual metrics rendered as a 2x2 grid. */\n metrics: MesoStatusMetric[]\n /** Intensity / volume gauges stacked vertically. */\n gauges: MesoStatusGauge[]\n /** Optional coaching recommendation box. */\n coaching?: MesoStatusCoaching\n /** Optional next-session target box. */\n nextTarget?: MesoStatusNextTarget\n className?: string\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** Marker fill color by gauge zone: teal 0-0.4, amber 0.4-0.7, red 0.7-1.0. */\nfunction getGaugeZoneColor(level: number): string {\n if (level >= 0.7) return ERROR\n if (level >= 0.4) return WARNING\n return SUCCESS\n}\n\n/** Splits `text` into nodes, bolding any segment that exactly matches a highlight. */\nfunction renderCoachingText(text: string, highlights?: string[]): ReactNode {\n if (!highlights || highlights.length === 0) return text\n const escaped = highlights\n .filter(Boolean)\n .map((h) => h.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n if (escaped.length === 0) return text\n const regex = new RegExp(`(${escaped.join('|')})`, 'g')\n return text.split(regex).map((part, index) =>\n highlights.includes(part) ? (\n <Text\n key={`${part}-${index}`}\n className=\"text-text-primary\"\n style={{ fontWeight: '700' }}\n >\n {part}\n </Text>\n ) : (\n <Fragment key={`t-${index}`}>{part}</Fragment>\n ),\n )\n}\n\nfunction StatusPill({ badge }: { badge: MesoStatusBadge }) {\n const colors = STATUS_VARIANTS[badge.variant]\n return (\n <View\n className=\"flex-row items-center\"\n style={{\n gap: 5,\n paddingVertical: 3,\n paddingHorizontal: 8,\n borderRadius: 4,\n borderWidth: 1,\n backgroundColor: colors.bg,\n borderColor: colors.border,\n }}\n testID=\"meso-status-card-badge\"\n >\n <View accessibilityElementsHidden>\n <StatusDot variant={badge.variant} size=\"sm\" />\n </View>\n <Text\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n letterSpacing: 0.3,\n color: colors.text,\n }}\n >\n {badge.label}\n </Text>\n </View>\n )\n}\n\nfunction MetricCell({ metric }: { metric: MesoStatusMetric }) {\n return (\n <View style={{ width: '48%' }} testID=\"meso-status-card-metric\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n {metric.label}\n </Text>\n <Text\n className=\"text-text-primary\"\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n {metric.value}\n </Text>\n </View>\n )\n}\n\nfunction Gauge({ gauge }: { gauge: MesoStatusGauge }) {\n const level = clamp01(gauge.level)\n const percentage = Math.round(level * 100)\n const markerColor = getGaugeZoneColor(level)\n return (\n <View\n style={{ gap: 6 }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: 100, now: percentage }}\n accessibilityLabel={`${gauge.label}: ${percentage}%`}\n aria-valuenow={percentage}\n aria-valuemin={0}\n aria-valuemax={100}\n testID=\"meso-status-card-gauge\"\n >\n <View\n className=\"flex-row items-center justify-between\"\n accessibilityElementsHidden\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n {gauge.label}\n </Text>\n {gauge.sublabel != null && (\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n }}\n >\n {gauge.sublabel}\n </Text>\n )}\n </View>\n\n <View\n style={\n {\n height: 8,\n borderRadius: 4,\n position: 'relative',\n backgroundImage: GAUGE_GRADIENT,\n } as ViewStyle\n }\n accessibilityElementsHidden\n >\n <View\n style={{\n position: 'absolute',\n left: '50%',\n top: 0,\n bottom: 0,\n width: 1,\n marginLeft: -0.5,\n backgroundColor: 'rgba(255,255,255,0.3)',\n }}\n testID=\"meso-status-card-gauge-center\"\n />\n <View\n className=\"border-text-primary\"\n style={{\n position: 'absolute',\n left: `${percentage}%`,\n top: -3,\n marginLeft: -7,\n width: 14,\n height: 14,\n borderRadius: 9999,\n borderWidth: 2,\n backgroundColor: markerColor,\n boxShadow: '0 0 4px rgba(0,0,0,0.5)',\n }}\n testID=\"meso-status-card-gauge-marker\"\n />\n </View>\n </View>\n )\n}\n\n/**\n * Mesocycle context card for a specific exercise: prescription vs actual\n * metrics, intensity/volume gauges, and coaching guidance. Composes the titan\n * `Card` plus the Workout `StatusDot`, and renders the §25 gauge (8px track,\n * 50% center line, 14px marker) inline since that visual differs from the\n * IntensityBar/DeviationBar primitives.\n *\n * @example\n * <MesoStatusCard\n * mesoName=\"Hypertrophy Block\"\n * mesoSubtitle=\"Week 6 of 8 · Upper/Lower\"\n * statusBadge={{ label: 'On Track', variant: 'success' }}\n * metrics={[\n * { label: 'Prescribed', value: '3×8 @ RPE 8' },\n * { label: 'Actual', value: '3×8 @ 185 lbs' },\n * ]}\n * gauges={[{ label: 'Intensity', level: 0.7, sublabel: 'Actual' }]}\n * coaching={{ text: 'Add load next session.', highlights: ['Add load'] }}\n * nextTarget={{ icon: '→', text: '190 lbs × 8' }}\n * />\n */\nexport function MesoStatusCard({\n mesoName,\n mesoSubtitle,\n statusBadge,\n metrics,\n gauges,\n coaching,\n nextTarget,\n className,\n ...props\n}: MesoStatusCardProps) {\n return (\n <Card\n variant=\"outline\"\n elevation={1}\n borderColor={BRAND_PRIMARY_DARK}\n className={className}\n style={\n {\n borderColor: BRAND_PRIMARY_DARK,\n borderWidth: 1,\n backgroundImage: CARD_GRADIENT,\n } as ViewStyle\n }\n role=\"article\"\n aria-label={`Mesocycle status for ${mesoName}`}\n testID=\"meso-status-card\"\n {...props}\n >\n <View\n className=\"flex-row\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, zIndex: 1 }}\n accessibilityElementsHidden\n testID=\"meso-status-card-accent\"\n >\n {ACCENT_STOPS.map((color) => (\n <View key={color} style={{ flex: 1, backgroundColor: color }} />\n ))}\n </View>\n\n <View style={{ padding: 14, gap: 14 }} testID=\"meso-status-card-body\">\n <View testID=\"meso-status-card-header\">\n <View\n className=\"flex-row items-center justify-between\"\n style={{ gap: 8 }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n flexShrink: 1,\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"meso-status-card-name\"\n >\n {mesoName}\n </Text>\n <StatusPill badge={statusBadge} />\n </View>\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"meso-status-card-subtitle\"\n >\n {mesoSubtitle}\n </Text>\n </View>\n\n {metrics.length > 0 && (\n <View\n className=\"flex-row flex-wrap\"\n style={{ gap: 8 }}\n testID=\"meso-status-card-metrics\"\n >\n {metrics.map((metric, index) => (\n <MetricCell key={`${metric.label}-${index}`} metric={metric} />\n ))}\n </View>\n )}\n\n {gauges.length > 0 && (\n <View style={{ gap: 12 }} testID=\"meso-status-card-gauges\">\n {gauges.map((gauge, index) => (\n <Gauge key={`${gauge.label}-${index}`} gauge={gauge} />\n ))}\n </View>\n )}\n\n {coaching != null && (\n <View\n style={{\n backgroundColor: 'rgba(249,180,21,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(249,180,21,0.15)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-coaching\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 12,\n lineHeight: 17,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {renderCoachingText(coaching.text, coaching.highlights)}\n </Text>\n </View>\n )}\n\n {nextTarget != null && (\n <View\n className=\"flex-row items-center\"\n style={{\n gap: 8,\n backgroundColor: 'rgba(46,213,115,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(46,213,115,0.2)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-next-target\"\n >\n <Text style={{ fontSize: 14, color: SUCCESS }} accessibilityElementsHidden>\n {nextTarget.icon}\n </Text>\n <Text\n style={{\n flexShrink: 1,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: SUCCESS,\n }}\n >\n {nextTarget.text}\n </Text>\n </View>\n )}\n </View>\n </Card>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useMemo, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst sem = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = sem['brand-primary']\n// Line/border color for the dashed projection, used where a className cannot\n// apply (passed as a prop into an inline style, and a per-edge borderTopColor).\nconst PROJECTION_LINE_COLOR = resolveColor('text-tertiary')\nconst STATUS_SUCCESS = sem['status-success']\nconst STATUS_ERROR = sem['status-error']\nconst STATUS_WARNING = sem['status-warning']\nconst GRID_LINE = 'rgba(255,255,255,0.06)'\nconst SUCCESS_PILL_BG = 'rgba(46,213,115,0.10)'\nconst SUCCESS_PILL_BORDER = 'rgba(46,213,115,0.20)'\nconst ERROR_PILL_BG = 'rgba(209,67,67,0.10)'\nconst ERROR_PILL_BORDER = 'rgba(209,67,67,0.20)'\n\n/** Left gutter reserved for y-axis value labels. */\nconst PLOT_LEFT = 26\n/** Approximate tooltip width used for edge clamping. */\nconst TOOLTIP_WIDTH = 124\n\nexport interface StrengthTrendDataPoint {\n /** ISO date string for the session. */\n date: string\n /** Estimated one-rep max in the chart's unit. */\n e1rm: number\n /** Marks a personal-record session (rendered with a star). */\n isPR?: boolean\n /** Optional human label shown in the tooltip instead of the raw date. */\n sessionLabel?: string\n}\n\nexport interface StrengthTrendChartMesoBoundary {\n /** ISO date where the mesocycle boundary falls. */\n date: string\n /** Short label, e.g. \"Hypertrophy\". */\n label: string\n}\n\nexport interface StrengthTrendChartProps extends ViewProps {\n /** Actual e1RM data points, chronological. */\n data: StrengthTrendDataPoint[]\n /** Projected/planned e1RM trajectory, drawn as a dashed line. */\n projection?: StrengthTrendDataPoint[]\n /** Chart plot width in pixels. */\n width: number\n /** Chart plot height in pixels (120-160 for the compact variant). */\n height: number\n /** Mesocycle boundary markers (vertical guides + labels). */\n mesoBoundaries?: StrengthTrendChartMesoBoundary[]\n /** Called when an actual data point is tapped. */\n onPointPress?: (point: StrengthTrendDataPoint) => void\n /** Unit for display and labels. */\n unit: 'lbs' | 'kg'\n /** Animate the left-to-right line draw on mount (default true). */\n animateOnMount?: boolean\n className?: string\n}\n\ninterface Coord {\n x: number\n y: number\n point: StrengthTrendDataPoint\n index: number\n}\n\ninterface Geometry {\n hasData: boolean\n toX: (time: number) => number\n toY: (value: number) => number\n actual: Coord[]\n projection: Coord[]\n gridLines: Array<{ y: number; label: string }>\n boundaries: Array<{ x: number; label: string }>\n}\n\nfunction timeOf(dateStr: string): number {\n const t = Date.parse(dateStr)\n return Number.isNaN(t) ? 0 : t\n}\n\nfunction formatValue(value: number): string {\n return `${Math.round(value)}`\n}\n\nfunction buildGeometry(\n data: StrengthTrendDataPoint[],\n projection: StrengthTrendDataPoint[],\n boundaries: StrengthTrendChartMesoBoundary[],\n width: number,\n height: number,\n): Geometry {\n const values = [...data, ...projection].map((p) => p.e1rm)\n // Empty state keys off actual data only: a projection with no measured\n // sessions still shows the placeholder rather than a \"Current: 0\" chart.\n if (data.length === 0) {\n return {\n hasData: false,\n toX: () => 0,\n toY: () => 0,\n actual: [],\n projection: [],\n gridLines: [],\n boundaries: [],\n }\n }\n\n const times = [\n ...data.map((p) => timeOf(p.date)),\n ...projection.map((p) => timeOf(p.date)),\n ...boundaries.map((b) => timeOf(b.date)),\n ]\n const tMin = Math.min(...times)\n const tMaxRaw = Math.max(...times)\n const tMax = tMaxRaw === tMin ? tMin + 1 : tMaxRaw\n\n const yMin = Math.min(...values)\n const yMax = Math.max(...values)\n const range = yMax - yMin || Math.max(1, yMax * 0.1)\n const padV = range * 0.15\n const domainMin = yMin - padV\n const domainMax = yMax + padV\n\n const innerW = Math.max(1, width - PLOT_LEFT)\n const toX = (time: number) =>\n PLOT_LEFT + ((time - tMin) / (tMax - tMin)) * innerW\n const toY = (value: number) =>\n height - ((value - domainMin) / (domainMax - domainMin)) * height\n\n const project = (points: StrengthTrendDataPoint[]): Coord[] =>\n points.map((point, index) => ({\n x: toX(timeOf(point.date)),\n y: toY(point.e1rm),\n point,\n index,\n }))\n\n const tickValues = Array.from(\n new Set([yMax, (yMin + yMax) / 2, yMin].map((v) => Math.round(v))),\n )\n const gridLines = tickValues.map((v) => ({ y: toY(v), label: formatValue(v) }))\n\n return {\n hasData: true,\n toX,\n toY,\n actual: project(data),\n projection: project(projection),\n gridLines,\n boundaries: boundaries.map((b) => ({\n x: toX(timeOf(b.date)),\n label: b.label,\n })),\n }\n}\n\nfunction computeTrend(\n data: StrengthTrendDataPoint[],\n boundaries: StrengthTrendChartMesoBoundary[],\n): { percent: number; positive: boolean } {\n if (data.length < 2) return { percent: 0, positive: true }\n let series = data\n if (boundaries.length > 0) {\n const lastBoundary = Math.max(...boundaries.map((b) => timeOf(b.date)))\n const filtered = data.filter((p) => timeOf(p.date) >= lastBoundary)\n // The pill is labelled \"this meso\"; if the current meso has <2 points\n // there is no meso trend to show — stay neutral rather than silently\n // reporting the whole-series change under a \"this meso\" label.\n if (filtered.length < 2) return { percent: 0, positive: true }\n series = filtered\n }\n const first = series[0].e1rm\n const last = series[series.length - 1].e1rm\n const percent = first ? ((last - first) / first) * 100 : 0\n return { percent, positive: percent >= 0 }\n}\n\nfunction ChartLine({\n coords,\n color,\n strokeWidth,\n dashed,\n testID,\n}: {\n coords: Coord[]\n color: string\n strokeWidth: number\n dashed?: boolean\n testID: string\n}) {\n return (\n <>\n {coords.map((c, i) => {\n if (i === 0) return null\n const prev = coords[i - 1]\n const dx = c.x - prev.x\n const dy = c.y - prev.y\n const length = Math.sqrt(dx * dx + dy * dy)\n const angle = Math.atan2(dy, dx) * (180 / Math.PI)\n return (\n <View\n key={`${testID}-${i}`}\n testID={testID}\n accessibilityElementsHidden\n style={[\n {\n position: 'absolute',\n left: prev.x,\n top: prev.y,\n width: length,\n transformOrigin: '0 0',\n transform: [{ rotate: `${angle}deg` }],\n },\n dashed\n ? {\n height: 0,\n borderTopWidth: strokeWidth,\n borderStyle: 'dashed',\n borderTopColor: color,\n }\n : {\n height: strokeWidth,\n borderRadius: strokeWidth / 2,\n backgroundColor: color,\n },\n ]}\n />\n )\n })}\n </>\n )\n}\n\n/**\n * Estimated-1RM line chart over time with an optional dashed plan-projection\n * line and PR star markers. Rendered entirely with absolutely-positioned\n * Views (no SVG), following the Sparkline approach. Tapping an actual point\n * opens a tooltip and fires `onPointPress`. A trend pill below the chart\n * summarizes the percentage change for the current mesocycle.\n *\n * @example\n * <StrengthTrendChart\n * data={[{ date: '2026-01-01', e1rm: 225 }, { date: '2026-02-01', e1rm: 245, isPR: true }]}\n * projection={[{ date: '2026-02-01', e1rm: 245 }, { date: '2026-03-01', e1rm: 260 }]}\n * width={320}\n * height={150}\n * unit=\"lbs\"\n * />\n */\nexport function StrengthTrendChart({\n data,\n projection = [],\n width,\n height,\n mesoBoundaries = [],\n onPointPress,\n unit,\n animateOnMount = true,\n className,\n ...props\n}: StrengthTrendChartProps) {\n const geometry = useMemo(\n () => buildGeometry(data, projection, mesoBoundaries, width, height),\n [data, projection, mesoBoundaries, width, height],\n )\n const trend = useMemo(\n () => computeTrend(data, mesoBoundaries),\n [data, mesoBoundaries],\n )\n\n const [reveal] = useState(() => new Animated.Value(animateOnMount ? 0 : 1))\n const [selected, setSelected] = useState<number | null>(null)\n\n useEffect(() => {\n if (!animateOnMount) return\n const animation = Animated.timing(reveal, {\n toValue: 1,\n duration: 600,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [animateOnMount, reveal])\n\n const current = data.length > 0 ? data[data.length - 1].e1rm : 0\n const trendSign = trend.percent >= 0 ? '+' : '-'\n const trendText = `${trendSign}${Math.abs(trend.percent).toFixed(1)}% this meso`\n const ariaLabel = geometry.hasData\n ? `Strength trend chart showing estimated one rep max over time. Current: ${formatValue(current)} ${unit}. Trend: ${trendSign}${Math.abs(trend.percent).toFixed(1)}%`\n : 'Strength trend chart, no data'\n\n if (!geometry.hasData) {\n return (\n <View\n style={{ width }}\n className={cn(className)}\n accessibilityRole=\"image\"\n accessibilityLabel={ariaLabel}\n testID=\"strength-trend-chart-empty\"\n {...props}\n >\n <View\n style={{\n width,\n height,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Text className=\"text-text-tertiary\" style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}>\n No strength data yet\n </Text>\n </View>\n </View>\n )\n }\n\n const revealWidth = reveal.interpolate({\n inputRange: [0, 1],\n outputRange: [0, width],\n })\n\n const selectedCoord =\n selected != null ? geometry.actual[selected] : undefined\n\n return (\n <View\n style={{ width }}\n className={cn(className)}\n testID=\"strength-trend-chart\"\n {...props}\n >\n <View style={{ width, height, position: 'relative' }}>\n {/* Labelled, non-interactive chart canvas (grid + lines + markers). */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n accessibilityRole=\"image\"\n accessibilityLabel={ariaLabel}\n testID=\"strength-trend-chart-canvas\"\n >\n {geometry.gridLines.map((line, i) => (\n <View\n key={`grid-${i}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-gridline\"\n style={{\n position: 'absolute',\n left: PLOT_LEFT,\n right: 0,\n top: line.y,\n height: 1,\n backgroundColor: GRID_LINE,\n }}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: -PLOT_LEFT,\n top: -6,\n width: PLOT_LEFT - 4,\n textAlign: 'right',\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {line.label}\n </Text>\n </View>\n ))}\n\n {geometry.boundaries.map((boundary, i) => (\n <View\n key={`boundary-${i}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-meso-boundary\"\n style={{\n position: 'absolute',\n left: boundary.x,\n top: 0,\n width: 0,\n height,\n borderLeftWidth: 1,\n borderStyle: 'dashed',\n borderLeftColor: 'rgba(255,255,255,0.10)',\n }}\n />\n ))}\n\n <Animated.View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: revealWidth,\n height,\n overflow: 'hidden',\n }}\n testID=\"strength-trend-chart-reveal\"\n >\n <View style={{ width, height, position: 'absolute', top: 0, left: 0 }}>\n <ChartLine\n coords={geometry.projection}\n color={PROJECTION_LINE_COLOR}\n strokeWidth={2}\n dashed\n testID=\"strength-trend-chart-projection-segment\"\n />\n <ChartLine\n coords={geometry.actual}\n color={BRAND_PRIMARY}\n strokeWidth={2.5}\n testID=\"strength-trend-chart-actual-segment\"\n />\n </View>\n </Animated.View>\n\n {geometry.actual.map((c) =>\n c.point.isPR ? (\n <Text\n key={`star-${c.index}`}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-pr-star\"\n style={{\n position: 'absolute',\n left: c.x - 7,\n top: c.y - 20,\n fontSize: 12,\n color: STATUS_WARNING,\n }}\n >\n ★\n </Text>\n ) : null,\n )}\n </View>\n\n {/* Interactive point overlay (kept out of the image-role canvas). */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n testID=\"strength-trend-chart-points\"\n >\n {geometry.actual.map((c) => {\n const label = c.point.sessionLabel ?? c.point.date\n return (\n <Pressable\n key={`point-${c.index}`}\n testID=\"strength-trend-chart-point\"\n accessibilityRole=\"button\"\n accessibilityLabel={`${label}: ${formatValue(c.point.e1rm)} ${unit}${c.point.isPR ? ', personal record' : ''}`}\n onPress={() => {\n setSelected(c.index)\n onPointPress?.(c.point)\n }}\n style={{\n position: 'absolute',\n left: c.x - 4,\n top: c.y - 4,\n width: 8,\n height: 8,\n borderRadius: 1,\n backgroundColor: BRAND_PRIMARY,\n }}\n />\n )\n })}\n </View>\n\n {selectedCoord && (\n <View\n testID=\"strength-trend-chart-tooltip\"\n accessibilityElementsHidden\n className=\"bg-surface-elevated border-border-strong\"\n style={{\n position: 'absolute',\n left: Math.max(\n 0,\n Math.min(width - TOOLTIP_WIDTH, selectedCoord.x - TOOLTIP_WIDTH / 2),\n ),\n top: Math.max(0, selectedCoord.y - 52),\n maxWidth: TOOLTIP_WIDTH,\n borderWidth: 1,\n borderRadius: 8,\n paddingVertical: 8,\n paddingHorizontal: 10,\n }}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {selectedCoord.point.sessionLabel ?? selectedCoord.point.date}\n </Text>\n <Text\n className=\"text-text-primary\"\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '700',\n }}\n >\n {`${formatValue(selectedCoord.point.e1rm)} ${unit}`}\n </Text>\n {selected != null && selected > 0 && (\n <Text\n style={{\n marginTop: 1,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n color:\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0\n ? STATUS_SUCCESS\n : STATUS_ERROR,\n }}\n >\n {`${\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm >= 0\n ? '+'\n : '-'\n }${Math.abs(\n selectedCoord.point.e1rm - geometry.actual[selected - 1].point.e1rm,\n ).toFixed(1)} ${unit}`}\n </Text>\n )}\n </View>\n )}\n </View>\n\n {/* Meso boundary x-axis labels. */}\n {geometry.boundaries.length > 0 && (\n <View\n style={{ width, height: 14, position: 'relative', marginTop: 2 }}\n accessibilityElementsHidden\n testID=\"strength-trend-chart-axis\"\n >\n {geometry.boundaries.map((boundary, i) => (\n <Text\n key={`axis-${i}`}\n testID=\"strength-trend-chart-axis-label\"\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: boundary.x - 24,\n width: 48,\n textAlign: 'center',\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n >\n {boundary.label}\n </Text>\n ))}\n </View>\n )}\n\n {/* Trend pill. */}\n <View className=\"flex-row\" style={{ marginTop: 8 }}>\n <View\n testID=\"strength-trend-chart-trend-pill\"\n accessibilityLabel={`Strength trend: ${trendText}`}\n style={{\n paddingVertical: 3,\n paddingHorizontal: 8,\n borderRadius: 4,\n borderWidth: 1,\n backgroundColor: trend.positive ? SUCCESS_PILL_BG : ERROR_PILL_BG,\n borderColor: trend.positive ? SUCCESS_PILL_BORDER : ERROR_PILL_BORDER,\n }}\n >\n <Text\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: trend.positive ? STATUS_SUCCESS : STATUS_ERROR,\n }}\n >\n {trendText}\n </Text>\n </View>\n </View>\n\n {/* Legend. */}\n <View\n className=\"flex-row items-center\"\n style={{ marginTop: 8, gap: 14 }}\n testID=\"strength-trend-chart-legend\"\n >\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <View style={{ width: 14, height: 2.5, borderRadius: 1.5, backgroundColor: BRAND_PRIMARY }} />\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n Actual\n </Text>\n </View>\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <View\n style={{\n width: 14,\n height: 0,\n borderTopWidth: 2,\n borderStyle: 'dashed',\n borderTopColor: PROJECTION_LINE_COLOR,\n }}\n />\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n Projected\n </Text>\n </View>\n <View className=\"flex-row items-center\" style={{ gap: 5 }}>\n <Text style={{ fontSize: 12, color: STATUS_WARNING }}>★</Text>\n <Text className=\"text-text-secondary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif' }}>\n PR\n </Text>\n </View>\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState, useMemo } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nconst STATUS_SUCCESS = t['status-success']\nconst STATUS_WARNING = t['status-warning']\nconst STATUS_INFO = t['status-info']\n/** Dot outline: near-white ring so load dots read on the band fill and any\n * surface (matches the MesoStatusCard gauge-marker convention). */\nconst DOT_BORDER = '#F3F4F6'\nconst BAND_FILL = 'rgba(46,213,115,0.1)'\nconst BAND_EDGE = 'rgba(46,213,115,0.45)'\nconst PROJECTION_FILL = 'rgba(46,213,115,0.05)'\n\nconst PADDING_LEFT = 28\nconst PADDING_RIGHT = 10\nconst PADDING_TOP = 8\nconst PADDING_BOTTOM = 16\nconst COLUMN_STEP = 4\nconst DOT_SIZE = 8\n\nexport type WorkoutDotStatus = 'within' | 'above' | 'below'\n\nexport interface CapacityBandDataPoint {\n /** ISO-ish date string (e.g. \"2026-06-01\"). */\n date: string\n /** Lower bound of the capacity band (MEV equivalent). */\n bandLow: number\n /** Upper bound of the capacity band (MRV equivalent). */\n bandHigh: number\n}\n\nexport interface WorkoutDot {\n date: string\n /** Actual session load score. */\n load: number\n /** Position of the session relative to the band. */\n status: WorkoutDotStatus\n}\n\nexport interface CapacityBandProjection {\n /** Band shape over the next days if training continues (rises). */\n withTraining: CapacityBandDataPoint[]\n /** Band shape over the next days if resting (drops). */\n withRest: CapacityBandDataPoint[]\n}\n\nexport interface CapacityBandChartProps extends ViewProps {\n /** Capacity band shape over time. */\n band: CapacityBandDataPoint[]\n /** Workout sessions plotted as dots. */\n workouts: WorkoutDot[]\n /** Optional forward projection (next few days). */\n projection?: CapacityBandProjection\n /** Chart width in px. */\n width: number\n /** Chart height in px. */\n height: number\n /** Called when a workout dot is tapped. */\n onWorkoutPress?: (workout: WorkoutDot) => void\n className?: string\n}\n\ninterface PixelPoint {\n x: number\n yHigh: number\n yLow: number\n}\n\nconst DOT_COLORS: Record<WorkoutDotStatus, string> = {\n within: STATUS_SUCCESS,\n above: STATUS_WARNING,\n below: STATUS_INFO,\n}\n\nconst STATUS_PHRASES: Record<WorkoutDotStatus, string> = {\n within: 'within range',\n above: 'above range',\n below: 'below range',\n}\n\nfunction parseTime(date: string): number {\n const parts = date.split('-')\n if (parts.length === 3) {\n return Date.UTC(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2]))\n }\n const parsed = Date.parse(date)\n return Number.isNaN(parsed) ? 0 : parsed\n}\n\nfunction formatDate(date: string): string {\n const parts = date.split('-')\n if (parts.length === 3) return `${Number(parts[1])}/${Number(parts[2])}`\n const d = new Date(date)\n return Number.isNaN(d.getTime()) ? date : `${d.getMonth() + 1}/${d.getDate()}`\n}\n\nfunction toPixels(\n points: CapacityBandDataPoint[],\n toX: (date: string) => number,\n toY: (value: number) => number,\n): PixelPoint[] {\n return points\n .map((p) => ({ x: toX(p.date), yHigh: toY(p.bandHigh), yLow: toY(p.bandLow) }))\n .sort((a, b) => a.x - b.x)\n}\n\nfunction interpEdge(pixels: PixelPoint[], x: number, key: 'yHigh' | 'yLow'): number {\n for (let i = 0; i < pixels.length - 1; i++) {\n const a = pixels[i]\n const b = pixels[i + 1]\n if (x >= a.x && x <= b.x) {\n const t = b.x === a.x ? 0 : (x - a.x) / (b.x - a.x)\n return a[key] + t * (b[key] - a[key])\n }\n }\n return pixels[pixels.length - 1][key]\n}\n\nfunction buildColumns(pixels: PixelPoint[], step: number) {\n if (pixels.length < 2) return []\n const start = pixels[0].x\n const end = pixels[pixels.length - 1].x\n const columns: Array<{ x: number; top: number; height: number }> = []\n for (let x = start; x < end; x += step) {\n const top = interpEdge(pixels, x, 'yHigh')\n const bottom = interpEdge(pixels, x, 'yLow')\n columns.push({ x, top, height: Math.max(0, bottom - top) })\n }\n return columns\n}\n\nfunction buildEdges(pixels: PixelPoint[], key: 'yHigh' | 'yLow') {\n const segments: Array<{ left: number; top: number; length: number; angle: number }> = []\n for (let i = 1; i < pixels.length; i++) {\n const a = pixels[i - 1]\n const b = pixels[i]\n const dx = b.x - a.x\n const dy = b[key] - a[key]\n segments.push({\n left: a.x,\n top: a[key],\n length: Math.sqrt(dx * dx + dy * dy),\n angle: Math.atan2(dy, dx) * (180 / Math.PI),\n })\n }\n return segments\n}\n\nfunction collectValues(\n band: CapacityBandDataPoint[],\n workouts: WorkoutDot[],\n projection?: CapacityBandProjection,\n): number[] {\n const values: number[] = []\n band.forEach((p) => values.push(p.bandLow, p.bandHigh))\n workouts.forEach((w) => values.push(w.load))\n projection?.withTraining.forEach((p) => values.push(p.bandLow, p.bandHigh))\n projection?.withRest.forEach((p) => values.push(p.bandLow, p.bandHigh))\n return values\n}\n\nfunction currentStatus(workouts: WorkoutDot[]): string {\n if (workouts.length === 0) return 'no recent sessions'\n const latest = [...workouts].sort((a, b) => parseTime(b.date) - parseTime(a.date))[0]\n return STATUS_PHRASES[latest.status]\n}\n\n/**\n * Gentler-Streak-inspired fatigue visualization. Renders a shaded capacity\n * band (between a rolling MEV/MRV estimate), workout sessions as colored dots\n * positioned by load, and an optional dashed forward projection that diverges\n * for \"keep training\" (rises) versus \"rest\" (drops). View-based, no SVG:\n * the band fill is a run of vertical columns and the edges/projection are\n * rotated line Views (same technique as Sparkline).\n *\n * @example\n * <CapacityBandChart\n * band={band}\n * workouts={workouts}\n * projection={{ withTraining, withRest }}\n * width={320}\n * height={180}\n * onWorkoutPress={(w) => openSession(w)}\n * />\n */\nexport function CapacityBandChart({\n band,\n workouts,\n projection,\n width,\n height,\n onWorkoutPress,\n className,\n ...props\n}: CapacityBandChartProps) {\n const [reveal] = useState(() => new Animated.Value(0))\n const dotAnims = useMemo(\n () => Array.from({ length: workouts.length }, () => new Animated.Value(0)),\n [workouts.length],\n )\n\n useEffect(() => {\n reveal.setValue(0)\n dotAnims.forEach((a) => a.setValue(0))\n const draw = Animated.timing(reveal, {\n toValue: 1,\n duration: 800,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n const pops = dotAnims.map((a) =>\n Animated.timing(a, {\n toValue: 1,\n duration: 200,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n )\n const animation = Animated.sequence([draw, Animated.stagger(200, pops)])\n animation.start()\n return () => animation.stop()\n }, [reveal, dotAnims, band.length, workouts.length])\n\n const plotWidth = width - PADDING_LEFT - PADDING_RIGHT\n const plotHeight = height - PADDING_TOP - PADDING_BOTTOM\n\n const scale = useMemo(() => {\n const times = band.map((p) => parseTime(p.date))\n projection?.withTraining.forEach((p) => times.push(parseTime(p.date)))\n projection?.withRest.forEach((p) => times.push(parseTime(p.date)))\n const minT = times.length ? Math.min(...times) : 0\n const maxT = times.length ? Math.max(...times) : 1\n const tRange = maxT - minT || 1\n\n const values = collectValues(band, workouts, projection)\n const minV = values.length ? Math.min(...values) : 0\n const maxV = values.length ? Math.max(...values) : 1\n const pad = (maxV - minV) * 0.1 || 1\n const domainMin = minV - pad\n const domainMax = maxV + pad\n const vRange = domainMax - domainMin || 1\n\n const toX = (date: string) =>\n PADDING_LEFT + ((parseTime(date) - minT) / tRange) * plotWidth\n const toY = (value: number) =>\n PADDING_TOP + (1 - (value - domainMin) / vRange) * plotHeight\n return { toX, toY }\n }, [band, workouts, projection, plotWidth, plotHeight])\n\n if (band.length === 0) {\n return (\n <View\n style={{ width, height }}\n className={className}\n accessibilityRole=\"image\"\n accessibilityLabel=\"Training capacity band chart, no data\"\n testID=\"capacity-band-chart-empty\"\n {...props}\n />\n )\n }\n\n const { toX, toY } = scale\n const bandPixels = toPixels(band, toX, toY)\n const columns = buildColumns(bandPixels, COLUMN_STEP)\n const topEdge = buildEdges(bandPixels, 'yHigh')\n const bottomEdge = buildEdges(bandPixels, 'yLow')\n\n const lastBandPoint = band[band.length - 1]\n const trainingPixels = projection\n ? toPixels([lastBandPoint, ...projection.withTraining], toX, toY)\n : []\n const restPixels = projection\n ? toPixels([lastBandPoint, ...projection.withRest], toX, toY)\n : []\n\n const labelStride = Math.max(1, Math.ceil(band.length / 5))\n const revealWidth = reveal.interpolate({ inputRange: [0, 1], outputRange: [0, width] })\n\n const renderColumns = (cols: ReturnType<typeof buildColumns>, color: string, key: string) =>\n cols.map((col, i) => (\n <View\n key={`${key}-${i}`}\n style={{\n position: 'absolute',\n left: col.x,\n top: col.top,\n width: COLUMN_STEP + 0.5,\n height: col.height,\n backgroundColor: color,\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID={key}\n />\n ))\n\n const renderEdges = (\n segments: ReturnType<typeof buildEdges>,\n color: string,\n dashed: boolean,\n key: string,\n ) =>\n segments.map((seg, i) => (\n <View\n key={`${key}-${i}`}\n style={{\n position: 'absolute',\n left: seg.left,\n top: seg.top,\n width: seg.length,\n height: dashed ? 0 : 1.5,\n borderTopWidth: dashed ? 1 : 0,\n borderTopColor: dashed ? color : undefined,\n borderStyle: dashed ? 'dashed' : 'solid',\n backgroundColor: dashed ? undefined : color,\n opacity: dashed ? 0.7 : 1,\n transformOrigin: '0 0',\n transform: [{ rotate: `${seg.angle}deg` }],\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID={key}\n />\n ))\n\n return (\n <View\n style={{ width, height, position: 'relative' }}\n className={className}\n testID=\"capacity-band-chart-root\"\n {...props}\n >\n {/* Static visual layer carries the image role; interactive dots live as\n siblings so the image role has no focusable descendants. */}\n <View\n style={{ position: 'absolute', top: 0, left: 0, width, height }}\n accessibilityRole=\"image\"\n accessibilityLabel={`Training capacity band chart. Current capacity: ${currentStatus(\n workouts,\n )}. ${workouts.length} workout${workouts.length === 1 ? '' : 's'} shown.`}\n testID=\"capacity-band-chart\"\n >\n {/* Band + projection draw left-to-right via an animated clip. */}\n <Animated.View\n style={{ position: 'absolute', top: 0, left: 0, height, width: revealWidth, overflow: 'hidden' }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-reveal\"\n >\n <View style={{ width, height, position: 'relative' }}>\n {projection && (\n <View testID=\"capacity-band-chart-projection\">\n {renderColumns(buildColumns(trainingPixels, COLUMN_STEP), PROJECTION_FILL, 'capacity-band-chart-projection-fill')}\n {renderColumns(buildColumns(restPixels, COLUMN_STEP), PROJECTION_FILL, 'capacity-band-chart-projection-fill')}\n {renderEdges(buildEdges(trainingPixels, 'yHigh'), STATUS_SUCCESS, true, 'capacity-band-chart-projection-training')}\n {renderEdges(buildEdges(trainingPixels, 'yLow'), STATUS_SUCCESS, true, 'capacity-band-chart-projection-training')}\n {renderEdges(buildEdges(restPixels, 'yHigh'), STATUS_INFO, true, 'capacity-band-chart-projection-rest')}\n {renderEdges(buildEdges(restPixels, 'yLow'), STATUS_INFO, true, 'capacity-band-chart-projection-rest')}\n <Text\n style={{\n position: 'absolute',\n left: trainingPixels[trainingPixels.length - 1]?.x + 2,\n top: trainingPixels[trainingPixels.length - 1]?.yHigh - 12,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n color: STATUS_SUCCESS,\n }}\n testID=\"capacity-band-chart-projection-training-label\"\n >\n Training\n </Text>\n <Text\n style={{\n position: 'absolute',\n left: restPixels[restPixels.length - 1]?.x + 2,\n top: restPixels[restPixels.length - 1]?.yLow + 2,\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n color: STATUS_INFO,\n }}\n testID=\"capacity-band-chart-projection-rest-label\"\n >\n Rest\n </Text>\n </View>\n )}\n\n <View testID=\"capacity-band-chart-band\">\n {renderColumns(columns, BAND_FILL, 'capacity-band-chart-band-cell')}\n </View>\n {renderEdges(topEdge, BAND_EDGE, false, 'capacity-band-chart-edge-top')}\n {renderEdges(bottomEdge, BAND_EDGE, false, 'capacity-band-chart-edge-bottom')}\n </View>\n </Animated.View>\n\n {/* Y axis conceptual label (no numbers). */}\n <Text\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: PADDING_LEFT / 2 - 14,\n top: PADDING_TOP + plotHeight / 2 - 7,\n width: 32,\n textAlign: 'center',\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n transform: [{ rotate: '-90deg' }],\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-y-axis-label\"\n >\n Load\n </Text>\n\n {/* X axis date labels (subset to avoid overlap). */}\n {band.map((point, i) => {\n if (i % labelStride !== 0 && i !== band.length - 1) return null\n return (\n <Text\n key={`x-${point.date}`}\n className=\"text-text-tertiary\"\n style={{\n position: 'absolute',\n left: toX(point.date) - 14,\n top: height - PADDING_BOTTOM + 2,\n width: 28,\n textAlign: 'center',\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n }}\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"capacity-band-chart-x-label\"\n >\n {formatDate(point.date)}\n </Text>\n )\n })}\n </View>\n\n {/* Workout dots — scale in after the band draws. */}\n {workouts.map((workout, i) => {\n const cx = toX(workout.date)\n const cy = toY(workout.load)\n const color = DOT_COLORS[workout.status]\n const dotStyle = {\n width: DOT_SIZE,\n height: DOT_SIZE,\n borderRadius: DOT_SIZE / 2,\n backgroundColor: color,\n borderWidth: 2,\n borderColor: DOT_BORDER,\n }\n const label = `Workout on ${formatDate(workout.date)}, load ${workout.load}, ${\n STATUS_PHRASES[workout.status]\n }`\n return (\n <Animated.View\n key={`dot-${workout.date}-${i}`}\n style={{\n position: 'absolute',\n left: cx - DOT_SIZE / 2,\n top: cy - DOT_SIZE / 2,\n transform: [{ scale: dotAnims[i] ?? 1 }],\n }}\n testID=\"capacity-band-chart-dot-wrapper\"\n >\n {onWorkoutPress ? (\n <Pressable\n onPress={() => onWorkoutPress(workout)}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n style={dotStyle}\n testID=\"capacity-band-chart-dot\"\n />\n ) : (\n <View\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={dotStyle}\n testID=\"capacity-band-chart-dot\"\n />\n )}\n </Animated.View>\n )\n })}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { MesoStatusCard, type MesoStatusCardProps } from './MesoStatusCard'\nimport {\n StrengthTrendChart,\n type StrengthTrendDataPoint,\n type StrengthTrendChartMesoBoundary,\n} from './StrengthTrendChart'\nimport {\n CapacityBandChart,\n type CapacityBandDataPoint,\n type CapacityBandProjection,\n type WorkoutDot,\n} from './CapacityBandChart'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport { type SetRowProps } from './SetRow'\nimport {\n VelocityStrip,\n calculateMeanVelocity,\n calculateVelocityLoss,\n type VelocityZoneBandProp,\n} from './VelocityStrip'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { cn } from '../../../utils/cn'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** Inner plot width: page width 390 − 16 page padding − 12 card padding on each side. */\nconst CHART_WIDTH = 326\nconst CHART_HEIGHT = 150\n\n/** Which tab of the exercise detail view is showing. */\nexport type ExerciseDetailTab = 'progress' | 'history' | 'advanced'\n\n/** Tabs in display order. */\nexport const EXERCISE_DETAIL_TABS: Array<{ key: ExerciseDetailTab; label: string }> = [\n { key: 'progress', label: 'Progress' },\n { key: 'history', label: 'History' },\n { key: 'advanced', label: 'Advanced' },\n]\n\n/** Identity + headline stats for the exercise being inspected. */\nexport interface ExerciseDetailHeader {\n /** Exercise name, e.g. \"Barbell Bench Press\". */\n name: string\n /** Context line, e.g. \"Chest · Barbell\". */\n subtitle: string\n /** Unit used across the page. */\n unit: 'lbs' | 'kg'\n /** Current estimated one-rep max, shown as a header pill. */\n currentE1rm?: number\n}\n\n/**\n * A single expandable entry — one progression week or one logged session.\n * Projected onto an `ExerciseCard`, so it collapses to a summary and expands\n * to its `SetRow` breakdown.\n */\nexport interface ExerciseDetailEntry {\n /** Stable id for inline-expansion selection. */\n id: string\n /** Row title, e.g. \"Week 3\" or \"Mon, Jun 16\". */\n title: string\n /** Collapsed summary (sets × reps @ weight). */\n summary?: ExerciseCardProps['summary']\n /** Estimated one-rep max badge. */\n e1rm?: ExerciseCardProps['e1rm']\n /** Flags a personal-record entry. */\n isPR?: boolean\n /** Prescribed tempo, revealed when expanded. */\n tempo?: ExerciseCardProps['tempo']\n /** Per-set breakdown revealed when expanded. */\n sets: SetRowProps[]\n}\n\n/** Strength-trend inputs for the Progress tab chart. */\nexport interface ExerciseTrend {\n /** Measured e1RM data points, chronological. */\n data: StrengthTrendDataPoint[]\n /** Planned/projected trajectory (dashed line). */\n projection?: StrengthTrendDataPoint[]\n /** Mesocycle boundary guides. */\n mesoBoundaries?: StrengthTrendChartMesoBoundary[]\n}\n\n/** One set's velocity trace for the Advanced tab breakdown. */\nexport interface ExerciseVbtSet {\n /** Row label, e.g. \"Set 1\". */\n label: string\n /** Per-rep mean concentric velocities (m/s). */\n velocities: number[]\n}\n\n/** Velocity-based-training inputs for the Advanced tab. */\nexport interface ExerciseVbt {\n /** Capacity band shape over time. */\n band: CapacityBandDataPoint[]\n /** Sessions plotted against the band. */\n workouts: WorkoutDot[]\n /** Optional forward band projection. */\n projection?: CapacityBandProjection\n /** Per-set velocity traces for the most recent session. */\n sets: ExerciseVbtSet[]\n /** Optional velocity-zone bands for this exercise (WA `VelocityZones.bands`). */\n zones?: readonly VelocityZoneBandProp[]\n}\n\n/** Page-level roll-up of the logged sessions. */\nexport interface ExerciseDetailStats {\n /** Number of logged sessions. */\n sessions: number\n /** Best estimated one-rep max seen, or null if none recorded. */\n bestE1rm: number | null\n /** Count of PR entries. */\n prCount: number\n}\n\n/** Aggregate velocity readout for the Advanced tab. */\nexport interface VbtSummary {\n /** Mean concentric velocity across every logged rep. */\n meanVelocity: number\n /** Worst within-set velocity loss (%), i.e. the most-fatigued set. */\n velocityLoss: number\n}\n\nexport interface ExerciseDetailPageProps extends ViewProps {\n /** Exercise identity + headline stats. */\n exercise: ExerciseDetailHeader\n /** Mesocycle context banner (Progress tab). */\n meso: MesoStatusCardProps\n /** Strength trend inputs (Progress tab). */\n trend: ExerciseTrend\n /** Week-by-week progression entries (Progress tab). */\n progression: ExerciseDetailEntry[]\n /** All logged sessions (History tab). */\n history: ExerciseDetailEntry[]\n /** Velocity-based-training inputs (Advanced tab). */\n vbt: ExerciseVbt\n className?: string\n}\n\n/** Roll up logged sessions into the page summary (pure, testable). */\nexport function deriveExerciseStats(entries: ExerciseDetailEntry[]): ExerciseDetailStats {\n let bestE1rm: number | null = null\n let prCount = 0\n for (const entry of entries) {\n if (entry.e1rm != null && (bestE1rm == null || entry.e1rm.value > bestE1rm)) {\n bestE1rm = entry.e1rm.value\n }\n if (entry.isPR) prCount += 1\n }\n return { sessions: entries.length, bestE1rm, prCount }\n}\n\n/** Project an entry onto ExerciseCard props, wiring inline expansion (pure). */\nexport function toExerciseCardProps(\n entry: ExerciseDetailEntry,\n expanded: boolean,\n onToggle: () => void\n): ExerciseCardProps {\n return {\n name: entry.title,\n state: expanded ? 'expanded' : 'collapsed',\n onToggle,\n summary: entry.summary,\n e1rm: entry.e1rm,\n isPR: entry.isPR,\n tempo: entry.tempo,\n sets: expanded ? entry.sets : undefined,\n }\n}\n\n/** Aggregate per-set velocity traces into the Advanced readout (pure). */\nexport function summarizeVbt(sets: ExerciseVbtSet[]): VbtSummary {\n const allReps = sets.flatMap((set) => set.velocities)\n const meanVelocity = calculateMeanVelocity(allReps)\n let velocityLoss = 0\n for (const set of sets) {\n velocityLoss = Math.max(velocityLoss, calculateVelocityLoss(set.velocities))\n }\n return { meanVelocity, velocityLoss }\n}\n\ninterface TabBarProps {\n active: ExerciseDetailTab\n onSelect: (tab: ExerciseDetailTab) => void\n}\n\nfunction TabBar({ active, onSelect }: TabBarProps) {\n return (\n <View\n className=\"flex-row\"\n style={{\n borderBottomWidth: 1,\n borderBottomColor: resolveColor('border-default'),\n }}\n accessibilityRole={'tablist' as ViewProps['accessibilityRole']}\n testID=\"exercise-detail-page-tabs\"\n >\n {EXERCISE_DETAIL_TABS.map(({ key, label }) => {\n const isActive = key === active\n return (\n <Pressable\n key={key}\n onPress={() => onSelect(key)}\n accessibilityRole=\"tab\"\n accessibilityState={{ selected: isActive }}\n style={{\n flex: 1,\n alignItems: 'center',\n paddingVertical: 10,\n borderBottomWidth: 2,\n borderBottomColor: isActive ? BRAND_PRIMARY : 'transparent',\n }}\n testID={`exercise-detail-page-tab-${key}`}\n >\n <Text\n className={isActive ? 'text-text-primary' : 'text-text-tertiary'}\n style={{\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: isActive ? '700' : '500',\n }}\n >\n {label}\n </Text>\n </Pressable>\n )\n })}\n </View>\n )\n}\n\nconst STAT_CARDS: Array<{ key: keyof ExerciseDetailStats; label: string }> = [\n { key: 'sessions', label: 'Sessions' },\n { key: 'bestE1rm', label: 'Best e1RM' },\n { key: 'prCount', label: 'PRs' },\n]\n\nfunction StatStrip({ stats, unit }: { stats: ExerciseDetailStats; unit: 'lbs' | 'kg' }) {\n return (\n <View className=\"flex-row\" style={{ gap: 8 }} testID=\"exercise-detail-page-stats\">\n {STAT_CARDS.map(({ key, label }) => {\n const raw = stats[key]\n const value = key === 'bestE1rm' ? (raw == null ? '—' : `${raw} ${unit}`) : `${raw}`\n return (\n <View\n key={key}\n className=\"bg-surface-elevated border-border\"\n style={{\n flex: 1,\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n testID={`exercise-detail-page-stat-${key}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 18,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n >\n {value}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n marginTop: 2,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {label}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n\nfunction SectionCard({\n title,\n children,\n testID,\n}: {\n title: string\n children: React.ReactNode\n testID: string\n}) {\n return (\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n gap: 10,\n }}\n testID={testID}\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.6,\n textTransform: 'uppercase',\n }}\n >\n {title}\n </Text>\n {children}\n </View>\n )\n}\n\ninterface EntryListProps {\n entries: ExerciseDetailEntry[]\n expandedId: string | null\n onToggle: (id: string) => void\n emptyLabel: string\n testID: string\n}\n\nfunction EntryList({ entries, expandedId, onToggle, emptyLabel, testID }: EntryListProps) {\n if (entries.length === 0) {\n return (\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`${testID}-empty`}\n >\n {emptyLabel}\n </Text>\n )\n }\n return (\n <View style={{ gap: 8 }} testID={testID}>\n {entries.map((entry) => (\n <ExerciseCard\n key={entry.id}\n {...toExerciseCardProps(entry, entry.id === expandedId, () => onToggle(entry.id))}\n />\n ))}\n </View>\n )\n}\n\nfunction VbtBreakdown({\n sets,\n zones,\n}: {\n sets: ExerciseVbtSet[]\n zones?: readonly VelocityZoneBandProp[]\n}) {\n return (\n <View style={{ gap: 10 }} testID=\"exercise-detail-page-vbt-breakdown\">\n {sets.map((set) => {\n const mean = calculateMeanVelocity(set.velocities)\n const loss = calculateVelocityLoss(set.velocities)\n return (\n <View\n key={set.label}\n className=\"flex-row items-center\"\n style={{ gap: 10 }}\n testID=\"exercise-detail-page-vbt-set\"\n >\n <Text\n className=\"text-text-secondary\"\n style={{\n width: 44,\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n }}\n >\n {set.label}\n </Text>\n <View className=\"flex-1\" style={{ height: 8, justifyContent: 'center' }}>\n <VelocityStrip velocities={set.velocities} zones={zones} variant=\"mini\" />\n </View>\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontVariant: ['tabular-nums'],\n }}\n >\n {`${mean.toFixed(2)} · -${loss}%`}\n </Text>\n </View>\n )\n })}\n </View>\n )\n}\n\nfunction VbtSummaryRow({ summary }: { summary: VbtSummary }) {\n const cells = [\n { label: 'Mean Velocity', value: `${summary.meanVelocity.toFixed(2)} m/s` },\n { label: 'Peak Vel. Loss', value: `-${summary.velocityLoss}%` },\n ]\n return (\n <View className=\"flex-row\" style={{ gap: 8 }} testID=\"exercise-detail-page-vbt-summary\">\n {cells.map((cell) => (\n <View\n key={cell.label}\n className=\"bg-surface-elevated border-border\"\n style={{\n flex: 1,\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 16,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n >\n {cell.value}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{\n marginTop: 2,\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n {cell.label}\n </Text>\n </View>\n ))}\n </View>\n )\n}\n\n/**\n * ExerciseDetailPage — a tabbed per-exercise view. A shared header (name,\n * context line, current e1RM pill) sits above a Progress / History / Advanced\n * tab bar. Progress composes the `MesoStatusCard` context banner, a stats\n * strip, a `StrengthTrendChart`, and a week-by-week progression list with\n * inline `ExerciseCard` expansion. History lists every logged session with the\n * same inline expansion. Advanced surfaces VBT data via a `CapacityBandChart`,\n * a velocity summary, and a per-set `VelocityStrip` breakdown. Tab and\n * per-list expansion are page-level state; children keep their own styles.\n *\n * @example\n * <ExerciseDetailPage\n * exercise={exercise}\n * meso={meso}\n * trend={trend}\n * progression={progression}\n * history={history}\n * vbt={vbt}\n * />\n */\nexport function ExerciseDetailPage({\n exercise,\n meso,\n trend,\n progression,\n history,\n vbt,\n className,\n ...props\n}: ExerciseDetailPageProps) {\n const [tab, setTab] = useState<ExerciseDetailTab>('progress')\n const [expandedProgressId, setExpandedProgressId] = useState<string | null>(null)\n const [expandedHistoryId, setExpandedHistoryId] = useState<string | null>(null)\n\n const stats = useMemo(() => deriveExerciseStats(history), [history])\n const vbtSummary = useMemo(() => summarizeVbt(vbt.sets), [vbt.sets])\n\n const toggle =\n (setId: (updater: (current: string | null) => string | null) => void) => (id: string) =>\n setId((current) => (current === id ? null : id))\n\n return (\n <View\n className={cn('bg-background-base', className)}\n style={{ width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={exercise.name}\n testID=\"exercise-detail-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"exercise-detail-page-content\">\n <View\n className=\"flex-row items-start justify-between\"\n style={{ gap: 8 }}\n testID=\"exercise-detail-page-header\"\n >\n <View style={{ flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"exercise-detail-page-title\"\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 2,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"exercise-detail-page-subtitle\"\n >\n {exercise.subtitle}\n </Text>\n </View>\n {exercise.currentE1rm != null && (\n <View\n style={{\n paddingVertical: 4,\n paddingHorizontal: 10,\n borderRadius: 6,\n backgroundColor: 'rgba(255,121,0,0.10)',\n borderWidth: 1,\n borderColor: 'rgba(255,121,0,0.25)',\n }}\n testID=\"exercise-detail-page-e1rm\"\n >\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 9,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n }}\n >\n e1RM\n </Text>\n <Text\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: BRAND_PRIMARY,\n }}\n >\n {`${exercise.currentE1rm} ${exercise.unit}`}\n </Text>\n </View>\n )}\n </View>\n\n <TabBar active={tab} onSelect={setTab} />\n\n {tab === 'progress' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-progress\">\n <MesoStatusCard {...meso} />\n <StatStrip stats={stats} unit={exercise.unit} />\n <SectionCard title=\"Strength Trend\" testID=\"exercise-detail-page-trend\">\n <StrengthTrendChart\n data={trend.data}\n projection={trend.projection}\n mesoBoundaries={trend.mesoBoundaries}\n width={CHART_WIDTH}\n height={CHART_HEIGHT}\n unit={exercise.unit}\n animateOnMount={false}\n />\n </SectionCard>\n <SectionCard title=\"Week-by-Week\" testID=\"exercise-detail-page-progression\">\n <EntryList\n entries={progression}\n expandedId={expandedProgressId}\n onToggle={toggle(setExpandedProgressId)}\n emptyLabel=\"No progression logged yet\"\n testID=\"exercise-detail-page-progression-list\"\n />\n </SectionCard>\n </View>\n )}\n\n {tab === 'history' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-history\">\n <SectionCard title=\"All Sessions\" testID=\"exercise-detail-page-history\">\n <EntryList\n entries={history}\n expandedId={expandedHistoryId}\n onToggle={toggle(setExpandedHistoryId)}\n emptyLabel=\"No sessions logged yet\"\n testID=\"exercise-detail-page-history-list\"\n />\n </SectionCard>\n </View>\n )}\n\n {tab === 'advanced' && (\n <View style={{ gap: 14 }} testID=\"exercise-detail-page-panel-advanced\">\n <SectionCard title=\"Capacity Band\" testID=\"exercise-detail-page-capacity\">\n <CapacityBandChart\n band={vbt.band}\n workouts={vbt.workouts}\n projection={vbt.projection}\n width={CHART_WIDTH}\n height={CHART_HEIGHT}\n />\n </SectionCard>\n <VbtSummaryRow summary={vbtSummary} />\n <SectionCard title=\"Velocity Breakdown\" testID=\"exercise-detail-page-velocity\">\n <VbtBreakdown sets={vbt.sets} zones={vbt.zones} />\n </SectionCard>\n </View>\n )}\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useState } from 'react'\nimport { View, Pressable, Animated, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport type MesoStatus = 'completed' | 'current' | 'upcoming'\n\nexport interface Meso {\n id: string\n name: string\n weekCount: number\n status: MesoStatus\n /**\n * 1-based week index of progress within a `current` meso.\n * Drives the solid fill width. Ignored for non-current mesos.\n */\n currentWeek?: number\n}\n\nexport interface MesoProgressBarProps extends ViewProps {\n mesos: Meso[]\n activeMesoId: string | null\n onMesoPress: (mesoId: string) => void\n className?: string\n}\n\nconst segmentBgColors: Record<MesoStatus, string> = {\n completed: 'rgba(46,213,115,0.3)',\n current: 'rgba(255,121,0,0.5)',\n upcoming: 'rgba(255,255,255,0.06)',\n}\n\nfunction clampProgress(currentWeek: number | undefined, weekCount: number): number {\n if (currentWeek == null || weekCount <= 0) return 0\n const ratio = currentWeek / weekCount\n return Math.max(0, Math.min(1, ratio))\n}\n\ninterface SegmentProps {\n meso: Meso\n isActive: boolean\n onPress: (id: string) => void\n}\n\nfunction MesoSegment({ meso, isActive, onPress }: SegmentProps) {\n const [pressScale] = useState(() => new Animated.Value(1))\n\n const handlePressIn = () => {\n Animated.timing(pressScale, {\n toValue: 0.98,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const handlePressOut = () => {\n Animated.timing(pressScale, {\n toValue: 1,\n duration: 150,\n useNativeDriver: true,\n }).start()\n }\n\n const progress = meso.status === 'current'\n ? clampProgress(meso.currentWeek, meso.weekCount)\n : 0\n\n // weekCount drives the segment's flex width; guard 0 / negative so flex stays\n // a valid positive value and the segment never collapses out of the layout.\n const segmentFlex = Math.max(1, meso.weekCount)\n\n return (\n <Pressable\n style={{ flex: segmentFlex }}\n onPress={() => onPress(meso.id)}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n accessibilityRole=\"button\"\n accessibilityLabel={`${meso.name}, ${meso.status}`}\n testID={`meso-segment-${meso.id}`}\n >\n <Animated.View\n style={[\n {\n height: 8,\n borderRadius: 4,\n overflow: 'hidden',\n backgroundColor: segmentBgColors[meso.status],\n transform: [{ scale: pressScale }],\n },\n isActive\n ? {\n borderWidth: 2,\n borderColor: BRAND_PRIMARY,\n transform: [{ scale: 1.02 }, { scale: pressScale }],\n }\n : undefined,\n ]}\n testID={`meso-segment-inner-${meso.id}`}\n >\n {meso.status === 'current' && progress > 0 && (\n <View\n style={{\n position: 'absolute',\n left: 0,\n top: 0,\n bottom: 0,\n width: `${progress * 100}%`,\n backgroundColor: BRAND_PRIMARY,\n }}\n testID={`meso-segment-fill-${meso.id}`}\n />\n )}\n </Animated.View>\n </Pressable>\n )\n}\n\n/**\n * Segmented horizontal bar of mesocycles. Each segment is tappable and its\n * flex width is proportional to the meso's `weekCount`. The active segment is\n * highlighted with a 2px brand border to stay in sync with MesoCard selection.\n *\n * @example\n * <MesoProgressBar\n * mesos={[\n * { id: 'm1', name: 'Accumulation', weekCount: 4, status: 'completed' },\n * { id: 'm2', name: 'Intensification', weekCount: 3, status: 'current', currentWeek: 2 },\n * { id: 'm3', name: 'Peak', weekCount: 2, status: 'upcoming' },\n * ]}\n * activeMesoId=\"m2\"\n * onMesoPress={(id) => console.log(id)}\n * />\n */\nexport function MesoProgressBar({\n mesos,\n activeMesoId,\n onMesoPress,\n className,\n ...props\n}: MesoProgressBarProps) {\n return (\n <View\n className={className}\n style={{\n flexDirection: 'row',\n gap: 2,\n paddingHorizontal: 16,\n alignItems: 'center',\n }}\n testID=\"meso-progress-bar\"\n {...props}\n >\n {mesos.map((meso) => (\n <MesoSegment\n key={meso.id}\n meso={meso}\n isActive={meso.id === activeMesoId}\n onPress={onMesoPress}\n />\n ))}\n </View>\n )\n}\n","import { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\n\nexport type IndicatorSize = 'xs' | 'sm' | 'md' | 'lg'\nexport type IndicatorColor =\n | 'default'\n | 'primary'\n | 'success'\n | 'error'\n | 'warning'\n | 'info'\n | 'error-vivid'\n\n/** How a pulsing indicator animates: a subtle opacity fade, or an expanding ring. */\nexport type IndicatorPulse = 'opacity' | 'ping'\n\nexport interface IndicatorProps extends ViewProps {\n /** Dot size */\n size?: IndicatorSize\n /** Semantic color */\n color?: IndicatorColor\n /** Custom hex color (overrides color prop) */\n customColor?: string\n /** Add a glow shadow effect */\n glow?: boolean\n /** Add a ring border */\n ring?: boolean\n /** Animate for live/active status. `true` = opacity fade; `'ping'` = expanding ring. */\n pulse?: boolean | IndicatorPulse\n /** Additional className */\n className?: string\n}\n\nconst sizeStyles: Record<IndicatorSize, string> = {\n xs: 'w-1 h-1',\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-2.5 h-2.5',\n}\n\nconst colorStyles: Record<IndicatorColor, string> = {\n default: 'bg-text-tertiary',\n primary: 'bg-brand-primary',\n success: 'bg-status-success',\n error: 'bg-status-error',\n warning: 'bg-status-warning',\n info: 'bg-status-info',\n 'error-vivid': 'bg-status-error-vivid',\n}\n\nexport function Indicator({\n size = 'sm',\n color = 'default',\n customColor,\n glow = false,\n ring = false,\n pulse = false,\n className,\n style,\n ...props\n}: IndicatorProps) {\n const pulseMode: IndicatorPulse | false = pulse === true ? 'opacity' : pulse || false\n const colorClass = !customColor ? colorStyles[color] : undefined\n const colorStyle = customColor ? { backgroundColor: customColor } : undefined\n\n // Expanding-ring pulse: a ping layer behind the solid dot (for live/active status).\n if (pulseMode === 'ping') {\n return (\n <View className={cn('relative', sizeStyles[size], className)} style={style} {...props}>\n <View\n className={cn('absolute inset-0 rounded-full animate-ping', colorClass)}\n style={colorStyle}\n />\n <View\n className={cn(\n 'relative rounded-full',\n sizeStyles[size],\n colorClass,\n ring && 'border-2 border-background-base'\n )}\n style={colorStyle}\n />\n </View>\n )\n }\n\n const dynamicStyle = {\n ...(typeof style === 'object' ? style : {}),\n ...(colorStyle ?? {}),\n ...(glow && customColor ? { boxShadow: `0 0 6px ${customColor}` } : {}),\n }\n\n return (\n <View\n className={cn(\n 'rounded-full shrink-0',\n sizeStyles[size],\n colorClass,\n pulseMode === 'opacity' && 'animate-pulse',\n ring && 'border-2 border-background-base',\n glow && !customColor && color === 'success' && 'shadow-[0_0_6px_rgba(46,213,115,0.6)]',\n glow && !customColor && color === 'error' && 'shadow-[0_0_6px_rgba(239,68,68,0.6)]',\n glow && !customColor && color === 'warning' && 'shadow-[0_0_6px_rgba(245,158,11,0.6)]',\n glow && !customColor && color === 'primary' && 'shadow-[0_0_6px_rgba(255,121,0,0.6)]',\n glow && !customColor && color === 'error-vivid' && 'shadow-[0_0_6px_rgba(255,71,87,0.6)]',\n className\n )}\n style={Object.keys(dynamicStyle).length > 0 ? dynamicStyle : style}\n {...props}\n />\n )\n}\n","import React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { Indicator, type IndicatorColor } from '../indicator'\n\nexport type BadgeVariant = 'solid' | 'subtle' | 'outline'\nexport type BadgeColor = 'default' | 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info'\nexport type BadgeSize = 'sm' | 'md' | 'lg'\n\nexport interface BadgeProps extends ViewProps {\n /** Visual variant */\n variant?: BadgeVariant\n /** Color scheme */\n color?: BadgeColor\n /** Size */\n size?: BadgeSize\n /** Show a leading indicator dot */\n dot?: boolean\n /** Color for the dot indicator (defaults to match badge color) */\n dotColor?: IndicatorColor\n /** Additional className */\n className?: string\n children?: React.ReactNode\n}\n\nconst variantColorStyles: Record<BadgeVariant, Record<BadgeColor, string>> = {\n solid: {\n default: 'bg-border-strong text-text-inverse',\n primary: 'bg-brand-primary text-text-inverse',\n secondary: 'bg-brand-secondary text-text-inverse',\n success: 'bg-status-success text-text-inverse',\n error: 'bg-status-error text-text-inverse',\n warning: 'bg-status-warning text-text-inverse',\n info: 'bg-status-info text-text-inverse',\n },\n subtle: {\n default: 'bg-surface-raised text-text-secondary',\n primary: 'bg-brand-primary-subtle text-brand-primary',\n secondary: 'bg-brand-secondary-subtle text-brand-secondary',\n success: 'bg-status-success-subtle text-status-success',\n error: 'bg-status-error-subtle text-status-error',\n warning: 'bg-status-warning-subtle text-status-warning',\n info: 'bg-status-info-subtle text-status-info',\n },\n outline: {\n default: 'border border-border-strong text-text-secondary',\n primary: 'border border-brand-primary text-brand-primary',\n secondary: 'border border-brand-secondary text-brand-secondary',\n success: 'border border-status-success text-status-success',\n error: 'border border-status-error text-status-error',\n warning: 'border border-status-warning text-status-warning',\n info: 'border border-status-info text-status-info',\n },\n}\n\nconst sizeStyles: Record<BadgeSize, string> = {\n sm: 'px-1.5 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-2.5 py-1 text-sm',\n}\n\n/**\n * Badge component for status indicators and labels.\n *\n * @example\n * <Badge color=\"success\">Active</Badge>\n * <Badge variant=\"outline\" color=\"warning\">Pending</Badge>\n */\nexport function Badge({\n variant = 'subtle',\n color = 'default',\n size = 'md',\n dot,\n dotColor,\n className,\n children,\n ...props\n}: BadgeProps) {\n return (\n <View\n className={cn(\n 'inline-flex items-center justify-center rounded-full font-medium',\n variantColorStyles[variant][color],\n sizeStyles[size],\n className\n )}\n {...props}\n >\n {dot && (\n <Indicator\n size=\"xs\"\n color={dotColor ?? (color === 'default' || color === 'secondary' ? 'default' : color as IndicatorColor)}\n className=\"mr-0.5\"\n />\n )}\n {typeof children === 'string' ? (\n <Text className=\"text-inherit font-medium\">{children}</Text>\n ) : (\n children\n )}\n </View>\n )\n}\n\nexport interface BadgeTextProps {\n children: React.ReactNode\n className?: string\n}\n\n/**\n * Text component for Badge content.\n */\nexport function BadgeText({ children, className }: BadgeTextProps) {\n return (\n <Text className={cn('text-inherit font-medium', className)}>\n {children}\n </Text>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_PILL_DELOAD } from '../../../theme/extracted-colors-dataviz'\n\nconst t = getSemanticColors('dark')\n\n/**\n * Spec statuses: completed | current | upcoming | deload.\n * `next` and `missed` are additive extras supported by this implementation.\n */\nexport type WorkoutPillStatus = 'completed' | 'current' | 'upcoming' | 'deload' | 'next' | 'missed'\n\nexport interface WorkoutPillProps extends ViewProps {\n name: string\n status: WorkoutPillStatus\n /** Force pulsing animation. Defaults to pulsing only on `current` status. */\n pulse?: boolean\n onPress?: () => void\n highlighted?: boolean\n className?: string\n}\n\nconst statusBgColors: Record<WorkoutPillStatus, string> = {\n completed: 'rgba(46,213,115,0.15)',\n current: 'rgba(255,121,0,0.15)',\n next: 'transparent',\n upcoming: '#1C1C1C',\n missed: 'rgba(209,67,67,0.1)',\n deload: 'rgba(186,41,150,0.15)',\n}\n\nconst statusBorderStyles: Record<WorkoutPillStatus, Record<string, unknown>> = {\n completed: { borderWidth: 1, borderColor: 'rgba(46,213,115,0.3)' },\n current: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.3)' },\n next: { borderWidth: 1, borderColor: 'rgba(255,121,0,0.4)' },\n upcoming: { borderWidth: 1, borderColor: '#1F1F1F' },\n missed: { borderWidth: 1, borderColor: 'rgba(209,67,67,0.25)' },\n deload: { borderWidth: 1, borderColor: 'rgba(186,41,150,0.3)' },\n}\n\nconst textColors: Record<WorkoutPillStatus, string> = {\n completed: t['status-success'],\n current: t['brand-primary'],\n next: t['brand-primary'],\n upcoming: '#6B7280',\n missed: 'rgba(209,67,67,0.7)',\n deload: WORKOUT_PILL_DELOAD,\n}\n\nfunction usePulse(enabled: boolean) {\n const [opacity] = useState(() => new Animated.Value(1))\n\n useEffect(() => {\n if (!enabled) {\n opacity.setValue(1)\n return\n }\n\n const animation = Animated.loop(\n Animated.sequence([\n Animated.timing(opacity, {\n toValue: 0.7,\n duration: 1000,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 1000,\n easing: Easing.inOut(Easing.ease),\n useNativeDriver: true,\n }),\n ]),\n )\n animation.start()\n\n return () => animation.stop()\n }, [enabled, opacity])\n\n return opacity\n}\n\nexport function WorkoutPill({\n name,\n status,\n pulse,\n onPress,\n highlighted = false,\n className,\n ...props\n}: WorkoutPillProps) {\n const shouldPulse = pulse ?? status === 'current'\n const pulseOpacity = usePulse(shouldPulse)\n const isCompleted = status === 'completed'\n const isMissed = status === 'missed'\n\n const pill = (\n <Animated.View\n style={shouldPulse ? { opacity: pulseOpacity } : undefined}\n testID=\"workout-pill\"\n >\n <View\n className={className}\n style={[\n {\n flexDirection: 'row',\n alignItems: 'center',\n paddingHorizontal: 10,\n paddingVertical: 4,\n borderRadius: 6,\n backgroundColor: statusBgColors[status],\n },\n statusBorderStyles[status] as Record<string, unknown>,\n highlighted ? { borderWidth: 2, transform: [{ scale: 1.02 }] } : undefined,\n ]}\n accessibilityLabel={onPress ? undefined : `${name} workout, ${status}`}\n {...props}\n >\n {isCompleted && (\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n marginRight: 4,\n }}\n accessibilityElementsHidden\n testID=\"workout-pill-check\"\n >\n {'\\u2713'}\n </Text>\n )}\n {isMissed && (\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n marginRight: 4,\n }}\n accessibilityElementsHidden\n testID=\"workout-pill-dash\"\n >\n {'\\u2014'}\n </Text>\n )}\n <Text\n style={{\n fontWeight: '600',\n fontFamily: '\"Nunito Sans\", sans-serif',\n fontSize: 11,\n color: textColors[status],\n }}\n accessibilityElementsHidden={onPress != null}\n testID=\"workout-pill-name\"\n >\n {name}\n </Text>\n </View>\n </Animated.View>\n )\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name} workout, ${status}`}\n testID=\"workout-pill-pressable\"\n >\n {pill}\n </Pressable>\n )\n }\n\n return pill\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport {\n View,\n Text,\n Animated,\n type ViewProps,\n type ViewStyle,\n type DimensionValue,\n} from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\nconst t = getSemanticColors('dark')\n\nexport type IntensityBarOrientation = 'vertical' | 'horizontal'\n\nexport interface IntensityBarProps extends ViewProps {\n /** Current intensity level; 1 == 100% of target. Values >1 render as over-target. */\n level: number\n /** Target position 0-1. When the level sits at this target the fill gains an at-target glow. */\n threshold?: number\n /** Orientation */\n orientation?: IntensityBarOrientation\n /** Height for vertical (default 24px) or width for horizontal */\n size?: number\n /** Width for vertical (default 6px) or height for horizontal */\n thickness?: number\n /** Show the \"MRV\" threshold label under the bar */\n showThresholdLabel?: boolean\n className?: string\n}\n\nconst TRACK_BG = '#333333'\nconst LABEL_COLOR = '#6B7280'\nconst TARGET_LINE_COLOR = 'rgba(33, 150, 243, 0.5)'\nconst AT_TARGET_GLOW = '0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)'\n\n// Zone colors graded by TRUE percentage (level * 100).\nconst ZONE = {\n building: t['status-success'], // below target ramp-up\n approaching: t['status-warning'], // nearing target\n target: t['brand-primary'], // exactly at target\n over1: t['status-error'], // mild over-target\n over2: WORKOUT_TOKENS.intensity.over2, // moderate over-target\n over3: WORKOUT_TOKENS.intensity.over3, // severe over-target\n} as const\n\ntype OverTier = 0 | 1 | 2 | 3\n\ninterface Zone {\n color: string\n over: OverTier\n}\n\nconst BULGE_SIZE: Record<Exclude<OverTier, 0>, number> = { 1: 8, 2: 10, 3: 11 }\n\n/** Map a true percentage to its fill color and over-target tier. */\nfunction zoneForPct(pct: number): Zone {\n if (pct >= 125) return { color: ZONE.over3, over: 3 }\n if (pct >= 115) return { color: ZONE.over2, over: 2 }\n if (pct > 100) return { color: ZONE.over1, over: 1 }\n if (pct === 100) return { color: ZONE.target, over: 0 }\n if (pct >= 75) return { color: ZONE.approaching, over: 0 }\n return { color: ZONE.building, over: 0 }\n}\n\nfunction clampFill(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** True when the level rests on the supplied target (within 5%). */\nfunction isAtTarget(pct: number, threshold?: number): boolean {\n if (threshold == null) return false\n return Math.abs(pct - Math.round(threshold * 100)) <= 5\n}\n\nexport function IntensityBar({\n level,\n threshold,\n orientation = 'vertical',\n size = 24,\n thickness = 6,\n showThresholdLabel,\n className,\n ...props\n}: IntensityBarProps) {\n const isVertical = orientation === 'vertical'\n const fillLevel = clampFill(level)\n const pct = Math.round(Math.max(0, level) * 100)\n const zone = zoneForPct(pct)\n const atTarget = isAtTarget(pct, threshold)\n\n const [fillAnim] = useState(() => new Animated.Value(fillLevel))\n\n useEffect(() => {\n const animation = Animated.timing(fillAnim, {\n toValue: fillLevel,\n duration: 250,\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [fillLevel, fillAnim])\n\n const fillSizePercent = fillAnim.interpolate({\n inputRange: [0, 1],\n outputRange: ['0%', '100%'],\n })\n\n const trackStyle = isVertical\n ? { width: thickness, height: size }\n : { width: size, height: thickness }\n\n const fillStyle = isVertical\n ? { position: 'absolute' as const, bottom: 0, left: 0, right: 0, height: fillSizePercent }\n : { position: 'absolute' as const, top: 0, bottom: 0, left: 0, width: fillSizePercent }\n\n const bulgeSize = zone.over === 0 ? 0 : BULGE_SIZE[zone.over]\n const bulgeStyle: ViewStyle = {\n position: 'absolute',\n width: bulgeSize,\n height: bulgeSize,\n borderRadius: bulgeSize / 2,\n backgroundColor: zone.color,\n zIndex: 1,\n ...(isVertical\n ? { top: 0, left: '50%', transform: [{ translateX: -bulgeSize / 2 }] }\n : { right: 0, top: '50%', transform: [{ translateY: -bulgeSize / 2 }] }),\n }\n\n const targetPct: DimensionValue = `${clampFill(threshold ?? 0) * 100}%`\n const targetLineStyle: ViewStyle = isVertical\n ? {\n position: 'absolute',\n bottom: targetPct,\n left: -3,\n right: -3,\n height: 1.5,\n backgroundColor: TARGET_LINE_COLOR,\n zIndex: 4,\n }\n : {\n position: 'absolute',\n left: targetPct,\n top: -3,\n bottom: -3,\n width: 1.5,\n backgroundColor: TARGET_LINE_COLOR,\n zIndex: 4,\n }\n\n return (\n <View\n className={className}\n style={{ alignItems: 'center' }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: 0, max: 100, now: pct }}\n accessibilityLabel={`Intensity level: ${pct}%`}\n testID=\"intensity-bar\"\n {...props}\n >\n <View\n style={{\n ...trackStyle,\n borderRadius: 3,\n backgroundColor: TRACK_BG,\n position: 'relative',\n overflow: 'visible',\n }}\n accessibilityElementsHidden\n >\n <Animated.View\n style={{\n ...fillStyle,\n borderRadius: 3,\n backgroundColor: zone.color,\n zIndex: 2,\n ...(atTarget ? { boxShadow: AT_TARGET_GLOW } : null),\n }}\n testID=\"intensity-fill\"\n />\n\n {zone.over !== 0 && <View style={bulgeStyle} testID=\"intensity-bulge\" />}\n\n {threshold != null && <View style={targetLineStyle} testID=\"intensity-target\" />}\n </View>\n\n <Text\n style={{\n fontSize: 8,\n color: LABEL_COLOR,\n fontFamily: '\"Nunito Sans\", sans-serif',\n marginTop: 6,\n }}\n accessibilityElementsHidden\n testID=\"intensity-label\"\n >\n {pct}%\n </Text>\n\n {showThresholdLabel && threshold != null && (\n <Text\n style={{\n fontSize: 8,\n fontWeight: '500',\n color: LABEL_COLOR,\n fontFamily: 'Inter, sans-serif',\n marginTop: 2,\n }}\n accessibilityElementsHidden\n testID=\"intensity-threshold-label\"\n >\n MRV\n </Text>\n )}\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, type ViewProps } from 'react-native'\nimport { WorkoutPill, type WorkoutPillStatus } from './WorkoutPill'\nimport { IntensityBar } from './IntensityBar'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport interface WeekRowWorkout {\n name: string\n status: WorkoutPillStatus\n onPress?: () => void\n}\n\nexport interface WeekRowProps extends ViewProps {\n /** Week index within the mesocycle (1-based) */\n weekNumber: number\n /** Total weeks in the mesocycle */\n totalWeeks: number\n /** Workouts scheduled for this week */\n workouts: WeekRowWorkout[]\n /** Planned intensity for the week, 0-1 */\n intensityLevel: number\n /** Optional MRV/overexertion threshold, 0-1 */\n intensityThreshold?: number\n /** Highlights this row as the active week */\n isCurrent?: boolean\n /** Renders this row as a deload week (purple tint, deload pills) */\n isDeload?: boolean\n className?: string\n}\n\n/**\n * A single week within a mesocycle, showing the week number, its workout pills,\n * and a right-aligned vertical intensity indicator.\n *\n * @example\n * <WeekRow\n * weekNumber={1}\n * totalWeeks={4}\n * workouts={[\n * { name: 'Upper', status: 'completed' },\n * { name: 'Lower', status: 'current' },\n * ]}\n * intensityLevel={0.55}\n * intensityThreshold={0.8}\n * isCurrent\n * />\n */\nexport function WeekRow({\n weekNumber,\n totalWeeks,\n workouts,\n intensityLevel,\n intensityThreshold,\n isCurrent = false,\n isDeload = false,\n className,\n ...props\n}: WeekRowProps) {\n const rowStyle: Record<string, unknown> = {\n flexDirection: 'row' as const,\n alignItems: 'center' as const,\n paddingVertical: 10,\n paddingHorizontal: 12,\n gap: 12,\n }\n\n if (isDeload) {\n rowStyle.backgroundColor = 'rgba(186,41,150,0.06)'\n }\n\n if (isCurrent) {\n rowStyle.backgroundColor = 'rgba(255,121,0,0.04)'\n rowStyle.borderLeftWidth = 2\n rowStyle.borderLeftColor = BRAND_PRIMARY\n }\n\n return (\n <View\n className={className}\n style={rowStyle}\n accessibilityLabel={`Week ${weekNumber} of ${totalWeeks}, ${workouts.length} workouts`}\n testID=\"week-row\"\n {...props}\n >\n <View\n style={{ flexDirection: 'row', alignItems: 'center', width: 32, gap: 4 }}\n testID=\"week-row-number\"\n >\n {isCurrent && (\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 3,\n backgroundColor: BRAND_PRIMARY,\n }}\n accessibilityElementsHidden\n testID=\"week-row-current-dot\"\n />\n )}\n <Text\n className={isCurrent ? undefined : 'text-text-primary'}\n style={{\n fontSize: 13,\n fontWeight: '700',\n fontFamily: 'Inter, sans-serif',\n color: isCurrent ? BRAND_PRIMARY : undefined,\n }}\n accessibilityElementsHidden\n >\n {`W${weekNumber}`}\n </Text>\n </View>\n\n <View\n style={{ flex: 1, flexDirection: 'row', alignItems: 'center', flexWrap: 'wrap', gap: 6 }}\n testID=\"week-row-pills\"\n >\n {workouts.map((workout, i) => (\n <WorkoutPill\n key={i}\n name={workout.name}\n status={isDeload ? 'deload' : workout.status}\n onPress={workout.onPress}\n />\n ))}\n </View>\n\n <View testID=\"week-row-intensity\">\n <IntensityBar\n level={intensityLevel}\n threshold={intensityThreshold}\n orientation=\"vertical\"\n size={24}\n thickness={6}\n />\n </View>\n </View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useEffect, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { Badge } from '../../ui/badge'\nimport { WeekRow, type WeekRowProps } from './WeekRow'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MESO_ACCENT_GRADIENT_DARK,\n MESO_ACCENT_GRADIENT_LIGHT,\n} from '../../../theme/extracted-colors-dataviz'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\nconst BRAND_PRIMARY_DARK = MESO_ACCENT_GRADIENT_DARK\nconst BRAND_PRIMARY_LIGHT = MESO_ACCENT_GRADIENT_LIGHT\nconst BORDER_DEFAULT = '#1F1F1F'\n\n/** Gradient stops for the 3px top accent: dark -> primary -> light. */\nconst ACCENT_STOPS = [BRAND_PRIMARY_DARK, BRAND_PRIMARY, BRAND_PRIMARY_LIGHT]\n\nexport interface MesoVolumeHeatmapEntry {\n /** Muscle group identifier (free-form to match plan data). */\n group: string\n /** Planned volume intensity for the group, 0-100. */\n percentage: number\n}\n\nexport interface MesoCardProps extends ViewProps {\n /** Mesocycle name, e.g. \"Accumulation\". */\n name: string\n /** Training goal, e.g. \"Hypertrophy\", \"Strength\", \"Peaking\". */\n goal: string\n /** Training split, e.g. \"Upper/Lower\", \"Push/Pull/Legs\". */\n split: string\n /** Week range label, e.g. \"Weeks 1-4\". */\n weekRange: string\n /** Current week within the mesocycle (1-based). */\n currentWeek?: number\n /** Total weeks in the mesocycle. */\n totalWeeks: number\n /** Weeks rendered as a WeekRow list when expanded. */\n weeks: WeekRowProps[]\n /** Whether the card is expanded to reveal the week list. */\n expanded?: boolean\n /** Toggles expansion; makes the header a button when provided. */\n onToggle?: () => void\n /** Whether this meso is highlighted in the MesoProgressBar. */\n highlighted?: boolean\n /** Volume heatmap data per muscle group for the meso. */\n volumeHeatmap?: MesoVolumeHeatmapEntry[]\n className?: string\n}\n\n/**\n * Maps a 0-100 volume percentage onto a brand-primary tint whose opacity\n * tracks intensity, keeping a visible floor so low-volume groups stay legible.\n */\nfunction heatmapColor(percentage: number): string {\n const clamped = Math.max(0, Math.min(100, percentage))\n const opacity = 0.12 + (clamped / 100) * 0.78\n return `rgba(255,121,0,${opacity.toFixed(3)})`\n}\n\n/**\n * A mesocycle card with name, goal, split, week range, an optional volume\n * heatmap strip, and an expandable WeekRow list. Highlighting animates the\n * border toward brand-primary with a subtle glow to stay in sync with the\n * MesoProgressBar.\n *\n * @example\n * <MesoCard\n * name=\"Accumulation\"\n * goal=\"Hypertrophy\"\n * split=\"Upper/Lower\"\n * weekRange=\"Weeks 1-4\"\n * currentWeek={2}\n * totalWeeks={4}\n * weeks={weeks}\n * volumeHeatmap={[{ group: 'chest', percentage: 80 }]}\n * expanded\n * onToggle={() => {}}\n * highlighted\n * />\n */\nexport function MesoCard({\n name,\n goal,\n split,\n weekRange,\n currentWeek,\n totalWeeks,\n weeks,\n expanded = false,\n onToggle,\n highlighted = false,\n volumeHeatmap,\n className,\n ...props\n}: MesoCardProps) {\n const isExpandable = onToggle != null\n const [highlight] = useState(() => new Animated.Value(highlighted ? 1 : 0))\n\n useEffect(() => {\n const animation = Animated.timing(highlight, {\n toValue: highlighted ? 1 : 0,\n duration: 250,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [highlighted, highlight])\n\n const borderColor = highlight.interpolate({\n inputRange: [0, 1],\n outputRange: [BORDER_DEFAULT, BRAND_PRIMARY],\n })\n\n const header = (\n <View style={{ paddingHorizontal: 14, paddingTop: 12, paddingBottom: 10 }} testID=\"meso-card-body\">\n <View className=\"flex-row items-center\" style={{ gap: 8 }} testID=\"meso-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"meso-card-name\"\n >\n {name}\n </Text>\n <Badge variant=\"subtle\" color=\"primary\" size=\"sm\" testID=\"meso-card-goal-badge\">\n {goal}\n </Badge>\n </View>\n\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"meso-card-subheader\"\n >\n {`${split} · ${weekRange}`}\n </Text>\n\n {volumeHeatmap && volumeHeatmap.length > 0 && (\n <View\n className=\"flex-row items-center\"\n style={{ marginTop: 10, gap: 3 }}\n accessibilityElementsHidden\n testID=\"meso-card-heatmap\"\n >\n {volumeHeatmap.map((entry) => (\n <View\n key={entry.group}\n style={{\n flex: 1,\n height: 8,\n borderRadius: 2,\n backgroundColor: heatmapColor(entry.percentage),\n }}\n testID=\"meso-card-heatmap-cell\"\n />\n ))}\n </View>\n )}\n </View>\n )\n\n return (\n <Animated.View style={highlighted ? { transform: [{ scale: 1.0 }] } : undefined} testID=\"meso-card-wrapper\">\n <Card\n variant=\"outline\"\n elevation={2}\n borderColor={highlighted ? BRAND_PRIMARY : BORDER_DEFAULT}\n className={className}\n style={[\n { borderColor: borderColor as unknown as string },\n highlighted\n ? { boxShadow: '0 0 12px 2px rgba(255,121,0,0.25)' }\n : undefined,\n ]}\n testID=\"meso-card\"\n {...props}\n >\n <View\n className=\"flex-row\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 3, zIndex: 1 }}\n accessibilityElementsHidden\n testID=\"meso-card-accent\"\n >\n {ACCENT_STOPS.map((color) => (\n <View key={color} style={{ flex: 1, backgroundColor: color }} />\n ))}\n </View>\n\n {isExpandable ? (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name}, ${goal}, ${weekRange}`}\n aria-expanded={expanded}\n testID=\"meso-card-toggle\"\n >\n {header}\n </Pressable>\n ) : (\n <View\n accessibilityLabel={`${name}, ${goal}, ${weekRange}`}\n testID=\"meso-card-static\"\n >\n {header}\n </View>\n )}\n\n {expanded && weeks.length > 0 && (\n <View\n style={{ borderTopWidth: 1, borderTopColor: BORDER_DEFAULT }}\n testID=\"meso-card-weeks\"\n >\n {weeks.map((week) => (\n <WeekRow\n key={week.weekNumber}\n {...week}\n totalWeeks={week.totalWeeks ?? totalWeeks}\n isCurrent={week.isCurrent ?? week.weekNumber === currentWeek}\n />\n ))}\n </View>\n )}\n </Card>\n </Animated.View>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\n// Aliases for spec compatibility: under=behind, maintenance=ontrack, productive=target\nexport type VolumeStatus = 'untrained' | 'behind' | 'ontrack' | 'target' | 'over'\n\nexport interface MuscleGroupChipProps extends ViewProps {\n name: string\n volumeStatus?: VolumeStatus\n onPress?: () => void\n className?: string\n}\n\nconst dotColorMap: Record<VolumeStatus, string> = {\n untrained: '#2C2C2C',\n behind: t['brand-secondary'],\n ontrack: t['status-success'],\n target: t['brand-primary'],\n over: t['status-error'],\n}\n\nexport function MuscleGroupChip({\n name,\n volumeStatus,\n onPress,\n className,\n ...props\n}: MuscleGroupChipProps) {\n const dotColor = volumeStatus\n ? dotColorMap[volumeStatus]\n : '#2C2C2C'\n\n const statusLabel = volumeStatus ?? 'no status'\n\n const content = (\n <View\n className={['bg-surface-raised border-border', className].filter(Boolean).join(' ')}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 9999,\n paddingHorizontal: 9,\n paddingVertical: 3,\n borderWidth: 1,\n }}\n accessibilityLabel={onPress ? undefined : `${name}, volume status: ${statusLabel}`}\n testID=\"muscle-group-chip\"\n {...props}\n >\n <View\n style={{\n width: 6,\n height: 6,\n borderRadius: 9999,\n marginRight: 5,\n flexShrink: 0,\n backgroundColor: dotColor,\n }}\n accessibilityElementsHidden\n testID=\"muscle-group-chip-dot\"\n />\n <Text\n className=\"text-text-secondary\"\n style={{\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n fontSize: 11,\n }}\n accessibilityElementsHidden\n >\n {name}\n </Text>\n </View>\n )\n\n if (onPress) {\n return (\n <Pressable\n onPress={onPress}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name}, volume status: ${statusLabel}`}\n testID=\"muscle-group-chip-pressable\"\n >\n {content}\n </Pressable>\n )\n }\n\n return content\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { View, Text, ScrollView, Pressable, type ViewProps } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { ExerciseCard, type ExerciseCardProps } from './ExerciseCard'\nimport {\n MuscleGroupChip,\n type VolumeStatus,\n} from './MuscleGroupChip'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nexport type WorkoutStatus = 'completed' | 'today' | 'upcoming'\n\n/** Spec volume-status vocabulary; mapped to MuscleGroupChip's VolumeStatus internally. */\nexport type WorkoutMuscleVolumeStatus =\n | 'under'\n | 'maintenance'\n | 'productive'\n | 'over'\n\nexport interface WorkoutMuscleGroup {\n /** Muscle group identifier (free-form to match plan data). */\n group: string\n /** Display label, may be abbreviated. */\n label: string\n /** Volume status relative to landmarks. */\n volumeStatus?: WorkoutMuscleVolumeStatus\n}\n\nexport interface WorkoutCardProps extends ViewProps {\n name: string\n date: string\n /** e.g. \"45 min\" */\n duration?: string\n status: WorkoutStatus\n muscleGroups: WorkoutMuscleGroup[]\n totalSets: number\n /** Total lbs/kg moved across the workout. */\n totalVolume?: number\n unit: 'lbs' | 'kg'\n exercises?: ExerciseCardProps[]\n expanded?: boolean\n onToggle?: () => void\n className?: string\n}\n\nconst COLORS = {\n statusSuccess: t['status-success'],\n brandPrimary: t['brand-primary'],\n borderDefault: '#1F1F1F',\n brandPrimarySubtle: 'rgba(255,121,0,0.06)',\n}\n\nconst statusBorderColors: Record<WorkoutStatus, string> = {\n completed: COLORS.statusSuccess,\n today: COLORS.brandPrimary,\n upcoming: COLORS.borderDefault,\n}\n\n/** Maps the spec's volume-status vocabulary onto MuscleGroupChip's enum. */\nconst volumeStatusMap: Record<WorkoutMuscleVolumeStatus, VolumeStatus> = {\n under: 'behind',\n maintenance: 'ontrack',\n productive: 'target',\n over: 'over',\n}\n\nfunction formatStats(\n totalSets: number,\n totalVolume: number | undefined,\n unit: 'lbs' | 'kg',\n duration: string | undefined,\n): string {\n const parts = [`${totalSets} sets`]\n if (totalVolume != null) parts.push(`${totalVolume} ${unit}`)\n if (duration) parts.push(duration)\n return parts.join(' · ')\n}\n\n/**\n * A workout within a week: name, date, duration, muscle-group pills, and a\n * stats summary. When expandable it renders contained ExerciseCards on expand.\n * Status drives a colored left border, today adds a brand tint, and upcoming\n * is dimmed.\n *\n * @example\n * <WorkoutCard\n * name=\"Upper A\"\n * date=\"Mon, Jun 23\"\n * duration=\"45 min\"\n * status=\"today\"\n * muscleGroups={[{ group: 'chest', label: 'Chest', volumeStatus: 'productive' }]}\n * totalSets={18}\n * totalVolume={12450}\n * unit=\"lbs\"\n * expanded\n * onToggle={() => {}}\n * exercises={exercises}\n * />\n */\nexport function WorkoutCard({\n name,\n date,\n duration,\n status,\n muscleGroups,\n totalSets,\n totalVolume,\n unit,\n exercises,\n expanded = false,\n onToggle,\n className,\n ...props\n}: WorkoutCardProps) {\n const isExpandable = onToggle != null\n const isUpcoming = status === 'upcoming'\n const isToday = status === 'today'\n\n const summary = (\n <View style={{ padding: 14 }} testID=\"workout-card-body\">\n <View className=\"flex-row items-center\" testID=\"workout-card-header\">\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"workout-card-name\"\n >\n {name}\n </Text>\n <View className=\"flex-1\" />\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"workout-card-date\"\n >\n {date}\n </Text>\n </View>\n\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"workout-card-stats\"\n >\n {formatStats(totalSets, totalVolume, unit, duration)}\n </Text>\n\n {muscleGroups.length > 0 && (\n <ScrollView\n horizontal\n showsHorizontalScrollIndicator={false}\n contentContainerStyle={{ gap: 5 }}\n style={{ marginTop: 8 }}\n testID=\"workout-card-muscle-groups\"\n >\n {muscleGroups.map((muscle) => (\n <MuscleGroupChip\n key={muscle.group}\n name={muscle.label}\n volumeStatus={\n muscle.volumeStatus\n ? volumeStatusMap[muscle.volumeStatus]\n : undefined\n }\n />\n ))}\n </ScrollView>\n )}\n </View>\n )\n\n return (\n <Card\n variant=\"accent\"\n elevation={1}\n accentColor={statusBorderColors[status]}\n bgColor={isToday ? COLORS.brandPrimarySubtle : undefined}\n className={className}\n style={isUpcoming ? { opacity: 0.6 } : undefined}\n testID=\"workout-card\"\n {...props}\n >\n {isExpandable ? (\n <Pressable\n onPress={onToggle}\n accessibilityRole=\"button\"\n accessibilityLabel={`${name} workout, ${date}, ${status}`}\n aria-expanded={expanded}\n testID=\"workout-card-toggle\"\n >\n {summary}\n </Pressable>\n ) : (\n <View\n accessibilityLabel={`${name} workout, ${date}, ${status}`}\n testID=\"workout-card-static\"\n >\n {summary}\n </View>\n )}\n\n {expanded && exercises && exercises.length > 0 && (\n <View\n style={{ paddingHorizontal: 8, paddingBottom: 8, gap: 6 }}\n testID=\"workout-card-exercises\"\n >\n {exercises.map((exercise, i) => (\n <ExerciseCard key={i} {...exercise} />\n ))}\n </View>\n )}\n </Card>\n )\n}\n","// Font mapping: font-heading=Space Grotesk, font-body=Nunito Sans (UI), font-sans=Inter (body)\nimport { useMemo, useState } from 'react'\nimport { View, Text, Pressable, type ViewProps } from 'react-native'\nimport { MesoProgressBar, type Meso, type MesoStatus } from './MesoProgressBar'\nimport { MesoCard, type MesoVolumeHeatmapEntry } from './MesoCard'\nimport { type WeekRowProps, type WeekRowWorkout } from './WeekRow'\nimport { WorkoutCard, type WorkoutStatus, type WorkoutMuscleGroup } from './WorkoutCard'\nimport { type WorkoutPillStatus } from './WorkoutPill'\nimport { type ExerciseCardProps } from './ExerciseCard'\nimport { cn } from '../../../utils/cn'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\n/** A single workout within a planned week, plus its exercise breakdown. */\nexport interface PlanWorkout {\n /** Stable identifier used for drill-down selection. */\n id: string\n name: string\n date: string\n duration?: string\n status: WorkoutStatus\n muscleGroups: WorkoutMuscleGroup[]\n totalSets: number\n totalVolume?: number\n unit: 'lbs' | 'kg'\n /** Exercises revealed when the workout is opened. */\n exercises: ExerciseCardProps[]\n}\n\n/** A training week inside a mesocycle. */\nexport interface PlanWeek {\n /** 1-based week index within the mesocycle. */\n weekNumber: number\n /** Planned intensity for the week, 0-1. */\n intensityLevel: number\n /** Optional MRV/overexertion threshold, 0-1. */\n intensityThreshold?: number\n isDeload?: boolean\n isCurrent?: boolean\n workouts: PlanWorkout[]\n}\n\n/** A mesocycle: the top level of the drill-down. */\nexport interface PlanMeso {\n id: string\n name: string\n goal: string\n split: string\n weekRange: string\n weekCount: number\n currentWeek?: number\n status: MesoStatus\n volumeHeatmap?: MesoVolumeHeatmapEntry[]\n weeks: PlanWeek[]\n}\n\n/** Current depth of the meso -> week -> workout drill-down. */\nexport type ProgramNavLevel = 'meso' | 'week' | 'workout'\n\n/** The navigation cursor within the active mesocycle. */\nexport interface ProgramSelection {\n weekNumber: number | null\n workoutId: string | null\n}\n\n/** One tappable step in the breadcrumb trail. */\nexport interface ProgramBreadcrumb {\n key: string\n label: string\n level: ProgramNavLevel\n}\n\nexport interface ProgramPlanningPageProps extends ViewProps {\n /** Page heading. */\n title?: string\n /** Mesocycles that make up the program. */\n mesos: PlanMeso[]\n className?: string\n}\n\n/** Map a workout's lifecycle status onto a WorkoutPill status. */\nconst WORKOUT_PILL_STATUS: Record<WorkoutStatus, WorkoutPillStatus> = {\n completed: 'completed',\n today: 'current',\n upcoming: 'upcoming',\n}\n\n/** Derive the current drill-down level from the selection cursor (pure). */\nexport function deriveNavLevel(selection: ProgramSelection): ProgramNavLevel {\n if (selection.workoutId != null) return 'workout'\n if (selection.weekNumber != null) return 'week'\n return 'meso'\n}\n\n/** Project the mesocycles onto MesoProgressBar segment data (pure). */\nexport function toProgressBarMesos(mesos: PlanMeso[]): Meso[] {\n return mesos.map(({ id, name, weekCount, status, currentWeek }) => ({\n id,\n name,\n weekCount,\n status,\n currentWeek,\n }))\n}\n\n/** Look up a meso by id, or null. */\nexport function findMeso(mesos: PlanMeso[], id: string | null): PlanMeso | null {\n if (id == null) return null\n return mesos.find((meso) => meso.id === id) ?? null\n}\n\n/** Look up a week within a meso, or null. */\nexport function findWeek(meso: PlanMeso | null, weekNumber: number | null): PlanWeek | null {\n if (meso == null || weekNumber == null) return null\n return meso.weeks.find((week) => week.weekNumber === weekNumber) ?? null\n}\n\n/** Look up a workout within a week, or null. */\nexport function findWorkout(week: PlanWeek | null, workoutId: string | null): PlanWorkout | null {\n if (week == null || workoutId == null) return null\n return week.workouts.find((workout) => workout.id === workoutId) ?? null\n}\n\n/** Build the breadcrumb trail for the active drill path (pure). */\nexport function buildBreadcrumbs(\n meso: PlanMeso,\n weekNumber: number | null,\n workout: PlanWorkout | null\n): ProgramBreadcrumb[] {\n const crumbs: ProgramBreadcrumb[] = [{ key: 'meso', label: meso.name, level: 'meso' }]\n if (weekNumber != null) {\n crumbs.push({ key: 'week', label: `Week ${weekNumber}`, level: 'week' })\n }\n if (workout != null) {\n crumbs.push({ key: 'workout', label: workout.name, level: 'workout' })\n }\n return crumbs\n}\n\ninterface BreadcrumbsProps {\n crumbs: ProgramBreadcrumb[]\n onNavigate: (level: ProgramNavLevel) => void\n}\n\nfunction Breadcrumbs({ crumbs, onNavigate }: BreadcrumbsProps) {\n return (\n <View\n className=\"flex-row items-center flex-wrap\"\n style={{ gap: 4 }}\n testID=\"program-planning-page-breadcrumbs\"\n >\n {crumbs.map((crumb, index) => {\n const isLast = index === crumbs.length - 1\n return (\n <View key={crumb.key} className=\"flex-row items-center\" style={{ gap: 4 }}>\n {index > 0 && <Text className=\"text-text-tertiary\" style={{ fontSize: 12 }}>{'›'}</Text>}\n <Pressable\n onPress={() => onNavigate(crumb.level)}\n disabled={isLast}\n accessibilityRole=\"button\"\n testID={`program-planning-page-crumb-${crumb.key}`}\n >\n <Text\n className={isLast ? 'text-text-primary' : undefined}\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: isLast ? '700' : '500',\n color: isLast ? undefined : BRAND_PRIMARY,\n }}\n >\n {crumb.label}\n </Text>\n </Pressable>\n </View>\n )\n })}\n </View>\n )\n}\n\n/** Project a plan week onto WeekRow props, wiring pill taps to week selection. */\nfunction toWeekRow(\n week: PlanWeek,\n meso: PlanMeso,\n onSelectWeek: (weekNumber: number) => void\n): WeekRowProps {\n const workouts: WeekRowWorkout[] = week.workouts.map((workout) => ({\n name: workout.name,\n status: WORKOUT_PILL_STATUS[workout.status],\n onPress: () => onSelectWeek(week.weekNumber),\n }))\n return {\n weekNumber: week.weekNumber,\n totalWeeks: meso.weekCount,\n workouts,\n intensityLevel: week.intensityLevel,\n intensityThreshold: week.intensityThreshold,\n isCurrent: week.isCurrent ?? week.weekNumber === meso.currentWeek,\n isDeload: week.isDeload,\n }\n}\n\ninterface MesoLevelProps {\n mesos: PlanMeso[]\n activeMesoId: string | null\n onSelectMeso: (id: string) => void\n onSelectWeek: (weekNumber: number) => void\n}\n\nfunction MesoLevel({ mesos, activeMesoId, onSelectMeso, onSelectWeek }: MesoLevelProps) {\n return (\n <View style={{ gap: 12 }} testID=\"program-planning-page-meso-level\">\n {mesos.map((meso) => {\n const expanded = meso.id === activeMesoId\n return (\n <MesoCard\n key={meso.id}\n name={meso.name}\n goal={meso.goal}\n split={meso.split}\n weekRange={meso.weekRange}\n currentWeek={meso.currentWeek}\n totalWeeks={meso.weekCount}\n weeks={expanded ? meso.weeks.map((week) => toWeekRow(week, meso, onSelectWeek)) : []}\n volumeHeatmap={meso.volumeHeatmap}\n expanded={expanded}\n onToggle={() => onSelectMeso(meso.id)}\n highlighted={expanded}\n />\n )\n })}\n </View>\n )\n}\n\ninterface WeekLevelProps {\n week: PlanWeek\n onSelectWorkout: (id: string) => void\n}\n\nfunction WeekLevel({ week, onSelectWorkout }: WeekLevelProps) {\n return (\n <View style={{ gap: 10 }} testID=\"program-planning-page-week-level\">\n {week.workouts.map((workout) => (\n <WorkoutCard\n key={workout.id}\n name={workout.name}\n date={workout.date}\n duration={workout.duration}\n status={workout.status}\n muscleGroups={workout.muscleGroups}\n totalSets={workout.totalSets}\n totalVolume={workout.totalVolume}\n unit={workout.unit}\n exercises={workout.exercises}\n expanded={false}\n onToggle={() => onSelectWorkout(workout.id)}\n />\n ))}\n </View>\n )\n}\n\ninterface WorkoutLevelProps {\n workout: PlanWorkout\n expandedExercise: number | null\n onToggleExercise: (index: number) => void\n}\n\nfunction WorkoutLevel({ workout, expandedExercise, onToggleExercise }: WorkoutLevelProps) {\n const exercises = workout.exercises.map((exercise, index) => ({\n ...exercise,\n state:\n exercise.state === 'upcoming'\n ? exercise.state\n : ((index === expandedExercise ? 'expanded' : 'collapsed') as ExerciseCardProps['state']),\n onToggle: () => onToggleExercise(index),\n }))\n return (\n <View testID=\"program-planning-page-workout-level\">\n <WorkoutCard\n name={workout.name}\n date={workout.date}\n duration={workout.duration}\n status={workout.status}\n muscleGroups={workout.muscleGroups}\n totalSets={workout.totalSets}\n totalVolume={workout.totalVolume}\n unit={workout.unit}\n exercises={exercises}\n expanded\n onToggle={() => undefined}\n />\n </View>\n )\n}\n\n/**\n * ProgramPlanningPage — a meso -> week -> workout drill-down over an entire\n * training program. A `MesoProgressBar` pins the mesocycle timeline to the top;\n * the body swaps between three levels: expandable `MesoCard`s (with inline\n * `WeekRow`s), a week's `WorkoutCard` list, and a single opened `WorkoutCard`\n * with inline `ExerciseCard` expansion. A breadcrumb trail tracks and rewinds\n * the drill path. Selection is page-level state; children keep their own styles.\n *\n * @example\n * <ProgramPlanningPage mesos={mesos} />\n */\nexport function ProgramPlanningPage({\n title = 'Program Plan',\n mesos,\n className,\n ...props\n}: ProgramPlanningPageProps) {\n const [activeMesoId, setActiveMesoId] = useState<string | null>(mesos[0]?.id ?? null)\n const [selectedWeek, setSelectedWeek] = useState<number | null>(null)\n const [selectedWorkoutId, setSelectedWorkoutId] = useState<string | null>(null)\n const [expandedExercise, setExpandedExercise] = useState<number | null>(null)\n\n const progressMesos = useMemo(() => toProgressBarMesos(mesos), [mesos])\n const activeMeso = findMeso(mesos, activeMesoId)\n const level = deriveNavLevel({ weekNumber: selectedWeek, workoutId: selectedWorkoutId })\n const activeWeek = findWeek(activeMeso, selectedWeek)\n const activeWorkout = findWorkout(activeWeek, selectedWorkoutId)\n\n const selectMeso = (id: string) => {\n setActiveMesoId(id)\n setSelectedWeek(null)\n setSelectedWorkoutId(null)\n }\n const selectWeek = (weekNumber: number) => {\n setSelectedWeek(weekNumber)\n setSelectedWorkoutId(null)\n setExpandedExercise(null)\n }\n const selectWorkout = (id: string) => {\n setSelectedWorkoutId(id)\n setExpandedExercise(null)\n }\n const toggleExercise = (index: number) =>\n setExpandedExercise((current) => (current === index ? null : index))\n\n const navigateTo = (target: ProgramNavLevel) => {\n if (target === 'meso') selectMeso(activeMesoId ?? mesos[0]?.id)\n else if (target === 'week' && selectedWeek != null) selectWeek(selectedWeek)\n }\n\n return (\n <View\n className={cn(className, 'bg-background-base')}\n style={{ width: 390 }}\n accessibilityRole={'main' as ViewProps['accessibilityRole']}\n aria-label={title}\n testID=\"program-planning-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 14 }} testID=\"program-planning-page-content\">\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 20,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"program-planning-page-title\"\n >\n {title}\n </Text>\n\n <View style={{ marginHorizontal: -16 }}>\n <MesoProgressBar\n mesos={progressMesos}\n activeMesoId={activeMesoId}\n onMesoPress={selectMeso}\n />\n </View>\n\n {activeMeso != null && (\n <Breadcrumbs\n crumbs={buildBreadcrumbs(activeMeso, selectedWeek, activeWorkout)}\n onNavigate={navigateTo}\n />\n )}\n\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n }}\n testID=\"program-planning-page-body\"\n >\n {level === 'meso' && (\n <MesoLevel\n mesos={mesos}\n activeMesoId={activeMesoId}\n onSelectMeso={selectMeso}\n onSelectWeek={selectWeek}\n />\n )}\n {level === 'week' && activeWeek != null && (\n <WeekLevel week={activeWeek} onSelectWorkout={selectWorkout} />\n )}\n {level === 'workout' && activeWorkout != null && (\n <WorkoutLevel\n workout={activeWorkout}\n expandedExercise={expandedExercise}\n onToggleExercise={toggleExercise}\n />\n )}\n </View>\n </View>\n </View>\n )\n}\n"]}
|