@expokit/cli 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +30 -3
  2. package/bin/expo-kit.js +749 -288
  3. package/bin/lib.mjs +313 -4
  4. package/package.json +1 -1
  5. package/registry/_docs/action-sheet.json +1 -1
  6. package/registry/_docs/alert.json +6 -0
  7. package/registry/_docs/bottom-sheet.json +6 -0
  8. package/registry/_docs/bullet.json +6 -0
  9. package/registry/_docs/dialog.json +1 -1
  10. package/registry/_docs/drawer.json +3 -3
  11. package/registry/_docs/flip-calendar.json +106 -0
  12. package/registry/_docs/glass-search-bar.json +1 -1
  13. package/registry/_docs/grain.json +6 -1
  14. package/registry/_docs/isometric-bar.json +6 -0
  15. package/registry/_docs/liquidglass-tab.json +1 -1
  16. package/registry/_docs/password-input.json +1 -1
  17. package/registry/_docs/paywall.json +144 -0
  18. package/registry/_docs/pixel-bar.json +6 -0
  19. package/registry/_docs/polar-area.json +6 -0
  20. package/registry/_docs/qr-code-button.json +9 -3
  21. package/registry/_docs/ruler-time-picker.json +147 -0
  22. package/registry/_docs/scratch-card.json +7 -1
  23. package/registry/_docs/search-bar.json +1 -1
  24. package/registry/_docs/select.json +2 -2
  25. package/registry/_docs/slide-to-confirm.json +2 -2
  26. package/registry/_docs/spinner.json +1 -1
  27. package/registry/_docs/stateful-button.json +2 -2
  28. package/registry/_docs/swipe-deck.json +1 -1
  29. package/registry/_docs/time-picker.json +2 -2
  30. package/registry/_docs/timeline-chart.json +6 -0
  31. package/registry/_docs/toast.json +15 -3
  32. package/registry/_docs/treemap.json +6 -0
  33. package/registry/_docs/waterfall.json +6 -0
  34. package/registry/accordion/files/src/components/ui/accordion.tsx +6 -4
  35. package/registry/accordion/files/src/lib/kit.tsx +462 -12
  36. package/registry/accordion.json +1 -0
  37. package/registry/action-sheet/files/src/components/ui/action-sheet.tsx +50 -58
  38. package/registry/action-sheet/files/src/lib/kit.tsx +462 -12
  39. package/registry/action-sheet.json +1 -0
  40. package/registry/alert/files/src/components/ui/alert.tsx +20 -13
  41. package/registry/alert/files/src/lib/kit.tsx +462 -12
  42. package/registry/alert.json +3 -4
  43. package/registry/assistant-app.json +1 -0
  44. package/registry/avatar/files/src/components/ui/avatar.tsx +89 -74
  45. package/registry/avatar/files/src/lib/kit.tsx +462 -12
  46. package/registry/avatar.json +1 -0
  47. package/registry/badge/files/src/components/ui/badge.tsx +36 -36
  48. package/registry/badge/files/src/lib/kit.tsx +462 -12
  49. package/registry/badge.json +1 -0
  50. package/registry/bottom-nav/files/src/components/ui/bottom-nav.tsx +39 -44
  51. package/registry/bottom-nav/files/src/lib/kit.tsx +462 -12
  52. package/registry/bottom-nav.json +5 -0
  53. package/registry/bottom-sheet/files/src/components/ui/bottom-sheet.tsx +357 -300
  54. package/registry/bottom-sheet/files/src/lib/kit.tsx +462 -12
  55. package/registry/bottom-sheet.json +5 -1
  56. package/registry/bullet.json +1 -0
  57. package/registry/button/files/src/components/ui/button.tsx +23 -34
  58. package/registry/button/files/src/lib/kit.tsx +462 -12
  59. package/registry/button-3d/files/src/components/ui/button-3d.tsx +6 -9
  60. package/registry/button-3d/files/src/lib/kit.tsx +462 -12
  61. package/registry/button-3d.json +1 -0
  62. package/registry/button.json +1 -0
  63. package/registry/calendar/files/src/components/ui/calendar.tsx +77 -79
  64. package/registry/calendar/files/src/lib/kit.tsx +462 -12
  65. package/registry/calendar.json +1 -0
  66. package/registry/card/files/src/components/ui/card.tsx +7 -6
  67. package/registry/card/files/src/lib/kit.tsx +462 -12
  68. package/registry/card-stack.json +1 -0
  69. package/registry/card.json +1 -0
  70. package/registry/carousel.json +1 -0
  71. package/registry/chat.json +7 -0
  72. package/registry/checkbox/files/src/components/ui/checkbox.tsx +4 -4
  73. package/registry/checkbox/files/src/lib/kit.tsx +462 -12
  74. package/registry/checkbox.json +1 -0
  75. package/registry/checkout.json +1 -0
  76. package/registry/chip-group/files/src/components/ui/chip-group.tsx +24 -24
  77. package/registry/chip-group/files/src/lib/kit.tsx +462 -12
  78. package/registry/chip-group.json +1 -0
  79. package/registry/confetti/files/src/components/ui/confetti.tsx +15 -14
  80. package/registry/confetti.json +3 -6
  81. package/registry/coupon/files/src/components/ui/coupon.tsx +47 -52
  82. package/registry/coupon/files/src/components/ui/flip-card.tsx +9 -14
  83. package/registry/coupon/files/src/components/ui/tilt-card.tsx +80 -101
  84. package/registry/coupon/files/src/lib/kit.tsx +462 -12
  85. package/registry/coupon/files/src/lib/ticket-shape.tsx +54 -44
  86. package/registry/coupon.json +1 -0
  87. package/registry/cube-pager.json +1 -0
  88. package/registry/dashboard.json +1 -0
  89. package/registry/date-picker/files/src/components/ui/calendar.tsx +77 -79
  90. package/registry/date-picker/files/src/components/ui/date-picker.tsx +64 -71
  91. package/registry/date-picker/files/src/lib/kit.tsx +462 -12
  92. package/registry/date-picker.json +1 -0
  93. package/registry/dialog/files/src/components/ui/dialog.tsx +66 -68
  94. package/registry/dialog/files/src/lib/kit.tsx +462 -12
  95. package/registry/dialog.json +1 -0
  96. package/registry/donut-shop.json +1 -0
  97. package/registry/drawer/files/src/components/ui/drawer.tsx +76 -88
  98. package/registry/drawer/files/src/lib/kit.tsx +462 -12
  99. package/registry/drawer.json +1 -0
  100. package/registry/fab.json +1 -0
  101. package/registry/fintech-app.json +1 -0
  102. package/registry/flip-calendar/files/src/components/ui/flip-calendar.tsx +632 -0
  103. package/registry/flip-calendar/files/src/lib/kit.tsx +672 -0
  104. package/registry/flip-calendar.json +24 -0
  105. package/registry/flip-card/files/src/components/ui/flip-card.tsx +9 -14
  106. package/registry/flip-card/files/src/lib/kit.tsx +462 -12
  107. package/registry/flip-card.json +1 -0
  108. package/registry/floating-input/files/src/components/ui/floating-input.tsx +33 -33
  109. package/registry/floating-input/files/src/lib/kit.tsx +462 -12
  110. package/registry/floating-input.json +1 -0
  111. package/registry/food-app.json +1 -0
  112. package/registry/gift-card.json +1 -0
  113. package/registry/glass-button.json +5 -0
  114. package/registry/glass-nav-bar.json +1 -0
  115. package/registry/glass-search-bar.json +1 -0
  116. package/registry/glass-segmented.json +1 -0
  117. package/registry/glass-sheet.json +1 -0
  118. package/registry/glass-tab-bar.json +5 -0
  119. package/registry/glass.json +1 -0
  120. package/registry/grain/files/src/components/ui/grain.tsx +16 -14
  121. package/registry/grain.json +8 -6
  122. package/registry/inbox.json +1 -0
  123. package/registry/isometric-bar.json +1 -0
  124. package/registry/kit/files/src/lib/kit.tsx +462 -12
  125. package/registry/kit.json +1 -0
  126. package/registry/liquidglass-tab/files/src/app/_layout.tsx +0 -1
  127. package/registry/liquidglass-tab/files/src/components/GlassTabBar.tsx +29 -16
  128. package/registry/liquidglass-tab/files/src/components/TabScreen.tsx +33 -19
  129. package/registry/liquidglass-tab/files/src/lib/tab-icons.ts +1 -1
  130. package/registry/liquidglass-tab.json +1 -0
  131. package/registry/list-item/files/src/components/ui/list-item.tsx +43 -43
  132. package/registry/list-item/files/src/lib/kit.tsx +462 -12
  133. package/registry/list-item.json +1 -0
  134. package/registry/loyalty-card.json +1 -0
  135. package/registry/morphing-button-group.json +1 -0
  136. package/registry/number-ticker.json +1 -0
  137. package/registry/offers.json +1 -0
  138. package/registry/onboarding.json +1 -0
  139. package/registry/orb-reveal.json +1 -0
  140. package/registry/otp-input/files/src/components/ui/otp-input.tsx +49 -30
  141. package/registry/otp-input/files/src/lib/kit.tsx +462 -12
  142. package/registry/otp-input.json +1 -0
  143. package/registry/parallax-layers.json +1 -0
  144. package/registry/parallax-scroll.json +1 -0
  145. package/registry/password-input/files/src/components/ui/floating-input.tsx +33 -33
  146. package/registry/password-input/files/src/components/ui/password-input.tsx +29 -25
  147. package/registry/password-input/files/src/lib/kit.tsx +462 -12
  148. package/registry/password-input.json +1 -0
  149. package/registry/payment-card/files/src/components/ui/flip-card.tsx +9 -14
  150. package/registry/payment-card/files/src/components/ui/payment-card.tsx +26 -20
  151. package/registry/payment-card/files/src/components/ui/tilt-card.tsx +80 -101
  152. package/registry/payment-card/files/src/lib/kit.tsx +462 -12
  153. package/registry/payment-card.json +1 -0
  154. package/registry/paywall.json +23 -0
  155. package/registry/pixel-bar.json +1 -0
  156. package/registry/polar-area.json +1 -0
  157. package/registry/profile.json +1 -0
  158. package/registry/progress/files/src/components/ui/progress.tsx +31 -29
  159. package/registry/progress/files/src/lib/kit.tsx +462 -12
  160. package/registry/progress-steps/files/src/components/ui/progress-steps.tsx +21 -21
  161. package/registry/progress-steps/files/src/lib/kit.tsx +462 -12
  162. package/registry/progress-steps.json +1 -0
  163. package/registry/progress.json +1 -0
  164. package/registry/qr-code-button.json +1 -0
  165. package/registry/radio-group/files/src/components/ui/radio-group.tsx +19 -19
  166. package/registry/radio-group/files/src/lib/kit.tsx +462 -12
  167. package/registry/radio-group.json +1 -0
  168. package/registry/rating.json +1 -0
  169. package/registry/ring-carousel.json +1 -0
  170. package/registry/ruler-time-picker/files/src/components/ui/ruler-time-picker.tsx +832 -0
  171. package/registry/ruler-time-picker/files/src/lib/kit.tsx +672 -0
  172. package/registry/ruler-time-picker.json +26 -0
  173. package/registry/scratch-card.json +1 -0
  174. package/registry/search-bar/files/src/components/ui/search-bar.tsx +28 -28
  175. package/registry/search-bar/files/src/lib/kit.tsx +462 -12
  176. package/registry/search-bar.json +1 -0
  177. package/registry/search-results.json +4 -0
  178. package/registry/segmented-control/files/src/components/ui/segmented-control.tsx +11 -17
  179. package/registry/segmented-control/files/src/lib/kit.tsx +462 -12
  180. package/registry/segmented-control.json +1 -0
  181. package/registry/select/files/src/components/ui/select.tsx +107 -104
  182. package/registry/select/files/src/lib/kit.tsx +462 -12
  183. package/registry/select.json +6 -0
  184. package/registry/settings.json +1 -0
  185. package/registry/sign-in.json +1 -0
  186. package/registry/skeleton/files/src/components/ui/skeleton.tsx +149 -80
  187. package/registry/skeleton/files/src/lib/kit.tsx +462 -12
  188. package/registry/skeleton.json +1 -0
  189. package/registry/slide-to-confirm.json +1 -0
  190. package/registry/slider/files/src/components/ui/slider.tsx +106 -108
  191. package/registry/slider/files/src/lib/kit.tsx +462 -12
  192. package/registry/slider.json +5 -0
  193. package/registry/spin-wheel.json +1 -0
  194. package/registry/spinner/files/src/components/ui/spinner.tsx +39 -29
  195. package/registry/spinner/files/src/lib/kit.tsx +462 -12
  196. package/registry/spinner.json +6 -0
  197. package/registry/stateful-button/files/src/components/ui/stateful-button.tsx +39 -32
  198. package/registry/stateful-button/files/src/lib/kit.tsx +462 -12
  199. package/registry/stateful-button.json +5 -0
  200. package/registry/stepper/files/src/components/ui/stepper.tsx +40 -38
  201. package/registry/stepper/files/src/lib/kit.tsx +462 -12
  202. package/registry/stepper.json +1 -0
  203. package/registry/swipe-deck.json +1 -0
  204. package/registry/swipeable-row.json +4 -0
  205. package/registry/switch/files/src/components/ui/switch.tsx +41 -47
  206. package/registry/switch/files/src/lib/kit.tsx +462 -12
  207. package/registry/switch.json +1 -0
  208. package/registry/tabs/files/src/components/ui/tabs.tsx +61 -64
  209. package/registry/tabs/files/src/lib/kit.tsx +462 -12
  210. package/registry/tabs.json +1 -0
  211. package/registry/text-animation/files/src/components/ui/text-animation.tsx +55 -42
  212. package/registry/text-animation/files/src/lib/kit.tsx +462 -12
  213. package/registry/text-animation.json +7 -0
  214. package/registry/textarea/files/src/components/ui/textarea.tsx +10 -10
  215. package/registry/textarea/files/src/lib/kit.tsx +462 -12
  216. package/registry/textarea.json +1 -0
  217. package/registry/ticket-card.json +1 -0
  218. package/registry/ticket-shape/files/src/lib/kit.tsx +462 -12
  219. package/registry/ticket-shape/files/src/lib/ticket-shape.tsx +54 -44
  220. package/registry/ticket-shape.json +1 -0
  221. package/registry/tilt-card/files/src/components/ui/tilt-card.tsx +80 -101
  222. package/registry/tilt-card/files/src/lib/kit.tsx +462 -12
  223. package/registry/tilt-card.json +1 -0
  224. package/registry/time-picker/files/src/components/ui/time-picker.tsx +136 -131
  225. package/registry/time-picker/files/src/lib/kit.tsx +462 -12
  226. package/registry/time-picker.json +1 -0
  227. package/registry/timeline/files/src/components/ui/avatar.tsx +89 -74
  228. package/registry/timeline/files/src/components/ui/timeline.tsx +49 -57
  229. package/registry/timeline/files/src/lib/kit.tsx +462 -12
  230. package/registry/timeline-chart.json +1 -0
  231. package/registry/timeline.json +1 -0
  232. package/registry/toast/files/src/components/ui/toast.tsx +543 -465
  233. package/registry/toast/files/src/lib/kit.tsx +462 -12
  234. package/registry/toast.json +7 -5
  235. package/registry/treemap.json +1 -0
  236. package/registry/waterfall.json +1 -0
  237. package/registry/wheel-list.json +1 -0
  238. package/schema/components.schema.json +1 -0
  239. package/registry/alert/files/src/components/ui/button.tsx +0 -303
  240. package/registry/confetti/files/src/lib/kit.tsx +0 -222
  241. package/registry/grain/files/src/lib/kit.tsx +0 -222
  242. package/registry/toast/files/src/components/ui/button.tsx +0 -303
@@ -1,11 +1,10 @@
1
1
  import * as Haptics from 'expo-haptics';
2
- import React, { useEffect, useMemo, useRef, useState } from 'react';
2
+ import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';
3
3
  import {
4
4
  AccessibilityInfo,
5
5
  Animated,
6
6
  Easing,
7
7
  Modal,
8
- PanResponder,
9
8
  Platform,
10
9
  Pressable,
11
10
  StyleSheet,
@@ -17,7 +16,7 @@ import {
17
16
  } from 'react-native';
18
17
  import Svg, { Path } from 'react-native-svg';
19
18
 
20
- import { alpha, motion, readableOn, useKit } from '@/lib/kit';
19
+ import { alpha, motion, readableOn, useKit, useLayout, usePanResponder } from '@/lib/kit';
21
20
 
22
21
  /**
23
22
  * `inset` — iOS: grouped rounded cards floating above the home indicator, with a separate Cancel card (default).
@@ -128,7 +127,7 @@ export function ActionSheet({
128
127
  title,
129
128
  message,
130
129
  actions,
131
- cancelLabel = 'Cancel',
130
+ cancelLabel: cancelLabelProp,
132
131
  onCancel,
133
132
  variant = 'inset',
134
133
  bottomInset = DEFAULT_BOTTOM_INSET,
@@ -137,22 +136,25 @@ export function ActionSheet({
137
136
  haptics = true,
138
137
  style,
139
138
  }: ActionSheetProps) {
140
- const { colors, radius, dark, font } = useKit();
139
+ const { colors, radius, dark, font, labels } = useKit();
140
+ const cancelLabel = cancelLabelProp === undefined ? labels.cancel : cancelLabelProp; // null hides it
141
141
  const ff = font.family ? { fontFamily: font.family } : null;
142
142
  const { height: winH } = useWindowDimensions();
143
+ // Full width on portrait phones; a centred, width-capped card on foldables, tablets and landscape.
144
+ const { sheetWidth } = useLayout();
143
145
  const reduceMotion = useReduceMotion();
144
146
  const tint = accent ?? colors.accent;
145
147
  const [inner, setInner] = useState(defaultOpen);
146
148
  const isOpen = open ?? inner;
147
149
  // Stays mounted while the exit animation runs; cleared in its completion callback.
148
- const keep = useRef(isOpen);
149
- const [, rerender] = useState(0);
150
- const mounted = isOpen || keep.current;
150
+ const [keep, setKeep] = useState(isOpen);
151
+ if (isOpen && !keep) setKeep(true);
152
+ const mounted = isOpen || keep;
151
153
 
152
154
  // Both native-driven, on the sheet node: open progress (0 → 1) and finger offset.
153
- const t = useRef(new Animated.Value(0)).current;
154
- const drag = useRef(new Animated.Value(0)).current;
155
- const sheetH = useRef(320);
155
+ const [t] = useState(() => new Animated.Value(0));
156
+ const [drag] = useState(() => new Animated.Value(0));
157
+ const [sheetH, setSheetH] = useState(320);
156
158
  const flung = useRef(false);
157
159
 
158
160
  const setOpen = (next: boolean) => {
@@ -165,11 +167,12 @@ export function ActionSheet({
165
167
  setOpen(false);
166
168
  };
167
169
  const live = useRef({ dismiss, dismissible });
168
- live.current = { dismiss, dismissible };
170
+ useLayoutEffect(() => {
171
+ live.current = { dismiss, dismissible };
172
+ });
169
173
 
170
174
  useEffect(() => {
171
175
  if (isOpen) {
172
- keep.current = true;
173
176
  drag.setValue(0);
174
177
  flung.current = false;
175
178
  if (haptics) Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light).catch(() => {});
@@ -185,9 +188,7 @@ export function ActionSheet({
185
188
  easing: flung.current ? Easing.out(Easing.cubic) : Easing.in(Easing.quad),
186
189
  useNativeDriver: true,
187
190
  }).start(({ finished }) => {
188
- if (!finished) return;
189
- keep.current = false;
190
- rerender((n) => n + 1);
191
+ if (finished) setKeep(false);
191
192
  });
192
193
  }
193
194
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -202,32 +203,30 @@ export function ActionSheet({
202
203
  }, [isOpen]);
203
204
 
204
205
  // Drag anywhere on the sheet: a vertical move steals the touch from the row under the finger.
205
- const pan = useMemo(() => {
206
- const settle = (velocity = 0) =>
207
- Animated.spring(drag, { toValue: 0, velocity, useNativeDriver: true, ...motion.snappy }).start();
208
- return PanResponder.create({
209
- onMoveShouldSetPanResponderCapture: (_, g) => Math.abs(g.dy) > 8 && Math.abs(g.dy) > Math.abs(g.dx) * 1.4,
210
- onPanResponderGrant: () => drag.stopAnimation(),
211
- onPanResponderMove: (_, g) => {
212
- const down = live.current.dismissible ? g.dy : rubber(g.dy, 90);
213
- drag.setValue(g.dy > 0 ? down : -rubber(-g.dy, 70));
214
- },
215
- onPanResponderRelease: (_, g) => {
216
- const far = g.dy > sheetH.current * 0.3;
217
- const flick = g.vy > 0.9 && g.dy > 12;
218
- if (live.current.dismissible && (far || flick)) {
219
- flung.current = true;
220
- live.current.dismiss();
221
- } else settle(g.vy);
222
- },
223
- onPanResponderTerminationRequest: () => false,
224
- onPanResponderTerminate: () => settle(),
225
- });
226
- }, [drag]);
206
+ const settle = (velocity = 0) =>
207
+ Animated.spring(drag, { toValue: 0, velocity, useNativeDriver: true, ...motion.snappy }).start();
208
+ const pan = usePanResponder({
209
+ onMoveShouldSetPanResponderCapture: (_, g) => Math.abs(g.dy) > 8 && Math.abs(g.dy) > Math.abs(g.dx) * 1.4,
210
+ onPanResponderGrant: () => drag.stopAnimation(),
211
+ onPanResponderMove: (_, g) => {
212
+ const down = dismissible ? g.dy : rubber(g.dy, 90);
213
+ drag.setValue(g.dy > 0 ? down : -rubber(-g.dy, 70));
214
+ },
215
+ onPanResponderRelease: (_, g) => {
216
+ const far = g.dy > sheetH * 0.3;
217
+ const flick = g.vy > 0.9 && g.dy > 12;
218
+ if (dismissible && (far || flick)) {
219
+ flung.current = true;
220
+ dismiss();
221
+ } else settle(g.vy);
222
+ },
223
+ onPanResponderTerminationRequest: () => false,
224
+ onPanResponderTerminate: () => settle(),
225
+ });
227
226
 
228
227
  const scrim = Animated.multiply(
229
228
  t,
230
- drag.interpolate({ inputRange: [0, Math.max(200, sheetH.current)], outputRange: [1, 0], extrapolate: 'clamp' }),
229
+ drag.interpolate({ inputRange: [0, Math.max(200, sheetH)], outputRange: [1, 0], extrapolate: 'clamp' }),
231
230
  );
232
231
 
233
232
  const pick = (a: ActionSheetAction) => {
@@ -320,7 +319,7 @@ export function ActionSheet({
320
319
  borderTopLeftRadius: radius.scale(28),
321
320
  borderTopRightRadius: radius.scale(28),
322
321
  borderColor: edge,
323
- shadowOpacity: dark ? 0.5 : 0.12,
322
+ boxShadow: `0px -6px 48px rgba(0,0,0,${dark ? 0.5 : 0.12})`,
324
323
  },
325
324
  ]}
326
325
  >
@@ -408,20 +407,19 @@ export function ActionSheet({
408
407
  style={StyleSheet.absoluteFill}
409
408
  onPress={dismiss}
410
409
  accessibilityRole="button"
411
- accessibilityLabel="Dismiss"
410
+ accessibilityLabel={labels.dismiss}
412
411
  importantForAccessibility={cancelLabel !== null ? 'no' : 'auto'}
413
412
  accessible={cancelLabel === null}
414
413
  />
415
414
  </Animated.View>
416
415
  <View style={styles.host} pointerEvents="box-none">
417
416
  <Animated.View
418
- {...pan.panHandlers}
417
+ {...pan}
419
418
  accessibilityViewIsModal
420
- onLayout={(e) => {
421
- sheetH.current = Math.max(1, Math.round(e.nativeEvent.layout.height));
422
- }}
419
+ onLayout={(e) => setSheetH(Math.max(1, Math.round(e.nativeEvent.layout.height)))}
423
420
  style={[
424
421
  styles.sheet,
422
+ { maxWidth: sheetWidth },
425
423
  inset && { paddingHorizontal: 8, paddingBottom: 8 + bottomInset },
426
424
  {
427
425
  opacity: reduceMotion ? t : 1,
@@ -459,8 +457,8 @@ function Card({
459
457
  children: React.ReactNode;
460
458
  }) {
461
459
  return (
462
- <View style={[styles.cardAmbient, { borderRadius: corner, backgroundColor: bg, shadowOpacity: dark ? 0.5 : 0.14 }]}>
463
- <View style={[styles.cardContact, { borderRadius: corner, backgroundColor: bg, shadowOpacity: dark ? 0.3 : 0.06 }]}>
460
+ <View style={{ borderRadius: corner, backgroundColor: bg, boxShadow: `0px 10px 48px rgba(0,0,0,${dark ? 0.5 : 0.14})` }}>
461
+ <View style={{ borderRadius: corner, backgroundColor: bg, boxShadow: `0px 1px 4px rgba(0,0,0,${dark ? 0.3 : 0.06})` }}>
464
462
  <View style={{ borderRadius: corner, overflow: 'hidden', borderWidth: StyleSheet.hairlineWidth, borderColor: edge }}>
465
463
  {children}
466
464
  </View>
@@ -480,14 +478,14 @@ function Row({
480
478
  children,
481
479
  }: {
482
480
  onPress: () => void;
483
- disabled?: boolean;
481
+ disabled?: boolean | undefined;
484
482
  label: string;
485
483
  highlight: string;
486
- corner?: number;
487
- style?: StyleProp<ViewStyle>;
484
+ corner?: number | undefined;
485
+ style?: StyleProp<ViewStyle> | undefined;
488
486
  children: React.ReactNode;
489
487
  }) {
490
- const hl = useRef(new Animated.Value(0)).current;
488
+ const [hl] = useState(() => new Animated.Value(0));
491
489
  return (
492
490
  <Pressable
493
491
  onPress={onPress}
@@ -546,9 +544,7 @@ function useReduceMotion() {
546
544
 
547
545
  const styles = StyleSheet.create({
548
546
  host: { flex: 1, justifyContent: 'flex-end', alignItems: 'center' },
549
- sheet: { width: '100%', maxWidth: 480, gap: 8 },
550
- cardAmbient: { shadowColor: '#000', shadowRadius: 24, shadowOffset: { width: 0, height: 10 }, elevation: 10 },
551
- cardContact: { shadowColor: '#000', shadowRadius: 2, shadowOffset: { width: 0, height: 1 } },
547
+ sheet: { width: '100%', gap: 8 },
552
548
  head: { paddingHorizontal: 24, paddingTop: 15, paddingBottom: 14, alignItems: 'center', gap: 4 },
553
549
  headLeft: { paddingHorizontal: 20, paddingTop: 6, paddingBottom: 10, gap: 4 },
554
550
  title: { fontSize: 13.5, lineHeight: 18, fontWeight: '400', textAlign: 'center' },
@@ -566,10 +562,6 @@ const styles = StyleSheet.create({
566
562
  borderWidth: StyleSheet.hairlineWidth,
567
563
  borderBottomWidth: 0,
568
564
  paddingHorizontal: 8,
569
- shadowColor: '#000',
570
- shadowRadius: 24,
571
- shadowOffset: { width: 0, height: -6 },
572
- elevation: 16,
573
565
  },
574
566
  listRow: { minHeight: 56, flexDirection: 'row', alignItems: 'center', paddingHorizontal: 16, gap: 16 },
575
567
  listIcon: { width: 24, alignItems: 'center' },