@titan-design/react-ui 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/MesoStatusCard-CQk71hSi.d.mts +77 -0
  2. package/dist/MesoStatusCard-CQk71hSi.d.ts +77 -0
  3. package/dist/bodymap.d.mts +246 -3
  4. package/dist/bodymap.d.ts +246 -3
  5. package/dist/bodymap.mjs +1911 -6
  6. package/dist/bodymap.mjs.map +1 -1
  7. package/dist/index.d.mts +31 -738
  8. package/dist/index.d.ts +31 -738
  9. package/dist/index.js +894 -1692
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +10287 -8203
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/pages-D7Jlssvp.d.ts +791 -0
  14. package/dist/pages-MO0JCySL.d.mts +791 -0
  15. package/dist/pages.d.mts +4 -0
  16. package/dist/pages.d.ts +4 -0
  17. package/dist/pages.js +6646 -0
  18. package/dist/pages.js.map +1 -0
  19. package/dist/pages.mjs +6626 -0
  20. package/dist/pages.mjs.map +1 -0
  21. package/dist/theme/index.d.mts +12 -12
  22. package/dist/theme/index.d.ts +12 -12
  23. package/dist/theme/index.js +30 -30
  24. package/dist/theme/index.js.map +1 -1
  25. package/dist/theme/index.mjs +1880 -2
  26. package/dist/theme/index.mjs.map +1 -1
  27. package/dist/theme/tokens-css.mjs +573 -1
  28. package/dist/theme/tokens-css.mjs.map +1 -1
  29. package/package.json +9 -7
  30. package/src/components/custom/Workout/BaseBadge.stories.tsx +3 -3
  31. package/src/components/custom/Workout/BaseBadge.test.tsx +1 -1
  32. package/src/components/custom/Workout/BaseBadge.tsx +1 -1
  33. package/src/components/custom/Workout/ExerciseCard.tsx +5 -1
  34. package/src/components/custom/Workout/ExerciseDetailPage.tsx +17 -4
  35. package/src/components/custom/Workout/IntensityBar.test.tsx +112 -60
  36. package/src/components/custom/Workout/IntensityBar.tsx +109 -58
  37. package/src/components/custom/Workout/PlaceholderStrip.tsx +5 -9
  38. package/src/components/custom/Workout/PrBadge.tsx +3 -3
  39. package/src/components/custom/Workout/PrHistoryModal.tsx +2 -2
  40. package/src/components/custom/Workout/README.md +50 -0
  41. package/src/components/custom/Workout/RestTimer.test.tsx +41 -10
  42. package/src/components/custom/Workout/RestTimer.tsx +48 -43
  43. package/src/components/custom/Workout/SetRow.tsx +10 -1
  44. package/src/components/custom/Workout/TempoDisplay.stories.tsx +69 -2
  45. package/src/components/custom/Workout/TempoDisplay.test.tsx +35 -0
  46. package/src/components/custom/Workout/TempoDisplay.tsx +104 -1
  47. package/src/components/custom/Workout/VelocityStrip.test.tsx +89 -2
  48. package/src/components/custom/Workout/VelocityStrip.tsx +203 -38
  49. package/src/components/custom/Workout/WeekRow.test.tsx +2 -2
  50. package/src/components/custom/Workout/WeightBadge.test.tsx +2 -2
  51. package/src/components/custom/Workout/WeightBadge.tsx +2 -2
  52. package/src/components/custom/Workout/icons.tsx +68 -0
  53. package/src/components/custom/Workout/index.ts +38 -47
  54. package/src/index.ts +3 -2
  55. package/src/pages.ts +61 -0
  56. package/src/test/stories-smoke.test.tsx +50 -0
  57. package/src/theme/barrel.ts +53 -0
  58. package/src/theme/index.ts +8 -43
  59. package/src/theme/native-theming-guard.test.ts +117 -0
  60. package/dist/bodymap-BhG55xHM.d.mts +0 -318
  61. package/dist/bodymap-BhG55xHM.d.ts +0 -318
  62. package/dist/chunk-2SISKTWM.mjs +0 -1027
  63. package/dist/chunk-2SISKTWM.mjs.map +0 -1
  64. package/dist/chunk-7XPB4NAO.mjs +0 -1013
  65. package/dist/chunk-7XPB4NAO.mjs.map +0 -1
  66. package/dist/chunk-SNVKL5WZ.mjs +0 -883
  67. package/dist/chunk-SNVKL5WZ.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/utils/cn.ts","../src/utils/useTheme.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":["View","sizeStyles","Text","BRAND_PRIMARY","Fragment"],"mappings":"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","file":"chunk-2SISKTWM.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","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'\nimport { resolveColor } from '../../../theme/resolve-color'\n\nconst BRAND_PRIMARY = '#FF7900'\nconst BRAND_PRIMARY_DARK = '#C45E00'\nconst BRAND_PRIMARY_LIGHT = '#FFB066'\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/**\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(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 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(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 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(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"]}