@titan-design/react-ui 0.9.2 → 0.10.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 (53) hide show
  1. package/dist/bodymap.js +78 -24
  2. package/dist/bodymap.js.map +1 -1
  3. package/dist/bodymap.mjs +78 -24
  4. package/dist/bodymap.mjs.map +1 -1
  5. package/dist/index.d.mts +215 -123
  6. package/dist/index.d.ts +215 -123
  7. package/dist/index.js +408 -259
  8. package/dist/index.js.map +1 -1
  9. package/dist/index.mjs +258 -121
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/pages.js +214 -157
  12. package/dist/pages.js.map +1 -1
  13. package/dist/pages.mjs +214 -157
  14. package/dist/pages.mjs.map +1 -1
  15. package/dist/theme/index.d.mts +895 -795
  16. package/dist/theme/index.d.ts +895 -795
  17. package/dist/theme/index.js +101 -20
  18. package/dist/theme/index.js.map +1 -1
  19. package/dist/theme/index.mjs +99 -22
  20. package/dist/theme/index.mjs.map +1 -1
  21. package/dist/theme/tokens-css.js +88 -24
  22. package/dist/theme/tokens-css.js.map +1 -1
  23. package/dist/theme/tokens-css.mjs +88 -24
  24. package/dist/theme/tokens-css.mjs.map +1 -1
  25. package/package.json +1 -1
  26. package/src/components/custom/Workout/BaseBadge.tsx +5 -5
  27. package/src/components/custom/Workout/RowInventory.stories.tsx +5 -2
  28. package/src/components/custom/Workout/S3FullRail.stories.tsx +13 -1
  29. package/src/components/custom/Workout/SessionHeader.tsx +11 -13
  30. package/src/components/custom/Workout/SessionRail.stories.tsx +4 -1
  31. package/src/components/custom/Workout/SessionRail.tsx +16 -14
  32. package/src/components/custom/Workout/SupersetWrapper.stories.tsx +16 -25
  33. package/src/components/custom/Workout/SupersetWrapper.tsx +1 -1
  34. package/src/components/custom/Workout/TempoDisplay.tsx +3 -7
  35. package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +4 -1
  36. package/src/components/custom/Workout/WorkoutPill.tsx +2 -2
  37. package/src/components/shell/DashboardShell.tsx +6 -3
  38. package/src/components/ui/surface/Surface.stories.tsx +244 -1
  39. package/src/components/ui/surface/Surface.test.tsx +244 -1
  40. package/src/components/ui/surface/Surface.tsx +98 -20
  41. package/src/components/ui/surface/SurfaceContext.ts +126 -0
  42. package/src/components/ui/surface/index.ts +13 -0
  43. package/src/components/ui/surface/surface.contract.test.ts +283 -0
  44. package/src/test/nativewind-stub.ts +13 -0
  45. package/src/theme/ColorSystem.stories.tsx +232 -47
  46. package/src/theme/ThemeProvider.test.tsx +24 -0
  47. package/src/theme/ThemeProvider.tsx +23 -6
  48. package/src/theme/config.ts +12 -0
  49. package/src/theme/elevation.ts +90 -67
  50. package/src/theme/global.css +35 -9
  51. package/src/theme/tokens/primitives.ts +40 -0
  52. package/src/theme/tokens/semantic.ts +63 -14
  53. package/tailwind.config.js +8 -0
package/dist/index.mjs CHANGED
@@ -2,7 +2,7 @@ import { jsx as jsx$1, jsxs as jsxs$1, Fragment } from 'react/jsx-runtime';
2
2
  import { Pressable, ActivityIndicator, Text, View, TextInput, Platform, StyleSheet, Easing, Image, Modal as Modal$1, ScrollView, Animated } from 'react-native';
3
3
  import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
5
- import React24, { forwardRef, useState, createContext, useMemo, useContext, useRef, useEffect, useCallback, useSyncExternalStore, Fragment as Fragment$1 } from 'react';
5
+ import React25, { forwardRef, useState, createContext, useContext, useMemo, useRef, useEffect, useCallback, useSyncExternalStore, Fragment as Fragment$1 } from 'react';
6
6
 
7
7
  var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
8
8
  get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
@@ -333,6 +333,21 @@ var primitiveColors = {
333
333
  black: "#000000",
334
334
  transparent: "transparent"
335
335
  };
336
+ var surfaceRampDark = {
337
+ inset: "#13100D",
338
+ // L*4.5 — sub-shell well / pressed
339
+ background: "#1C1916",
340
+ // L*9 — shell / frame
341
+ base: "#252321",
342
+ // L*13.5 — main content plane
343
+ elevated: "#2C2A28",
344
+ // L*17 — nav / rail
345
+ raised: "#31302F",
346
+ // L*20 — cards
347
+ overlay: "#373635"
348
+ // L*22.5 — hero / popover
349
+ };
350
+ var backgroundFrameDark = "#100D0A";
336
351
  var primitiveRamps = {
337
352
  red: {
338
353
  50: "#FFF4F4",
@@ -800,10 +815,19 @@ var semanticColorsLight = {
800
815
  "surface-overlay": primitiveColors.white,
801
816
  "surface-input": primitiveColors.neutral[50],
802
817
  // Input field background (filled variant)
818
+ // Deepest pressed pit (TD-surface-tokens, S-3) — light-mode counterpart of
819
+ // the dark ramp's `inset` plane; a placeholder pairing, not part of the
820
+ // dark-ramp investigation (surface.contract.test.ts is dark-mode only).
821
+ "surface-inset": primitiveColors.neutral[300],
803
822
  // Background colors (background-*)
804
823
  "background-base": "#EBEBEB",
805
824
  "background-default": primitiveColors.white,
806
825
  "background-subtle": primitiveColors.neutral[50],
826
+ // Frame/bezel chrome (TD-surface-tokens, S-3) — top bar + side nav shell,
827
+ // one step below `background-base` (darker still than `surface-inset`
828
+ // above, mirroring the dark-mode ordering). Placeholder pairing for light
829
+ // mode (see dark-mode note on `surface-inset` above).
830
+ "background-frame": primitiveColors.neutral[400],
807
831
  // Border colors (border-*)
808
832
  "border-default": "#E8E9EB",
809
833
  "border-subtle": primitiveColors.neutral[100],
@@ -819,6 +843,11 @@ var semanticColorsLight = {
819
843
  // Input field border on focus
820
844
  "border-input-error": primitiveColors.red[600],
821
845
  // Input field border on error
846
+ // Alpha hairline separators (surface-independent — composite toward black on
847
+ // light surfaces, mirroring the dark-mode white-alpha family). See §4/S-2.
848
+ "hairline-subtle": "rgba(0, 0, 0, 0.06)",
849
+ "hairline-default": "rgba(0, 0, 0, 0.09)",
850
+ "hairline-strong": "rgba(0, 0, 0, 0.14)",
822
851
  // Interactive states (interactive-*)
823
852
  "interactive-hover": "rgba(55, 65, 81, 0.04)",
824
853
  "interactive-focus": "rgba(55, 65, 81, 0.12)",
@@ -911,25 +940,46 @@ var semanticColorsDark = {
911
940
  "text-inverse": primitiveColors.neutral[900],
912
941
  "text-link": "#828DF8",
913
942
  "text-link-hover": primitiveColors.blue[400],
914
- // Surface colors - dark backgrounds
915
- "surface-base": primitiveColors.charcoal[700],
916
- // main surface
917
- "surface-elevated": primitiveColors.charcoal[600],
918
- // elevated surface
919
- "surface-raised": primitiveColors.charcoal[500],
920
- // raised surface
921
- "surface-overlay": primitiveColors.charcoal[600],
922
- // overlay surface
923
- "surface-input": primitiveColors.charcoal[600],
924
- // input surface
925
- // Background colors
926
- "background-base": primitiveColors.charcoal[900],
927
- // darkest charcoal
928
- "background-default": primitiveColors.charcoal[700],
929
- // main background
930
- "background-subtle": primitiveColors.charcoal[500],
931
- // subtle background
932
- // Border colors
943
+ // Surface colors - dark backgrounds — warm-tapered DERIVED ramp (TD-surface-tokens,
944
+ // S-1, re-spaced S-3). Shipped verbatim from `deriveSurfaceRamp()` — see
945
+ // `surfaceRampDark` in primitives.ts for the full derivation note. `surface-overlay`
946
+ // and `surface-elevated` are distinct (were both #191919 pre-S-1); `surface-input`
947
+ // tracks one plane above `surface-base`, same relative position as before the remap.
948
+ // `background-base` backs `Surface level="background"` (SurfaceContext.SURFACE_LEVEL_TOKEN),
949
+ // so it takes the ramp's `background` (shell/frame) role, NOT `inset`. The ramp's
950
+ // deepest `inset` plane is now promoted to `surface-inset` below (S-3) — still no
951
+ // `SurfaceLevel` member for it (follow-up, alongside the elevation.ts -1/-2 pressed
952
+ // levels — parallel workstream, not this branch).
953
+ "surface-base": surfaceRampDark.base,
954
+ // main surface (#252321, L*13.5)
955
+ "surface-elevated": surfaceRampDark.elevated,
956
+ // elevated surface (#2C2A28, L*17 — nav/rail)
957
+ "surface-raised": surfaceRampDark.raised,
958
+ // raised surface (#31302F, L*20 — cards)
959
+ "surface-overlay": surfaceRampDark.overlay,
960
+ // overlay surface (#373635, L*22.5 — hero/popover)
961
+ "surface-input": surfaceRampDark.elevated,
962
+ // input surface (#2C2A28 — one plane above base)
963
+ "surface-inset": surfaceRampDark.inset,
964
+ // deepest pressed pit (#13100D, L*4.5 — sub-shell well)
965
+ // Background colors — same ramp, the frame/shell end of it.
966
+ "background-base": surfaceRampDark.background,
967
+ // shell / frame (#1C1916, L*9 — Surface level="background")
968
+ "background-default": surfaceRampDark.base,
969
+ // main background (#252321, L*13.5 — matches surface-base)
970
+ "background-subtle": surfaceRampDark.elevated,
971
+ // subtle background (#2C2A28, L*17 — matches surface-elevated)
972
+ // Frame/bezel chrome (S-3) — the top bar + side nav shell; one step BELOW
973
+ // `background-base`, darker even than `surface-inset` — it exits the content
974
+ // ramp entirely rather than sitting in it. See `backgroundFrameDark` in
975
+ // primitives.ts.
976
+ "background-frame": backgroundFrameDark,
977
+ // frame / bezel (#100D0A, L*3.79)
978
+ // Border colors — `border-subtle` (#1C1C1C) previously collided with
979
+ // `surface-raised` (also #1C1C1C, an invisible border on raised cards). The
980
+ // re-spaced ramp above moved `surface-raised` to #2D2C2B, so this value is now
981
+ // distinct from every surface hex without needing to change it — see
982
+ // `surface.contract.test.ts` R2/R4.
933
983
  "border-default": primitiveColors.charcoal[400],
934
984
  // default border
935
985
  "border-subtle": primitiveColors.charcoal[500],
@@ -943,6 +993,14 @@ var semanticColorsDark = {
943
993
  "border-input-hover": primitiveColors.neutral[500],
944
994
  "border-input-focus": "#828DF8",
945
995
  "border-input-error": primitiveColors.red[500],
996
+ // Alpha hairline separators — the primary separation cue (§4/S-2). Self-
997
+ // normalizing: composites toward white by ~the same amount on ANY plane, so
998
+ // one family works at every elevation instead of per-surface border tokens.
999
+ // Shadows are demoted to floating-overlay use only (not shipped as a fill
1000
+ // separator here — see elevation.ts, follow-up S-4).
1001
+ "hairline-subtle": "rgba(255, 255, 255, 0.06)",
1002
+ "hairline-default": "rgba(255, 255, 255, 0.09)",
1003
+ "hairline-strong": "rgba(255, 255, 255, 0.14)",
946
1004
  // Interactive states
947
1005
  "interactive-hover": "rgba(255, 255, 255, 0.04)",
948
1006
  "interactive-focus": "rgba(255, 255, 255, 0.12)",
@@ -1472,9 +1530,11 @@ var lightThemeCSSVars = {
1472
1530
  "--color-surface-base": semanticColorsLight["surface-base"],
1473
1531
  "--color-surface-elevated": semanticColorsLight["surface-elevated"],
1474
1532
  "--color-surface-raised": semanticColorsLight["surface-raised"],
1533
+ "--color-surface-inset": semanticColorsLight["surface-inset"],
1475
1534
  "--color-background-base": semanticColorsLight["background-base"],
1476
1535
  "--color-background-default": semanticColorsLight["background-default"],
1477
1536
  "--color-background-subtle": semanticColorsLight["background-subtle"],
1537
+ "--color-background-frame": semanticColorsLight["background-frame"],
1478
1538
  "--color-border-default": semanticColorsLight["border-default"],
1479
1539
  "--color-border-subtle": semanticColorsLight["border-subtle"],
1480
1540
  "--color-border-strong": semanticColorsLight["border-strong"],
@@ -1531,6 +1591,9 @@ var lightThemeCSSVars = {
1531
1591
  "--color-border-input-hover": semanticColorsLight["border-input-hover"],
1532
1592
  "--color-border-input-focus": semanticColorsLight["border-input-focus"],
1533
1593
  "--color-border-input-error": semanticColorsLight["border-input-error"],
1594
+ "--color-hairline-subtle": semanticColorsLight["hairline-subtle"],
1595
+ "--color-hairline-default": semanticColorsLight["hairline-default"],
1596
+ "--color-hairline-strong": semanticColorsLight["hairline-strong"],
1534
1597
  "--color-interactive-disabled-text": semanticColorsLight["interactive-disabled-text"],
1535
1598
  "--color-avatar-background": semanticColorsLight["avatar-background"],
1536
1599
  "--color-avatar-text": semanticColorsLight["avatar-text"],
@@ -1570,9 +1633,11 @@ var darkThemeCSSVars = {
1570
1633
  "--color-surface-base": semanticColorsDark["surface-base"],
1571
1634
  "--color-surface-elevated": semanticColorsDark["surface-elevated"],
1572
1635
  "--color-surface-raised": semanticColorsDark["surface-raised"],
1636
+ "--color-surface-inset": semanticColorsDark["surface-inset"],
1573
1637
  "--color-background-base": semanticColorsDark["background-base"],
1574
1638
  "--color-background-default": semanticColorsDark["background-default"],
1575
1639
  "--color-background-subtle": semanticColorsDark["background-subtle"],
1640
+ "--color-background-frame": semanticColorsDark["background-frame"],
1576
1641
  "--color-border-default": semanticColorsDark["border-default"],
1577
1642
  "--color-border-subtle": semanticColorsDark["border-subtle"],
1578
1643
  "--color-border-strong": semanticColorsDark["border-strong"],
@@ -1629,6 +1694,9 @@ var darkThemeCSSVars = {
1629
1694
  "--color-border-input-hover": semanticColorsDark["border-input-hover"],
1630
1695
  "--color-border-input-focus": semanticColorsDark["border-input-focus"],
1631
1696
  "--color-border-input-error": semanticColorsDark["border-input-error"],
1697
+ "--color-hairline-subtle": semanticColorsDark["hairline-subtle"],
1698
+ "--color-hairline-default": semanticColorsDark["hairline-default"],
1699
+ "--color-hairline-strong": semanticColorsDark["hairline-strong"],
1632
1700
  "--color-interactive-disabled-text": semanticColorsDark["interactive-disabled-text"],
1633
1701
  "--color-avatar-background": semanticColorsDark["avatar-background"],
1634
1702
  "--color-avatar-text": semanticColorsDark["avatar-text"],
@@ -2263,6 +2331,10 @@ function getElevationShadow(baseColor, level, theme, isHovered = false) {
2263
2331
  elevationShadowCache.set(cacheKey, result);
2264
2332
  return result;
2265
2333
  }
2334
+ var PRESSED_ELEVATION_LEVEL = -1;
2335
+ function getPressedRecessShadow(fillColor, theme) {
2336
+ return getElevationShadow(fillColor, PRESSED_ELEVATION_LEVEL, theme);
2337
+ }
2266
2338
  function getBaseSurfaceColor(theme) {
2267
2339
  return theme === "light" ? semanticColorsLight["surface-raised"] : semanticColorsDark["surface-elevated"];
2268
2340
  }
@@ -2558,6 +2630,51 @@ var audiobookPreset = {
2558
2630
  },
2559
2631
  rootClasses: ["atmosphere-warm", "grain"]
2560
2632
  };
2633
+ var SURFACE_LEVEL_TOKEN = {
2634
+ background: "background-base",
2635
+ base: "surface-base",
2636
+ elevated: "surface-elevated",
2637
+ raised: "surface-raised",
2638
+ overlay: "surface-overlay"
2639
+ };
2640
+ var PRESSED_RAMP = ["inset", "background", "base", "elevated", "raised", "overlay"];
2641
+ var ON_SURFACE_TOKEN = {
2642
+ primary: "text-primary",
2643
+ secondary: "text-secondary",
2644
+ tertiary: "text-tertiary"
2645
+ };
2646
+ var DEFAULT_CONTEXT = { mode: "dark", level: "base" };
2647
+ var SurfaceContext = createContext(DEFAULT_CONTEXT);
2648
+ function useSurface() {
2649
+ return useContext(SurfaceContext);
2650
+ }
2651
+ function useSurfaceMode() {
2652
+ return useContext(SurfaceContext).mode;
2653
+ }
2654
+ function onSurfaceColors(mode) {
2655
+ const c = getSemanticColors(mode);
2656
+ return {
2657
+ primary: c[ON_SURFACE_TOKEN.primary],
2658
+ secondary: c[ON_SURFACE_TOKEN.secondary],
2659
+ tertiary: c[ON_SURFACE_TOKEN.tertiary]
2660
+ };
2661
+ }
2662
+ function useOnSurfaceColor(role = "primary") {
2663
+ return getSemanticColors(useSurfaceMode())[ON_SURFACE_TOKEN[role]];
2664
+ }
2665
+ function insetFloor(mode) {
2666
+ const colors = getSemanticColors(mode);
2667
+ return colors["surface-inset"] ?? surfaceRampDark.inset;
2668
+ }
2669
+ function surfaceBackground(level, mode) {
2670
+ if (level === "inset") return insetFloor(mode);
2671
+ return getSemanticColors(mode)[SURFACE_LEVEL_TOKEN[level]];
2672
+ }
2673
+ function pressedLevel(parent) {
2674
+ const index = PRESSED_RAMP.indexOf(parent);
2675
+ const down = Math.max(0, index - 1);
2676
+ return PRESSED_RAMP[down];
2677
+ }
2561
2678
  function getTheme() {
2562
2679
  if (typeof document === "undefined") return "dark";
2563
2680
  return document.documentElement.classList.contains("light") ? "light" : "dark";
@@ -3046,7 +3163,7 @@ function AvatarGroup({
3046
3163
  size = "md",
3047
3164
  className
3048
3165
  }) {
3049
- const childArray = React24.Children.toArray(children);
3166
+ const childArray = React25.Children.toArray(children);
3050
3167
  const visibleChildren = max ? childArray.slice(0, max) : childArray;
3051
3168
  const remainingCount = max ? Math.max(0, childArray.length - max) : 0;
3052
3169
  return /* @__PURE__ */ jsxs(View, { className: cn("flex-row", className), children: [
@@ -3057,7 +3174,7 @@ function AvatarGroup({
3057
3174
  "border-2 border-surface-base rounded-full",
3058
3175
  index > 0 && "-ml-2"
3059
3176
  ),
3060
- children: React24.isValidElement(child) ? React24.cloneElement(child, { size }) : child
3177
+ children: React25.isValidElement(child) ? React25.cloneElement(child, { size }) : child
3061
3178
  },
3062
3179
  index
3063
3180
  )),
@@ -3540,9 +3657,9 @@ function TabList({ children, className }) {
3540
3657
  variantStyles5[variant],
3541
3658
  className
3542
3659
  ),
3543
- children: React24.Children.map(children, (child, index) => {
3544
- if (React24.isValidElement(child)) {
3545
- return React24.cloneElement(child, { index });
3660
+ children: React25.Children.map(children, (child, index) => {
3661
+ if (React25.isValidElement(child)) {
3662
+ return React25.cloneElement(child, { index });
3546
3663
  }
3547
3664
  return child;
3548
3665
  })
@@ -3613,8 +3730,8 @@ function Tab({
3613
3730
  }
3614
3731
  function TabPanels({ children, className }) {
3615
3732
  const { activeIndex } = useContext(TabsContext);
3616
- return /* @__PURE__ */ jsx(View, { className: cn("flex-1", className), children: React24.Children.map(children, (child, index) => {
3617
- if (React24.isValidElement(child) && index === activeIndex) {
3733
+ return /* @__PURE__ */ jsx(View, { className: cn("flex-1", className), children: React25.Children.map(children, (child, index) => {
3734
+ if (React25.isValidElement(child) && index === activeIndex) {
3618
3735
  return child;
3619
3736
  }
3620
3737
  return null;
@@ -4014,9 +4131,9 @@ function Accordion({
4014
4131
  return newSet;
4015
4132
  });
4016
4133
  };
4017
- return /* @__PURE__ */ jsx(AccordionContext.Provider, { value: { openIndices, toggleIndex, allowMultiple }, children: /* @__PURE__ */ jsx(View, { className: cn("w-full divide-y divide-border", className), ...props, children: React24.Children.map(children, (child, index) => {
4018
- if (React24.isValidElement(child)) {
4019
- return React24.cloneElement(child, { index });
4134
+ return /* @__PURE__ */ jsx(AccordionContext.Provider, { value: { openIndices, toggleIndex, allowMultiple }, children: /* @__PURE__ */ jsx(View, { className: cn("w-full divide-y divide-border", className), ...props, children: React25.Children.map(children, (child, index) => {
4135
+ if (React25.isValidElement(child)) {
4136
+ return React25.cloneElement(child, { index });
4020
4137
  }
4021
4138
  return child;
4022
4139
  }) }) });
@@ -4024,9 +4141,9 @@ function Accordion({
4024
4141
  function AccordionItem({ index = 0, children, className }) {
4025
4142
  const { openIndices, toggleIndex } = useContext(AccordionContext);
4026
4143
  const isOpen = openIndices.has(index);
4027
- return /* @__PURE__ */ jsx(View, { className, children: React24.Children.map(children, (child) => {
4028
- if (React24.isValidElement(child)) {
4029
- return React24.cloneElement(child, {
4144
+ return /* @__PURE__ */ jsx(View, { className, children: React25.Children.map(children, (child) => {
4145
+ if (React25.isValidElement(child)) {
4146
+ return React25.cloneElement(child, {
4030
4147
  isOpen,
4031
4148
  onToggle: () => toggleIndex(index)
4032
4149
  });
@@ -4069,7 +4186,7 @@ function Breadcrumbs({
4069
4186
  children,
4070
4187
  ...props
4071
4188
  }) {
4072
- const items = React24.Children.toArray(children);
4189
+ const items = React25.Children.toArray(children);
4073
4190
  let displayItems = items;
4074
4191
  if (maxItems && items.length > maxItems) {
4075
4192
  const firstItem = items[0];
@@ -4655,7 +4772,7 @@ function ToolbarButton({
4655
4772
  }
4656
4773
  ],
4657
4774
  children: [
4658
- icon && /* @__PURE__ */ jsx(View, { className: "w-5 h-5 items-center justify-center", children: React24.isValidElement(icon) ? React24.cloneElement(icon, {
4775
+ icon && /* @__PURE__ */ jsx(View, { className: "w-5 h-5 items-center justify-center", children: React25.isValidElement(icon) ? React25.cloneElement(icon, {
4659
4776
  size: 20,
4660
4777
  width: 20,
4661
4778
  height: 20,
@@ -5188,7 +5305,7 @@ function ProgressSteps({
5188
5305
  }) {
5189
5306
  const { dot, connector } = stepSizeStyles[size];
5190
5307
  return /* @__PURE__ */ jsxs(View, { className: cn("w-full", className), ...props, children: [
5191
- /* @__PURE__ */ jsx(View, { className: "flex-row items-center", children: Array.from({ length: totalSteps }).map((_, index) => /* @__PURE__ */ jsxs(React24.Fragment, { children: [
5308
+ /* @__PURE__ */ jsx(View, { className: "flex-row items-center", children: Array.from({ length: totalSteps }).map((_, index) => /* @__PURE__ */ jsxs(React25.Fragment, { children: [
5192
5309
  /* @__PURE__ */ jsx(
5193
5310
  View,
5194
5311
  {
@@ -5753,7 +5870,7 @@ function FormField({
5753
5870
  }) {
5754
5871
  const isInvalid = !!errorMessage;
5755
5872
  const isHorizontal = orientation === "horizontal";
5756
- const fieldId = React24.useId();
5873
+ const fieldId = React25.useId();
5757
5874
  const helperId = `${fieldId}-helper`;
5758
5875
  const errorId = `${fieldId}-error`;
5759
5876
  return /* @__PURE__ */ jsxs(
@@ -5794,10 +5911,10 @@ function FormField({
5794
5911
  }
5795
5912
  ),
5796
5913
  /* @__PURE__ */ jsxs(View, { className: cn(isHorizontal && "flex-1"), children: [
5797
- React24.Children.map(children, (child) => {
5798
- if (React24.isValidElement(child)) {
5914
+ React25.Children.map(children, (child) => {
5915
+ if (React25.isValidElement(child)) {
5799
5916
  const childProps = child.props;
5800
- return React24.cloneElement(child, {
5917
+ return React25.cloneElement(child, {
5801
5918
  accessibilityHint: errorMessage || helperText || childProps.accessibilityHint,
5802
5919
  accessibilityState: {
5803
5920
  ...childProps.accessibilityState,
@@ -6008,32 +6125,49 @@ function IconBox({
6008
6125
  }
6009
6126
  function Surface({
6010
6127
  elevation = 0,
6128
+ level,
6129
+ pressed = false,
6011
6130
  glowColor,
6012
6131
  glowIntensity,
6013
- theme = "dark",
6132
+ theme,
6133
+ rounded,
6014
6134
  className,
6015
6135
  style,
6016
6136
  children,
6017
6137
  ...props
6018
6138
  }) {
6019
- const baseColor = getBaseSurfaceColor(theme);
6020
- const surfaceColor = getElevationSurface(baseColor, elevation, theme);
6021
- const shadowStyle = getElevationShadow(baseColor, elevation, theme);
6139
+ const inherited = useSurface();
6140
+ const mode = theme ?? inherited.mode;
6141
+ const isPlane = level != null;
6142
+ const baseColor = getBaseSurfaceColor(mode);
6143
+ const resolvedLevel = pressed ? pressedLevel(inherited.level) : level ?? inherited.level;
6144
+ let backgroundColor;
6145
+ let shadowStyle;
6146
+ if (pressed) {
6147
+ backgroundColor = surfaceBackground(resolvedLevel, mode);
6148
+ shadowStyle = getPressedRecessShadow(backgroundColor, mode);
6149
+ } else if (isPlane) {
6150
+ backgroundColor = surfaceBackground(level, mode);
6151
+ shadowStyle = {};
6152
+ } else {
6153
+ backgroundColor = getElevationSurface(baseColor, elevation, mode);
6154
+ shadowStyle = getElevationShadow(baseColor, elevation, mode);
6155
+ }
6022
6156
  const glowStyle = glowColor ? getGlowShadow(glowColor, glowIntensity) : {};
6023
- return /* @__PURE__ */ jsx(
6157
+ const applyRounded = rounded ?? (pressed || !isPlane);
6158
+ const value = useMemo(
6159
+ () => ({ mode, level: resolvedLevel }),
6160
+ [mode, resolvedLevel]
6161
+ );
6162
+ return /* @__PURE__ */ jsx(SurfaceContext.Provider, { value, children: /* @__PURE__ */ jsx(
6024
6163
  View,
6025
6164
  {
6026
- className: cn("rounded-2xl", className),
6027
- style: [
6028
- { backgroundColor: surfaceColor },
6029
- shadowStyle,
6030
- glowStyle,
6031
- style
6032
- ],
6165
+ className: cn(applyRounded && "rounded-2xl", className),
6166
+ style: [{ backgroundColor }, shadowStyle, glowStyle, style],
6033
6167
  ...props,
6034
6168
  children
6035
6169
  }
6036
- );
6170
+ ) });
6037
6171
  }
6038
6172
  function ListItem({ className, children, onPress, ...props }) {
6039
6173
  const Container = onPress ? Pressable : View;
@@ -6758,11 +6892,11 @@ function Stepper({
6758
6892
  className
6759
6893
  ),
6760
6894
  ...props,
6761
- children: React24.Children.map(children, (child, index) => {
6762
- if (React24.isValidElement(child)) {
6895
+ children: React25.Children.map(children, (child, index) => {
6896
+ if (React25.isValidElement(child)) {
6763
6897
  return /* @__PURE__ */ jsxs(Fragment, { children: [
6764
- React24.cloneElement(child, { index }),
6765
- index < React24.Children.count(children) - 1 && /* @__PURE__ */ jsx(StepConnector, { index })
6898
+ React25.cloneElement(child, { index }),
6899
+ index < React25.Children.count(children) - 1 && /* @__PURE__ */ jsx(StepConnector, { index })
6766
6900
  ] });
6767
6901
  }
6768
6902
  return child;
@@ -6804,9 +6938,9 @@ function Step({ index = 0, status, className, children }) {
6804
6938
  orientation === "horizontal" ? "items-center" : "flex-row items-start",
6805
6939
  className
6806
6940
  ),
6807
- children: React24.Children.map(children, (child) => {
6808
- if (React24.isValidElement(child)) {
6809
- return React24.cloneElement(child, {
6941
+ children: React25.Children.map(children, (child) => {
6942
+ if (React25.isValidElement(child)) {
6943
+ return React25.cloneElement(child, {
6810
6944
  status: derivedStatus,
6811
6945
  index
6812
6946
  });
@@ -7204,8 +7338,8 @@ function MetricGroup({
7204
7338
  children,
7205
7339
  ...props
7206
7340
  }) {
7207
- const items = React24.Children.toArray(children);
7208
- return /* @__PURE__ */ jsx(View, { className: cn("flex-row items-center", className), ...props, children: items.map((child, i) => /* @__PURE__ */ jsxs(React24.Fragment, { children: [
7341
+ const items = React25.Children.toArray(children);
7342
+ return /* @__PURE__ */ jsx(View, { className: cn("flex-row items-center", className), ...props, children: items.map((child, i) => /* @__PURE__ */ jsxs(React25.Fragment, { children: [
7209
7343
  /* @__PURE__ */ jsx(View, { className: "flex-1 items-center", children: child }),
7210
7344
  i < items.length - 1 && /* @__PURE__ */ jsx(
7211
7345
  View,
@@ -7216,13 +7350,14 @@ function MetricGroup({
7216
7350
  )
7217
7351
  ] }, i)) });
7218
7352
  }
7353
+ var t = getSemanticColors("dark");
7219
7354
  var baseBadgeSizeConfig = {
7220
7355
  sm: { fontSize: 9, paddingH: 6, paddingV: 2, iconSize: 10 },
7221
7356
  md: { fontSize: 10, paddingH: 8, paddingV: 2, iconSize: 12 },
7222
7357
  lg: { fontSize: 12, paddingH: 10, paddingV: 4, iconSize: 14 }
7223
7358
  };
7224
7359
  var variantColors = {
7225
- plain: { backgroundColor: "#1C1C1C", borderColor: "#1F1F1F" },
7360
+ plain: { backgroundColor: t["surface-raised"], borderColor: "#1F1F1F" },
7226
7361
  pr: {
7227
7362
  backgroundColor: "rgba(255, 121, 0, 0.12)",
7228
7363
  borderColor: "rgba(255, 121, 0, 0.3)"
@@ -7462,11 +7597,11 @@ function PrBadge({
7462
7597
  }
7463
7598
  return badge;
7464
7599
  }
7465
- var t = getSemanticColors("dark");
7600
+ var t2 = getSemanticColors("dark");
7466
7601
  var solidVariantColors = {
7467
- success: t["status-success"],
7468
- warning: t["status-warning"],
7469
- error: t["status-error"],
7602
+ success: t2["status-success"],
7603
+ warning: t2["status-warning"],
7604
+ error: t2["status-error"],
7470
7605
  neutral: "#6B7280"
7471
7606
  };
7472
7607
  var ringVariantStyles = {
@@ -7506,8 +7641,8 @@ var iconColors2 = {
7506
7641
  warning: "#6B4000",
7507
7642
  error: "#5C1A1A",
7508
7643
  neutral: "#D1D5DB",
7509
- "on-track": t["status-success"],
7510
- deviation: t["status-warning"],
7644
+ "on-track": t2["status-success"],
7645
+ deviation: t2["status-warning"],
7511
7646
  future: "#6B7280"
7512
7647
  };
7513
7648
  var sizeDimensions = {
@@ -7828,19 +7963,19 @@ function MetricCell({ children, color, fontSize = 11 }) {
7828
7963
  }
7829
7964
 
7830
7965
  // src/components/custom/Workout/TempoDisplay.tsx
7831
- var t2 = getSemanticColors("dark");
7966
+ var t3 = getSemanticColors("dark");
7832
7967
  var INTER = "Inter, sans-serif";
7833
7968
  var TEXT_TERTIARY = "#6B7280";
7834
- var STATUS_ERROR = t2["status-error"];
7835
- var STATUS_SUCCESS = t2["status-success"];
7836
- var STATUS_WARNING = t2["status-warning"];
7969
+ var STATUS_ERROR = t3["status-error"];
7970
+ var STATUS_SUCCESS = t3["status-success"];
7971
+ var STATUS_WARNING = t3["status-warning"];
7837
7972
  var ON_TARGET_MS = 100;
7838
7973
  function getTempoFillPct(elapsedMs, targetMs) {
7839
7974
  if (!targetMs) return 100;
7840
7975
  return Math.min(100, elapsedMs / targetMs * 100);
7841
7976
  }
7842
7977
  function activeNumberTone(elapsedMs, targetMs) {
7843
- if (targetMs == null) return t2["text-primary"];
7978
+ if (targetMs == null) return t3["text-primary"];
7844
7979
  const remainingMs = targetMs - elapsedMs;
7845
7980
  if (remainingMs > ON_TARGET_MS) return STATUS_WARNING;
7846
7981
  if (remainingMs >= -ON_TARGET_MS) return STATUS_SUCCESS;
@@ -7992,7 +8127,7 @@ function TempoDisplay({
7992
8127
  style: {
7993
8128
  flexDirection: "row",
7994
8129
  alignItems: "center",
7995
- backgroundColor: "#1C1C1C",
8130
+ backgroundColor: t3["surface-raised"],
7996
8131
  paddingHorizontal: chromePadX,
7997
8132
  paddingVertical: chromePadY,
7998
8133
  borderRadius: chromeRadius
@@ -8007,7 +8142,7 @@ function TempoDisplay({
8007
8142
  fontSize: labelFont,
8008
8143
  fontWeight: "500",
8009
8144
  // Live-muted green while a rep is running, tertiary at rest.
8010
- color: live ? t2["status-live-muted"] : TEXT_TERTIARY,
8145
+ color: live ? t3["status-live-muted"] : TEXT_TERTIARY,
8011
8146
  letterSpacing: 0.5,
8012
8147
  textTransform: "uppercase",
8013
8148
  marginRight: Math.round(fontSize * 0.5)
@@ -8065,7 +8200,7 @@ function TempoDisplay({
8065
8200
  View,
8066
8201
  {
8067
8202
  style: {
8068
- backgroundColor: "#191919",
8203
+ backgroundColor: t3["surface-overlay"],
8069
8204
  borderRadius: 6,
8070
8205
  paddingVertical: 8,
8071
8206
  paddingHorizontal: 12,
@@ -8118,13 +8253,13 @@ function TempoDisplay({
8118
8253
  }
8119
8254
  );
8120
8255
  }
8121
- var t3 = getSemanticColors("dark");
8256
+ var t4 = getSemanticColors("dark");
8122
8257
  function getDotColor(deviation) {
8123
8258
  const abs = Math.abs(deviation);
8124
- if (deviation < -0.3) return t3["status-success"];
8259
+ if (deviation < -0.3) return t4["status-success"];
8125
8260
  if (abs <= 0.3) return "#6B7280";
8126
- if (abs <= 0.7) return t3["status-warning"];
8127
- return t3["status-error"];
8261
+ if (abs <= 0.7) return t4["status-warning"];
8262
+ return t4["status-error"];
8128
8263
  }
8129
8264
  function getDeviationDescription(deviation) {
8130
8265
  if (deviation < -0.3) return "lighter than planned";
@@ -8192,19 +8327,19 @@ function DeviationBar({
8192
8327
  }
8193
8328
  );
8194
8329
  }
8195
- var t4 = getSemanticColors("dark");
8330
+ var t5 = getSemanticColors("dark");
8196
8331
  var TRACK_BG = "#333333";
8197
8332
  var LABEL_COLOR = "#6B7280";
8198
8333
  var TARGET_LINE_COLOR = "rgba(33, 150, 243, 0.5)";
8199
8334
  var AT_TARGET_GLOW = "0 0 5px 1px rgba(33, 150, 243, 0.35), 0 0 10px 3px rgba(33, 150, 243, 0.15)";
8200
8335
  var ZONE = {
8201
- building: t4["status-success"],
8336
+ building: t5["status-success"],
8202
8337
  // below target ramp-up
8203
- approaching: t4["status-warning"],
8338
+ approaching: t5["status-warning"],
8204
8339
  // nearing target
8205
- target: t4["brand-primary"],
8340
+ target: t5["brand-primary"],
8206
8341
  // exactly at target
8207
- over1: t4["status-error"],
8342
+ over1: t5["status-error"],
8208
8343
  // mild over-target
8209
8344
  over2: WORKOUT_TOKENS.intensity.over2,
8210
8345
  // moderate over-target
@@ -8373,12 +8508,12 @@ var MESO_ACCENT_GRADIENT_LIGHT = primitiveRamps.orange[300];
8373
8508
  var WORKOUT_PILL_DELOAD = primitiveRamps.magenta[600];
8374
8509
 
8375
8510
  // src/components/custom/Workout/WorkoutPill.tsx
8376
- var t5 = getSemanticColors("dark");
8511
+ var t6 = getSemanticColors("dark");
8377
8512
  var statusBgColors = {
8378
8513
  completed: "rgba(46,213,115,0.15)",
8379
8514
  current: "rgba(255,121,0,0.15)",
8380
8515
  next: "transparent",
8381
- upcoming: "#1C1C1C",
8516
+ upcoming: t6["surface-raised"],
8382
8517
  missed: "rgba(209,67,67,0.1)",
8383
8518
  deload: "rgba(186,41,150,0.15)"
8384
8519
  };
@@ -8391,9 +8526,9 @@ var statusBorderStyles = {
8391
8526
  deload: { borderWidth: 1, borderColor: "rgba(186,41,150,0.3)" }
8392
8527
  };
8393
8528
  var textColors = {
8394
- completed: t5["status-success"],
8395
- current: t5["brand-primary"],
8396
- next: t5["brand-primary"],
8529
+ completed: t6["status-success"],
8530
+ current: t6["brand-primary"],
8531
+ next: t6["brand-primary"],
8397
8532
  upcoming: "#6B7280",
8398
8533
  missed: "rgba(209,67,67,0.7)",
8399
8534
  deload: WORKOUT_PILL_DELOAD
@@ -9540,13 +9675,13 @@ function VelocityStrip({
9540
9675
  }
9541
9676
  return stripContent;
9542
9677
  }
9543
- var t6 = getSemanticColors("dark");
9678
+ var t7 = getSemanticColors("dark");
9544
9679
  var dotColorMap = {
9545
9680
  untrained: "#2C2C2C",
9546
- behind: t6["brand-secondary"],
9547
- ontrack: t6["status-success"],
9548
- target: t6["brand-primary"],
9549
- over: t6["status-error"]
9681
+ behind: t7["brand-secondary"],
9682
+ ontrack: t7["status-success"],
9683
+ target: t7["brand-primary"],
9684
+ over: t7["status-error"]
9550
9685
  };
9551
9686
  function MuscleGroupChip({
9552
9687
  name,
@@ -10249,7 +10384,7 @@ function RestTimer({
10249
10384
  }
10250
10385
  );
10251
10386
  }
10252
- var t7 = getSemanticColors("dark");
10387
+ var t8 = getSemanticColors("dark");
10253
10388
  var TIMES = "\xD7";
10254
10389
  var AT = "@";
10255
10390
  function SetsRepsLoad({
@@ -10261,8 +10396,8 @@ function SetsRepsLoad({
10261
10396
  className,
10262
10397
  ...props
10263
10398
  }) {
10264
- const value = t7["text-primary"];
10265
- const sep = t7["text-tertiary"];
10399
+ const value = t8["text-primary"];
10400
+ const sep = t8["text-tertiary"];
10266
10401
  return /* @__PURE__ */ jsxs(
10267
10402
  View,
10268
10403
  {
@@ -10375,14 +10510,14 @@ function ScheduleTiles({ when, now, gap = 1, ...props }) {
10375
10510
  )
10376
10511
  ] });
10377
10512
  }
10378
- var t8 = getSemanticColors("dark");
10513
+ var t9 = getSemanticColors("dark");
10379
10514
  var INDICATOR_CONFIG = {
10380
- imbalance: { Icon: ScaleIcon, color: t8["status-error"], label: "Left/right imbalance" },
10381
- overshoot: { Icon: AlertTriangleIcon, color: t8["status-error"], label: "Load overshoot" },
10382
- "velocity-loss": { Icon: TrendingDownIcon, color: t8["status-warning"], label: "Velocity loss" },
10383
- "missed-reps": { Icon: CircleSlashIcon, color: t8["status-warning"], label: "Missed reps" },
10384
- pr: { Icon: AwardIcon, color: t8["status-success"], label: "Personal record" },
10385
- info: { Icon: InfoIcon, color: t8["status-info"], label: "More info" }
10515
+ imbalance: { Icon: ScaleIcon, color: t9["status-error"], label: "Left/right imbalance" },
10516
+ overshoot: { Icon: AlertTriangleIcon, color: t9["status-error"], label: "Load overshoot" },
10517
+ "velocity-loss": { Icon: TrendingDownIcon, color: t9["status-warning"], label: "Velocity loss" },
10518
+ "missed-reps": { Icon: CircleSlashIcon, color: t9["status-warning"], label: "Missed reps" },
10519
+ pr: { Icon: AwardIcon, color: t9["status-success"], label: "Personal record" },
10520
+ info: { Icon: InfoIcon, color: t9["status-info"], label: "More info" }
10386
10521
  };
10387
10522
  var INDICATOR_PRECEDENCE = [
10388
10523
  "imbalance",
@@ -10858,8 +10993,6 @@ function ExerciseCard({
10858
10993
  if (upcoming) return /* @__PURE__ */ jsx(UpcomingCard, { ...rest, onToggle });
10859
10994
  return isExpanded ? /* @__PURE__ */ jsx(ExpandedCard, { ...rest, onToggle }) : /* @__PURE__ */ jsx(CollapsedCard, { ...rest, onToggle });
10860
10995
  }
10861
- var t9 = getSemanticColors("dark");
10862
- var HEADER_BG = t9["background-base"];
10863
10996
  var BAR_HEIGHT = 9;
10864
10997
  var BAR_GAP = 3;
10865
10998
  function SessionHeader({
@@ -10877,17 +11010,18 @@ function SessionHeader({
10877
11010
  }) {
10878
11011
  const upcoming = next != null;
10879
11012
  const totalSets = plan.reduce((sum, e) => sum + e.sets, 0);
11013
+ const onSurface = onSurfaceColors(useSurfaceMode());
10880
11014
  const hasPace = !upcoming && budgetMs != null && elapsedMs != null;
10881
11015
  const target = hasPace ? elapsedMs / budgetMs : void 0;
10882
11016
  const setsLabel = upcoming ? `${totalSets} sets` : `${Math.floor(setsDone)}/${totalSets} sets`;
10883
- const setsLabelColor = upcoming ? t9["text-secondary"] : paceToneColor(paceTone(totalSets > 0 ? setsDone / totalSets : 0, target));
11017
+ const setsLabelColor = upcoming ? onSurface.secondary : paceToneColor(paceTone(totalSets > 0 ? setsDone / totalSets : 0, target));
10884
11018
  return /* @__PURE__ */ jsxs(
10885
- View,
11019
+ Surface,
10886
11020
  {
11021
+ level: "background",
10887
11022
  className,
10888
11023
  style: [
10889
11024
  {
10890
- backgroundColor: HEADER_BG,
10891
11025
  paddingTop: 11,
10892
11026
  paddingRight: 12,
10893
11027
  paddingBottom: 12,
@@ -10908,7 +11042,7 @@ function SessionHeader({
10908
11042
  lineHeight: 18,
10909
11043
  fontWeight: "700",
10910
11044
  fontFamily: '"Space Grotesk", sans-serif',
10911
- color: t9["text-primary"],
11045
+ color: onSurface.primary,
10912
11046
  marginBottom: 10
10913
11047
  },
10914
11048
  testID: "session-rail-title",
@@ -10964,7 +11098,6 @@ function SessionHeader({
10964
11098
  }
10965
11099
  );
10966
11100
  }
10967
- var INSET = primitiveColors.charcoal[600];
10968
11101
  var DIVIDER = primitiveColors.charcoal[300];
10969
11102
  var DEFAULT_WIDTH = 246;
10970
11103
  function SessionRail({
@@ -10984,10 +11117,11 @@ function SessionRail({
10984
11117
  ...props
10985
11118
  }) {
10986
11119
  return /* @__PURE__ */ jsxs(
10987
- View,
11120
+ Surface,
10988
11121
  {
11122
+ level: "elevated",
10989
11123
  className,
10990
- style: [{ width, flexDirection: "column", backgroundColor: INSET }, style],
11124
+ style: [{ width, flexDirection: "column" }, style],
10991
11125
  testID: "session-rail",
10992
11126
  ...props,
10993
11127
  children: [
@@ -11005,9 +11139,10 @@ function SessionRail({
11005
11139
  }
11006
11140
  ),
11007
11141
  /* @__PURE__ */ jsx(
11008
- View,
11142
+ Surface,
11009
11143
  {
11010
- style: [{ flex: 1, backgroundColor: INSET }, neumorphicShadows.charcoal.pressed.subtle],
11144
+ level: "elevated",
11145
+ style: [{ flex: 1 }, neumorphicShadows.charcoal.pressed.subtle],
11011
11146
  testID: "session-rail-list",
11012
11147
  children: exercises.map((ex, i) => /* @__PURE__ */ jsx(
11013
11148
  View,
@@ -11044,7 +11179,7 @@ function SessionRail({
11044
11179
  var DEFAULTS = {
11045
11180
  label: "SS",
11046
11181
  color: getSemanticColors("dark")["brand-primary"],
11047
- bgBase: "#101010"
11182
+ bgBase: getSemanticColors("dark")["background-base"]
11048
11183
  };
11049
11184
  function SupersetWrapper({
11050
11185
  label = DEFAULTS.label,
@@ -14447,8 +14582,10 @@ function DashboardShell({
14447
14582
  return (
14448
14583
  // Column: the TopBar spans the FULL width across the top, and the SideNav sits BELOW it
14449
14584
  // in the content row (not a full-height left rail). This keeps the brand/status band
14450
- // unbroken edge-to-edge and lets the nav align under it.
14451
- /* @__PURE__ */ jsxs(View, { className: cn("flex-1 bg-surface-base", className), children: [
14585
+ // unbroken edge-to-edge and lets the nav align under it. The shell is the outermost
14586
+ // Surface it owns the base plane and seeds the on-surface colour context (mode) for
14587
+ // the whole dashboard tree.
14588
+ /* @__PURE__ */ jsxs(Surface, { level: "base", className: cn("flex-1", className), children: [
14452
14589
  /* @__PURE__ */ jsx(TopBar, { state, devices, subtitle, onSelectDevice }),
14453
14590
  /* @__PURE__ */ jsxs(View, { className: "flex-1 flex-row", children: [
14454
14591
  /* @__PURE__ */ jsx(SideNav, { activeKey, items: navItems, liveKey, onNavigate }),
@@ -14546,6 +14683,6 @@ function composeValidators(...validators) {
14546
14683
  };
14547
14684
  }
14548
14685
 
14549
- export { Accordion, AccordionButton, AccordionItem, AccordionPanel, ActivityIcon, Alert, AlertDescription, AlertTitle, AlertTriangleIcon, Autocomplete, Avatar, AvatarBadge, AvatarGroup, AwardIcon, Badge, BadgeText, BaseBadge, BluetoothIcon, BrandLockup, BreadcrumbItem, Breadcrumbs, Button, ButtonIcon, ButtonSpinner, ButtonText, CATEGORICAL_CVD_SAFE_MAX, CapacityBandChart, Caption, Card, CardContent, CardDescription, CardFooter, CardHeader, CardSkeleton, CardTitle, Checkbox, CheckboxGroup, Chip, CircleSlashIcon, CircularProgress, CircularTimer, Collapse, CollapseButton, CollapseContent, DashboardShell, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DumbbellIcon, EmptyState, ExerciseCard, ExerciseCardHeading, ExerciseHeading, ExerciseIndicator, FatigueMeter, FormActions, FormField, FormRow, FormSection, Gauge2 as Gauge, HStack, Heading, HelpTip, HistoryIcon, INDICATOR_PRECEDENCE, IconBox, Indicator, InfoIcon, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, LayersIcon, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, LiveAuraFrame, METRIC_FONT, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricCell, MetricGroup, MetricTiles, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, NavItem, Overline, Paragraph, PasswordInput, PersonStandingIcon, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, Radio, RadioGroup, ReadinessCheck, RestTimer, SET_STRIP_VARIABLE_COLOR, SET_STRIP_ZONES, ScaleIcon, Scatter, ScheduleTiles, Section, SectionContent, SectionHeader, SegmentedBar, SegmentedProgressBar, Select, SessionHeader, SessionRail, SessionStatePill, SetBar, SetRow, SetStrip, SetTableHeader, SetsRepsLoad, SideNav, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StatusPill2 as StatusPill, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, SvgIcon, Switch, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoDisplay, Tile, TimerReadout, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, TrendingDownIcon, Typography, VStack, VelocityStrip, VoltrasMark, VolumeLandmarkBar, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, ZoneTrack, alpha, applyThemePreset, audiobookPreset, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultNavItems, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatDuration, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getCategoricalColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getResultColor, getSemanticColors, getStatusColor, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, gluestackConfig, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, linearGradient, liveAuraColor, neumorphicShadows, paceTone, paceToneColor, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, resolveIndicator, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, statusPillColor, surfaceGradient, useTable, useTimer, useToast, useToolbarButton, validateCssPropertyManifest, validationRules, velocityZoneColor };
14686
+ export { Accordion, AccordionButton, AccordionItem, AccordionPanel, ActivityIcon, Alert, AlertDescription, AlertTitle, AlertTriangleIcon, Autocomplete, Avatar, AvatarBadge, AvatarGroup, AwardIcon, Badge, BadgeText, BaseBadge, BluetoothIcon, BrandLockup, BreadcrumbItem, Breadcrumbs, Button, ButtonIcon, ButtonSpinner, ButtonText, CATEGORICAL_CVD_SAFE_MAX, CapacityBandChart, Caption, Card, CardContent, CardDescription, CardFooter, CardHeader, CardSkeleton, CardTitle, Checkbox, CheckboxGroup, Chip, CircleSlashIcon, CircularProgress, CircularTimer, Collapse, CollapseButton, CollapseContent, DashboardShell, DataRow, DateTime, DeviationBar, DeviceIndicator, DeviceMenu, DeviceRow, Divider, Drawer, DrawerBody, DrawerFooter, DrawerHeader, DumbbellIcon, EmptyState, ExerciseCard, ExerciseCardHeading, ExerciseHeading, ExerciseIndicator, FatigueMeter, FormActions, FormField, FormRow, FormSection, Gauge2 as Gauge, HStack, Heading, HelpTip, HistoryIcon, INDICATOR_PRECEDENCE, IconBox, Indicator, InfoIcon, Input, InputBar, InputGroup, IntensityBar, Label, LabelWithHelp, LayersIcon, Link, ListItem, ListItemContent, ListItemDivider, ListItemIcon, ListItemTrailing, LiveAuraFrame, METRIC_FONT, Menu, MenuDivider, MenuGroup, MenuItem, MenuList, MenuTrigger, MesoCard, MesoProgressBar, MesoStatusCard, Metric, MetricCell, MetricGroup, MetricTiles, Modal, ModalBody, ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalTitle, MuscleGroupChip, NavItem, Overline, PRESSED_ELEVATION_LEVEL, Paragraph, PasswordInput, PersonStandingIcon, Pill, PlaceholderStrip, Popover, PopoverCloseButton, PopoverContent, PopoverTrigger, PrBadge, PrHistoryModal, Progress, ProgressSteps, Radio, RadioGroup, ReadinessCheck, RestTimer, SET_STRIP_VARIABLE_COLOR, SET_STRIP_ZONES, SURFACE_LEVEL_TOKEN, ScaleIcon, Scatter, ScheduleTiles, Section, SectionContent, SectionHeader, SegmentedBar, SegmentedProgressBar, Select, SessionHeader, SessionRail, SessionStatePill, SetBar, SetRow, SetStrip, SetTableHeader, SetsRepsLoad, SideNav, Sidebar, SidebarContent, SidebarDivider, SidebarFooter, SidebarHeader, SidebarItem, SidebarSection, Skeleton, SkeletonCard, SkeletonCircle, SkeletonListItem, SkeletonText, Sparkline, Spinner, Stack, StarIcon, StatusDot, StatusPill2 as StatusPill, StepContent, StepIndicator, StepLabel, Stepper, Step as StepperStep, StrengthTrendChart, SupersetWrapper, Surface, SurfaceContext, SvgIcon, Switch, Tab, TabList, TabPanel, TabPanels, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TablePagination, TableRow, Tabs, TempoDisplay, Tile, TimerReadout, Toast, ToastProvider, ToolbarButton, ToolbarButtonGroup, Tooltip, TopBar, Treemap, TrendingDownIcon, Typography, VStack, VelocityStrip, VoltrasMark, VolumeLandmarkBar, WeekRow, WeightBadge, WorkoutCard, WorkoutPill, ZoneTrack, alpha, applyThemePreset, audiobookPreset, backgroundFrameDark, bestTextColor, buttonSizes, calculateMeanVelocity, calculateVelocityLoss, categoricalPalette, cn, componentElevationRanges, composeValidators, createFieldId, createFlatShadow, createPressedHoverShadow, createPressedShadow, createRaisedHoverShadow, createRaisedShadow, darkThemeCSSVars, darken, defaultNavItems, defaultPreset, discreteRainbow, divergingScale, elevationSystem, formatDateTime, formatDuration, formatPrescription, formatSignedPct, formatVelocity, getBaseSurfaceColor, getCategoricalColor, getContrastText, getDiscreteRainbowColor, getElevationConfig, getElevationShadow, getElevationSurface, getFieldAriaProps, getFieldValidationProps, getGlowShadow, getHoverColors, getLuminance, getPressedRecessShadow, getResultColor, getSemanticColors, getStatusColor, getThemeCSSVars, getValidatedElevation, getVelocityZoneColor, getVelocityZoneName, gluestackConfig, hasMaxLength, hasMinLength, hexToRgb, hsvToRgb, isCssPropertyManifest, isDark, isEmpty, isValidEmail, lightThemeCSSVars, lighten, linearGradient, liveAuraColor, neumorphicShadows, onSurfaceColors, paceTone, paceToneColor, pressedLevel, primitiveBorderRadius, primitiveBreakpoints, primitiveColors, primitiveRamps, primitiveShadows, primitiveSpacing, primitiveTypography, primitiveZIndex, resolveColor, resolveIndicator, rgbToHex, rgbToHsv, roundRpe, roundTempo, roundWeight, rpeColor, semanticColorsDark, semanticColorsLight, semanticTypography, sequentialEffort, shadowColors, statusPillColor, surfaceBackground, surfaceGradient, surfaceRampDark, useOnSurfaceColor, useSurface, useSurfaceMode, useTable, useTimer, useToast, useToolbarButton, validateCssPropertyManifest, validationRules, velocityZoneColor };
14550
14687
  //# sourceMappingURL=index.mjs.map
14551
14688
  //# sourceMappingURL=index.mjs.map