@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,9 +1,8 @@
1
1
  import * as Haptics from 'expo-haptics';
2
- import React, { useEffect, useMemo, useRef, useState, type ComponentRef } from 'react';
2
+ import React, { useEffect, useLayoutEffect, useRef, useState, type ComponentRef } from 'react';
3
3
  import {
4
4
  AccessibilityInfo,
5
5
  Animated,
6
- PanResponder,
7
6
  Pressable,
8
7
  ScrollView,
9
8
  StyleSheet,
@@ -13,7 +12,7 @@ import {
13
12
  type ViewStyle,
14
13
  } from 'react-native';
15
14
 
16
- import { alpha, motion, readableOn, useKit } from '@/lib/kit';
15
+ import { alpha, motion, readableOn, useKit, usePanResponder } from '@/lib/kit';
17
16
 
18
17
  /**
19
18
  * Tabs are underline tabs with content panes. `pill` and `soft` are @deprecated and render as
@@ -112,12 +111,12 @@ export function Tabs({
112
111
 
113
112
  // ---- animated values ----
114
113
  // Underline edges + pane height: JS driver (left / width / height).
115
- const lx = useRef(new Animated.Value(0)).current;
116
- const rx = useRef(new Animated.Value(0)).current;
117
- const hv = useRef(new Animated.Value(0)).current;
114
+ const [lx] = useState(() => new Animated.Value(0));
115
+ const [rx] = useState(() => new Animated.Value(0));
116
+ const [hv] = useState(() => new Animated.Value(0));
118
117
  // Pager offset + fade: native driver, on the pager row.
119
- const pan = useRef(new Animated.Value(0)).current;
120
- const fade = useRef(new Animated.Value(1)).current;
118
+ const [pan] = useState(() => new Animated.Value(0));
119
+ const [fade] = useState(() => new Animated.Value(1));
121
120
  const [lineShown, setLineShown] = useState(false);
122
121
  const [heightShown, setHeightShown] = useState(false);
123
122
  const linePlaced = useRef(false);
@@ -204,61 +203,58 @@ export function Tabs({
204
203
 
205
204
  // ---- swipe between panes ----
206
205
  const live = useRef({ index, items, paneW, swipe: false, select, edgesOf });
207
- live.current = { index, items, paneW, swipe: swipeable && hasContent && paneW > 0, select, edgesOf };
206
+ useLayoutEffect(() => {
207
+ live.current = { index, items, paneW, swipe: swipeable && hasContent && paneW > 0, select, edgesOf };
208
+ });
208
209
  const drag = useRef({ base: 0, off: 0 });
209
210
  const neighbour = (i: number, dir: 1 | -1) => {
210
211
  const t = live.current.items[i + dir];
211
212
  return t && !t.disabled ? i + dir : -1;
212
213
  };
213
214
 
214
- const responder = useMemo(
215
- () =>
216
- PanResponder.create({
217
- onMoveShouldSetPanResponder: (_, g) => live.current.swipe && Math.abs(g.dx) > 10 && Math.abs(g.dx) > Math.abs(g.dy) * 1.4,
218
- onPanResponderTerminationRequest: () => false,
219
- onPanResponderGrant: () => {
220
- const { index: i, paneW: W } = live.current;
221
- lx.stopAnimation();
222
- rx.stopAnimation();
223
- hv.stopAnimation();
224
- // Grabbed mid-flight: continue from where the pane is; at rest it sits exactly on its slot.
225
- drag.current.base = 0;
226
- if (paging.current) pan.stopAnimation((v) => (drag.current.base = Math.max(-W, Math.min(W, v + i * W))));
227
- paging.current = false;
228
- drag.current.off = drag.current.base;
229
- },
230
- onPanResponderMove: (_, g) => {
231
- const { index: i, paneW: W, edgesOf: edges } = live.current;
232
- let off = drag.current.base + g.dx;
233
- const prev = neighbour(i, -1);
234
- const next = neighbour(i, 1);
235
- if (off > 0 && prev < 0) off = rubber(off, W);
236
- if (off < 0 && next < 0) off = -rubber(-off, W);
237
- off = Math.max(-W, Math.min(W, off));
238
- drag.current.off = off;
239
- pan.setValue(-i * W + off);
240
-
241
- // Underline + height follow the finger toward the neighbour.
242
- const j = off < 0 ? next : prev;
243
- const a = edges(i);
244
- const b = j >= 0 ? edges(j) : null;
245
- if (!a || !b) return;
246
- const p = Math.min(1, Math.abs(off) / W);
247
- const lead = 1 - (1 - p) * (1 - p); // ease-out: the leading edge runs ahead
248
- const trail = p * p; // ease-in: the trailing edge hangs back
249
- const toRight = j > i;
250
- lx.setValue(a[0] + (b[0] - a[0]) * (toRight ? trail : lead));
251
- rx.setValue(a[1] + (b[1] - a[1]) * (toRight ? lead : trail));
252
- const ha = heights.current[i];
253
- const hb = heights.current[j];
254
- if (ha && hb) hv.setValue(ha + (hb - ha) * p);
255
- },
256
- onPanResponderRelease: (_, g) => finish(g.vx),
257
- onPanResponderTerminate: () => finish(0),
258
- }),
259
- // eslint-disable-next-line react-hooks/exhaustive-deps
260
- []
261
- );
215
+ const responder = usePanResponder({
216
+ onMoveShouldSetPanResponder: (_, g) => live.current.swipe && Math.abs(g.dx) > 10 && Math.abs(g.dx) > Math.abs(g.dy) * 1.4,
217
+ onPanResponderTerminationRequest: () => false,
218
+ onPanResponderGrant: () => {
219
+ const { index: i, paneW: W } = live.current;
220
+ lx.stopAnimation();
221
+ rx.stopAnimation();
222
+ hv.stopAnimation();
223
+ // Grabbed mid-flight: continue from where the pane is; at rest it sits exactly on its slot.
224
+ drag.current.base = 0;
225
+ if (paging.current) pan.stopAnimation((v) => (drag.current.base = Math.max(-W, Math.min(W, v + i * W))));
226
+ paging.current = false;
227
+ drag.current.off = drag.current.base;
228
+ },
229
+ onPanResponderMove: (_, g) => {
230
+ const { index: i, paneW: W, edgesOf: edges } = live.current;
231
+ let off = drag.current.base + g.dx;
232
+ const prev = neighbour(i, -1);
233
+ const next = neighbour(i, 1);
234
+ if (off > 0 && prev < 0) off = rubber(off, W);
235
+ if (off < 0 && next < 0) off = -rubber(-off, W);
236
+ off = Math.max(-W, Math.min(W, off));
237
+ drag.current.off = off;
238
+ pan.setValue(-i * W + off);
239
+
240
+ // Underline + height follow the finger toward the neighbour.
241
+ const j = off < 0 ? next : prev;
242
+ const a = edges(i);
243
+ const b = j >= 0 ? edges(j) : null;
244
+ if (!a || !b) return;
245
+ const p = Math.min(1, Math.abs(off) / W);
246
+ const lead = 1 - (1 - p) * (1 - p); // ease-out: the leading edge runs ahead
247
+ const trail = p * p; // ease-in: the trailing edge hangs back
248
+ const toRight = j > i;
249
+ lx.setValue(a[0] + (b[0] - a[0]) * (toRight ? trail : lead));
250
+ rx.setValue(a[1] + (b[1] - a[1]) * (toRight ? lead : trail));
251
+ const ha = heights.current[i];
252
+ const hb = heights.current[j];
253
+ if (ha && hb) hv.setValue(ha + (hb - ha) * p);
254
+ },
255
+ onPanResponderRelease: (_, g) => finish(g.vx),
256
+ onPanResponderTerminate: () => finish(0),
257
+ });
262
258
 
263
259
  const finish = (vx: number) => {
264
260
  const { index: i, paneW: W, items: list, select: pick } = live.current;
@@ -268,7 +264,8 @@ export function Tabs({
268
264
  else if (off > 0 && (off > W * 0.22 || vx > 0.35)) target = neighbour(i, -1);
269
265
  if (target < 0) target = i;
270
266
  release.current = { v: vx, dragged: true };
271
- if (target !== i) pick(list[target]);
267
+ const next = list[target];
268
+ if (target !== i && next) pick(next);
272
269
  setSettle((n) => n + 1);
273
270
  };
274
271
 
@@ -358,7 +355,7 @@ export function Tabs({
358
355
  const current = items[index];
359
356
  panes = (
360
357
  <Animated.View
361
- {...responder.panHandlers}
358
+ {...responder}
362
359
  onLayout={(e) => {
363
360
  const w = e.nativeEvent.layout.width;
364
361
  if (Math.abs(w - paneW) > 0.5) setPaneW(w);
@@ -430,8 +427,8 @@ interface TabProps {
430
427
  function Tab({ item, active, mode, height, fontSize, tint, reduce, onPress, onLayout, onLabelLayout }: TabProps) {
431
428
  const { colors, font } = useKit();
432
429
  const ff = font.family ? { fontFamily: font.family } : null;
433
- const a = useRef(new Animated.Value(active ? 1 : 0)).current; // label colour (JS)
434
- const press = useRef(new Animated.Value(1)).current; // squish (native)
430
+ const [a] = useState(() => new Animated.Value(active ? 1 : 0)); // label colour (JS)
431
+ const [press] = useState(() => new Animated.Value(1)); // squish (native)
435
432
 
436
433
  useEffect(() => {
437
434
  Animated.timing(a, { toValue: active ? 1 : 0, duration: reduce ? 0 : 180, useNativeDriver: false }).start();
@@ -479,7 +476,7 @@ function Tab({ item, active, mode, height, fontSize, tint, reduce, onPress, onLa
479
476
  function TabBadge({ value, active, tint, reduce }: { value: number | string; active: boolean; tint: string; reduce: boolean }) {
480
477
  const { colors, radius, dark, font } = useKit();
481
478
  const ff = font.family ? { fontFamily: font.family } : null;
482
- const s = useRef(new Animated.Value(1)).current;
479
+ const [s] = useState(() => new Animated.Value(1));
483
480
  const first = useRef(true);
484
481
  useEffect(() => {
485
482
  if (first.current || reduce) {
@@ -534,10 +531,10 @@ const styles = StyleSheet.create({
534
531
  fill: { flex: 1 },
535
532
  tab: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 6 },
536
533
  labelRow: { flexDirection: 'row', alignItems: 'center', gap: 6 },
537
- label: { fontWeight: '400', letterSpacing: -0.1 },
534
+ label: { fontWeight: '400', letterSpacing: -0.1, includeFontPadding: false, textAlignVertical: 'center' },
538
535
  underline: { position: 'absolute', bottom: 0, height: UNDERLINE },
539
536
  badge: { minWidth: 18, minHeight: 18, paddingHorizontal: 5, alignItems: 'center', justifyContent: 'center' },
540
- badgeText: { fontSize: 11, fontWeight: '400', fontVariant: ['tabular-nums'] },
537
+ badgeText: { fontSize: 11, fontWeight: '400', fontVariant: ['tabular-nums'], includeFontPadding: false, textAlignVertical: 'center' },
541
538
  viewport: { overflow: 'hidden' },
542
539
  pager: { flexDirection: 'row', alignItems: 'flex-start' },
543
540
  pane: { paddingTop: 16 },