@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.
Files changed (317) hide show
  1. package/COMPONENTS.md +444 -10
  2. package/EXAMPLES.md +248 -0
  3. package/README.md +11 -10
  4. package/dist/Accordion.d.mts +28 -0
  5. package/dist/Accordion.d.ts +28 -0
  6. package/dist/Accordion.js +340 -0
  7. package/dist/Accordion.mjs +6 -0
  8. package/dist/AlertBanner.d.mts +16 -0
  9. package/dist/AlertBanner.d.ts +16 -0
  10. package/dist/AlertBanner.js +247 -0
  11. package/dist/AlertBanner.mjs +5 -0
  12. package/dist/Avatar.d.mts +20 -0
  13. package/dist/Avatar.d.ts +20 -0
  14. package/dist/Avatar.js +234 -0
  15. package/dist/Avatar.mjs +3 -0
  16. package/dist/Badge.d.mts +26 -0
  17. package/dist/Badge.d.ts +26 -0
  18. package/dist/Badge.js +247 -0
  19. package/dist/Badge.mjs +4 -0
  20. package/dist/Button.d.mts +25 -0
  21. package/dist/Button.d.ts +25 -0
  22. package/dist/Button.js +414 -0
  23. package/dist/Button.mjs +8 -0
  24. package/dist/ButtonGroup.d.mts +26 -0
  25. package/dist/ButtonGroup.d.ts +26 -0
  26. package/dist/ButtonGroup.js +52 -0
  27. package/dist/ButtonGroup.mjs +2 -0
  28. package/dist/Card.d.mts +39 -0
  29. package/dist/Card.d.ts +39 -0
  30. package/dist/Card.js +329 -0
  31. package/dist/Card.mjs +7 -0
  32. package/dist/CategoryStrip.d.mts +26 -0
  33. package/dist/CategoryStrip.d.ts +26 -0
  34. package/dist/CategoryStrip.js +396 -0
  35. package/dist/CategoryStrip.mjs +9 -0
  36. package/dist/Checkbox.d.mts +14 -0
  37. package/dist/Checkbox.d.ts +14 -0
  38. package/dist/Checkbox.js +304 -0
  39. package/dist/Checkbox.mjs +7 -0
  40. package/dist/Chip.d.mts +31 -0
  41. package/dist/Chip.d.ts +31 -0
  42. package/dist/Chip.js +370 -0
  43. package/dist/Chip.mjs +8 -0
  44. package/dist/ConfirmDialog.d.mts +15 -0
  45. package/dist/ConfirmDialog.d.ts +15 -0
  46. package/dist/ConfirmDialog.js +530 -0
  47. package/dist/ConfirmDialog.mjs +9 -0
  48. package/dist/CurrencyDisplay.d.mts +24 -0
  49. package/dist/CurrencyDisplay.d.ts +24 -0
  50. package/dist/CurrencyDisplay.js +189 -0
  51. package/dist/CurrencyDisplay.mjs +3 -0
  52. package/dist/CurrencyInput.d.mts +26 -0
  53. package/dist/CurrencyInput.d.ts +26 -0
  54. package/dist/CurrencyInput.js +404 -0
  55. package/dist/CurrencyInput.mjs +7 -0
  56. package/dist/DetailRow.d.mts +32 -0
  57. package/dist/DetailRow.d.ts +32 -0
  58. package/dist/DetailRow.js +275 -0
  59. package/dist/DetailRow.mjs +4 -0
  60. package/dist/EmptyState.d.mts +27 -0
  61. package/dist/EmptyState.d.ts +27 -0
  62. package/dist/EmptyState.js +503 -0
  63. package/dist/EmptyState.mjs +9 -0
  64. package/dist/Form.d.mts +52 -0
  65. package/dist/Form.d.ts +52 -0
  66. package/dist/Form.js +204 -0
  67. package/dist/Form.mjs +3 -0
  68. package/dist/IconButton.d.mts +22 -0
  69. package/dist/IconButton.d.ts +22 -0
  70. package/dist/IconButton.js +383 -0
  71. package/dist/IconButton.mjs +7 -0
  72. package/dist/Input.d.mts +23 -0
  73. package/dist/Input.d.ts +23 -0
  74. package/dist/Input.js +351 -0
  75. package/dist/Input.mjs +6 -0
  76. package/dist/LabelValue.d.mts +16 -0
  77. package/dist/LabelValue.d.ts +16 -0
  78. package/dist/LabelValue.js +225 -0
  79. package/dist/LabelValue.mjs +4 -0
  80. package/dist/ListGroup.d.mts +34 -0
  81. package/dist/ListGroup.d.ts +34 -0
  82. package/dist/ListGroup.js +217 -0
  83. package/dist/ListGroup.mjs +4 -0
  84. package/dist/ListItem.d.mts +64 -0
  85. package/dist/ListItem.d.ts +64 -0
  86. package/dist/ListItem.js +430 -0
  87. package/dist/ListItem.mjs +8 -0
  88. package/dist/MediaCard.d.mts +39 -0
  89. package/dist/MediaCard.d.ts +39 -0
  90. package/dist/MediaCard.js +427 -0
  91. package/dist/MediaCard.mjs +8 -0
  92. package/dist/MenuGroup.d.mts +34 -0
  93. package/dist/MenuGroup.d.ts +34 -0
  94. package/dist/MenuGroup.js +217 -0
  95. package/dist/MenuGroup.mjs +4 -0
  96. package/dist/MenuItem.d.mts +48 -0
  97. package/dist/MenuItem.d.ts +48 -0
  98. package/dist/MenuItem.js +403 -0
  99. package/dist/MenuItem.mjs +8 -0
  100. package/dist/MonthPicker.d.mts +20 -0
  101. package/dist/MonthPicker.d.ts +20 -0
  102. package/dist/MonthPicker.js +234 -0
  103. package/dist/MonthPicker.mjs +4 -0
  104. package/dist/Pressable.d.mts +34 -0
  105. package/dist/Pressable.d.ts +34 -0
  106. package/dist/Pressable.js +132 -0
  107. package/dist/Pressable.mjs +4 -0
  108. package/dist/Progress.d.mts +14 -0
  109. package/dist/Progress.d.ts +14 -0
  110. package/dist/Progress.js +191 -0
  111. package/dist/Progress.mjs +4 -0
  112. package/dist/RadioGroup.d.mts +19 -0
  113. package/dist/RadioGroup.d.ts +19 -0
  114. package/dist/RadioGroup.js +341 -0
  115. package/dist/RadioGroup.mjs +7 -0
  116. package/dist/Select.d.mts +22 -0
  117. package/dist/Select.d.ts +22 -0
  118. package/dist/Select.js +441 -0
  119. package/dist/Select.mjs +6 -0
  120. package/dist/Separator.d.mts +10 -0
  121. package/dist/Separator.d.ts +10 -0
  122. package/dist/Separator.js +156 -0
  123. package/dist/Separator.mjs +2 -0
  124. package/dist/Sheet.d.mts +81 -0
  125. package/dist/Sheet.d.ts +81 -0
  126. package/dist/Sheet.js +340 -0
  127. package/dist/Sheet.mjs +4 -0
  128. package/dist/Skeleton.d.mts +17 -0
  129. package/dist/Skeleton.d.ts +17 -0
  130. package/dist/Skeleton.js +205 -0
  131. package/dist/Skeleton.mjs +4 -0
  132. package/dist/Slider.d.mts +20 -0
  133. package/dist/Slider.d.ts +20 -0
  134. package/dist/Slider.js +232 -0
  135. package/dist/Slider.mjs +4 -0
  136. package/dist/Spinner.d.mts +12 -0
  137. package/dist/Spinner.d.ts +12 -0
  138. package/dist/Spinner.js +172 -0
  139. package/dist/Spinner.mjs +3 -0
  140. package/dist/Switch.d.mts +13 -0
  141. package/dist/Switch.d.ts +13 -0
  142. package/dist/Switch.js +261 -0
  143. package/dist/Switch.mjs +5 -0
  144. package/dist/Tabs.d.mts +27 -0
  145. package/dist/Tabs.d.ts +27 -0
  146. package/dist/Tabs.js +389 -0
  147. package/dist/Tabs.mjs +6 -0
  148. package/dist/Text.d.mts +12 -0
  149. package/dist/Text.d.ts +12 -0
  150. package/dist/Text.js +311 -0
  151. package/dist/Text.mjs +4 -0
  152. package/dist/Textarea.d.mts +16 -0
  153. package/dist/Textarea.d.ts +16 -0
  154. package/dist/Textarea.js +333 -0
  155. package/dist/Textarea.mjs +6 -0
  156. package/dist/Toast.d.mts +47 -0
  157. package/dist/Toast.d.ts +47 -0
  158. package/dist/Toast.js +185 -0
  159. package/dist/Toast.mjs +3 -0
  160. package/dist/Toggle.d.mts +33 -0
  161. package/dist/Toggle.d.ts +33 -0
  162. package/dist/Toggle.js +397 -0
  163. package/dist/Toggle.mjs +8 -0
  164. package/dist/VirtualList.d.mts +19 -0
  165. package/dist/VirtualList.d.ts +19 -0
  166. package/dist/VirtualList.js +38 -0
  167. package/dist/VirtualList.mjs +1 -0
  168. package/dist/chunk-2CE3TQVY.mjs +11 -0
  169. package/dist/chunk-2UYENBLV.mjs +49 -0
  170. package/dist/chunk-3BBOZ3OQ.mjs +41 -0
  171. package/dist/chunk-5IKW3VNC.mjs +43 -0
  172. package/dist/chunk-63357L2X.mjs +51 -0
  173. package/dist/chunk-6LQYY7HC.mjs +127 -0
  174. package/dist/chunk-6Q64UFIA.mjs +71 -0
  175. package/dist/chunk-76PFOSM2.mjs +41 -0
  176. package/dist/chunk-7H2OR44A.mjs +14 -0
  177. package/dist/chunk-A4MDAP7G.mjs +42 -0
  178. package/dist/chunk-AU2VDY4P.mjs +190 -0
  179. package/dist/chunk-BRKYVJVV.mjs +60 -0
  180. package/dist/chunk-CRYBX2CM.mjs +146 -0
  181. package/dist/chunk-DITNP6PL.mjs +106 -0
  182. package/dist/chunk-FTLJOUOQ.mjs +97 -0
  183. package/dist/chunk-GCWOGZYL.mjs +104 -0
  184. package/dist/chunk-GNGLDL6Z.mjs +60 -0
  185. package/dist/chunk-GPOUINK5.mjs +148 -0
  186. package/dist/chunk-HSPSMN6U.mjs +115 -0
  187. package/dist/chunk-IRRY3CRZ.mjs +82 -0
  188. package/dist/chunk-JB67UOB5.mjs +92 -0
  189. package/dist/chunk-JBLL7U3U.mjs +64 -0
  190. package/dist/chunk-KWCPOM6W.mjs +136 -0
  191. package/dist/chunk-KZJRQOIU.mjs +64 -0
  192. package/dist/chunk-L7E7TVEZ.mjs +145 -0
  193. package/dist/chunk-LG4DO3DK.mjs +174 -0
  194. package/dist/chunk-LWG526VX.mjs +139 -0
  195. package/dist/chunk-MN7OG7IY.mjs +96 -0
  196. package/dist/chunk-MX6HRKMI.mjs +29 -0
  197. package/dist/chunk-NC5ZTR2Y.mjs +32 -0
  198. package/dist/chunk-NQGVLMWG.mjs +90 -0
  199. package/dist/chunk-QCNARS3X.mjs +46 -0
  200. package/dist/chunk-QXGYKWI7.mjs +134 -0
  201. package/dist/chunk-QY3X2UYR.mjs +191 -0
  202. package/dist/chunk-RKLHUDZS.mjs +92 -0
  203. package/dist/chunk-RMMK64W5.mjs +54 -0
  204. package/dist/chunk-RR2VQLKE.mjs +190 -0
  205. package/dist/chunk-RTC3CFXF.mjs +29 -0
  206. package/dist/chunk-SBZYEV4S.mjs +61 -0
  207. package/dist/chunk-SOA2Z4RB.mjs +82 -0
  208. package/dist/chunk-SOYNZDVY.mjs +151 -0
  209. package/dist/chunk-T7XZ7H7Y.mjs +57 -0
  210. package/dist/chunk-TAJ2PQ2O.mjs +163 -0
  211. package/dist/chunk-U4N7WF4Z.mjs +108 -0
  212. package/dist/chunk-URDE3EUU.mjs +132 -0
  213. package/dist/chunk-URLL5JBR.mjs +245 -0
  214. package/dist/chunk-XDMN67KV.mjs +59 -0
  215. package/dist/chunk-Y6MXOREN.mjs +120 -0
  216. package/dist/chunk-YZJAFS4P.mjs +131 -0
  217. package/dist/index.d.mts +94 -873
  218. package/dist/index.d.ts +94 -873
  219. package/dist/index.js +751 -357
  220. package/dist/index.mjs +50 -3895
  221. package/package.json +23 -14
  222. package/src/assets/fonts/Sohne-Bold.otf +0 -0
  223. package/src/assets/fonts/Sohne-BoldItalic.otf +0 -0
  224. package/src/assets/fonts/Sohne-ExtraBold.otf +0 -0
  225. package/src/assets/fonts/Sohne-ExtraBoldItalic.otf +0 -0
  226. package/src/assets/fonts/Sohne-ExtraLight.otf +0 -0
  227. package/src/assets/fonts/Sohne-ExtraLightItalic.otf +0 -0
  228. package/src/assets/fonts/Sohne-Italic.otf +0 -0
  229. package/src/assets/fonts/Sohne-Light.otf +0 -0
  230. package/src/assets/fonts/Sohne-LightItalic.otf +0 -0
  231. package/src/assets/fonts/Sohne-Medium.otf +0 -0
  232. package/src/assets/fonts/Sohne-MediumItalic.otf +0 -0
  233. package/src/assets/fonts/Sohne-Regular.otf +0 -0
  234. package/src/assets/fonts/Sohne-SemiBold.otf +0 -0
  235. package/src/assets/fonts/Sohne-SemiBoldItalic.otf +0 -0
  236. package/src/assets/fonts/SohneMono-Bold.otf +0 -0
  237. package/src/assets/fonts/SohneMono-BoldItalic.otf +0 -0
  238. package/src/assets/fonts/SohneMono-ExtraBold.otf +0 -0
  239. package/src/assets/fonts/SohneMono-ExtraBoldItalic.otf +0 -0
  240. package/src/assets/fonts/SohneMono-ExtraLight.otf +0 -0
  241. package/src/assets/fonts/SohneMono-ExtraLightItalic.otf +0 -0
  242. package/src/assets/fonts/SohneMono-Italic.otf +0 -0
  243. package/src/assets/fonts/SohneMono-Light.otf +0 -0
  244. package/src/assets/fonts/SohneMono-LightItalic.otf +0 -0
  245. package/src/assets/fonts/SohneMono-Medium.otf +0 -0
  246. package/src/assets/fonts/SohneMono-MediumItalic.otf +0 -0
  247. package/src/assets/fonts/SohneMono-Regular.otf +0 -0
  248. package/src/assets/fonts/SohneMono-SemiBold.otf +0 -0
  249. package/src/assets/fonts/SohneMono-SemiBoldItalic.otf +0 -0
  250. package/src/components/Accordion/Accordion.tsx +3 -3
  251. package/src/components/AlertBanner/AlertBanner.tsx +33 -12
  252. package/src/components/Avatar/Avatar.tsx +4 -2
  253. package/src/components/Badge/Badge.tsx +4 -2
  254. package/src/components/Button/Button.tsx +10 -11
  255. package/src/components/ButtonGroup/ButtonGroup.tsx +13 -10
  256. package/src/components/Card/Card.tsx +17 -34
  257. package/src/components/CategoryStrip/CategoryStrip.tsx +24 -21
  258. package/src/components/Checkbox/Checkbox.tsx +11 -6
  259. package/src/components/Chip/Chip.tsx +17 -15
  260. package/src/components/ConfirmDialog/ConfirmDialog.tsx +2 -2
  261. package/src/components/CurrencyDisplay/CurrencyDisplay.tsx +4 -2
  262. package/src/components/CurrencyInput/CurrencyInput.tsx +2 -2
  263. package/src/components/DetailRow/DetailRow.tsx +9 -7
  264. package/src/components/EmptyState/EmptyState.tsx +2 -2
  265. package/src/components/Form/Form.tsx +149 -0
  266. package/src/components/Form/index.ts +1 -0
  267. package/src/components/IconButton/IconButton.tsx +4 -2
  268. package/src/components/Input/Input.tsx +27 -31
  269. package/src/components/LabelValue/LabelValue.tsx +6 -4
  270. package/src/components/ListGroup/ListGroup.tsx +145 -0
  271. package/src/components/ListGroup/index.ts +1 -0
  272. package/src/components/ListItem/ListItem.tsx +9 -10
  273. package/src/components/MediaCard/MediaCard.tsx +7 -5
  274. package/src/components/MenuGroup/MenuGroup.tsx +145 -0
  275. package/src/components/MenuGroup/index.ts +1 -0
  276. package/src/components/MenuItem/MenuItem.tsx +7 -9
  277. package/src/components/MonthPicker/MonthPicker.tsx +2 -2
  278. package/src/components/RadioGroup/RadioGroup.tsx +11 -14
  279. package/src/components/Select/Select.tsx +6 -6
  280. package/src/components/Separator/Separator.tsx +1 -3
  281. package/src/components/Sheet/Sheet.tsx +81 -17
  282. package/src/components/Skeleton/Skeleton.tsx +1 -1
  283. package/src/components/Slider/Slider.tsx +2 -2
  284. package/src/components/Spinner/Spinner.tsx +1 -1
  285. package/src/components/Switch/Switch.tsx +28 -5
  286. package/src/components/Tabs/Tabs.tsx +22 -18
  287. package/src/components/Text/Text.tsx +3 -1
  288. package/src/components/Textarea/Textarea.tsx +18 -14
  289. package/src/components/Toast/Toast.tsx +6 -6
  290. package/src/components/Toggle/Toggle.tsx +47 -23
  291. package/src/components/VirtualList/VirtualList.tsx +60 -0
  292. package/src/components/VirtualList/index.ts +1 -0
  293. package/src/fonts.ts +38 -20
  294. package/src/index.ts +5 -1
  295. package/src/theme/colors.ts +53 -39
  296. package/src/theme/types.ts +3 -0
  297. package/src/tokens.ts +49 -39
  298. package/src/utils/icons.ts +47 -20
  299. package/src/utils/usePressScale.ts +2 -0
  300. package/src/assets/fonts/Poppins-Black.ttf +0 -0
  301. package/src/assets/fonts/Poppins-BlackItalic.ttf +0 -0
  302. package/src/assets/fonts/Poppins-Bold.ttf +0 -0
  303. package/src/assets/fonts/Poppins-BoldItalic.ttf +0 -0
  304. package/src/assets/fonts/Poppins-ExtraBold.ttf +0 -0
  305. package/src/assets/fonts/Poppins-ExtraBoldItalic.ttf +0 -0
  306. package/src/assets/fonts/Poppins-ExtraLight.ttf +0 -0
  307. package/src/assets/fonts/Poppins-ExtraLightItalic.ttf +0 -0
  308. package/src/assets/fonts/Poppins-Italic.ttf +0 -0
  309. package/src/assets/fonts/Poppins-Light.ttf +0 -0
  310. package/src/assets/fonts/Poppins-LightItalic.ttf +0 -0
  311. package/src/assets/fonts/Poppins-Medium.ttf +0 -0
  312. package/src/assets/fonts/Poppins-MediumItalic.ttf +0 -0
  313. package/src/assets/fonts/Poppins-Regular.ttf +0 -0
  314. package/src/assets/fonts/Poppins-SemiBold.ttf +0 -0
  315. package/src/assets/fonts/Poppins-SemiBoldItalic.ttf +0 -0
  316. package/src/assets/fonts/Poppins-Thin.ttf +0 -0
  317. 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: "#222222",
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
- // Airbnb hairlinelight, airy
98
- destructive: "#e53935",
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
- warning: "#e67e00",
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
- warning: "#f57c00",
117
- warningForeground: "#ffffff"
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.55);
123
- const foregroundMuted = mixWithBackground(t.foreground, bg, 0.38);
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
- // focus ring always = primary
149
- input: t.border
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 ICON_FAMILIES = [
207
- { name: "Ionicons", component: Ionicons__default.default, glyphMap: Ionicons__default.default.glyphMap },
208
- { name: "MaterialIcons", component: MaterialIcons__default.default, glyphMap: MaterialIcons__default.default.glyphMap },
209
- { name: "FontAwesome5", component: FontAwesome5__default.default, glyphMap: FontAwesome5__default.default.glyphMap },
210
- { name: "Entypo", component: Entypo__default.default, glyphMap: Entypo__default.default.glyphMap },
211
- { name: "AntDesign", component: AntDesign__default.default, glyphMap: AntDesign__default.default.glyphMap },
212
- { name: "Feather", component: Feather__default.default, glyphMap: Feather__default.default.glyphMap }
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 ICON_FAMILIES) {
218
- if (!family.glyphMap) continue;
219
- for (const iconName of Object.keys(family.glyphMap)) {
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 = ICON_FAMILIES.find((f) => f.name === family) ?? null;
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: "Poppins-Bold",
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: "Poppins-Bold",
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: "Poppins-Medium",
324
- fontSize: 22,
325
- fontWeight: "500",
326
- lineHeight: 26,
327
- letterSpacing: -0.44
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: "Poppins-Bold",
331
- fontSize: 21,
332
- fontWeight: "700",
333
- lineHeight: 30,
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: "Poppins-SemiBold",
338
- fontSize: 20,
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: "Poppins-SemiBold",
345
- fontSize: 16,
360
+ fontFamily: "Sohne-SemiBold",
361
+ fontSize: 17,
346
362
  fontWeight: "600",
347
- lineHeight: 20,
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: "Poppins-Medium",
352
- fontSize: 16,
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: "Poppins-Regular",
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: "Poppins-Regular",
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: "Poppins-Medium",
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: "Poppins-Regular",
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: "Poppins-SemiBold",
403
+ fontFamily: "Sohne-SemiBold",
387
404
  fontSize: 11,
388
405
  fontWeight: "600",
389
- lineHeight: 13,
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: "Poppins-Bold",
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: "Poppins-Bold",
401
- fontSize: 10,
426
+ fontFamily: "Sohne-Bold",
427
+ fontSize: 11,
402
428
  fontWeight: "700",
403
- lineHeight: 13,
404
- letterSpacing: 0.8,
429
+ lineHeight: 14,
430
+ letterSpacing: 0.6,
405
431
  textTransform: "uppercase"
406
432
  },
407
433
  "button-lg": {
408
- fontFamily: "Poppins-Medium",
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: "Poppins-Medium",
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 Button({
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
- text: { color: colors.foreground },
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.foreground;
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: "Poppins-Medium",
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
- children,
646
- (child) => React26__default.default.isValidElement(child) ? React26__default.default.cloneElement(child, {
647
- style: [
648
- child.props.style,
649
- { flex: 1 }
650
- ]
651
- }) : child
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 IconButton({
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: "Poppins-Bold",
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 Text3({ variant = "body-md", color, style, children, ...props }) {
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 borderColorStyle = Animated9.useAnimatedStyle(() => ({
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: "Poppins-Medium",
965
+ fontFamily: "Sohne-Medium",
932
966
  fontSize: ms(14)
933
967
  },
934
968
  inputWrapper: {
935
969
  flexDirection: "row",
936
970
  alignItems: "center",
937
- borderWidth: 2,
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: "Poppins-Regular",
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: "Poppins-Regular",
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: "Poppins-Regular",
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(4)
1008
+ padding: s(12),
1009
+ margin: -s(8)
968
1010
  },
969
1011
  helperText: {
970
- fontFamily: "Poppins-Regular",
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 Badge({ label, children, variant = "default", size = "md", icon, iconName, iconColor, style }) {
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: "Poppins-Medium"
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
- borderColor: colors.border,
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: 6 },
1048
- shadowOpacity: 0.1,
1049
- shadowRadius: 16,
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.foregroundMuted }, style], allowFontScaling: true }, children);
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: "Poppins-SemiBold",
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: "Poppins-Regular",
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.border },
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: "Poppins-Regular",
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 Avatar({ src, fallback, fallbackText, size = "md", status, style }) {
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: "Poppins-Medium"
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 accentColor = variant === "destructive" ? colors.destructive : variant === "success" ? colors.success : variant === "warning" ? colors.warning : colors.primary;
1344
- 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 }) : /* @__PURE__ */ React26__default.default.createElement(vectorIcons.Entypo, { name: "info-with-circle", size: ms(16), color: accentColor });
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(reactNative.View, { style: [styles11.container, { backgroundColor: colors.card }, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles11.iconSlot }, effectiveIcon), /* @__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.foregroundMuted }], allowFontScaling: true }, description) : null));
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(8),
1355
- paddingHorizontal: s(10)
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: "Poppins-Medium",
1366
- fontSize: ms(13),
1367
- lineHeight: ms(19)
1431
+ fontFamily: "Sohne-Medium",
1432
+ fontSize: ms(13)
1368
1433
  },
1369
1434
  description: {
1370
- fontFamily: "Poppins-Regular",
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: "Poppins-Medium",
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: "Poppins-Regular",
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 borderColorStyle = Animated9.useAnimatedStyle(() => ({
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: "Poppins-Medium",
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
- borderWidth: 2,
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: "Poppins-Regular",
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: "Poppins-Regular",
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 /* @__PURE__ */ React26__default.default.createElement(
1636
- reactNative.TouchableOpacity,
1637
- {
1638
- style: [styles15.row, style],
1639
- onPress: () => {
1640
- selectionAsync();
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.label, { color: disabled ? colors.foregroundMuted : colors.foreground }],
1663
- allowFontScaling: true
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
- label
1666
- ) : null
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: "Poppins-Regular",
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(LeftIcon, null), label ? /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.Text, { style: [styles17.label, textStyle], allowFontScaling: true }, label) : null)
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: "Poppins-Medium",
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 /* @__PURE__ */ React26__default.default.createElement(
1907
- reactNative.TouchableOpacity,
1908
- {
1909
- style: styles18.row,
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.Text,
2016
+ reactNative.TouchableOpacity,
1938
2017
  {
1939
- style: [
1940
- styles18.label,
1941
- { color: option.disabled ? colors.foregroundMuted : colors.foreground }
1942
- ],
1943
- allowFontScaling: true
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
- option.label
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: "Poppins-Regular",
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
- { color: isActive ? colors.foreground : colors.foregroundMuted },
2043
- isActive && (isUnderline ? styles19.activeTriggerLabelUnderline : styles19.activeTriggerLabel)
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: "Poppins-Regular",
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: "Poppins-Medium",
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(14),
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: "Poppins-Medium",
2475
+ fontFamily: "Sohne-Medium",
2372
2476
  fontSize: ms(15)
2373
2477
  },
2374
2478
  valueText: {
2375
- fontFamily: "Poppins-Medium",
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 renderFooter = React26.useCallback((props) => {
2430
- if (!footer) return null;
2431
- return /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetFooter, { ...props }, footer);
2432
- }, [footer]);
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: footer ? renderFooter : void 0,
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
- children
2484
- ) : /* @__PURE__ */ React26__default.default.createElement(bottomSheet.BottomSheetView, { style: [styles22.content, contentStyle, style] }, headerNode, children)
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: "Poppins-SemiBold",
2635
+ fontFamily: "Sohne-SemiBold",
2510
2636
  fontSize: ms(18),
2511
2637
  flex: 1
2512
2638
  },
2513
2639
  subtitle: {
2514
- fontFamily: "Poppins-Regular",
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: "Poppins-Medium",
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: "Poppins-Regular",
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: "Poppins-Regular",
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: "Poppins-SemiBold",
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: "Poppins-SemiBold",
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: false,
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: "Poppins-Medium",
2928
+ fontFamily: "Sohne-Medium",
2793
2929
  fontSize: ms(13)
2794
2930
  },
2795
2931
  descriptionStyle: {
2796
- fontFamily: "Poppins-Regular",
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: "Poppins-Regular", fontSize: ms(36) } : { fontFamily: "Poppins-Regular" };
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 CurrencyDisplay({ value, prefix = "$", showDecimals = false, textColor, variant, autoScale, maxFontSize, style }) {
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: "Poppins-Bold",
3039
+ fontFamily: "Sohne-Bold",
2903
3040
  includeFontPadding: false,
2904
3041
  textAlignVertical: "top"
2905
3042
  }
2906
3043
  });
2907
- function ListItem({
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: 0,
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: "Poppins-Medium",
3171
+ fontFamily: "Sohne-Medium",
3037
3172
  fontSize: ms(15),
3038
3173
  lineHeight: mvs(22)
3039
3174
  },
3040
3175
  subtitle: {
3041
- fontFamily: "Poppins-Regular",
3176
+ fontFamily: "Sohne-Regular",
3042
3177
  fontSize: ms(13),
3043
3178
  lineHeight: mvs(18)
3044
3179
  },
3045
3180
  caption: {
3046
- fontFamily: "Poppins-Regular",
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: "Poppins-Regular",
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 MenuItem({
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 && styles26.disabled], ...hoverHandlers }, /* @__PURE__ */ React26__default.default.createElement(
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: [styles26.container, cardStyle, 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: styles26.iconContainer }, resolvedIcon) : null,
3124
- /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles26.labelContainer }, /* @__PURE__ */ React26__default.default.createElement(
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: [styles26.label, { color: colors.foreground }, labelStyle],
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: [styles26.subtitle, { color: colors.foregroundMuted }],
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: styles26.rightContainer,
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
- styles26.separator,
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 styles26 = reactNative.StyleSheet.create({
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: 0,
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: "Poppins-Medium",
3391
+ fontFamily: "Sohne-Medium",
3186
3392
  fontSize: ms(15)
3187
3393
  },
3188
3394
  subtitle: {
3189
- fontFamily: "Poppins-Regular",
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 Chip({ label, selected = false, onPress, icon, iconName, style, accessibilityLabel }) {
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: [styles27.wrapper, scaleStyle, style], ...hoverHandlers }, /* @__PURE__ */ React26__default.default.createElement(
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: [styles27.chip, surfaceStyle] }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles27.chipIcon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.Text, { style: [styles27.label, textStyle], allowFontScaling: true }, label))
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: [styles27.group, style] }, options.map((opt) => /* @__PURE__ */ React26__default.default.createElement(
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 ? { opacity: 0.4 } : void 0
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 styles27 = reactNative.StyleSheet.create({
3548
+ var styles29 = reactNative.StyleSheet.create({
3269
3549
  wrapper: {},
3270
3550
  chip: {
3271
3551
  borderRadius: 999,
3272
3552
  paddingHorizontal: s(14),
3273
- paddingVertical: vs(5),
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: "Poppins-Medium",
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: [styles28.background, { backgroundColor: colors.card }],
3332
- handleIndicatorStyle: [styles28.handle, { backgroundColor: colors.border }],
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: styles28.content }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles28.title, { color: colors.foreground }], allowFontScaling: true }, title), description ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles28.description, { color: colors.foregroundMuted }], allowFontScaling: true }, description) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles28.actions }, /* @__PURE__ */ React26__default.default.createElement(
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 styles28 = reactNative.StyleSheet.create({
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: "Poppins-SemiBold",
3671
+ fontFamily: "Sohne-SemiBold",
3386
3672
  fontSize: ms(18),
3387
3673
  lineHeight: mvs(26)
3388
3674
  },
3389
3675
  description: {
3390
- fontFamily: "Poppins-Regular",
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 LabelValue({ label, value, iconName, iconColor, style }) {
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: [styles29.container, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles29.labelSide }, resolvedIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles29.icon }, resolvedIcon) : null, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles29.label, { color: colors.foregroundMuted }], allowFontScaling: true }, label)), typeof value === "string" ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles29.value, { color: colors.foreground }], allowFontScaling: true }, value) : value);
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 styles29 = reactNative.StyleSheet.create({
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: "Poppins-Regular",
3708
+ fontFamily: "Sohne-Regular",
3422
3709
  fontSize: ms(13),
3423
3710
  lineHeight: mvs(18)
3424
3711
  },
3425
3712
  value: {
3426
- fontFamily: "Poppins-Medium",
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: [styles30.container, style], accessibilityRole: "adjustable", accessibilityLabel: getLabel() }, /* @__PURE__ */ React26__default.default.createElement(
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: styles30.arrow,
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: [styles30.label, { color: colors.foreground }],
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: styles30.arrow,
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 styles30 = reactNative.StyleSheet.create({
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: "Poppins-Medium",
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 MediaCard({
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
- styles31.card,
3560
- hovered && styles31.cardHovered,
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: [styles31.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(
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: styles31.image,
3856
+ style: styles33.image,
3570
3857
  resizeMode: "cover"
3571
3858
  }
3572
- ) : /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles31.imagePlaceholder, { backgroundColor: colors.surface }] }))), badge && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles31.badgeContainer }, badge), (onActionPress || actionIcon || actionIconName) && /* @__PURE__ */ React26__default.default.createElement(
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: [styles31.actionButton, { backgroundColor: "rgba(0,0,0,0.24)" }],
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: styles31.meta }, title ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.title, { color: colors.foreground }], numberOfLines: 2, allowFontScaling: true }, title) : null, subtitle ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.subtitle, { color: colors.foregroundSubtle }], numberOfLines: 1, allowFontScaling: true }, subtitle) : null, caption ? /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles31.caption, { color: colors.foregroundMuted }], numberOfLines: 1, allowFontScaling: true }, caption) : null, footer)
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 styles31 = reactNative.StyleSheet.create({
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: "Poppins-SemiBold",
3937
+ fontFamily: "Sohne-SemiBold",
3650
3938
  fontSize: ms(14),
3651
3939
  lineHeight: mvs(20)
3652
3940
  },
3653
3941
  subtitle: {
3654
- fontFamily: "Poppins-Regular",
3942
+ fontFamily: "Sohne-Regular",
3655
3943
  fontSize: ms(13),
3656
3944
  lineHeight: mvs(18)
3657
3945
  },
3658
3946
  caption: {
3659
- fontFamily: "Poppins-Regular",
3947
+ fontFamily: "Sohne-Regular",
3660
3948
  fontSize: ms(12),
3661
3949
  lineHeight: mvs(16)
3662
3950
  }
3663
3951
  });
3664
- function CategoryChip({
3952
+ var CategoryChip = React26__default.default.memo(function CategoryChip2({
3665
3953
  item,
3666
3954
  selected,
3667
- onPress
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: [styles32.chip, surfaceStyle] }, resolvedIcon && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles32.chipIcon }, resolvedIcon), /* @__PURE__ */ React26__default.default.createElement(Animated9__default.default.Text, { style: [styles32.chipLabel, textColorStyle], allowFontScaling: true }, item.label), item.badge !== void 0 && item.badge > 0 && /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: [styles32.chipBadge, { backgroundColor: colors.primary }] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.Text, { style: [styles32.chipBadgeText, { color: colors.primaryForeground }] }, Math.min(item.badge, 99))))
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 = (v) => {
3709
- selectionAsync();
3710
- if (multiSelect) {
3711
- const current = Array.isArray(value) ? value : value ? [value] : [];
3712
- const next = current.includes(v) ? current.filter((x) => x !== v) : [...current, v];
3713
- onValueChange?.(next);
3714
- } else {
3715
- onValueChange?.(v === value ? "" : v);
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: [styles32.container, style],
3724
- style: styles32.scroll,
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
- onPress: () => handlePress(cat.value)
4024
+ onSelect: handlePress
3734
4025
  }
3735
4026
  )))
3736
4027
  );
3737
4028
  }
3738
- var styles32 = reactNative.StyleSheet.create({
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: "Poppins-Medium",
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: "Poppins-Bold",
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: "Poppins-Regular",
3826
- medium: "Poppins-Medium",
3827
- semibold: "Poppins-SemiBold",
3828
- bold: "Poppins-Bold"
4116
+ normal: "Sohne-Regular",
4117
+ medium: "Sohne-Medium",
4118
+ semibold: "Sohne-SemiBold",
4119
+ bold: "Sohne-Bold"
3829
4120
  };
3830
- function DetailRow({
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: [styles33.row, style] }, /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.labelSide }, resolvedLeftIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.icon }, resolvedLeftIcon) : null, typeof label === "string" ? /* @__PURE__ */ React26__default.default.createElement(
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: [styles33.labelText, { color: colors.foregroundMuted, fontFamily: weightMap[labelWeight] }, labelStyle],
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: styles33.spacer }), /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles33.valueSide }, typeof value === "string" ? /* @__PURE__ */ React26__default.default.createElement(
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: [styles33.valueText, { color: valueColor ?? colors.foreground }, valueStyle],
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: styles33.icon }, resolvedRightIcon) : null));
4161
+ ) : value, resolvedRightIcon ? /* @__PURE__ */ React26__default.default.createElement(reactNative.View, { style: styles35.icon }, resolvedRightIcon) : null));
3871
4162
  }
3872
- var styles33 = reactNative.StyleSheet.create({
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: "Poppins-SemiBold",
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;