@titan-design/react-ui 0.11.0 → 0.12.1

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 (152) hide show
  1. package/dist/bodymap.js +173 -343
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +173 -343
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +27 -22
  6. package/dist/index.d.ts +27 -22
  7. package/dist/index.js +366 -561
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +360 -553
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +242 -407
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +242 -407
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +250 -1157
  16. package/dist/theme/index.d.ts +250 -1157
  17. package/dist/theme/index.js +234 -408
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +227 -399
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +141 -140
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +141 -140
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/dist/theme/tokens.d.mts +904 -0
  26. package/dist/theme/tokens.d.ts +904 -0
  27. package/dist/theme/tokens.js +856 -0
  28. package/dist/theme/tokens.js.map +1 -0
  29. package/dist/theme/tokens.mjs +833 -0
  30. package/dist/theme/tokens.mjs.map +1 -0
  31. package/package.json +7 -1
  32. package/src/arch/Architecture.stories.tsx +9 -9
  33. package/src/components/custom/DateTime/DateTime.stories.tsx +1 -1
  34. package/src/components/custom/Fatigue/DualGhostSpark.stories.tsx +3 -3
  35. package/src/components/custom/Fatigue/FatigueLights.stories.tsx +2 -2
  36. package/src/components/custom/Fatigue/GhostSpark.stories.tsx +3 -3
  37. package/src/components/custom/Fatigue/LiveFatigueCard.tsx +1 -1
  38. package/src/components/custom/Fatigue/LiveFatiguePanel.stories.tsx +2 -2
  39. package/src/components/custom/Fatigue/RomProgressionChart.stories.tsx +2 -2
  40. package/src/components/custom/Fatigue/SilverRedPalette.stories.tsx +4 -4
  41. package/src/components/custom/Fatigue/VelocityHero.stories.tsx +3 -3
  42. package/src/components/custom/Fatigue/VerdictHero.stories.tsx +2 -2
  43. package/src/components/custom/Fatigue/fatigue-tokens.ts +12 -12
  44. package/src/components/custom/Sidebar/Sidebar.tsx +4 -4
  45. package/src/components/custom/Table/Table.tsx +2 -2
  46. package/src/components/custom/Workout/ActiveWorkoutPage.tsx +3 -3
  47. package/src/components/custom/Workout/BaseBadge.test.tsx +6 -1
  48. package/src/components/custom/Workout/BaseBadge.tsx +1 -1
  49. package/src/components/custom/Workout/BodyMap.tsx +2 -2
  50. package/src/components/custom/Workout/BodyMapDetailPanel.tsx +2 -2
  51. package/src/components/custom/Workout/DeviationBar.test.tsx +2 -1
  52. package/src/components/custom/Workout/DeviationBar.tsx +3 -2
  53. package/src/components/custom/Workout/ExerciseCard.test.tsx +3 -3
  54. package/src/components/custom/Workout/ExerciseCard.tsx +2 -2
  55. package/src/components/custom/Workout/ExerciseDetailPage.tsx +4 -4
  56. package/src/components/custom/Workout/InputBar.tsx +2 -2
  57. package/src/components/custom/Workout/LiveAuraFrame.stories.tsx +1 -1
  58. package/src/components/custom/Workout/LiveAuraFrame.test.tsx +1 -1
  59. package/src/components/custom/Workout/LiveAuraFrame.tsx +3 -3
  60. package/src/components/custom/Workout/MesoCard.tsx +3 -1
  61. package/src/components/custom/Workout/MuscleGroupChip.tsx +4 -3
  62. package/src/components/custom/Workout/PrHistoryModal.tsx +2 -2
  63. package/src/components/custom/Workout/ProgramPlanningPage.tsx +1 -1
  64. package/src/components/custom/Workout/README.md +1 -1
  65. package/src/components/custom/Workout/ReadinessCheck.tsx +2 -2
  66. package/src/components/custom/Workout/RestTimer.tsx +2 -2
  67. package/src/components/custom/Workout/S3SetTypes.stories.tsx +3 -3
  68. package/src/components/custom/Workout/SessionHeader.stories.tsx +2 -2
  69. package/src/components/custom/Workout/SessionHeader.tsx +1 -1
  70. package/src/components/custom/Workout/SessionRail.stories.tsx +2 -2
  71. package/src/components/custom/Workout/SessionRail.tsx +13 -5
  72. package/src/components/custom/Workout/SetBar.tsx +3 -3
  73. package/src/components/custom/Workout/SetRow.test.tsx +6 -3
  74. package/src/components/custom/Workout/StatusDot.tsx +5 -4
  75. package/src/components/custom/Workout/StrengthTrendChart.tsx +1 -1
  76. package/src/components/custom/Workout/TrainingStatusPage.tsx +2 -2
  77. package/src/components/custom/Workout/VelocityStrip.test.tsx +5 -2
  78. package/src/components/custom/Workout/VelocityStrip.tsx +4 -4
  79. package/src/components/custom/Workout/VolumeLandmarkBar.tsx +3 -3
  80. package/src/components/custom/Workout/WeightBadge.test.tsx +6 -1
  81. package/src/components/custom/Workout/WeightBadge.tsx +2 -1
  82. package/src/components/custom/Workout/WorkoutCard.tsx +3 -1
  83. package/src/components/custom/Workout/WorkoutPill.tsx +5 -2
  84. package/src/components/custom/Workout/ZoneTrack.tsx +4 -4
  85. package/src/components/custom/Workout/setHeadingKit.tsx +14 -8
  86. package/src/components/custom/Workout/velocity-story-kit.tsx +2 -2
  87. package/src/components/custom/charts/SetBarChart.tsx +3 -3
  88. package/src/components/custom/stepper/Stepper.stories.tsx +1 -1
  89. package/src/components/custom/stepper/Stepper.tsx +3 -3
  90. package/src/components/shell/DeviceMenu.tsx +2 -2
  91. package/src/components/shell/README.md +1 -1
  92. package/src/components/shell/SessionRailSpecimen.stories.tsx +1 -1
  93. package/src/components/shell/SideNav.tsx +1 -1
  94. package/src/components/shell/TopBar.tsx +1 -1
  95. package/src/components/ui/autocomplete/Autocomplete.stories.tsx +1 -1
  96. package/src/components/ui/autocomplete/Autocomplete.tsx +1 -1
  97. package/src/components/ui/avatar/Avatar.tsx +2 -2
  98. package/src/components/ui/badge/Badge.tsx +2 -2
  99. package/src/components/ui/card/Card.tsx +3 -3
  100. package/src/components/ui/checkbox/Checkbox.tsx +1 -1
  101. package/src/components/ui/collapse/Collapse.tsx +1 -1
  102. package/src/components/ui/data-row/DataRow.stories.tsx +1 -1
  103. package/src/components/ui/drawer/Drawer.tsx +3 -3
  104. package/src/components/ui/form-field/FormField.tsx +1 -1
  105. package/src/components/ui/help-tip/HelpTip.tsx +1 -1
  106. package/src/components/ui/menu/Menu.tsx +2 -2
  107. package/src/components/ui/pill/Pill.tsx +2 -2
  108. package/src/components/ui/popover/Popover.stories.tsx +2 -2
  109. package/src/components/ui/popover/Popover.tsx +1 -1
  110. package/src/components/ui/progress/Progress.tsx +3 -3
  111. package/src/components/ui/radio/Radio.stories.tsx +1 -1
  112. package/src/components/ui/radio/Radio.tsx +4 -4
  113. package/src/components/ui/select/Select.tsx +3 -3
  114. package/src/components/ui/surface/Surface.stories.tsx +3 -3
  115. package/src/components/ui/surface/Surface.test.tsx +32 -19
  116. package/src/components/ui/surface/Surface.tsx +3 -3
  117. package/src/components/ui/surface/SurfaceContext.ts +19 -29
  118. package/src/components/ui/surface/surface.contract.test.ts +58 -45
  119. package/src/components/ui/switch/Switch.tsx +1 -1
  120. package/src/components/ui/tabs/Tabs.tsx +2 -2
  121. package/src/components/ui/toolbar-button/ToolbarButton.stories.tsx +5 -5
  122. package/src/components/ui/toolbar-button/ToolbarButton.test.tsx +1 -1
  123. package/src/components/ui/toolbar-button/ToolbarButton.tsx +36 -22
  124. package/src/stories/PresetShowcase.stories.tsx +21 -21
  125. package/src/theme/ColorPalettes.stories.tsx +41 -38
  126. package/src/theme/ColorPrimitives.stories.tsx +89 -41
  127. package/src/theme/Depth.stories.tsx +312 -0
  128. package/src/theme/DepthCalibration.stories.tsx +655 -0
  129. package/src/theme/ThemeProvider.tsx +1 -1
  130. package/src/theme/barrel.ts +7 -14
  131. package/src/theme/color-stories.coverage.test.ts +15 -20
  132. package/src/theme/color-story-kit.tsx +1 -1
  133. package/src/theme/color-utils.ts +197 -0
  134. package/src/theme/config.ts +0 -8
  135. package/src/theme/depth-calibration.test.tsx +97 -0
  136. package/src/theme/elevation.test.ts +62 -1
  137. package/src/theme/elevation.ts +34 -8
  138. package/src/theme/global.css +47 -53
  139. package/src/theme/grey-ramp.test.ts +166 -0
  140. package/src/theme/materials.test.ts +106 -0
  141. package/src/theme/materials.ts +211 -0
  142. package/src/theme/presets/audiobook.ts +4 -4
  143. package/src/theme/presets/types.ts +3 -3
  144. package/src/theme/semantic-contrast.test.ts +83 -0
  145. package/src/theme/token-export-guard.test.ts +104 -0
  146. package/src/theme/tokens/primitives.ts +63 -116
  147. package/src/theme/tokens/semantic.ts +130 -82
  148. package/src/utils/colors.ts +1 -1
  149. package/tailwind.config.js +2 -5
  150. package/src/theme/bar-paper.ts +0 -59
  151. package/src/theme/shadows.stories.tsx +0 -523
  152. package/src/theme/shadows.ts +0 -439
package/dist/index.d.mts CHANGED
@@ -2,8 +2,10 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React$1 from 'react';
3
3
  import React__default, { ReactNode } from 'react';
4
4
  import { ViewProps, PressableProps, View, TextInputProps, TextInput, ImageSourcePropType, ModalProps as ModalProps$1, TextProps } from 'react-native';
5
- import { ThemeMode, ElevationLevel, GlowIntensity } from './theme/index.mjs';
6
- export { CATEGORICAL_CVD_SAFE_MAX, CategoricalVariant, ComponentType, CssPropertyEntry, CssPropertyManifest, ElevationConfig, GradientStyle, ManifestValidationResult, PRESSED_ELEVATION_LEVEL, ShadowIntensity, ShadowSurface, ThemeConfig, ThemePreset, ThemePresetColors, ThemePresetFonts, ThemePresetRadii, ThemePresetShadows, ThemeProviderMode, ThemeProviderProps, VariantAxes, VariantOverride, applyThemePreset, audiobookPreset, backgroundFrameDark, bestTextColor, buttonSizes, categoricalPalette, componentElevationRanges, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, divergingScale, elevationSystem, getBaseSurfaceColor, getCategoricalColor, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, getPressedRecessShadow, getSemanticColors, getThemeCSSVars, getValidatedElevation, gluestackConfig, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, lightThemeCSSVars, lighten, linearGradient, neumorphicShadows, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, rgbToHex, rgbToHsv, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, surfaceGradient, surfaceRampDark, validateCssPropertyManifest } from './theme/index.mjs';
5
+ import { ThemeMode } from './theme/tokens.mjs';
6
+ export { CATEGORICAL_CVD_SAFE_MAX, CategoricalVariant, SURFACE_PLANE_STEPS, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort } from './theme/tokens.mjs';
7
+ import { ElevationLevel, GlowIntensity } from './theme/index.mjs';
8
+ export { ComponentType, CssPropertyEntry, CssPropertyManifest, ElevationConfig, FLOATING_ELEVATION_MIN, GradientStyle, ManifestValidationResult, PRESSED_ELEVATION_LEVEL, ShadowIntensity, ThemeConfig, ThemePreset, ThemePresetColors, ThemePresetFonts, ThemePresetRadii, ThemePresetShadows, ThemeProviderMode, ThemeProviderProps, VariantAxes, VariantOverride, applyThemePreset, audiobookPreset, barPaper, componentElevationRanges, darkThemeCSSVars, darken, defaultPreset, elevationSystem, getBaseSurfaceColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, getPressedRecessShadow, getThemeCSSVars, getValidatedElevation, gluestackConfig, grainForTone, grainOpacityForTone, hexToRgb, hsvToRgb, insetWell, isCssPropertyManifest, isDark, lightThemeCSSVars, lighten, linearGradient, paperSheet, resolveColor, rgbToHex, rgbToHsv, surfaceGradient, validateCssPropertyManifest } from './theme/index.mjs';
7
9
  import { S as SetStripSet, E as ExerciseIndicatorKind, a as SetRowProps } from './pages-CvsFqNtx.mjs';
8
10
  export { A as ActiveExerciseStatus, b as ActiveWorkoutExercise, c as ActiveWorkoutInput, d as ActiveWorkoutPageProps, e as ActiveWorkoutRest, f as ActiveWorkoutSuperset, C as CapacityBandChart, g as CapacityBandChartProps, h as CapacityBandDataPoint, i as CapacityBandProjection, D as DualVelocityStream, j as DualVelocityStrip, k as DualVelocityStripProps, l as ExerciseCard, m as ExerciseCardProps, n as ExerciseDetailEntry, o as ExerciseDetailHeader, p as ExerciseDetailPageProps, q as ExerciseDetailStats, r as ExerciseDetailTab, s as ExerciseIndicator, t as ExerciseIndicatorProps, u as ExerciseTrend, v as ExerciseVbt, w as ExerciseVbtSet, I as INDICATOR_PRECEDENCE, M as Meso, x as MesoCard, y as MesoCardProps, z as MesoProgressBar, B as MesoProgressBarProps, F as MesoStatus, G as MesoVolumeHeatmapEntry, P as PlanMeso, H as PlanWeek, J as PlanWorkout, K as ProgramBreadcrumb, L as ProgramNavLevel, N as ProgramPlanningPageProps, O as ProgramSelection, Q as SET_STRIP_VARIABLE_COLOR, R as SET_STRIP_ZONES, T as SetBar, U as SetBarProps, V as SetRow, W as SetRowState, X as SetRowUnit, Y as StrengthTrendChart, Z as StrengthTrendChartMesoBoundary, _ as StrengthTrendChartProps, $ as StrengthTrendDataPoint, a0 as VbtSummary, a1 as VelocitySet, a2 as VelocityStrip, a3 as VelocityStripProps, a4 as VelocityZoneBandProp, a5 as WeekRow, a6 as WeekRowProps, a7 as WeekRowWorkout, a8 as WorkoutCard, a9 as WorkoutCardProps, aa as WorkoutDot, ab as WorkoutDotStatus, ac as WorkoutGroup, ad as WorkoutMuscleGroup, ae as WorkoutMuscleVolumeStatus, af as WorkoutPill, ag as WorkoutPillProps, ah as WorkoutPillStatus, ai as WorkoutProgress, aj as WorkoutStatus, ak as calculateMeanVelocity, al as calculateVelocityLoss, am as getVelocityZoneColor, an as getVelocityZoneName, ao as resolveIndicator, ap as velocityZoneColor } from './pages-CvsFqNtx.mjs';
9
11
  export { M as MesoStatusBadge, a as MesoStatusBadgeVariant, b as MesoStatusCard, c as MesoStatusCardProps, d as MesoStatusCoaching, e as MesoStatusGauge, f as MesoStatusMetric, g as MesoStatusNextTarget } from './MesoStatusCard-CQk71hSi.mjs';
@@ -1295,7 +1297,7 @@ interface SelectProps<T = string> extends ViewProps {
1295
1297
  */
1296
1298
  declare function Select<T extends string = string>({ value, values, onChange, onChangeMulti, isMulti, placeholder, isDisabled, isInvalid, options, variant, className, ...props }: SelectProps<T>): react_jsx_runtime.JSX.Element;
1297
1299
 
1298
- type ToolbarButtonVariant = 'default' | 'neumorphic';
1300
+ type ToolbarButtonVariant = 'default' | 'raised';
1299
1301
  type ToolbarButtonSize = 'sm' | 'md' | 'lg';
1300
1302
  interface ToolbarButtonContextType {
1301
1303
  isOpen: boolean;
@@ -2023,15 +2025,18 @@ declare function IconBox({ icon: Icon, color, size, className, ...props }: IconB
2023
2025
  * no new hexes. Darkest → lightest:
2024
2026
  * inset (#13100D) < background (#1C1916) < base (#252321) < elevated (#2A2827) < raised (#2D2C2B) < overlay (#302F2E)
2025
2027
  *
2026
- * `inset` is the ramp's deepest pit — the sub-shell well. It's the floor a
2027
- * `<Surface pressed>` clamps at (see {@link pressedLevel}); it has no shipped
2028
- * semantic token yet, so {@link surfaceBackground} resolves it from the
2029
- * `surface-inset` token when present, else the `surfaceRampDark.inset` primitive.
2028
+ * `frame` is the bezel the ramp sits inside — the top bar / side nav chrome —
2029
+ * and the floor a `<Surface pressed>` clamps at (see {@link pressedLevel}).
2030
+ *
2031
+ * It replaced a separate `inset` level in TD-07.14. That level was RETIRED, not
2032
+ * renamed: at ΔE 1.10 from the frame it was an imperceptible duplicate, which is
2033
+ * exactly why pressed (surface − 1) kept collapsing into it.
2030
2034
  */
2031
- type SurfaceLevel = 'inset' | 'background' | 'base' | 'elevated' | 'raised' | 'overlay';
2035
+ type SurfaceLevel = 'frame' | 'background' | 'base' | 'elevated' | 'raised' | 'overlay';
2032
2036
  /** On-surface neutral text roles, resolved for the current surface + theme. */
2033
2037
  type OnSurfaceRole = 'primary' | 'secondary' | 'tertiary';
2034
2038
  declare const SURFACE_LEVEL_TOKEN: {
2039
+ readonly frame: "background-frame";
2035
2040
  readonly background: "background-base";
2036
2041
  readonly base: "surface-base";
2037
2042
  readonly elevated: "surface-elevated";
@@ -2063,9 +2068,9 @@ declare function surfaceBackground(level: SurfaceLevel, mode: ThemeMode): string
2063
2068
  /**
2064
2069
  * The level a `<Surface pressed>` resolves to: its parent's level stepped one
2065
2070
  * index DOWN the ramp — the symmetric twin of a raised surface stepping up —
2066
- * clamped at the `inset` floor so a pressed surface never underflows the pit.
2071
+ * clamped at the `frame` floor so a pressed surface never underflows the bezel.
2067
2072
  * overlay→raised, raised→elevated, elevated→base, base→background,
2068
- * background→inset, insetinset (clamped).
2073
+ * background→frame, frameframe (clamped).
2069
2074
  * Pressed exposes ONE level of depth only (no pressed-2).
2070
2075
  */
2071
2076
  declare function pressedLevel(parent: SurfaceLevel): SurfaceLevel;
@@ -2078,7 +2083,7 @@ interface SurfaceProps extends ViewProps {
2078
2083
  */
2079
2084
  elevation?: ElevationLevel;
2080
2085
  /**
2081
- * Named charcoal plane (shell / rail / stage). Sets the background directly
2086
+ * Named grey plane (shell / rail / stage). Sets the background directly
2082
2087
  * from a semantic surface token — reaching the darker nav/page planes the
2083
2088
  * lighten model can't — and drops the default rounding + auto shadow so the
2084
2089
  * plane reads full-bleed. Composable with `elevation`'s glow.
@@ -2110,7 +2115,7 @@ interface SurfaceProps extends ViewProps {
2110
2115
  * A container that OWNS its background and establishes an on-surface colour
2111
2116
  * context. Two grounded ways to pick the background:
2112
2117
  * - `elevation` (numeric): the raised-card model — lighten-from-base + shadow.
2113
- * - `level` (named): a flat charcoal plane straight from a semantic token,
2118
+ * - `level` (named): a flat grey plane straight from a semantic token,
2114
2119
  * for the shell / rail / stage backgrounds.
2115
2120
  * Either way, descendants read the surface via {@link useOnSurfaceColor} /
2116
2121
  * {@link useSurfaceMode} rather than hard-coding `getSemanticColors('dark')`.
@@ -3295,7 +3300,7 @@ interface SessionHeaderProps extends ViewProps {
3295
3300
  * done, coloured green/amber against the elapsed-vs-budget pace, with a live marker),
3296
3301
  * a mono `n/total sets` label and a ⏱ elapsed readout. Upcoming (`next` set), the tiles
3297
3302
  * become Date/Time/Until, the bar is the empty plan shape, and the readout shows the
3298
- * planned duration. Rendered on the raised charcoal plane; presentational. Composes
3303
+ * planned duration. Rendered on the raised grey plane; presentational. Composes
3299
3304
  * {@link MetricTiles} / {@link ScheduleTiles} + {@link SegmentedProgressBar} +
3300
3305
  * {@link TimerReadout}.
3301
3306
  */
@@ -3548,7 +3553,7 @@ interface ZoneTrackProps extends ViewProps {
3548
3553
  trackHeight?: number;
3549
3554
  /** How far a needle marker overhangs the track top + bottom, in px. Overrides the `size` default (6 default / 9 wall). */
3550
3555
  needleOverhang?: number;
3551
- /** Muted colour of the track behind / beyond the fill. Default a charcoal step. */
3556
+ /** Muted colour of the track behind / beyond the fill. Default a grey step. */
3552
3557
  trackColor?: string;
3553
3558
  className?: string;
3554
3559
  }
@@ -3676,7 +3681,7 @@ interface LiveAuraFrameProps extends ViewProps {
3676
3681
  declare function liveAuraColor(category: LiveAuraCategory): string | null;
3677
3682
  /**
3678
3683
  * Full-surface color-flood frame tied to a coaching category. Wraps `children`
3679
- * on a charcoal base and layers a radial wash (amber at threshold, red at stop)
3684
+ * on a grey base and layers a radial wash (amber at threshold, red at stop)
3680
3685
  * as a decorative, pointer-transparent overlay. The wash uses a solid
3681
3686
  * `backgroundColor` fallback (native) plus a web-only `backgroundImage` radial
3682
3687
  * gradient; both derive from the same semantic token via `alpha()`.
@@ -4018,9 +4023,9 @@ declare const STATE_LABEL: Record<FatigueVerdictState, string>;
4018
4023
  * language: eccentric magenta, concentric cyan, hold and idle in the grey family.
4019
4024
  *
4020
4025
  * The idle grey has to read as BAND MATERIAL (a pause the lifter held), not as a
4021
- * hole in the strip: at charcoal[300] it sat inside the surface-ramp's own value
4026
+ * hole in the strip: at grey[300] it sat inside the surface-ramp's own value
4022
4027
  * range (`surface-raised` #31302F) so a short pause between ECC and CON read as a
4023
- * gap. charcoal[200] clears every content plane while staying quieter than the two
4028
+ * gap. grey[200] clears every content plane while staying quieter than the two
4024
4029
  * saturated phase tones, so the band reads contiguous and the phases still lead.
4025
4030
  *
4026
4031
  * `hold` stays GREY rather than taking a hue of its own. It was briefly amber, which
@@ -4032,15 +4037,15 @@ declare const STATE_LABEL: Record<FatigueVerdictState, string>;
4032
4037
  *
4033
4038
  * Hold and idle are separated by VALUE rather than hue, plus the `HOLD` label and the
4034
4039
  * fact that a hold PACES (it has a prescribed duration) while idle never fills:
4035
- * unfilled hold charcoal[300] — darker than idle
4036
- * idle charcoal[200]
4037
- * filled hold charcoal[100] — brighter than idle
4040
+ * unfilled hold grey[300] — darker than idle
4041
+ * idle grey[200]
4042
+ * filled hold grey[100] — brighter than idle
4038
4043
  * so a hold reads apart from dead time at any fill level, including the narrow runs
4039
4044
  * where the label drops out.
4040
4045
  */
4041
4046
  declare const PHASE_AXIS_COLOR: Record<SamplePhase, string>;
4042
4047
  /** On-track / at-or-above-working. */
4043
- declare const SILVER: "#D1D5DB";
4048
+ declare const SILVER: "#D4D1CE";
4044
4049
  declare const RED_LIGHT: "#F77175";
4045
4050
  declare const RED_MID: "#D14343";
4046
4051
  declare const RED_DEEP: "#7E1002";
@@ -4049,7 +4054,7 @@ declare const GRIND_THRESHOLD = 0.35;
4049
4054
  /** A quiet grey the controlled line dims toward as it drifts (never a colour): a dimmed
4050
4055
  * cool grey in the SAME neutral family as SILVER, so a fully-drifted line reads dim-silver
4051
4056
  * rather than sinking toward black. Shared with the ROM chart. */
4052
- declare const DRIFT_GREY: "#4B5563";
4057
+ declare const DRIFT_GREY: "#5A5958";
4053
4058
  /**
4054
4059
  * The ghost-spark current-line tint from the two control-aware signals — silver/red.
4055
4060
  *
package/dist/index.d.ts CHANGED
@@ -2,8 +2,10 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React$1 from 'react';
3
3
  import React__default, { ReactNode } from 'react';
4
4
  import { ViewProps, PressableProps, View, TextInputProps, TextInput, ImageSourcePropType, ModalProps as ModalProps$1, TextProps } from 'react-native';
5
- import { ThemeMode, ElevationLevel, GlowIntensity } from './theme/index.js';
6
- export { CATEGORICAL_CVD_SAFE_MAX, CategoricalVariant, ComponentType, CssPropertyEntry, CssPropertyManifest, ElevationConfig, GradientStyle, ManifestValidationResult, PRESSED_ELEVATION_LEVEL, ShadowIntensity, ShadowSurface, ThemeConfig, ThemePreset, ThemePresetColors, ThemePresetFonts, ThemePresetRadii, ThemePresetShadows, ThemeProviderMode, ThemeProviderProps, VariantAxes, VariantOverride, applyThemePreset, audiobookPreset, backgroundFrameDark, bestTextColor, buttonSizes, categoricalPalette, componentElevationRanges, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultPreset, discreteRainbow, divergingScale, elevationSystem, getBaseSurfaceColor, getCategoricalColor, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, getPressedRecessShadow, getSemanticColors, getThemeCSSVars, getValidatedElevation, gluestackConfig, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, lightThemeCSSVars, lighten, linearGradient, neumorphicShadows, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, rgbToHex, rgbToHsv, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, surfaceGradient, surfaceRampDark, validateCssPropertyManifest } from './theme/index.js';
5
+ import { ThemeMode } from './theme/tokens.js';
6
+ export { CATEGORICAL_CVD_SAFE_MAX, CategoricalVariant, SURFACE_PLANE_STEPS, bestTextColor, buttonSizes, categoricalPalette, discreteRainbow, divergingScale, getCategoricalColor, getDiscreteRainbowColor, getSemanticColors, greyRamp, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveSpacing, primitiveTypography, primitiveZIndex, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort } from './theme/tokens.js';
7
+ import { ElevationLevel, GlowIntensity } from './theme/index.js';
8
+ export { ComponentType, CssPropertyEntry, CssPropertyManifest, ElevationConfig, FLOATING_ELEVATION_MIN, GradientStyle, ManifestValidationResult, PRESSED_ELEVATION_LEVEL, ShadowIntensity, ThemeConfig, ThemePreset, ThemePresetColors, ThemePresetFonts, ThemePresetRadii, ThemePresetShadows, ThemeProviderMode, ThemeProviderProps, VariantAxes, VariantOverride, applyThemePreset, audiobookPreset, barPaper, componentElevationRanges, darkThemeCSSVars, darken, defaultPreset, elevationSystem, getBaseSurfaceColor, getElevationConfig, getElevationShadow, getElevationSurface, getGlowShadow, getHoverColors, getPressedRecessShadow, getThemeCSSVars, getValidatedElevation, gluestackConfig, grainForTone, grainOpacityForTone, hexToRgb, hsvToRgb, insetWell, isCssPropertyManifest, isDark, lightThemeCSSVars, lighten, linearGradient, paperSheet, resolveColor, rgbToHex, rgbToHsv, surfaceGradient, validateCssPropertyManifest } from './theme/index.js';
7
9
  import { S as SetStripSet, E as ExerciseIndicatorKind, a as SetRowProps } from './pages-B1hqnGIC.js';
8
10
  export { A as ActiveExerciseStatus, b as ActiveWorkoutExercise, c as ActiveWorkoutInput, d as ActiveWorkoutPageProps, e as ActiveWorkoutRest, f as ActiveWorkoutSuperset, C as CapacityBandChart, g as CapacityBandChartProps, h as CapacityBandDataPoint, i as CapacityBandProjection, D as DualVelocityStream, j as DualVelocityStrip, k as DualVelocityStripProps, l as ExerciseCard, m as ExerciseCardProps, n as ExerciseDetailEntry, o as ExerciseDetailHeader, p as ExerciseDetailPageProps, q as ExerciseDetailStats, r as ExerciseDetailTab, s as ExerciseIndicator, t as ExerciseIndicatorProps, u as ExerciseTrend, v as ExerciseVbt, w as ExerciseVbtSet, I as INDICATOR_PRECEDENCE, M as Meso, x as MesoCard, y as MesoCardProps, z as MesoProgressBar, B as MesoProgressBarProps, F as MesoStatus, G as MesoVolumeHeatmapEntry, P as PlanMeso, H as PlanWeek, J as PlanWorkout, K as ProgramBreadcrumb, L as ProgramNavLevel, N as ProgramPlanningPageProps, O as ProgramSelection, Q as SET_STRIP_VARIABLE_COLOR, R as SET_STRIP_ZONES, T as SetBar, U as SetBarProps, V as SetRow, W as SetRowState, X as SetRowUnit, Y as StrengthTrendChart, Z as StrengthTrendChartMesoBoundary, _ as StrengthTrendChartProps, $ as StrengthTrendDataPoint, a0 as VbtSummary, a1 as VelocitySet, a2 as VelocityStrip, a3 as VelocityStripProps, a4 as VelocityZoneBandProp, a5 as WeekRow, a6 as WeekRowProps, a7 as WeekRowWorkout, a8 as WorkoutCard, a9 as WorkoutCardProps, aa as WorkoutDot, ab as WorkoutDotStatus, ac as WorkoutGroup, ad as WorkoutMuscleGroup, ae as WorkoutMuscleVolumeStatus, af as WorkoutPill, ag as WorkoutPillProps, ah as WorkoutPillStatus, ai as WorkoutProgress, aj as WorkoutStatus, ak as calculateMeanVelocity, al as calculateVelocityLoss, am as getVelocityZoneColor, an as getVelocityZoneName, ao as resolveIndicator, ap as velocityZoneColor } from './pages-B1hqnGIC.js';
9
11
  export { M as MesoStatusBadge, a as MesoStatusBadgeVariant, b as MesoStatusCard, c as MesoStatusCardProps, d as MesoStatusCoaching, e as MesoStatusGauge, f as MesoStatusMetric, g as MesoStatusNextTarget } from './MesoStatusCard-CQk71hSi.js';
@@ -1295,7 +1297,7 @@ interface SelectProps<T = string> extends ViewProps {
1295
1297
  */
1296
1298
  declare function Select<T extends string = string>({ value, values, onChange, onChangeMulti, isMulti, placeholder, isDisabled, isInvalid, options, variant, className, ...props }: SelectProps<T>): react_jsx_runtime.JSX.Element;
1297
1299
 
1298
- type ToolbarButtonVariant = 'default' | 'neumorphic';
1300
+ type ToolbarButtonVariant = 'default' | 'raised';
1299
1301
  type ToolbarButtonSize = 'sm' | 'md' | 'lg';
1300
1302
  interface ToolbarButtonContextType {
1301
1303
  isOpen: boolean;
@@ -2023,15 +2025,18 @@ declare function IconBox({ icon: Icon, color, size, className, ...props }: IconB
2023
2025
  * no new hexes. Darkest → lightest:
2024
2026
  * inset (#13100D) < background (#1C1916) < base (#252321) < elevated (#2A2827) < raised (#2D2C2B) < overlay (#302F2E)
2025
2027
  *
2026
- * `inset` is the ramp's deepest pit — the sub-shell well. It's the floor a
2027
- * `<Surface pressed>` clamps at (see {@link pressedLevel}); it has no shipped
2028
- * semantic token yet, so {@link surfaceBackground} resolves it from the
2029
- * `surface-inset` token when present, else the `surfaceRampDark.inset` primitive.
2028
+ * `frame` is the bezel the ramp sits inside — the top bar / side nav chrome —
2029
+ * and the floor a `<Surface pressed>` clamps at (see {@link pressedLevel}).
2030
+ *
2031
+ * It replaced a separate `inset` level in TD-07.14. That level was RETIRED, not
2032
+ * renamed: at ΔE 1.10 from the frame it was an imperceptible duplicate, which is
2033
+ * exactly why pressed (surface − 1) kept collapsing into it.
2030
2034
  */
2031
- type SurfaceLevel = 'inset' | 'background' | 'base' | 'elevated' | 'raised' | 'overlay';
2035
+ type SurfaceLevel = 'frame' | 'background' | 'base' | 'elevated' | 'raised' | 'overlay';
2032
2036
  /** On-surface neutral text roles, resolved for the current surface + theme. */
2033
2037
  type OnSurfaceRole = 'primary' | 'secondary' | 'tertiary';
2034
2038
  declare const SURFACE_LEVEL_TOKEN: {
2039
+ readonly frame: "background-frame";
2035
2040
  readonly background: "background-base";
2036
2041
  readonly base: "surface-base";
2037
2042
  readonly elevated: "surface-elevated";
@@ -2063,9 +2068,9 @@ declare function surfaceBackground(level: SurfaceLevel, mode: ThemeMode): string
2063
2068
  /**
2064
2069
  * The level a `<Surface pressed>` resolves to: its parent's level stepped one
2065
2070
  * index DOWN the ramp — the symmetric twin of a raised surface stepping up —
2066
- * clamped at the `inset` floor so a pressed surface never underflows the pit.
2071
+ * clamped at the `frame` floor so a pressed surface never underflows the bezel.
2067
2072
  * overlay→raised, raised→elevated, elevated→base, base→background,
2068
- * background→inset, insetinset (clamped).
2073
+ * background→frame, frameframe (clamped).
2069
2074
  * Pressed exposes ONE level of depth only (no pressed-2).
2070
2075
  */
2071
2076
  declare function pressedLevel(parent: SurfaceLevel): SurfaceLevel;
@@ -2078,7 +2083,7 @@ interface SurfaceProps extends ViewProps {
2078
2083
  */
2079
2084
  elevation?: ElevationLevel;
2080
2085
  /**
2081
- * Named charcoal plane (shell / rail / stage). Sets the background directly
2086
+ * Named grey plane (shell / rail / stage). Sets the background directly
2082
2087
  * from a semantic surface token — reaching the darker nav/page planes the
2083
2088
  * lighten model can't — and drops the default rounding + auto shadow so the
2084
2089
  * plane reads full-bleed. Composable with `elevation`'s glow.
@@ -2110,7 +2115,7 @@ interface SurfaceProps extends ViewProps {
2110
2115
  * A container that OWNS its background and establishes an on-surface colour
2111
2116
  * context. Two grounded ways to pick the background:
2112
2117
  * - `elevation` (numeric): the raised-card model — lighten-from-base + shadow.
2113
- * - `level` (named): a flat charcoal plane straight from a semantic token,
2118
+ * - `level` (named): a flat grey plane straight from a semantic token,
2114
2119
  * for the shell / rail / stage backgrounds.
2115
2120
  * Either way, descendants read the surface via {@link useOnSurfaceColor} /
2116
2121
  * {@link useSurfaceMode} rather than hard-coding `getSemanticColors('dark')`.
@@ -3295,7 +3300,7 @@ interface SessionHeaderProps extends ViewProps {
3295
3300
  * done, coloured green/amber against the elapsed-vs-budget pace, with a live marker),
3296
3301
  * a mono `n/total sets` label and a ⏱ elapsed readout. Upcoming (`next` set), the tiles
3297
3302
  * become Date/Time/Until, the bar is the empty plan shape, and the readout shows the
3298
- * planned duration. Rendered on the raised charcoal plane; presentational. Composes
3303
+ * planned duration. Rendered on the raised grey plane; presentational. Composes
3299
3304
  * {@link MetricTiles} / {@link ScheduleTiles} + {@link SegmentedProgressBar} +
3300
3305
  * {@link TimerReadout}.
3301
3306
  */
@@ -3548,7 +3553,7 @@ interface ZoneTrackProps extends ViewProps {
3548
3553
  trackHeight?: number;
3549
3554
  /** How far a needle marker overhangs the track top + bottom, in px. Overrides the `size` default (6 default / 9 wall). */
3550
3555
  needleOverhang?: number;
3551
- /** Muted colour of the track behind / beyond the fill. Default a charcoal step. */
3556
+ /** Muted colour of the track behind / beyond the fill. Default a grey step. */
3552
3557
  trackColor?: string;
3553
3558
  className?: string;
3554
3559
  }
@@ -3676,7 +3681,7 @@ interface LiveAuraFrameProps extends ViewProps {
3676
3681
  declare function liveAuraColor(category: LiveAuraCategory): string | null;
3677
3682
  /**
3678
3683
  * Full-surface color-flood frame tied to a coaching category. Wraps `children`
3679
- * on a charcoal base and layers a radial wash (amber at threshold, red at stop)
3684
+ * on a grey base and layers a radial wash (amber at threshold, red at stop)
3680
3685
  * as a decorative, pointer-transparent overlay. The wash uses a solid
3681
3686
  * `backgroundColor` fallback (native) plus a web-only `backgroundImage` radial
3682
3687
  * gradient; both derive from the same semantic token via `alpha()`.
@@ -4018,9 +4023,9 @@ declare const STATE_LABEL: Record<FatigueVerdictState, string>;
4018
4023
  * language: eccentric magenta, concentric cyan, hold and idle in the grey family.
4019
4024
  *
4020
4025
  * The idle grey has to read as BAND MATERIAL (a pause the lifter held), not as a
4021
- * hole in the strip: at charcoal[300] it sat inside the surface-ramp's own value
4026
+ * hole in the strip: at grey[300] it sat inside the surface-ramp's own value
4022
4027
  * range (`surface-raised` #31302F) so a short pause between ECC and CON read as a
4023
- * gap. charcoal[200] clears every content plane while staying quieter than the two
4028
+ * gap. grey[200] clears every content plane while staying quieter than the two
4024
4029
  * saturated phase tones, so the band reads contiguous and the phases still lead.
4025
4030
  *
4026
4031
  * `hold` stays GREY rather than taking a hue of its own. It was briefly amber, which
@@ -4032,15 +4037,15 @@ declare const STATE_LABEL: Record<FatigueVerdictState, string>;
4032
4037
  *
4033
4038
  * Hold and idle are separated by VALUE rather than hue, plus the `HOLD` label and the
4034
4039
  * fact that a hold PACES (it has a prescribed duration) while idle never fills:
4035
- * unfilled hold charcoal[300] — darker than idle
4036
- * idle charcoal[200]
4037
- * filled hold charcoal[100] — brighter than idle
4040
+ * unfilled hold grey[300] — darker than idle
4041
+ * idle grey[200]
4042
+ * filled hold grey[100] — brighter than idle
4038
4043
  * so a hold reads apart from dead time at any fill level, including the narrow runs
4039
4044
  * where the label drops out.
4040
4045
  */
4041
4046
  declare const PHASE_AXIS_COLOR: Record<SamplePhase, string>;
4042
4047
  /** On-track / at-or-above-working. */
4043
- declare const SILVER: "#D1D5DB";
4048
+ declare const SILVER: "#D4D1CE";
4044
4049
  declare const RED_LIGHT: "#F77175";
4045
4050
  declare const RED_MID: "#D14343";
4046
4051
  declare const RED_DEEP: "#7E1002";
@@ -4049,7 +4054,7 @@ declare const GRIND_THRESHOLD = 0.35;
4049
4054
  /** A quiet grey the controlled line dims toward as it drifts (never a colour): a dimmed
4050
4055
  * cool grey in the SAME neutral family as SILVER, so a fully-drifted line reads dim-silver
4051
4056
  * rather than sinking toward black. Shared with the ROM chart. */
4052
- declare const DRIFT_GREY: "#4B5563";
4057
+ declare const DRIFT_GREY: "#5A5958";
4053
4058
  /**
4054
4059
  * The ghost-spark current-line tint from the two control-aware signals — silver/red.
4055
4060
  *