@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
@@ -29,42 +29,42 @@ export type StepperLegacyVariant = 'default' | 'pill' | 'segmented' | 'vertical'
29
29
  export type StepperSize = 'sm' | 'md' | 'lg';
30
30
 
31
31
  export interface StepperProps {
32
- value?: number;
33
- defaultValue?: number;
34
- onValueChange?: (value: number) => void;
35
- min?: number;
36
- max?: number;
37
- step?: number;
38
- variant?: StepperVariant | StepperLegacyVariant;
32
+ value?: number | undefined;
33
+ defaultValue?: number | undefined;
34
+ onValueChange?: ((value: number) => void) | undefined;
35
+ min?: number | undefined;
36
+ max?: number | undefined;
37
+ step?: number | undefined;
38
+ variant?: StepperVariant | StepperLegacyVariant | undefined;
39
39
  /** 'sm' 32 · 'md' 36 · 'lg' 44pt buttons (touch area is always ≥ 44pt); the number and icons scale too. */
40
- size?: StepperSize;
40
+ size?: StepperSize | undefined;
41
41
  /** Stack the buttons above and below the number (outline, filled, compact). */
42
- orientation?: 'horizontal' | 'vertical';
42
+ orientation?: 'horizontal' | 'vertical' | undefined;
43
43
  /** Formats the number (e.g. `(n) => '₹' + n`). Every changed character rolls. */
44
- format?: (value: number) => string;
44
+ format?: ((value: number) => string) | undefined;
45
45
  /** Static muted text after the number: `'kg'` or `(n) => (n === 1 ? 'night' : 'nights')`. */
46
- suffix?: string | ((value: number) => string);
46
+ suffix?: (string | ((value: number) => string)) | undefined;
47
47
  /** Hold a button to keep stepping, accelerating the longer you hold (default true). */
48
- repeat?: boolean;
49
- disabled?: boolean;
48
+ repeat?: boolean | undefined;
49
+ disabled?: boolean | undefined;
50
50
  /** Highlight colour: icons (filled, compact), press tint (outline), fill (cart). Default theme accent. */
51
- accent?: string;
51
+ accent?: string | undefined;
52
52
  /** Overrides the −/+ icon colour. */
53
- iconColor?: string;
53
+ iconColor?: string | undefined;
54
54
  /** cart: text next to the + while collapsed at 0, e.g. "Add". */
55
- addLabel?: string;
55
+ addLabel?: string | undefined;
56
56
  /** Title shown to the left of the control (the control moves to the right edge). */
57
- label?: string;
57
+ label?: string | undefined;
58
58
  /** Muted line under `label`. */
59
- description?: string;
59
+ description?: string | undefined;
60
60
  /** Read by screen readers, e.g. "Guests" (defaults to `label`). */
61
- accessibilityLabel?: string;
61
+ accessibilityLabel?: string | undefined;
62
62
  /** The control, or the whole row when `label` / `description` is set. */
63
- style?: StyleProp<ViewStyle>;
63
+ style?: StyleProp<ViewStyle> | undefined;
64
64
  /** Applied to each −/+ button. */
65
- buttonStyle?: StyleProp<ViewStyle>;
65
+ buttonStyle?: StyleProp<ViewStyle> | undefined;
66
66
  /** Applied to the number (fontSize, colour, weight…). */
67
- valueStyle?: StyleProp<TextStyle>;
67
+ valueStyle?: StyleProp<TextStyle> | undefined;
68
68
  }
69
69
 
70
70
  // Controls stop growing at iOS's largest standard text size (xxxL ≈ 1.35×) so they keep their shape;
@@ -124,7 +124,7 @@ export function Stepper({
124
124
  buttonStyle,
125
125
  valueStyle,
126
126
  }: StepperProps) {
127
- const { colors, radius, font } = useKit();
127
+ const { colors, radius, font, labels } = useKit();
128
128
  const ff = font.family ? { fontFamily: font.family } : null;
129
129
  const reduce = useReduceMotion();
130
130
  const variant: StepperVariant = variantProp in LEGACY ? LEGACY[variantProp as StepperLegacyVariant] : (variantProp as StepperVariant);
@@ -135,7 +135,9 @@ export function Stepper({
135
135
  const [inner, setInner] = useState(defaultValue ?? Math.max(min, 0));
136
136
  const current = value ?? inner;
137
137
  const valueRef = useRef(current);
138
- valueRef.current = current;
138
+ useLayoutEffect(() => {
139
+ valueRef.current = current;
140
+ });
139
141
 
140
142
  // Direction of the last change, so digits roll the right way.
141
143
  const [track, setTrack] = useState({ v: current, dir: 1 });
@@ -143,7 +145,7 @@ export function Stepper({
143
145
 
144
146
  // Press past a limit: the number nudges toward the wall and springs back (not with Reduce Motion;
145
147
  // the dimmed button already says it's the limit).
146
- const bump = useRef(new Animated.Value(0)).current;
148
+ const [bump] = useState(() => new Animated.Value(0));
147
149
  const nudge = (dir: 1 | -1) => {
148
150
  if (reduce) return;
149
151
  Animated.sequence([
@@ -246,7 +248,7 @@ export function Stepper({
246
248
  look={look[variant].btn}
247
249
  limit={dir === 1 ? atMax : atMin}
248
250
  disabled={!!disabled}
249
- label={a11y ?? `${dir === 1 ? 'Increase' : 'Decrease'}${title ? ` ${title}` : ''}`}
251
+ label={a11y ?? (title ? (dir === 1 ? labels.increaseItem : labels.decreaseItem)(title) : dir === 1 ? labels.increase : labels.decrease)}
250
252
  reduce={reduce}
251
253
  style={buttonStyle}
252
254
  onPressIn={() => startRepeat(dir)}
@@ -272,8 +274,8 @@ export function Stepper({
272
274
  accessibilityValue: { min, max: Number.isFinite(max) ? max : undefined, now: current, text: suffixText ? `${text} ${suffixText}` : text },
273
275
  accessibilityState: { disabled: !!disabled },
274
276
  accessibilityActions: [
275
- { name: 'increment', label: 'Increase' },
276
- { name: 'decrement', label: 'Decrease' },
277
+ { name: 'increment', label: labels.increase },
278
+ { name: 'decrement', label: labels.decrease },
277
279
  ],
278
280
  onAccessibilityAction: (e: AccessibilityActionEvent) => {
279
281
  if (disabled) return;
@@ -365,9 +367,9 @@ function CartControl({
365
367
  numStyle: TextStyle;
366
368
  number: React.ReactNode;
367
369
  text: string;
368
- suffixText?: string;
370
+ suffixText?: string | undefined;
369
371
  collapsed: boolean;
370
- addLabel?: string;
372
+ addLabel?: string | undefined;
371
373
  bump: Animated.Value;
372
374
  disabled: boolean;
373
375
  reduce: boolean;
@@ -387,8 +389,8 @@ function CartControl({
387
389
  const closedW = addLabel ? Math.max(s.btn, addW || s.btn * 2.2) : s.btn;
388
390
  const target = collapsed ? closedW : openW;
389
391
 
390
- const width = useRef(new Animated.Value(target)).current; // JS driver (layout)
391
- const open = useRef(new Animated.Value(collapsed ? 0 : 1)).current; // native driver
392
+ const [width] = useState(() => new Animated.Value(target)); // JS driver (layout)
393
+ const [open] = useState(() => new Animated.Value(collapsed ? 0 : 1)); // native driver
392
394
  const settled = useRef(false);
393
395
 
394
396
  const measured = textW > 0 && (!addLabel || addW > 0);
@@ -507,8 +509,8 @@ function StepButton({
507
509
  onPressOut: () => void;
508
510
  }) {
509
511
  // Scale and dim share one native-driven view; nothing JS-driven touches it.
510
- const scale = useRef(new Animated.Value(1)).current;
511
- const dim = useRef(new Animated.Value(limit ? 0.32 : 1)).current;
512
+ const [scale] = useState(() => new Animated.Value(1));
513
+ const [dim] = useState(() => new Animated.Value(limit ? 0.32 : 1));
512
514
  // Reduce Motion: no press squeeze; the pressed background still shows the press.
513
515
  const spring = (to: number) => {
514
516
  if (reduce) scale.setValue(1);
@@ -562,7 +564,7 @@ function StepButton({
562
564
 
563
565
  /** Stroked icon; pops in when its shape changes (− ↔ trash). */
564
566
  function Glyph({ d, size, color, reduce }: { d: string; size: number; color: string; reduce: boolean }) {
565
- const pop = useRef(new Animated.Value(1)).current;
567
+ const [pop] = useState(() => new Animated.Value(1));
566
568
  const prev = useRef(d);
567
569
  useEffect(() => {
568
570
  if (prev.current === d) return;
@@ -597,7 +599,7 @@ function RollingText({ text, dir, style, reduce }: { text: string; dir: number;
597
599
  function RollingChar({ char, dir, style, reduce }: { char: string; dir: number; style: TextStyle; reduce: boolean }) {
598
600
  const [pair, setPair] = useState<{ cur: string; prev: string | null; dir: number }>({ cur: char, prev: null, dir });
599
601
  if (pair.cur !== char) setPair({ cur: char, prev: pair.cur, dir });
600
- const t = useRef(new Animated.Value(1)).current;
602
+ const [t] = useState(() => new Animated.Value(1));
601
603
  // The digit window follows the text's own (capped) Dynamic Type scale, so a scaled digit isn't cropped.
602
604
  const { fontScale } = useWindowDimensions();
603
605
  const h = ((style.lineHeight as number) ?? 24) * Math.min(fontScale, FONT_CAP);
@@ -690,11 +692,11 @@ const styles = StyleSheet.create({
690
692
  cartRow: { position: 'absolute', top: 0, bottom: 0, right: 0, flexDirection: 'row', alignItems: 'center' },
691
693
  ruler: { position: 'absolute', top: 0, left: 0, width: 9999, flexDirection: 'row', alignItems: 'flex-start' },
692
694
  add: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center', gap: 5 },
693
- addText: { fontWeight: '400', letterSpacing: 0.1 },
695
+ addText: { fontWeight: '400', letterSpacing: 0.1, includeFontPadding: false, textAlignVertical: 'center' },
694
696
  roll: { flexDirection: 'row', alignItems: 'center' },
695
697
  suffix: { fontWeight: '400', marginLeft: 4 },
696
698
  charBox: { overflow: 'hidden', justifyContent: 'center' },
697
- num: { fontWeight: '400', fontVariant: ['tabular-nums'], textAlign: 'center' },
699
+ num: { fontWeight: '400', fontVariant: ['tabular-nums'], textAlign: 'center', includeFontPadding: false, textAlignVertical: 'center' },
698
700
  layer: { position: 'absolute', left: 0, right: 0 },
699
701
  hidden: { opacity: 0 },
700
702
  });