@titan-design/react-ui 0.10.0 → 0.12.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/bodymap.js +173 -343
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +173 -343
- package/dist/bodymap.mjs.map +1 -1
- package/dist/index.d.mts +416 -18
- package/dist/index.d.ts +416 -18
- package/dist/index.js +2512 -1307
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2480 -1299
- package/dist/index.mjs.map +1 -1
- package/dist/{pages-DyEx-lBf.d.ts → pages-B1hqnGIC.d.ts} +149 -15
- package/dist/{pages-D7hOD4Vj.d.mts → pages-CvsFqNtx.d.mts} +149 -15
- package/dist/pages.d.mts +1 -1
- package/dist/pages.d.ts +1 -1
- package/dist/pages.js +1644 -1575
- package/dist/pages.js.map +1 -1
- package/dist/pages.mjs +1645 -1576
- package/dist/pages.mjs.map +1 -1
- package/dist/theme/index.d.mts +409 -415
- package/dist/theme/index.d.ts +409 -415
- package/dist/theme/index.js +234 -408
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +227 -399
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/tokens-css.js +141 -140
- package/dist/theme/tokens-css.js.map +1 -1
- package/dist/theme/tokens-css.mjs +141 -140
- package/dist/theme/tokens-css.mjs.map +1 -1
- package/package.json +8 -3
- package/src/arch/Architecture.stories.tsx +9 -9
- package/src/components/custom/DateTime/DateTime.stories.tsx +1 -1
- package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +258 -0
- package/src/components/custom/Fatigue/DualGhostSpark.test.tsx +138 -0
- package/src/components/custom/Fatigue/DualGhostSpark.tsx +208 -0
- package/src/components/custom/Fatigue/FatigueLights.stories.tsx +74 -0
- package/src/components/custom/Fatigue/FatigueLights.test.tsx +33 -0
- package/src/components/custom/Fatigue/FatigueLights.tsx +83 -0
- package/src/components/custom/Fatigue/GhostBand.test.tsx +235 -0
- package/src/components/custom/Fatigue/GhostBand.tsx +246 -0
- package/src/components/custom/Fatigue/GhostBloom.tsx +132 -0
- package/src/components/custom/Fatigue/GhostSpark.stories.tsx +175 -0
- package/src/components/custom/Fatigue/GhostSpark.test.tsx +45 -0
- package/src/components/custom/Fatigue/GhostSpark.tsx +126 -0
- package/src/components/custom/Fatigue/LiveFatigueCard.stories.tsx +126 -0
- package/src/components/custom/Fatigue/LiveFatigueCard.test.tsx +28 -0
- package/src/components/custom/Fatigue/LiveFatigueCard.tsx +86 -0
- package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +95 -0
- package/src/components/custom/Fatigue/LiveFatiguePanel.tsx +151 -0
- package/src/components/custom/Fatigue/README.md +93 -0
- package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +94 -0
- package/src/components/custom/Fatigue/RomProgressionChart.test.tsx +31 -0
- package/src/components/custom/Fatigue/RomProgressionChart.tsx +132 -0
- package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +226 -0
- package/src/components/custom/Fatigue/VelocityHero.stories.tsx +70 -0
- package/src/components/custom/Fatigue/VelocityHero.test.tsx +26 -0
- package/src/components/custom/Fatigue/VelocityHero.tsx +46 -0
- package/src/components/custom/Fatigue/VerdictHero.stories.tsx +59 -0
- package/src/components/custom/Fatigue/VerdictHero.test.tsx +49 -0
- package/src/components/custom/Fatigue/VerdictHero.tsx +79 -0
- package/src/components/custom/Fatigue/fatigue-mock.test.ts +59 -0
- package/src/components/custom/Fatigue/fatigue-mock.ts +268 -0
- package/src/components/custom/Fatigue/fatigue-model.ts +129 -0
- package/src/components/custom/Fatigue/fatigue-tokens.test.ts +70 -0
- package/src/components/custom/Fatigue/fatigue-tokens.ts +180 -0
- package/src/components/custom/Fatigue/index.ts +41 -0
- package/src/components/custom/Fatigue/tempo-pacing.test.ts +176 -0
- package/src/components/custom/Fatigue/tempo-pacing.ts +112 -0
- package/src/components/custom/Sidebar/Sidebar.tsx +4 -4
- package/src/components/custom/Table/Table.tsx +2 -2
- package/src/components/custom/Workout/ActiveWorkoutPage.tsx +3 -3
- package/src/components/custom/Workout/BaseBadge.test.tsx +6 -1
- package/src/components/custom/Workout/BaseBadge.tsx +1 -1
- package/src/components/custom/Workout/BodyMap.tsx +2 -2
- package/src/components/custom/Workout/BodyMapDetailPanel.tsx +2 -2
- package/src/components/custom/Workout/DeviationBar.test.tsx +2 -1
- package/src/components/custom/Workout/DeviationBar.tsx +3 -2
- package/src/components/custom/Workout/DualVelocityStrip.test.tsx +685 -0
- package/src/components/custom/Workout/ExerciseCard.test.tsx +7 -7
- package/src/components/custom/Workout/ExerciseCard.tsx +5 -3
- package/src/components/custom/Workout/ExerciseDetailPage.tsx +11 -5
- package/src/components/custom/Workout/InputBar.tsx +2 -2
- package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +1 -1
- package/src/components/custom/Workout/LiveAuraFrame.test.tsx +1 -1
- package/src/components/custom/Workout/LiveAuraFrame.tsx +3 -3
- package/src/components/custom/Workout/MesoCard.tsx +3 -1
- package/src/components/custom/Workout/MuscleGroupChip.tsx +4 -3
- package/src/components/custom/Workout/PrHistoryModal.tsx +2 -2
- package/src/components/custom/Workout/ProgramPlanningPage.tsx +1 -1
- package/src/components/custom/Workout/README.md +62 -16
- package/src/components/custom/Workout/ReadinessCheck.tsx +2 -2
- package/src/components/custom/Workout/RestTimer.tsx +2 -2
- package/src/components/custom/Workout/S3SetTypes.stories.tsx +3 -3
- package/src/components/custom/Workout/SegmentedBar.stories.tsx +3 -3
- package/src/components/custom/Workout/SessionHeader.stories.tsx +2 -2
- package/src/components/custom/Workout/SessionHeader.tsx +1 -1
- package/src/components/custom/Workout/SessionRail.stories.tsx +2 -2
- package/src/components/custom/Workout/SessionRail.test.tsx +43 -0
- package/src/components/custom/Workout/SessionRail.tsx +63 -18
- package/src/components/custom/Workout/SetBar.tsx +3 -3
- package/src/components/custom/Workout/SetRow.test.tsx +12 -9
- package/src/components/custom/Workout/SetRow.tsx +9 -2
- package/src/components/custom/Workout/StatusDot.tsx +5 -4
- package/src/components/custom/Workout/StrengthTrendChart.tsx +1 -1
- package/src/components/custom/Workout/TrainingStatusPage.tsx +2 -2
- package/src/components/custom/Workout/VelocityStrip.compact.stories.tsx +191 -0
- package/src/components/custom/Workout/VelocityStrip.dual.stories.tsx +186 -0
- package/src/components/custom/Workout/VelocityStrip.expanded.stories.tsx +296 -0
- package/src/components/custom/Workout/VelocityStrip.hero.stories.tsx +259 -0
- package/src/components/custom/Workout/VelocityStrip.stories.tsx +217 -250
- package/src/components/custom/Workout/VelocityStrip.test.tsx +199 -79
- package/src/components/custom/Workout/VelocityStrip.tsx +953 -609
- package/src/components/custom/Workout/VolumeLandmarkBar.tsx +3 -3
- package/src/components/custom/Workout/WeightBadge.test.tsx +6 -1
- package/src/components/custom/Workout/WeightBadge.tsx +2 -1
- package/src/components/custom/Workout/WorkoutCard.tsx +3 -1
- package/src/components/custom/Workout/WorkoutPill.tsx +5 -2
- package/src/components/custom/Workout/ZoneTrack.tsx +4 -4
- package/src/components/custom/Workout/index.ts +3 -0
- package/src/components/custom/Workout/setHeadingKit.tsx +14 -8
- package/src/components/custom/Workout/velocity-story-kit.tsx +438 -0
- package/src/components/custom/charts/SetBarChart.test.tsx +275 -0
- package/src/components/custom/charts/SetBarChart.tsx +651 -0
- package/src/components/custom/charts/live-rep-growth.ts +91 -0
- package/src/components/custom/index.ts +1 -0
- package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
- package/src/components/custom/stepper/Stepper.tsx +3 -3
- package/src/components/shell/DeviceMenu.tsx +2 -2
- package/src/components/shell/SideNav.tsx +1 -1
- package/src/components/shell/TopBar.tsx +1 -1
- package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
- package/src/components/ui/autocomplete/Autocomplete.tsx +1 -1
- package/src/components/ui/avatar/Avatar.tsx +2 -2
- package/src/components/ui/badge/Badge.tsx +2 -2
- package/src/components/ui/card/Card.tsx +3 -3
- package/src/components/ui/checkbox/Checkbox.tsx +1 -1
- package/src/components/ui/collapse/Collapse.tsx +1 -1
- package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
- package/src/components/ui/drawer/Drawer.tsx +3 -3
- package/src/components/ui/form-field/FormField.tsx +1 -1
- package/src/components/ui/help-tip/HelpTip.tsx +1 -1
- package/src/components/ui/menu/Menu.tsx +2 -2
- package/src/components/ui/pill/Pill.tsx +2 -2
- package/src/components/ui/popover/Popover.stories.tsx +2 -2
- package/src/components/ui/popover/Popover.tsx +1 -1
- package/src/components/ui/progress/Progress.tsx +3 -3
- package/src/components/ui/radio/Radio.stories.tsx +1 -1
- package/src/components/ui/radio/Radio.tsx +4 -4
- package/src/components/ui/select/Select.tsx +3 -3
- package/src/components/ui/surface/Surface.stories.tsx +3 -3
- package/src/components/ui/surface/Surface.test.tsx +32 -19
- package/src/components/ui/surface/Surface.tsx +3 -3
- package/src/components/ui/surface/SurfaceContext.ts +19 -29
- package/src/components/ui/surface/surface.contract.test.ts +57 -44
- package/src/components/ui/switch/Switch.tsx +1 -1
- package/src/components/ui/tabs/Tabs.tsx +2 -2
- package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +5 -5
- package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +1 -1
- package/src/components/ui/toolbar-button/ToolbarButton.tsx +36 -22
- package/src/stories/PresetShowcase.stories.tsx +21 -21
- package/src/test/raw-color-patterns.test.ts +71 -0
- package/src/theme/ColorPalettes.stories.tsx +874 -0
- package/src/theme/ColorPrimitives.stories.tsx +348 -0
- package/src/theme/Depth.stories.tsx +312 -0
- package/src/theme/DepthCalibration.stories.tsx +655 -0
- package/src/theme/ThemeProvider.tsx +1 -1
- package/src/theme/barrel.ts +7 -14
- package/src/theme/color-stories.coverage.test.ts +125 -0
- package/src/theme/color-story-kit.tsx +170 -0
- package/src/theme/color-utils.ts +197 -0
- package/src/theme/config.ts +0 -8
- package/src/theme/depth-calibration.test.tsx +97 -0
- package/src/theme/elevation.test.ts +62 -1
- package/src/theme/elevation.ts +34 -8
- package/src/theme/global.css +47 -53
- package/src/theme/grey-ramp.test.ts +166 -0
- package/src/theme/materials.test.ts +106 -0
- package/src/theme/materials.ts +211 -0
- package/src/theme/presets/audiobook.ts +4 -4
- package/src/theme/presets/types.ts +3 -3
- package/src/theme/semantic-contrast.test.ts +83 -0
- package/src/theme/tokens/primitives.ts +62 -115
- package/src/theme/tokens/semantic.ts +130 -82
- package/src/utils/colors.ts +1 -1
- package/tailwind.config.js +2 -5
- package/src/components/custom/Workout/VelocityStrip.modalities.stories.tsx +0 -254
- package/src/components/custom/Workout/VelocityStrip.responsive.stories.tsx +0 -145
- package/src/theme/ColorSystem.stories.tsx +0 -508
- package/src/theme/Colors.stories.tsx +0 -323
- package/src/theme/shadows.stories.tsx +0 -523
- package/src/theme/shadows.ts +0 -439
package/dist/bodymap.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/cn.ts","../src/theme/tokens/primitives.ts","../src/theme/tokens/semantic.ts","../src/theme/resolve-color.ts","../src/theme/workout-tokens.ts","../src/components/custom/Workout/muscleTaxonomy.ts","../src/web-jsx/jsx-runtime.ts","../src/components/custom/Workout/BodyMap.tsx","../src/components/ui/indicator/Indicator.tsx","../src/components/ui/badge/Badge.tsx","../src/components/custom/Workout/Sparkline.tsx","../src/components/custom/Workout/BodyMapDetailPanel.tsx","../src/theme/shadows.ts","../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/TrainingStatusPage.tsx"],"names":["twMerge","clsx","Platform","MuscleGroup","SimpleMuscleGroup","cn","reactJsx","reactJsxs","BodyHighlighter","useMemo","useState","Animated","useEffect","Easing","View","Text","Pressable","sizeStyles","BRAND_PRIMARY","ScrollView","intensityConfig","useSyncExternalStore","Fragment","t","clamp01"],"mappings":"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","file":"bodymap.js","sourcesContent":["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","/**\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\n blue: {\n 50: '#EFF6FF',\n 100: '#DBEAFE',\n 200: '#BFDBFE',\n 300: '#93C5FD',\n 400: '#60A5FA',\n 500: '#3B82F6',\n 600: '#5048E5',\n 700: '#3832A0',\n 800: '#1E40AF',\n 900: '#1E3A8A',\n },\n\n // Red scale\n red: {\n 50: '#FEF2F2',\n 100: '#FEE2E2',\n 200: '#FECACA',\n 300: '#FCA5A5',\n 400: '#DA6868',\n 500: '#EF4444',\n 600: '#D14343',\n 700: '#922E2E',\n 800: '#991B1B',\n 900: '#7F1D1D',\n },\n\n // Vivid red scale\n redVivid: {\n 50: '#FFECEE',\n 100: '#FFD6DB',\n 200: '#FFB3BC',\n 300: '#FF8593',\n 400: '#FF6070',\n 500: '#FF4757',\n 600: '#E63548',\n 700: '#C42539',\n 800: '#9E1C2C',\n 900: '#7A1520',\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 // 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 // Pure colors\n white: '#FFFFFF',\n black: '#000000',\n transparent: 'transparent',\n} as const\n\n/**\n * Surface ramp — dark mode (TD-surface-tokens, S-1, re-spaced S-3)\n *\n * Warm-tapered, DERIVED ramp — NOT hand-picked. Shipped verbatim as the output of\n * `deriveSurfaceRamp(shellL=9, steps=[4.5,3.5,3,2.5], rbShadow=6, rbHilite=1.5)`\n * (see `packages/ui/src/components/ui/surface/surface-lab-shared.tsx` on branch\n * `feat/TD-unified-lab`, story `Lab/Surface Exploration -> Surface Ramp System`\n * — that lab default is `[4.5,2.5,2,1.5]` as of this writing and should be\n * updated to match on that branch, follow-up, not done here).\n * Lightness is CIELAB L* off the shell, with DIMINISHING steps (4.5/3.5/3/2.5) —\n * the frame->content jump is biggest, each plane above adds less, but the top\n * three planes (elevated/raised/overlay) were re-spaced WIDER (S-3) than the\n * original 2.5/2/1.5 taper so they read as distinct planes without leaning on\n * the hairline alone. `background`/`base`/`inset` are unchanged by the re-space.\n * Warmth (R-B) tapers 6 -> 1.5 from frame to hero so bright content planes stay\n * near-neutral.\n * Kept separate from the `charcoal` scale above (which several existing\n * components reference directly for unrelated shadow/track tints) so this\n * change is additive and doesn't ripple into those consumers.\n * See coordination/design-explorations/surface-system-north-star.md.\n */\nexport const surfaceRampDark = {\n inset: '#13100D', // L*4.5 — sub-shell well / pressed\n background: '#1C1916', // L*9 — shell / frame\n base: '#252321', // L*13.5 — main content plane\n elevated: '#2C2A28', // L*17 — nav / rail\n raised: '#31302F', // L*20 — cards\n overlay: '#373635', // L*22.5 — hero / popover\n} as const\n\n/**\n * Frame/bezel primitive — dark mode (TD-surface-tokens, S-3)\n *\n * The chrome that \"exits the content ramp\" entirely: the top bar + side nav\n * shell. Sits ONE STEP BELOW `surfaceRampDark.background` (L*9), darker even\n * than `surfaceRampDark.inset` (L*4.5) — it isn't a plane IN the ramp, it's\n * the bezel the ramp sits inside. Literal, not `deriveSurfaceRamp()` output.\n */\nexport const backgroundFrameDark = '#100D0A' // L*3.79\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 * 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 {\n primitiveColors as p,\n primitiveRamps as ramp,\n discreteRainbow,\n surfaceRampDark as surf,\n backgroundFrameDark,\n} 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 // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\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 // Deepest pressed pit (TD-surface-tokens, S-3) — light-mode counterpart of\n // the dark ramp's `inset` plane; a placeholder pairing, not part of the\n // dark-ramp investigation (surface.contract.test.ts is dark-mode only).\n 'surface-inset': p.neutral[300],\n\n // Background colors (background-*)\n 'background-base': '#EBEBEB',\n 'background-default': p.white,\n 'background-subtle': p.neutral[50],\n // Frame/bezel chrome (TD-surface-tokens, S-3) — top bar + side nav shell,\n // one step below `background-base` (darker still than `surface-inset`\n // above, mirroring the dark-mode ordering). Placeholder pairing for light\n // mode (see dark-mode note on `surface-inset` above).\n 'background-frame': p.neutral[400],\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 // Alpha hairline separators (surface-independent — composite toward black on\n // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.\n 'hairline-subtle': 'rgba(0, 0, 0, 0.06)',\n 'hairline-default': 'rgba(0, 0, 0, 0.09)',\n 'hairline-strong': 'rgba(0, 0, 0, 0.14)',\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 // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\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 — warm-tapered DERIVED ramp (TD-surface-tokens,\n // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see\n // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`\n // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`\n // tracks one plane above `surface-base`, same relative position as before the remap.\n // `background-base` backs `Surface level=\"background\"` (SurfaceContext.SURFACE_LEVEL_TOKEN),\n // so it takes the ramp's `background` (shell/frame) role, NOT `inset`. The ramp's\n // deepest `inset` plane is now promoted to `surface-inset` below (S-3) — still no\n // `SurfaceLevel` member for it (follow-up, alongside the elevation.ts -1/-2 pressed\n // levels — parallel workstream, not this branch).\n 'surface-base': surf.base, // main surface (#252321, L*13.5)\n 'surface-elevated': surf.elevated, // elevated surface (#2C2A28, L*17 — nav/rail)\n 'surface-raised': surf.raised, // raised surface (#31302F, L*20 — cards)\n 'surface-overlay': surf.overlay, // overlay surface (#373635, L*22.5 — hero/popover)\n 'surface-input': surf.elevated, // input surface (#2C2A28 — one plane above base)\n 'surface-inset': surf.inset, // deepest pressed pit (#13100D, L*4.5 — sub-shell well)\n\n // Background colors — same ramp, the frame/shell end of it.\n 'background-base': surf.background, // shell / frame (#1C1916, L*9 — Surface level=\"background\")\n 'background-default': surf.base, // main background (#252321, L*13.5 — matches surface-base)\n 'background-subtle': surf.elevated, // subtle background (#2C2A28, L*17 — matches surface-elevated)\n // Frame/bezel chrome (S-3) — the top bar + side nav shell; one step BELOW\n // `background-base`, darker even than `surface-inset` — it exits the content\n // ramp entirely rather than sitting in it. See `backgroundFrameDark` in\n // primitives.ts.\n 'background-frame': backgroundFrameDark, // frame / bezel (#100D0A, L*3.79)\n\n // Border colors — `border-subtle` (#1C1C1C) previously collided with\n // `surface-raised` (also #1C1C1C, an invisible border on raised cards). The\n // re-spaced ramp above moved `surface-raised` to #2D2C2B, so this value is now\n // distinct from every surface hex without needing to change it — see\n // `surface.contract.test.ts` R2/R4.\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 // Alpha hairline separators — the primary separation cue (§4/S-2). Self-\n // normalizing: composites toward white by ~the same amount on ANY plane, so\n // one family works at every elevation instead of per-surface border tokens.\n // Shadows are demoted to floating-overlay use only (not shipped as a fill\n // separator here — see elevation.ts, follow-up S-4).\n 'hairline-subtle': 'rgba(255, 255, 255, 0.06)',\n 'hairline-default': 'rgba(255, 255, 255, 0.09)',\n 'hairline-strong': 'rgba(255, 255, 255, 0.14)',\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","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","/**\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,2,3,4] subsample of\n // the canonical `sequentialEffort` primitive: an EVEN hue walk across the ramp\n // (green → gold → orange → red). The earlier [0,1,2,4] spent two of its four\n // bands on adjacent yellows (amber-200 + amber-300) and skipped orange, reading\n // yellow-heavy with an abrupt jump to red; sampling amber-300 + orange-400\n // instead gives four cleanly separable bands that hold at 3px strip scale.\n // Consumed inline (RN).\n scale: {\n green: sequentialEffort[0], // green-300\n yellow: sequentialEffort[2], // amber-300 (gold)\n orange: sequentialEffort[3], // orange-400 (true orange)\n red: sequentialEffort[4], // red-600\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","/**\n * Muscle grouping taxonomy for volume tracking, exercise mapping, and the\n * BodyMap visualization. Ported from the Voltras muscle-taxonomy design doc.\n *\n * Level 2 (15 groups) is the primary volume-tracking unit; SimpleMuscleGroup\n * (8 groups) is the beginner-facing aggregation. MUSCLE_TO_SVG_SLUGS maps each\n * group to react-native-body-highlighter slugs using the closest-slug approach\n * (Phase 1: combined colors, no sub-region splitting — deltoids is a single\n * slug, lats and upper back share `upper-back`).\n */\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\n/**\n * Full muscle group taxonomy for volume tracking and exercise mapping.\n * 15 groups — the primary unit for volume accounting.\n */\nexport enum MuscleGroup {\n // Push\n CHEST = 'chest',\n FRONT_DELTS = 'front_delts',\n SIDE_DELTS = 'side_delts',\n TRICEPS = 'triceps',\n\n // Pull\n LATS = 'lats',\n UPPER_BACK = 'upper_back',\n REAR_DELTS = 'rear_delts',\n BICEPS = 'biceps',\n FOREARMS = 'forearms',\n\n // Legs\n QUADS = 'quads',\n HAMSTRINGS = 'hamstrings',\n GLUTES = 'glutes',\n CALVES = 'calves',\n\n // Core\n ABS = 'abs',\n OBLIQUES = 'obliques',\n}\n\n/**\n * Simplified muscle group view for beginners. Maps to one or more MuscleGroup.\n */\nexport enum SimpleMuscleGroup {\n CHEST = 'chest',\n BACK = 'back',\n SHOULDERS = 'shoulders',\n BICEPS = 'biceps',\n TRICEPS = 'triceps',\n LEGS = 'legs',\n CORE = 'core',\n FOREARMS = 'forearms',\n}\n\n/** Mapping from simplified groups to the full taxonomy. */\nexport const SIMPLE_TO_DETAILED: Record<SimpleMuscleGroup, MuscleGroup[]> = {\n [SimpleMuscleGroup.CHEST]: [MuscleGroup.CHEST],\n [SimpleMuscleGroup.BACK]: [MuscleGroup.LATS, MuscleGroup.UPPER_BACK],\n [SimpleMuscleGroup.SHOULDERS]: [\n MuscleGroup.FRONT_DELTS,\n MuscleGroup.SIDE_DELTS,\n MuscleGroup.REAR_DELTS,\n ],\n [SimpleMuscleGroup.BICEPS]: [MuscleGroup.BICEPS],\n [SimpleMuscleGroup.TRICEPS]: [MuscleGroup.TRICEPS],\n [SimpleMuscleGroup.LEGS]: [\n MuscleGroup.QUADS,\n MuscleGroup.HAMSTRINGS,\n MuscleGroup.GLUTES,\n MuscleGroup.CALVES,\n ],\n [SimpleMuscleGroup.CORE]: [MuscleGroup.ABS, MuscleGroup.OBLIQUES],\n [SimpleMuscleGroup.FOREARMS]: [MuscleGroup.FOREARMS],\n}\n\n/** Reverse map: detailed MuscleGroup -> its SimpleMuscleGroup. */\nexport const DETAILED_TO_SIMPLE: Record<MuscleGroup, SimpleMuscleGroup> = Object.entries(\n SIMPLE_TO_DETAILED\n).reduce(\n (acc, [simple, groups]) => {\n for (const group of groups) {\n acc[group] = simple as SimpleMuscleGroup\n }\n return acc\n },\n {} as Record<MuscleGroup, SimpleMuscleGroup>\n)\n\n/** Movement category for training split organization. */\nexport type MovementCategory = 'push' | 'pull' | 'legs' | 'core'\n\nexport const MUSCLE_TO_CATEGORY: Record<MuscleGroup, MovementCategory> = {\n [MuscleGroup.CHEST]: 'push',\n [MuscleGroup.FRONT_DELTS]: 'push',\n [MuscleGroup.SIDE_DELTS]: 'push',\n [MuscleGroup.TRICEPS]: 'push',\n [MuscleGroup.LATS]: 'pull',\n [MuscleGroup.UPPER_BACK]: 'pull',\n [MuscleGroup.REAR_DELTS]: 'pull',\n [MuscleGroup.BICEPS]: 'pull',\n [MuscleGroup.FOREARMS]: 'pull',\n [MuscleGroup.QUADS]: 'legs',\n [MuscleGroup.HAMSTRINGS]: 'legs',\n [MuscleGroup.GLUTES]: 'legs',\n [MuscleGroup.CALVES]: 'legs',\n [MuscleGroup.ABS]: 'core',\n [MuscleGroup.OBLIQUES]: 'core',\n}\n\n/**\n * react-native-body-highlighter slug(s) per muscle group. Phase 1 uses the\n * closest available slug; deltoids share one path and lats/upper-back share\n * `upper-back` (see doc Level 4 \"Recommended approach\").\n */\nexport const MUSCLE_TO_SVG_SLUGS: Record<MuscleGroup, string[]> = {\n [MuscleGroup.CHEST]: ['chest'],\n [MuscleGroup.FRONT_DELTS]: ['deltoids'],\n [MuscleGroup.SIDE_DELTS]: ['deltoids'],\n [MuscleGroup.REAR_DELTS]: ['deltoids'],\n [MuscleGroup.TRICEPS]: ['triceps'],\n [MuscleGroup.LATS]: ['upper-back'],\n [MuscleGroup.UPPER_BACK]: ['upper-back', 'trapezius'],\n [MuscleGroup.BICEPS]: ['biceps'],\n [MuscleGroup.FOREARMS]: ['forearm'],\n [MuscleGroup.QUADS]: ['quadriceps'],\n [MuscleGroup.HAMSTRINGS]: ['hamstring'],\n [MuscleGroup.GLUTES]: ['gluteal'],\n [MuscleGroup.CALVES]: ['calves'],\n [MuscleGroup.ABS]: ['abs'],\n [MuscleGroup.OBLIQUES]: ['obliques'],\n}\n\n/** Human-readable name per muscle group (used in a11y labels). */\nexport const MUSCLE_DISPLAY_NAMES: Record<MuscleGroup, string> = {\n [MuscleGroup.CHEST]: 'Chest',\n [MuscleGroup.FRONT_DELTS]: 'Front Delts',\n [MuscleGroup.SIDE_DELTS]: 'Side Delts',\n [MuscleGroup.REAR_DELTS]: 'Rear Delts',\n [MuscleGroup.TRICEPS]: 'Triceps',\n [MuscleGroup.LATS]: 'Lats',\n [MuscleGroup.UPPER_BACK]: 'Upper Back',\n [MuscleGroup.BICEPS]: 'Biceps',\n [MuscleGroup.FOREARMS]: 'Forearms',\n [MuscleGroup.QUADS]: 'Quads',\n [MuscleGroup.HAMSTRINGS]: 'Hamstrings',\n [MuscleGroup.GLUTES]: 'Glutes',\n [MuscleGroup.CALVES]: 'Calves',\n [MuscleGroup.ABS]: 'Abs',\n [MuscleGroup.OBLIQUES]: 'Obliques',\n}\n\n/** Human-readable name per simple group. */\nexport const SIMPLE_DISPLAY_NAMES: Record<SimpleMuscleGroup, string> = {\n [SimpleMuscleGroup.CHEST]: 'Chest',\n [SimpleMuscleGroup.BACK]: 'Back',\n [SimpleMuscleGroup.SHOULDERS]: 'Shoulders',\n [SimpleMuscleGroup.BICEPS]: 'Biceps',\n [SimpleMuscleGroup.TRICEPS]: 'Triceps',\n [SimpleMuscleGroup.LEGS]: 'Legs',\n [SimpleMuscleGroup.CORE]: 'Core',\n [SimpleMuscleGroup.FOREARMS]: 'Forearms',\n}\n\n/** Volume landmarks per muscle group (weekly working sets). */\nexport interface VolumeLandmarks {\n mev: number // Minimum Effective Volume\n mav: number // Maximum Adaptive Volume\n mrv: number // Maximum Recoverable Volume\n}\n\nexport const DEFAULT_VOLUME_LANDMARKS: Record<MuscleGroup, VolumeLandmarks> = {\n [MuscleGroup.CHEST]: { mev: 8, mav: 14, mrv: 20 },\n [MuscleGroup.LATS]: { mev: 8, mav: 14, mrv: 20 },\n [MuscleGroup.UPPER_BACK]: { mev: 6, mav: 12, mrv: 18 },\n [MuscleGroup.FRONT_DELTS]: { mev: 2, mav: 6, mrv: 10 },\n [MuscleGroup.SIDE_DELTS]: { mev: 6, mav: 14, mrv: 22 },\n [MuscleGroup.REAR_DELTS]: { mev: 6, mav: 12, mrv: 18 },\n [MuscleGroup.BICEPS]: { mev: 4, mav: 10, mrv: 18 },\n [MuscleGroup.TRICEPS]: { mev: 4, mav: 8, mrv: 14 },\n [MuscleGroup.FOREARMS]: { mev: 2, mav: 6, mrv: 12 },\n [MuscleGroup.QUADS]: { mev: 6, mav: 12, mrv: 18 },\n [MuscleGroup.HAMSTRINGS]: { mev: 4, mav: 10, mrv: 16 },\n [MuscleGroup.GLUTES]: { mev: 4, mav: 10, mrv: 16 },\n [MuscleGroup.CALVES]: { mev: 6, mav: 10, mrv: 16 },\n [MuscleGroup.ABS]: { mev: 0, mav: 8, mrv: 16 },\n [MuscleGroup.OBLIQUES]: { mev: 0, mav: 6, mrv: 12 },\n}\n\n/** Weekly-volume status relative to MEV/MAV/MRV landmarks. */\nexport type VolumeStatus = 'under' | 'maintenance' | 'productive' | 'over'\n\n/** Readable label per status for a11y descriptions. */\nexport const VOLUME_STATUS_LABELS: Record<VolumeStatus, string> = {\n under: 'under-trained',\n maintenance: 'maintenance',\n productive: 'productive',\n over: 'over-reaching',\n}\n\n/** Severity ranking — higher wins when several groups share an SVG slug. */\nconst STATUS_SEVERITY: Record<VolumeStatus, number> = {\n under: 1,\n maintenance: 2,\n productive: 3,\n over: 4,\n}\n\n/**\n * Maps a volume status (and intensity, 0-1) to a heatmap fill color. The\n * `approaching` token is used when a productive muscle nears its MRV.\n */\nexport function getHeatmapColor(status: VolumeStatus | null | undefined, intensity = 0): string {\n const heatmap = WORKOUT_TOKENS.heatmap\n switch (status) {\n case 'under':\n return heatmap.under\n case 'maintenance':\n return heatmap.maintenance\n case 'productive':\n return intensity >= 0.85 ? heatmap.approaching : heatmap.productive\n case 'over':\n return heatmap.over\n default:\n return heatmap.none\n }\n}\n\n/** True when one status is at least as severe as another. */\nexport function isMoreSevere(a: VolumeStatus, b: VolumeStatus): boolean {\n return STATUS_SEVERITY[a] >= STATUS_SEVERITY[b]\n}\n\n/**\n * Representative MuscleGroup for each SVG slug, used to resolve taps on shared\n * paths (e.g. `deltoids`, `upper-back`) back to a single group.\n */\nexport const SLUG_TO_PRIMARY_MUSCLE: Record<string, MuscleGroup> = {\n chest: MuscleGroup.CHEST,\n deltoids: MuscleGroup.SIDE_DELTS,\n triceps: MuscleGroup.TRICEPS,\n 'upper-back': MuscleGroup.LATS,\n trapezius: MuscleGroup.UPPER_BACK,\n biceps: MuscleGroup.BICEPS,\n forearm: MuscleGroup.FOREARMS,\n quadriceps: MuscleGroup.QUADS,\n hamstring: MuscleGroup.HAMSTRINGS,\n gluteal: MuscleGroup.GLUTES,\n calves: MuscleGroup.CALVES,\n abs: MuscleGroup.ABS,\n obliques: MuscleGroup.OBLIQUES,\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, useMemo, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport BodyHighlighter, { type ExtendedBodyPart, type Slug } from 'react-native-body-highlighter'\nimport { cn } from '../../../utils/cn'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MuscleGroup,\n SimpleMuscleGroup,\n MUSCLE_TO_SVG_SLUGS,\n MUSCLE_DISPLAY_NAMES,\n SIMPLE_DISPLAY_NAMES,\n DETAILED_TO_SIMPLE,\n SLUG_TO_PRIMARY_MUSCLE,\n VOLUME_STATUS_LABELS,\n getHeatmapColor,\n isMoreSevere,\n type VolumeStatus,\n} from './muscleTaxonomy'\n\n/**\n * react-native-body-highlighter is published as a CommonJS default export; the\n * interop keeps it working whether the bundler unwraps the default or not.\n */\nconst Body = ((BodyHighlighter as unknown as { default?: typeof BodyHighlighter }).default ??\n BodyHighlighter) as typeof BodyHighlighter\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nconst OUTLINE_FILL = 'rgba(255,255,255,0.08)'\nconst OUTLINE_BORDER = 'rgba(255,255,255,0.12)'\nconst BODY_SCALE = 0.8 // 200x400 intrinsic -> ~160x320 px\n\nexport interface BodyMapData {\n muscleGroup: MuscleGroup\n /** Intensity 0-1 for heatmap color. */\n intensity: number\n /** Volume status for tooltip / heatmap token. */\n volumeStatus: VolumeStatus\n /** Weekly effective sets. */\n weeklySets: number\n}\n\nexport interface BodyMapProps extends ViewProps {\n /** Muscle group intensity data. */\n data: BodyMapData[]\n /** Which view to show. */\n view: 'front' | 'back'\n /** Toggle between front/back. */\n onViewChange?: (view: 'front' | 'back') => void\n /** Called when a muscle group is tapped. */\n onMusclePress?: (muscleGroup: MuscleGroup) => void\n /** Currently highlighted muscle (from external selection). */\n highlightedMuscle?: MuscleGroup | null\n /** Show simplified (8 groups) or detailed (15 groups). */\n mode?: 'simple' | 'detailed'\n className?: string\n}\n\ninterface LegendEntry {\n key: string\n name: string\n status: VolumeStatus\n intensity: number\n sets: number\n /** Detailed group reported to onMusclePress. */\n muscle: MuscleGroup\n}\n\n/** Build the per-slug heatmap fill list, combining groups that share a slug. */\nfunction buildSlugParts(data: BodyMapData[]): ExtendedBodyPart[] {\n const bySlug = new Map<string, { status: VolumeStatus; intensity: number }>()\n for (const d of data) {\n for (const slug of MUSCLE_TO_SVG_SLUGS[d.muscleGroup] ?? []) {\n const existing = bySlug.get(slug)\n if (!existing || isMoreSevere(d.volumeStatus, existing.status)) {\n bySlug.set(slug, { status: d.volumeStatus, intensity: d.intensity })\n }\n }\n }\n return Array.from(bySlug.entries()).map(([slug, v]) => ({\n slug: slug as Slug,\n color: getHeatmapColor(v.status, v.intensity),\n }))\n}\n\n/** Collapse data into per-simple-group legend entries (summed sets). */\nfunction buildSimpleLegend(data: BodyMapData[]): LegendEntry[] {\n const bySimple = new Map<SimpleMuscleGroup, LegendEntry>()\n for (const d of data) {\n const simple = DETAILED_TO_SIMPLE[d.muscleGroup]\n const existing = bySimple.get(simple)\n if (!existing) {\n bySimple.set(simple, {\n key: simple,\n name: SIMPLE_DISPLAY_NAMES[simple],\n status: d.volumeStatus,\n intensity: d.intensity,\n sets: d.weeklySets,\n muscle: d.muscleGroup,\n })\n continue\n }\n existing.sets += d.weeklySets\n existing.intensity = Math.max(existing.intensity, d.intensity)\n if (isMoreSevere(d.volumeStatus, existing.status)) {\n existing.status = d.volumeStatus\n existing.muscle = d.muscleGroup\n }\n }\n return Array.from(bySimple.values())\n}\n\n/** One legend entry per data row, named by detailed group. */\nfunction buildDetailedLegend(data: BodyMapData[]): LegendEntry[] {\n return data.map((d) => ({\n key: d.muscleGroup,\n name: MUSCLE_DISPLAY_NAMES[d.muscleGroup],\n status: d.volumeStatus,\n intensity: d.intensity,\n sets: d.weeklySets,\n muscle: d.muscleGroup,\n }))\n}\n\n/**\n * Interactive SVG body map with tappable muscle groups and a volume heatmap.\n * Renders the front or back view (toggle via onViewChange), colors each muscle\n * by its weekly-volume status, and exposes an accessible muscle legend wired to\n * onMusclePress. Phase 1 uses react-native-body-highlighter's combined slugs\n * (deltoids as one path, lats/upper-back shared); swipe between views and the\n * delt/lat SVG split are follow-ups.\n *\n * @example\n * <BodyMap\n * data={[{ muscleGroup: MuscleGroup.CHEST, intensity: 0.7, volumeStatus: 'productive', weeklySets: 12 }]}\n * view=\"front\"\n * onViewChange={setView}\n * onMusclePress={setSelected}\n * highlightedMuscle={selected}\n * />\n */\nexport function BodyMap({\n data,\n view,\n onViewChange,\n onMusclePress,\n highlightedMuscle,\n mode = 'detailed',\n className,\n ...props\n}: BodyMapProps) {\n const slugParts = useMemo(() => buildSlugParts(data), [data])\n const legend = useMemo(\n () => (mode === 'simple' ? buildSimpleLegend(data) : buildDetailedLegend(data)),\n [data, mode]\n )\n\n const [highlight] = useState(() => new Animated.Value(highlightedMuscle ? 1 : 0))\n useEffect(() => {\n const animation = Animated.timing(highlight, {\n toValue: highlightedMuscle ? 1 : 0,\n duration: 250,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [highlightedMuscle, highlight])\n\n const scale = highlight.interpolate({ inputRange: [0, 1], outputRange: [1, 1.02] })\n const glowColor = highlightedMuscle\n ? getHeatmapColor(\n data.find((d) => d.muscleGroup === highlightedMuscle)?.volumeStatus,\n data.find((d) => d.muscleGroup === highlightedMuscle)?.intensity ?? 0\n )\n : null\n\n const handleBodyPress = (part: ExtendedBodyPart) => {\n if (!onMusclePress || !part.slug) return\n const fromData = data.find((d) =>\n (MUSCLE_TO_SVG_SLUGS[d.muscleGroup] ?? []).includes(part.slug as string)\n )\n const muscle = fromData?.muscleGroup ?? SLUG_TO_PRIMARY_MUSCLE[part.slug]\n if (muscle) onMusclePress(muscle)\n }\n\n return (\n <View className={cn(className)} testID=\"body-map\" {...props}>\n <ViewToggle view={view} onViewChange={onViewChange} />\n\n <Animated.View\n style={[\n {\n width: 200 * BODY_SCALE,\n alignSelf: 'center',\n transform: [{ scale }],\n },\n glowColor ? { boxShadow: `0 0 14px 2px ${glowColor}` } : undefined,\n ]}\n // The SVG is decorative; the accessible muscle legend below is the\n // screen-reader / keyboard interface.\n aria-hidden\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"body-map-svg\"\n >\n <Body\n side={view}\n data={slugParts}\n scale={BODY_SCALE}\n gender=\"male\"\n defaultFill={OUTLINE_FILL}\n border={OUTLINE_BORDER}\n onBodyPartPress={handleBodyPress}\n />\n </Animated.View>\n\n {legend.length === 0 ? (\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 8,\n fontSize: 12,\n textAlign: 'center',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"body-map-empty\"\n >\n No training data\n </Text>\n ) : (\n <View\n className=\"flex-row flex-wrap\"\n style={{ marginTop: 10, gap: 6, justifyContent: 'center' }}\n testID=\"body-map-legend\"\n >\n {legend.map((entry) => (\n <MuscleButton\n key={entry.key}\n entry={entry}\n highlighted={highlightedMuscle === entry.muscle}\n onMusclePress={onMusclePress}\n />\n ))}\n </View>\n )}\n </View>\n )\n}\n\ninterface ViewToggleProps {\n view: 'front' | 'back'\n onViewChange?: (view: 'front' | 'back') => void\n}\n\nfunction ViewToggle({ view, onViewChange }: ViewToggleProps) {\n return (\n <View\n className=\"flex-row self-center\"\n style={{ gap: 4, marginBottom: 8 }}\n testID=\"body-map-view-toggle\"\n >\n {(['front', 'back'] as const).map((side) => {\n const active = view === side\n return (\n <Pressable\n key={side}\n onPress={() => onViewChange?.(side)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Show ${side} view`}\n aria-pressed={active}\n disabled={!onViewChange}\n style={{\n paddingHorizontal: 12,\n paddingVertical: 4,\n borderRadius: 9999,\n backgroundColor: active ? 'rgba(255,121,0,0.16)' : 'transparent',\n borderWidth: 1,\n borderColor: active ? BRAND_PRIMARY : resolveColor('border-strong'),\n }}\n testID={`body-map-toggle-${side}`}\n >\n <Text\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: active ? '700' : '500',\n color: active ? BRAND_PRIMARY : resolveColor('text-secondary'),\n textTransform: 'capitalize',\n }}\n >\n {side}\n </Text>\n </Pressable>\n )\n })}\n </View>\n )\n}\n\ninterface MuscleButtonProps {\n entry: LegendEntry\n highlighted: boolean\n onMusclePress?: (muscleGroup: MuscleGroup) => void\n}\n\nfunction MuscleButton({ entry, highlighted, onMusclePress }: MuscleButtonProps) {\n const dotColor = getHeatmapColor(entry.status, entry.intensity)\n const label = `${entry.name}, ${VOLUME_STATUS_LABELS[entry.status]}, ${entry.sets} sets this week`\n return (\n <Pressable\n onPress={() => onMusclePress?.(entry.muscle)}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n aria-pressed={highlighted}\n className=\"bg-surface-raised\"\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 9999,\n borderWidth: 1,\n borderColor: highlighted ? BRAND_PRIMARY : resolveColor('border-default'),\n }}\n testID={`body-map-muscle-${entry.key}`}\n >\n <View\n style={{ width: 7, height: 7, borderRadius: 9999, backgroundColor: dotColor }}\n accessibilityElementsHidden\n testID={`body-map-muscle-dot-${entry.key}`}\n />\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n }}\n accessibilityElementsHidden\n >\n {entry.name}\n </Text>\n </Pressable>\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 | 'live'\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 live: 'bg-status-live',\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 &&\n !customColor &&\n (color === 'success' || color === 'live') &&\n '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 React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport interface SparklineProps extends ViewProps {\n data: number[]\n width?: number\n height?: number\n color?: string\n showDots?: boolean\n referenceLines?: Array<{\n value: number\n color: string\n dashed?: boolean\n label?: string\n }>\n highlightLast?: boolean\n className?: string\n}\n\nfunction normalizeData(\n data: number[],\n height: number,\n): number[] {\n if (data.length === 0) return []\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n return data.map((v) => height - ((v - min) / range) * height)\n}\n\nfunction normalizeValue(\n value: number,\n data: number[],\n height: number,\n): number {\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n return height - ((value - min) / range) * height\n}\n\nexport function Sparkline({\n data,\n width = 80,\n height = 30,\n color,\n showDots = false,\n referenceLines,\n highlightLast = false,\n className,\n ...props\n}: SparklineProps) {\n if (data.length === 0) {\n return (\n <View\n style={{ width, height }}\n className={className}\n testID=\"sparkline-empty\"\n accessibilityLabel=\"Sparkline chart, no data\"\n {...props}\n />\n )\n }\n\n const resolvedColor = color ?? BRAND_PRIMARY\n const normalized = normalizeData(data, height)\n const stepX = data.length > 1 ? width / (data.length - 1) : 0\n\n const dotSize = 3\n const highlightSize = 6\n\n return (\n <View\n style={{ width, height, position: 'relative' }}\n className={cn(className)}\n accessibilityRole=\"image\"\n accessibilityLabel={`Sparkline chart with ${data.length} data points`}\n testID=\"sparkline\"\n {...props}\n >\n {referenceLines?.map((line, i) => {\n const y = normalizeValue(line.value, data, height)\n return (\n <View\n key={`ref-${i}`}\n style={[\n {\n position: 'absolute',\n top: y,\n left: 0,\n right: 0,\n opacity: 0.6,\n },\n line.dashed\n ? {\n height: 0,\n borderStyle: 'dashed',\n borderTopWidth: 1,\n borderTopColor: line.color,\n }\n : {\n height: 1,\n backgroundColor: line.color,\n },\n ]}\n accessibilityElementsHidden\n testID={`sparkline-reference-${i}`}\n >\n {line.label && (\n <Text\n style={{\n position: 'absolute',\n right: 0,\n top: -10,\n fontSize: 7,\n color: line.color,\n opacity: 1,\n }}\n testID={`sparkline-reference-label-${i}`}\n >\n {line.label}\n </Text>\n )}\n </View>\n )\n })}\n\n {/* Line segments connecting data points */}\n {normalized.map((y, i) => {\n if (i === 0) return null\n const prevY = normalized[i - 1]\n const x1 = (i - 1) * stepX\n const x2 = i * stepX\n const dx = x2 - x1\n const dy = y - prevY\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={`line-${i}`}\n style={{\n position: 'absolute',\n left: x1,\n top: prevY,\n width: length,\n height: 1.5,\n backgroundColor: resolvedColor,\n transformOrigin: '0 0',\n transform: [{ rotate: `${angle}deg` }],\n }}\n accessibilityElementsHidden\n testID={`sparkline-segment-${i}`}\n />\n )\n })}\n\n {/* Data point dots */}\n {(showDots || highlightLast) &&\n normalized.map((y, i) => {\n const isLast = i === data.length - 1\n const shouldShow = showDots || (highlightLast && isLast)\n if (!shouldShow) return null\n\n const size = highlightLast && isLast ? highlightSize : dotSize\n return (\n <View\n key={`dot-${i}`}\n style={{\n position: 'absolute',\n left: i * stepX - size / 2,\n top: y - size / 2,\n width: size,\n height: size,\n borderRadius: size / 2,\n backgroundColor: resolvedColor,\n }}\n accessibilityElementsHidden\n testID={`sparkline-dot-${i}`}\n />\n )\n })}\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 {\n View,\n Text,\n Pressable,\n ScrollView,\n Animated,\n Easing,\n type ViewProps,\n type ViewStyle,\n} from 'react-native'\nimport { Badge, type BadgeColor } from '../../ui/badge'\nimport { Sparkline } from './Sparkline'\nimport {\n MuscleGroup,\n VOLUME_STATUS_LABELS,\n type VolumeLandmarks,\n type VolumeStatus,\n} from './muscleTaxonomy'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = t['brand-primary']\n\n/** Volume track gradient: status-info -> status-success -> status-error. */\nconst VOLUME_GRADIENT = `linear-gradient(90deg, ${t['status-info']} 0%, ${t['status-success']} 50%, ${t['status-error']} 100%)`\n\n/** Sheet slides up from this offset (px) and the backdrop fades to this opacity. */\nconst SLIDE_OFFSET = 400\nconst BACKDROP_OPACITY = 0.4\n\n/** Volume status -> Badge color scheme. */\nconst STATUS_BADGE_COLOR: Record<VolumeStatus, BadgeColor> = {\n under: 'info',\n maintenance: 'warning',\n productive: 'success',\n over: 'error',\n}\n\nexport interface ContributingExercise {\n /** Exercise name. */\n name: string\n /** Working sets contributed this week. */\n sets: number\n /** Effective-set multiplier toward this muscle (0-1). */\n contributionWeight: number\n}\n\nexport interface UpcomingExercise {\n /** Exercise name. */\n name: string\n /** Workout the exercise belongs to. */\n workoutName: string\n /** Planned sets. */\n sets: number\n}\n\nexport interface BodyMapDetailPanelProps extends ViewProps {\n /** Muscle group whose volume detail is shown. */\n muscleGroup: MuscleGroup\n /** Human-readable muscle name for the title and a11y label. */\n displayName: string\n /** Weekly effective sets logged for this muscle. */\n weeklySets: number\n /** Volume landmarks (weekly working sets). */\n landmarks: VolumeLandmarks\n /** Weekly-volume status relative to the landmarks. */\n volumeStatus: VolumeStatus\n /** Last trained label, e.g. \"2 days ago\". */\n lastTrained?: string\n /** Volume sparkline data (last 4-8 weeks). */\n weeklyHistory?: number[]\n /** Exercises contributing to this muscle's volume. */\n contributingExercises?: ContributingExercise[]\n /** Upcoming exercises targeting this muscle. */\n upcomingExercises?: UpcomingExercise[]\n /** Whether the bottom sheet is visible. */\n isOpen?: boolean\n /** Alias for `isOpen` (spec wording: \"isOpen/visible\"). `isOpen` wins when both are set. */\n visible?: boolean\n /** Dismiss the panel (backdrop, handle, or close button). */\n onClose: () => void\n /** Navigate to a filtered exercise list. */\n onViewExercises?: () => void\n}\n\nfunction clamp01(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** Marker position (0-1) of current sets between MEV (left) and MRV (right). */\nfunction markerFraction(weeklySets: number, { mev, mrv }: VolumeLandmarks): number {\n const span = mrv - mev\n if (span <= 0) return weeklySets >= mrv ? 1 : 0\n return clamp01((weeklySets - mev) / span)\n}\n\n/**\n * Slide-up bottom-sheet panel with detailed weekly-volume info for a tapped\n * muscle group: a MEV|current|MRV gradient progress bar, the big weekly set\n * count against MRV, an optional volume sparkline, and the contributing /\n * upcoming exercise lists. Composes the titan `Badge` and Workout `Sparkline`.\n *\n * Controlled via `isOpen` (or the `visible` alias); renders nothing when closed\n * and animates in on open — sheet translateY 400->0 (400ms ease-out) and a\n * backdrop fade 0->0.4 (RN Animated, useNativeDriver:false). Backdrop, handle,\n * and the header close button all call `onClose`.\n *\n * @example\n * <BodyMapDetailPanel\n * muscleGroup={MuscleGroup.CHEST}\n * displayName=\"Chest\"\n * weeklySets={14}\n * landmarks={{ mev: 8, mav: 14, mrv: 20 }}\n * volumeStatus=\"productive\"\n * lastTrained=\"2 days ago\"\n * weeklyHistory={[8, 10, 12, 14]}\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * />\n */\nexport function BodyMapDetailPanel({\n muscleGroup,\n displayName,\n weeklySets,\n landmarks,\n volumeStatus,\n lastTrained,\n weeklyHistory,\n contributingExercises,\n upcomingExercises,\n isOpen,\n visible,\n onClose,\n onViewExercises,\n ...props\n}: BodyMapDetailPanelProps) {\n const open = isOpen ?? visible ?? false\n\n const [translateY] = useState(() => new Animated.Value(SLIDE_OFFSET))\n const [backdrop] = useState(() => new Animated.Value(0))\n\n useEffect(() => {\n if (!open) return\n const animation = Animated.parallel([\n Animated.timing(translateY, {\n toValue: 0,\n duration: 400,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n Animated.timing(backdrop, {\n toValue: BACKDROP_OPACITY,\n duration: 300,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n ])\n animation.start()\n return () => animation.stop()\n }, [open, translateY, backdrop])\n\n if (!open) return null\n\n const dialogLabel = `${displayName} volume details`\n const markerLeft = markerFraction(weeklySets, landmarks) * 100\n const hasContributing = (contributingExercises?.length ?? 0) > 0\n const hasUpcoming = (upcomingExercises?.length ?? 0) > 0\n\n return (\n <View\n style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'flex-end' }}\n testID=\"body-map-detail-panel-root\"\n >\n <Animated.View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: '#000000',\n opacity: backdrop,\n }}\n testID=\"body-map-detail-panel-backdrop-anim\"\n >\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${displayName} details`}\n style={{ flex: 1 }}\n testID=\"body-map-detail-panel-backdrop\"\n />\n </Animated.View>\n\n <Animated.View\n accessibilityRole={'dialog' as ViewProps['accessibilityRole']}\n accessibilityLabel={dialogLabel}\n aria-label={dialogLabel}\n className=\"bg-surface-elevated\"\n style={{\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n maxHeight: '88%',\n transform: [{ translateY }],\n }}\n testID=\"body-map-detail-panel\"\n {...props}\n >\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${displayName} details`}\n hitSlop={12}\n style={{ alignSelf: 'center', paddingVertical: 8 }}\n testID=\"body-map-detail-panel-handle\"\n >\n <View\n className=\"bg-border-strong\"\n style={{ width: 40, height: 4, borderRadius: 2 }}\n accessibilityElementsHidden\n />\n </Pressable>\n\n <ScrollView\n style={{ paddingHorizontal: 16 }}\n contentContainerStyle={{ paddingBottom: 20 }}\n testID=\"body-map-detail-panel-scroll\"\n >\n <View\n className=\"flex-row items-center justify-between\"\n style={{ gap: 8, paddingTop: 4, paddingBottom: 4 }}\n testID=\"body-map-detail-panel-header\"\n >\n <View className=\"flex-row items-center\" style={{ gap: 8, flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 16,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"body-map-detail-panel-title\"\n >\n {displayName}\n </Text>\n <Badge\n variant=\"subtle\"\n color={STATUS_BADGE_COLOR[volumeStatus]}\n size=\"sm\"\n testID=\"body-map-detail-panel-status-badge\"\n >\n {VOLUME_STATUS_LABELS[volumeStatus]}\n </Badge>\n </View>\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${displayName} details`}\n hitSlop={8}\n style={{ padding: 4, margin: -4 }}\n testID=\"body-map-detail-panel-close\"\n >\n <Text className=\"text-text-secondary\" style={{ fontSize: 22, lineHeight: 22 }}>{'×'}</Text>\n </Pressable>\n </View>\n\n {lastTrained != null && (\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID=\"body-map-detail-panel-last-trained\"\n >\n {`Last trained ${lastTrained}`}\n </Text>\n )}\n\n <View style={{ marginTop: 16 }} testID=\"body-map-detail-panel-volume\">\n <View\n className=\"flex-row items-center justify-between\"\n style={{ marginBottom: 6 }}\n accessibilityElementsHidden\n >\n <Text className=\"text-text-tertiary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}>\n {`MEV ${landmarks.mev}`}\n </Text>\n <Text className=\"text-text-tertiary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}>\n {`MRV ${landmarks.mrv}`}\n </Text>\n </View>\n <View\n style={{ height: 14, justifyContent: 'center' }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: landmarks.mev, max: landmarks.mrv, now: weeklySets }}\n accessibilityLabel={`${weeklySets} weekly sets, between MEV ${landmarks.mev} and MRV ${landmarks.mrv}`}\n aria-valuenow={weeklySets}\n aria-valuemin={landmarks.mev}\n aria-valuemax={landmarks.mrv}\n testID=\"body-map-detail-panel-volume-bar\"\n >\n <View\n style={{ height: 8, borderRadius: 4, backgroundImage: VOLUME_GRADIENT } as ViewStyle}\n accessibilityElementsHidden\n />\n <View\n className=\"border-text-primary bg-surface-elevated\"\n style={{\n position: 'absolute',\n left: `${markerLeft}%`,\n marginLeft: -7,\n width: 14,\n height: 14,\n borderRadius: 7,\n borderWidth: 2,\n boxShadow: '0 0 4px rgba(0,0,0,0.5)',\n }}\n accessibilityElementsHidden\n testID=\"body-map-detail-panel-volume-marker\"\n />\n </View>\n </View>\n\n <View className=\"flex-row items-baseline\" style={{ marginTop: 14, gap: 4 }}>\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 24,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"body-map-detail-panel-set-count\"\n >\n {weeklySets}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID=\"body-map-detail-panel-mrv-suffix\"\n >\n {`/ ${landmarks.mrv} MRV`}\n </Text>\n </View>\n\n {weeklyHistory != null && weeklyHistory.length > 0 && (\n <View style={{ marginTop: 14 }} testID=\"body-map-detail-panel-sparkline\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n marginBottom: 6,\n }}\n accessibilityElementsHidden\n >\n {'VOLUME TREND'}\n </Text>\n <Sparkline data={weeklyHistory} width={80} height={30} highlightLast />\n </View>\n )}\n\n {hasContributing && (\n <View style={{ marginTop: 16 }} testID=\"body-map-detail-panel-contributing\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n marginBottom: 8,\n }}\n >\n {'CONTRIBUTING EXERCISES'}\n </Text>\n {contributingExercises!.map((exercise, index) => (\n <View\n key={`${exercise.name}-${index}`}\n className=\"flex-row items-center justify-between bg-surface-raised border-border\"\n style={{\n gap: 10,\n paddingVertical: 8,\n paddingHorizontal: 12,\n marginBottom: 6,\n borderRadius: 8,\n borderWidth: 1,\n }}\n testID={`body-map-detail-panel-contributing-${index}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{ flex: 1, fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}\n testID={`body-map-detail-panel-contributing-${index}-name`}\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`body-map-detail-panel-contributing-${index}-detail`}\n >\n {`${exercise.sets} sets · ${Math.round(exercise.contributionWeight * 100)}%`}\n </Text>\n </View>\n ))}\n </View>\n )}\n\n {hasUpcoming && (\n <View style={{ marginTop: 16 }} testID=\"body-map-detail-panel-upcoming\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n marginBottom: 8,\n }}\n >\n {'UPCOMING'}\n </Text>\n {upcomingExercises!.map((exercise, index) => (\n <View\n key={`${exercise.name}-${index}`}\n className=\"flex-row items-center justify-between\"\n style={{ gap: 10, paddingVertical: 6 }}\n testID={`body-map-detail-panel-upcoming-${index}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{ flex: 1, fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}\n testID={`body-map-detail-panel-upcoming-${index}-name`}\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`body-map-detail-panel-upcoming-${index}-detail`}\n >\n {`${exercise.workoutName} · ${exercise.sets} sets`}\n </Text>\n </View>\n ))}\n </View>\n )}\n\n {onViewExercises != null && (\n <Pressable\n onPress={onViewExercises}\n accessibilityRole=\"button\"\n accessibilityLabel={`View ${displayName} exercises`}\n style={{\n marginTop: 16,\n paddingVertical: 10,\n borderRadius: 8,\n alignItems: 'center',\n backgroundColor: 'rgba(255,121,0,0.12)',\n borderWidth: 1,\n borderColor: 'rgba(255,121,0,0.3)',\n }}\n testID=\"body-map-detail-panel-view-exercises\"\n >\n <Text style={{ fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '700', color: BRAND_PRIMARY }}>\n {'View exercises'}\n </Text>\n </Pressable>\n )}\n </ScrollView>\n </Animated.View>\n </View>\n )\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 * 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(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean\n): 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 * Elevation level backing a `<Surface pressed>` recess: the shallow `inset`\n * (-1) step. Pressed exposes ONE level of depth — pressed-2 is intentionally\n * not surfaced (the deeper `-2` deep-inset stays available to `elevation`).\n */\nexport const PRESSED_ELEVATION_LEVEL: ElevationLevel = -1\n\n/**\n * Inner-shadow recess for a pressed (sunken) surface, tuned to the well's own\n * fill colour so the rim/shadow tints track the darker fill. Composes WITH the\n * darker pressed fill: on web it adds an inset boxShadow; on the native path\n * (no inset-shadow support) it's a no-op and the recess reads via the fill\n * alone — so a pressed surface stays legibly sunken with or without the shadow.\n *\n * @param fillColor - The pressed surface's own fill (one ramp step down).\n * @param theme - Current theme ('light' or 'dark').\n */\nexport function getPressedRecessShadow(fillColor: string, theme: 'light' | 'dark'): ViewStyle {\n return getElevationShadow(fillColor, PRESSED_ELEVATION_LEVEL, theme)\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 `surface-elevated` (#2A2827, TD-surface-tokens ramp) - allows further lightening\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 (#2A2827, TD-surface-tokens ramp) - 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(color: string, intensity: GlowIntensity = 'medium'): 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 { useMemo, useState } from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { BodyMap, type BodyMapData } from './BodyMap'\nimport {\n BodyMapDetailPanel,\n type ContributingExercise,\n type UpcomingExercise,\n} from './BodyMapDetailPanel'\nimport { MesoStatusCard, type MesoStatusCardProps } from './MesoStatusCard'\nimport {\n MuscleGroup,\n VOLUME_STATUS_LABELS,\n getHeatmapColor,\n type VolumeLandmarks,\n type VolumeStatus,\n} from './muscleTaxonomy'\n\n/** Volume statuses in display order for the legend and summary cards. */\nconst STATUS_ORDER: VolumeStatus[] = ['under', 'maintenance', 'productive', 'over']\n\n/** One muscle's full volume picture — feeds the body maps and the detail panel. */\nexport interface TrainingStatusMuscle {\n /** Detailed muscle group (drives the SVG heatmap + panel identity). */\n muscleGroup: MuscleGroup\n /** Human-readable name for the legend, summary, and panel title. */\n displayName: string\n /** Which body-map view the muscle belongs to. */\n side: 'front' | 'back'\n /** Heatmap intensity 0-1. */\n intensity: number\n /** Weekly-volume status relative to the landmarks. */\n volumeStatus: VolumeStatus\n /** Weekly effective sets logged. */\n weeklySets: number\n /** Volume landmarks (weekly working sets). */\n landmarks: VolumeLandmarks\n /** Last trained label, e.g. \"2 days ago\". */\n lastTrained?: string\n /** Weekly volume history for the panel sparkline. */\n weeklyHistory?: number[]\n /** Exercises contributing to this muscle's volume. */\n contributingExercises?: ContributingExercise[]\n /** Upcoming exercises targeting this muscle. */\n upcomingExercises?: UpcomingExercise[]\n}\n\n/** Derived, page-level roll-up of the tracked muscles. */\nexport interface TrainingStatusSummary {\n /** Total weekly effective sets across all tracked muscles. */\n totalWeeklySets: number\n /** Number of muscles being tracked. */\n trackedMuscles: number\n /** Count of muscles per volume status. */\n statusCounts: Record<VolumeStatus, number>\n}\n\nexport interface TrainingStatusPageProps extends ViewProps {\n /** Page heading. */\n title?: string\n /** Mesocycle context banner shown at the top. */\n meso: MesoStatusCardProps\n /** Muscles tracked this week. */\n muscles: TrainingStatusMuscle[]\n className?: string\n}\n\n/** Roll up per-muscle rows into the page summary (pure, testable). */\nexport function deriveTrainingSummary(muscles: TrainingStatusMuscle[]): TrainingStatusSummary {\n const statusCounts: Record<VolumeStatus, number> = {\n under: 0,\n maintenance: 0,\n productive: 0,\n over: 0,\n }\n let totalWeeklySets = 0\n for (const muscle of muscles) {\n totalWeeklySets += muscle.weeklySets\n statusCounts[muscle.volumeStatus] += 1\n }\n return { totalWeeklySets, trackedMuscles: muscles.length, statusCounts }\n}\n\n/** Project the muscle rows for one side into `BodyMap` heatmap data. */\nexport function toBodyMapData(\n muscles: TrainingStatusMuscle[],\n side: 'front' | 'back'\n): BodyMapData[] {\n return muscles\n .filter((muscle) => muscle.side === side)\n .map(({ muscleGroup, intensity, volumeStatus, weeklySets }) => ({\n muscleGroup,\n intensity,\n volumeStatus,\n weeklySets,\n }))\n}\n\nconst SUMMARY_CARDS: Array<{\n key: keyof TrainingStatusSummary['statusCounts'] | 'total'\n label: string\n}> = [\n { key: 'total', label: 'Weekly Sets' },\n { key: 'productive', label: 'Productive' },\n { key: 'under', label: 'Under' },\n { key: 'over', label: 'Over' },\n]\n\nfunction SummaryCards({ summary }: { summary: TrainingStatusSummary }) {\n return (\n <View className=\"flex-row flex-wrap\" style={{ gap: 8 }} testID=\"training-status-page-summary\">\n {SUMMARY_CARDS.map(({ key, label }) => {\n const value = key === 'total' ? summary.totalWeeklySets : summary.statusCounts[key]\n return (\n <View\n key={key}\n className=\"bg-surface-elevated border-border\"\n style={{\n flexGrow: 1,\n flexBasis: '46%',\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n testID={`training-status-page-summary-${key}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 22,\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: 11,\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 StatusLegend() {\n return (\n <View\n className=\"flex-row flex-wrap\"\n style={{ gap: 10, justifyContent: 'center' }}\n testID=\"training-status-page-legend\"\n >\n {STATUS_ORDER.map((status) => (\n <View\n key={status}\n className=\"flex-row items-center\"\n style={{ gap: 5 }}\n testID={`training-status-page-legend-${status}`}\n >\n <View\n style={{\n width: 8,\n height: 8,\n borderRadius: 9999,\n backgroundColor: getHeatmapColor(status, 0.6),\n }}\n accessibilityElementsHidden\n />\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n textTransform: 'capitalize',\n }}\n >\n {VOLUME_STATUS_LABELS[status]}\n </Text>\n </View>\n ))}\n </View>\n )\n}\n\ninterface BodyMapColumnProps {\n side: 'front' | 'back'\n muscles: TrainingStatusMuscle[]\n selected: MuscleGroup | null\n onSelect: (muscle: MuscleGroup) => void\n}\n\nfunction BodyMapColumn({ side, muscles, selected, onSelect }: BodyMapColumnProps) {\n const data = useMemo(() => toBodyMapData(muscles, side), [muscles, side])\n return (\n <View style={{ flexGrow: 1, flexBasis: '46%' }} testID={`training-status-page-bodymap-${side}`}>\n <BodyMap\n data={data}\n view={side}\n onMusclePress={onSelect}\n highlightedMuscle={selected}\n mode=\"detailed\"\n />\n </View>\n )\n}\n\n/**\n * TrainingStatusPage — a body-map training dashboard that composes the\n * mesocycle context banner (`MesoStatusCard`), side-by-side front/back\n * `BodyMap`s with a shared heatmap legend, per-status summary cards, and a\n * tap-to-detail `BodyMapDetailPanel`. Tapping any muscle (SVG or legend chip)\n * opens the slide-up panel for that group; the summary is derived from the\n * supplied muscle rows.\n *\n * @example\n * <TrainingStatusPage meso={meso} muscles={muscles} />\n */\nexport function TrainingStatusPage({\n title = 'Training Status',\n meso,\n muscles,\n className,\n ...props\n}: TrainingStatusPageProps) {\n const [selected, setSelected] = useState<MuscleGroup | null>(null)\n const summary = useMemo(() => deriveTrainingSummary(muscles), [muscles])\n const active = selected != null ? (muscles.find((m) => m.muscleGroup === selected) ?? null) : 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=\"training-status-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 16 }} testID=\"training-status-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=\"training-status-page-title\"\n >\n {title}\n </Text>\n\n <MesoStatusCard {...meso} />\n\n <SummaryCards summary={summary} />\n\n <View\n className=\"bg-surface-elevated border-border\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n gap: 12,\n }}\n testID=\"training-status-page-bodymaps\"\n >\n <View className=\"flex-row\" style={{ gap: 8 }}>\n <BodyMapColumn\n side=\"front\"\n muscles={muscles}\n selected={selected}\n onSelect={setSelected}\n />\n <BodyMapColumn\n side=\"back\"\n muscles={muscles}\n selected={selected}\n onSelect={setSelected}\n />\n </View>\n <StatusLegend />\n </View>\n </View>\n\n {active != null && (\n <BodyMapDetailPanel\n muscleGroup={active.muscleGroup}\n displayName={active.displayName}\n weeklySets={active.weeklySets}\n landmarks={active.landmarks}\n volumeStatus={active.volumeStatus}\n lastTrained={active.lastTrained}\n weeklyHistory={active.weeklyHistory}\n contributingExercises={active.contributingExercises}\n upcomingExercises={active.upcomingExercises}\n isOpen\n onClose={() => setSelected(null)}\n />\n )}\n </View>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/cn.ts","../src/theme/tokens/primitives.ts","../src/theme/tokens/semantic.ts","../src/theme/resolve-color.ts","../src/theme/workout-tokens.ts","../src/components/custom/Workout/muscleTaxonomy.ts","../src/web-jsx/jsx-runtime.ts","../src/components/custom/Workout/BodyMap.tsx","../src/components/ui/indicator/Indicator.tsx","../src/components/ui/badge/Badge.tsx","../src/components/custom/Workout/Sparkline.tsx","../src/components/custom/Workout/BodyMapDetailPanel.tsx","../src/theme/color-utils.ts","../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/TrainingStatusPage.tsx"],"names":["twMerge","clsx","Platform","MuscleGroup","SimpleMuscleGroup","cn","reactJsx","reactJsxs","BodyHighlighter","useMemo","useState","Animated","useEffect","Easing","View","Text","Pressable","sizeStyles","BRAND_PRIMARY","ScrollView","useSyncExternalStore","Fragment","t","clamp01"],"mappings":"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","file":"bodymap.js","sourcesContent":["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","/**\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\n/**\n * Absolute colour keywords.\n *\n * This used to hold five scales — `blue`, `red`, `redVivid`, `neutral` and\n * `charcoal`. All five are gone (TD-07.14): the greys folded into `greyRamp`\n * below and the chromatics into the OKLCH `primitiveRamps`. What is left has no\n * scale because these three are not colours you tune, they are keywords.\n */\nexport const primitiveColors = {\n white: '#FFFFFF',\n black: '#000000',\n transparent: 'transparent',\n} as const\n\n/**\n * Unified warm-neutral grey ramp (TD-07.14)\n *\n * The ONE achromatic scale. Regenerate with `scripts/generate-grey-ramp.mjs` —\n * preserve the generator, not just the hexes.\n *\n * The surface planes ARE steps here rather than a parallel object: `850` is\n * overlay, `975` is the bezel. That is the whole point of the ramp. `grey`,\n * `neutral`, `surfaceRampDark` and `backgroundFrameDark` all resolve into it,\n * which is why every plane step below is byte-identical to the value that\n * shipped in v0.10.0 — the surfaces do not move, only their names.\n *\n * TWO THINGS ABOUT THE NUMBERING, both deliberate and both previously re-derived\n * from scratch more than once because they were never written down:\n *\n * 1. `975` sits BELOW the standard grid. `canonL` — the median L* of the seven\n * chromatic `primitiveRamps` at each step — ends at L*10.3, which is step\n * `950`. The bezel is L*3.8, darker than the grid's last rung, so there is\n * simply no step number left for it and `975` extends past the end.\n * 2. `850`/`875` are quarter-steps because overlay/raised/elevated are only\n * ~2.7 L* apart and all three collide on `900` at normal resolution. `800`\n * is a generated bridge between `700` (L*37.9) and overlay (L*22.7) so the\n * spacing stays even across the join.\n *\n * There is no `inset`. It was retired, not renamed: at ΔE 1.10 from `975` it was\n * an imperceptible duplicate of the frame, which is exactly why `<Surface pressed>`\n * (surface − 1) kept collapsing into it. `975` is the floor.\n *\n * Spec, generator and the rejected v1/v2 cuts:\n * coordination/design-explorations/foundations/warm-grey-ramp/\n */\nexport const greyRamp = {\n 50: '#F9F6F3', // L*97.0 W6\n 100: '#EDEAE7', // L*92.8 W6\n 200: '#D4D1CE', // L*84.0 W6 — warm silver\n 300: '#BDBAB7', // L*75.7 W6\n 400: '#A29F9D', // L*65.7 W5\n 500: '#888684', // L*56.0 W4\n 600: '#72716F', // L*47.7 W3\n 700: '#5A5958', // L*37.9 W2\n 800: '#424140', // L*27.6 W2 — generated bridge\n 850: '#373635', // L*22.7 W2 — surface overlay\n 875: '#31302F', // L*19.9 W2 — surface raised\n 900: '#2C2A28', // L*17.2 W4 — surface elevated\n 925: '#252321', // L*13.9 W4 — surface base\n 950: '#1C1916', // L*9.0 W6 — background base / shell\n 975: '#100D0A', // L*3.8 W6 — background frame / bezel\n} as const\n\n/**\n * The surface planes, as ramp steps — the mapping `<Surface level>` resolves through.\n *\n * Ordered darkest -> lightest, which is the order `pressedLevel()` walks.\n */\nexport const SURFACE_PLANE_STEPS = {\n frame: 975,\n background: 950,\n base: 925,\n elevated: 900,\n raised: 875,\n overlay: 850,\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 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 * 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, greyRamp, discreteRainbow } from './primitives'\n\n/**\n * GREY MAPPING (TD-07.14) — how the old cool scales resolved onto `greyRamp`.\n *\n * Every grey below came off `grey` (pure R=G=B) or `neutral` (cool, R−B\n * down to −26). They were snapped by NEAREST L*, not by matching step numbers,\n * because the two old scales were numbered incompatibly: `grey` ran\n * INVERTED and compressed (0 = #6E6E6E lightest, 900 = #101010 darkest), so\n * `grey[400]` and `greyRamp[400]` have nothing to do with each other.\n *\n * grey 200→800 300→900 400→925 500→950\n * neutral 50→50 100→100 300→200 400→400 500→600 600→700 900→950\n *\n * Surfaces move ΔE 1.9–4.8 — at or near imperceptible. The TEXT roles move\n * further (8.6–12.8), and that is the intended part of the change: they are\n * picking up the warmth the surfaces already had.\n *\n * Light gets its own column because strict L*-nearest collapsed `neutral[50]`\n * and `[100]` onto one step, flattening surface-elevated into surface-raised.\n * Light is still deferred as a design question — there is no `surfaceRampLight`.\n *\n * `border-default`, `-subtle` and `-strong` are GONE, replaced by `hairline-*`.\n * Once the planes became ramp steps, every value dark enough to read as a\n * border was also a plane's fill. Alpha composites instead of colliding.\n *\n * `text-tertiary` on dark is the one role that ignores L*-nearest; see it.\n */\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 // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\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': ramp.red[600], // vivid alert red\n 'status-error-vivid-light': ramp.red[500],\n 'status-error-vivid-dark': ramp.red[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': greyRamp[600], // 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': greyRamp[400],\n 'text-disabled': 'rgba(55, 65, 81, 0.48)',\n 'text-inverse': p.white,\n 'text-link': ramp.blue[600],\n 'text-link-hover': ramp.blue[700],\n\n // Surface colors (surface-*) - for elevated containers\n 'surface-base': p.white,\n 'surface-elevated': greyRamp[50], // slightly off-white for elevated cards\n 'surface-raised': greyRamp[100], // light gray for raised cards\n 'surface-overlay': p.white,\n 'surface-input': greyRamp[50], // Input field background (filled variant)\n\n // Background colors (background-*)\n 'background-base': '#EBEBEB',\n 'background-default': p.white,\n 'background-subtle': greyRamp[50],\n // Frame/bezel chrome — top bar + side nav shell, one step below\n // `background-base`. Placeholder pairing for light mode, which is deferred.\n 'background-frame': greyRamp[400],\n\n // Border colors (border-*)\n 'border-prominent': greyRamp[400], // high-visibility divider\n 'border-focus': ramp.blue[600],\n 'border-input': greyRamp[200], // Input field border\n 'border-input-hover': greyRamp[400], // Input field border on hover\n 'border-input-focus': ramp.blue[600], // Input field border on focus\n 'border-input-error': ramp.red[600], // Input field border on error\n\n // Alpha hairline separators (surface-independent — composite toward black on\n // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.\n 'hairline-subtle': 'rgba(0, 0, 0, 0.06)',\n 'hairline-default': 'rgba(0, 0, 0, 0.09)',\n 'hairline-strong': 'rgba(0, 0, 0, 0.14)',\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': greyRamp[600],\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 // Live-session accent — its OWN role, decoupled from success so the two can diverge\n 'status-live': ramp.green[300],\n 'status-live-muted': ramp.green[500],\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': ramp.red[600],\n 'status-error-vivid-light': ramp.red[500],\n 'status-error-vivid-dark': ramp.red[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': greyRamp[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': greyRamp[50],\n 'text-secondary': greyRamp[400],\n // Deliberately ONE step lighter than the L*-nearest match (`greyRamp[600]`).\n // The colour this replaced failed WCAG large-text outright on the three\n // lightest planes — 2.96 / 2.72 / 2.49 against elevated / raised / overlay —\n // and `600` carried that failure forward almost exactly (2.93 / 2.70 / 2.47).\n // `500` clears 3:1 everywhere (3.32–5.34). Contrast beats colour fidelity for\n // text roles; borders and surfaces still use strict L*-nearest. See\n // semantic-contrast.test.ts, which fails if this is moved back down.\n 'text-tertiary': greyRamp[500],\n 'text-disabled': 'rgba(255, 255, 255, 0.38)',\n 'text-inverse': greyRamp[950],\n 'text-link': '#828DF8',\n 'text-link-hover': ramp.blue[400],\n\n // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,\n // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see\n // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`\n // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`\n // tracks one plane above `surface-base`, same relative position as before the remap.\n // `background-base` backs `Surface level=\"background\"` (SurfaceContext.SURFACE_LEVEL_TOKEN),\n // so it takes the ramp's shell role. The deepest plane is `background-frame`,\n // which is also the `SurfaceLevel` floor a pressed surface clamps at.\n 'surface-base': greyRamp[925], // main surface (#252321, L*13.9)\n 'surface-elevated': greyRamp[900], // elevated surface (#2C2A28, L*17.2 — nav/rail)\n 'surface-raised': greyRamp[875], // raised surface (#31302F, L*19.9 — cards)\n 'surface-overlay': greyRamp[850], // overlay surface (#373635, L*22.7 — hero/popover)\n 'surface-input': greyRamp[900], // input surface (#2C2A28 — one plane above base)\n\n // Background colors — same ramp, the frame/shell end of it.\n 'background-base': greyRamp[950], // shell (#1C1916, L*9 — Surface level=\"background\")\n 'background-default': greyRamp[925], // main background (#252321, L*13.9 — matches surface-base)\n 'background-subtle': greyRamp[900], // subtle background (#2C2A28, L*17.2 — matches surface-elevated)\n // Frame/bezel chrome — the top bar + side nav shell, one step BELOW\n // `background-base`. It used to be described as sitting OUTSIDE the ramp; it\n // is simply the ramp's last step now, and the floor `<Surface pressed>` clamps at.\n 'background-frame': greyRamp[975], // frame / bezel (#100D0A, L*3.8)\n\n // Border colors — solid dark borders are RETIRED (TD-07.14). Not a preference — a structural\n // consequence of one ramp. Every step from 850 to 975 is now a surface plane,\n // so a solid border dark enough to read as a border necessarily equals some\n // plane's fill, which is exactly the collision `surface.contract.test.ts` R2\n // forbids. The only non-plane steps left in that band are 800 and 700, and\n // borders there jump from L*~10-25 to L*~28-38 — a restyle, not a migration.\n //\n // So separation moves to the alpha hairlines, which dark mode already called\n // \"the primary separation cue\". Being alpha, they composite against whatever\n // plane they land on and cannot collide with any of them — the problem stops\n // existing rather than being re-solved per plane. The three solid tokens were\n // deleted outright; consumers point at the `hairline-*` family below.\n //\n // `border-prominent` stays SOLID: it is the one border meant to be seen\n // outright (4 call sites, high-visibility dividers), and grey-800 is not a\n // plane, so it keeps its job without collision.\n 'border-prominent': greyRamp[800], // high-visibility divider\n 'border-focus': '#828DF8',\n 'border-input': greyRamp[700],\n 'border-input-hover': greyRamp[600],\n 'border-input-focus': '#828DF8',\n 'border-input-error': ramp.red[500],\n\n // Alpha hairline separators — the primary separation cue (§4/S-2). Self-\n // normalizing: composites toward white by ~the same amount on ANY plane, so\n // one family works at every elevation instead of per-surface border tokens.\n // Shadows are demoted to floating-overlay use only (not shipped as a fill\n // separator here — see elevation.ts, follow-up S-4).\n //\n // RETUNED on the wall (VW-99, S-6). The original .06/.09/.14 were set at a\n // desk. On the panel at ~3 m `subtle` rendered but was indiscernible, and\n // `default` — the load-bearing one, with no solid-border fallback since\n // TD-07.14 — went weak on the lightest plane. `strong` read cleanly with room\n // to spare, which is what made raising the whole family viable.\n //\n // Each tier steps up onto the next MEASURED-GOOD rung rather than an\n // interpolated one: the new `subtle` is the old `default`, and the new\n // `default` is the old `strong` — a value just confirmed legible on all four\n // planes. Spacing goes 1 : 1.56 : 2.33, against the original 1 : 1.5 : 2.33.\n //\n // RUN 2 (VW-99): all three tiers were seen on all four planes — the retune\n // worked — but `subtle` was still \"a bit hard to read\", so the whole family\n // took a further +.01. That is a comfort margin on a passing row, not a fix\n // for a failing one, which is why it is a flat offset: the 1 : 1.56 : 2.33\n // spacing that the run validated is preserved rather than re-derived.\n //\n // Keep these to TWO decimals. react-native-web quantises alpha to 8 bits, so\n // a 3-decimal value silently rounds on the way to the DOM (.135 renders as\n // .13) — the token would say one thing and paint another.\n //\n // DARK ONLY. The light family above composites toward BLACK on light planes,\n // which this run says nothing about — do not mirror these numbers into it\n // without its own verification.\n 'hairline-subtle': 'rgba(255, 255, 255, 0.10)',\n 'hairline-default': 'rgba(255, 255, 255, 0.15)',\n 'hairline-strong': 'rgba(255, 255, 255, 0.22)',\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': 'rgba(255, 255, 255, 0.09)',\n\n // Avatar default\n 'avatar-background': greyRamp[700],\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","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","/**\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,2,3,4] subsample of\n // the canonical `sequentialEffort` primitive: an EVEN hue walk across the ramp\n // (green → gold → orange → red). The earlier [0,1,2,4] spent two of its four\n // bands on adjacent yellows (amber-200 + amber-300) and skipped orange, reading\n // yellow-heavy with an abrupt jump to red; sampling amber-300 + orange-400\n // instead gives four cleanly separable bands that hold at 3px strip scale.\n // Consumed inline (RN).\n scale: {\n green: sequentialEffort[0], // green-300\n yellow: sequentialEffort[2], // amber-300 (gold)\n orange: sequentialEffort[3], // orange-400 (true orange)\n red: sequentialEffort[4], // red-600\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","/**\n * Muscle grouping taxonomy for volume tracking, exercise mapping, and the\n * BodyMap visualization. Ported from the Voltras muscle-taxonomy design doc.\n *\n * Level 2 (15 groups) is the primary volume-tracking unit; SimpleMuscleGroup\n * (8 groups) is the beginner-facing aggregation. MUSCLE_TO_SVG_SLUGS maps each\n * group to react-native-body-highlighter slugs using the closest-slug approach\n * (Phase 1: combined colors, no sub-region splitting — deltoids is a single\n * slug, lats and upper back share `upper-back`).\n */\nimport { WORKOUT_TOKENS } from '../../../theme/workout-tokens'\n\n/**\n * Full muscle group taxonomy for volume tracking and exercise mapping.\n * 15 groups — the primary unit for volume accounting.\n */\nexport enum MuscleGroup {\n // Push\n CHEST = 'chest',\n FRONT_DELTS = 'front_delts',\n SIDE_DELTS = 'side_delts',\n TRICEPS = 'triceps',\n\n // Pull\n LATS = 'lats',\n UPPER_BACK = 'upper_back',\n REAR_DELTS = 'rear_delts',\n BICEPS = 'biceps',\n FOREARMS = 'forearms',\n\n // Legs\n QUADS = 'quads',\n HAMSTRINGS = 'hamstrings',\n GLUTES = 'glutes',\n CALVES = 'calves',\n\n // Core\n ABS = 'abs',\n OBLIQUES = 'obliques',\n}\n\n/**\n * Simplified muscle group view for beginners. Maps to one or more MuscleGroup.\n */\nexport enum SimpleMuscleGroup {\n CHEST = 'chest',\n BACK = 'back',\n SHOULDERS = 'shoulders',\n BICEPS = 'biceps',\n TRICEPS = 'triceps',\n LEGS = 'legs',\n CORE = 'core',\n FOREARMS = 'forearms',\n}\n\n/** Mapping from simplified groups to the full taxonomy. */\nexport const SIMPLE_TO_DETAILED: Record<SimpleMuscleGroup, MuscleGroup[]> = {\n [SimpleMuscleGroup.CHEST]: [MuscleGroup.CHEST],\n [SimpleMuscleGroup.BACK]: [MuscleGroup.LATS, MuscleGroup.UPPER_BACK],\n [SimpleMuscleGroup.SHOULDERS]: [\n MuscleGroup.FRONT_DELTS,\n MuscleGroup.SIDE_DELTS,\n MuscleGroup.REAR_DELTS,\n ],\n [SimpleMuscleGroup.BICEPS]: [MuscleGroup.BICEPS],\n [SimpleMuscleGroup.TRICEPS]: [MuscleGroup.TRICEPS],\n [SimpleMuscleGroup.LEGS]: [\n MuscleGroup.QUADS,\n MuscleGroup.HAMSTRINGS,\n MuscleGroup.GLUTES,\n MuscleGroup.CALVES,\n ],\n [SimpleMuscleGroup.CORE]: [MuscleGroup.ABS, MuscleGroup.OBLIQUES],\n [SimpleMuscleGroup.FOREARMS]: [MuscleGroup.FOREARMS],\n}\n\n/** Reverse map: detailed MuscleGroup -> its SimpleMuscleGroup. */\nexport const DETAILED_TO_SIMPLE: Record<MuscleGroup, SimpleMuscleGroup> = Object.entries(\n SIMPLE_TO_DETAILED\n).reduce(\n (acc, [simple, groups]) => {\n for (const group of groups) {\n acc[group] = simple as SimpleMuscleGroup\n }\n return acc\n },\n {} as Record<MuscleGroup, SimpleMuscleGroup>\n)\n\n/** Movement category for training split organization. */\nexport type MovementCategory = 'push' | 'pull' | 'legs' | 'core'\n\nexport const MUSCLE_TO_CATEGORY: Record<MuscleGroup, MovementCategory> = {\n [MuscleGroup.CHEST]: 'push',\n [MuscleGroup.FRONT_DELTS]: 'push',\n [MuscleGroup.SIDE_DELTS]: 'push',\n [MuscleGroup.TRICEPS]: 'push',\n [MuscleGroup.LATS]: 'pull',\n [MuscleGroup.UPPER_BACK]: 'pull',\n [MuscleGroup.REAR_DELTS]: 'pull',\n [MuscleGroup.BICEPS]: 'pull',\n [MuscleGroup.FOREARMS]: 'pull',\n [MuscleGroup.QUADS]: 'legs',\n [MuscleGroup.HAMSTRINGS]: 'legs',\n [MuscleGroup.GLUTES]: 'legs',\n [MuscleGroup.CALVES]: 'legs',\n [MuscleGroup.ABS]: 'core',\n [MuscleGroup.OBLIQUES]: 'core',\n}\n\n/**\n * react-native-body-highlighter slug(s) per muscle group. Phase 1 uses the\n * closest available slug; deltoids share one path and lats/upper-back share\n * `upper-back` (see doc Level 4 \"Recommended approach\").\n */\nexport const MUSCLE_TO_SVG_SLUGS: Record<MuscleGroup, string[]> = {\n [MuscleGroup.CHEST]: ['chest'],\n [MuscleGroup.FRONT_DELTS]: ['deltoids'],\n [MuscleGroup.SIDE_DELTS]: ['deltoids'],\n [MuscleGroup.REAR_DELTS]: ['deltoids'],\n [MuscleGroup.TRICEPS]: ['triceps'],\n [MuscleGroup.LATS]: ['upper-back'],\n [MuscleGroup.UPPER_BACK]: ['upper-back', 'trapezius'],\n [MuscleGroup.BICEPS]: ['biceps'],\n [MuscleGroup.FOREARMS]: ['forearm'],\n [MuscleGroup.QUADS]: ['quadriceps'],\n [MuscleGroup.HAMSTRINGS]: ['hamstring'],\n [MuscleGroup.GLUTES]: ['gluteal'],\n [MuscleGroup.CALVES]: ['calves'],\n [MuscleGroup.ABS]: ['abs'],\n [MuscleGroup.OBLIQUES]: ['obliques'],\n}\n\n/** Human-readable name per muscle group (used in a11y labels). */\nexport const MUSCLE_DISPLAY_NAMES: Record<MuscleGroup, string> = {\n [MuscleGroup.CHEST]: 'Chest',\n [MuscleGroup.FRONT_DELTS]: 'Front Delts',\n [MuscleGroup.SIDE_DELTS]: 'Side Delts',\n [MuscleGroup.REAR_DELTS]: 'Rear Delts',\n [MuscleGroup.TRICEPS]: 'Triceps',\n [MuscleGroup.LATS]: 'Lats',\n [MuscleGroup.UPPER_BACK]: 'Upper Back',\n [MuscleGroup.BICEPS]: 'Biceps',\n [MuscleGroup.FOREARMS]: 'Forearms',\n [MuscleGroup.QUADS]: 'Quads',\n [MuscleGroup.HAMSTRINGS]: 'Hamstrings',\n [MuscleGroup.GLUTES]: 'Glutes',\n [MuscleGroup.CALVES]: 'Calves',\n [MuscleGroup.ABS]: 'Abs',\n [MuscleGroup.OBLIQUES]: 'Obliques',\n}\n\n/** Human-readable name per simple group. */\nexport const SIMPLE_DISPLAY_NAMES: Record<SimpleMuscleGroup, string> = {\n [SimpleMuscleGroup.CHEST]: 'Chest',\n [SimpleMuscleGroup.BACK]: 'Back',\n [SimpleMuscleGroup.SHOULDERS]: 'Shoulders',\n [SimpleMuscleGroup.BICEPS]: 'Biceps',\n [SimpleMuscleGroup.TRICEPS]: 'Triceps',\n [SimpleMuscleGroup.LEGS]: 'Legs',\n [SimpleMuscleGroup.CORE]: 'Core',\n [SimpleMuscleGroup.FOREARMS]: 'Forearms',\n}\n\n/** Volume landmarks per muscle group (weekly working sets). */\nexport interface VolumeLandmarks {\n mev: number // Minimum Effective Volume\n mav: number // Maximum Adaptive Volume\n mrv: number // Maximum Recoverable Volume\n}\n\nexport const DEFAULT_VOLUME_LANDMARKS: Record<MuscleGroup, VolumeLandmarks> = {\n [MuscleGroup.CHEST]: { mev: 8, mav: 14, mrv: 20 },\n [MuscleGroup.LATS]: { mev: 8, mav: 14, mrv: 20 },\n [MuscleGroup.UPPER_BACK]: { mev: 6, mav: 12, mrv: 18 },\n [MuscleGroup.FRONT_DELTS]: { mev: 2, mav: 6, mrv: 10 },\n [MuscleGroup.SIDE_DELTS]: { mev: 6, mav: 14, mrv: 22 },\n [MuscleGroup.REAR_DELTS]: { mev: 6, mav: 12, mrv: 18 },\n [MuscleGroup.BICEPS]: { mev: 4, mav: 10, mrv: 18 },\n [MuscleGroup.TRICEPS]: { mev: 4, mav: 8, mrv: 14 },\n [MuscleGroup.FOREARMS]: { mev: 2, mav: 6, mrv: 12 },\n [MuscleGroup.QUADS]: { mev: 6, mav: 12, mrv: 18 },\n [MuscleGroup.HAMSTRINGS]: { mev: 4, mav: 10, mrv: 16 },\n [MuscleGroup.GLUTES]: { mev: 4, mav: 10, mrv: 16 },\n [MuscleGroup.CALVES]: { mev: 6, mav: 10, mrv: 16 },\n [MuscleGroup.ABS]: { mev: 0, mav: 8, mrv: 16 },\n [MuscleGroup.OBLIQUES]: { mev: 0, mav: 6, mrv: 12 },\n}\n\n/** Weekly-volume status relative to MEV/MAV/MRV landmarks. */\nexport type VolumeStatus = 'under' | 'maintenance' | 'productive' | 'over'\n\n/** Readable label per status for a11y descriptions. */\nexport const VOLUME_STATUS_LABELS: Record<VolumeStatus, string> = {\n under: 'under-trained',\n maintenance: 'maintenance',\n productive: 'productive',\n over: 'over-reaching',\n}\n\n/** Severity ranking — higher wins when several groups share an SVG slug. */\nconst STATUS_SEVERITY: Record<VolumeStatus, number> = {\n under: 1,\n maintenance: 2,\n productive: 3,\n over: 4,\n}\n\n/**\n * Maps a volume status (and intensity, 0-1) to a heatmap fill color. The\n * `approaching` token is used when a productive muscle nears its MRV.\n */\nexport function getHeatmapColor(status: VolumeStatus | null | undefined, intensity = 0): string {\n const heatmap = WORKOUT_TOKENS.heatmap\n switch (status) {\n case 'under':\n return heatmap.under\n case 'maintenance':\n return heatmap.maintenance\n case 'productive':\n return intensity >= 0.85 ? heatmap.approaching : heatmap.productive\n case 'over':\n return heatmap.over\n default:\n return heatmap.none\n }\n}\n\n/** True when one status is at least as severe as another. */\nexport function isMoreSevere(a: VolumeStatus, b: VolumeStatus): boolean {\n return STATUS_SEVERITY[a] >= STATUS_SEVERITY[b]\n}\n\n/**\n * Representative MuscleGroup for each SVG slug, used to resolve taps on shared\n * paths (e.g. `deltoids`, `upper-back`) back to a single group.\n */\nexport const SLUG_TO_PRIMARY_MUSCLE: Record<string, MuscleGroup> = {\n chest: MuscleGroup.CHEST,\n deltoids: MuscleGroup.SIDE_DELTS,\n triceps: MuscleGroup.TRICEPS,\n 'upper-back': MuscleGroup.LATS,\n trapezius: MuscleGroup.UPPER_BACK,\n biceps: MuscleGroup.BICEPS,\n forearm: MuscleGroup.FOREARMS,\n quadriceps: MuscleGroup.QUADS,\n hamstring: MuscleGroup.HAMSTRINGS,\n gluteal: MuscleGroup.GLUTES,\n calves: MuscleGroup.CALVES,\n abs: MuscleGroup.ABS,\n obliques: MuscleGroup.OBLIQUES,\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, useMemo, useState } from 'react'\nimport { View, Text, Pressable, Animated, Easing, type ViewProps } from 'react-native'\nimport BodyHighlighter, { type ExtendedBodyPart, type Slug } from 'react-native-body-highlighter'\nimport { cn } from '../../../utils/cn'\nimport { resolveColor } from '../../../theme/resolve-color'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\nimport {\n MuscleGroup,\n SimpleMuscleGroup,\n MUSCLE_TO_SVG_SLUGS,\n MUSCLE_DISPLAY_NAMES,\n SIMPLE_DISPLAY_NAMES,\n DETAILED_TO_SIMPLE,\n SLUG_TO_PRIMARY_MUSCLE,\n VOLUME_STATUS_LABELS,\n getHeatmapColor,\n isMoreSevere,\n type VolumeStatus,\n} from './muscleTaxonomy'\n\n/**\n * react-native-body-highlighter is published as a CommonJS default export; the\n * interop keeps it working whether the bundler unwraps the default or not.\n */\nconst Body = ((BodyHighlighter as unknown as { default?: typeof BodyHighlighter }).default ??\n BodyHighlighter) as typeof BodyHighlighter\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nconst OUTLINE_FILL = 'rgba(255,255,255,0.08)'\nconst OUTLINE_BORDER = 'rgba(255,255,255,0.12)'\nconst BODY_SCALE = 0.8 // 200x400 intrinsic -> ~160x320 px\n\nexport interface BodyMapData {\n muscleGroup: MuscleGroup\n /** Intensity 0-1 for heatmap color. */\n intensity: number\n /** Volume status for tooltip / heatmap token. */\n volumeStatus: VolumeStatus\n /** Weekly effective sets. */\n weeklySets: number\n}\n\nexport interface BodyMapProps extends ViewProps {\n /** Muscle group intensity data. */\n data: BodyMapData[]\n /** Which view to show. */\n view: 'front' | 'back'\n /** Toggle between front/back. */\n onViewChange?: (view: 'front' | 'back') => void\n /** Called when a muscle group is tapped. */\n onMusclePress?: (muscleGroup: MuscleGroup) => void\n /** Currently highlighted muscle (from external selection). */\n highlightedMuscle?: MuscleGroup | null\n /** Show simplified (8 groups) or detailed (15 groups). */\n mode?: 'simple' | 'detailed'\n className?: string\n}\n\ninterface LegendEntry {\n key: string\n name: string\n status: VolumeStatus\n intensity: number\n sets: number\n /** Detailed group reported to onMusclePress. */\n muscle: MuscleGroup\n}\n\n/** Build the per-slug heatmap fill list, combining groups that share a slug. */\nfunction buildSlugParts(data: BodyMapData[]): ExtendedBodyPart[] {\n const bySlug = new Map<string, { status: VolumeStatus; intensity: number }>()\n for (const d of data) {\n for (const slug of MUSCLE_TO_SVG_SLUGS[d.muscleGroup] ?? []) {\n const existing = bySlug.get(slug)\n if (!existing || isMoreSevere(d.volumeStatus, existing.status)) {\n bySlug.set(slug, { status: d.volumeStatus, intensity: d.intensity })\n }\n }\n }\n return Array.from(bySlug.entries()).map(([slug, v]) => ({\n slug: slug as Slug,\n color: getHeatmapColor(v.status, v.intensity),\n }))\n}\n\n/** Collapse data into per-simple-group legend entries (summed sets). */\nfunction buildSimpleLegend(data: BodyMapData[]): LegendEntry[] {\n const bySimple = new Map<SimpleMuscleGroup, LegendEntry>()\n for (const d of data) {\n const simple = DETAILED_TO_SIMPLE[d.muscleGroup]\n const existing = bySimple.get(simple)\n if (!existing) {\n bySimple.set(simple, {\n key: simple,\n name: SIMPLE_DISPLAY_NAMES[simple],\n status: d.volumeStatus,\n intensity: d.intensity,\n sets: d.weeklySets,\n muscle: d.muscleGroup,\n })\n continue\n }\n existing.sets += d.weeklySets\n existing.intensity = Math.max(existing.intensity, d.intensity)\n if (isMoreSevere(d.volumeStatus, existing.status)) {\n existing.status = d.volumeStatus\n existing.muscle = d.muscleGroup\n }\n }\n return Array.from(bySimple.values())\n}\n\n/** One legend entry per data row, named by detailed group. */\nfunction buildDetailedLegend(data: BodyMapData[]): LegendEntry[] {\n return data.map((d) => ({\n key: d.muscleGroup,\n name: MUSCLE_DISPLAY_NAMES[d.muscleGroup],\n status: d.volumeStatus,\n intensity: d.intensity,\n sets: d.weeklySets,\n muscle: d.muscleGroup,\n }))\n}\n\n/**\n * Interactive SVG body map with tappable muscle groups and a volume heatmap.\n * Renders the front or back view (toggle via onViewChange), colors each muscle\n * by its weekly-volume status, and exposes an accessible muscle legend wired to\n * onMusclePress. Phase 1 uses react-native-body-highlighter's combined slugs\n * (deltoids as one path, lats/upper-back shared); swipe between views and the\n * delt/lat SVG split are follow-ups.\n *\n * @example\n * <BodyMap\n * data={[{ muscleGroup: MuscleGroup.CHEST, intensity: 0.7, volumeStatus: 'productive', weeklySets: 12 }]}\n * view=\"front\"\n * onViewChange={setView}\n * onMusclePress={setSelected}\n * highlightedMuscle={selected}\n * />\n */\nexport function BodyMap({\n data,\n view,\n onViewChange,\n onMusclePress,\n highlightedMuscle,\n mode = 'detailed',\n className,\n ...props\n}: BodyMapProps) {\n const slugParts = useMemo(() => buildSlugParts(data), [data])\n const legend = useMemo(\n () => (mode === 'simple' ? buildSimpleLegend(data) : buildDetailedLegend(data)),\n [data, mode]\n )\n\n const [highlight] = useState(() => new Animated.Value(highlightedMuscle ? 1 : 0))\n useEffect(() => {\n const animation = Animated.timing(highlight, {\n toValue: highlightedMuscle ? 1 : 0,\n duration: 250,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n })\n animation.start()\n return () => animation.stop()\n }, [highlightedMuscle, highlight])\n\n const scale = highlight.interpolate({ inputRange: [0, 1], outputRange: [1, 1.02] })\n const glowColor = highlightedMuscle\n ? getHeatmapColor(\n data.find((d) => d.muscleGroup === highlightedMuscle)?.volumeStatus,\n data.find((d) => d.muscleGroup === highlightedMuscle)?.intensity ?? 0\n )\n : null\n\n const handleBodyPress = (part: ExtendedBodyPart) => {\n if (!onMusclePress || !part.slug) return\n const fromData = data.find((d) =>\n (MUSCLE_TO_SVG_SLUGS[d.muscleGroup] ?? []).includes(part.slug as string)\n )\n const muscle = fromData?.muscleGroup ?? SLUG_TO_PRIMARY_MUSCLE[part.slug]\n if (muscle) onMusclePress(muscle)\n }\n\n return (\n <View className={cn(className)} testID=\"body-map\" {...props}>\n <ViewToggle view={view} onViewChange={onViewChange} />\n\n <Animated.View\n style={[\n {\n width: 200 * BODY_SCALE,\n alignSelf: 'center',\n transform: [{ scale }],\n },\n glowColor ? { boxShadow: `0 0 14px 2px ${glowColor}` } : undefined,\n ]}\n // The SVG is decorative; the accessible muscle legend below is the\n // screen-reader / keyboard interface.\n aria-hidden\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n testID=\"body-map-svg\"\n >\n <Body\n side={view}\n data={slugParts}\n scale={BODY_SCALE}\n gender=\"male\"\n defaultFill={OUTLINE_FILL}\n border={OUTLINE_BORDER}\n onBodyPartPress={handleBodyPress}\n />\n </Animated.View>\n\n {legend.length === 0 ? (\n <Text\n className=\"text-text-secondary\"\n style={{\n marginTop: 8,\n fontSize: 12,\n textAlign: 'center',\n fontFamily: 'Inter, sans-serif',\n }}\n testID=\"body-map-empty\"\n >\n No training data\n </Text>\n ) : (\n <View\n className=\"flex-row flex-wrap\"\n style={{ marginTop: 10, gap: 6, justifyContent: 'center' }}\n testID=\"body-map-legend\"\n >\n {legend.map((entry) => (\n <MuscleButton\n key={entry.key}\n entry={entry}\n highlighted={highlightedMuscle === entry.muscle}\n onMusclePress={onMusclePress}\n />\n ))}\n </View>\n )}\n </View>\n )\n}\n\ninterface ViewToggleProps {\n view: 'front' | 'back'\n onViewChange?: (view: 'front' | 'back') => void\n}\n\nfunction ViewToggle({ view, onViewChange }: ViewToggleProps) {\n return (\n <View\n className=\"flex-row self-center\"\n style={{ gap: 4, marginBottom: 8 }}\n testID=\"body-map-view-toggle\"\n >\n {(['front', 'back'] as const).map((side) => {\n const active = view === side\n return (\n <Pressable\n key={side}\n onPress={() => onViewChange?.(side)}\n accessibilityRole=\"button\"\n accessibilityLabel={`Show ${side} view`}\n aria-pressed={active}\n disabled={!onViewChange}\n style={{\n paddingHorizontal: 12,\n paddingVertical: 4,\n borderRadius: 9999,\n backgroundColor: active ? 'rgba(255,121,0,0.16)' : 'transparent',\n borderWidth: 1,\n borderColor: active ? BRAND_PRIMARY : resolveColor('hairline-strong'),\n }}\n testID={`body-map-toggle-${side}`}\n >\n <Text\n style={{\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n fontWeight: active ? '700' : '500',\n color: active ? BRAND_PRIMARY : resolveColor('text-secondary'),\n textTransform: 'capitalize',\n }}\n >\n {side}\n </Text>\n </Pressable>\n )\n })}\n </View>\n )\n}\n\ninterface MuscleButtonProps {\n entry: LegendEntry\n highlighted: boolean\n onMusclePress?: (muscleGroup: MuscleGroup) => void\n}\n\nfunction MuscleButton({ entry, highlighted, onMusclePress }: MuscleButtonProps) {\n const dotColor = getHeatmapColor(entry.status, entry.intensity)\n const label = `${entry.name}, ${VOLUME_STATUS_LABELS[entry.status]}, ${entry.sets} sets this week`\n return (\n <Pressable\n onPress={() => onMusclePress?.(entry.muscle)}\n accessibilityRole=\"button\"\n accessibilityLabel={label}\n aria-pressed={highlighted}\n className=\"bg-surface-raised\"\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: 5,\n paddingHorizontal: 8,\n paddingVertical: 3,\n borderRadius: 9999,\n borderWidth: 1,\n borderColor: highlighted ? BRAND_PRIMARY : resolveColor('hairline-default'),\n }}\n testID={`body-map-muscle-${entry.key}`}\n >\n <View\n style={{ width: 7, height: 7, borderRadius: 9999, backgroundColor: dotColor }}\n accessibilityElementsHidden\n testID={`body-map-muscle-dot-${entry.key}`}\n />\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n }}\n accessibilityElementsHidden\n >\n {entry.name}\n </Text>\n </Pressable>\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 | 'live'\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 live: 'bg-status-live',\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 &&\n !customColor &&\n (color === 'success' || color === 'live') &&\n '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-hairline-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-hairline-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 React from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst BRAND_PRIMARY = getSemanticColors('dark')['brand-primary']\n\nexport interface SparklineProps extends ViewProps {\n data: number[]\n width?: number\n height?: number\n color?: string\n showDots?: boolean\n referenceLines?: Array<{\n value: number\n color: string\n dashed?: boolean\n label?: string\n }>\n highlightLast?: boolean\n className?: string\n}\n\nfunction normalizeData(\n data: number[],\n height: number,\n): number[] {\n if (data.length === 0) return []\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n return data.map((v) => height - ((v - min) / range) * height)\n}\n\nfunction normalizeValue(\n value: number,\n data: number[],\n height: number,\n): number {\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n return height - ((value - min) / range) * height\n}\n\nexport function Sparkline({\n data,\n width = 80,\n height = 30,\n color,\n showDots = false,\n referenceLines,\n highlightLast = false,\n className,\n ...props\n}: SparklineProps) {\n if (data.length === 0) {\n return (\n <View\n style={{ width, height }}\n className={className}\n testID=\"sparkline-empty\"\n accessibilityLabel=\"Sparkline chart, no data\"\n {...props}\n />\n )\n }\n\n const resolvedColor = color ?? BRAND_PRIMARY\n const normalized = normalizeData(data, height)\n const stepX = data.length > 1 ? width / (data.length - 1) : 0\n\n const dotSize = 3\n const highlightSize = 6\n\n return (\n <View\n style={{ width, height, position: 'relative' }}\n className={cn(className)}\n accessibilityRole=\"image\"\n accessibilityLabel={`Sparkline chart with ${data.length} data points`}\n testID=\"sparkline\"\n {...props}\n >\n {referenceLines?.map((line, i) => {\n const y = normalizeValue(line.value, data, height)\n return (\n <View\n key={`ref-${i}`}\n style={[\n {\n position: 'absolute',\n top: y,\n left: 0,\n right: 0,\n opacity: 0.6,\n },\n line.dashed\n ? {\n height: 0,\n borderStyle: 'dashed',\n borderTopWidth: 1,\n borderTopColor: line.color,\n }\n : {\n height: 1,\n backgroundColor: line.color,\n },\n ]}\n accessibilityElementsHidden\n testID={`sparkline-reference-${i}`}\n >\n {line.label && (\n <Text\n style={{\n position: 'absolute',\n right: 0,\n top: -10,\n fontSize: 7,\n color: line.color,\n opacity: 1,\n }}\n testID={`sparkline-reference-label-${i}`}\n >\n {line.label}\n </Text>\n )}\n </View>\n )\n })}\n\n {/* Line segments connecting data points */}\n {normalized.map((y, i) => {\n if (i === 0) return null\n const prevY = normalized[i - 1]\n const x1 = (i - 1) * stepX\n const x2 = i * stepX\n const dx = x2 - x1\n const dy = y - prevY\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={`line-${i}`}\n style={{\n position: 'absolute',\n left: x1,\n top: prevY,\n width: length,\n height: 1.5,\n backgroundColor: resolvedColor,\n transformOrigin: '0 0',\n transform: [{ rotate: `${angle}deg` }],\n }}\n accessibilityElementsHidden\n testID={`sparkline-segment-${i}`}\n />\n )\n })}\n\n {/* Data point dots */}\n {(showDots || highlightLast) &&\n normalized.map((y, i) => {\n const isLast = i === data.length - 1\n const shouldShow = showDots || (highlightLast && isLast)\n if (!shouldShow) return null\n\n const size = highlightLast && isLast ? highlightSize : dotSize\n return (\n <View\n key={`dot-${i}`}\n style={{\n position: 'absolute',\n left: i * stepX - size / 2,\n top: y - size / 2,\n width: size,\n height: size,\n borderRadius: size / 2,\n backgroundColor: resolvedColor,\n }}\n accessibilityElementsHidden\n testID={`sparkline-dot-${i}`}\n />\n )\n })}\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 {\n View,\n Text,\n Pressable,\n ScrollView,\n Animated,\n Easing,\n type ViewProps,\n type ViewStyle,\n} from 'react-native'\nimport { Badge, type BadgeColor } from '../../ui/badge'\nimport { Sparkline } from './Sparkline'\nimport {\n MuscleGroup,\n VOLUME_STATUS_LABELS,\n type VolumeLandmarks,\n type VolumeStatus,\n} from './muscleTaxonomy'\nimport { getSemanticColors } from '../../../theme/tokens/semantic'\n\nconst t = getSemanticColors('dark')\n\nconst BRAND_PRIMARY = t['brand-primary']\n\n/** Volume track gradient: status-info -> status-success -> status-error. */\nconst VOLUME_GRADIENT = `linear-gradient(90deg, ${t['status-info']} 0%, ${t['status-success']} 50%, ${t['status-error']} 100%)`\n\n/** Sheet slides up from this offset (px) and the backdrop fades to this opacity. */\nconst SLIDE_OFFSET = 400\nconst BACKDROP_OPACITY = 0.4\n\n/** Volume status -> Badge color scheme. */\nconst STATUS_BADGE_COLOR: Record<VolumeStatus, BadgeColor> = {\n under: 'info',\n maintenance: 'warning',\n productive: 'success',\n over: 'error',\n}\n\nexport interface ContributingExercise {\n /** Exercise name. */\n name: string\n /** Working sets contributed this week. */\n sets: number\n /** Effective-set multiplier toward this muscle (0-1). */\n contributionWeight: number\n}\n\nexport interface UpcomingExercise {\n /** Exercise name. */\n name: string\n /** Workout the exercise belongs to. */\n workoutName: string\n /** Planned sets. */\n sets: number\n}\n\nexport interface BodyMapDetailPanelProps extends ViewProps {\n /** Muscle group whose volume detail is shown. */\n muscleGroup: MuscleGroup\n /** Human-readable muscle name for the title and a11y label. */\n displayName: string\n /** Weekly effective sets logged for this muscle. */\n weeklySets: number\n /** Volume landmarks (weekly working sets). */\n landmarks: VolumeLandmarks\n /** Weekly-volume status relative to the landmarks. */\n volumeStatus: VolumeStatus\n /** Last trained label, e.g. \"2 days ago\". */\n lastTrained?: string\n /** Volume sparkline data (last 4-8 weeks). */\n weeklyHistory?: number[]\n /** Exercises contributing to this muscle's volume. */\n contributingExercises?: ContributingExercise[]\n /** Upcoming exercises targeting this muscle. */\n upcomingExercises?: UpcomingExercise[]\n /** Whether the bottom sheet is visible. */\n isOpen?: boolean\n /** Alias for `isOpen` (spec wording: \"isOpen/visible\"). `isOpen` wins when both are set. */\n visible?: boolean\n /** Dismiss the panel (backdrop, handle, or close button). */\n onClose: () => void\n /** Navigate to a filtered exercise list. */\n onViewExercises?: () => void\n}\n\nfunction clamp01(value: number): number {\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\n/** Marker position (0-1) of current sets between MEV (left) and MRV (right). */\nfunction markerFraction(weeklySets: number, { mev, mrv }: VolumeLandmarks): number {\n const span = mrv - mev\n if (span <= 0) return weeklySets >= mrv ? 1 : 0\n return clamp01((weeklySets - mev) / span)\n}\n\n/**\n * Slide-up bottom-sheet panel with detailed weekly-volume info for a tapped\n * muscle group: a MEV|current|MRV gradient progress bar, the big weekly set\n * count against MRV, an optional volume sparkline, and the contributing /\n * upcoming exercise lists. Composes the titan `Badge` and Workout `Sparkline`.\n *\n * Controlled via `isOpen` (or the `visible` alias); renders nothing when closed\n * and animates in on open — sheet translateY 400->0 (400ms ease-out) and a\n * backdrop fade 0->0.4 (RN Animated, useNativeDriver:false). Backdrop, handle,\n * and the header close button all call `onClose`.\n *\n * @example\n * <BodyMapDetailPanel\n * muscleGroup={MuscleGroup.CHEST}\n * displayName=\"Chest\"\n * weeklySets={14}\n * landmarks={{ mev: 8, mav: 14, mrv: 20 }}\n * volumeStatus=\"productive\"\n * lastTrained=\"2 days ago\"\n * weeklyHistory={[8, 10, 12, 14]}\n * isOpen={open}\n * onClose={() => setOpen(false)}\n * />\n */\nexport function BodyMapDetailPanel({\n muscleGroup,\n displayName,\n weeklySets,\n landmarks,\n volumeStatus,\n lastTrained,\n weeklyHistory,\n contributingExercises,\n upcomingExercises,\n isOpen,\n visible,\n onClose,\n onViewExercises,\n ...props\n}: BodyMapDetailPanelProps) {\n const open = isOpen ?? visible ?? false\n\n const [translateY] = useState(() => new Animated.Value(SLIDE_OFFSET))\n const [backdrop] = useState(() => new Animated.Value(0))\n\n useEffect(() => {\n if (!open) return\n const animation = Animated.parallel([\n Animated.timing(translateY, {\n toValue: 0,\n duration: 400,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n Animated.timing(backdrop, {\n toValue: BACKDROP_OPACITY,\n duration: 300,\n easing: Easing.out(Easing.ease),\n useNativeDriver: false,\n }),\n ])\n animation.start()\n return () => animation.stop()\n }, [open, translateY, backdrop])\n\n if (!open) return null\n\n const dialogLabel = `${displayName} volume details`\n const markerLeft = markerFraction(weeklySets, landmarks) * 100\n const hasContributing = (contributingExercises?.length ?? 0) > 0\n const hasUpcoming = (upcomingExercises?.length ?? 0) > 0\n\n return (\n <View\n style={{ position: 'absolute', top: 0, left: 0, right: 0, bottom: 0, justifyContent: 'flex-end' }}\n testID=\"body-map-detail-panel-root\"\n >\n <Animated.View\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: '#000000',\n opacity: backdrop,\n }}\n testID=\"body-map-detail-panel-backdrop-anim\"\n >\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${displayName} details`}\n style={{ flex: 1 }}\n testID=\"body-map-detail-panel-backdrop\"\n />\n </Animated.View>\n\n <Animated.View\n accessibilityRole={'dialog' as ViewProps['accessibilityRole']}\n accessibilityLabel={dialogLabel}\n aria-label={dialogLabel}\n className=\"bg-surface-elevated\"\n style={{\n borderTopLeftRadius: 16,\n borderTopRightRadius: 16,\n maxHeight: '88%',\n transform: [{ translateY }],\n }}\n testID=\"body-map-detail-panel\"\n {...props}\n >\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${displayName} details`}\n hitSlop={12}\n style={{ alignSelf: 'center', paddingVertical: 8 }}\n testID=\"body-map-detail-panel-handle\"\n >\n <View\n className=\"bg-hairline-strong\"\n style={{ width: 40, height: 4, borderRadius: 2 }}\n accessibilityElementsHidden\n />\n </Pressable>\n\n <ScrollView\n style={{ paddingHorizontal: 16 }}\n contentContainerStyle={{ paddingBottom: 20 }}\n testID=\"body-map-detail-panel-scroll\"\n >\n <View\n className=\"flex-row items-center justify-between\"\n style={{ gap: 8, paddingTop: 4, paddingBottom: 4 }}\n testID=\"body-map-detail-panel-header\"\n >\n <View className=\"flex-row items-center\" style={{ gap: 8, flexShrink: 1 }}>\n <Text\n accessibilityRole=\"header\"\n className=\"text-text-primary\"\n style={{\n fontSize: 16,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"body-map-detail-panel-title\"\n >\n {displayName}\n </Text>\n <Badge\n variant=\"subtle\"\n color={STATUS_BADGE_COLOR[volumeStatus]}\n size=\"sm\"\n testID=\"body-map-detail-panel-status-badge\"\n >\n {VOLUME_STATUS_LABELS[volumeStatus]}\n </Badge>\n </View>\n <Pressable\n onPress={onClose}\n accessibilityRole=\"button\"\n accessibilityLabel={`Close ${displayName} details`}\n hitSlop={8}\n style={{ padding: 4, margin: -4 }}\n testID=\"body-map-detail-panel-close\"\n >\n <Text className=\"text-text-secondary\" style={{ fontSize: 22, lineHeight: 22 }}>{'×'}</Text>\n </Pressable>\n </View>\n\n {lastTrained != null && (\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID=\"body-map-detail-panel-last-trained\"\n >\n {`Last trained ${lastTrained}`}\n </Text>\n )}\n\n <View style={{ marginTop: 16 }} testID=\"body-map-detail-panel-volume\">\n <View\n className=\"flex-row items-center justify-between\"\n style={{ marginBottom: 6 }}\n accessibilityElementsHidden\n >\n <Text className=\"text-text-tertiary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}>\n {`MEV ${landmarks.mev}`}\n </Text>\n <Text className=\"text-text-tertiary\" style={{ fontSize: 10, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}>\n {`MRV ${landmarks.mrv}`}\n </Text>\n </View>\n <View\n style={{ height: 14, justifyContent: 'center' }}\n accessibilityRole=\"progressbar\"\n accessibilityValue={{ min: landmarks.mev, max: landmarks.mrv, now: weeklySets }}\n accessibilityLabel={`${weeklySets} weekly sets, between MEV ${landmarks.mev} and MRV ${landmarks.mrv}`}\n aria-valuenow={weeklySets}\n aria-valuemin={landmarks.mev}\n aria-valuemax={landmarks.mrv}\n testID=\"body-map-detail-panel-volume-bar\"\n >\n <View\n style={{ height: 8, borderRadius: 4, backgroundImage: VOLUME_GRADIENT } as ViewStyle}\n accessibilityElementsHidden\n />\n <View\n className=\"border-text-primary bg-surface-elevated\"\n style={{\n position: 'absolute',\n left: `${markerLeft}%`,\n marginLeft: -7,\n width: 14,\n height: 14,\n borderRadius: 7,\n borderWidth: 2,\n boxShadow: '0 0 4px rgba(0,0,0,0.5)',\n }}\n accessibilityElementsHidden\n testID=\"body-map-detail-panel-volume-marker\"\n />\n </View>\n </View>\n\n <View className=\"flex-row items-baseline\" style={{ marginTop: 14, gap: 4 }}>\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 24,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n }}\n testID=\"body-map-detail-panel-set-count\"\n >\n {weeklySets}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID=\"body-map-detail-panel-mrv-suffix\"\n >\n {`/ ${landmarks.mrv} MRV`}\n </Text>\n </View>\n\n {weeklyHistory != null && weeklyHistory.length > 0 && (\n <View style={{ marginTop: 14 }} testID=\"body-map-detail-panel-sparkline\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n marginBottom: 6,\n }}\n accessibilityElementsHidden\n >\n {'VOLUME TREND'}\n </Text>\n <Sparkline data={weeklyHistory} width={80} height={30} highlightLast />\n </View>\n )}\n\n {hasContributing && (\n <View style={{ marginTop: 16 }} testID=\"body-map-detail-panel-contributing\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n marginBottom: 8,\n }}\n >\n {'CONTRIBUTING EXERCISES'}\n </Text>\n {contributingExercises!.map((exercise, index) => (\n <View\n key={`${exercise.name}-${index}`}\n className=\"flex-row items-center justify-between bg-surface-raised border-hairline\"\n style={{\n gap: 10,\n paddingVertical: 8,\n paddingHorizontal: 12,\n marginBottom: 6,\n borderRadius: 8,\n borderWidth: 1,\n }}\n testID={`body-map-detail-panel-contributing-${index}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{ flex: 1, fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}\n testID={`body-map-detail-panel-contributing-${index}-name`}\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-secondary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`body-map-detail-panel-contributing-${index}-detail`}\n >\n {`${exercise.sets} sets · ${Math.round(exercise.contributionWeight * 100)}%`}\n </Text>\n </View>\n ))}\n </View>\n )}\n\n {hasUpcoming && (\n <View style={{ marginTop: 16 }} testID=\"body-map-detail-panel-upcoming\">\n <Text\n className=\"text-text-tertiary\"\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n marginBottom: 8,\n }}\n >\n {'UPCOMING'}\n </Text>\n {upcomingExercises!.map((exercise, index) => (\n <View\n key={`${exercise.name}-${index}`}\n className=\"flex-row items-center justify-between\"\n style={{ gap: 10, paddingVertical: 6 }}\n testID={`body-map-detail-panel-upcoming-${index}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{ flex: 1, fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '600' }}\n testID={`body-map-detail-panel-upcoming-${index}-name`}\n >\n {exercise.name}\n </Text>\n <Text\n className=\"text-text-tertiary\"\n style={{ fontSize: 12, fontFamily: 'Inter, sans-serif' }}\n testID={`body-map-detail-panel-upcoming-${index}-detail`}\n >\n {`${exercise.workoutName} · ${exercise.sets} sets`}\n </Text>\n </View>\n ))}\n </View>\n )}\n\n {onViewExercises != null && (\n <Pressable\n onPress={onViewExercises}\n accessibilityRole=\"button\"\n accessibilityLabel={`View ${displayName} exercises`}\n style={{\n marginTop: 16,\n paddingVertical: 10,\n borderRadius: 8,\n alignItems: 'center',\n backgroundColor: 'rgba(255,121,0,0.12)',\n borderWidth: 1,\n borderColor: 'rgba(255,121,0,0.3)',\n }}\n testID=\"body-map-detail-panel-view-exercises\"\n >\n <Text style={{ fontSize: 13, fontFamily: 'Inter, sans-serif', fontWeight: '700', color: BRAND_PRIMARY }}>\n {'View exercises'}\n </Text>\n </Pressable>\n )}\n </ScrollView>\n </Animated.View>\n </View>\n )\n}\n","/**\n * Colour math shared by the depth system.\n *\n * This file used to be `shadows.ts` and shipped a neumorphic shadow builder —\n * dual opposing shadows, dark bottom-right and light top-left. That was removed\n * in TD-07.16. Neumorphism needs a mid-tone background (roughly 75-90%\n * lightness) so BOTH shadows have somewhere to fall; our surfaces sit near 10%,\n * which leaves the dark half nothing to fall onto. It collapsed to a one-sided\n * rim light and read as noise on the wall.\n *\n * Inline depth is a hairline now (`hairline-*`, self-normalising alpha), texture\n * is `materials.ts`, and drop-shadow survives only for genuinely FLOATING\n * things — see `elevation.ts`.\n *\n * What is left here is the HSV/hex maths that `elevation.ts` still uses to\n * derive rim and shadow tints from whatever surface colour it is handed.\n */\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 strength tiers. Retained because `elevation.ts` keys its level table on\n * them; the neumorphic shadow BUILDERS that used to live here are gone.\n */\nexport type ShadowIntensity = 'subtle' | 'medium' | 'strong'\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 './color-utils'\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 // The whole ladder was re-spaced in TD-07.16. It used to run\n // 0.01/0.02/0.04/0.06/0.08, where the first step was ~2 RGB values — under\n // the perceptual floor, so level 1 existed in the type system and nowhere on\n // screen. With drop-shadow now gated off below FLOATING_ELEVATION_MIN, TONE\n // is the only thing separating 0-3, so every step has to actually land.\n // Even 0.025 spacing, verified in elevation.test.ts as ΔL* > 1 per step.\n colorAdjustment: 0.025,\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.05,\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.075,\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.10,\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.13,\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(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean\n): 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 */\n/**\n * The lowest elevation that still casts an outward shadow.\n *\n * On a near-black surface a drop-shadow is inert: at levels 1-3 the shadow is\n * dark-on-dark and contributes nothing a viewer can see, while still costing a\n * composite layer. Material dropped shadow-as-hierarchy for the same reason.\n * Inline hierarchy is the hairline's job (`hairline-*`), which composites by a\n * constant amount over any plane.\n *\n * At 4+ the element is genuinely FLOATING over a backdrop — menu, popover,\n * toast — where a large soft shadow describes separation from the page rather\n * than a rank in a stack. Those should also carry a hairline ring.\n */\nexport const FLOATING_ELEVATION_MIN: ElevationLevel = 4\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. Outward drop-shadow is gated to FLOATING levels only —\n // see FLOATING_ELEVATION_MIN. Inset levels keep theirs; a recess reads from\n // the inner shadow, which is a different mechanism from a cast shadow.\n const result =\n level > 0 && level < FLOATING_ELEVATION_MIN\n ? {}\n : 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 * Elevation level backing a `<Surface pressed>` recess: the shallow `inset`\n * (-1) step. Pressed exposes ONE level of depth — pressed-2 is intentionally\n * not surfaced (the deeper `-2` deep-inset stays available to `elevation`).\n */\nexport const PRESSED_ELEVATION_LEVEL: ElevationLevel = -1\n\n/**\n * Inner-shadow recess for a pressed (sunken) surface, tuned to the well's own\n * fill colour so the rim/shadow tints track the darker fill. Composes WITH the\n * darker pressed fill: on web it adds an inset boxShadow; on the native path\n * (no inset-shadow support) it's a no-op and the recess reads via the fill\n * alone — so a pressed surface stays legibly sunken with or without the shadow.\n *\n * @param fillColor - The pressed surface's own fill (one ramp step down).\n * @param theme - Current theme ('light' or 'dark').\n */\nexport function getPressedRecessShadow(fillColor: string, theme: 'light' | 'dark'): ViewStyle {\n return getElevationShadow(fillColor, PRESSED_ELEVATION_LEVEL, theme)\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 `surface-elevated` (#2A2827, TD-surface-tokens ramp) - allows further lightening\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 (#2A2827, TD-surface-tokens ramp) - 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(color: string, intensity: GlowIntensity = 'medium'): 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-hairline-strong', // Thicker border with stronger contrast\n filled: '', // Will be set dynamically via elevation system\n accent: 'border border-hairline',\n subtle: 'border border-hairline-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'\nimport { greyRamp } from '../../../theme/tokens/primitives'\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: greyRamp[500],\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: greyRamp[200],\n 'on-track': t['status-success'],\n deviation: t['status-warning'],\n future: greyRamp[500],\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: greyRamp[400] }}\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 { useMemo, useState } from 'react'\nimport { View, Text, type ViewProps } from 'react-native'\nimport { BodyMap, type BodyMapData } from './BodyMap'\nimport {\n BodyMapDetailPanel,\n type ContributingExercise,\n type UpcomingExercise,\n} from './BodyMapDetailPanel'\nimport { MesoStatusCard, type MesoStatusCardProps } from './MesoStatusCard'\nimport {\n MuscleGroup,\n VOLUME_STATUS_LABELS,\n getHeatmapColor,\n type VolumeLandmarks,\n type VolumeStatus,\n} from './muscleTaxonomy'\n\n/** Volume statuses in display order for the legend and summary cards. */\nconst STATUS_ORDER: VolumeStatus[] = ['under', 'maintenance', 'productive', 'over']\n\n/** One muscle's full volume picture — feeds the body maps and the detail panel. */\nexport interface TrainingStatusMuscle {\n /** Detailed muscle group (drives the SVG heatmap + panel identity). */\n muscleGroup: MuscleGroup\n /** Human-readable name for the legend, summary, and panel title. */\n displayName: string\n /** Which body-map view the muscle belongs to. */\n side: 'front' | 'back'\n /** Heatmap intensity 0-1. */\n intensity: number\n /** Weekly-volume status relative to the landmarks. */\n volumeStatus: VolumeStatus\n /** Weekly effective sets logged. */\n weeklySets: number\n /** Volume landmarks (weekly working sets). */\n landmarks: VolumeLandmarks\n /** Last trained label, e.g. \"2 days ago\". */\n lastTrained?: string\n /** Weekly volume history for the panel sparkline. */\n weeklyHistory?: number[]\n /** Exercises contributing to this muscle's volume. */\n contributingExercises?: ContributingExercise[]\n /** Upcoming exercises targeting this muscle. */\n upcomingExercises?: UpcomingExercise[]\n}\n\n/** Derived, page-level roll-up of the tracked muscles. */\nexport interface TrainingStatusSummary {\n /** Total weekly effective sets across all tracked muscles. */\n totalWeeklySets: number\n /** Number of muscles being tracked. */\n trackedMuscles: number\n /** Count of muscles per volume status. */\n statusCounts: Record<VolumeStatus, number>\n}\n\nexport interface TrainingStatusPageProps extends ViewProps {\n /** Page heading. */\n title?: string\n /** Mesocycle context banner shown at the top. */\n meso: MesoStatusCardProps\n /** Muscles tracked this week. */\n muscles: TrainingStatusMuscle[]\n className?: string\n}\n\n/** Roll up per-muscle rows into the page summary (pure, testable). */\nexport function deriveTrainingSummary(muscles: TrainingStatusMuscle[]): TrainingStatusSummary {\n const statusCounts: Record<VolumeStatus, number> = {\n under: 0,\n maintenance: 0,\n productive: 0,\n over: 0,\n }\n let totalWeeklySets = 0\n for (const muscle of muscles) {\n totalWeeklySets += muscle.weeklySets\n statusCounts[muscle.volumeStatus] += 1\n }\n return { totalWeeklySets, trackedMuscles: muscles.length, statusCounts }\n}\n\n/** Project the muscle rows for one side into `BodyMap` heatmap data. */\nexport function toBodyMapData(\n muscles: TrainingStatusMuscle[],\n side: 'front' | 'back'\n): BodyMapData[] {\n return muscles\n .filter((muscle) => muscle.side === side)\n .map(({ muscleGroup, intensity, volumeStatus, weeklySets }) => ({\n muscleGroup,\n intensity,\n volumeStatus,\n weeklySets,\n }))\n}\n\nconst SUMMARY_CARDS: Array<{\n key: keyof TrainingStatusSummary['statusCounts'] | 'total'\n label: string\n}> = [\n { key: 'total', label: 'Weekly Sets' },\n { key: 'productive', label: 'Productive' },\n { key: 'under', label: 'Under' },\n { key: 'over', label: 'Over' },\n]\n\nfunction SummaryCards({ summary }: { summary: TrainingStatusSummary }) {\n return (\n <View className=\"flex-row flex-wrap\" style={{ gap: 8 }} testID=\"training-status-page-summary\">\n {SUMMARY_CARDS.map(({ key, label }) => {\n const value = key === 'total' ? summary.totalWeeklySets : summary.statusCounts[key]\n return (\n <View\n key={key}\n className=\"bg-surface-elevated border-hairline\"\n style={{\n flexGrow: 1,\n flexBasis: '46%',\n padding: 12,\n borderRadius: 10,\n borderWidth: 1,\n }}\n testID={`training-status-page-summary-${key}`}\n >\n <Text\n className=\"text-text-primary\"\n style={{\n fontSize: 22,\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: 11,\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 StatusLegend() {\n return (\n <View\n className=\"flex-row flex-wrap\"\n style={{ gap: 10, justifyContent: 'center' }}\n testID=\"training-status-page-legend\"\n >\n {STATUS_ORDER.map((status) => (\n <View\n key={status}\n className=\"flex-row items-center\"\n style={{ gap: 5 }}\n testID={`training-status-page-legend-${status}`}\n >\n <View\n style={{\n width: 8,\n height: 8,\n borderRadius: 9999,\n backgroundColor: getHeatmapColor(status, 0.6),\n }}\n accessibilityElementsHidden\n />\n <Text\n className=\"text-text-secondary\"\n style={{\n fontSize: 11,\n fontFamily: 'Inter, sans-serif',\n textTransform: 'capitalize',\n }}\n >\n {VOLUME_STATUS_LABELS[status]}\n </Text>\n </View>\n ))}\n </View>\n )\n}\n\ninterface BodyMapColumnProps {\n side: 'front' | 'back'\n muscles: TrainingStatusMuscle[]\n selected: MuscleGroup | null\n onSelect: (muscle: MuscleGroup) => void\n}\n\nfunction BodyMapColumn({ side, muscles, selected, onSelect }: BodyMapColumnProps) {\n const data = useMemo(() => toBodyMapData(muscles, side), [muscles, side])\n return (\n <View style={{ flexGrow: 1, flexBasis: '46%' }} testID={`training-status-page-bodymap-${side}`}>\n <BodyMap\n data={data}\n view={side}\n onMusclePress={onSelect}\n highlightedMuscle={selected}\n mode=\"detailed\"\n />\n </View>\n )\n}\n\n/**\n * TrainingStatusPage — a body-map training dashboard that composes the\n * mesocycle context banner (`MesoStatusCard`), side-by-side front/back\n * `BodyMap`s with a shared heatmap legend, per-status summary cards, and a\n * tap-to-detail `BodyMapDetailPanel`. Tapping any muscle (SVG or legend chip)\n * opens the slide-up panel for that group; the summary is derived from the\n * supplied muscle rows.\n *\n * @example\n * <TrainingStatusPage meso={meso} muscles={muscles} />\n */\nexport function TrainingStatusPage({\n title = 'Training Status',\n meso,\n muscles,\n className,\n ...props\n}: TrainingStatusPageProps) {\n const [selected, setSelected] = useState<MuscleGroup | null>(null)\n const summary = useMemo(() => deriveTrainingSummary(muscles), [muscles])\n const active = selected != null ? (muscles.find((m) => m.muscleGroup === selected) ?? null) : 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=\"training-status-page\"\n {...props}\n >\n <View style={{ padding: 16, gap: 16 }} testID=\"training-status-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=\"training-status-page-title\"\n >\n {title}\n </Text>\n\n <MesoStatusCard {...meso} />\n\n <SummaryCards summary={summary} />\n\n <View\n className=\"bg-surface-elevated border-hairline\"\n style={{\n borderWidth: 1,\n borderRadius: 12,\n padding: 12,\n gap: 12,\n }}\n testID=\"training-status-page-bodymaps\"\n >\n <View className=\"flex-row\" style={{ gap: 8 }}>\n <BodyMapColumn\n side=\"front\"\n muscles={muscles}\n selected={selected}\n onSelect={setSelected}\n />\n <BodyMapColumn\n side=\"back\"\n muscles={muscles}\n selected={selected}\n onSelect={setSelected}\n />\n </View>\n <StatusLegend />\n </View>\n </View>\n\n {active != null && (\n <BodyMapDetailPanel\n muscleGroup={active.muscleGroup}\n displayName={active.displayName}\n weeklySets={active.weeklySets}\n landmarks={active.landmarks}\n volumeStatus={active.volumeStatus}\n lastTrained={active.lastTrained}\n weeklyHistory={active.weeklyHistory}\n contributingExercises={active.contributingExercises}\n upcomingExercises={active.upcomingExercises}\n isOpen\n onClose={() => setSelected(null)}\n />\n )}\n </View>\n )\n}\n"]}
|