@titan-design/react-ui 0.3.0 → 0.4.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 +441 -97
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +49 -62
- package/dist/bodymap.mjs.map +1 -1
- package/dist/{chunk-TOD2WQBG.mjs → chunk-2SISKTWM.mjs} +22 -43
- package/dist/chunk-2SISKTWM.mjs.map +1 -0
- package/dist/{chunk-P7TSQUN6.mjs → chunk-SNVKL5WZ.mjs} +42 -5
- package/dist/chunk-SNVKL5WZ.mjs.map +1 -0
- package/dist/index.d.mts +42 -2
- package/dist/index.d.ts +42 -2
- package/dist/index.js +431 -328
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +397 -314
- package/dist/index.mjs.map +1 -1
- package/dist/theme/index.d.mts +28 -2
- package/dist/theme/index.d.ts +28 -2
- package/dist/theme/index.js +37 -0
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +1 -1
- package/package.json +1 -1
- package/src/components/custom/Workout/ActiveWorkoutPage.tsx +10 -15
- package/src/components/custom/Workout/BodyMap.tsx +7 -8
- package/src/components/custom/Workout/BodyMapDetailPanel.tsx +25 -28
- package/src/components/custom/Workout/CapacityBandChart.tsx +2 -3
- package/src/components/custom/Workout/ExerciseCard.tsx +12 -27
- package/src/components/custom/Workout/ExerciseDetailPage.tsx +21 -27
- package/src/components/custom/Workout/InputBar.tsx +10 -11
- package/src/components/custom/Workout/MesoCard.tsx +2 -6
- package/src/components/custom/Workout/MesoStatusCard.tsx +17 -15
- package/src/components/custom/Workout/MuscleGroupChip.tsx +2 -4
- package/src/components/custom/Workout/PlaceholderStrip.tsx +2 -3
- package/src/components/custom/Workout/PrHistoryModal.tsx +12 -14
- package/src/components/custom/Workout/ProgramPlanningPage.tsx +8 -12
- package/src/components/custom/Workout/ReadinessCheck.tsx +13 -11
- package/src/components/custom/Workout/RestTimer.tsx +8 -7
- package/src/components/custom/Workout/SetRow.tsx +10 -7
- package/src/components/custom/Workout/StrengthTrendChart.tsx +15 -17
- package/src/components/custom/Workout/TempoBar.stories.tsx +95 -0
- package/src/components/custom/Workout/TempoBar.test.tsx +103 -0
- package/src/components/custom/Workout/TempoBar.tsx +215 -0
- package/src/components/custom/Workout/TrainingStatusPage.tsx +8 -17
- package/src/components/custom/Workout/VelocityStrip.tsx +7 -5
- package/src/components/custom/Workout/WeekRow.tsx +2 -1
- package/src/components/custom/Workout/WorkoutCard.tsx +3 -8
- package/src/components/custom/Workout/index.ts +9 -0
- package/src/test/nativewind-stub.ts +13 -0
- package/src/theme/ThemeProvider.test.tsx +24 -0
- package/src/theme/ThemeProvider.tsx +50 -0
- package/src/theme/index.ts +2 -0
- package/src/theme/resolve-color.ts +19 -0
- package/dist/chunk-P7TSQUN6.mjs.map +0 -1
- package/dist/chunk-TOD2WQBG.mjs.map +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Cross-platform theme provider (TD native-theming).
|
|
2
|
+
//
|
|
3
|
+
// Registers titan's semantic color tokens as runtime CSS variables via
|
|
4
|
+
// nativewind's `vars()` so that className color tokens (`text-text-secondary`,
|
|
5
|
+
// `bg-surface-raised`, `border-border`, …) resolve on NATIVE React Native — the
|
|
6
|
+
// native equivalent of the `:root {}` block `global.css` provides on web.
|
|
7
|
+
//
|
|
8
|
+
// Why this exists: titan's Workout organisms reference semantic colors as CSS
|
|
9
|
+
// variables. On web (the dashboard, react-native-web) those come from
|
|
10
|
+
// `global.css`. On native (the mobile app) nothing defined them, so any titan
|
|
11
|
+
// component using a `--color-*` token rendered with an unresolved (black) color.
|
|
12
|
+
// Wrap the mobile app root in `<ThemeProvider>` and the tokens resolve on-device.
|
|
13
|
+
//
|
|
14
|
+
// The var maps are the SAME canonical `darkThemeCSSVars` / `lightThemeCSSVars`
|
|
15
|
+
// that generate `global.css`, so native and web resolve to identical values.
|
|
16
|
+
import { vars } from 'nativewind'
|
|
17
|
+
import { View, type ViewProps } from 'react-native'
|
|
18
|
+
import { darkThemeCSSVars, lightThemeCSSVars } from './config'
|
|
19
|
+
|
|
20
|
+
export type ThemeProviderMode = 'dark' | 'light'
|
|
21
|
+
|
|
22
|
+
// Precomputed once — `vars()` is pure, so the same style object is reused across
|
|
23
|
+
// renders. Native == web because these are the maps `tokens-css` emits.
|
|
24
|
+
const MODE_VARS = {
|
|
25
|
+
dark: vars(darkThemeCSSVars),
|
|
26
|
+
light: vars(lightThemeCSSVars),
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ThemeProviderProps extends ViewProps {
|
|
30
|
+
/** Theme mode to register. Mobile is dark-only today; defaults to `dark`. */
|
|
31
|
+
mode?: ThemeProviderMode
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Wrap the app root so descendant titan components' `--color-*` className tokens
|
|
36
|
+
* resolve on native. Fills its parent (`flex: 1`) by default; pass `style` to
|
|
37
|
+
* override. On web it is harmless (the dashboard already loads `global.css`).
|
|
38
|
+
*/
|
|
39
|
+
export function ThemeProvider({
|
|
40
|
+
mode = 'dark',
|
|
41
|
+
style,
|
|
42
|
+
children,
|
|
43
|
+
...props
|
|
44
|
+
}: ThemeProviderProps): React.JSX.Element {
|
|
45
|
+
return (
|
|
46
|
+
<View style={[MODE_VARS[mode], { flex: 1 }, style]} {...props}>
|
|
47
|
+
{children}
|
|
48
|
+
</View>
|
|
49
|
+
)
|
|
50
|
+
}
|
package/src/theme/index.ts
CHANGED
|
@@ -4,6 +4,8 @@ export * from './config'
|
|
|
4
4
|
export * from './shadows'
|
|
5
5
|
export * from './elevation'
|
|
6
6
|
export * from './manifest'
|
|
7
|
+
export { ThemeProvider, type ThemeProviderProps, type ThemeProviderMode } from './ThemeProvider'
|
|
8
|
+
export { resolveColor } from './resolve-color'
|
|
7
9
|
|
|
8
10
|
// Re-export commonly used items
|
|
9
11
|
export { getSemanticColors, type ThemeMode } from './tokens/semantic'
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Platform } from 'react-native'
|
|
2
|
+
import { getSemanticColors, type ThemeMode } from './tokens/semantic'
|
|
3
|
+
|
|
4
|
+
type ColorToken = keyof ReturnType<typeof getSemanticColors>
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Resolve a semantic color token for an inline style where a nativewind
|
|
8
|
+
* className can't apply — gradients (`backgroundImage`), per-edge borders
|
|
9
|
+
* (`borderTopColor`, …), SVG attributes, and conditional hex/token mixes.
|
|
10
|
+
*
|
|
11
|
+
* The companion to className color tokens: on **web** it returns the CSS
|
|
12
|
+
* variable (`var(--color-…)`), so the dashboard's light/dark switching keeps
|
|
13
|
+
* working exactly as `global.css` intends; on **native** it returns the
|
|
14
|
+
* resolved hex from `getSemanticColors` (mobile is dark-only). This is why
|
|
15
|
+
* these spots stay theme-correct on web while also rendering on-device.
|
|
16
|
+
*/
|
|
17
|
+
export function resolveColor(token: ColorToken, mode: ThemeMode = 'dark'): string {
|
|
18
|
+
return Platform.OS === 'web' ? `var(--color-${token})` : getSemanticColors(mode)[token]
|
|
19
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/shadows.ts","../src/theme/elevation.ts","../src/theme/manifest/css-property-manifest.validate.ts","../src/theme/presets/apply.ts","../src/theme/presets/default.ts","../src/theme/presets/audiobook.ts"],"names":["intensityConfig","Platform"],"mappings":"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","file":"chunk-P7TSQUN6.mjs","sourcesContent":["/**\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(baseColor: string, level: ElevationLevel, theme: 'light' | 'dark', isHovered: boolean): string {\n return `${baseColor}-${level}-${theme}-${isHovered}`\n}\n\nfunction calculateElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const config = elevationSystem[level]\n \n // Base level has no shadow\n if (level === 0) {\n return {}\n }\n \n // Calculate the actual elevated surface color\n const elevatedSurfaceColor = calculateElevationSurface(baseColor, level, theme)\n \n // Rim light: calculated from BASE color (consistent across all elevations)\n // This represents a consistent light source - only size changes with elevation\n const rimLightColor = calculateRimLightColor(baseColor, level)\n \n // Dark shadow: calculated from ELEVATED surface color\n // The shadow is cast by the element, so it should match the surface\n const darkShadowColors = calculateDarkShadowColors(elevatedSurfaceColor)\n \n // Get shadow intensity config (for dark shadow)\n const intensityConfig = {\n subtle: { offset: 1, blur: 2 },\n medium: { offset: 2, blur: 4 },\n strong: { offset: 2, blur: 5 },\n }\n \n const { offset, blur } = intensityConfig[config.shadowIntensity]\n \n // Get rim light config (scales with elevation level)\n const rimConfig = getRimLightConfig()\n \n if (config.shadowStyle === 'pressed') {\n // Inset shadow (pressed elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `inset ${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n }\n \n return Platform.select({\n web: {\n boxShadow: `inset ${offset}px ${offset}px ${blur}px ${darkShadowColors.darker}, inset -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowOpacity: 0,\n elevation: 0,\n },\n }) as ViewStyle\n } else {\n // Raised shadow (floating elements)\n if (isHovered) {\n // Reduce shadow depth for hover\n const hoverOffset = Math.max(1, Math.round(offset / 2))\n const hoverBlur = Math.max(1, Math.round(blur / 2))\n return Platform.select({\n web: {\n boxShadow: `${hoverOffset}px ${hoverOffset}px ${hoverBlur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: hoverOffset, height: hoverOffset },\n shadowOpacity: 0.2,\n shadowRadius: hoverBlur / 2,\n elevation: hoverOffset,\n },\n }) as ViewStyle\n }\n \n return Platform.select({\n web: {\n boxShadow: `${offset}px ${offset}px ${blur}px ${darkShadowColors.dark}, -${rimConfig.offset}px -${rimConfig.offset}px ${rimConfig.blur}px ${rimLightColor}`,\n } as any,\n default: {\n shadowColor: '#000',\n shadowOffset: { width: offset, height: offset },\n shadowOpacity: 0.3,\n shadowRadius: blur / 2,\n elevation: offset,\n },\n }) as ViewStyle\n }\n}\n\n/**\n * Get shadow style for an elevation level, calculated dynamically from surface color.\n * Results are cached to avoid redundant calculations.\n * \n * @param baseColor - Base surface color (hex)\n * @param level - Elevation level\n * @param theme - Current theme ('light' or 'dark')\n * @param isHovered - Whether element is hovered\n * @returns ViewStyle with shadow properties\n */\nexport function getElevationShadow(\n baseColor: string,\n level: ElevationLevel,\n theme: 'light' | 'dark',\n isHovered: boolean = false\n): ViewStyle {\n const cacheKey = getShadowCacheKey(baseColor, level, theme, isHovered)\n \n // Check cache\n if (elevationShadowCache.has(cacheKey)) {\n return elevationShadowCache.get(cacheKey)!\n }\n \n // Calculate shadow\n const result = calculateElevationShadow(baseColor, level, theme, isHovered)\n \n // Cache result\n if (elevationShadowCache.size >= MAX_SHADOW_CACHE_SIZE) {\n const firstKey = elevationShadowCache.keys().next().value!\n elevationShadowCache.delete(firstKey)\n }\n elevationShadowCache.set(cacheKey, result)\n \n return result\n}\n\n/**\n * Get base surface color from theme.\n * This is the foundation color that all elevations are calculated from.\n * \n * IMPORTANT: Base colors must be chosen to allow sufficient lightening.\n * \n * **Light Mode**: Cannot use `#FFFFFF` (white) - cannot lighten white!\n * - Use `#F3F4F6` (neutral[100]) - can lighten to `#FAFAFA` → `#FFFFFF`\n * - This allows raised elevations to be lighter (closer to white)\n * \n * **Dark Mode**: Need lighter base to allow sufficient lightening\n * - Use `#191919` (charcoal[600]) - allows lightening to `#2A2A2A` at max elevation\n * \n * Can be overridden to use custom base colors for special cases.\n */\nexport function getBaseSurfaceColor(theme: 'light' | 'dark'): string {\n // Use semantic token values so elevation colors stay in sync with the token pipeline.\n // Light mode: surface-raised (#F3F4F6 / neutral[100]) - NOT white, so we can lighten it\n // Dark mode: surface-elevated (#191919 / charcoal[600]) - allows sufficient lightening\n\n return theme === 'light'\n ? semanticColorsLight['surface-raised']\n : semanticColorsDark['surface-elevated']\n}\n\n/**\n * Component-specific elevation ranges\n * Defines which elevation levels each component type can use\n */\nexport const componentElevationRanges = {\n button: {\n allowed: [2] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n card: {\n allowed: [1, 2, 3] as const,\n default: 2 as const,\n hover: 3 as const,\n },\n input: {\n allowed: [-2, -1, 0] as const,\n default: -1 as const,\n },\n overlay: {\n allowed: [4, 5] as const,\n default: 4 as const,\n },\n} as const\n\nexport type ComponentType = keyof typeof componentElevationRanges\n\n/**\n * Validate and clamp elevation to component's allowed range\n */\nexport function getValidatedElevation(\n component: ComponentType,\n requested: ElevationLevel\n): ElevationLevel {\n const range = componentElevationRanges[component]\n if ((range.allowed as readonly ElevationLevel[]).includes(requested)) {\n return requested\n }\n // Clamp to nearest allowed elevation\n const sorted = [...range.allowed].sort((a, b) => a - b)\n if (requested < sorted[0]) return sorted[0]\n if (requested > sorted[sorted.length - 1]) return sorted[sorted.length - 1]\n // Find closest\n return sorted.reduce((prev, curr) =>\n Math.abs(curr - requested) < Math.abs(prev - requested) ? curr : prev\n ) as ElevationLevel\n}\n\n// =============================================================================\n// Glow Shadow Support\n// =============================================================================\n\nexport type GlowIntensity = 'subtle' | 'medium' | 'strong'\n\nconst glowConfig: Record<GlowIntensity, { blur: number; spread: number; opacity: number }> = {\n subtle: { blur: 12, spread: 0, opacity: 0.25 },\n medium: { blur: 20, spread: 2, opacity: 0.4 },\n strong: { blur: 30, spread: 4, opacity: 0.55 },\n}\n\n/**\n * Get a glow shadow style for emphasis/active states.\n *\n * Creates a colored radial glow around an element, useful for:\n * - Active recording indicators (orange glow)\n * - Success states (green glow)\n * - Error/danger indicators (red glow)\n * - Focus rings and attention-drawing elements\n *\n * @param color - Glow color (hex string, e.g. '#FF7900')\n * @param intensity - Glow intensity level\n * @returns ViewStyle with platform-specific shadow properties\n */\nexport function getGlowShadow(\n color: string,\n intensity: GlowIntensity = 'medium'\n): ViewStyle {\n const config = glowConfig[intensity]\n const rgb = hexToRgb(color)\n if (!rgb) return {}\n\n return Platform.select({\n web: {\n boxShadow: `0 0 ${config.blur}px ${config.spread}px rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${config.opacity})`,\n } as any,\n default: {\n shadowColor: color,\n shadowOffset: { width: 0, height: 0 },\n shadowOpacity: config.opacity,\n shadowRadius: config.blur / 2,\n elevation: 0,\n },\n }) as ViewStyle\n}\n","import type { CssPropertyManifest, VariantAxes } from './css-property-manifest.types'\n\n/** Result of validating a candidate manifest: valid iff errors is empty. */\nexport interface ManifestValidationResult {\n valid: boolean\n errors: string[]\n}\n\nconst isPlainObject = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value)\n\nconst isVariantAxes = (value: unknown): value is VariantAxes =>\n isPlainObject(value) &&\n Object.keys(value).length > 0 &&\n Object.values(value).every((axisValue) => typeof axisValue === 'string')\n\nfunction collectVariantOverrideErrors(override: unknown, path: string): string[] {\n if (!isPlainObject(override)) return [`${path} must be an object`]\n const errors: string[] = []\n if (!isVariantAxes(override.variant))\n errors.push(`${path}.variant must be a non-empty string-keyed object`)\n if (\n override.token !== undefined &&\n override.token !== null &&\n typeof override.token !== 'string'\n ) {\n errors.push(`${path}.token must be a string or null`)\n }\n if (typeof override.resolvedValue !== 'string' || override.resolvedValue.length === 0) {\n errors.push(`${path}.resolvedValue must be a non-empty string`)\n }\n return errors\n}\n\nfunction collectPropertyErrors(entry: unknown, path: string): string[] {\n if (!isPlainObject(entry)) return [`${path} must be an object`]\n const errors: string[] = []\n if (typeof entry.property !== 'string' || entry.property.length === 0) {\n errors.push(`${path}.property must be a non-empty string`)\n }\n if (entry.token !== null && typeof entry.token !== 'string') {\n errors.push(`${path}.token must be a string or null`)\n }\n if (typeof entry.resolvedValue !== 'string' || entry.resolvedValue.length === 0) {\n errors.push(`${path}.resolvedValue must be a non-empty string`)\n }\n if (entry.variantOverrides !== undefined) {\n if (!Array.isArray(entry.variantOverrides)) {\n errors.push(`${path}.variantOverrides must be an array`)\n } else {\n entry.variantOverrides.forEach((override, i) =>\n errors.push(...collectVariantOverrideErrors(override, `${path}.variantOverrides[${i}]`))\n )\n }\n }\n return errors\n}\n\n/** Structurally validates a candidate value against the CssPropertyManifest shape. */\nexport function validateCssPropertyManifest(candidate: unknown): ManifestValidationResult {\n if (!isPlainObject(candidate)) return { valid: false, errors: ['manifest must be an object'] }\n\n const errors: string[] = []\n if (typeof candidate.component !== 'string' || candidate.component.length === 0) {\n errors.push('component must be a non-empty string')\n }\n if (candidate.baseVariant !== undefined && !isVariantAxes(candidate.baseVariant)) {\n errors.push('baseVariant must be a non-empty string-keyed object')\n }\n if (!Array.isArray(candidate.properties) || candidate.properties.length === 0) {\n errors.push('properties must be a non-empty array')\n } else {\n candidate.properties.forEach((entry, i) =>\n errors.push(...collectPropertyErrors(entry, `properties[${i}]`))\n )\n }\n\n return { valid: errors.length === 0, errors }\n}\n\n/** Type guard variant of validateCssPropertyManifest for use in narrowing contexts. */\nexport function isCssPropertyManifest(candidate: unknown): candidate is CssPropertyManifest {\n return validateCssPropertyManifest(candidate).valid\n}\n","import type { ThemePreset } from './types'\n\nfunction colorKeyToVar(key: string): string {\n return `--color-${key}`\n}\n\nfunction applyColorOverrides(colors: Record<string, string | undefined>, root: HTMLElement) {\n for (const [key, value] of Object.entries(colors)) {\n if (value !== undefined) {\n root.style.setProperty(colorKeyToVar(key), value)\n }\n }\n}\n\nfunction applyFontOverrides(fonts: Record<string, string | undefined>, root: HTMLElement) {\n const fontVarMap: Record<string, string> = {\n sans: '--font-family-sans',\n body: '--font-family-body',\n heading: '--font-family-heading',\n mono: '--font-family-mono',\n }\n for (const [key, value] of Object.entries(fonts)) {\n if (value !== undefined && fontVarMap[key]) {\n root.style.setProperty(fontVarMap[key], value)\n }\n }\n}\n\nfunction injectFontImport(url: string) {\n if (typeof document === 'undefined') return\n const existing = document.querySelector(`link[href=\"${url}\"]`)\n if (existing) return\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.href = url\n document.head.appendChild(link)\n}\n\nexport function applyThemePreset(preset: ThemePreset): () => void {\n if (typeof document === 'undefined') {\n return () => {}\n }\n\n const root = document.documentElement\n const removals: (() => void)[] = []\n\n // Inject font import if specified\n if (preset.fontImport) {\n injectFontImport(preset.fontImport)\n }\n\n // Determine current theme mode\n const isLight = root.classList.contains('light')\n const modeColors = isLight ? preset.colors?.light : preset.colors?.dark\n\n // Apply color overrides\n if (modeColors) {\n const previousValues: Record<string, string | null> = {}\n for (const key of Object.keys(modeColors)) {\n previousValues[colorKeyToVar(key)] = root.style.getPropertyValue(colorKeyToVar(key)) || null\n }\n applyColorOverrides(modeColors, root)\n removals.push(() => {\n for (const [varName, prev] of Object.entries(previousValues)) {\n if (prev === null) {\n root.style.removeProperty(varName)\n } else {\n root.style.setProperty(varName, prev)\n }\n }\n })\n }\n\n // Apply font overrides\n if (preset.fonts) {\n applyFontOverrides(preset.fonts as Record<string, string | undefined>, root)\n }\n\n // Apply root classes\n if (preset.rootClasses) {\n for (const cls of preset.rootClasses) {\n root.classList.add(cls)\n }\n removals.push(() => {\n for (const cls of preset.rootClasses!) {\n root.classList.remove(cls)\n }\n })\n }\n\n // Return cleanup function\n return () => {\n for (const remove of removals) {\n remove()\n }\n }\n}\n","import type { ThemePreset } from './types'\n\nexport const defaultPreset: ThemePreset = {\n name: 'default',\n description: 'Titan Design System default theme — orange accent, steel secondary',\n}\n","import type { ThemePreset } from './types'\n\n/**\n * Audiobook Studio preset.\n *\n * Warm copper/patina aesthetic inspired by vintage audio equipment\n * and reading lounges. Dark-mode only design with editorial typography.\n */\nexport const audiobookPreset: ThemePreset = {\n name: 'audiobook',\n description: 'Warm copper/patina theme with editorial typography',\n fontImport:\n \"https://fonts.googleapis.com/css2?family=Newsreader:ital,wght@0,400;0,600;0,700;1,400&family=Outfit:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\",\n fonts: {\n sans: \"'Outfit', 'Avenir', 'Avenir Next', system-ui, sans-serif\",\n body: \"'Outfit', 'Avenir', 'Avenir Next', system-ui, sans-serif\",\n heading: \"'Newsreader', 'Libre Baskerville', Georgia, serif\",\n mono: \"'JetBrains Mono', 'SF Mono', 'Fira Code', monospace\",\n },\n colors: {\n dark: {\n // Brand: Copper accent\n 'brand-primary': '#d4782a',\n 'brand-primary-light': '#e8944a',\n 'brand-primary-dark': '#9a4a15',\n 'brand-primary-subtle': 'rgba(212, 120, 42, 0.12)',\n 'brand-primary-hover': '#e8944a',\n 'brand-primary-active': '#f5b070',\n\n // Brand secondary: Patina/verdigris\n 'brand-secondary': '#3a9b8a',\n 'brand-secondary-light': '#55baa7',\n 'brand-secondary-dark': '#1f5c52',\n 'brand-secondary-subtle': 'rgba(58, 155, 138, 0.12)',\n 'brand-secondary-hover': '#55baa7',\n 'brand-secondary-active': '#7ed4c4',\n\n 'on-brand-primary': '#FFFFFF',\n 'on-brand-secondary': '#FFFFFF',\n\n // Status colors (audiobook's warmer status palette)\n 'status-success': '#5fb870',\n 'status-error': '#d85c4a',\n 'status-warning': '#d4a43a',\n 'status-info': '#5a8fd4',\n\n // Text: warm off-whites\n 'text-primary': '#f4f3f1',\n 'text-secondary': '#b5b3af',\n 'text-tertiary': '#7a7875',\n\n // Surfaces: warm charcoals (not pure gray)\n 'surface-base': '#101114',\n 'surface-elevated': '#15171c',\n 'surface-raised': '#1a1d24',\n 'surface-overlay': '#15171c',\n 'surface-input': '#15171c',\n\n // Backgrounds\n 'background-base': '#0a0b0d',\n 'background-default': '#101114',\n 'background-subtle': '#1a1d24',\n\n // Borders\n 'border-default': 'rgba(255, 255, 255, 0.06)',\n 'border-subtle': 'rgba(255, 255, 255, 0.03)',\n 'border-strong': '#2d323d',\n 'border-focus': '#d4782a',\n 'border-input': '#2d323d',\n 'border-input-hover': '#454c5c',\n 'border-input-focus': '#d4782a',\n 'border-input-error': '#d85c4a',\n\n // Interactive\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\n 'divider': 'rgba(255, 255, 255, 0.06)',\n\n // Glow RGB values for shadow utilities\n 'brand-primary-rgb': '212, 120, 42',\n 'brand-secondary-rgb': '58, 155, 138',\n 'status-success-rgb': '95, 184, 112',\n 'status-error-rgb': '216, 92, 74',\n 'status-warning-rgb': '212, 164, 58',\n 'status-info-rgb': '90, 143, 212',\n 'background-base-rgb': '10, 11, 13',\n },\n },\n rootClasses: ['atmosphere-warm', 'grain'],\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/cn.ts","../src/utils/useTheme.ts","../src/web-jsx/jsx-runtime.ts","../src/components/ui/card/Card.tsx","../src/components/ui/indicator/Indicator.tsx","../src/components/ui/badge/Badge.tsx","../src/components/custom/Workout/StatusDot.tsx","../src/components/custom/Workout/Sparkline.tsx","../src/components/custom/Workout/MesoStatusCard.tsx","../src/theme/workout-tokens.ts"],"names":["cn","reactJsx","reactJsxs","View","sizeStyles","Text","BRAND_PRIMARY","Fragment"],"mappings":"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","file":"chunk-TOD2WQBG.mjs","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","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","/**\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","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","import React from 'react'\nimport { View, type ViewProps } from 'react-native'\nimport { cn } from '../../../utils/cn'\n\nexport type IndicatorSize = 'xs' | 'sm' | 'md' | 'lg'\nexport type IndicatorColor = 'default' | 'primary' | 'success' | 'error' | 'warning' | 'info'\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 /** Additional className */\n className?: string\n}\n\nconst sizeStyles: Record<IndicatorSize, string> = {\n xs: 'w-1 h-1',\n sm: 'w-1.5 h-1.5',\n md: 'w-2 h-2',\n lg: 'w-2.5 h-2.5',\n}\n\nconst colorStyles: Record<IndicatorColor, string> = {\n default: 'bg-text-tertiary',\n primary: 'bg-brand-primary',\n success: 'bg-status-success',\n error: 'bg-status-error',\n warning: 'bg-status-warning',\n info: 'bg-status-info',\n}\n\nexport function Indicator({\n size = 'sm',\n color = 'default',\n customColor,\n glow = false,\n ring = false,\n className,\n style,\n ...props\n}: IndicatorProps) {\n const dynamicStyle = {\n ...(typeof style === 'object' ? style : {}),\n ...(customColor ? { backgroundColor: customColor } : {}),\n ...(glow && !customColor ? {} : {}),\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 !customColor && colorStyles[color],\n ring && 'border-2 border-background-base',\n glow && !customColor && color === 'success' && 'shadow-[0_0_6px_rgba(20,184,166,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 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 { View, Text, type ViewProps } from 'react-native'\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: '#14B8A6',\n warning: '#FFB020',\n error: '#D14343',\n neutral: '#6B7280',\n}\n\nconst ringVariantStyles: Record<string, Record<string, unknown>> = {\n 'on-track': {\n backgroundColor: 'rgba(20,184,166,0.15)',\n borderWidth: 1,\n borderColor: 'rgba(20,184,166,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(20,184,166,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(20,184,166,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': '#14B8A6',\n deviation: '#FFB020',\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","// 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'\n\nconst BRAND_PRIMARY = '#FF7900'\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 { Fragment, type ReactNode } from 'react'\nimport { View, Text, type ViewProps, type ViewStyle } from 'react-native'\nimport { Card } from '../../ui/card'\nimport { StatusDot } from './StatusDot'\n\nconst BRAND_PRIMARY = '#FF7900'\nconst BRAND_PRIMARY_DARK = '#C45E00'\nconst BRAND_PRIMARY_LIGHT = '#FFB066'\nconst TEXT_PRIMARY = 'var(--color-text-primary)'\nconst TEXT_SECONDARY = 'var(--color-text-secondary)'\nconst TEXT_TERTIARY = 'var(--color-text-tertiary)'\n\nconst SUCCESS = '#14B8A6'\nconst WARNING = '#FFB020'\nconst ERROR = '#D14343'\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/** Card surface gradient: elevated -> raised at 135deg (theme-aware). */\nconst CARD_GRADIENT =\n 'linear-gradient(135deg, var(--color-surface-elevated) 0%, var(--color-surface-raised) 100%)'\n\n/** Gauge track gradient (teal -> amber -> red) at 0.25 alpha. */\nconst GAUGE_GRADIENT =\n 'linear-gradient(90deg, rgba(20,184,166,0.25) 0%, rgba(255,176,32,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(20,184,166,0.15)', border: 'rgba(20,184,166,0.3)', text: SUCCESS },\n warning: { bg: 'rgba(255,176,32,0.15)', border: 'rgba(255,176,32,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 style={{ fontWeight: '700', color: TEXT_PRIMARY }}\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 style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n color: TEXT_TERTIARY,\n }}\n >\n {metric.label}\n </Text>\n <Text\n style={{\n marginTop: 2,\n fontSize: 13,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '600',\n color: TEXT_PRIMARY,\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 style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n color: TEXT_SECONDARY,\n }}\n >\n {gauge.label}\n </Text>\n {gauge.sublabel != null && (\n <Text\n style={{\n fontSize: 10,\n fontFamily: 'Inter, sans-serif',\n fontWeight: '500',\n color: TEXT_TERTIARY,\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 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 borderColor: TEXT_PRIMARY,\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 style={{\n flexShrink: 1,\n fontSize: 15,\n fontFamily: '\"Space Grotesk\", sans-serif',\n fontWeight: '700',\n color: TEXT_PRIMARY,\n }}\n testID=\"meso-status-card-name\"\n >\n {mesoName}\n </Text>\n <StatusPill badge={statusBadge} />\n </View>\n <Text\n style={{\n marginTop: 4,\n fontSize: 12,\n fontFamily: 'Inter, sans-serif',\n color: TEXT_SECONDARY,\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(255,176,32,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(255,176,32,0.15)',\n borderRadius: 8,\n paddingVertical: 10,\n paddingHorizontal: 12,\n }}\n testID=\"meso-status-card-coaching\"\n >\n <Text\n style={{\n fontSize: 12,\n lineHeight: 17,\n fontFamily: 'Inter, sans-serif',\n color: TEXT_SECONDARY,\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(20,184,166,0.06)',\n borderWidth: 1,\n borderColor: 'rgba(20,184,166,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","/**\n * Workout-specific tokens not yet in the main Tailwind config.\n * Use these inline instead of Tailwind classes.\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. Each component maps its own\n // thresholds onto these four colors. Kept as vivid data-viz values (distinct\n // from the muted status tokens) and theme-independent, so — like the heatmap\n // scale below — they are consumed inline as a JS import rather than CSS vars.\n // A JS import also resolves on native RN, unlike var(--…) strings.\n scale: {\n green: '#2ed573',\n yellow: '#ffd43b',\n orange: '#ffa502',\n red: '#ff4757',\n },\n\n // BodyMap volume heatmap scale (drive dynamic SVG fills, so inline values).\n // Maps weekly-volume status against MEV/MAV/MRV landmarks to a fill color.\n heatmap: {\n none: '#E0E0E0', // gray — no training data\n under: '#4A90D9', // cool blue — below MEV\n maintenance: '#F5C842', // warm yellow — MEV to MAV\n productive: '#4CAF50', // green — MAV to MRV\n approaching: '#FFA502', // orange — near MRV\n over: '#FF6B35', // red-orange — 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\n intensity: {\n track: '#333333',\n over1: '#D14343',\n over2: '#A62626',\n over3: '#7A1C1C',\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"]}
|