number-flow-react-native 0.1.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 (245) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +44 -0
  3. package/lib/module/core/constants.js +21 -0
  4. package/lib/module/core/constants.js.map +1 -0
  5. package/lib/module/core/intlHelpers.js +310 -0
  6. package/lib/module/core/intlHelpers.js.map +1 -0
  7. package/lib/module/core/layout.js +71 -0
  8. package/lib/module/core/layout.js.map +1 -0
  9. package/lib/module/core/mask.js +50 -0
  10. package/lib/module/core/mask.js.map +1 -0
  11. package/lib/module/core/numerals/detection.js +105 -0
  12. package/lib/module/core/numerals/detection.js.map +1 -0
  13. package/lib/module/core/numerals/digits.js +128 -0
  14. package/lib/module/core/numerals/digits.js.map +1 -0
  15. package/lib/module/core/numerals/index.js +5 -0
  16. package/lib/module/core/numerals/index.js.map +1 -0
  17. package/lib/module/core/numerals/tables.js +114 -0
  18. package/lib/module/core/numerals/tables.js.map +1 -0
  19. package/lib/module/core/superscript.js +31 -0
  20. package/lib/module/core/superscript.js.map +1 -0
  21. package/lib/module/core/timeLayout.js +98 -0
  22. package/lib/module/core/timeLayout.js.map +1 -0
  23. package/lib/module/core/timeTypes.js +4 -0
  24. package/lib/module/core/timeTypes.js.map +1 -0
  25. package/lib/module/core/timing.js +45 -0
  26. package/lib/module/core/timing.js.map +1 -0
  27. package/lib/module/core/types.js +58 -0
  28. package/lib/module/core/types.js.map +1 -0
  29. package/lib/module/core/useAccessibilityAnnouncement.js +27 -0
  30. package/lib/module/core/useAccessibilityAnnouncement.js.map +1 -0
  31. package/lib/module/core/useAnimatedX.js +25 -0
  32. package/lib/module/core/useAnimatedX.js.map +1 -0
  33. package/lib/module/core/useAnimationLifecycle.js +37 -0
  34. package/lib/module/core/useAnimationLifecycle.js.map +1 -0
  35. package/lib/module/core/useCanAnimate.js +22 -0
  36. package/lib/module/core/useCanAnimate.js.map +1 -0
  37. package/lib/module/core/useContinuousSpin.js +89 -0
  38. package/lib/module/core/useContinuousSpin.js.map +1 -0
  39. package/lib/module/core/useDebouncedWidths.js +74 -0
  40. package/lib/module/core/useDebouncedWidths.js.map +1 -0
  41. package/lib/module/core/useDigitAnimation.js +138 -0
  42. package/lib/module/core/useDigitAnimation.js.map +1 -0
  43. package/lib/module/core/useFlowPipeline.js +85 -0
  44. package/lib/module/core/useFlowPipeline.js.map +1 -0
  45. package/lib/module/core/useFormattedValue.js +28 -0
  46. package/lib/module/core/useFormattedValue.js.map +1 -0
  47. package/lib/module/core/useLayoutDiff.js +59 -0
  48. package/lib/module/core/useLayoutDiff.js.map +1 -0
  49. package/lib/module/core/useNumberFormatting.js +158 -0
  50. package/lib/module/core/useNumberFormatting.js.map +1 -0
  51. package/lib/module/core/useSlotOpacity.js +53 -0
  52. package/lib/module/core/useSlotOpacity.js.map +1 -0
  53. package/lib/module/core/useTimeFormatting.js +74 -0
  54. package/lib/module/core/useTimeFormatting.js.map +1 -0
  55. package/lib/module/core/useTimingResolution.js +21 -0
  56. package/lib/module/core/useTimingResolution.js.map +1 -0
  57. package/lib/module/core/useWorkletFormatting.js +49 -0
  58. package/lib/module/core/useWorkletFormatting.js.map +1 -0
  59. package/lib/module/core/utils.js +132 -0
  60. package/lib/module/core/utils.js.map +1 -0
  61. package/lib/module/core/warnings.js +10 -0
  62. package/lib/module/core/warnings.js.map +1 -0
  63. package/lib/module/index.js +7 -0
  64. package/lib/module/index.js.map +1 -0
  65. package/lib/module/native/DigitSlot.js +163 -0
  66. package/lib/module/native/DigitSlot.js.map +1 -0
  67. package/lib/module/native/NumberFlow.js +244 -0
  68. package/lib/module/native/NumberFlow.js.map +1 -0
  69. package/lib/module/native/SymbolSlot.js +52 -0
  70. package/lib/module/native/SymbolSlot.js.map +1 -0
  71. package/lib/module/native/TimeFlow.js +270 -0
  72. package/lib/module/native/TimeFlow.js.map +1 -0
  73. package/lib/module/native/index.js +5 -0
  74. package/lib/module/native/index.js.map +1 -0
  75. package/lib/module/native/renderSlots.js +108 -0
  76. package/lib/module/native/renderSlots.js.map +1 -0
  77. package/lib/module/native/types.js +4 -0
  78. package/lib/module/native/types.js.map +1 -0
  79. package/lib/module/native/useMeasuredGlyphMetrics.js +156 -0
  80. package/lib/module/native/useMeasuredGlyphMetrics.js.map +1 -0
  81. package/lib/module/package.json +1 -0
  82. package/lib/module/skia/DigitSlot.js +171 -0
  83. package/lib/module/skia/DigitSlot.js.map +1 -0
  84. package/lib/module/skia/SkiaNumberFlow.js +430 -0
  85. package/lib/module/skia/SkiaNumberFlow.js.map +1 -0
  86. package/lib/module/skia/SkiaTimeFlow.js +226 -0
  87. package/lib/module/skia/SkiaTimeFlow.js.map +1 -0
  88. package/lib/module/skia/SymbolSlot.js +92 -0
  89. package/lib/module/skia/SymbolSlot.js.map +1 -0
  90. package/lib/module/skia/index.js +6 -0
  91. package/lib/module/skia/index.js.map +1 -0
  92. package/lib/module/skia/renderSlots.js +131 -0
  93. package/lib/module/skia/renderSlots.js.map +1 -0
  94. package/lib/module/skia/useGlyphMetrics.js +72 -0
  95. package/lib/module/skia/useGlyphMetrics.js.map +1 -0
  96. package/lib/module/skia/useScrubbing.js +165 -0
  97. package/lib/module/skia/useScrubbing.js.map +1 -0
  98. package/lib/module/skia/useSkiaFont.js +23 -0
  99. package/lib/module/skia/useSkiaFont.js.map +1 -0
  100. package/lib/typescript/core/constants.d.ts +15 -0
  101. package/lib/typescript/core/constants.d.ts.map +1 -0
  102. package/lib/typescript/core/intlHelpers.d.ts +10 -0
  103. package/lib/typescript/core/intlHelpers.d.ts.map +1 -0
  104. package/lib/typescript/core/layout.d.ts +22 -0
  105. package/lib/typescript/core/layout.d.ts.map +1 -0
  106. package/lib/typescript/core/mask.d.ts +18 -0
  107. package/lib/typescript/core/mask.d.ts.map +1 -0
  108. package/lib/typescript/core/numerals/detection.d.ts +17 -0
  109. package/lib/typescript/core/numerals/detection.d.ts.map +1 -0
  110. package/lib/typescript/core/numerals/digits.d.ts +43 -0
  111. package/lib/typescript/core/numerals/digits.d.ts.map +1 -0
  112. package/lib/typescript/core/numerals/index.d.ts +3 -0
  113. package/lib/typescript/core/numerals/index.d.ts.map +1 -0
  114. package/lib/typescript/core/numerals/tables.d.ts +32 -0
  115. package/lib/typescript/core/numerals/tables.d.ts.map +1 -0
  116. package/lib/typescript/core/superscript.d.ts +16 -0
  117. package/lib/typescript/core/superscript.d.ts.map +1 -0
  118. package/lib/typescript/core/timeLayout.d.ts +19 -0
  119. package/lib/typescript/core/timeLayout.d.ts.map +1 -0
  120. package/lib/typescript/core/timeTypes.d.ts +80 -0
  121. package/lib/typescript/core/timeTypes.d.ts.map +1 -0
  122. package/lib/typescript/core/timing.d.ts +6 -0
  123. package/lib/typescript/core/timing.d.ts.map +1 -0
  124. package/lib/typescript/core/types.d.ts +165 -0
  125. package/lib/typescript/core/types.d.ts.map +1 -0
  126. package/lib/typescript/core/useAccessibilityAnnouncement.d.ts +10 -0
  127. package/lib/typescript/core/useAccessibilityAnnouncement.d.ts.map +1 -0
  128. package/lib/typescript/core/useAnimatedX.d.ts +9 -0
  129. package/lib/typescript/core/useAnimatedX.d.ts.map +1 -0
  130. package/lib/typescript/core/useAnimationLifecycle.d.ts +14 -0
  131. package/lib/typescript/core/useAnimationLifecycle.d.ts.map +1 -0
  132. package/lib/typescript/core/useCanAnimate.d.ts +14 -0
  133. package/lib/typescript/core/useCanAnimate.d.ts.map +1 -0
  134. package/lib/typescript/core/useContinuousSpin.d.ts +23 -0
  135. package/lib/typescript/core/useContinuousSpin.d.ts.map +1 -0
  136. package/lib/typescript/core/useDebouncedWidths.d.ts +17 -0
  137. package/lib/typescript/core/useDebouncedWidths.d.ts.map +1 -0
  138. package/lib/typescript/core/useDigitAnimation.d.ts +38 -0
  139. package/lib/typescript/core/useDigitAnimation.d.ts.map +1 -0
  140. package/lib/typescript/core/useFlowPipeline.d.ts +46 -0
  141. package/lib/typescript/core/useFlowPipeline.d.ts.map +1 -0
  142. package/lib/typescript/core/useFormattedValue.d.ts +14 -0
  143. package/lib/typescript/core/useFormattedValue.d.ts.map +1 -0
  144. package/lib/typescript/core/useLayoutDiff.d.ts +18 -0
  145. package/lib/typescript/core/useLayoutDiff.d.ts.map +1 -0
  146. package/lib/typescript/core/useNumberFormatting.d.ts +18 -0
  147. package/lib/typescript/core/useNumberFormatting.d.ts.map +1 -0
  148. package/lib/typescript/core/useSlotOpacity.d.ts +18 -0
  149. package/lib/typescript/core/useSlotOpacity.d.ts.map +1 -0
  150. package/lib/typescript/core/useTimeFormatting.d.ts +22 -0
  151. package/lib/typescript/core/useTimeFormatting.d.ts.map +1 -0
  152. package/lib/typescript/core/useTimingResolution.d.ts +13 -0
  153. package/lib/typescript/core/useTimingResolution.d.ts.map +1 -0
  154. package/lib/typescript/core/useWorkletFormatting.d.ts +14 -0
  155. package/lib/typescript/core/useWorkletFormatting.d.ts.map +1 -0
  156. package/lib/typescript/core/utils.d.ts +44 -0
  157. package/lib/typescript/core/utils.d.ts.map +1 -0
  158. package/lib/typescript/core/warnings.d.ts +2 -0
  159. package/lib/typescript/core/warnings.d.ts.map +1 -0
  160. package/lib/typescript/index.d.ts +8 -0
  161. package/lib/typescript/index.d.ts.map +1 -0
  162. package/lib/typescript/native/DigitSlot.d.ts +27 -0
  163. package/lib/typescript/native/DigitSlot.d.ts.map +1 -0
  164. package/lib/typescript/native/NumberFlow.d.ts +3 -0
  165. package/lib/typescript/native/NumberFlow.d.ts.map +1 -0
  166. package/lib/typescript/native/SymbolSlot.d.ts +19 -0
  167. package/lib/typescript/native/SymbolSlot.d.ts.map +1 -0
  168. package/lib/typescript/native/TimeFlow.d.ts +3 -0
  169. package/lib/typescript/native/TimeFlow.d.ts.map +1 -0
  170. package/lib/typescript/native/index.d.ts +3 -0
  171. package/lib/typescript/native/index.d.ts.map +1 -0
  172. package/lib/typescript/native/renderSlots.d.ts +31 -0
  173. package/lib/typescript/native/renderSlots.d.ts.map +1 -0
  174. package/lib/typescript/native/types.d.ts +36 -0
  175. package/lib/typescript/native/types.d.ts.map +1 -0
  176. package/lib/typescript/native/useMeasuredGlyphMetrics.d.ts +8 -0
  177. package/lib/typescript/native/useMeasuredGlyphMetrics.d.ts.map +1 -0
  178. package/lib/typescript/package.json +1 -0
  179. package/lib/typescript/skia/DigitSlot.d.ts +35 -0
  180. package/lib/typescript/skia/DigitSlot.d.ts.map +1 -0
  181. package/lib/typescript/skia/SkiaNumberFlow.d.ts +3 -0
  182. package/lib/typescript/skia/SkiaNumberFlow.d.ts.map +1 -0
  183. package/lib/typescript/skia/SkiaTimeFlow.d.ts +3 -0
  184. package/lib/typescript/skia/SkiaTimeFlow.d.ts.map +1 -0
  185. package/lib/typescript/skia/SymbolSlot.d.ts +26 -0
  186. package/lib/typescript/skia/SymbolSlot.d.ts.map +1 -0
  187. package/lib/typescript/skia/index.d.ts +6 -0
  188. package/lib/typescript/skia/index.d.ts.map +1 -0
  189. package/lib/typescript/skia/renderSlots.d.ts +40 -0
  190. package/lib/typescript/skia/renderSlots.d.ts.map +1 -0
  191. package/lib/typescript/skia/useGlyphMetrics.d.ts +16 -0
  192. package/lib/typescript/skia/useGlyphMetrics.d.ts.map +1 -0
  193. package/lib/typescript/skia/useScrubbing.d.ts +59 -0
  194. package/lib/typescript/skia/useScrubbing.d.ts.map +1 -0
  195. package/lib/typescript/skia/useSkiaFont.d.ts +13 -0
  196. package/lib/typescript/skia/useSkiaFont.d.ts.map +1 -0
  197. package/package.json +104 -0
  198. package/src/core/constants.ts +20 -0
  199. package/src/core/intlHelpers.ts +351 -0
  200. package/src/core/layout.ts +108 -0
  201. package/src/core/mask.ts +72 -0
  202. package/src/core/numerals/detection.ts +112 -0
  203. package/src/core/numerals/digits.ts +102 -0
  204. package/src/core/numerals/index.ts +9 -0
  205. package/src/core/numerals/tables.ts +112 -0
  206. package/src/core/superscript.ts +27 -0
  207. package/src/core/timeLayout.ts +119 -0
  208. package/src/core/timeTypes.ts +88 -0
  209. package/src/core/timing.ts +60 -0
  210. package/src/core/types.ts +189 -0
  211. package/src/core/useAccessibilityAnnouncement.ts +27 -0
  212. package/src/core/useAnimatedX.ts +30 -0
  213. package/src/core/useAnimationLifecycle.ts +54 -0
  214. package/src/core/useCanAnimate.ts +21 -0
  215. package/src/core/useContinuousSpin.ts +112 -0
  216. package/src/core/useDebouncedWidths.ts +93 -0
  217. package/src/core/useDigitAnimation.ts +192 -0
  218. package/src/core/useFlowPipeline.ts +126 -0
  219. package/src/core/useFormattedValue.ts +32 -0
  220. package/src/core/useLayoutDiff.ts +71 -0
  221. package/src/core/useNumberFormatting.ts +164 -0
  222. package/src/core/useSlotOpacity.ts +66 -0
  223. package/src/core/useTimeFormatting.ts +95 -0
  224. package/src/core/useTimingResolution.ts +47 -0
  225. package/src/core/useWorkletFormatting.ts +59 -0
  226. package/src/core/utils.ts +149 -0
  227. package/src/core/warnings.ts +8 -0
  228. package/src/index.ts +15 -0
  229. package/src/native/DigitSlot.tsx +203 -0
  230. package/src/native/NumberFlow.tsx +287 -0
  231. package/src/native/SymbolSlot.tsx +68 -0
  232. package/src/native/TimeFlow.tsx +287 -0
  233. package/src/native/index.ts +2 -0
  234. package/src/native/renderSlots.tsx +150 -0
  235. package/src/native/types.ts +40 -0
  236. package/src/native/useMeasuredGlyphMetrics.tsx +205 -0
  237. package/src/skia/DigitSlot.tsx +221 -0
  238. package/src/skia/SkiaNumberFlow.tsx +506 -0
  239. package/src/skia/SkiaTimeFlow.tsx +257 -0
  240. package/src/skia/SymbolSlot.tsx +120 -0
  241. package/src/skia/index.ts +5 -0
  242. package/src/skia/renderSlots.tsx +180 -0
  243. package/src/skia/useGlyphMetrics.ts +79 -0
  244. package/src/skia/useScrubbing.ts +223 -0
  245. package/src/skia/useSkiaFont.ts +25 -0
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+
3
+ import React, { useLayoutEffect, useMemo, useRef, useState } from "react";
4
+ import { StyleSheet, Text } from "react-native";
5
+ import Animated, { makeMutable, useAnimatedReaction, useAnimatedStyle, withTiming } from "react-native-reanimated";
6
+ import { DIGIT_COUNT, SUPERSCRIPT_SCALE } from "../core/constants.js";
7
+ import { getSuperscriptTextStyle } from "../core/superscript.js";
8
+ import { useAnimatedX } from "../core/useAnimatedX.js";
9
+ import { useDigitAnimation } from "../core/useDigitAnimation.js";
10
+ import { signedDigitOffset } from "../core/utils.js";
11
+
12
+ // Extracted as its own component so useAnimatedStyle respects Rules of Hooks
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ const DigitElement = /*#__PURE__*/React.memo(({
15
+ digitString,
16
+ yValue,
17
+ textStyle
18
+ }) => {
19
+ const animatedStyle = useAnimatedStyle(() => ({
20
+ transform: [{
21
+ translateY: yValue.value
22
+ }]
23
+ }));
24
+ return /*#__PURE__*/_jsx(Animated.View, {
25
+ style: [styles.digitView, animatedStyle],
26
+ children: /*#__PURE__*/_jsx(Text, {
27
+ style: textStyle,
28
+ children: digitString
29
+ })
30
+ });
31
+ });
32
+ DigitElement.displayName = "DigitElement";
33
+ export const DigitSlot = /*#__PURE__*/React.memo(({
34
+ metrics,
35
+ digitValue,
36
+ targetX,
37
+ charWidth,
38
+ textStyle,
39
+ spinTiming,
40
+ opacityTiming,
41
+ transformTiming,
42
+ trend,
43
+ entering,
44
+ exiting,
45
+ exitKey,
46
+ onExitComplete,
47
+ digitCount,
48
+ continuousSpinGeneration,
49
+ maskTop = 0,
50
+ maskBottom = 0,
51
+ superscript,
52
+ digitStrings
53
+ }) => {
54
+ const resolvedDigitCount = digitCount ?? DIGIT_COUNT;
55
+ const resolvedDigitStrings = digitStrings ?? Array.from({
56
+ length: resolvedDigitCount
57
+ }, (_, i) => String(i));
58
+
59
+ // Superscript scaling — exponent digits/signs render smaller at the top of the line.
60
+ // Mask heights are zeroed for superscript: the container-level gradient doesn't cover
61
+ // the superscript position, so any buffer would show unmasked neighboring digits.
62
+ const scale = superscript ? SUPERSCRIPT_SCALE : 1;
63
+ const effectiveLH = metrics.lineHeight * scale;
64
+ const effectiveMaskTop = superscript ? 0 : maskTop;
65
+ const effectiveMaskBottom = superscript ? 0 : maskBottom;
66
+ const effectiveTextStyle = useMemo(() => superscript ? getSuperscriptTextStyle(textStyle, effectiveLH) : textStyle, [textStyle, superscript, effectiveLH]);
67
+ const {
68
+ initialDigit,
69
+ animDelta,
70
+ currentDigitSV,
71
+ slotOpacity
72
+ } = useDigitAnimation({
73
+ digitValue,
74
+ entering,
75
+ exiting,
76
+ trend,
77
+ spinTiming,
78
+ opacityTiming,
79
+ exitKey,
80
+ onExitComplete,
81
+ digitCount: resolvedDigitCount,
82
+ continuousSpinGeneration
83
+ });
84
+
85
+ /**
86
+ * Per-digit Y transforms stored as makeMutable shared values.
87
+ * Each digit independently positions itself based on its signed
88
+ * modular distance from the virtual scroll position.
89
+ */
90
+ const [digitYValues] = useState(() => Array.from({
91
+ length: resolvedDigitCount
92
+ }, (_, n) => {
93
+ const offset = signedDigitOffset(n, initialDigit, resolvedDigitCount);
94
+ const clamped = Math.max(-1.5, Math.min(1.5, offset));
95
+ return makeMutable(clamped * effectiveLH + effectiveMaskTop);
96
+ }));
97
+
98
+ /**
99
+ * Mirrors NumberFlow's CSS mod(): each digit n computes its signed
100
+ * offset from virtual position c, clamped to [-1.5, 1.5].
101
+ * Only the current digit (offset ~ 0) and its neighbors (offset ~ +/-1)
102
+ * are visible through the clip window. All others park just outside.
103
+ */
104
+ useAnimatedReaction(() => currentDigitSV.value - animDelta.value, c => {
105
+ for (let n = 0; n < resolvedDigitCount; n++) {
106
+ const offset = signedDigitOffset(n, c, resolvedDigitCount);
107
+ const clamped = Math.max(-1.5, Math.min(1.5, offset));
108
+ digitYValues[n].value = clamped * effectiveLH + effectiveMaskTop;
109
+ }
110
+ }, [effectiveLH, resolvedDigitCount, effectiveMaskTop]);
111
+ const animatedX = useAnimatedX(targetX, exiting, transformTiming);
112
+ const [animatedClipWidth] = useState(() => makeMutable(charWidth));
113
+ const prevWidthRef = useRef(charWidth);
114
+ useLayoutEffect(() => {
115
+ if (!exiting && prevWidthRef.current !== charWidth) {
116
+ prevWidthRef.current = charWidth;
117
+ animatedClipWidth.value = withTiming(charWidth, {
118
+ duration: transformTiming.duration,
119
+ easing: transformTiming.easing
120
+ });
121
+ }
122
+ }, [charWidth, exiting, transformTiming, animatedClipWidth]);
123
+ const animatedStyle = useAnimatedStyle(() => ({
124
+ transform: [{
125
+ translateX: animatedX.value
126
+ }, {
127
+ translateY: -effectiveMaskTop
128
+ }],
129
+ opacity: slotOpacity.value
130
+ }));
131
+ const expandedHeight = effectiveLH + effectiveMaskTop + effectiveMaskBottom;
132
+ const animatedClipStyle = useAnimatedStyle(() => ({
133
+ overflow: "hidden",
134
+ height: expandedHeight,
135
+ width: animatedClipWidth.value
136
+ }));
137
+ const digitElements = useMemo(() => Array.from({
138
+ length: resolvedDigitCount
139
+ }, (_, n) => /*#__PURE__*/_jsx(DigitElement, {
140
+ digitString: resolvedDigitStrings[n],
141
+ textStyle: effectiveTextStyle,
142
+ yValue: digitYValues[n]
143
+ }, n)), [resolvedDigitCount, resolvedDigitStrings, digitYValues, effectiveTextStyle]);
144
+ return /*#__PURE__*/_jsx(Animated.View, {
145
+ style: [styles.absolute, animatedStyle],
146
+ children: /*#__PURE__*/_jsx(Animated.View, {
147
+ style: animatedClipStyle,
148
+ children: digitElements
149
+ })
150
+ });
151
+ });
152
+ DigitSlot.displayName = "DigitSlot";
153
+ const styles = StyleSheet.create({
154
+ absolute: {
155
+ position: "absolute"
156
+ },
157
+ digitView: {
158
+ position: "absolute",
159
+ left: 0,
160
+ top: 0
161
+ }
162
+ });
163
+ //# sourceMappingURL=DigitSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useLayoutEffect","useMemo","useRef","useState","StyleSheet","Text","Animated","makeMutable","useAnimatedReaction","useAnimatedStyle","withTiming","DIGIT_COUNT","SUPERSCRIPT_SCALE","getSuperscriptTextStyle","useAnimatedX","useDigitAnimation","signedDigitOffset","jsx","_jsx","DigitElement","memo","digitString","yValue","textStyle","animatedStyle","transform","translateY","value","View","style","styles","digitView","children","displayName","DigitSlot","metrics","digitValue","targetX","charWidth","spinTiming","opacityTiming","transformTiming","trend","entering","exiting","exitKey","onExitComplete","digitCount","continuousSpinGeneration","maskTop","maskBottom","superscript","digitStrings","resolvedDigitCount","resolvedDigitStrings","Array","from","length","_","i","String","scale","effectiveLH","lineHeight","effectiveMaskTop","effectiveMaskBottom","effectiveTextStyle","initialDigit","animDelta","currentDigitSV","slotOpacity","digitYValues","n","offset","clamped","Math","max","min","c","animatedX","animatedClipWidth","prevWidthRef","current","duration","easing","translateX","opacity","expandedHeight","animatedClipStyle","overflow","height","width","digitElements","absolute","create","position","left","top"],"sourceRoot":"../../../src","sources":["native/DigitSlot.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,244 @@
1
+ "use strict";
2
+
3
+ import MaskedView from "@rednegniw/masked-view";
4
+ import { useCallback, useEffect, useMemo, useState } from "react";
5
+ import { Text, View } from "react-native";
6
+ import { computeKeyedLayout } from "../core/layout.js";
7
+ import { detectNumberingSystem, getDigitStrings } from "../core/numerals/index.js";
8
+ import { getFormatCharacters } from "../core/intlHelpers.js";
9
+ import { useFlowPipeline } from "../core/useFlowPipeline.js";
10
+ import { useNumberFormatting } from "../core/useNumberFormatting.js";
11
+ import { getDigitCount } from "../core/utils.js";
12
+ import { warnOnce } from "../core/warnings.js";
13
+ import { renderSlots } from "./renderSlots.js";
14
+ import { useMeasuredGlyphMetrics } from "./useMeasuredGlyphMetrics.js";
15
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
16
+ export const NumberFlow = ({
17
+ value,
18
+ format,
19
+ locales,
20
+ style: nfStyle,
21
+ textAlign = "left",
22
+ prefix = "",
23
+ suffix = "",
24
+ spinTiming,
25
+ opacityTiming,
26
+ transformTiming,
27
+ trend,
28
+ animated,
29
+ respectMotionPreference,
30
+ continuous,
31
+ digits,
32
+ onAnimationsStart,
33
+ onAnimationsFinish,
34
+ containerStyle,
35
+ mask
36
+ }) => {
37
+ const formatChars = useMemo(() => getFormatCharacters(locales, format, prefix, suffix), [locales, format, prefix, suffix]);
38
+ const numberingSystem = useMemo(() => detectNumberingSystem(locales, format), [locales, format]);
39
+ const digitStrings = useMemo(() => getDigitStrings(numberingSystem), [numberingSystem]);
40
+ const {
41
+ metrics,
42
+ MeasureElement
43
+ } = useMeasuredGlyphMetrics(nfStyle, formatChars, digitStrings);
44
+ if (__DEV__) {
45
+ if (!nfStyle.fontSize) {
46
+ warnOnce("nf-fontSize", "style.fontSize is required for NumberFlow to measure glyphs.");
47
+ }
48
+ if (digits) {
49
+ for (const [posStr, constraint] of Object.entries(digits)) {
50
+ if (constraint.max < 1 || constraint.max > 9) {
51
+ warnOnce(`nf-digit-max-${posStr}`, `digits[${posStr}].max must be between 1 and 9, got ${constraint.max}.`);
52
+ }
53
+ }
54
+ }
55
+ }
56
+ const keyedParts = useNumberFormatting(value, format, locales, prefix, suffix);
57
+ const [containerWidth, setContainerWidth] = useState(0);
58
+ const handleContainerLayout = useCallback(e => {
59
+ setContainerWidth(e.nativeEvent.layout.width);
60
+ }, []);
61
+ const layout = useMemo(() => {
62
+ if (!metrics) return [];
63
+
64
+ // Skip layout when container hasn't measured yet and alignment needs width.
65
+ // Without this guard, center/right alignment computes with width=0,
66
+ // then re-computes after onLayout — causing a visible slide-in animation.
67
+ if (containerWidth === 0 && textAlign !== "left") return [];
68
+ if (keyedParts.length === 0) return [];
69
+ return computeKeyedLayout(keyedParts, metrics, containerWidth, textAlign, digitStrings);
70
+ }, [metrics, keyedParts, containerWidth, textAlign, digitStrings]);
71
+ const {
72
+ resolvedSpinTiming,
73
+ resolvedOpacityTiming,
74
+ resolvedTransformTiming,
75
+ resolvedTrend,
76
+ spinGenerations,
77
+ prevMap,
78
+ isInitialRender,
79
+ exitingEntries,
80
+ onExitComplete,
81
+ accessibilityLabel,
82
+ adaptiveMask
83
+ } = useFlowPipeline({
84
+ keyedParts,
85
+ trendValue: value,
86
+ layout,
87
+ metrics,
88
+ animated,
89
+ respectMotionPreference,
90
+ spinTiming,
91
+ opacityTiming,
92
+ transformTiming,
93
+ trend,
94
+ continuous,
95
+ mask,
96
+ onAnimationsStart,
97
+ onAnimationsFinish
98
+ });
99
+ const textStyle = useMemo(() => ({
100
+ ...nfStyle,
101
+ color: nfStyle.color ?? "#000000"
102
+ }), [nfStyle]);
103
+ const resolvedMask = mask ?? true;
104
+ const maskTop = adaptiveMask.top;
105
+ const maskBottom = adaptiveMask.bottom;
106
+ const {
107
+ expansionTop,
108
+ expansionBottom
109
+ } = adaptiveMask;
110
+
111
+ // Step count scales with mask height — each step must be >=1px (sub-pixel Views collapse to 0).
112
+ const topSteps = Math.max(2, Math.round(maskTop));
113
+ const bottomSteps = Math.max(2, Math.round(maskBottom));
114
+ const gradientMaskElement = useMemo(() => {
115
+ if (!resolvedMask || !metrics) return null;
116
+ return /*#__PURE__*/_jsxs(View, {
117
+ style: {
118
+ flex: 1,
119
+ flexDirection: "column"
120
+ },
121
+ children: [Array.from({
122
+ length: topSteps
123
+ }, (_, i) => /*#__PURE__*/_jsx(View, {
124
+ style: {
125
+ height: maskTop / topSteps,
126
+ backgroundColor: `rgba(0,0,0,${i / (topSteps - 1)})`
127
+ }
128
+ }, `t${i}`)), /*#__PURE__*/_jsx(View, {
129
+ style: {
130
+ flex: 1,
131
+ backgroundColor: "black"
132
+ }
133
+ }), Array.from({
134
+ length: bottomSteps
135
+ }, (_, i) => /*#__PURE__*/_jsx(View, {
136
+ style: {
137
+ height: maskBottom / bottomSteps,
138
+ backgroundColor: `rgba(0,0,0,${1 - i / (bottomSteps - 1)})`
139
+ }
140
+ }, `b${i}`))]
141
+ });
142
+ }, [resolvedMask, metrics, maskTop, maskBottom, topSteps, bottomSteps]);
143
+ const [slotsReady, setSlotsReady] = useState(false);
144
+ const metricsReady = !!metrics;
145
+ useEffect(() => {
146
+ if (!metricsReady) return;
147
+ const id = requestAnimationFrame(() => setSlotsReady(true));
148
+ return () => cancelAnimationFrame(id);
149
+ }, [metricsReady]);
150
+ if (!metrics || layout.length === 0 && exitingEntries.size === 0) {
151
+ return /*#__PURE__*/_jsxs(View, {
152
+ accessible: true,
153
+ accessibilityRole: "text",
154
+ accessibilityLabel: accessibilityLabel,
155
+ onLayout: handleContainerLayout,
156
+ style: containerStyle,
157
+ children: [/*#__PURE__*/_jsx(Text, {
158
+ style: [textStyle, {
159
+ textAlign
160
+ }],
161
+ children: accessibilityLabel
162
+ }), MeasureElement]
163
+ });
164
+ }
165
+
166
+ // Placeholder branch: show plain Text while slot tree loads
167
+ if (!slotsReady) {
168
+ return /*#__PURE__*/_jsxs(View, {
169
+ accessible: true,
170
+ accessibilityRole: "text",
171
+ accessibilityLabel: accessibilityLabel,
172
+ onLayout: handleContainerLayout,
173
+ style: [containerStyle, {
174
+ height: metrics.lineHeight + expansionTop + expansionBottom,
175
+ marginTop: -expansionTop,
176
+ marginBottom: -expansionBottom,
177
+ position: "relative",
178
+ overflow: "hidden"
179
+ }],
180
+ children: [/*#__PURE__*/_jsx(Text, {
181
+ style: [textStyle, {
182
+ textAlign
183
+ }],
184
+ children: accessibilityLabel
185
+ }), MeasureElement]
186
+ });
187
+ }
188
+ const slots = renderSlots({
189
+ layout,
190
+ exitingEntries,
191
+ prevMap,
192
+ isInitialRender,
193
+ onExitComplete,
194
+ metrics,
195
+ textStyle,
196
+ resolvedTrend,
197
+ spinTiming: resolvedSpinTiming,
198
+ opacityTiming: resolvedOpacityTiming,
199
+ transformTiming: resolvedTransformTiming,
200
+ spinGenerations,
201
+ digitCountResolver: key => getDigitCount(digits, key),
202
+ maskTop,
203
+ maskBottom,
204
+ digitStrings
205
+ });
206
+
207
+ // Optionally wrap in MaskedView for gradient edge fade.
208
+ const maskedContent = resolvedMask && gradientMaskElement ? /*#__PURE__*/_jsx(MaskedView, {
209
+ maskElement: gradientMaskElement,
210
+ style: {
211
+ flex: 1
212
+ },
213
+ children: /*#__PURE__*/_jsxs(View, {
214
+ style: {
215
+ flex: 1,
216
+ position: "relative",
217
+ top: expansionTop
218
+ },
219
+ children: [MeasureElement, slots]
220
+ })
221
+ }) : /*#__PURE__*/_jsxs(View, {
222
+ style: {
223
+ flex: 1,
224
+ position: "relative",
225
+ top: expansionTop
226
+ },
227
+ children: [MeasureElement, slots]
228
+ });
229
+ return /*#__PURE__*/_jsx(View, {
230
+ accessible: true,
231
+ accessibilityRole: "text",
232
+ accessibilityLabel: accessibilityLabel,
233
+ onLayout: handleContainerLayout,
234
+ style: [containerStyle, {
235
+ height: metrics.lineHeight + expansionTop + expansionBottom,
236
+ marginTop: -expansionTop,
237
+ marginBottom: -expansionBottom,
238
+ position: "relative",
239
+ overflow: "hidden"
240
+ }],
241
+ children: maskedContent
242
+ });
243
+ };
244
+ //# sourceMappingURL=NumberFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MaskedView","useCallback","useEffect","useMemo","useState","Text","View","computeKeyedLayout","detectNumberingSystem","getDigitStrings","getFormatCharacters","useFlowPipeline","useNumberFormatting","getDigitCount","warnOnce","renderSlots","useMeasuredGlyphMetrics","jsx","_jsx","jsxs","_jsxs","NumberFlow","value","format","locales","style","nfStyle","textAlign","prefix","suffix","spinTiming","opacityTiming","transformTiming","trend","animated","respectMotionPreference","continuous","digits","onAnimationsStart","onAnimationsFinish","containerStyle","mask","formatChars","numberingSystem","digitStrings","metrics","MeasureElement","__DEV__","fontSize","posStr","constraint","Object","entries","max","keyedParts","containerWidth","setContainerWidth","handleContainerLayout","e","nativeEvent","layout","width","length","resolvedSpinTiming","resolvedOpacityTiming","resolvedTransformTiming","resolvedTrend","spinGenerations","prevMap","isInitialRender","exitingEntries","onExitComplete","accessibilityLabel","adaptiveMask","trendValue","textStyle","color","resolvedMask","maskTop","top","maskBottom","bottom","expansionTop","expansionBottom","topSteps","Math","round","bottomSteps","gradientMaskElement","flex","flexDirection","children","Array","from","_","i","height","backgroundColor","slotsReady","setSlotsReady","metricsReady","id","requestAnimationFrame","cancelAnimationFrame","size","accessible","accessibilityRole","onLayout","lineHeight","marginTop","marginBottom","position","overflow","slots","digitCountResolver","key","maskedContent","maskElement"],"sourceRoot":"../../../src","sources":["native/NumberFlow.tsx"],"mappings":";;AAAA,OAAOA,UAAU,MAAM,wBAAwB;AAC/C,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,OAAO;AACjE,SAAiCC,IAAI,EAAEC,IAAI,QAAQ,cAAc;AACjE,SAASC,kBAAkB,QAAQ,mBAAgB;AACnD,SAASC,qBAAqB,EAAEC,eAAe,QAAQ,2BAAkB;AACzE,SAASC,mBAAmB,QAAQ,wBAAqB;AACzD,SAASC,eAAe,QAAQ,4BAAyB;AACzD,SAASC,mBAAmB,QAAQ,gCAA6B;AACjE,SAASC,aAAa,QAAQ,kBAAe;AAC7C,SAASC,QAAQ,QAAQ,qBAAkB;AAC3C,SAASC,WAAW,QAAQ,kBAAe;AAE3C,SAASC,uBAAuB,QAAQ,8BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAEpE,OAAO,MAAMC,UAAU,GAAGA,CAAC;EACzBC,KAAK;EACLC,MAAM;EACNC,OAAO;EACPC,KAAK,EAAEC,OAAO;EACdC,SAAS,GAAG,MAAM;EAClBC,MAAM,GAAG,EAAE;EACXC,MAAM,GAAG,EAAE;EACXC,UAAU;EACVC,aAAa;EACbC,eAAe;EACfC,KAAK;EACLC,QAAQ;EACRC,uBAAuB;EACvBC,UAAU;EACVC,MAAM;EACNC,iBAAiB;EACjBC,kBAAkB;EAClBC,cAAc;EACdC;AACe,CAAC,KAAK;EACrB,MAAMC,WAAW,GAAGvC,OAAO,CACzB,MAAMO,mBAAmB,CAACc,OAAO,EAAED,MAAM,EAAEK,MAAM,EAAEC,MAAM,CAAC,EAC1D,CAACL,OAAO,EAAED,MAAM,EAAEK,MAAM,EAAEC,MAAM,CAClC,CAAC;EACD,MAAMc,eAAe,GAAGxC,OAAO,CAC7B,MAAMK,qBAAqB,CAACgB,OAAO,EAAED,MAAM,CAAC,EAC5C,CAACC,OAAO,EAAED,MAAM,CAClB,CAAC;EACD,MAAMqB,YAAY,GAAGzC,OAAO,CAC1B,MAAMM,eAAe,CAACkC,eAAe,CAAC,EACtC,CAACA,eAAe,CAClB,CAAC;EACD,MAAM;IAAEE,OAAO;IAAEC;EAAe,CAAC,GAAG9B,uBAAuB,CACzDU,OAAO,EACPgB,WAAW,EACXE,YACF,CAAC;EAED,IAAIG,OAAO,EAAE;IACX,IAAI,CAACrB,OAAO,CAACsB,QAAQ,EAAE;MACrBlC,QAAQ,CACN,aAAa,EACb,8DACF,CAAC;IACH;IACA,IAAIuB,MAAM,EAAE;MACV,KAAK,MAAM,CAACY,MAAM,EAAEC,UAAU,CAAC,IAAIC,MAAM,CAACC,OAAO,CAACf,MAAM,CAAC,EAAE;QACzD,IAAIa,UAAU,CAACG,GAAG,GAAG,CAAC,IAAIH,UAAU,CAACG,GAAG,GAAG,CAAC,EAAE;UAC5CvC,QAAQ,CACN,gBAAgBmC,MAAM,EAAE,EACxB,UAAUA,MAAM,sCAAsCC,UAAU,CAACG,GAAG,GACtE,CAAC;QACH;MACF;IACF;EACF;EAEA,MAAMC,UAAU,GAAG1C,mBAAmB,CACpCU,KAAK,EACLC,MAAM,EACNC,OAAO,EACPI,MAAM,EACNC,MACF,CAAC;EAED,MAAM,CAAC0B,cAAc,EAAEC,iBAAiB,CAAC,GAAGpD,QAAQ,CAAC,CAAC,CAAC;EACvD,MAAMqD,qBAAqB,GAAGxD,WAAW,CAAEyD,CAAoB,IAAK;IAClEF,iBAAiB,CAACE,CAAC,CAACC,WAAW,CAACC,MAAM,CAACC,KAAK,CAAC;EAC/C,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMD,MAAM,GAAGzD,OAAO,CAAC,MAAM;IAC3B,IAAI,CAAC0C,OAAO,EAAE,OAAO,EAAE;;IAEvB;IACA;IACA;IACA,IAAIU,cAAc,KAAK,CAAC,IAAI5B,SAAS,KAAK,MAAM,EAAE,OAAO,EAAE;IAE3D,IAAI2B,UAAU,CAACQ,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE;IACtC,OAAOvD,kBAAkB,CACvB+C,UAAU,EACVT,OAAO,EACPU,cAAc,EACd5B,SAAS,EACTiB,YACF,CAAC;EACH,CAAC,EAAE,CAACC,OAAO,EAAES,UAAU,EAAEC,cAAc,EAAE5B,SAAS,EAAEiB,YAAY,CAAC,CAAC;EAElE,MAAM;IACJmB,kBAAkB;IAClBC,qBAAqB;IACrBC,uBAAuB;IACvBC,aAAa;IACbC,eAAe;IACfC,OAAO;IACPC,eAAe;IACfC,cAAc;IACdC,cAAc;IACdC,kBAAkB;IAClBC;EACF,CAAC,GAAG9D,eAAe,CAAC;IAClB2C,UAAU;IACVoB,UAAU,EAAEpD,KAAK;IACjBsC,MAAM;IACNf,OAAO;IACPX,QAAQ;IACRC,uBAAuB;IACvBL,UAAU;IACVC,aAAa;IACbC,eAAe;IACfC,KAAK;IACLG,UAAU;IACVK,IAAI;IACJH,iBAAiB;IACjBC;EACF,CAAC,CAAC;EAEF,MAAMoC,SAAS,GAAGxE,OAAO,CACvB,OAAO;IACL,GAAGuB,OAAO;IACVkD,KAAK,EAAElD,OAAO,CAACkD,KAAK,IAAI;EAC1B,CAAC,CAAC,EACF,CAAClD,OAAO,CACV,CAAC;EAED,MAAMmD,YAAY,GAAGpC,IAAI,IAAI,IAAI;EACjC,MAAMqC,OAAO,GAAGL,YAAY,CAACM,GAAG;EAChC,MAAMC,UAAU,GAAGP,YAAY,CAACQ,MAAM;EACtC,MAAM;IAAEC,YAAY;IAAEC;EAAgB,CAAC,GAAGV,YAAY;;EAEtD;EACA,MAAMW,QAAQ,GAAGC,IAAI,CAAChC,GAAG,CAAC,CAAC,EAAEgC,IAAI,CAACC,KAAK,CAACR,OAAO,CAAC,CAAC;EACjD,MAAMS,WAAW,GAAGF,IAAI,CAAChC,GAAG,CAAC,CAAC,EAAEgC,IAAI,CAACC,KAAK,CAACN,UAAU,CAAC,CAAC;EAEvD,MAAMQ,mBAAmB,GAAGrF,OAAO,CAAC,MAAM;IACxC,IAAI,CAAC0E,YAAY,IAAI,CAAChC,OAAO,EAAE,OAAO,IAAI;IAC1C,oBACEzB,KAAA,CAACd,IAAI;MAACmB,KAAK,EAAE;QAAEgE,IAAI,EAAE,CAAC;QAAEC,aAAa,EAAE;MAAS,CAAE;MAAAC,QAAA,GAE/CC,KAAK,CAACC,IAAI,CAAC;QAAE/B,MAAM,EAAEsB;MAAS,CAAC,EAAE,CAACU,CAAC,EAAEC,CAAC,kBACrC7E,IAAA,CAACZ,IAAI;QAEHmB,KAAK,EAAE;UACLuE,MAAM,EAAElB,OAAO,GAAGM,QAAQ;UAC1Ba,eAAe,EAAE,cAAcF,CAAC,IAAIX,QAAQ,GAAG,CAAC,CAAC;QACnD;MAAE,GAJG,IAAIW,CAAC,EAKX,CACF,CAAC,eAGF7E,IAAA,CAACZ,IAAI;QAACmB,KAAK,EAAE;UAAEgE,IAAI,EAAE,CAAC;UAAEQ,eAAe,EAAE;QAAQ;MAAE,CAAE,CAAC,EAGrDL,KAAK,CAACC,IAAI,CAAC;QAAE/B,MAAM,EAAEyB;MAAY,CAAC,EAAE,CAACO,CAAC,EAAEC,CAAC,kBACxC7E,IAAA,CAACZ,IAAI;QAEHmB,KAAK,EAAE;UACLuE,MAAM,EAAEhB,UAAU,GAAGO,WAAW;UAChCU,eAAe,EAAE,cAAc,CAAC,GAAGF,CAAC,IAAIR,WAAW,GAAG,CAAC,CAAC;QAC1D;MAAE,GAJG,IAAIQ,CAAC,EAKX,CACF,CAAC;IAAA,CACE,CAAC;EAEX,CAAC,EAAE,CAAClB,YAAY,EAAEhC,OAAO,EAAEiC,OAAO,EAAEE,UAAU,EAAEI,QAAQ,EAAEG,WAAW,CAAC,CAAC;EAGvE,MAAM,CAACW,UAAU,EAAEC,aAAa,CAAC,GAAG/F,QAAQ,CAAC,KAAK,CAAC;EACnD,MAAMgG,YAAY,GAAG,CAAC,CAACvD,OAAO;EAE9B3C,SAAS,CAAC,MAAM;IACd,IAAI,CAACkG,YAAY,EAAE;IACnB,MAAMC,EAAE,GAAGC,qBAAqB,CAAC,MAAMH,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3D,OAAO,MAAMI,oBAAoB,CAACF,EAAE,CAAC;EACvC,CAAC,EAAE,CAACD,YAAY,CAAC,CAAC;EAElB,IAAI,CAACvD,OAAO,IAAKe,MAAM,CAACE,MAAM,KAAK,CAAC,IAAIQ,cAAc,CAACkC,IAAI,KAAK,CAAE,EAAE;IAClE,oBACEpF,KAAA,CAACd,IAAI;MACHmG,UAAU;MACVC,iBAAiB,EAAC,MAAM;MACxBlC,kBAAkB,EAAEA,kBAAmB;MACvCmC,QAAQ,EAAElD,qBAAsB;MAChChC,KAAK,EAAEe,cAAe;MAAAmD,QAAA,gBAEtBzE,IAAA,CAACb,IAAI;QAACoB,KAAK,EAAE,CAACkD,SAAS,EAAE;UAAEhD;QAAU,CAAC,CAAE;QAAAgE,QAAA,EAAEnB;MAAkB,CAAO,CAAC,EACnE1B,cAAc;IAAA,CACX,CAAC;EAEX;;EAEA;EACA,IAAI,CAACoD,UAAU,EAAE;IACf,oBACE9E,KAAA,CAACd,IAAI;MACHmG,UAAU;MACVC,iBAAiB,EAAC,MAAM;MACxBlC,kBAAkB,EAAEA,kBAAmB;MACvCmC,QAAQ,EAAElD,qBAAsB;MAChChC,KAAK,EAAE,CACLe,cAAc,EACd;QACEwD,MAAM,EAAEnD,OAAO,CAAC+D,UAAU,GAAG1B,YAAY,GAAGC,eAAe;QAC3D0B,SAAS,EAAE,CAAC3B,YAAY;QACxB4B,YAAY,EAAE,CAAC3B,eAAe;QAC9B4B,QAAQ,EAAE,UAAU;QACpBC,QAAQ,EAAE;MACZ,CAAC,CACD;MAAArB,QAAA,gBAEFzE,IAAA,CAACb,IAAI;QAACoB,KAAK,EAAE,CAACkD,SAAS,EAAE;UAAEhD;QAAU,CAAC,CAAE;QAAAgE,QAAA,EAAEnB;MAAkB,CAAO,CAAC,EACnE1B,cAAc;IAAA,CACX,CAAC;EAEX;EAEA,MAAMmE,KAAK,GAAGlG,WAAW,CAAC;IACxB6C,MAAM;IACNU,cAAc;IACdF,OAAO;IACPC,eAAe;IACfE,cAAc;IACd1B,OAAO;IACP8B,SAAS;IACTT,aAAa;IACbpC,UAAU,EAAEiC,kBAAkB;IAC9BhC,aAAa,EAAEiC,qBAAqB;IACpChC,eAAe,EAAEiC,uBAAuB;IACxCE,eAAe;IACf+C,kBAAkB,EAAGC,GAAG,IAAKtG,aAAa,CAACwB,MAAM,EAAE8E,GAAG,CAAC;IACvDrC,OAAO;IACPE,UAAU;IACVpC;EACF,CAAC,CAAC;;EAEF;EACA,MAAMwE,aAAa,GACjBvC,YAAY,IAAIW,mBAAmB,gBACjCtE,IAAA,CAAClB,UAAU;IAACqH,WAAW,EAAE7B,mBAAoB;IAAC/D,KAAK,EAAE;MAAEgE,IAAI,EAAE;IAAE,CAAE;IAAAE,QAAA,eAC/DvE,KAAA,CAACd,IAAI;MAACmB,KAAK,EAAE;QAAEgE,IAAI,EAAE,CAAC;QAAEsB,QAAQ,EAAE,UAAU;QAAEhC,GAAG,EAAEG;MAAa,CAAE;MAAAS,QAAA,GAC/D7C,cAAc,EACdmE,KAAK;IAAA,CACF;EAAC,CACG,CAAC,gBAEb7F,KAAA,CAACd,IAAI;IAACmB,KAAK,EAAE;MAAEgE,IAAI,EAAE,CAAC;MAAEsB,QAAQ,EAAE,UAAU;MAAEhC,GAAG,EAAEG;IAAa,CAAE;IAAAS,QAAA,GAC/D7C,cAAc,EACdmE,KAAK;EAAA,CACF,CACP;EAEH,oBACE/F,IAAA,CAACZ,IAAI;IACHmG,UAAU;IACVC,iBAAiB,EAAC,MAAM;IACxBlC,kBAAkB,EAAEA,kBAAmB;IACvCmC,QAAQ,EAAElD,qBAAsB;IAChChC,KAAK,EAAE,CACLe,cAAc,EACd;MACEwD,MAAM,EAAEnD,OAAO,CAAC+D,UAAU,GAAG1B,YAAY,GAAGC,eAAe;MAC3D0B,SAAS,EAAE,CAAC3B,YAAY;MACxB4B,YAAY,EAAE,CAAC3B,eAAe;MAC9B4B,QAAQ,EAAE,UAAU;MACpBC,QAAQ,EAAE;IACZ,CAAC,CACD;IAAArB,QAAA,EAEDyB;EAAa,CACV,CAAC;AAEX,CAAC","ignoreList":[]}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ import React, { useMemo } from "react";
4
+ import { Text } from "react-native";
5
+ import Animated, { useAnimatedStyle } from "react-native-reanimated";
6
+ import { SUPERSCRIPT_SCALE } from "../core/constants.js";
7
+ import { getSuperscriptTextStyle } from "../core/superscript.js";
8
+ import { useAnimatedX } from "../core/useAnimatedX.js";
9
+ import { useSlotOpacity } from "../core/useSlotOpacity.js";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ export const SymbolSlot = /*#__PURE__*/React.memo(({
12
+ char,
13
+ targetX,
14
+ lineHeight,
15
+ textStyle,
16
+ opacityTiming,
17
+ transformTiming,
18
+ entering,
19
+ exiting,
20
+ exitKey,
21
+ onExitComplete,
22
+ superscript
23
+ }) => {
24
+ const effectiveHeight = superscript ? lineHeight * SUPERSCRIPT_SCALE : lineHeight;
25
+ const effectiveTextStyle = useMemo(() => superscript ? getSuperscriptTextStyle(textStyle, effectiveHeight) : textStyle, [textStyle, superscript, effectiveHeight]);
26
+ const slotOpacity = useSlotOpacity({
27
+ entering,
28
+ exiting,
29
+ opacityTiming,
30
+ exitKey,
31
+ onExitComplete
32
+ });
33
+ const animatedX = useAnimatedX(targetX, exiting, transformTiming);
34
+ const animatedStyle = useAnimatedStyle(() => ({
35
+ transform: [{
36
+ translateX: animatedX.value
37
+ }],
38
+ opacity: slotOpacity.value
39
+ }));
40
+ return /*#__PURE__*/_jsx(Animated.View, {
41
+ style: [{
42
+ position: "absolute",
43
+ height: effectiveHeight
44
+ }, animatedStyle],
45
+ children: /*#__PURE__*/_jsx(Text, {
46
+ style: effectiveTextStyle,
47
+ children: char
48
+ })
49
+ });
50
+ });
51
+ SymbolSlot.displayName = "SymbolSlot";
52
+ //# sourceMappingURL=SymbolSlot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useMemo","Text","Animated","useAnimatedStyle","SUPERSCRIPT_SCALE","getSuperscriptTextStyle","useAnimatedX","useSlotOpacity","jsx","_jsx","SymbolSlot","memo","char","targetX","lineHeight","textStyle","opacityTiming","transformTiming","entering","exiting","exitKey","onExitComplete","superscript","effectiveHeight","effectiveTextStyle","slotOpacity","animatedX","animatedStyle","transform","translateX","value","opacity","View","style","position","height","children","displayName"],"sourceRoot":"../../../src","sources":["native/SymbolSlot.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,SAASC,IAAI,QAAwB,cAAc;AACnD,OAAOC,QAAQ,IAAIC,gBAAgB,QAAQ,yBAAyB;AACpE,SAASC,iBAAiB,QAAQ,sBAAmB;AACrD,SAASC,uBAAuB,QAAQ,wBAAqB;AAE7D,SAASC,YAAY,QAAQ,yBAAsB;AACnD,SAASC,cAAc,QAAQ,2BAAwB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAgBxD,OAAO,MAAMC,UAAU,gBAAGX,KAAK,CAACY,IAAI,CAClC,CAAC;EACCC,IAAI;EACJC,OAAO;EACPC,UAAU;EACVC,SAAS;EACTC,aAAa;EACbC,eAAe;EACfC,QAAQ;EACRC,OAAO;EACPC,OAAO;EACPC,cAAc;EACdC;AACe,CAAC,KAAK;EACrB,MAAMC,eAAe,GAAGD,WAAW,GAAGR,UAAU,GAAGV,iBAAiB,GAAGU,UAAU;EAEjF,MAAMU,kBAAkB,GAAGxB,OAAO,CAChC,MAAOsB,WAAW,GAAGjB,uBAAuB,CAACU,SAAS,EAAEQ,eAAe,CAAC,GAAGR,SAAU,EACrF,CAACA,SAAS,EAAEO,WAAW,EAAEC,eAAe,CAC1C,CAAC;EAED,MAAME,WAAW,GAAGlB,cAAc,CAAC;IACjCW,QAAQ;IACRC,OAAO;IACPH,aAAa;IACbI,OAAO;IACPC;EACF,CAAC,CAAC;EAEF,MAAMK,SAAS,GAAGpB,YAAY,CAACO,OAAO,EAAEM,OAAO,EAAEF,eAAe,CAAC;EAEjE,MAAMU,aAAa,GAAGxB,gBAAgB,CAAC,OAAO;IAC5CyB,SAAS,EAAE,CAAC;MAAEC,UAAU,EAAEH,SAAS,CAACI;IAAM,CAAC,CAAC;IAC5CC,OAAO,EAAEN,WAAW,CAACK;EACvB,CAAC,CAAC,CAAC;EAEH,oBACErB,IAAA,CAACP,QAAQ,CAAC8B,IAAI;IAACC,KAAK,EAAE,CAAC;MAAEC,QAAQ,EAAE,UAAU;MAAEC,MAAM,EAAEZ;IAAgB,CAAC,EAAEI,aAAa,CAAE;IAAAS,QAAA,eACvF3B,IAAA,CAACR,IAAI;MAACgC,KAAK,EAAET,kBAAmB;MAAAY,QAAA,EAAExB;IAAI,CAAO;EAAC,CACjC,CAAC;AAEpB,CACF,CAAC;AAEDF,UAAU,CAAC2B,WAAW,GAAG,YAAY","ignoreList":[]}