@retray-dev/ui-kit 6.2.0 → 7.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENTS.md +444 -10
- package/EXAMPLES.md +248 -0
- package/README.md +11 -10
- package/dist/Accordion.d.mts +28 -0
- package/dist/Accordion.d.ts +28 -0
- package/dist/Accordion.js +340 -0
- package/dist/Accordion.mjs +6 -0
- package/dist/AlertBanner.d.mts +16 -0
- package/dist/AlertBanner.d.ts +16 -0
- package/dist/AlertBanner.js +247 -0
- package/dist/AlertBanner.mjs +5 -0
- package/dist/Avatar.d.mts +20 -0
- package/dist/Avatar.d.ts +20 -0
- package/dist/Avatar.js +234 -0
- package/dist/Avatar.mjs +3 -0
- package/dist/Badge.d.mts +26 -0
- package/dist/Badge.d.ts +26 -0
- package/dist/Badge.js +247 -0
- package/dist/Badge.mjs +4 -0
- package/dist/Button.d.mts +25 -0
- package/dist/Button.d.ts +25 -0
- package/dist/Button.js +414 -0
- package/dist/Button.mjs +8 -0
- package/dist/ButtonGroup.d.mts +26 -0
- package/dist/ButtonGroup.d.ts +26 -0
- package/dist/ButtonGroup.js +52 -0
- package/dist/ButtonGroup.mjs +2 -0
- package/dist/Card.d.mts +39 -0
- package/dist/Card.d.ts +39 -0
- package/dist/Card.js +329 -0
- package/dist/Card.mjs +7 -0
- package/dist/CategoryStrip.d.mts +26 -0
- package/dist/CategoryStrip.d.ts +26 -0
- package/dist/CategoryStrip.js +396 -0
- package/dist/CategoryStrip.mjs +9 -0
- package/dist/Checkbox.d.mts +14 -0
- package/dist/Checkbox.d.ts +14 -0
- package/dist/Checkbox.js +304 -0
- package/dist/Checkbox.mjs +7 -0
- package/dist/Chip.d.mts +31 -0
- package/dist/Chip.d.ts +31 -0
- package/dist/Chip.js +370 -0
- package/dist/Chip.mjs +8 -0
- package/dist/ConfirmDialog.d.mts +15 -0
- package/dist/ConfirmDialog.d.ts +15 -0
- package/dist/ConfirmDialog.js +530 -0
- package/dist/ConfirmDialog.mjs +9 -0
- package/dist/CurrencyDisplay.d.mts +24 -0
- package/dist/CurrencyDisplay.d.ts +24 -0
- package/dist/CurrencyDisplay.js +189 -0
- package/dist/CurrencyDisplay.mjs +3 -0
- package/dist/CurrencyInput.d.mts +26 -0
- package/dist/CurrencyInput.d.ts +26 -0
- package/dist/CurrencyInput.js +404 -0
- package/dist/CurrencyInput.mjs +7 -0
- package/dist/DetailRow.d.mts +32 -0
- package/dist/DetailRow.d.ts +32 -0
- package/dist/DetailRow.js +275 -0
- package/dist/DetailRow.mjs +4 -0
- package/dist/EmptyState.d.mts +27 -0
- package/dist/EmptyState.d.ts +27 -0
- package/dist/EmptyState.js +503 -0
- package/dist/EmptyState.mjs +9 -0
- package/dist/Form.d.mts +52 -0
- package/dist/Form.d.ts +52 -0
- package/dist/Form.js +204 -0
- package/dist/Form.mjs +3 -0
- package/dist/IconButton.d.mts +22 -0
- package/dist/IconButton.d.ts +22 -0
- package/dist/IconButton.js +383 -0
- package/dist/IconButton.mjs +7 -0
- package/dist/Input.d.mts +23 -0
- package/dist/Input.d.ts +23 -0
- package/dist/Input.js +351 -0
- package/dist/Input.mjs +6 -0
- package/dist/LabelValue.d.mts +16 -0
- package/dist/LabelValue.d.ts +16 -0
- package/dist/LabelValue.js +225 -0
- package/dist/LabelValue.mjs +4 -0
- package/dist/ListGroup.d.mts +34 -0
- package/dist/ListGroup.d.ts +34 -0
- package/dist/ListGroup.js +217 -0
- package/dist/ListGroup.mjs +4 -0
- package/dist/ListItem.d.mts +64 -0
- package/dist/ListItem.d.ts +64 -0
- package/dist/ListItem.js +430 -0
- package/dist/ListItem.mjs +8 -0
- package/dist/MediaCard.d.mts +39 -0
- package/dist/MediaCard.d.ts +39 -0
- package/dist/MediaCard.js +427 -0
- package/dist/MediaCard.mjs +8 -0
- package/dist/MenuGroup.d.mts +34 -0
- package/dist/MenuGroup.d.ts +34 -0
- package/dist/MenuGroup.js +217 -0
- package/dist/MenuGroup.mjs +4 -0
- package/dist/MenuItem.d.mts +48 -0
- package/dist/MenuItem.d.ts +48 -0
- package/dist/MenuItem.js +403 -0
- package/dist/MenuItem.mjs +8 -0
- package/dist/MonthPicker.d.mts +20 -0
- package/dist/MonthPicker.d.ts +20 -0
- package/dist/MonthPicker.js +234 -0
- package/dist/MonthPicker.mjs +4 -0
- package/dist/Pressable.d.mts +34 -0
- package/dist/Pressable.d.ts +34 -0
- package/dist/Pressable.js +132 -0
- package/dist/Pressable.mjs +4 -0
- package/dist/Progress.d.mts +14 -0
- package/dist/Progress.d.ts +14 -0
- package/dist/Progress.js +191 -0
- package/dist/Progress.mjs +4 -0
- package/dist/RadioGroup.d.mts +19 -0
- package/dist/RadioGroup.d.ts +19 -0
- package/dist/RadioGroup.js +341 -0
- package/dist/RadioGroup.mjs +7 -0
- package/dist/Select.d.mts +22 -0
- package/dist/Select.d.ts +22 -0
- package/dist/Select.js +441 -0
- package/dist/Select.mjs +6 -0
- package/dist/Separator.d.mts +10 -0
- package/dist/Separator.d.ts +10 -0
- package/dist/Separator.js +156 -0
- package/dist/Separator.mjs +2 -0
- package/dist/Sheet.d.mts +81 -0
- package/dist/Sheet.d.ts +81 -0
- package/dist/Sheet.js +340 -0
- package/dist/Sheet.mjs +4 -0
- package/dist/Skeleton.d.mts +17 -0
- package/dist/Skeleton.d.ts +17 -0
- package/dist/Skeleton.js +205 -0
- package/dist/Skeleton.mjs +4 -0
- package/dist/Slider.d.mts +20 -0
- package/dist/Slider.d.ts +20 -0
- package/dist/Slider.js +232 -0
- package/dist/Slider.mjs +4 -0
- package/dist/Spinner.d.mts +12 -0
- package/dist/Spinner.d.ts +12 -0
- package/dist/Spinner.js +172 -0
- package/dist/Spinner.mjs +3 -0
- package/dist/Switch.d.mts +13 -0
- package/dist/Switch.d.ts +13 -0
- package/dist/Switch.js +261 -0
- package/dist/Switch.mjs +5 -0
- package/dist/Tabs.d.mts +27 -0
- package/dist/Tabs.d.ts +27 -0
- package/dist/Tabs.js +389 -0
- package/dist/Tabs.mjs +6 -0
- package/dist/Text.d.mts +12 -0
- package/dist/Text.d.ts +12 -0
- package/dist/Text.js +311 -0
- package/dist/Text.mjs +4 -0
- package/dist/Textarea.d.mts +16 -0
- package/dist/Textarea.d.ts +16 -0
- package/dist/Textarea.js +333 -0
- package/dist/Textarea.mjs +6 -0
- package/dist/Toast.d.mts +47 -0
- package/dist/Toast.d.ts +47 -0
- package/dist/Toast.js +185 -0
- package/dist/Toast.mjs +3 -0
- package/dist/Toggle.d.mts +33 -0
- package/dist/Toggle.d.ts +33 -0
- package/dist/Toggle.js +397 -0
- package/dist/Toggle.mjs +8 -0
- package/dist/VirtualList.d.mts +19 -0
- package/dist/VirtualList.d.ts +19 -0
- package/dist/VirtualList.js +38 -0
- package/dist/VirtualList.mjs +1 -0
- package/dist/chunk-2CE3TQVY.mjs +11 -0
- package/dist/chunk-2UYENBLV.mjs +49 -0
- package/dist/chunk-3BBOZ3OQ.mjs +41 -0
- package/dist/chunk-5IKW3VNC.mjs +43 -0
- package/dist/chunk-63357L2X.mjs +51 -0
- package/dist/chunk-6LQYY7HC.mjs +127 -0
- package/dist/chunk-6Q64UFIA.mjs +71 -0
- package/dist/chunk-76PFOSM2.mjs +41 -0
- package/dist/chunk-7H2OR44A.mjs +14 -0
- package/dist/chunk-A4MDAP7G.mjs +42 -0
- package/dist/chunk-AU2VDY4P.mjs +190 -0
- package/dist/chunk-BRKYVJVV.mjs +60 -0
- package/dist/chunk-CRYBX2CM.mjs +146 -0
- package/dist/chunk-DITNP6PL.mjs +106 -0
- package/dist/chunk-FTLJOUOQ.mjs +97 -0
- package/dist/chunk-GCWOGZYL.mjs +104 -0
- package/dist/chunk-GNGLDL6Z.mjs +60 -0
- package/dist/chunk-GPOUINK5.mjs +148 -0
- package/dist/chunk-HSPSMN6U.mjs +115 -0
- package/dist/chunk-IRRY3CRZ.mjs +82 -0
- package/dist/chunk-JB67UOB5.mjs +92 -0
- package/dist/chunk-JBLL7U3U.mjs +64 -0
- package/dist/chunk-KWCPOM6W.mjs +136 -0
- package/dist/chunk-KZJRQOIU.mjs +64 -0
- package/dist/chunk-L7E7TVEZ.mjs +145 -0
- package/dist/chunk-LG4DO3DK.mjs +174 -0
- package/dist/chunk-LWG526VX.mjs +139 -0
- package/dist/chunk-MN7OG7IY.mjs +96 -0
- package/dist/chunk-MX6HRKMI.mjs +29 -0
- package/dist/chunk-NC5ZTR2Y.mjs +32 -0
- package/dist/chunk-NQGVLMWG.mjs +90 -0
- package/dist/chunk-QCNARS3X.mjs +46 -0
- package/dist/chunk-QXGYKWI7.mjs +134 -0
- package/dist/chunk-QY3X2UYR.mjs +191 -0
- package/dist/chunk-RKLHUDZS.mjs +92 -0
- package/dist/chunk-RMMK64W5.mjs +54 -0
- package/dist/chunk-RR2VQLKE.mjs +190 -0
- package/dist/chunk-RTC3CFXF.mjs +29 -0
- package/dist/chunk-SBZYEV4S.mjs +61 -0
- package/dist/chunk-SOA2Z4RB.mjs +82 -0
- package/dist/chunk-SOYNZDVY.mjs +151 -0
- package/dist/chunk-T7XZ7H7Y.mjs +57 -0
- package/dist/chunk-TAJ2PQ2O.mjs +163 -0
- package/dist/chunk-U4N7WF4Z.mjs +108 -0
- package/dist/chunk-URDE3EUU.mjs +132 -0
- package/dist/chunk-URLL5JBR.mjs +245 -0
- package/dist/chunk-XDMN67KV.mjs +59 -0
- package/dist/chunk-Y6MXOREN.mjs +120 -0
- package/dist/chunk-YZJAFS4P.mjs +131 -0
- package/dist/index.d.mts +94 -873
- package/dist/index.d.ts +94 -873
- package/dist/index.js +751 -357
- package/dist/index.mjs +50 -3895
- package/package.json +23 -14
- package/src/assets/fonts/Sohne-Bold.otf +0 -0
- package/src/assets/fonts/Sohne-BoldItalic.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraBold.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraBoldItalic.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraLight.otf +0 -0
- package/src/assets/fonts/Sohne-ExtraLightItalic.otf +0 -0
- package/src/assets/fonts/Sohne-Italic.otf +0 -0
- package/src/assets/fonts/Sohne-Light.otf +0 -0
- package/src/assets/fonts/Sohne-LightItalic.otf +0 -0
- package/src/assets/fonts/Sohne-Medium.otf +0 -0
- package/src/assets/fonts/Sohne-MediumItalic.otf +0 -0
- package/src/assets/fonts/Sohne-Regular.otf +0 -0
- package/src/assets/fonts/Sohne-SemiBold.otf +0 -0
- package/src/assets/fonts/Sohne-SemiBoldItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Bold.otf +0 -0
- package/src/assets/fonts/SohneMono-BoldItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraBold.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraBoldItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraLight.otf +0 -0
- package/src/assets/fonts/SohneMono-ExtraLightItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Italic.otf +0 -0
- package/src/assets/fonts/SohneMono-Light.otf +0 -0
- package/src/assets/fonts/SohneMono-LightItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Medium.otf +0 -0
- package/src/assets/fonts/SohneMono-MediumItalic.otf +0 -0
- package/src/assets/fonts/SohneMono-Regular.otf +0 -0
- package/src/assets/fonts/SohneMono-SemiBold.otf +0 -0
- package/src/assets/fonts/SohneMono-SemiBoldItalic.otf +0 -0
- package/src/components/Accordion/Accordion.tsx +3 -3
- package/src/components/AlertBanner/AlertBanner.tsx +33 -12
- package/src/components/Avatar/Avatar.tsx +4 -2
- package/src/components/Badge/Badge.tsx +4 -2
- package/src/components/Button/Button.tsx +10 -11
- package/src/components/ButtonGroup/ButtonGroup.tsx +13 -10
- package/src/components/Card/Card.tsx +17 -34
- package/src/components/CategoryStrip/CategoryStrip.tsx +24 -21
- package/src/components/Checkbox/Checkbox.tsx +11 -6
- package/src/components/Chip/Chip.tsx +17 -15
- package/src/components/ConfirmDialog/ConfirmDialog.tsx +2 -2
- package/src/components/CurrencyDisplay/CurrencyDisplay.tsx +4 -2
- package/src/components/CurrencyInput/CurrencyInput.tsx +2 -2
- package/src/components/DetailRow/DetailRow.tsx +9 -7
- package/src/components/EmptyState/EmptyState.tsx +2 -2
- package/src/components/Form/Form.tsx +149 -0
- package/src/components/Form/index.ts +1 -0
- package/src/components/IconButton/IconButton.tsx +4 -2
- package/src/components/Input/Input.tsx +27 -31
- package/src/components/LabelValue/LabelValue.tsx +6 -4
- package/src/components/ListGroup/ListGroup.tsx +145 -0
- package/src/components/ListGroup/index.ts +1 -0
- package/src/components/ListItem/ListItem.tsx +9 -10
- package/src/components/MediaCard/MediaCard.tsx +7 -5
- package/src/components/MenuGroup/MenuGroup.tsx +145 -0
- package/src/components/MenuGroup/index.ts +1 -0
- package/src/components/MenuItem/MenuItem.tsx +7 -9
- package/src/components/MonthPicker/MonthPicker.tsx +2 -2
- package/src/components/RadioGroup/RadioGroup.tsx +11 -14
- package/src/components/Select/Select.tsx +6 -6
- package/src/components/Separator/Separator.tsx +1 -3
- package/src/components/Sheet/Sheet.tsx +81 -17
- package/src/components/Skeleton/Skeleton.tsx +1 -1
- package/src/components/Slider/Slider.tsx +2 -2
- package/src/components/Spinner/Spinner.tsx +1 -1
- package/src/components/Switch/Switch.tsx +28 -5
- package/src/components/Tabs/Tabs.tsx +22 -18
- package/src/components/Text/Text.tsx +3 -1
- package/src/components/Textarea/Textarea.tsx +18 -14
- package/src/components/Toast/Toast.tsx +6 -6
- package/src/components/Toggle/Toggle.tsx +47 -23
- package/src/components/VirtualList/VirtualList.tsx +60 -0
- package/src/components/VirtualList/index.ts +1 -0
- package/src/fonts.ts +38 -20
- package/src/index.ts +5 -1
- package/src/theme/colors.ts +53 -39
- package/src/theme/types.ts +3 -0
- package/src/tokens.ts +49 -39
- package/src/utils/icons.ts +47 -20
- package/src/utils/usePressScale.ts +2 -0
- package/src/assets/fonts/Poppins-Black.ttf +0 -0
- package/src/assets/fonts/Poppins-BlackItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Bold.ttf +0 -0
- package/src/assets/fonts/Poppins-BoldItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraBold.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraBoldItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraLight.ttf +0 -0
- package/src/assets/fonts/Poppins-ExtraLightItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Italic.ttf +0 -0
- package/src/assets/fonts/Poppins-Light.ttf +0 -0
- package/src/assets/fonts/Poppins-LightItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Medium.ttf +0 -0
- package/src/assets/fonts/Poppins-MediumItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Regular.ttf +0 -0
- package/src/assets/fonts/Poppins-SemiBold.ttf +0 -0
- package/src/assets/fonts/Poppins-SemiBoldItalic.ttf +0 -0
- package/src/assets/fonts/Poppins-Thin.ttf +0 -0
- package/src/assets/fonts/Poppins-ThinItalic.ttf +0 -0
package/dist/index.js
CHANGED
|
@@ -87,19 +87,21 @@ function darken(hex, amount) {
|
|
|
87
87
|
// src/theme/colors.ts
|
|
88
88
|
var defaultLight = {
|
|
89
89
|
background: "#ffffff",
|
|
90
|
-
foreground: "#
|
|
91
|
-
// Airbnb ink — deep near-black, never pure black
|
|
90
|
+
foreground: "#1a1a1a",
|
|
92
91
|
card: "#ffffff",
|
|
93
92
|
primary: "#1a1a1a",
|
|
94
|
-
// Near-black primary — clean, premium default
|
|
95
93
|
primaryForeground: "#ffffff",
|
|
94
|
+
// AUDIT FIX: brand accent — was undefined; falls back to primary when omitted
|
|
95
|
+
accent: "#d4561d",
|
|
96
|
+
accentForeground: "#ffffff",
|
|
96
97
|
border: "#dddddd",
|
|
97
|
-
//
|
|
98
|
-
destructive: "#
|
|
98
|
+
// AUDIT FIX: was #e53935 (4.22:1 on white — fails AA); #c72828 = 5.59:1 ✓
|
|
99
|
+
destructive: "#c72828",
|
|
99
100
|
destructiveForeground: "#ffffff",
|
|
100
101
|
success: "#1a7a45",
|
|
101
102
|
successForeground: "#ffffff",
|
|
102
|
-
|
|
103
|
+
// AUDIT FIX: was #e67e00 (2.86:1 — severe fail); #9a5200 = 5.86:1 ✓ AAA-near
|
|
104
|
+
warning: "#9a5200",
|
|
103
105
|
warningForeground: "#ffffff"
|
|
104
106
|
};
|
|
105
107
|
var defaultDark = {
|
|
@@ -108,19 +110,24 @@ var defaultDark = {
|
|
|
108
110
|
card: "#1c1c1c",
|
|
109
111
|
primary: "#fafafa",
|
|
110
112
|
primaryForeground: "#0f0f0f",
|
|
113
|
+
// AUDIT FIX: lighter accent for dark surfaces (warm amber-orange)
|
|
114
|
+
accent: "#e87645",
|
|
115
|
+
accentForeground: "#ffffff",
|
|
111
116
|
border: "#303030",
|
|
112
117
|
destructive: "#ef5350",
|
|
113
118
|
destructiveForeground: "#ffffff",
|
|
114
119
|
success: "#2e7d52",
|
|
115
120
|
successForeground: "#ffffff",
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
// AUDIT FIX: brighter amber for dark-bg visibility; dark text for contrast
|
|
122
|
+
// #f5a623 on #0f0f0f = 8.6:1 ✓ as indicator; #0f0f0f text on #f5a623 = 8.6:1 ✓
|
|
123
|
+
warning: "#f5a623",
|
|
124
|
+
warningForeground: "#0f0f0f"
|
|
118
125
|
};
|
|
119
126
|
function deriveColors(t, scheme) {
|
|
120
127
|
const dark = scheme === "dark";
|
|
121
128
|
const bg = t.background;
|
|
122
|
-
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.
|
|
123
|
-
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.
|
|
129
|
+
const foregroundSubtle = mixWithBackground(t.foreground, bg, 0.7);
|
|
130
|
+
const foregroundMuted = mixWithBackground(t.foreground, bg, 0.62);
|
|
124
131
|
const surface = dark ? lighten(bg, -0.06) : darken(bg, 0.04);
|
|
125
132
|
const surfaceStrong = dark ? lighten(bg, -0.12) : darken(bg, 0.08);
|
|
126
133
|
const destructiveTint = dark ? withAlphaOnDark(t.destructive, 0.15, bg) : withAlphaOnWhite(t.destructive, 0.08);
|
|
@@ -144,10 +151,9 @@ function deriveColors(t, scheme) {
|
|
|
144
151
|
overlay: t.overlay ?? "rgba(0,0,0,0.45)",
|
|
145
152
|
accentResolved: t.accent ?? t.primary,
|
|
146
153
|
accentForegroundResolved: t.accentForeground ?? t.primaryForeground,
|
|
147
|
-
ring: t.primary,
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
// input border always = border
|
|
154
|
+
ring: t.accent ?? t.primary,
|
|
155
|
+
input: t.border,
|
|
156
|
+
separator: dark ? lighten(t.border, 0.22) : darken(t.border, 0.16)
|
|
151
157
|
};
|
|
152
158
|
}
|
|
153
159
|
|
|
@@ -203,20 +209,27 @@ var s = isWeb ? (n) => n : reactNativeSizeMatters.scale;
|
|
|
203
209
|
var vs = isWeb ? (n) => n : reactNativeSizeMatters.verticalScale;
|
|
204
210
|
var ms = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateScale;
|
|
205
211
|
var mvs = isWeb ? (n, _factor) => n : reactNativeSizeMatters.moderateVerticalScale;
|
|
206
|
-
var
|
|
207
|
-
|
|
208
|
-
{ name: "
|
|
209
|
-
{ name: "
|
|
210
|
-
{ name: "
|
|
211
|
-
{ name: "
|
|
212
|
-
{ name: "
|
|
212
|
+
var glyphMapOf = (mod) => mod.glyphMap ?? {};
|
|
213
|
+
var ALL_FAMILIES = [
|
|
214
|
+
{ name: "Ionicons", component: Ionicons__default.default, getGlyphMap: () => glyphMapOf(Ionicons__default.default) },
|
|
215
|
+
{ name: "MaterialIcons", component: MaterialIcons__default.default, getGlyphMap: () => glyphMapOf(MaterialIcons__default.default) },
|
|
216
|
+
{ name: "FontAwesome5", component: FontAwesome5__default.default, getGlyphMap: () => glyphMapOf(FontAwesome5__default.default) },
|
|
217
|
+
{ name: "Entypo", component: Entypo__default.default, getGlyphMap: () => glyphMapOf(Entypo__default.default) },
|
|
218
|
+
{ name: "AntDesign", component: AntDesign__default.default, getGlyphMap: () => glyphMapOf(AntDesign__default.default) },
|
|
219
|
+
{ name: "Feather", component: Feather__default.default, getGlyphMap: () => glyphMapOf(Feather__default.default) }
|
|
213
220
|
];
|
|
221
|
+
var activeFamilies = ALL_FAMILIES;
|
|
214
222
|
var resolvedCache = null;
|
|
223
|
+
function configureIconFamilies(families) {
|
|
224
|
+
const order = families.map((n) => ALL_FAMILIES.find((f) => f.name === n)).filter((f) => f !== void 0);
|
|
225
|
+
activeFamilies = order.length > 0 ? order : ALL_FAMILIES;
|
|
226
|
+
resolvedCache = null;
|
|
227
|
+
}
|
|
215
228
|
function buildCache() {
|
|
216
229
|
const cache = /* @__PURE__ */ new Map();
|
|
217
|
-
for (const family of
|
|
218
|
-
|
|
219
|
-
for (const iconName of Object.keys(
|
|
230
|
+
for (const family of activeFamilies) {
|
|
231
|
+
const glyphMap = family.getGlyphMap();
|
|
232
|
+
for (const iconName of Object.keys(glyphMap)) {
|
|
220
233
|
cache.set(iconName, family);
|
|
221
234
|
}
|
|
222
235
|
}
|
|
@@ -231,7 +244,7 @@ function resolveFamily(name) {
|
|
|
231
244
|
function Icon({ name, size, color, family }) {
|
|
232
245
|
let resolved = null;
|
|
233
246
|
if (family) {
|
|
234
|
-
resolved =
|
|
247
|
+
resolved = ALL_FAMILIES.find((f) => f.name === family) ?? null;
|
|
235
248
|
} else {
|
|
236
249
|
resolved = resolveFamily(name);
|
|
237
250
|
}
|
|
@@ -306,113 +319,126 @@ var BREAKPOINTS = {
|
|
|
306
319
|
};
|
|
307
320
|
var TYPOGRAPHY = {
|
|
308
321
|
"display-hero": {
|
|
309
|
-
fontFamily: "
|
|
322
|
+
fontFamily: "Sohne-Bold",
|
|
310
323
|
fontSize: 64,
|
|
311
324
|
fontWeight: "700",
|
|
312
325
|
lineHeight: 70,
|
|
313
326
|
letterSpacing: -1
|
|
314
327
|
},
|
|
315
328
|
"display-xl": {
|
|
316
|
-
fontFamily: "
|
|
329
|
+
fontFamily: "Sohne-Bold",
|
|
317
330
|
fontSize: 28,
|
|
318
331
|
fontWeight: "700",
|
|
319
332
|
lineHeight: 40,
|
|
320
333
|
letterSpacing: 0
|
|
321
334
|
},
|
|
335
|
+
// AUDIT FIX: was 22px/500 — raised to 24px/600; removes weight inversion vs display-md
|
|
322
336
|
"display-lg": {
|
|
323
|
-
fontFamily: "
|
|
324
|
-
fontSize:
|
|
325
|
-
fontWeight: "
|
|
326
|
-
lineHeight:
|
|
327
|
-
letterSpacing: -0.
|
|
337
|
+
fontFamily: "Sohne-SemiBold",
|
|
338
|
+
fontSize: 24,
|
|
339
|
+
fontWeight: "600",
|
|
340
|
+
lineHeight: 32,
|
|
341
|
+
letterSpacing: -0.3
|
|
328
342
|
},
|
|
343
|
+
// AUDIT FIX: was 21px/700 — lowered to 20px/600; weight normalised, 4px gap preserved
|
|
329
344
|
"display-md": {
|
|
330
|
-
fontFamily: "
|
|
331
|
-
fontSize:
|
|
332
|
-
fontWeight: "
|
|
333
|
-
lineHeight:
|
|
345
|
+
fontFamily: "Sohne-SemiBold",
|
|
346
|
+
fontSize: 20,
|
|
347
|
+
fontWeight: "600",
|
|
348
|
+
lineHeight: 28,
|
|
334
349
|
letterSpacing: 0
|
|
335
350
|
},
|
|
336
351
|
"display-sm": {
|
|
337
|
-
fontFamily: "
|
|
338
|
-
fontSize:
|
|
352
|
+
fontFamily: "Sohne-SemiBold",
|
|
353
|
+
fontSize: 18,
|
|
339
354
|
fontWeight: "600",
|
|
340
355
|
lineHeight: 24,
|
|
341
356
|
letterSpacing: -0.18
|
|
342
357
|
},
|
|
358
|
+
// AUDIT FIX: was 16px — raised to 17px so title-md > title-sm is size-visible
|
|
343
359
|
"title-md": {
|
|
344
|
-
fontFamily: "
|
|
345
|
-
fontSize:
|
|
360
|
+
fontFamily: "Sohne-SemiBold",
|
|
361
|
+
fontSize: 17,
|
|
346
362
|
fontWeight: "600",
|
|
347
|
-
lineHeight:
|
|
363
|
+
lineHeight: 22,
|
|
348
364
|
letterSpacing: 0
|
|
349
365
|
},
|
|
366
|
+
// AUDIT FIX: was 16px — lowered to 15px; now distinct from title-md
|
|
350
367
|
"title-sm": {
|
|
351
|
-
fontFamily: "
|
|
352
|
-
fontSize:
|
|
368
|
+
fontFamily: "Sohne-Medium",
|
|
369
|
+
fontSize: 15,
|
|
353
370
|
fontWeight: "500",
|
|
354
371
|
lineHeight: 20,
|
|
355
372
|
letterSpacing: 0
|
|
356
373
|
},
|
|
357
374
|
"body-md": {
|
|
358
|
-
fontFamily: "
|
|
375
|
+
fontFamily: "Sohne-Regular",
|
|
359
376
|
fontSize: 16,
|
|
360
377
|
fontWeight: "400",
|
|
361
378
|
lineHeight: 24,
|
|
362
379
|
letterSpacing: 0
|
|
363
380
|
},
|
|
364
381
|
"body-sm": {
|
|
365
|
-
fontFamily: "
|
|
382
|
+
fontFamily: "Sohne-Regular",
|
|
366
383
|
fontSize: 14,
|
|
367
384
|
fontWeight: "400",
|
|
368
385
|
lineHeight: 20,
|
|
369
386
|
letterSpacing: 0
|
|
370
387
|
},
|
|
371
|
-
caption: {
|
|
372
|
-
fontFamily: "
|
|
388
|
+
"caption": {
|
|
389
|
+
fontFamily: "Sohne-Medium",
|
|
373
390
|
fontSize: 14,
|
|
374
391
|
fontWeight: "500",
|
|
375
392
|
lineHeight: 18,
|
|
376
393
|
letterSpacing: 0
|
|
377
394
|
},
|
|
378
395
|
"caption-sm": {
|
|
379
|
-
fontFamily: "
|
|
396
|
+
fontFamily: "Sohne-Regular",
|
|
380
397
|
fontSize: 13,
|
|
381
398
|
fontWeight: "400",
|
|
382
399
|
lineHeight: 16,
|
|
383
400
|
letterSpacing: 0
|
|
384
401
|
},
|
|
385
402
|
"badge-text": {
|
|
386
|
-
fontFamily: "
|
|
403
|
+
fontFamily: "Sohne-SemiBold",
|
|
387
404
|
fontSize: 11,
|
|
388
405
|
fontWeight: "600",
|
|
389
|
-
lineHeight:
|
|
406
|
+
lineHeight: 14,
|
|
407
|
+
letterSpacing: 0
|
|
408
|
+
},
|
|
409
|
+
// AUDIT FIX: added badge-text-md so Badge md size has a canonical token
|
|
410
|
+
"badge-text-md": {
|
|
411
|
+
fontFamily: "Sohne-SemiBold",
|
|
412
|
+
fontSize: 13,
|
|
413
|
+
fontWeight: "600",
|
|
414
|
+
lineHeight: 16,
|
|
390
415
|
letterSpacing: 0
|
|
391
416
|
},
|
|
392
417
|
"micro-label": {
|
|
393
|
-
fontFamily: "
|
|
418
|
+
fontFamily: "Sohne-Bold",
|
|
394
419
|
fontSize: 12,
|
|
395
420
|
fontWeight: "700",
|
|
396
421
|
lineHeight: 16,
|
|
397
422
|
letterSpacing: 0
|
|
398
423
|
},
|
|
424
|
+
// AUDIT FIX: was 10px/0.8 letterSpacing — raised to 11px/0.6; minimum mobile readability
|
|
399
425
|
"uppercase-tag": {
|
|
400
|
-
fontFamily: "
|
|
401
|
-
fontSize:
|
|
426
|
+
fontFamily: "Sohne-Bold",
|
|
427
|
+
fontSize: 11,
|
|
402
428
|
fontWeight: "700",
|
|
403
|
-
lineHeight:
|
|
404
|
-
letterSpacing: 0.
|
|
429
|
+
lineHeight: 14,
|
|
430
|
+
letterSpacing: 0.6,
|
|
405
431
|
textTransform: "uppercase"
|
|
406
432
|
},
|
|
407
433
|
"button-lg": {
|
|
408
|
-
fontFamily: "
|
|
434
|
+
fontFamily: "Sohne-Medium",
|
|
409
435
|
fontSize: 16,
|
|
410
436
|
fontWeight: "500",
|
|
411
437
|
lineHeight: 22,
|
|
412
438
|
letterSpacing: 0
|
|
413
439
|
},
|
|
414
440
|
"button-sm": {
|
|
415
|
-
fontFamily: "
|
|
441
|
+
fontFamily: "Sohne-Medium",
|
|
416
442
|
fontSize: 14,
|
|
417
443
|
fontWeight: "500",
|
|
418
444
|
lineHeight: 18,
|
|
@@ -511,7 +537,7 @@ var labelSizeStyles = {
|
|
|
511
537
|
lg: { ...TYPOGRAPHY["button-lg"], fontSize: ms(TYPOGRAPHY["button-lg"].fontSize + 1), lineHeight: mvs(24) }
|
|
512
538
|
};
|
|
513
539
|
var iconSizeMap = { sm: 16, md: 18, lg: 20 };
|
|
514
|
-
function
|
|
540
|
+
function ButtonBase({
|
|
515
541
|
label,
|
|
516
542
|
variant = "primary",
|
|
517
543
|
size = "md",
|
|
@@ -547,12 +573,15 @@ function Button({
|
|
|
547
573
|
const labelVariantStyle = {
|
|
548
574
|
primary: { color: colors.primaryForeground },
|
|
549
575
|
secondary: { color: colors.primary },
|
|
550
|
-
|
|
576
|
+
// AUDIT FIX: was colors.foreground — visually indistinguishable from plain text,
|
|
577
|
+
// no affordance that it's a CTA. Now uses accentResolved so text-only buttons
|
|
578
|
+
// carry the brand voltage. Falls back to primary when no accent is defined.
|
|
579
|
+
text: { color: colors.accentResolved },
|
|
551
580
|
destructive: { color: colors.destructiveForeground }
|
|
552
581
|
}[variant];
|
|
553
582
|
const textColor = iconColor ?? labelVariantStyle.color;
|
|
554
583
|
const effectiveIcon = iconName ? renderIcon(iconName, iconSizeMap[size], textColor) : typeof icon === "function" ? icon({ label, size, variant, color: textColor }) : icon;
|
|
555
|
-
const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.
|
|
584
|
+
const spinnerColor = variant === "destructive" ? colors.destructiveForeground : variant === "primary" ? colors.primaryForeground : colors.accentResolved;
|
|
556
585
|
const styleArray = Array.isArray(style) ? style : style ? [style] : [];
|
|
557
586
|
const flatStyle = reactNative.StyleSheet.flatten(styleArray);
|
|
558
587
|
const { flex, ...restStyle } = flatStyle || {};
|
|
@@ -605,10 +634,10 @@ function Button({
|
|
|
605
634
|
)
|
|
606
635
|
);
|
|
607
636
|
}
|
|
637
|
+
var Button = React26__default.default.memo(ButtonBase);
|
|
608
638
|
var styles = reactNative.StyleSheet.create({
|
|
609
639
|
base: {
|
|
610
640
|
borderRadius: RADIUS.md,
|
|
611
|
-
// 14px — Airbnb-aligned rounded rect (not pill)
|
|
612
641
|
alignItems: "center",
|
|
613
642
|
justifyContent: "center",
|
|
614
643
|
flexDirection: "row"
|
|
@@ -620,7 +649,7 @@ var styles = reactNative.StyleSheet.create({
|
|
|
620
649
|
opacity: 0.45
|
|
621
650
|
},
|
|
622
651
|
label: {
|
|
623
|
-
fontFamily: "
|
|
652
|
+
fontFamily: "Sohne-Medium",
|
|
624
653
|
flexShrink: 1
|
|
625
654
|
},
|
|
626
655
|
labelWithIcon: {
|
|
@@ -641,15 +670,17 @@ function ButtonGroup({ children, gap = 12, vertical = false, style }) {
|
|
|
641
670
|
style
|
|
642
671
|
]
|
|
643
672
|
},
|
|
644
|
-
React26__default.default.Children.map(
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
673
|
+
React26__default.default.Children.map(children, (child) => {
|
|
674
|
+
if (!React26__default.default.isValidElement(child)) return child;
|
|
675
|
+
const childProps = child.props;
|
|
676
|
+
const extraProps = {
|
|
677
|
+
style: [child.props.style, { flex: 1 }]
|
|
678
|
+
};
|
|
679
|
+
if (!vertical && "label" in childProps && childProps["size"] === void 0) {
|
|
680
|
+
extraProps["size"] = "sm";
|
|
681
|
+
}
|
|
682
|
+
return React26__default.default.cloneElement(child, extraProps);
|
|
683
|
+
})
|
|
653
684
|
);
|
|
654
685
|
}
|
|
655
686
|
var styles2 = reactNative.StyleSheet.create({
|
|
@@ -668,7 +699,7 @@ var sizeMap = {
|
|
|
668
699
|
md: { container: s(44), icon: 20 },
|
|
669
700
|
lg: { container: s(52), icon: 24 }
|
|
670
701
|
};
|
|
671
|
-
function
|
|
702
|
+
function IconButtonBase({
|
|
672
703
|
iconName,
|
|
673
704
|
icon,
|
|
674
705
|
iconColor,
|
|
@@ -750,6 +781,7 @@ function IconButton({
|
|
|
750
781
|
] }, showCount && /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles3.badgeText, { color: colors.primaryForeground }] }, badgeCount))
|
|
751
782
|
);
|
|
752
783
|
}
|
|
784
|
+
var IconButton = React26__default.default.memo(IconButtonBase);
|
|
753
785
|
var styles3 = reactNative.StyleSheet.create({
|
|
754
786
|
wrapper: {
|
|
755
787
|
alignSelf: "flex-start"
|
|
@@ -781,7 +813,7 @@ var styles3 = reactNative.StyleSheet.create({
|
|
|
781
813
|
paddingHorizontal: 3
|
|
782
814
|
},
|
|
783
815
|
badgeText: {
|
|
784
|
-
fontFamily: "
|
|
816
|
+
fontFamily: "Sohne-Bold",
|
|
785
817
|
fontSize: ms(9),
|
|
786
818
|
lineHeight: 14
|
|
787
819
|
}
|
|
@@ -823,7 +855,7 @@ var defaultColorVariant = {
|
|
|
823
855
|
"button-lg": "foreground",
|
|
824
856
|
"button-sm": "foreground"
|
|
825
857
|
};
|
|
826
|
-
function
|
|
858
|
+
function TextBase({ variant = "body-md", color, style, children, ...props }) {
|
|
827
859
|
const { colors } = useTheme();
|
|
828
860
|
const colorKey = defaultColorVariant[variant] ?? "foreground";
|
|
829
861
|
const resolvedColor = color ?? colors[colorKey];
|
|
@@ -837,6 +869,7 @@ function Text3({ variant = "body-md", color, style, children, ...props }) {
|
|
|
837
869
|
children
|
|
838
870
|
);
|
|
839
871
|
}
|
|
872
|
+
var Text3 = React26__default.default.memo(TextBase);
|
|
840
873
|
function useColorTransition(active, options = {}) {
|
|
841
874
|
const { duration = TIMINGS.state.duration } = options;
|
|
842
875
|
const progress = Animated9.useSharedValue(active ? 1 : 0);
|
|
@@ -870,8 +903,9 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
870
903
|
},
|
|
871
904
|
/* @__PURE__ */ React26__default.default.createElement(vectorIcons.AntDesign, { name: showPassword ? "eye" : "eye-invisible", size: 20, color: colors.foregroundMuted })
|
|
872
905
|
) : suffixIcon ? renderIcon(suffixIcon, 20, suffixIconColor ?? colors.foregroundMuted) : suffix;
|
|
873
|
-
const
|
|
874
|
-
borderColor: error ? colors.destructive : Animated9.interpolateColor(focusProgress.value, [0, 1], [colors.border, colors.primary])
|
|
906
|
+
const borderAnimStyle = Animated9.useAnimatedStyle(() => ({
|
|
907
|
+
borderColor: error ? colors.destructive : Animated9.interpolateColor(focusProgress.value, [0, 1], [colors.border, colors.primary]),
|
|
908
|
+
borderWidth: error ? 2 : Animated9.interpolate(focusProgress.value, [0, 1], [1, 2])
|
|
875
909
|
}));
|
|
876
910
|
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles4.container, isDisabled && styles4.containerDisabled, containerStyle] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React26__default.default.createElement(
|
|
877
911
|
Animated9__default.default.View,
|
|
@@ -879,10 +913,10 @@ function Input({ label, error, hint, disabled, prefix, suffix, prefixStyle, suff
|
|
|
879
913
|
style: [
|
|
880
914
|
styles4.inputWrapper,
|
|
881
915
|
{ backgroundColor: isDisabled ? colors.surface : colors.background },
|
|
882
|
-
borderColorStyle,
|
|
883
916
|
inputWrapperStyle
|
|
884
917
|
]
|
|
885
918
|
},
|
|
919
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles4.borderOverlay, borderAnimStyle], pointerEvents: "none" }),
|
|
886
920
|
effectivePrefix ? typeof effectivePrefix === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles4.prefixText, { color: colors.foregroundMuted }, prefixStyle], allowFontScaling: true }, effectivePrefix) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles4.prefixContainer }, effectivePrefix) : null,
|
|
887
921
|
/* @__PURE__ */ React26__default.default.createElement(
|
|
888
922
|
reactNative.TextInput,
|
|
@@ -928,20 +962,25 @@ var styles4 = reactNative.StyleSheet.create({
|
|
|
928
962
|
opacity: 0.6
|
|
929
963
|
},
|
|
930
964
|
label: {
|
|
931
|
-
fontFamily: "
|
|
965
|
+
fontFamily: "Sohne-Medium",
|
|
932
966
|
fontSize: ms(14)
|
|
933
967
|
},
|
|
934
968
|
inputWrapper: {
|
|
935
969
|
flexDirection: "row",
|
|
936
970
|
alignItems: "center",
|
|
937
|
-
|
|
971
|
+
// Border lives on borderOverlay (absolute) so its 1px→2px focus change
|
|
972
|
+
// never resizes this box. Wrapper itself carries no border.
|
|
938
973
|
borderRadius: 8,
|
|
939
974
|
paddingHorizontal: s(14),
|
|
940
975
|
paddingVertical: vs(11),
|
|
941
976
|
minHeight: 48
|
|
942
977
|
},
|
|
978
|
+
borderOverlay: {
|
|
979
|
+
...reactNative.StyleSheet.absoluteFillObject,
|
|
980
|
+
borderRadius: 8
|
|
981
|
+
},
|
|
943
982
|
input: {
|
|
944
|
-
fontFamily: "
|
|
983
|
+
fontFamily: "Sohne-Regular",
|
|
945
984
|
flex: 1,
|
|
946
985
|
fontSize: ms(16),
|
|
947
986
|
paddingVertical: vs(2),
|
|
@@ -951,7 +990,7 @@ var styles4 = reactNative.StyleSheet.create({
|
|
|
951
990
|
marginRight: s(8)
|
|
952
991
|
},
|
|
953
992
|
prefixText: {
|
|
954
|
-
fontFamily: "
|
|
993
|
+
fontFamily: "Sohne-Regular",
|
|
955
994
|
fontSize: ms(15),
|
|
956
995
|
marginRight: s(8)
|
|
957
996
|
},
|
|
@@ -959,15 +998,18 @@ var styles4 = reactNative.StyleSheet.create({
|
|
|
959
998
|
marginLeft: s(8)
|
|
960
999
|
},
|
|
961
1000
|
suffixText: {
|
|
962
|
-
fontFamily: "
|
|
1001
|
+
fontFamily: "Sohne-Regular",
|
|
963
1002
|
fontSize: ms(15),
|
|
964
1003
|
marginLeft: s(8)
|
|
965
1004
|
},
|
|
1005
|
+
// AUDIT FIX: was padding: s(4) → ~28px tap target. Now 12px padding → ~44px.
|
|
1006
|
+
// Negative margin compensates so the visual icon position is unchanged.
|
|
966
1007
|
passwordToggle: {
|
|
967
|
-
padding: s(
|
|
1008
|
+
padding: s(12),
|
|
1009
|
+
margin: -s(8)
|
|
968
1010
|
},
|
|
969
1011
|
helperText: {
|
|
970
|
-
fontFamily: "
|
|
1012
|
+
fontFamily: "Sohne-Regular",
|
|
971
1013
|
fontSize: ms(13)
|
|
972
1014
|
}
|
|
973
1015
|
});
|
|
@@ -987,7 +1029,7 @@ var sizeIconGap = {
|
|
|
987
1029
|
lg: s(6)
|
|
988
1030
|
};
|
|
989
1031
|
var sizeIconSize = { sm: 10, md: 12, lg: 14 };
|
|
990
|
-
function
|
|
1032
|
+
function BadgeBase({ label, children, variant = "default", size = "md", icon, iconName, iconColor, style }) {
|
|
991
1033
|
const { colors } = useTheme();
|
|
992
1034
|
const containerStyle = {
|
|
993
1035
|
default: { backgroundColor: colors.primary },
|
|
@@ -1015,6 +1057,7 @@ function Badge({ label, children, variant = "default", size = "md", icon, iconNa
|
|
|
1015
1057
|
const content = children ?? label;
|
|
1016
1058
|
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles5.container, containerStyle, sizePadding[size], { gap: sizeIconGap[size] }, style] }, effectiveIcon, typeof content === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles5.label, { color: textColor }, sizeFontSize[size]], allowFontScaling: true }, content) : content);
|
|
1017
1059
|
}
|
|
1060
|
+
var Badge = React26__default.default.memo(BadgeBase);
|
|
1018
1061
|
var styles5 = reactNative.StyleSheet.create({
|
|
1019
1062
|
container: {
|
|
1020
1063
|
borderRadius: 9999,
|
|
@@ -1023,7 +1066,7 @@ var styles5 = reactNative.StyleSheet.create({
|
|
|
1023
1066
|
alignItems: "center"
|
|
1024
1067
|
},
|
|
1025
1068
|
label: {
|
|
1026
|
-
fontFamily: "
|
|
1069
|
+
fontFamily: "Sohne-Medium"
|
|
1027
1070
|
}
|
|
1028
1071
|
});
|
|
1029
1072
|
function Card({ children, variant = "elevated", onPress, style, accessibilityLabel }) {
|
|
@@ -1042,11 +1085,14 @@ function Card({ children, variant = "elevated", onPress, style, accessibilityLab
|
|
|
1042
1085
|
const variantStyle = {
|
|
1043
1086
|
elevated: {
|
|
1044
1087
|
backgroundColor: colors.card,
|
|
1045
|
-
|
|
1088
|
+
// AUDIT FIX: removed borderColor — shadow is the depth signal; a border on
|
|
1089
|
+
// top of a shadow creates redundant double-framing that reads as "heavy"
|
|
1090
|
+
// rather than "elevated". borderWidth: 0 overrides the base style's borderWidth: 1.
|
|
1091
|
+
borderWidth: 0,
|
|
1046
1092
|
shadowColor: "#000",
|
|
1047
|
-
shadowOffset: { width: 0, height:
|
|
1048
|
-
shadowOpacity: 0.
|
|
1049
|
-
shadowRadius:
|
|
1093
|
+
shadowOffset: { width: 0, height: 4 },
|
|
1094
|
+
shadowOpacity: 0.09,
|
|
1095
|
+
shadowRadius: 14,
|
|
1050
1096
|
elevation: 4
|
|
1051
1097
|
},
|
|
1052
1098
|
outlined: {
|
|
@@ -1089,7 +1135,7 @@ function CardTitle({ children, style }) {
|
|
|
1089
1135
|
}
|
|
1090
1136
|
function CardDescription({ children, style }) {
|
|
1091
1137
|
const { colors } = useTheme();
|
|
1092
|
-
return /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles6.description, { color: colors.
|
|
1138
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles6.description, { color: colors.foregroundSubtle }, style], allowFontScaling: true }, children);
|
|
1093
1139
|
}
|
|
1094
1140
|
function CardContent({ children, style }) {
|
|
1095
1141
|
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles6.content, style] }, children);
|
|
@@ -1108,12 +1154,14 @@ var styles6 = reactNative.StyleSheet.create({
|
|
|
1108
1154
|
gap: vs(4)
|
|
1109
1155
|
},
|
|
1110
1156
|
title: {
|
|
1111
|
-
fontFamily: "
|
|
1157
|
+
fontFamily: "Sohne-SemiBold",
|
|
1112
1158
|
fontSize: ms(16),
|
|
1113
1159
|
lineHeight: mvs(22)
|
|
1114
1160
|
},
|
|
1161
|
+
// AUDIT FIX: was foregroundMuted (2.2:1 fail) — description text now uses
|
|
1162
|
+
// foregroundSubtle (5.9:1 ✓) which is readable while still visually secondary.
|
|
1115
1163
|
description: {
|
|
1116
|
-
fontFamily: "
|
|
1164
|
+
fontFamily: "Sohne-Regular",
|
|
1117
1165
|
fontSize: ms(13),
|
|
1118
1166
|
lineHeight: mvs(18)
|
|
1119
1167
|
},
|
|
@@ -1136,7 +1184,7 @@ function Separator({ orientation = "horizontal", style }) {
|
|
|
1136
1184
|
{
|
|
1137
1185
|
style: [
|
|
1138
1186
|
orientation === "horizontal" ? styles7.horizontal : styles7.vertical,
|
|
1139
|
-
{ backgroundColor: colors.
|
|
1187
|
+
{ backgroundColor: colors.separator },
|
|
1140
1188
|
style
|
|
1141
1189
|
]
|
|
1142
1190
|
}
|
|
@@ -1145,13 +1193,11 @@ function Separator({ orientation = "horizontal", style }) {
|
|
|
1145
1193
|
var styles7 = reactNative.StyleSheet.create({
|
|
1146
1194
|
horizontal: {
|
|
1147
1195
|
height: 1,
|
|
1148
|
-
width: "100%"
|
|
1149
|
-
opacity: 0.7
|
|
1196
|
+
width: "100%"
|
|
1150
1197
|
},
|
|
1151
1198
|
vertical: {
|
|
1152
1199
|
width: 1,
|
|
1153
|
-
height: "100%"
|
|
1154
|
-
opacity: 0.7
|
|
1200
|
+
height: "100%"
|
|
1155
1201
|
}
|
|
1156
1202
|
});
|
|
1157
1203
|
var sizeMap2 = {
|
|
@@ -1184,7 +1230,7 @@ var styles8 = reactNative.StyleSheet.create({
|
|
|
1184
1230
|
gap: vs(6)
|
|
1185
1231
|
},
|
|
1186
1232
|
label: {
|
|
1187
|
-
fontFamily: "
|
|
1233
|
+
fontFamily: "Sohne-Regular",
|
|
1188
1234
|
lineHeight: mvs(18)
|
|
1189
1235
|
}
|
|
1190
1236
|
});
|
|
@@ -1269,7 +1315,7 @@ function getInitials(fallback, fallbackText) {
|
|
|
1269
1315
|
}
|
|
1270
1316
|
return "?";
|
|
1271
1317
|
}
|
|
1272
|
-
function
|
|
1318
|
+
function AvatarBase({ src, fallback, fallbackText, size = "md", status, style }) {
|
|
1273
1319
|
const { colors } = useTheme();
|
|
1274
1320
|
const [imageError, setImageError] = React26.useState(false);
|
|
1275
1321
|
const dimension = typeof size === "number" ? size : sizeMap3[size];
|
|
@@ -1320,6 +1366,7 @@ function Avatar({ src, fallback, fallbackText, size = "md", status, style }) {
|
|
|
1320
1366
|
}
|
|
1321
1367
|
));
|
|
1322
1368
|
}
|
|
1369
|
+
var Avatar = React26__default.default.memo(AvatarBase);
|
|
1323
1370
|
var styles10 = reactNative.StyleSheet.create({
|
|
1324
1371
|
wrapper: {
|
|
1325
1372
|
alignSelf: "flex-start",
|
|
@@ -1330,7 +1377,7 @@ var styles10 = reactNative.StyleSheet.create({
|
|
|
1330
1377
|
justifyContent: "center"
|
|
1331
1378
|
},
|
|
1332
1379
|
fallback: {
|
|
1333
|
-
fontFamily: "
|
|
1380
|
+
fontFamily: "Sohne-Medium"
|
|
1334
1381
|
},
|
|
1335
1382
|
statusDot: {
|
|
1336
1383
|
position: "absolute",
|
|
@@ -1339,11 +1386,30 @@ var styles10 = reactNative.StyleSheet.create({
|
|
|
1339
1386
|
}
|
|
1340
1387
|
});
|
|
1341
1388
|
function AlertBanner({ title, description, variant = "default", icon, iconName, iconColor, style }) {
|
|
1342
|
-
const { colors } = useTheme();
|
|
1343
|
-
const
|
|
1344
|
-
const
|
|
1389
|
+
const { colors, colorScheme } = useTheme();
|
|
1390
|
+
const isDark = colorScheme === "dark";
|
|
1391
|
+
const accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.foreground;
|
|
1392
|
+
const bgColor = variant === "destructive" ? isDark ? "rgba(239, 83, 80, 0.15)" : "rgba(199, 40, 40, 0.10)" : variant === "success" ? isDark ? "rgba(46, 125, 82, 0.15)" : "rgba(26, 122, 69, 0.10)" : variant === "warning" ? isDark ? "rgba(245, 166, 35, 0.15)" : "rgba(154, 82, 0, 0.10)" : colors.surface;
|
|
1393
|
+
const borderColor = variant === "destructive" ? isDark ? "rgba(239, 83, 80, 0.30)" : "rgba(199, 40, 40, 0.25)" : variant === "success" ? isDark ? "rgba(46, 125, 82, 0.30)" : "rgba(26, 122, 69, 0.25)" : variant === "warning" ? isDark ? "rgba(245, 166, 35, 0.30)" : "rgba(154, 82, 0, 0.25)" : colors.border;
|
|
1394
|
+
const defaultIcon = variant === "success" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: ms(16), color: accentColor }) : variant === "destructive" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.MaterialIcons, { name: "error-outline", size: ms(17), color: accentColor }) : variant === "warning" ? /* @__PURE__ */ React26__default.default.createElement(vectorIcons.MaterialIcons, { name: "warning-amber", size: ms(17), color: accentColor }) : (
|
|
1395
|
+
// AUDIT FIX: default variant previously used colors.primary (near-black)
|
|
1396
|
+
// as the info icon tint — ambiguous and heavy. accentResolved gives it
|
|
1397
|
+
// a meaningful chromatic signal when an accent is defined.
|
|
1398
|
+
/* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: ms(16), color: accentColor })
|
|
1399
|
+
);
|
|
1345
1400
|
const effectiveIcon = iconName ? renderIcon(iconName, ms(16), iconColor ?? accentColor) : icon ?? defaultIcon;
|
|
1346
|
-
return /* @__PURE__ */ React26__default.default.createElement(
|
|
1401
|
+
return /* @__PURE__ */ React26__default.default.createElement(
|
|
1402
|
+
reactNative.View,
|
|
1403
|
+
{
|
|
1404
|
+
style: [
|
|
1405
|
+
styles11.container,
|
|
1406
|
+
{ backgroundColor: bgColor, borderWidth: 1, borderColor },
|
|
1407
|
+
style
|
|
1408
|
+
]
|
|
1409
|
+
},
|
|
1410
|
+
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles11.iconSlot }, effectiveIcon),
|
|
1411
|
+
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles11.content }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles11.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles11.description, { color: colors.foreground, opacity: 0.85 }], allowFontScaling: true }, description) : null)
|
|
1412
|
+
);
|
|
1347
1413
|
}
|
|
1348
1414
|
var styles11 = reactNative.StyleSheet.create({
|
|
1349
1415
|
container: {
|
|
@@ -1351,8 +1417,8 @@ var styles11 = reactNative.StyleSheet.create({
|
|
|
1351
1417
|
alignItems: "flex-start",
|
|
1352
1418
|
borderRadius: RADIUS.lg,
|
|
1353
1419
|
gap: s(8),
|
|
1354
|
-
paddingVertical: vs(
|
|
1355
|
-
paddingHorizontal: s(
|
|
1420
|
+
paddingVertical: vs(10),
|
|
1421
|
+
paddingHorizontal: s(12)
|
|
1356
1422
|
},
|
|
1357
1423
|
iconSlot: {
|
|
1358
1424
|
marginTop: vs(1)
|
|
@@ -1362,14 +1428,12 @@ var styles11 = reactNative.StyleSheet.create({
|
|
|
1362
1428
|
gap: vs(2)
|
|
1363
1429
|
},
|
|
1364
1430
|
title: {
|
|
1365
|
-
fontFamily: "
|
|
1366
|
-
fontSize: ms(13)
|
|
1367
|
-
lineHeight: ms(19)
|
|
1431
|
+
fontFamily: "Sohne-Medium",
|
|
1432
|
+
fontSize: ms(13)
|
|
1368
1433
|
},
|
|
1369
1434
|
description: {
|
|
1370
|
-
fontFamily: "
|
|
1371
|
-
fontSize: ms(12)
|
|
1372
|
-
lineHeight: ms(17)
|
|
1435
|
+
fontFamily: "Sohne-Regular",
|
|
1436
|
+
fontSize: ms(12)
|
|
1373
1437
|
}
|
|
1374
1438
|
});
|
|
1375
1439
|
function Progress({ value = 0, max = 100, variant = "default", style, accessibilityLabel }) {
|
|
@@ -1481,7 +1545,7 @@ var styles13 = reactNative.StyleSheet.create({
|
|
|
1481
1545
|
marginTop: vs(16)
|
|
1482
1546
|
},
|
|
1483
1547
|
title: {
|
|
1484
|
-
fontFamily: "
|
|
1548
|
+
fontFamily: "Sohne-Medium",
|
|
1485
1549
|
fontSize: ms(18),
|
|
1486
1550
|
textAlign: "center"
|
|
1487
1551
|
},
|
|
@@ -1490,7 +1554,7 @@ var styles13 = reactNative.StyleSheet.create({
|
|
|
1490
1554
|
marginTop: vs(10)
|
|
1491
1555
|
},
|
|
1492
1556
|
description: {
|
|
1493
|
-
fontFamily: "
|
|
1557
|
+
fontFamily: "Sohne-Regular",
|
|
1494
1558
|
fontSize: ms(14),
|
|
1495
1559
|
lineHeight: mvs(20),
|
|
1496
1560
|
textAlign: "center"
|
|
@@ -1523,18 +1587,19 @@ function Textarea({
|
|
|
1523
1587
|
duration: focused ? TIMINGS.focusIn.duration : TIMINGS.focusOut.duration
|
|
1524
1588
|
});
|
|
1525
1589
|
const resolvedPrefixIcon = prefixIcon ? renderIcon(prefixIcon, ms(16), prefixIconColor ?? colors.foregroundMuted) : prefixIconNode;
|
|
1526
|
-
const
|
|
1527
|
-
borderColor: error ? colors.destructive : Animated9.interpolateColor(focusProgress.value, [0, 1], [colors.border, colors.primary])
|
|
1590
|
+
const borderAnimStyle = Animated9.useAnimatedStyle(() => ({
|
|
1591
|
+
borderColor: error ? colors.destructive : Animated9.interpolateColor(focusProgress.value, [0, 1], [colors.border, colors.primary]),
|
|
1592
|
+
borderWidth: error ? 2 : Animated9.interpolate(focusProgress.value, [0, 1], [1, 2])
|
|
1528
1593
|
}));
|
|
1529
1594
|
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles14.container, containerStyle] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles14.label, { color: colors.foreground }], allowFontScaling: true }, label) : null, /* @__PURE__ */ React26__default.default.createElement(
|
|
1530
1595
|
Animated9__default.default.View,
|
|
1531
1596
|
{
|
|
1532
1597
|
style: [
|
|
1533
1598
|
styles14.inputWrapper,
|
|
1534
|
-
{ backgroundColor: colors.background }
|
|
1535
|
-
borderColorStyle
|
|
1599
|
+
{ backgroundColor: colors.background }
|
|
1536
1600
|
]
|
|
1537
1601
|
},
|
|
1602
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles14.borderOverlay, borderAnimStyle], pointerEvents: "none" }),
|
|
1538
1603
|
resolvedPrefixIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles14.prefixIcon }, resolvedPrefixIcon) : null,
|
|
1539
1604
|
/* @__PURE__ */ React26__default.default.createElement(
|
|
1540
1605
|
reactNative.TextInput,
|
|
@@ -1580,32 +1645,37 @@ var styles14 = reactNative.StyleSheet.create({
|
|
|
1580
1645
|
gap: vs(4)
|
|
1581
1646
|
},
|
|
1582
1647
|
label: {
|
|
1583
|
-
fontFamily: "
|
|
1648
|
+
fontFamily: "Sohne-Medium",
|
|
1584
1649
|
fontSize: ms(13),
|
|
1585
1650
|
lineHeight: vs(18),
|
|
1586
1651
|
marginBottom: vs(2)
|
|
1587
1652
|
},
|
|
1588
1653
|
inputWrapper: {
|
|
1589
|
-
|
|
1654
|
+
// Border lives on borderOverlay (absolute); wrapper carries none so the
|
|
1655
|
+
// focus weight change never reflows content.
|
|
1590
1656
|
borderRadius: 8,
|
|
1591
1657
|
paddingHorizontal: s(14),
|
|
1592
1658
|
paddingVertical: vs(11),
|
|
1593
1659
|
gap: s(8)
|
|
1594
1660
|
},
|
|
1661
|
+
borderOverlay: {
|
|
1662
|
+
...reactNative.StyleSheet.absoluteFillObject,
|
|
1663
|
+
borderRadius: 8
|
|
1664
|
+
},
|
|
1595
1665
|
prefixIcon: {
|
|
1596
1666
|
alignItems: "flex-start",
|
|
1597
1667
|
justifyContent: "flex-start",
|
|
1598
1668
|
paddingTop: vs(2)
|
|
1599
1669
|
},
|
|
1600
1670
|
input: {
|
|
1601
|
-
fontFamily: "
|
|
1671
|
+
fontFamily: "Sohne-Regular",
|
|
1602
1672
|
fontSize: ms(14),
|
|
1603
1673
|
lineHeight: vs(22),
|
|
1604
1674
|
padding: 0,
|
|
1605
1675
|
margin: 0
|
|
1606
1676
|
},
|
|
1607
1677
|
helperText: {
|
|
1608
|
-
fontFamily: "
|
|
1678
|
+
fontFamily: "Sohne-Regular",
|
|
1609
1679
|
fontSize: ms(12),
|
|
1610
1680
|
lineHeight: vs(16),
|
|
1611
1681
|
marginTop: vs(4)
|
|
@@ -1632,38 +1702,37 @@ function Checkbox({
|
|
|
1632
1702
|
const checkStyle = Animated9.useAnimatedStyle(() => ({
|
|
1633
1703
|
opacity: Animated9.withTiming(checked ? 1 : 0, { duration: TIMINGS.state.duration, easing: EASINGS.standard })
|
|
1634
1704
|
}));
|
|
1635
|
-
return
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
onCheckedChange?.(!checked);
|
|
1642
|
-
},
|
|
1643
|
-
onPressIn,
|
|
1644
|
-
onPressOut,
|
|
1645
|
-
disabled,
|
|
1646
|
-
activeOpacity: 1,
|
|
1647
|
-
touchSoundDisabled: true,
|
|
1648
|
-
accessibilityRole: "checkbox",
|
|
1649
|
-
accessibilityLabel: accessibilityLabel ?? label,
|
|
1650
|
-
accessibilityState: { checked, disabled: !!disabled }
|
|
1651
|
-
},
|
|
1652
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1653
|
-
Animated9__default.default.View,
|
|
1654
|
-
{
|
|
1655
|
-
style: [styles15.box, { opacity: disabled ? 0.45 : 1 }, boxStyle]
|
|
1656
|
-
},
|
|
1657
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: checkStyle }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] }))
|
|
1658
|
-
)),
|
|
1659
|
-
label ? /* @__PURE__ */ React26__default.default.createElement(
|
|
1660
|
-
reactNative.Text,
|
|
1705
|
+
return (
|
|
1706
|
+
// AUDIT FIX: opacity was applied only to the box, leaving the label at full
|
|
1707
|
+
// opacity when disabled — a contradictory visual signal. Now the entire row
|
|
1708
|
+
// dims uniformly so label and control communicate the same disabled state.
|
|
1709
|
+
/* @__PURE__ */ React26__default.default.createElement(
|
|
1710
|
+
reactNative.TouchableOpacity,
|
|
1661
1711
|
{
|
|
1662
|
-
style: [styles15.
|
|
1663
|
-
|
|
1712
|
+
style: [styles15.row, disabled && styles15.rowDisabled, style],
|
|
1713
|
+
onPress: () => {
|
|
1714
|
+
selectionAsync();
|
|
1715
|
+
onCheckedChange?.(!checked);
|
|
1716
|
+
},
|
|
1717
|
+
onPressIn,
|
|
1718
|
+
onPressOut,
|
|
1719
|
+
disabled,
|
|
1720
|
+
activeOpacity: 1,
|
|
1721
|
+
touchSoundDisabled: true,
|
|
1722
|
+
accessibilityRole: "checkbox",
|
|
1723
|
+
accessibilityLabel: accessibilityLabel ?? label,
|
|
1724
|
+
accessibilityState: { checked, disabled: !!disabled }
|
|
1664
1725
|
},
|
|
1665
|
-
|
|
1666
|
-
|
|
1726
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles15.box, boxStyle] }, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: checkStyle }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles15.checkmark, { borderColor: colors.primaryForeground }] })))),
|
|
1727
|
+
label ? /* @__PURE__ */ React26__default.default.createElement(
|
|
1728
|
+
reactNative.Text,
|
|
1729
|
+
{
|
|
1730
|
+
style: [styles15.label, { color: colors.foreground }],
|
|
1731
|
+
allowFontScaling: true
|
|
1732
|
+
},
|
|
1733
|
+
label
|
|
1734
|
+
) : null
|
|
1735
|
+
)
|
|
1667
1736
|
);
|
|
1668
1737
|
}
|
|
1669
1738
|
var styles15 = reactNative.StyleSheet.create({
|
|
@@ -1672,6 +1741,10 @@ var styles15 = reactNative.StyleSheet.create({
|
|
|
1672
1741
|
alignItems: "center",
|
|
1673
1742
|
gap: s(12)
|
|
1674
1743
|
},
|
|
1744
|
+
// AUDIT FIX: was inline opacity on the box only
|
|
1745
|
+
rowDisabled: {
|
|
1746
|
+
opacity: 0.45
|
|
1747
|
+
},
|
|
1675
1748
|
box: {
|
|
1676
1749
|
width: s(24),
|
|
1677
1750
|
height: s(24),
|
|
@@ -1688,7 +1761,7 @@ var styles15 = reactNative.StyleSheet.create({
|
|
|
1688
1761
|
transform: [{ rotate: "-45deg" }, { translateY: -1 }]
|
|
1689
1762
|
},
|
|
1690
1763
|
label: {
|
|
1691
|
-
fontFamily: "
|
|
1764
|
+
fontFamily: "Sohne-Regular",
|
|
1692
1765
|
fontSize: ms(14),
|
|
1693
1766
|
lineHeight: mvs(20)
|
|
1694
1767
|
}
|
|
@@ -1715,13 +1788,21 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
1715
1788
|
[colors.surfaceStrong, colors.primary]
|
|
1716
1789
|
)
|
|
1717
1790
|
}));
|
|
1791
|
+
const trackBorderStyle = Animated9.useAnimatedStyle(() => ({
|
|
1792
|
+
borderWidth: 1.5,
|
|
1793
|
+
borderColor: Animated9.interpolateColor(
|
|
1794
|
+
progress.value,
|
|
1795
|
+
[0, 1],
|
|
1796
|
+
[colors.border, "transparent"]
|
|
1797
|
+
)
|
|
1798
|
+
}));
|
|
1718
1799
|
const checkIconStyle = Animated9.useAnimatedStyle(() => ({
|
|
1719
1800
|
opacity: Animated9.withTiming(checked ? 1 : 0, { duration: TIMINGS.state.duration, easing: EASINGS.standard })
|
|
1720
1801
|
}));
|
|
1721
1802
|
const crossIconStyle = Animated9.useAnimatedStyle(() => ({
|
|
1722
1803
|
opacity: Animated9.withTiming(checked ? 0 : 1, { duration: TIMINGS.state.duration, easing: EASINGS.standard })
|
|
1723
1804
|
}));
|
|
1724
|
-
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [{ opacity: disabled ? 0.45 : 1 }, style] }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1805
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [{ opacity: disabled ? 0.45 : 1, alignSelf: "flex-start" }, style] }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1725
1806
|
reactNative.TouchableOpacity,
|
|
1726
1807
|
{
|
|
1727
1808
|
onPress: () => {
|
|
@@ -1733,9 +1814,10 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
1733
1814
|
touchSoundDisabled: true,
|
|
1734
1815
|
accessibilityRole: "switch",
|
|
1735
1816
|
accessibilityLabel,
|
|
1736
|
-
accessibilityState: { checked, disabled: !!disabled }
|
|
1817
|
+
accessibilityState: { checked, disabled: !!disabled },
|
|
1818
|
+
style: styles16.touchable
|
|
1737
1819
|
},
|
|
1738
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles16.track, trackStyle] }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1820
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles16.track, trackStyle] }, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles16.trackBorder, trackBorderStyle], pointerEvents: "none" }), /* @__PURE__ */ React26__default.default.createElement(
|
|
1739
1821
|
Animated9__default.default.View,
|
|
1740
1822
|
{
|
|
1741
1823
|
style: [styles16.thumb, { backgroundColor: colors.primaryForeground }, thumbStyle]
|
|
@@ -1746,11 +1828,18 @@ function Switch({ checked = false, onCheckedChange, disabled, style, accessibili
|
|
|
1746
1828
|
));
|
|
1747
1829
|
}
|
|
1748
1830
|
var styles16 = reactNative.StyleSheet.create({
|
|
1831
|
+
touchable: {
|
|
1832
|
+
alignSelf: "flex-start"
|
|
1833
|
+
},
|
|
1749
1834
|
track: {
|
|
1750
1835
|
width: TRACK_WIDTH,
|
|
1751
1836
|
height: TRACK_HEIGHT,
|
|
1752
1837
|
borderRadius: TRACK_HEIGHT / 2
|
|
1753
1838
|
},
|
|
1839
|
+
trackBorder: {
|
|
1840
|
+
...reactNative.StyleSheet.absoluteFillObject,
|
|
1841
|
+
borderRadius: TRACK_HEIGHT / 2
|
|
1842
|
+
},
|
|
1754
1843
|
thumb: {
|
|
1755
1844
|
position: "absolute",
|
|
1756
1845
|
top: THUMB_OFFSET,
|
|
@@ -1767,9 +1856,28 @@ var styles16 = reactNative.StyleSheet.create({
|
|
|
1767
1856
|
justifyContent: "center"
|
|
1768
1857
|
},
|
|
1769
1858
|
iconWrapper: {
|
|
1770
|
-
position: "absolute"
|
|
1859
|
+
position: "absolute",
|
|
1860
|
+
alignItems: "center",
|
|
1861
|
+
justifyContent: "center"
|
|
1771
1862
|
}
|
|
1772
1863
|
});
|
|
1864
|
+
function ToggleIcon({ pressed, iconName, activeIconName, icon, activeIcon, iconColor, activeIconColor, iconSize, primaryColor, mutedColor }) {
|
|
1865
|
+
const renderProp = (prop) => {
|
|
1866
|
+
if (!prop) return null;
|
|
1867
|
+
if (typeof prop === "function") return prop(pressed);
|
|
1868
|
+
return prop;
|
|
1869
|
+
};
|
|
1870
|
+
if (pressed) {
|
|
1871
|
+
if (activeIconName) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? primaryColor));
|
|
1872
|
+
const active = renderProp(activeIcon);
|
|
1873
|
+
if (active) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, active);
|
|
1874
|
+
return /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: primaryColor });
|
|
1875
|
+
}
|
|
1876
|
+
if (iconName) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? mutedColor));
|
|
1877
|
+
const custom = renderProp(icon);
|
|
1878
|
+
if (custom) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, custom);
|
|
1879
|
+
return /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: mutedColor });
|
|
1880
|
+
}
|
|
1773
1881
|
var sizeStyles = {
|
|
1774
1882
|
sm: { paddingHorizontal: s(12), paddingVertical: vs(8), minWidth: s(40), minHeight: vs(40) },
|
|
1775
1883
|
md: { paddingHorizontal: s(16), paddingVertical: vs(12), minWidth: s(44), minHeight: vs(44) },
|
|
@@ -1808,23 +1916,6 @@ function Toggle({
|
|
|
1808
1916
|
color: Animated9.interpolateColor(progress.value, [0, 1], [colors.foreground, colors.primary])
|
|
1809
1917
|
}));
|
|
1810
1918
|
const iconSize = iconSizeMap2[size];
|
|
1811
|
-
const LeftIcon = () => {
|
|
1812
|
-
const renderProp = (prop) => {
|
|
1813
|
-
if (!prop) return null;
|
|
1814
|
-
if (typeof prop === "function") return prop(pressed);
|
|
1815
|
-
return prop;
|
|
1816
|
-
};
|
|
1817
|
-
if (pressed) {
|
|
1818
|
-
if (activeIconName) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, renderIcon(activeIconName, iconSize, activeIconColor ?? colors.primary));
|
|
1819
|
-
const active = renderProp(activeIcon);
|
|
1820
|
-
if (active) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, active);
|
|
1821
|
-
return /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "check-circle", size: iconSize, color: colors.primary });
|
|
1822
|
-
}
|
|
1823
|
-
if (iconName) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, renderIcon(iconName, iconSize, iconColor ?? colors.foregroundMuted));
|
|
1824
|
-
const custom = renderProp(icon);
|
|
1825
|
-
if (custom) return /* @__PURE__ */ React26__default.default.createElement(React26__default.default.Fragment, null, custom);
|
|
1826
|
-
return /* @__PURE__ */ React26__default.default.createElement(vectorIcons.FontAwesome5, { name: "circle", size: iconSize, color: colors.foregroundMuted });
|
|
1827
|
-
};
|
|
1828
1919
|
return /* @__PURE__ */ React26__default.default.createElement(
|
|
1829
1920
|
Animated9__default.default.View,
|
|
1830
1921
|
{
|
|
@@ -1858,7 +1949,21 @@ function Toggle({
|
|
|
1858
1949
|
surfaceStyle
|
|
1859
1950
|
]
|
|
1860
1951
|
},
|
|
1861
|
-
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles17.inner }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1952
|
+
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles17.inner }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1953
|
+
ToggleIcon,
|
|
1954
|
+
{
|
|
1955
|
+
pressed,
|
|
1956
|
+
iconName,
|
|
1957
|
+
activeIconName,
|
|
1958
|
+
icon,
|
|
1959
|
+
activeIcon,
|
|
1960
|
+
iconColor,
|
|
1961
|
+
activeIconColor,
|
|
1962
|
+
iconSize,
|
|
1963
|
+
primaryColor: colors.primary,
|
|
1964
|
+
mutedColor: colors.foregroundMuted
|
|
1965
|
+
}
|
|
1966
|
+
), label ? /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.Text, { style: [styles17.label, textStyle], allowFontScaling: true }, label) : null)
|
|
1862
1967
|
)
|
|
1863
1968
|
)
|
|
1864
1969
|
);
|
|
@@ -1877,7 +1982,7 @@ var styles17 = reactNative.StyleSheet.create({
|
|
|
1877
1982
|
opacity: 0.45
|
|
1878
1983
|
},
|
|
1879
1984
|
label: {
|
|
1880
|
-
fontFamily: "
|
|
1985
|
+
fontFamily: "Sohne-Medium",
|
|
1881
1986
|
fontSize: ms(14)
|
|
1882
1987
|
}
|
|
1883
1988
|
});
|
|
@@ -1903,46 +2008,38 @@ function RadioItem({
|
|
|
1903
2008
|
transform: [{ scale: dotScale.value }],
|
|
1904
2009
|
opacity: dotScale.value
|
|
1905
2010
|
}));
|
|
1906
|
-
return
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
onPress: () => {
|
|
1911
|
-
if (!option.disabled) {
|
|
1912
|
-
selectionAsync();
|
|
1913
|
-
onSelect();
|
|
1914
|
-
}
|
|
1915
|
-
},
|
|
1916
|
-
onPressIn,
|
|
1917
|
-
onPressOut,
|
|
1918
|
-
activeOpacity: 1,
|
|
1919
|
-
touchSoundDisabled: true,
|
|
1920
|
-
disabled: option.disabled,
|
|
1921
|
-
accessibilityRole: "radio",
|
|
1922
|
-
accessibilityLabel: option.label,
|
|
1923
|
-
accessibilityState: { checked: selected, disabled: !!option.disabled }
|
|
1924
|
-
},
|
|
1925
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React26__default.default.createElement(
|
|
1926
|
-
Animated9__default.default.View,
|
|
1927
|
-
{
|
|
1928
|
-
style: [
|
|
1929
|
-
styles18.radio,
|
|
1930
|
-
{ opacity: option.disabled ? 0.45 : 1 },
|
|
1931
|
-
radioStyle
|
|
1932
|
-
]
|
|
1933
|
-
},
|
|
1934
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles18.dot, { backgroundColor: colors.primary }, dotStyle] })
|
|
1935
|
-
)),
|
|
2011
|
+
return (
|
|
2012
|
+
// AUDIT FIX: opacity was applied only to the radio circle, leaving the label
|
|
2013
|
+
// at full opacity when disabled. The whole row now dims uniformly so users
|
|
2014
|
+
// get a single, consistent disabled signal across the entire item.
|
|
1936
2015
|
/* @__PURE__ */ React26__default.default.createElement(
|
|
1937
|
-
reactNative.
|
|
2016
|
+
reactNative.TouchableOpacity,
|
|
1938
2017
|
{
|
|
1939
|
-
style: [
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
2018
|
+
style: [styles18.row, option.disabled && styles18.rowDisabled],
|
|
2019
|
+
onPress: () => {
|
|
2020
|
+
if (!option.disabled) {
|
|
2021
|
+
selectionAsync();
|
|
2022
|
+
onSelect();
|
|
2023
|
+
}
|
|
2024
|
+
},
|
|
2025
|
+
onPressIn,
|
|
2026
|
+
onPressOut,
|
|
2027
|
+
activeOpacity: 1,
|
|
2028
|
+
touchSoundDisabled: true,
|
|
2029
|
+
disabled: option.disabled,
|
|
2030
|
+
accessibilityRole: "radio",
|
|
2031
|
+
accessibilityLabel: option.label,
|
|
2032
|
+
accessibilityState: { checked: selected, disabled: !!option.disabled }
|
|
1944
2033
|
},
|
|
1945
|
-
|
|
2034
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: scaleStyle }, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles18.radio, radioStyle] }, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles18.dot, { backgroundColor: colors.primary }, dotStyle] }))),
|
|
2035
|
+
/* @__PURE__ */ React26__default.default.createElement(
|
|
2036
|
+
reactNative.Text,
|
|
2037
|
+
{
|
|
2038
|
+
style: [styles18.label, { color: colors.foreground }],
|
|
2039
|
+
allowFontScaling: true
|
|
2040
|
+
},
|
|
2041
|
+
option.label
|
|
2042
|
+
)
|
|
1946
2043
|
)
|
|
1947
2044
|
);
|
|
1948
2045
|
}
|
|
@@ -1985,6 +2082,10 @@ var styles18 = reactNative.StyleSheet.create({
|
|
|
1985
2082
|
alignItems: "center",
|
|
1986
2083
|
gap: s(12)
|
|
1987
2084
|
},
|
|
2085
|
+
// AUDIT FIX: was opacity on the inner circle only
|
|
2086
|
+
rowDisabled: {
|
|
2087
|
+
opacity: 0.45
|
|
2088
|
+
},
|
|
1988
2089
|
radio: {
|
|
1989
2090
|
width: s(24),
|
|
1990
2091
|
height: s(24),
|
|
@@ -1999,7 +2100,7 @@ var styles18 = reactNative.StyleSheet.create({
|
|
|
1999
2100
|
borderRadius: s(5)
|
|
2000
2101
|
},
|
|
2001
2102
|
label: {
|
|
2002
|
-
fontFamily: "
|
|
2103
|
+
fontFamily: "Sohne-Regular",
|
|
2003
2104
|
fontSize: ms(14),
|
|
2004
2105
|
lineHeight: mvs(20)
|
|
2005
2106
|
}
|
|
@@ -2039,8 +2140,11 @@ function TabTrigger({
|
|
|
2039
2140
|
{
|
|
2040
2141
|
style: [
|
|
2041
2142
|
styles19.triggerLabel,
|
|
2042
|
-
|
|
2043
|
-
|
|
2143
|
+
// AUDIT FIX: active state now only changes color, never font metrics.
|
|
2144
|
+
// Previously: inactive=Regular, active=Medium (pill) or SemiBold+fontSize14 (underline)
|
|
2145
|
+
// The weight/size change caused measurable layout reflow every tab switch.
|
|
2146
|
+
// Solution: all labels render at SemiBold always; active = foreground, inactive = foregroundMuted.
|
|
2147
|
+
{ color: isActive ? colors.foreground : colors.foregroundMuted }
|
|
2044
2148
|
],
|
|
2045
2149
|
allowFontScaling: true
|
|
2046
2150
|
},
|
|
@@ -2056,7 +2160,7 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2056
2160
|
const pillX = Animated9.useSharedValue(0);
|
|
2057
2161
|
const pillWidth = Animated9.useSharedValue(0);
|
|
2058
2162
|
const initialised = React26.useRef(false);
|
|
2059
|
-
const animatePill = (tabValue, animate) => {
|
|
2163
|
+
const animatePill = React26.useCallback((tabValue, animate) => {
|
|
2060
2164
|
const layout = tabLayouts.current[tabValue];
|
|
2061
2165
|
if (!layout) return;
|
|
2062
2166
|
if (animate) {
|
|
@@ -2066,10 +2170,10 @@ function Tabs({ tabs, variant = "pill", value, onValueChange, children, style })
|
|
|
2066
2170
|
pillX.value = layout.x;
|
|
2067
2171
|
pillWidth.value = layout.width;
|
|
2068
2172
|
}
|
|
2069
|
-
};
|
|
2173
|
+
}, [pillX, pillWidth]);
|
|
2070
2174
|
React26.useEffect(() => {
|
|
2071
2175
|
if (initialised.current) animatePill(active, true);
|
|
2072
|
-
}, [active]);
|
|
2176
|
+
}, [active, animatePill]);
|
|
2073
2177
|
const handlePress = (v) => {
|
|
2074
2178
|
selectionAsync();
|
|
2075
2179
|
if (!value) setInternal(v);
|
|
@@ -2142,6 +2246,8 @@ var styles19 = reactNative.StyleSheet.create({
|
|
|
2142
2246
|
},
|
|
2143
2247
|
listUnderline: {
|
|
2144
2248
|
flexDirection: "row",
|
|
2249
|
+
// AUDIT FIX: was missing borderBottomColor — the 1px hairline would render
|
|
2250
|
+
// as transparent on some platforms. Explicit token reference ensures visibility.
|
|
2145
2251
|
borderBottomWidth: 1
|
|
2146
2252
|
},
|
|
2147
2253
|
pill: {},
|
|
@@ -2168,16 +2274,14 @@ var styles19 = reactNative.StyleSheet.create({
|
|
|
2168
2274
|
justifyContent: "center",
|
|
2169
2275
|
gap: s(4)
|
|
2170
2276
|
},
|
|
2277
|
+
// AUDIT FIX: was Sohne-Regular at rest, Sohne-Medium/SemiBold when active.
|
|
2278
|
+
// Font-weight changes at runtime cause advance-width shifts → the tab bar would
|
|
2279
|
+
// visibly jump/reflow on every selection. Now always SemiBold; active state
|
|
2280
|
+
// is communicated by color alone (foreground vs foregroundMuted). The pill
|
|
2281
|
+
// indicator provides additional active signal without text layout side-effects.
|
|
2171
2282
|
triggerLabel: {
|
|
2172
|
-
fontFamily: "
|
|
2283
|
+
fontFamily: "Sohne-SemiBold",
|
|
2173
2284
|
fontSize: ms(13)
|
|
2174
|
-
},
|
|
2175
|
-
activeTriggerLabel: {
|
|
2176
|
-
fontFamily: "Poppins-Medium"
|
|
2177
|
-
},
|
|
2178
|
-
activeTriggerLabelUnderline: {
|
|
2179
|
-
fontFamily: "Poppins-SemiBold",
|
|
2180
|
-
fontSize: ms(14)
|
|
2181
2285
|
}
|
|
2182
2286
|
});
|
|
2183
2287
|
function AccordionItemComponent({
|
|
@@ -2191,7 +2295,7 @@ function AccordionItemComponent({
|
|
|
2191
2295
|
const height = Animated9.useSharedValue(0);
|
|
2192
2296
|
React26__default.default.useEffect(() => {
|
|
2193
2297
|
isExpanded.value = isOpen;
|
|
2194
|
-
}, [isOpen]);
|
|
2298
|
+
}, [isOpen, isExpanded]);
|
|
2195
2299
|
const derivedHeight = Animated9.useDerivedValue(
|
|
2196
2300
|
() => Animated9.withTiming(height.value * Number(isExpanded.value), {
|
|
2197
2301
|
duration: isExpanded.value ? TIMINGS.expand.duration : TIMINGS.collapse.duration,
|
|
@@ -2287,7 +2391,7 @@ var styles20 = reactNative.StyleSheet.create({
|
|
|
2287
2391
|
justifyContent: "center"
|
|
2288
2392
|
},
|
|
2289
2393
|
triggerText: {
|
|
2290
|
-
fontFamily: "
|
|
2394
|
+
fontFamily: "Sohne-Medium",
|
|
2291
2395
|
fontSize: ms(14)
|
|
2292
2396
|
},
|
|
2293
2397
|
chevron: {
|
|
@@ -2296,7 +2400,7 @@ var styles20 = reactNative.StyleSheet.create({
|
|
|
2296
2400
|
// position:'absolute' is the key — the inner View escapes the animated wrapper's
|
|
2297
2401
|
// clipped height so onLayout always reports the true content height.
|
|
2298
2402
|
content: {
|
|
2299
|
-
paddingHorizontal: s(
|
|
2403
|
+
paddingHorizontal: s(8),
|
|
2300
2404
|
paddingBottom: vs(12),
|
|
2301
2405
|
position: "absolute",
|
|
2302
2406
|
width: "100%"
|
|
@@ -2368,11 +2472,11 @@ var styles21 = reactNative.StyleSheet.create({
|
|
|
2368
2472
|
alignItems: "center"
|
|
2369
2473
|
},
|
|
2370
2474
|
label: {
|
|
2371
|
-
fontFamily: "
|
|
2475
|
+
fontFamily: "Sohne-Medium",
|
|
2372
2476
|
fontSize: ms(15)
|
|
2373
2477
|
},
|
|
2374
2478
|
valueText: {
|
|
2375
|
-
fontFamily: "
|
|
2479
|
+
fontFamily: "Sohne-Medium",
|
|
2376
2480
|
fontSize: ms(14)
|
|
2377
2481
|
},
|
|
2378
2482
|
slider: {
|
|
@@ -2386,6 +2490,16 @@ var styles21 = reactNative.StyleSheet.create({
|
|
|
2386
2490
|
var SCREEN_HEIGHT = reactNative.Dimensions.get("window").height;
|
|
2387
2491
|
var DEFAULT_MAX_HEIGHT = SCREEN_HEIGHT * 0.85;
|
|
2388
2492
|
var isAndroid = reactNative.Platform.OS === "android";
|
|
2493
|
+
function SheetHeader({ children, style }) {
|
|
2494
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles22.header, style] }, children);
|
|
2495
|
+
}
|
|
2496
|
+
function SheetContent({ children, style }) {
|
|
2497
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles22.sheetContent, style] }, children);
|
|
2498
|
+
}
|
|
2499
|
+
function SheetFooter({ children, style }) {
|
|
2500
|
+
const { colors } = useTheme();
|
|
2501
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles22.sheetFooter, { backgroundColor: colors.card, borderTopColor: colors.border }, style] }, children);
|
|
2502
|
+
}
|
|
2389
2503
|
function Sheet({
|
|
2390
2504
|
open,
|
|
2391
2505
|
onClose,
|
|
@@ -2426,13 +2540,16 @@ function Sheet({
|
|
|
2426
2540
|
pressBehavior: "close"
|
|
2427
2541
|
}
|
|
2428
2542
|
), []);
|
|
2429
|
-
const
|
|
2430
|
-
|
|
2431
|
-
|
|
2432
|
-
|
|
2543
|
+
const childArray = React26__default.default.Children.toArray(children);
|
|
2544
|
+
const customHeader = childArray.find((child) => React26__default.default.isValidElement(child) && child.type === SheetHeader);
|
|
2545
|
+
const customContent = childArray.find((child) => React26__default.default.isValidElement(child) && child.type === SheetContent);
|
|
2546
|
+
const customFooter = childArray.find((child) => React26__default.default.isValidElement(child) && child.type === SheetFooter);
|
|
2547
|
+
const filteredChildren = customHeader || customContent || customFooter ? childArray.filter(
|
|
2548
|
+
(child) => !React26__default.default.isValidElement(child) || child.type !== SheetHeader && child.type !== SheetContent && child.type !== SheetFooter
|
|
2549
|
+
) : children;
|
|
2433
2550
|
const effectiveSubtitle = subtitle ?? description;
|
|
2434
|
-
const showHeader = !!(title || effectiveSubtitle || showCloseButton);
|
|
2435
|
-
const headerNode = showHeader ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles22.header, accessibilityRole: "header" }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles22.headerRow }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: { flex: 1 } }), showCloseButton ? /* @__PURE__ */ React26__default.default.createElement(
|
|
2551
|
+
const showHeader = !!(title || effectiveSubtitle || showCloseButton) && !customHeader;
|
|
2552
|
+
const headerNode = customHeader ? customHeader : showHeader ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles22.header, accessibilityRole: "header" }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles22.headerRow }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles22.title, { color: colors.foreground }], allowFontScaling: true }, title) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: { flex: 1 } }), showCloseButton ? /* @__PURE__ */ React26__default.default.createElement(
|
|
2436
2553
|
reactNative.TouchableOpacity,
|
|
2437
2554
|
{
|
|
2438
2555
|
onPress: onClose,
|
|
@@ -2445,6 +2562,12 @@ function Sheet({
|
|
|
2445
2562
|
},
|
|
2446
2563
|
/* @__PURE__ */ React26__default.default.createElement(vectorIcons.AntDesign, { name: "close", size: ms(18), color: colors.foregroundMuted })
|
|
2447
2564
|
) : null), effectiveSubtitle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles22.subtitle, { color: colors.foregroundMuted }], allowFontScaling: true }, effectiveSubtitle) : null) : null;
|
|
2565
|
+
const contentNode = customContent ? customContent : filteredChildren;
|
|
2566
|
+
const effectiveFooter = customFooter ? customFooter : footer;
|
|
2567
|
+
const renderFooter = React26.useCallback((props) => {
|
|
2568
|
+
if (!effectiveFooter) return null;
|
|
2569
|
+
return /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetFooter, { ...props }, effectiveFooter);
|
|
2570
|
+
}, [effectiveFooter]);
|
|
2448
2571
|
const useScroll = scrollable || !!maxHeight;
|
|
2449
2572
|
const effectiveMaxHeight = maxHeight ?? DEFAULT_MAX_HEIGHT;
|
|
2450
2573
|
const useDynamicSizing = !snapPoints;
|
|
@@ -2457,7 +2580,7 @@ function Sheet({
|
|
|
2457
2580
|
maxDynamicContentSize: useDynamicSizing ? effectiveMaxHeight : void 0,
|
|
2458
2581
|
onDismiss: onClose,
|
|
2459
2582
|
backdropComponent: renderBackdrop,
|
|
2460
|
-
footerComponent:
|
|
2583
|
+
footerComponent: effectiveFooter ? renderFooter : void 0,
|
|
2461
2584
|
backgroundStyle: [styles22.background, { backgroundColor: colors.card }],
|
|
2462
2585
|
handleIndicatorStyle: [styles22.handle, { backgroundColor: colors.border }],
|
|
2463
2586
|
enablePanDownToClose: true,
|
|
@@ -2480,10 +2603,13 @@ function Sheet({
|
|
|
2480
2603
|
persistentScrollbar: isAndroid
|
|
2481
2604
|
},
|
|
2482
2605
|
headerNode,
|
|
2483
|
-
|
|
2484
|
-
) : /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles22.content, contentStyle, style] }, headerNode,
|
|
2606
|
+
contentNode
|
|
2607
|
+
) : /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles22.content, contentStyle, style] }, headerNode, contentNode)
|
|
2485
2608
|
);
|
|
2486
2609
|
}
|
|
2610
|
+
Sheet.Header = SheetHeader;
|
|
2611
|
+
Sheet.Content = SheetContent;
|
|
2612
|
+
Sheet.Footer = SheetFooter;
|
|
2487
2613
|
var styles22 = reactNative.StyleSheet.create({
|
|
2488
2614
|
background: {
|
|
2489
2615
|
borderTopLeftRadius: ms(16),
|
|
@@ -2506,12 +2632,12 @@ var styles22 = reactNative.StyleSheet.create({
|
|
|
2506
2632
|
justifyContent: "space-between"
|
|
2507
2633
|
},
|
|
2508
2634
|
title: {
|
|
2509
|
-
fontFamily: "
|
|
2635
|
+
fontFamily: "Sohne-SemiBold",
|
|
2510
2636
|
fontSize: ms(18),
|
|
2511
2637
|
flex: 1
|
|
2512
2638
|
},
|
|
2513
2639
|
subtitle: {
|
|
2514
|
-
fontFamily: "
|
|
2640
|
+
fontFamily: "Sohne-Regular",
|
|
2515
2641
|
fontSize: ms(14),
|
|
2516
2642
|
lineHeight: mvs(20)
|
|
2517
2643
|
},
|
|
@@ -2527,6 +2653,16 @@ var styles22 = reactNative.StyleSheet.create({
|
|
|
2527
2653
|
paddingHorizontal: s(16),
|
|
2528
2654
|
paddingBottom: vs(32),
|
|
2529
2655
|
paddingRight: s(16)
|
|
2656
|
+
},
|
|
2657
|
+
sheetContent: {
|
|
2658
|
+
gap: vs(16)
|
|
2659
|
+
},
|
|
2660
|
+
sheetFooter: {
|
|
2661
|
+
paddingHorizontal: s(16),
|
|
2662
|
+
paddingVertical: vs(16),
|
|
2663
|
+
borderTopWidth: 1,
|
|
2664
|
+
flexDirection: "row",
|
|
2665
|
+
gap: s(12)
|
|
2530
2666
|
}
|
|
2531
2667
|
});
|
|
2532
2668
|
var isIOS = reactNative.Platform.OS === "ios";
|
|
@@ -2559,7 +2695,7 @@ function Select({
|
|
|
2559
2695
|
setPendingValue(value);
|
|
2560
2696
|
setPickerVisible(true);
|
|
2561
2697
|
} else if (isAndroid2) {
|
|
2562
|
-
pickerRef.current?.focus();
|
|
2698
|
+
pickerRef.current?.focus?.();
|
|
2563
2699
|
}
|
|
2564
2700
|
};
|
|
2565
2701
|
const handleDismiss = () => {
|
|
@@ -2696,7 +2832,7 @@ var styles23 = reactNative.StyleSheet.create({
|
|
|
2696
2832
|
gap: vs(8)
|
|
2697
2833
|
},
|
|
2698
2834
|
label: {
|
|
2699
|
-
fontFamily: "
|
|
2835
|
+
fontFamily: "Sohne-Medium",
|
|
2700
2836
|
fontSize: ms(13)
|
|
2701
2837
|
},
|
|
2702
2838
|
trigger: {
|
|
@@ -2709,7 +2845,7 @@ var styles23 = reactNative.StyleSheet.create({
|
|
|
2709
2845
|
paddingVertical: vs(11)
|
|
2710
2846
|
},
|
|
2711
2847
|
triggerText: {
|
|
2712
|
-
fontFamily: "
|
|
2848
|
+
fontFamily: "Sohne-Regular",
|
|
2713
2849
|
fontSize: ms(15),
|
|
2714
2850
|
flex: 1
|
|
2715
2851
|
},
|
|
@@ -2717,7 +2853,7 @@ var styles23 = reactNative.StyleSheet.create({
|
|
|
2717
2853
|
marginLeft: s(8)
|
|
2718
2854
|
},
|
|
2719
2855
|
helperText: {
|
|
2720
|
-
fontFamily: "
|
|
2856
|
+
fontFamily: "Sohne-Regular",
|
|
2721
2857
|
fontSize: ms(13)
|
|
2722
2858
|
},
|
|
2723
2859
|
iosBackdrop: {
|
|
@@ -2738,14 +2874,14 @@ var styles23 = reactNative.StyleSheet.create({
|
|
|
2738
2874
|
borderBottomWidth: 1
|
|
2739
2875
|
},
|
|
2740
2876
|
iosToolbarTitle: {
|
|
2741
|
-
fontFamily: "
|
|
2877
|
+
fontFamily: "Sohne-SemiBold",
|
|
2742
2878
|
fontSize: ms(17)
|
|
2743
2879
|
},
|
|
2744
2880
|
iosDoneBtn: {
|
|
2745
2881
|
padding: s(4)
|
|
2746
2882
|
},
|
|
2747
2883
|
iosDoneBtnText: {
|
|
2748
|
-
fontFamily: "
|
|
2884
|
+
fontFamily: "Sohne-SemiBold",
|
|
2749
2885
|
fontSize: ms(17)
|
|
2750
2886
|
},
|
|
2751
2887
|
androidHiddenPicker: {
|
|
@@ -2775,7 +2911,7 @@ function ToastProvider({ children }) {
|
|
|
2775
2911
|
{
|
|
2776
2912
|
theme: colorScheme,
|
|
2777
2913
|
position: "top-center",
|
|
2778
|
-
richColors:
|
|
2914
|
+
richColors: true,
|
|
2779
2915
|
gap: vs(8),
|
|
2780
2916
|
offset: insets.top + vs(8),
|
|
2781
2917
|
visibleToasts: 3,
|
|
@@ -2789,11 +2925,11 @@ function ToastProvider({ children }) {
|
|
|
2789
2925
|
paddingVertical: vs(10)
|
|
2790
2926
|
},
|
|
2791
2927
|
titleStyle: {
|
|
2792
|
-
fontFamily: "
|
|
2928
|
+
fontFamily: "Sohne-Medium",
|
|
2793
2929
|
fontSize: ms(13)
|
|
2794
2930
|
},
|
|
2795
2931
|
descriptionStyle: {
|
|
2796
|
-
fontFamily: "
|
|
2932
|
+
fontFamily: "Sohne-Regular",
|
|
2797
2933
|
fontSize: ms(12),
|
|
2798
2934
|
opacity: 0.85
|
|
2799
2935
|
}
|
|
@@ -2831,7 +2967,7 @@ function CurrencyInput({
|
|
|
2831
2967
|
const raw = parseFloat(formatted.replace(separatorRegex, "") || "0");
|
|
2832
2968
|
onChangeValue?.(isNaN(raw) ? 0 : raw);
|
|
2833
2969
|
};
|
|
2834
|
-
const inputStyle = size === "large" ? { fontFamily: "
|
|
2970
|
+
const inputStyle = size === "large" ? { fontFamily: "Sohne-Regular", fontSize: ms(36) } : { fontFamily: "Sohne-Regular" };
|
|
2835
2971
|
const dollarIcon = renderIcon("dollar-sign", size === "large" ? 24 : 16, colors.foregroundMuted);
|
|
2836
2972
|
const displayValue = value && prefix && value.startsWith(prefix) ? value.slice(prefix.length) : value;
|
|
2837
2973
|
return /* @__PURE__ */ React26__default.default.createElement(
|
|
@@ -2876,7 +3012,7 @@ function formatValue(value, prefix, showDecimals) {
|
|
|
2876
3012
|
}
|
|
2877
3013
|
return `${sign}${prefix}${intPart}`;
|
|
2878
3014
|
}
|
|
2879
|
-
function
|
|
3015
|
+
function CurrencyDisplayBase({ value, prefix = "$", showDecimals = false, textColor, variant, autoScale, maxFontSize, style }) {
|
|
2880
3016
|
const { colors } = useTheme();
|
|
2881
3017
|
const formatted = formatValue(value, prefix, showDecimals);
|
|
2882
3018
|
const baseFontSize = variant ? variantFontSize[variant] : ms(56);
|
|
@@ -2894,17 +3030,18 @@ function CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor,
|
|
|
2894
3030
|
formatted
|
|
2895
3031
|
));
|
|
2896
3032
|
}
|
|
3033
|
+
var CurrencyDisplay = React26__default.default.memo(CurrencyDisplayBase);
|
|
2897
3034
|
var styles24 = reactNative.StyleSheet.create({
|
|
2898
3035
|
container: {
|
|
2899
3036
|
alignSelf: "flex-start"
|
|
2900
3037
|
},
|
|
2901
3038
|
amount: {
|
|
2902
|
-
fontFamily: "
|
|
3039
|
+
fontFamily: "Sohne-Bold",
|
|
2903
3040
|
includeFontPadding: false,
|
|
2904
3041
|
textAlignVertical: "top"
|
|
2905
3042
|
}
|
|
2906
3043
|
});
|
|
2907
|
-
function
|
|
3044
|
+
function ListItemBase({
|
|
2908
3045
|
leftRender,
|
|
2909
3046
|
rightRender,
|
|
2910
3047
|
trailing,
|
|
@@ -3005,19 +3142,17 @@ function ListItem({
|
|
|
3005
3142
|
{
|
|
3006
3143
|
style: [
|
|
3007
3144
|
styles25.separator,
|
|
3008
|
-
{
|
|
3009
|
-
backgroundColor: colors.border,
|
|
3010
|
-
marginLeft: effectiveLeft ? s(44) + s(12) : 0
|
|
3011
|
-
}
|
|
3145
|
+
{ backgroundColor: colors.separator }
|
|
3012
3146
|
]
|
|
3013
3147
|
}
|
|
3014
3148
|
) : null);
|
|
3015
3149
|
}
|
|
3150
|
+
var ListItem = React26__default.default.memo(ListItemBase);
|
|
3016
3151
|
var styles25 = reactNative.StyleSheet.create({
|
|
3017
3152
|
container: {
|
|
3018
3153
|
flexDirection: "row",
|
|
3019
3154
|
alignItems: "center",
|
|
3020
|
-
paddingHorizontal:
|
|
3155
|
+
paddingHorizontal: s(16),
|
|
3021
3156
|
paddingVertical: vs(10),
|
|
3022
3157
|
gap: s(12)
|
|
3023
3158
|
},
|
|
@@ -3033,17 +3168,17 @@ var styles25 = reactNative.StyleSheet.create({
|
|
|
3033
3168
|
gap: vs(4)
|
|
3034
3169
|
},
|
|
3035
3170
|
title: {
|
|
3036
|
-
fontFamily: "
|
|
3171
|
+
fontFamily: "Sohne-Medium",
|
|
3037
3172
|
fontSize: ms(15),
|
|
3038
3173
|
lineHeight: mvs(22)
|
|
3039
3174
|
},
|
|
3040
3175
|
subtitle: {
|
|
3041
|
-
fontFamily: "
|
|
3176
|
+
fontFamily: "Sohne-Regular",
|
|
3042
3177
|
fontSize: ms(13),
|
|
3043
3178
|
lineHeight: mvs(18)
|
|
3044
3179
|
},
|
|
3045
3180
|
caption: {
|
|
3046
|
-
fontFamily: "
|
|
3181
|
+
fontFamily: "Sohne-Regular",
|
|
3047
3182
|
fontSize: ms(12),
|
|
3048
3183
|
lineHeight: mvs(16),
|
|
3049
3184
|
opacity: 0.7
|
|
@@ -3055,7 +3190,7 @@ var styles25 = reactNative.StyleSheet.create({
|
|
|
3055
3190
|
maxWidth: s(160)
|
|
3056
3191
|
},
|
|
3057
3192
|
rightText: {
|
|
3058
|
-
fontFamily: "
|
|
3193
|
+
fontFamily: "Sohne-Regular",
|
|
3059
3194
|
fontSize: ms(14)
|
|
3060
3195
|
},
|
|
3061
3196
|
separator: {
|
|
@@ -3066,7 +3201,81 @@ var styles25 = reactNative.StyleSheet.create({
|
|
|
3066
3201
|
opacity: 0.45
|
|
3067
3202
|
}
|
|
3068
3203
|
});
|
|
3069
|
-
function
|
|
3204
|
+
function ListGroup({ children, variant = "plain", style }) {
|
|
3205
|
+
const { colors } = useTheme();
|
|
3206
|
+
const processedChildren = React26__default.default.Children.map(children, (child, index) => {
|
|
3207
|
+
if (!React26__default.default.isValidElement(child)) return child;
|
|
3208
|
+
if (child.type === ListGroupHeader || child.type === ListGroupFooter) {
|
|
3209
|
+
return child;
|
|
3210
|
+
}
|
|
3211
|
+
const childProps = child.props;
|
|
3212
|
+
const isListItem = "title" in childProps;
|
|
3213
|
+
if (!isListItem) return child;
|
|
3214
|
+
const isLast = index === React26__default.default.Children.count(children) - 1;
|
|
3215
|
+
if (childProps["showSeparator"] === void 0 && !isLast) {
|
|
3216
|
+
return React26__default.default.cloneElement(child, {
|
|
3217
|
+
showSeparator: true
|
|
3218
|
+
});
|
|
3219
|
+
}
|
|
3220
|
+
return child;
|
|
3221
|
+
});
|
|
3222
|
+
const cardStyle = variant === "card" ? {
|
|
3223
|
+
backgroundColor: colors.card,
|
|
3224
|
+
borderRadius: RADIUS.md,
|
|
3225
|
+
borderWidth: 1,
|
|
3226
|
+
borderColor: colors.border,
|
|
3227
|
+
shadowColor: "#000",
|
|
3228
|
+
shadowOffset: { width: 0, height: 2 },
|
|
3229
|
+
shadowOpacity: 0.06,
|
|
3230
|
+
shadowRadius: 6,
|
|
3231
|
+
elevation: 2,
|
|
3232
|
+
paddingVertical: vs(4)
|
|
3233
|
+
} : {};
|
|
3234
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles26.container, cardStyle, style] }, processedChildren);
|
|
3235
|
+
}
|
|
3236
|
+
function ListGroupHeader({ children, style }) {
|
|
3237
|
+
const { colors } = useTheme();
|
|
3238
|
+
if (typeof children === "string") {
|
|
3239
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles26.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3240
|
+
}
|
|
3241
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles26.header, { borderBottomColor: colors.separator }, style] }, children);
|
|
3242
|
+
}
|
|
3243
|
+
function ListGroupFooter({ children, style }) {
|
|
3244
|
+
const { colors } = useTheme();
|
|
3245
|
+
if (typeof children === "string") {
|
|
3246
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles26.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3247
|
+
}
|
|
3248
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles26.footer, style] }, children);
|
|
3249
|
+
}
|
|
3250
|
+
ListGroup.Header = ListGroupHeader;
|
|
3251
|
+
ListGroup.Footer = ListGroupFooter;
|
|
3252
|
+
var styles26 = reactNative.StyleSheet.create({
|
|
3253
|
+
container: {
|
|
3254
|
+
overflow: "hidden"
|
|
3255
|
+
},
|
|
3256
|
+
header: {
|
|
3257
|
+
paddingHorizontal: s(16),
|
|
3258
|
+
paddingTop: vs(12),
|
|
3259
|
+
paddingBottom: vs(8),
|
|
3260
|
+
borderBottomWidth: reactNative.StyleSheet.hairlineWidth
|
|
3261
|
+
},
|
|
3262
|
+
headerText: {
|
|
3263
|
+
fontFamily: "Sohne-SemiBold",
|
|
3264
|
+
fontSize: 13,
|
|
3265
|
+
letterSpacing: 0.32,
|
|
3266
|
+
textTransform: "uppercase"
|
|
3267
|
+
},
|
|
3268
|
+
footer: {
|
|
3269
|
+
paddingHorizontal: s(16),
|
|
3270
|
+
paddingTop: vs(8),
|
|
3271
|
+
paddingBottom: vs(12)
|
|
3272
|
+
},
|
|
3273
|
+
footerText: {
|
|
3274
|
+
fontFamily: "Sohne-Regular",
|
|
3275
|
+
fontSize: 12
|
|
3276
|
+
}
|
|
3277
|
+
});
|
|
3278
|
+
function MenuItemBase({
|
|
3070
3279
|
label,
|
|
3071
3280
|
subtitle,
|
|
3072
3281
|
iconName,
|
|
@@ -3106,10 +3315,10 @@ function MenuItem({
|
|
|
3106
3315
|
elevation: 2
|
|
3107
3316
|
} : {};
|
|
3108
3317
|
const a11yLabel = accessibilityLabel ?? (subtitle ? `${label}. ${subtitle}` : label);
|
|
3109
|
-
return /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [animatedStyle, disabled &&
|
|
3318
|
+
return /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [animatedStyle, disabled && styles27.disabled], ...hoverHandlers }, /* @__PURE__ */ React26__default.default.createElement(
|
|
3110
3319
|
reactNative.TouchableOpacity,
|
|
3111
3320
|
{
|
|
3112
|
-
style: [
|
|
3321
|
+
style: [styles27.container, cardStyle, style],
|
|
3113
3322
|
onPress: handlePress,
|
|
3114
3323
|
onPressIn,
|
|
3115
3324
|
onPressOut,
|
|
@@ -3120,11 +3329,11 @@ function MenuItem({
|
|
|
3120
3329
|
accessibilityLabel: a11yLabel,
|
|
3121
3330
|
accessibilityState: { disabled }
|
|
3122
3331
|
},
|
|
3123
|
-
resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style:
|
|
3124
|
-
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style:
|
|
3332
|
+
resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles27.iconContainer }, resolvedIcon) : null,
|
|
3333
|
+
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles27.labelContainer }, /* @__PURE__ */ React26__default.default.createElement(
|
|
3125
3334
|
reactNative.Text,
|
|
3126
3335
|
{
|
|
3127
|
-
style: [
|
|
3336
|
+
style: [styles27.label, { color: colors.foreground }, labelStyle],
|
|
3128
3337
|
numberOfLines: 1,
|
|
3129
3338
|
allowFontScaling: true
|
|
3130
3339
|
},
|
|
@@ -3132,7 +3341,7 @@ function MenuItem({
|
|
|
3132
3341
|
), subtitle ? /* @__PURE__ */ React26__default.default.createElement(
|
|
3133
3342
|
reactNative.Text,
|
|
3134
3343
|
{
|
|
3135
|
-
style: [
|
|
3344
|
+
style: [styles27.subtitle, { color: colors.foregroundMuted }],
|
|
3136
3345
|
numberOfLines: 1,
|
|
3137
3346
|
allowFontScaling: true
|
|
3138
3347
|
},
|
|
@@ -3141,7 +3350,7 @@ function MenuItem({
|
|
|
3141
3350
|
rightRender !== void 0 ? /* @__PURE__ */ React26__default.default.createElement(
|
|
3142
3351
|
reactNative.View,
|
|
3143
3352
|
{
|
|
3144
|
-
style:
|
|
3353
|
+
style: styles27.rightContainer,
|
|
3145
3354
|
onStartShouldSetResponder: () => true,
|
|
3146
3355
|
onResponderRelease: () => {
|
|
3147
3356
|
}
|
|
@@ -3152,21 +3361,18 @@ function MenuItem({
|
|
|
3152
3361
|
reactNative.View,
|
|
3153
3362
|
{
|
|
3154
3363
|
style: [
|
|
3155
|
-
|
|
3156
|
-
{
|
|
3157
|
-
backgroundColor: colors.border,
|
|
3158
|
-
marginLeft: resolvedIcon ? s(22) + s(12) : 0,
|
|
3159
|
-
opacity: 0.6
|
|
3160
|
-
}
|
|
3364
|
+
styles27.separator,
|
|
3365
|
+
{ backgroundColor: colors.separator }
|
|
3161
3366
|
]
|
|
3162
3367
|
}
|
|
3163
3368
|
) : null);
|
|
3164
3369
|
}
|
|
3165
|
-
var
|
|
3370
|
+
var MenuItem = React26__default.default.memo(MenuItemBase);
|
|
3371
|
+
var styles27 = reactNative.StyleSheet.create({
|
|
3166
3372
|
container: {
|
|
3167
3373
|
flexDirection: "row",
|
|
3168
3374
|
alignItems: "center",
|
|
3169
|
-
paddingHorizontal:
|
|
3375
|
+
paddingHorizontal: s(16),
|
|
3170
3376
|
paddingVertical: vs(16),
|
|
3171
3377
|
minHeight: vs(54),
|
|
3172
3378
|
gap: s(12)
|
|
@@ -3182,11 +3388,11 @@ var styles26 = reactNative.StyleSheet.create({
|
|
|
3182
3388
|
justifyContent: "center"
|
|
3183
3389
|
},
|
|
3184
3390
|
label: {
|
|
3185
|
-
fontFamily: "
|
|
3391
|
+
fontFamily: "Sohne-Medium",
|
|
3186
3392
|
fontSize: ms(15)
|
|
3187
3393
|
},
|
|
3188
3394
|
subtitle: {
|
|
3189
|
-
fontFamily: "
|
|
3395
|
+
fontFamily: "Sohne-Regular",
|
|
3190
3396
|
fontSize: ms(12),
|
|
3191
3397
|
marginTop: vs(1)
|
|
3192
3398
|
},
|
|
@@ -3203,7 +3409,81 @@ var styles26 = reactNative.StyleSheet.create({
|
|
|
3203
3409
|
opacity: 0.45
|
|
3204
3410
|
}
|
|
3205
3411
|
});
|
|
3206
|
-
function
|
|
3412
|
+
function MenuGroup({ children, variant = "plain", style }) {
|
|
3413
|
+
const { colors } = useTheme();
|
|
3414
|
+
const processedChildren = React26__default.default.Children.map(children, (child, index) => {
|
|
3415
|
+
if (!React26__default.default.isValidElement(child)) return child;
|
|
3416
|
+
if (child.type === MenuGroupHeader || child.type === MenuGroupFooter) {
|
|
3417
|
+
return child;
|
|
3418
|
+
}
|
|
3419
|
+
const childProps = child.props;
|
|
3420
|
+
const isMenuItem = "onPress" in childProps;
|
|
3421
|
+
if (!isMenuItem) return child;
|
|
3422
|
+
const isLast = index === React26__default.default.Children.count(children) - 1;
|
|
3423
|
+
if (childProps["showSeparator"] === void 0 && !isLast) {
|
|
3424
|
+
return React26__default.default.cloneElement(child, {
|
|
3425
|
+
showSeparator: true
|
|
3426
|
+
});
|
|
3427
|
+
}
|
|
3428
|
+
return child;
|
|
3429
|
+
});
|
|
3430
|
+
const cardStyle = variant === "card" ? {
|
|
3431
|
+
backgroundColor: colors.card,
|
|
3432
|
+
borderRadius: RADIUS.md,
|
|
3433
|
+
borderWidth: 1,
|
|
3434
|
+
borderColor: colors.border,
|
|
3435
|
+
shadowColor: "#000",
|
|
3436
|
+
shadowOffset: { width: 0, height: 2 },
|
|
3437
|
+
shadowOpacity: 0.06,
|
|
3438
|
+
shadowRadius: 6,
|
|
3439
|
+
elevation: 2,
|
|
3440
|
+
paddingVertical: vs(4)
|
|
3441
|
+
} : {};
|
|
3442
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles28.container, cardStyle, style] }, processedChildren);
|
|
3443
|
+
}
|
|
3444
|
+
function MenuGroupHeader({ children, style }) {
|
|
3445
|
+
const { colors } = useTheme();
|
|
3446
|
+
if (typeof children === "string") {
|
|
3447
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles28.headerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3448
|
+
}
|
|
3449
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles28.header, { borderBottomColor: colors.separator }, style] }, children);
|
|
3450
|
+
}
|
|
3451
|
+
function MenuGroupFooter({ children, style }) {
|
|
3452
|
+
const { colors } = useTheme();
|
|
3453
|
+
if (typeof children === "string") {
|
|
3454
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles28.footerText, { color: colors.foregroundMuted }], allowFontScaling: true }, children));
|
|
3455
|
+
}
|
|
3456
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles28.footer, style] }, children);
|
|
3457
|
+
}
|
|
3458
|
+
MenuGroup.Header = MenuGroupHeader;
|
|
3459
|
+
MenuGroup.Footer = MenuGroupFooter;
|
|
3460
|
+
var styles28 = reactNative.StyleSheet.create({
|
|
3461
|
+
container: {
|
|
3462
|
+
overflow: "hidden"
|
|
3463
|
+
},
|
|
3464
|
+
header: {
|
|
3465
|
+
paddingHorizontal: s(16),
|
|
3466
|
+
paddingTop: vs(12),
|
|
3467
|
+
paddingBottom: vs(8),
|
|
3468
|
+
borderBottomWidth: reactNative.StyleSheet.hairlineWidth
|
|
3469
|
+
},
|
|
3470
|
+
headerText: {
|
|
3471
|
+
fontFamily: "Sohne-SemiBold",
|
|
3472
|
+
fontSize: 13,
|
|
3473
|
+
letterSpacing: 0.32,
|
|
3474
|
+
textTransform: "uppercase"
|
|
3475
|
+
},
|
|
3476
|
+
footer: {
|
|
3477
|
+
paddingHorizontal: s(16),
|
|
3478
|
+
paddingTop: vs(8),
|
|
3479
|
+
paddingBottom: vs(12)
|
|
3480
|
+
},
|
|
3481
|
+
footerText: {
|
|
3482
|
+
fontFamily: "Sohne-Regular",
|
|
3483
|
+
fontSize: 12
|
|
3484
|
+
}
|
|
3485
|
+
});
|
|
3486
|
+
function ChipBase({ label, selected = false, onPress, icon, iconName, style, accessibilityLabel }) {
|
|
3207
3487
|
const { colors } = useTheme();
|
|
3208
3488
|
const { animatedStyle: scaleStyle, onPressIn, onPressOut, hoverHandlers } = usePressScale({
|
|
3209
3489
|
pressScale: PRESS_SCALE.chip
|
|
@@ -3221,7 +3501,7 @@ function Chip({ label, selected = false, onPress, icon, iconName, style, accessi
|
|
|
3221
3501
|
onPress?.();
|
|
3222
3502
|
};
|
|
3223
3503
|
const resolvedIcon = iconName ? renderIcon(iconName, ms(13), selected ? colors.primaryForeground : colors.foreground) : icon;
|
|
3224
|
-
return /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [
|
|
3504
|
+
return /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles29.wrapper, scaleStyle, style], ...hoverHandlers }, /* @__PURE__ */ React26__default.default.createElement(
|
|
3225
3505
|
reactNative.TouchableOpacity,
|
|
3226
3506
|
{
|
|
3227
3507
|
onPress: handlePress,
|
|
@@ -3233,9 +3513,10 @@ function Chip({ label, selected = false, onPress, icon, iconName, style, accessi
|
|
|
3233
3513
|
accessibilityLabel: accessibilityLabel ?? label,
|
|
3234
3514
|
accessibilityState: { selected }
|
|
3235
3515
|
},
|
|
3236
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [
|
|
3516
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles29.chip, surfaceStyle] }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles29.chipIcon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.Text, { style: [styles29.label, textStyle], allowFontScaling: true }, label))
|
|
3237
3517
|
));
|
|
3238
3518
|
}
|
|
3519
|
+
var Chip = React26__default.default.memo(ChipBase);
|
|
3239
3520
|
function ChipGroup({ options, value, onValueChange, multiSelect = false, style }) {
|
|
3240
3521
|
const handlePress = (optionValue) => {
|
|
3241
3522
|
if (!multiSelect) {
|
|
@@ -3248,12 +3529,10 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
|
|
|
3248
3529
|
onValueChange?.(newArray);
|
|
3249
3530
|
};
|
|
3250
3531
|
const isSelected = (optionValue) => {
|
|
3251
|
-
if (Array.isArray(value))
|
|
3252
|
-
return value.includes(optionValue);
|
|
3253
|
-
}
|
|
3532
|
+
if (Array.isArray(value)) return value.includes(optionValue);
|
|
3254
3533
|
return optionValue === value;
|
|
3255
3534
|
};
|
|
3256
|
-
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
|
|
3535
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles29.group, style] }, options.map((opt) => /* @__PURE__ */ React26__default.default.createElement(
|
|
3257
3536
|
Chip,
|
|
3258
3537
|
{
|
|
3259
3538
|
key: opt.value,
|
|
@@ -3261,28 +3540,35 @@ function ChipGroup({ options, value, onValueChange, multiSelect = false, style }
|
|
|
3261
3540
|
selected: isSelected(opt.value),
|
|
3262
3541
|
onPress: opt.disabled ? void 0 : () => handlePress(opt.value),
|
|
3263
3542
|
iconName: opt.iconName,
|
|
3264
|
-
style: opt.disabled ?
|
|
3543
|
+
style: opt.disabled ? styles29.chipDisabled : void 0,
|
|
3544
|
+
accessibilityLabel: opt.disabled ? `${opt.label}, unavailable` : opt.label
|
|
3265
3545
|
}
|
|
3266
3546
|
)));
|
|
3267
3547
|
}
|
|
3268
|
-
var
|
|
3548
|
+
var styles29 = reactNative.StyleSheet.create({
|
|
3269
3549
|
wrapper: {},
|
|
3270
3550
|
chip: {
|
|
3271
3551
|
borderRadius: 999,
|
|
3272
3552
|
paddingHorizontal: s(14),
|
|
3273
|
-
|
|
3553
|
+
// AUDIT FIX: was vs(5) → ~28px total height — below WCAG 44px tap target.
|
|
3554
|
+
// vs(10) → ~44px total height meets WCAG 2.5.5 (AAA) minimum.
|
|
3555
|
+
paddingVertical: vs(10),
|
|
3556
|
+
minHeight: 44,
|
|
3274
3557
|
borderWidth: 1,
|
|
3275
3558
|
alignItems: "center",
|
|
3276
3559
|
justifyContent: "center",
|
|
3277
3560
|
flexDirection: "row",
|
|
3278
3561
|
gap: s(5)
|
|
3279
3562
|
},
|
|
3563
|
+
chipDisabled: {
|
|
3564
|
+
opacity: 0.4
|
|
3565
|
+
},
|
|
3280
3566
|
chipIcon: {
|
|
3281
3567
|
alignItems: "center",
|
|
3282
3568
|
justifyContent: "center"
|
|
3283
3569
|
},
|
|
3284
3570
|
label: {
|
|
3285
|
-
fontFamily: "
|
|
3571
|
+
fontFamily: "Sohne-Medium",
|
|
3286
3572
|
fontSize: ms(13),
|
|
3287
3573
|
lineHeight: mvs(18)
|
|
3288
3574
|
},
|
|
@@ -3328,11 +3614,11 @@ function ConfirmDialog({
|
|
|
3328
3614
|
enableDynamicSizing: true,
|
|
3329
3615
|
onDismiss: onCancel,
|
|
3330
3616
|
backdropComponent: renderBackdrop,
|
|
3331
|
-
backgroundStyle: [
|
|
3332
|
-
handleIndicatorStyle: [
|
|
3617
|
+
backgroundStyle: [styles30.background, { backgroundColor: colors.card }],
|
|
3618
|
+
handleIndicatorStyle: [styles30.handle, { backgroundColor: colors.border }],
|
|
3333
3619
|
enablePanDownToClose: true
|
|
3334
3620
|
},
|
|
3335
|
-
/* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style:
|
|
3621
|
+
/* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: styles30.content }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles30.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles30.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles30.actions }, /* @__PURE__ */ React26__default.default.createElement(
|
|
3336
3622
|
Button,
|
|
3337
3623
|
{
|
|
3338
3624
|
label: confirmLabel,
|
|
@@ -3366,7 +3652,7 @@ function ConfirmDialog({
|
|
|
3366
3652
|
)))
|
|
3367
3653
|
);
|
|
3368
3654
|
}
|
|
3369
|
-
var
|
|
3655
|
+
var styles30 = reactNative.StyleSheet.create({
|
|
3370
3656
|
background: {
|
|
3371
3657
|
borderTopLeftRadius: ms(16),
|
|
3372
3658
|
borderTopRightRadius: ms(16)
|
|
@@ -3382,12 +3668,12 @@ var styles28 = reactNative.StyleSheet.create({
|
|
|
3382
3668
|
gap: vs(12)
|
|
3383
3669
|
},
|
|
3384
3670
|
title: {
|
|
3385
|
-
fontFamily: "
|
|
3671
|
+
fontFamily: "Sohne-SemiBold",
|
|
3386
3672
|
fontSize: ms(18),
|
|
3387
3673
|
lineHeight: mvs(26)
|
|
3388
3674
|
},
|
|
3389
3675
|
description: {
|
|
3390
|
-
fontFamily: "
|
|
3676
|
+
fontFamily: "Sohne-Regular",
|
|
3391
3677
|
fontSize: ms(15),
|
|
3392
3678
|
lineHeight: mvs(22)
|
|
3393
3679
|
},
|
|
@@ -3396,12 +3682,13 @@ var styles28 = reactNative.StyleSheet.create({
|
|
|
3396
3682
|
marginTop: vs(8)
|
|
3397
3683
|
}
|
|
3398
3684
|
});
|
|
3399
|
-
function
|
|
3685
|
+
function LabelValueBase({ label, value, iconName, iconColor, style }) {
|
|
3400
3686
|
const { colors } = useTheme();
|
|
3401
3687
|
const resolvedIcon = iconName ? renderIcon(iconName, ms(14), iconColor ?? colors.foregroundMuted) : null;
|
|
3402
|
-
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
|
|
3688
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles31.container, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles31.labelSide }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles31.icon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
|
|
3403
3689
|
}
|
|
3404
|
-
var
|
|
3690
|
+
var LabelValue = React26__default.default.memo(LabelValueBase);
|
|
3691
|
+
var styles31 = reactNative.StyleSheet.create({
|
|
3405
3692
|
container: {
|
|
3406
3693
|
flexDirection: "row",
|
|
3407
3694
|
justifyContent: "space-between",
|
|
@@ -3418,12 +3705,12 @@ var styles29 = reactNative.StyleSheet.create({
|
|
|
3418
3705
|
justifyContent: "center"
|
|
3419
3706
|
},
|
|
3420
3707
|
label: {
|
|
3421
|
-
fontFamily: "
|
|
3708
|
+
fontFamily: "Sohne-Regular",
|
|
3422
3709
|
fontSize: ms(13),
|
|
3423
3710
|
lineHeight: mvs(18)
|
|
3424
3711
|
},
|
|
3425
3712
|
value: {
|
|
3426
|
-
fontFamily: "
|
|
3713
|
+
fontFamily: "Sohne-Medium",
|
|
3427
3714
|
fontSize: ms(14),
|
|
3428
3715
|
lineHeight: mvs(20),
|
|
3429
3716
|
textAlign: "right"
|
|
@@ -3458,10 +3745,10 @@ function MonthPicker({ value, onChange, locale = "en", formatLabel, style }) {
|
|
|
3458
3745
|
onChange({ month: value.month + 1, year: value.year });
|
|
3459
3746
|
}
|
|
3460
3747
|
};
|
|
3461
|
-
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
|
|
3748
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles32.container, style], accessibilityRole: "adjustable", accessibilityLabel: getLabel() }, /* @__PURE__ */ React26__default.default.createElement(
|
|
3462
3749
|
reactNative.TouchableOpacity,
|
|
3463
3750
|
{
|
|
3464
|
-
style:
|
|
3751
|
+
style: styles32.arrow,
|
|
3465
3752
|
onPress: handlePrev,
|
|
3466
3753
|
activeOpacity: 0.6,
|
|
3467
3754
|
touchSoundDisabled: true,
|
|
@@ -3473,7 +3760,7 @@ function MonthPicker({ value, onChange, locale = "en", formatLabel, style }) {
|
|
|
3473
3760
|
), /* @__PURE__ */ React26__default.default.createElement(
|
|
3474
3761
|
reactNative.Text,
|
|
3475
3762
|
{
|
|
3476
|
-
style: [
|
|
3763
|
+
style: [styles32.label, { color: colors.foreground }],
|
|
3477
3764
|
allowFontScaling: true,
|
|
3478
3765
|
accessibilityLiveRegion: "polite"
|
|
3479
3766
|
},
|
|
@@ -3481,7 +3768,7 @@ function MonthPicker({ value, onChange, locale = "en", formatLabel, style }) {
|
|
|
3481
3768
|
), /* @__PURE__ */ React26__default.default.createElement(
|
|
3482
3769
|
reactNative.TouchableOpacity,
|
|
3483
3770
|
{
|
|
3484
|
-
style:
|
|
3771
|
+
style: styles32.arrow,
|
|
3485
3772
|
onPress: handleNext,
|
|
3486
3773
|
activeOpacity: 0.6,
|
|
3487
3774
|
touchSoundDisabled: true,
|
|
@@ -3492,7 +3779,7 @@ function MonthPicker({ value, onChange, locale = "en", formatLabel, style }) {
|
|
|
3492
3779
|
/* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "chevron-right", size: 22, color: colors.foreground })
|
|
3493
3780
|
));
|
|
3494
3781
|
}
|
|
3495
|
-
var
|
|
3782
|
+
var styles32 = reactNative.StyleSheet.create({
|
|
3496
3783
|
container: {
|
|
3497
3784
|
flexDirection: "row",
|
|
3498
3785
|
alignItems: "center",
|
|
@@ -3505,7 +3792,7 @@ var styles30 = reactNative.StyleSheet.create({
|
|
|
3505
3792
|
justifyContent: "center"
|
|
3506
3793
|
},
|
|
3507
3794
|
label: {
|
|
3508
|
-
fontFamily: "
|
|
3795
|
+
fontFamily: "Sohne-Medium",
|
|
3509
3796
|
fontSize: ms(17),
|
|
3510
3797
|
lineHeight: mvs(24),
|
|
3511
3798
|
textAlign: "center",
|
|
@@ -3519,7 +3806,7 @@ var aspectRatioMap = {
|
|
|
3519
3806
|
"4:5": 5 / 4,
|
|
3520
3807
|
"3:2": 2 / 3
|
|
3521
3808
|
};
|
|
3522
|
-
function
|
|
3809
|
+
function MediaCardBase({
|
|
3523
3810
|
imageSource,
|
|
3524
3811
|
aspectRatio = "4:3",
|
|
3525
3812
|
badge,
|
|
@@ -3556,23 +3843,23 @@ function MediaCard({
|
|
|
3556
3843
|
reactNative.View,
|
|
3557
3844
|
{
|
|
3558
3845
|
style: [
|
|
3559
|
-
|
|
3560
|
-
hovered &&
|
|
3846
|
+
styles33.card,
|
|
3847
|
+
hovered && styles33.cardHovered,
|
|
3561
3848
|
style
|
|
3562
3849
|
],
|
|
3563
3850
|
...reactNative.Platform.OS === "web" ? hoverHandlers : {}
|
|
3564
3851
|
},
|
|
3565
|
-
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
|
|
3852
|
+
/* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles33.imageContainer, imageStyle] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: { paddingTop: `${ratio * 100}%` } }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: reactNative.StyleSheet.absoluteFill }, imageSource ? /* @__PURE__ */ React26__default.default.createElement(
|
|
3566
3853
|
reactNative.Image,
|
|
3567
3854
|
{
|
|
3568
3855
|
source: imageSource,
|
|
3569
|
-
style:
|
|
3856
|
+
style: styles33.image,
|
|
3570
3857
|
resizeMode: "cover"
|
|
3571
3858
|
}
|
|
3572
|
-
) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
|
|
3859
|
+
) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles33.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React26__default.default.createElement(
|
|
3573
3860
|
reactNative.TouchableOpacity,
|
|
3574
3861
|
{
|
|
3575
|
-
style: [
|
|
3862
|
+
style: [styles33.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
|
|
3576
3863
|
onPress: () => {
|
|
3577
3864
|
impactLight();
|
|
3578
3865
|
onActionPress?.();
|
|
@@ -3585,7 +3872,7 @@ function MediaCard({
|
|
|
3585
3872
|
},
|
|
3586
3873
|
resolvedActionIcon
|
|
3587
3874
|
)),
|
|
3588
|
-
(title || subtitle || caption || footer) && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style:
|
|
3875
|
+
(title || subtitle || caption || footer) && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.meta }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles33.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles33.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles33.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
|
|
3589
3876
|
);
|
|
3590
3877
|
if (onPress) {
|
|
3591
3878
|
return /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: animatedStyle }, /* @__PURE__ */ React26__default.default.createElement(
|
|
@@ -3604,7 +3891,8 @@ function MediaCard({
|
|
|
3604
3891
|
}
|
|
3605
3892
|
return cardContent;
|
|
3606
3893
|
}
|
|
3607
|
-
var
|
|
3894
|
+
var MediaCard = React26__default.default.memo(MediaCardBase);
|
|
3895
|
+
var styles33 = reactNative.StyleSheet.create({
|
|
3608
3896
|
card: {
|
|
3609
3897
|
borderRadius: RADIUS.md,
|
|
3610
3898
|
overflow: "hidden",
|
|
@@ -3646,25 +3934,25 @@ var styles31 = reactNative.StyleSheet.create({
|
|
|
3646
3934
|
gap: vs(2)
|
|
3647
3935
|
},
|
|
3648
3936
|
title: {
|
|
3649
|
-
fontFamily: "
|
|
3937
|
+
fontFamily: "Sohne-SemiBold",
|
|
3650
3938
|
fontSize: ms(14),
|
|
3651
3939
|
lineHeight: mvs(20)
|
|
3652
3940
|
},
|
|
3653
3941
|
subtitle: {
|
|
3654
|
-
fontFamily: "
|
|
3942
|
+
fontFamily: "Sohne-Regular",
|
|
3655
3943
|
fontSize: ms(13),
|
|
3656
3944
|
lineHeight: mvs(18)
|
|
3657
3945
|
},
|
|
3658
3946
|
caption: {
|
|
3659
|
-
fontFamily: "
|
|
3947
|
+
fontFamily: "Sohne-Regular",
|
|
3660
3948
|
fontSize: ms(12),
|
|
3661
3949
|
lineHeight: mvs(16)
|
|
3662
3950
|
}
|
|
3663
3951
|
});
|
|
3664
|
-
|
|
3952
|
+
var CategoryChip = React26__default.default.memo(function CategoryChip2({
|
|
3665
3953
|
item,
|
|
3666
3954
|
selected,
|
|
3667
|
-
|
|
3955
|
+
onSelect
|
|
3668
3956
|
}) {
|
|
3669
3957
|
const { colors } = useTheme();
|
|
3670
3958
|
const { animatedStyle: scaleStyle, onPressIn, onPressOut, hoverHandlers } = usePressScale({
|
|
@@ -3683,7 +3971,7 @@ function CategoryChip({
|
|
|
3683
3971
|
return /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: scaleStyle, ...hoverHandlers }, /* @__PURE__ */ React26__default.default.createElement(
|
|
3684
3972
|
reactNative.TouchableOpacity,
|
|
3685
3973
|
{
|
|
3686
|
-
onPress,
|
|
3974
|
+
onPress: () => onSelect(item.value),
|
|
3687
3975
|
onPressIn,
|
|
3688
3976
|
onPressOut,
|
|
3689
3977
|
activeOpacity: 1,
|
|
@@ -3692,9 +3980,9 @@ function CategoryChip({
|
|
|
3692
3980
|
accessibilityLabel: item.label,
|
|
3693
3981
|
accessibilityState: { selected }
|
|
3694
3982
|
},
|
|
3695
|
-
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [
|
|
3983
|
+
/* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.View, { style: [styles34.chip, surfaceStyle] }, resolvedIcon && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles34.chipIcon }, resolvedIcon), /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.Text, { style: [styles34.chipLabel, textColorStyle], allowFontScaling: true }, item.label), item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles34.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles34.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99))))
|
|
3696
3984
|
));
|
|
3697
|
-
}
|
|
3985
|
+
});
|
|
3698
3986
|
function CategoryStrip({
|
|
3699
3987
|
categories,
|
|
3700
3988
|
value,
|
|
@@ -3705,23 +3993,26 @@ function CategoryStrip({
|
|
|
3705
3993
|
accessibilityLabel
|
|
3706
3994
|
}) {
|
|
3707
3995
|
const selected = Array.isArray(value) ? value : value ? [value] : [];
|
|
3708
|
-
const handlePress = (
|
|
3709
|
-
|
|
3710
|
-
|
|
3711
|
-
|
|
3712
|
-
|
|
3713
|
-
|
|
3714
|
-
|
|
3715
|
-
|
|
3716
|
-
|
|
3717
|
-
|
|
3996
|
+
const handlePress = React26.useCallback(
|
|
3997
|
+
(v) => {
|
|
3998
|
+
selectionAsync();
|
|
3999
|
+
if (multiSelect) {
|
|
4000
|
+
const current = Array.isArray(value) ? value : value ? [value] : [];
|
|
4001
|
+
const next = current.includes(v) ? current.filter((x) => x !== v) : [...current, v];
|
|
4002
|
+
onValueChange?.(next);
|
|
4003
|
+
} else {
|
|
4004
|
+
onValueChange?.(v === value ? "" : v);
|
|
4005
|
+
}
|
|
4006
|
+
},
|
|
4007
|
+
[multiSelect, value, onValueChange]
|
|
4008
|
+
);
|
|
3718
4009
|
return /* @__PURE__ */ React26__default.default.createElement(
|
|
3719
4010
|
reactNative.ScrollView,
|
|
3720
4011
|
{
|
|
3721
4012
|
horizontal: true,
|
|
3722
4013
|
showsHorizontalScrollIndicator: false,
|
|
3723
|
-
contentContainerStyle: [
|
|
3724
|
-
style:
|
|
4014
|
+
contentContainerStyle: [styles34.container, style],
|
|
4015
|
+
style: styles34.scroll,
|
|
3725
4016
|
accessibilityRole: multiSelect ? void 0 : "radiogroup",
|
|
3726
4017
|
accessibilityLabel
|
|
3727
4018
|
},
|
|
@@ -3730,12 +4021,12 @@ function CategoryStrip({
|
|
|
3730
4021
|
{
|
|
3731
4022
|
item: cat,
|
|
3732
4023
|
selected: selected.includes(cat.value),
|
|
3733
|
-
|
|
4024
|
+
onSelect: handlePress
|
|
3734
4025
|
}
|
|
3735
4026
|
)))
|
|
3736
4027
|
);
|
|
3737
4028
|
}
|
|
3738
|
-
var
|
|
4029
|
+
var styles34 = reactNative.StyleSheet.create({
|
|
3739
4030
|
scroll: {
|
|
3740
4031
|
flexGrow: 0
|
|
3741
4032
|
},
|
|
@@ -3759,7 +4050,7 @@ var styles32 = reactNative.StyleSheet.create({
|
|
|
3759
4050
|
justifyContent: "center"
|
|
3760
4051
|
},
|
|
3761
4052
|
chipLabel: {
|
|
3762
|
-
fontFamily: "
|
|
4053
|
+
fontFamily: "Sohne-Medium",
|
|
3763
4054
|
fontSize: ms(13)
|
|
3764
4055
|
},
|
|
3765
4056
|
chipBadge: {
|
|
@@ -3771,7 +4062,7 @@ var styles32 = reactNative.StyleSheet.create({
|
|
|
3771
4062
|
justifyContent: "center"
|
|
3772
4063
|
},
|
|
3773
4064
|
chipBadgeText: {
|
|
3774
|
-
fontFamily: "
|
|
4065
|
+
fontFamily: "Sohne-Bold",
|
|
3775
4066
|
fontSize: ms(9),
|
|
3776
4067
|
lineHeight: 14
|
|
3777
4068
|
}
|
|
@@ -3822,12 +4113,12 @@ function Pressable2({
|
|
|
3822
4113
|
);
|
|
3823
4114
|
}
|
|
3824
4115
|
var weightMap = {
|
|
3825
|
-
normal: "
|
|
3826
|
-
medium: "
|
|
3827
|
-
semibold: "
|
|
3828
|
-
bold: "
|
|
4116
|
+
normal: "Sohne-Regular",
|
|
4117
|
+
medium: "Sohne-Medium",
|
|
4118
|
+
semibold: "Sohne-SemiBold",
|
|
4119
|
+
bold: "Sohne-Bold"
|
|
3829
4120
|
};
|
|
3830
|
-
function
|
|
4121
|
+
function DetailRowBase({
|
|
3831
4122
|
label,
|
|
3832
4123
|
value,
|
|
3833
4124
|
separator = "dotted",
|
|
@@ -3853,23 +4144,24 @@ function DetailRow({
|
|
|
3853
4144
|
borderColor: "rgba(128,128,128,0.3)",
|
|
3854
4145
|
marginHorizontal: s(4)
|
|
3855
4146
|
};
|
|
3856
|
-
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [
|
|
4147
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles35.row, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles35.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React26__default.default.createElement(
|
|
3857
4148
|
reactNative.Text,
|
|
3858
4149
|
{
|
|
3859
|
-
style: [
|
|
4150
|
+
style: [styles35.labelText, { color: colors.foregroundMuted, fontFamily: weightMap[labelWeight] }, labelStyle],
|
|
3860
4151
|
allowFontScaling: true
|
|
3861
4152
|
},
|
|
3862
4153
|
label
|
|
3863
|
-
) : label), separatorStyle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: separatorStyle }) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style:
|
|
4154
|
+
) : label), separatorStyle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: separatorStyle }) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles35.spacer }), /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles35.valueSide }, typeof value === "string" ? /* @__PURE__ */ React26__default.default.createElement(
|
|
3864
4155
|
reactNative.Text,
|
|
3865
4156
|
{
|
|
3866
|
-
style: [
|
|
4157
|
+
style: [styles35.valueText, { color: valueColor ?? colors.foreground }, valueStyle],
|
|
3867
4158
|
allowFontScaling: true
|
|
3868
4159
|
},
|
|
3869
4160
|
value
|
|
3870
|
-
) : value, resolvedRightIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style:
|
|
4161
|
+
) : value, resolvedRightIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedRightIcon) : null));
|
|
3871
4162
|
}
|
|
3872
|
-
var
|
|
4163
|
+
var DetailRow = React26__default.default.memo(DetailRowBase);
|
|
4164
|
+
var styles35 = reactNative.StyleSheet.create({
|
|
3873
4165
|
row: {
|
|
3874
4166
|
flexDirection: "row",
|
|
3875
4167
|
alignItems: "center",
|
|
@@ -3899,11 +4191,101 @@ var styles33 = reactNative.StyleSheet.create({
|
|
|
3899
4191
|
flexShrink: 0
|
|
3900
4192
|
},
|
|
3901
4193
|
valueText: {
|
|
3902
|
-
fontFamily: "
|
|
4194
|
+
fontFamily: "Sohne-SemiBold",
|
|
3903
4195
|
fontSize: ms(13),
|
|
3904
4196
|
lineHeight: mvs(18)
|
|
3905
4197
|
}
|
|
3906
4198
|
});
|
|
4199
|
+
function Form({ children, style }) {
|
|
4200
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles36.form, style] }, children);
|
|
4201
|
+
}
|
|
4202
|
+
function FormField({
|
|
4203
|
+
children,
|
|
4204
|
+
label,
|
|
4205
|
+
error,
|
|
4206
|
+
required,
|
|
4207
|
+
style,
|
|
4208
|
+
labelStyle,
|
|
4209
|
+
errorStyle
|
|
4210
|
+
}) {
|
|
4211
|
+
const { colors } = useTheme();
|
|
4212
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles36.field, style] }, label ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles36.label, { color: colors.foreground }, labelStyle], allowFontScaling: true }, label, required ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: { color: colors.destructive } }, " *") : null) : null, children, error ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles36.error, { color: colors.destructive }, errorStyle], allowFontScaling: true }, error) : null);
|
|
4213
|
+
}
|
|
4214
|
+
function FormSection({ children, title, description, style }) {
|
|
4215
|
+
const { colors } = useTheme();
|
|
4216
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles36.section, style] }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles36.sectionHeader }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles36.sectionTitle, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles36.sectionDescription, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null) : null, children);
|
|
4217
|
+
}
|
|
4218
|
+
function FormFooter({ children, style }) {
|
|
4219
|
+
return /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles36.footer, style] }, children);
|
|
4220
|
+
}
|
|
4221
|
+
Form.Field = FormField;
|
|
4222
|
+
Form.Section = FormSection;
|
|
4223
|
+
Form.Footer = FormFooter;
|
|
4224
|
+
var styles36 = reactNative.StyleSheet.create({
|
|
4225
|
+
form: {
|
|
4226
|
+
gap: vs(16)
|
|
4227
|
+
},
|
|
4228
|
+
field: {
|
|
4229
|
+
gap: vs(6)
|
|
4230
|
+
},
|
|
4231
|
+
label: {
|
|
4232
|
+
fontFamily: "Sohne-Medium",
|
|
4233
|
+
fontSize: 14,
|
|
4234
|
+
lineHeight: 20
|
|
4235
|
+
},
|
|
4236
|
+
error: {
|
|
4237
|
+
fontFamily: "Sohne-Regular",
|
|
4238
|
+
fontSize: 12,
|
|
4239
|
+
lineHeight: 16
|
|
4240
|
+
},
|
|
4241
|
+
section: {
|
|
4242
|
+
gap: vs(16)
|
|
4243
|
+
},
|
|
4244
|
+
sectionHeader: {
|
|
4245
|
+
gap: vs(4)
|
|
4246
|
+
},
|
|
4247
|
+
sectionTitle: {
|
|
4248
|
+
fontFamily: "Sohne-SemiBold",
|
|
4249
|
+
fontSize: 16,
|
|
4250
|
+
lineHeight: 24
|
|
4251
|
+
},
|
|
4252
|
+
sectionDescription: {
|
|
4253
|
+
fontFamily: "Sohne-Regular",
|
|
4254
|
+
fontSize: 14,
|
|
4255
|
+
lineHeight: 20
|
|
4256
|
+
},
|
|
4257
|
+
footer: {
|
|
4258
|
+
flexDirection: "row",
|
|
4259
|
+
gap: s(12),
|
|
4260
|
+
paddingTop: vs(8)
|
|
4261
|
+
}
|
|
4262
|
+
});
|
|
4263
|
+
var defaultKeyExtractor = (item, index) => {
|
|
4264
|
+
const id = item?.id;
|
|
4265
|
+
return id !== void 0 ? String(id) : String(index);
|
|
4266
|
+
};
|
|
4267
|
+
function VirtualListInner({ itemHeight, keyExtractor, renderItem, ...props }, ref) {
|
|
4268
|
+
const getItemLayout = React26.useCallback(
|
|
4269
|
+
(_data, index) => ({
|
|
4270
|
+
length: itemHeight ?? 0,
|
|
4271
|
+
offset: (itemHeight ?? 0) * index,
|
|
4272
|
+
index
|
|
4273
|
+
}),
|
|
4274
|
+
[itemHeight]
|
|
4275
|
+
);
|
|
4276
|
+
return /* @__PURE__ */ React26__default.default.createElement(
|
|
4277
|
+
reactNative.FlatList,
|
|
4278
|
+
{
|
|
4279
|
+
ref,
|
|
4280
|
+
keyExtractor: keyExtractor ?? defaultKeyExtractor,
|
|
4281
|
+
renderItem,
|
|
4282
|
+
getItemLayout: itemHeight !== void 0 ? getItemLayout : void 0,
|
|
4283
|
+
removeClippedSubviews: true,
|
|
4284
|
+
...props
|
|
4285
|
+
}
|
|
4286
|
+
);
|
|
4287
|
+
}
|
|
4288
|
+
var VirtualList = React26__default.default.forwardRef(VirtualListInner);
|
|
3907
4289
|
|
|
3908
4290
|
// src/utils/typography.ts
|
|
3909
4291
|
function getResponsiveFontSize(text, maxSize, steps = [
|
|
@@ -3954,13 +4336,23 @@ exports.CurrencyInput = CurrencyInput;
|
|
|
3954
4336
|
exports.CurrencyInputLarge = CurrencyInput;
|
|
3955
4337
|
exports.DetailRow = DetailRow;
|
|
3956
4338
|
exports.EmptyState = EmptyState;
|
|
4339
|
+
exports.Form = Form;
|
|
4340
|
+
exports.FormField = FormField;
|
|
4341
|
+
exports.FormFooter = FormFooter;
|
|
4342
|
+
exports.FormSection = FormSection;
|
|
3957
4343
|
exports.ICON_SIZES = ICON_SIZES;
|
|
3958
4344
|
exports.Icon = Icon;
|
|
3959
4345
|
exports.IconButton = IconButton;
|
|
3960
4346
|
exports.Input = Input;
|
|
3961
4347
|
exports.LabelValue = LabelValue;
|
|
4348
|
+
exports.ListGroup = ListGroup;
|
|
4349
|
+
exports.ListGroupFooter = ListGroupFooter;
|
|
4350
|
+
exports.ListGroupHeader = ListGroupHeader;
|
|
3962
4351
|
exports.ListItem = ListItem;
|
|
3963
4352
|
exports.MediaCard = MediaCard;
|
|
4353
|
+
exports.MenuGroup = MenuGroup;
|
|
4354
|
+
exports.MenuGroupFooter = MenuGroupFooter;
|
|
4355
|
+
exports.MenuGroupHeader = MenuGroupHeader;
|
|
3964
4356
|
exports.MenuItem = MenuItem;
|
|
3965
4357
|
exports.MonthPicker = MonthPicker;
|
|
3966
4358
|
exports.Pressable = Pressable2;
|
|
@@ -3984,6 +4376,8 @@ exports.Textarea = Textarea;
|
|
|
3984
4376
|
exports.ThemeProvider = ThemeProvider;
|
|
3985
4377
|
exports.ToastProvider = ToastProvider;
|
|
3986
4378
|
exports.Toggle = Toggle;
|
|
4379
|
+
exports.VirtualList = VirtualList;
|
|
4380
|
+
exports.configureIconFamilies = configureIconFamilies;
|
|
3987
4381
|
exports.defaultDark = defaultDark;
|
|
3988
4382
|
exports.defaultLight = defaultLight;
|
|
3989
4383
|
exports.deriveColors = deriveColors;
|