@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.
- package/dist/bodymap.js +78 -24
- package/dist/bodymap.js.map +1 -1
- package/dist/bodymap.mjs +78 -24
- package/dist/bodymap.mjs.map +1 -1
- package/dist/index.d.mts +215 -123
- package/dist/index.d.ts +215 -123
- package/dist/index.js +408 -259
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +258 -121
- package/dist/index.mjs.map +1 -1
- package/dist/pages.js +214 -157
- package/dist/pages.js.map +1 -1
- package/dist/pages.mjs +214 -157
- package/dist/pages.mjs.map +1 -1
- package/dist/theme/index.d.mts +895 -795
- package/dist/theme/index.d.ts +895 -795
- package/dist/theme/index.js +101 -20
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/index.mjs +99 -22
- package/dist/theme/index.mjs.map +1 -1
- package/dist/theme/tokens-css.js +88 -24
- package/dist/theme/tokens-css.js.map +1 -1
- package/dist/theme/tokens-css.mjs +88 -24
- package/dist/theme/tokens-css.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/custom/Workout/BaseBadge.tsx +5 -5
- package/src/components/custom/Workout/RowInventory.stories.tsx +5 -2
- package/src/components/custom/Workout/S3FullRail.stories.tsx +13 -1
- package/src/components/custom/Workout/SessionHeader.tsx +11 -13
- package/src/components/custom/Workout/SessionRail.stories.tsx +4 -1
- package/src/components/custom/Workout/SessionRail.tsx +16 -14
- package/src/components/custom/Workout/SupersetWrapper.stories.tsx +16 -25
- package/src/components/custom/Workout/SupersetWrapper.tsx +1 -1
- package/src/components/custom/Workout/TempoDisplay.tsx +3 -7
- package/src/components/custom/Workout/VolumeLandmarkBar.stories.tsx +4 -1
- package/src/components/custom/Workout/WorkoutPill.tsx +2 -2
- package/src/components/shell/DashboardShell.tsx +6 -3
- package/src/components/ui/surface/Surface.stories.tsx +244 -1
- package/src/components/ui/surface/Surface.test.tsx +244 -1
- package/src/components/ui/surface/Surface.tsx +98 -20
- package/src/components/ui/surface/SurfaceContext.ts +126 -0
- package/src/components/ui/surface/index.ts +13 -0
- package/src/components/ui/surface/surface.contract.test.ts +283 -0
- package/src/test/nativewind-stub.ts +13 -0
- package/src/theme/ColorSystem.stories.tsx +232 -47
- package/src/theme/ThemeProvider.test.tsx +24 -0
- package/src/theme/ThemeProvider.tsx +23 -6
- package/src/theme/config.ts +12 -0
- package/src/theme/elevation.ts +90 -67
- package/src/theme/global.css +35 -9
- package/src/theme/tokens/primitives.ts +40 -0
- package/src/theme/tokens/semantic.ts +63 -14
- 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
|
|
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
|
-
|
|
916
|
-
//
|
|
917
|
-
|
|
918
|
-
//
|
|
919
|
-
|
|
920
|
-
//
|
|
921
|
-
|
|
922
|
-
//
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
//
|
|
926
|
-
"
|
|
927
|
-
//
|
|
928
|
-
"
|
|
929
|
-
//
|
|
930
|
-
"
|
|
931
|
-
//
|
|
932
|
-
|
|
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 =
|
|
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:
|
|
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:
|
|
3544
|
-
if (
|
|
3545
|
-
return
|
|
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:
|
|
3617
|
-
if (
|
|
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:
|
|
4018
|
-
if (
|
|
4019
|
-
return
|
|
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:
|
|
4028
|
-
if (
|
|
4029
|
-
return
|
|
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 =
|
|
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:
|
|
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(
|
|
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 =
|
|
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
|
-
|
|
5798
|
-
if (
|
|
5914
|
+
React25.Children.map(children, (child) => {
|
|
5915
|
+
if (React25.isValidElement(child)) {
|
|
5799
5916
|
const childProps = child.props;
|
|
5800
|
-
return
|
|
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
|
|
6132
|
+
theme,
|
|
6133
|
+
rounded,
|
|
6014
6134
|
className,
|
|
6015
6135
|
style,
|
|
6016
6136
|
children,
|
|
6017
6137
|
...props
|
|
6018
6138
|
}) {
|
|
6019
|
-
const
|
|
6020
|
-
const
|
|
6021
|
-
const
|
|
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
|
-
|
|
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:
|
|
6762
|
-
if (
|
|
6895
|
+
children: React25.Children.map(children, (child, index) => {
|
|
6896
|
+
if (React25.isValidElement(child)) {
|
|
6763
6897
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
6764
|
-
|
|
6765
|
-
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:
|
|
6808
|
-
if (
|
|
6809
|
-
return
|
|
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 =
|
|
7208
|
-
return /* @__PURE__ */ jsx(View, { className: cn("flex-row items-center", className), ...props, children: items.map((child, i) => /* @__PURE__ */ jsxs(
|
|
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: "
|
|
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
|
|
7600
|
+
var t2 = getSemanticColors("dark");
|
|
7466
7601
|
var solidVariantColors = {
|
|
7467
|
-
success:
|
|
7468
|
-
warning:
|
|
7469
|
-
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":
|
|
7510
|
-
deviation:
|
|
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
|
|
7966
|
+
var t3 = getSemanticColors("dark");
|
|
7832
7967
|
var INTER = "Inter, sans-serif";
|
|
7833
7968
|
var TEXT_TERTIARY = "#6B7280";
|
|
7834
|
-
var STATUS_ERROR =
|
|
7835
|
-
var STATUS_SUCCESS =
|
|
7836
|
-
var 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
|
|
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: "
|
|
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 ?
|
|
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: "
|
|
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
|
|
8256
|
+
var t4 = getSemanticColors("dark");
|
|
8122
8257
|
function getDotColor(deviation) {
|
|
8123
8258
|
const abs = Math.abs(deviation);
|
|
8124
|
-
if (deviation < -0.3) return
|
|
8259
|
+
if (deviation < -0.3) return t4["status-success"];
|
|
8125
8260
|
if (abs <= 0.3) return "#6B7280";
|
|
8126
|
-
if (abs <= 0.7) return
|
|
8127
|
-
return
|
|
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
|
|
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:
|
|
8336
|
+
building: t5["status-success"],
|
|
8202
8337
|
// below target ramp-up
|
|
8203
|
-
approaching:
|
|
8338
|
+
approaching: t5["status-warning"],
|
|
8204
8339
|
// nearing target
|
|
8205
|
-
target:
|
|
8340
|
+
target: t5["brand-primary"],
|
|
8206
8341
|
// exactly at target
|
|
8207
|
-
over1:
|
|
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
|
|
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: "
|
|
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:
|
|
8395
|
-
current:
|
|
8396
|
-
next:
|
|
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
|
|
9678
|
+
var t7 = getSemanticColors("dark");
|
|
9544
9679
|
var dotColorMap = {
|
|
9545
9680
|
untrained: "#2C2C2C",
|
|
9546
|
-
behind:
|
|
9547
|
-
ontrack:
|
|
9548
|
-
target:
|
|
9549
|
-
over:
|
|
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
|
|
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 =
|
|
10265
|
-
const sep =
|
|
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
|
|
10513
|
+
var t9 = getSemanticColors("dark");
|
|
10379
10514
|
var INDICATOR_CONFIG = {
|
|
10380
|
-
imbalance: { Icon: ScaleIcon, color:
|
|
10381
|
-
overshoot: { Icon: AlertTriangleIcon, color:
|
|
10382
|
-
"velocity-loss": { Icon: TrendingDownIcon, color:
|
|
10383
|
-
"missed-reps": { Icon: CircleSlashIcon, color:
|
|
10384
|
-
pr: { Icon: AwardIcon, color:
|
|
10385
|
-
info: { Icon: InfoIcon, color:
|
|
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 ?
|
|
11017
|
+
const setsLabelColor = upcoming ? onSurface.secondary : paceToneColor(paceTone(totalSets > 0 ? setsDone / totalSets : 0, target));
|
|
10884
11018
|
return /* @__PURE__ */ jsxs(
|
|
10885
|
-
|
|
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:
|
|
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
|
-
|
|
11120
|
+
Surface,
|
|
10988
11121
|
{
|
|
11122
|
+
level: "elevated",
|
|
10989
11123
|
className,
|
|
10990
|
-
style: [{ width, flexDirection: "column"
|
|
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
|
-
|
|
11142
|
+
Surface,
|
|
11009
11143
|
{
|
|
11010
|
-
|
|
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: "
|
|
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
|
-
|
|
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
|