react-native-laminar 1.4.5 → 1.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.
- package/README.md +36 -6
- package/lib/commonjs/hooks/use-leading-animation.js +49 -0
- package/lib/commonjs/hooks/use-leading-animation.js.map +1 -0
- package/lib/commonjs/hooks/use-morph-motion.js +3 -1
- package/lib/commonjs/hooks/use-morph-motion.js.map +1 -1
- package/lib/commonjs/index.js +35 -6
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/motion/preset-map.js +5 -0
- package/lib/commonjs/motion/preset-map.js.map +1 -1
- package/lib/commonjs/view/leading-element.js +37 -0
- package/lib/commonjs/view/leading-element.js.map +1 -0
- package/lib/commonjs/view/morph-viewport.js +26 -0
- package/lib/commonjs/view/morph-viewport.js.map +1 -1
- package/lib/commonjs/view/number-run.js +70 -22
- package/lib/commonjs/view/number-run.js.map +1 -1
- package/lib/commonjs/view/slot-shadow.js +77 -0
- package/lib/commonjs/view/slot-shadow.js.map +1 -0
- package/lib/commonjs/view/slots-run.js +111 -42
- package/lib/commonjs/view/slots-run.js.map +1 -1
- package/lib/commonjs/view/text-run.js +13 -24
- package/lib/commonjs/view/text-run.js.map +1 -1
- package/lib/commonjs/view/ticker-run.js +127 -0
- package/lib/commonjs/view/ticker-run.js.map +1 -0
- package/lib/module/hooks/use-leading-animation.js +44 -0
- package/lib/module/hooks/use-leading-animation.js.map +1 -0
- package/lib/module/hooks/use-morph-motion.js +3 -1
- package/lib/module/hooks/use-morph-motion.js.map +1 -1
- package/lib/module/index.js +35 -6
- package/lib/module/index.js.map +1 -1
- package/lib/module/motion/preset-map.js +5 -0
- package/lib/module/motion/preset-map.js.map +1 -1
- package/lib/module/view/leading-element.js +32 -0
- package/lib/module/view/leading-element.js.map +1 -0
- package/lib/module/view/morph-viewport.js +28 -2
- package/lib/module/view/morph-viewport.js.map +1 -1
- package/lib/module/view/number-run.js +70 -23
- package/lib/module/view/number-run.js.map +1 -1
- package/lib/module/view/slot-shadow.js +72 -0
- package/lib/module/view/slot-shadow.js.map +1 -0
- package/lib/module/view/slots-run.js +111 -42
- package/lib/module/view/slots-run.js.map +1 -1
- package/lib/module/view/text-run.js +14 -25
- package/lib/module/view/text-run.js.map +1 -1
- package/lib/module/view/ticker-run.js +121 -0
- package/lib/module/view/ticker-run.js.map +1 -0
- package/lib/typescript/commonjs/hooks/use-leading-animation.d.ts +16 -0
- package/lib/typescript/commonjs/hooks/use-leading-animation.d.ts.map +1 -0
- package/lib/typescript/commonjs/hooks/use-morph-motion.d.ts +3 -2
- package/lib/typescript/commonjs/hooks/use-morph-motion.d.ts.map +1 -1
- package/lib/typescript/commonjs/index.d.ts +1 -1
- package/lib/typescript/commonjs/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/motion/preset-map.d.ts.map +1 -1
- package/lib/typescript/commonjs/types.d.ts +14 -2
- package/lib/typescript/commonjs/types.d.ts.map +1 -1
- package/lib/typescript/commonjs/view/leading-element.d.ts +14 -0
- package/lib/typescript/commonjs/view/leading-element.d.ts.map +1 -0
- package/lib/typescript/commonjs/view/morph-viewport.d.ts +4 -1
- package/lib/typescript/commonjs/view/morph-viewport.d.ts.map +1 -1
- package/lib/typescript/commonjs/view/number-run.d.ts +6 -2
- package/lib/typescript/commonjs/view/number-run.d.ts.map +1 -1
- package/lib/typescript/commonjs/view/slot-shadow.d.ts +11 -0
- package/lib/typescript/commonjs/view/slot-shadow.d.ts.map +1 -0
- package/lib/typescript/commonjs/view/slots-run.d.ts +8 -3
- package/lib/typescript/commonjs/view/slots-run.d.ts.map +1 -1
- package/lib/typescript/commonjs/view/text-run.d.ts.map +1 -1
- package/lib/typescript/commonjs/view/ticker-run.d.ts +21 -0
- package/lib/typescript/commonjs/view/ticker-run.d.ts.map +1 -0
- package/lib/typescript/module/hooks/use-leading-animation.d.ts +16 -0
- package/lib/typescript/module/hooks/use-leading-animation.d.ts.map +1 -0
- package/lib/typescript/module/hooks/use-morph-motion.d.ts +3 -2
- package/lib/typescript/module/hooks/use-morph-motion.d.ts.map +1 -1
- package/lib/typescript/module/index.d.ts +1 -1
- package/lib/typescript/module/index.d.ts.map +1 -1
- package/lib/typescript/module/motion/preset-map.d.ts.map +1 -1
- package/lib/typescript/module/types.d.ts +14 -2
- package/lib/typescript/module/types.d.ts.map +1 -1
- package/lib/typescript/module/view/leading-element.d.ts +14 -0
- package/lib/typescript/module/view/leading-element.d.ts.map +1 -0
- package/lib/typescript/module/view/morph-viewport.d.ts +4 -1
- package/lib/typescript/module/view/morph-viewport.d.ts.map +1 -1
- package/lib/typescript/module/view/number-run.d.ts +6 -2
- package/lib/typescript/module/view/number-run.d.ts.map +1 -1
- package/lib/typescript/module/view/slot-shadow.d.ts +11 -0
- package/lib/typescript/module/view/slot-shadow.d.ts.map +1 -0
- package/lib/typescript/module/view/slots-run.d.ts +8 -3
- package/lib/typescript/module/view/slots-run.d.ts.map +1 -1
- package/lib/typescript/module/view/text-run.d.ts.map +1 -1
- package/lib/typescript/module/view/ticker-run.d.ts +21 -0
- package/lib/typescript/module/view/ticker-run.d.ts.map +1 -0
- package/package.json +3 -1
- package/src/hooks/use-leading-animation.ts +74 -0
- package/src/hooks/use-morph-motion.ts +10 -1
- package/src/index.tsx +44 -6
- package/src/motion/preset-map.ts +5 -0
- package/src/types.ts +17 -2
- package/src/view/leading-element.tsx +45 -0
- package/src/view/morph-viewport.tsx +39 -1
- package/src/view/number-run.tsx +94 -26
- package/src/view/slot-shadow.tsx +99 -0
- package/src/view/slots-run.tsx +163 -58
- package/src/view/text-run.tsx +14 -51
- package/src/view/ticker-run.tsx +167 -0
package/README.md
CHANGED
|
@@ -93,6 +93,7 @@ export default function SlotCounter() {
|
|
|
93
93
|
variant="slots"
|
|
94
94
|
fontSize={48}
|
|
95
95
|
animationPreset="snappy"
|
|
96
|
+
shadow
|
|
96
97
|
clipToBounds
|
|
97
98
|
style={{ color: "#000000", fontVariant: ["tabular-nums"] }}
|
|
98
99
|
/>
|
|
@@ -102,6 +103,29 @@ export default function SlotCounter() {
|
|
|
102
103
|
}
|
|
103
104
|
```
|
|
104
105
|
|
|
106
|
+
The `shadow` prop requires the app to provide the
|
|
107
|
+
`@react-native-masked-view/masked-view` and `expo-linear-gradient` peer
|
|
108
|
+
dependencies.
|
|
109
|
+
|
|
110
|
+
### Number flow
|
|
111
|
+
|
|
112
|
+
Use `numberMode="ticker"` with `variant="number"` for clean live-number flow.
|
|
113
|
+
Changed digits refresh in place while unchanged digits remain perfectly still;
|
|
114
|
+
this mode deliberately has no vertical reel or viewport mask:
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
<Laminar
|
|
118
|
+
text="$2,459.70"
|
|
119
|
+
variant="number"
|
|
120
|
+
numberMode="ticker"
|
|
121
|
+
stagger={0}
|
|
122
|
+
style={{ color: "#000000" }}
|
|
123
|
+
/>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Prefixes, grouping separators, decimals, and unchanged digits stay crisp. The
|
|
127
|
+
`shadow` prop is intentionally reserved for `variant="slots"`.
|
|
128
|
+
|
|
105
129
|
### Inside a button with auto-sizing
|
|
106
130
|
|
|
107
131
|
```tsx
|
|
@@ -117,7 +141,7 @@ export default function SlotCounter() {
|
|
|
117
141
|
|
|
118
142
|
### Auto-sized button with leading icons
|
|
119
143
|
|
|
120
|
-
Pass a
|
|
144
|
+
Pass a value-keyed `leading` map when the button changes between visual states.
|
|
121
145
|
Laminar selects the matching entry and animates icon-to-icon replacements.
|
|
122
146
|
|
|
123
147
|
```tsx
|
|
@@ -150,7 +174,7 @@ const leading = {
|
|
|
150
174
|
```
|
|
151
175
|
|
|
152
176
|
The map key must match the current `text` value. A missing entry means no
|
|
153
|
-
leading element, so the icon fades out when the
|
|
177
|
+
leading element, so the icon fades out when the value returns to a plain label.
|
|
154
178
|
|
|
155
179
|
### Centered text in a fixed-width container
|
|
156
180
|
|
|
@@ -201,17 +225,19 @@ Use `autoSize={false}` when the parent already defines the space and you only wa
|
|
|
201
225
|
type LaminarProps = {
|
|
202
226
|
text: string | number;
|
|
203
227
|
variant?: "text" | "number" | "slots";
|
|
228
|
+
numberMode?: "morph" | "ticker";
|
|
204
229
|
fontSize?: number;
|
|
205
230
|
color?: string;
|
|
206
231
|
align?: "left" | "center" | "right";
|
|
207
232
|
leading?: ReactNode | Readonly<Record<string, ReactNode>>;
|
|
208
233
|
leadingKey?: string | number;
|
|
209
234
|
leadingGap?: number;
|
|
235
|
+
shadow?: boolean | { color?: string; size?: number };
|
|
210
236
|
style?: StyleProp<TextStyle>;
|
|
211
237
|
containerStyle?: StyleProp<ViewStyle>;
|
|
212
238
|
fontStyle?: StyleProp<TextStyle>;
|
|
213
239
|
animationDuration?: number;
|
|
214
|
-
animationPreset?: "default" | "smooth" | "snappy" | "bouncy";
|
|
240
|
+
animationPreset?: "default" | "smooth" | "snappy" | "bouncy" | "ticker";
|
|
215
241
|
stagger?: number;
|
|
216
242
|
autoSize?: boolean;
|
|
217
243
|
clipToBounds?: boolean;
|
|
@@ -225,15 +251,17 @@ type LaminarProps = {
|
|
|
225
251
|
| `fontSize` | Undefined | Convenience prop merged into the text style. |
|
|
226
252
|
| `color` | Undefined | Convenience prop merged into the text style. |
|
|
227
253
|
| `align` | `"left"` | Visual alignment for Laminar's viewport and animated glyph row. |
|
|
228
|
-
| `leading` | Undefined | Optional inline element, or
|
|
254
|
+
| `leading` | Undefined | Optional inline element, or value-keyed leading content, rendered by every variant. |
|
|
229
255
|
| `leadingKey` | Undefined | Advanced identity override for a direct leading element. |
|
|
230
256
|
| `leadingGap` | `0` | Spacing between the leading element and the first text glyph. |
|
|
257
|
+
| `numberMode` | `"morph"` | With `variant="number"`, `"ticker"` uses crisp in-place digit flow instead of glyph morphs. |
|
|
258
|
+
| `shadow` | `false` | Adds persistent top and bottom alpha fades to slot digit viewports. Accepts `true` or `{ color, size }`. |
|
|
231
259
|
| `style` | Undefined | Text style applied after `fontSize` and `color`. |
|
|
232
260
|
| `containerStyle` | Undefined | Advanced style override for the outer viewport shell. |
|
|
233
261
|
| `fontStyle` | Undefined | Additional text style merged before `style`. |
|
|
234
262
|
| `animationDuration` | Preset default | Duration override in milliseconds. |
|
|
235
|
-
| `animationPreset` | `"default"` for text, `"snappy"` for number | Named motion recipe.
|
|
236
|
-
| `stagger` | `0.02`
|
|
263
|
+
| `animationPreset` | `"default"` for text, `"snappy"` for number | Named motion recipe; ticker mode defaults to the `ticker` preset. |
|
|
264
|
+
| `stagger` | `0.02` (`0` for ticker mode) | Delay in seconds between numeric lane replacements. |
|
|
237
265
|
| `autoSize` | `true` | Animate the outer width to the measured final text width. |
|
|
238
266
|
| `clipToBounds` | `false` | Clip animated overflow to the viewport bounds. |
|
|
239
267
|
|
|
@@ -247,11 +275,13 @@ type LaminarProps = {
|
|
|
247
275
|
| `smooth` | Spring with no bounce | 400ms |
|
|
248
276
|
| `snappy` | Spring with light bounce | 350ms |
|
|
249
277
|
| `bouncy` | Spring with more bounce | 500ms |
|
|
278
|
+
| `ticker` | In-place number-flow timing | 300ms |
|
|
250
279
|
|
|
251
280
|
```tsx
|
|
252
281
|
<Laminar text={word} animationPreset="smooth" />
|
|
253
282
|
<Laminar text={count} variant="number" animationPreset="snappy" />
|
|
254
283
|
<Laminar text={count} variant="slots" animationPreset="snappy" />
|
|
284
|
+
<Laminar text={count} variant="number" numberMode="ticker" shadow />
|
|
255
285
|
|
|
256
286
|
// Override duration
|
|
257
287
|
<Laminar text={word} animationPreset="default" animationDuration={520} />
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useLeadingAnimation = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _reactNativeReanimated = require("react-native-reanimated");
|
|
9
|
+
var _entryExitBuilders = require("../motion/entry-exit-builders");
|
|
10
|
+
// keep leading presence and replacement motion consistent across every content variant
|
|
11
|
+
const useLeadingAnimation = ({
|
|
12
|
+
leading,
|
|
13
|
+
leadingKey,
|
|
14
|
+
leadingGap,
|
|
15
|
+
motionRecipe
|
|
16
|
+
}) => {
|
|
17
|
+
const lastLeadingPresenceRef = (0, _react.useRef)(Boolean(leading));
|
|
18
|
+
const lastLeadingKeyRef = (0, _react.useRef)(leadingKey);
|
|
19
|
+
const isLeadingSwap = Boolean(leading) && lastLeadingPresenceRef.current && leadingKey !== lastLeadingKeyRef.current;
|
|
20
|
+
const isLeadingChange = Boolean(leading) !== lastLeadingPresenceRef.current || Boolean(leading) && leadingKey !== lastLeadingKeyRef.current;
|
|
21
|
+
const leadingSwapProgress = (0, _reactNativeReanimated.useSharedValue)(0);
|
|
22
|
+
|
|
23
|
+
// update the worklet flag after commit so render never writes a shared value
|
|
24
|
+
(0, _react.useLayoutEffect)(() => {
|
|
25
|
+
leadingSwapProgress.value = isLeadingSwap ? 1 : 0;
|
|
26
|
+
}, [isLeadingSwap, leadingSwapProgress]);
|
|
27
|
+
const elementEnterTransition = (0, _react.useMemo)(() => (0, _entryExitBuilders.createLeadingEnterTransition)({
|
|
28
|
+
durationMs: motionRecipe.durationMs,
|
|
29
|
+
easing: motionRecipe.easing
|
|
30
|
+
}), [motionRecipe.durationMs, motionRecipe.easing]);
|
|
31
|
+
const elementExitTransition = (0, _react.useMemo)(() => (0, _entryExitBuilders.createLeadingExitTransition)({
|
|
32
|
+
durationMs: motionRecipe.durationMs,
|
|
33
|
+
easing: motionRecipe.easing,
|
|
34
|
+
leadingGap,
|
|
35
|
+
scale: leadingSwapProgress
|
|
36
|
+
}), [leadingGap, leadingSwapProgress, motionRecipe.durationMs, motionRecipe.easing]);
|
|
37
|
+
if (isLeadingChange) {
|
|
38
|
+
lastLeadingPresenceRef.current = Boolean(leading);
|
|
39
|
+
lastLeadingKeyRef.current = leadingKey;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
elementEnterTransition,
|
|
43
|
+
elementExitTransition,
|
|
44
|
+
isLeadingChange,
|
|
45
|
+
isLeadingSwap
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
exports.useLeadingAnimation = useLeadingAnimation;
|
|
49
|
+
//# sourceMappingURL=use-leading-animation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNativeReanimated","_entryExitBuilders","useLeadingAnimation","leading","leadingKey","leadingGap","motionRecipe","lastLeadingPresenceRef","useRef","Boolean","lastLeadingKeyRef","isLeadingSwap","current","isLeadingChange","leadingSwapProgress","useSharedValue","useLayoutEffect","value","elementEnterTransition","useMemo","createLeadingEnterTransition","durationMs","easing","elementExitTransition","createLeadingExitTransition","scale","exports"],"sourceRoot":"../../../src","sources":["hooks/use-leading-animation.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,kBAAA,GAAAF,OAAA;AAaA;AACO,MAAMG,mBAAmB,GAAGA,CAAC;EAClCC,OAAO;EACPC,UAAU;EACVC,UAAU;EACVC;AACyB,CAAC,KAAK;EAC/B,MAAMC,sBAAsB,GAAG,IAAAC,aAAM,EAACC,OAAO,CAACN,OAAO,CAAC,CAAC;EACvD,MAAMO,iBAAiB,GAAG,IAAAF,aAAM,EAACJ,UAAU,CAAC;EAC5C,MAAMO,aAAa,GACjBF,OAAO,CAACN,OAAO,CAAC,IAChBI,sBAAsB,CAACK,OAAO,IAC9BR,UAAU,KAAKM,iBAAiB,CAACE,OAAO;EAC1C,MAAMC,eAAe,GACnBJ,OAAO,CAACN,OAAO,CAAC,KAAKI,sBAAsB,CAACK,OAAO,IAClDH,OAAO,CAACN,OAAO,CAAC,IAAIC,UAAU,KAAKM,iBAAiB,CAACE,OAAQ;EAChE,MAAME,mBAAmB,GAAG,IAAAC,qCAAc,EAAC,CAAC,CAAC;;EAE7C;EACA,IAAAC,sBAAe,EAAC,MAAM;IACpBF,mBAAmB,CAACG,KAAK,GAAGN,aAAa,GAAG,CAAC,GAAG,CAAC;EACnD,CAAC,EAAE,CAACA,aAAa,EAAEG,mBAAmB,CAAC,CAAC;EAExC,MAAMI,sBAAsB,GAAG,IAAAC,cAAO,EACpC,MACE,IAAAC,+CAA4B,EAAC;IAC3BC,UAAU,EAAEf,YAAY,CAACe,UAAU;IACnCC,MAAM,EAAEhB,YAAY,CAACgB;EACvB,CAAC,CAAC,EACJ,CAAChB,YAAY,CAACe,UAAU,EAAEf,YAAY,CAACgB,MAAM,CAC/C,CAAC;EACD,MAAMC,qBAAqB,GAAG,IAAAJ,cAAO,EACnC,MACE,IAAAK,8CAA2B,EAAC;IAC1BH,UAAU,EAAEf,YAAY,CAACe,UAAU;IACnCC,MAAM,EAAEhB,YAAY,CAACgB,MAAM;IAC3BjB,UAAU;IACVoB,KAAK,EAAEX;EACT,CAAC,CAAC,EACJ,CACET,UAAU,EACVS,mBAAmB,EACnBR,YAAY,CAACe,UAAU,EACvBf,YAAY,CAACgB,MAAM,CAEvB,CAAC;EAED,IAAIT,eAAe,EAAE;IACnBN,sBAAsB,CAACK,OAAO,GAAGH,OAAO,CAACN,OAAO,CAAC;IACjDO,iBAAiB,CAACE,OAAO,GAAGR,UAAU;EACxC;EAEA,OAAO;IACLc,sBAAsB;IACtBK,qBAAqB;IACrBV,eAAe;IACfF;EACF,CAAC;AACH,CAAC;AAACe,OAAA,CAAAxB,mBAAA,GAAAA,mBAAA","ignoreList":[]}
|
|
@@ -9,12 +9,14 @@ var _presetMap = require("../motion/preset-map");
|
|
|
9
9
|
// resolve one motion recipe and one shared stagger unit for a render tree
|
|
10
10
|
const useMorphMotion = ({
|
|
11
11
|
variant,
|
|
12
|
+
numberMode,
|
|
12
13
|
animationPreset,
|
|
13
14
|
animationDuration,
|
|
14
15
|
stagger
|
|
15
16
|
}) => {
|
|
17
|
+
const isTicker = variant === "number" && numberMode === "ticker";
|
|
16
18
|
// numeric variants need a quicker default because their lanes update often
|
|
17
|
-
const resolvedPreset = animationPreset ?? (variant === "text" ? "default" : "snappy");
|
|
19
|
+
const resolvedPreset = animationPreset ?? (isTicker ? "ticker" : variant === "text" ? "default" : "snappy");
|
|
18
20
|
const motionRecipe = (0, _react.useMemo)(() => (0, _presetMap.resolveMotionRecipe)(resolvedPreset, animationDuration), [animationDuration, resolvedPreset]);
|
|
19
21
|
return {
|
|
20
22
|
motionRecipe,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_presetMap","useMorphMotion","variant","animationPreset","animationDuration","stagger","resolvedPreset","motionRecipe","useMemo","resolveMotionRecipe","staggerMs","Math","round","exports"],"sourceRoot":"../../../src","sources":["hooks/use-morph-motion.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;
|
|
1
|
+
{"version":3,"names":["_react","require","_presetMap","useMorphMotion","variant","numberMode","animationPreset","animationDuration","stagger","isTicker","resolvedPreset","motionRecipe","useMemo","resolveMotionRecipe","staggerMs","Math","round","exports"],"sourceRoot":"../../../src","sources":["hooks/use-morph-motion.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,UAAA,GAAAD,OAAA;AAqBA;AACO,MAAME,cAAc,GAAGA,CAAC;EAC7BC,OAAO;EACPC,UAAU;EACVC,eAAe;EACfC,iBAAiB;EACjBC;AACM,CAAC,KAAkB;EACzB,MAAMC,QAAQ,GAAGL,OAAO,KAAK,QAAQ,IAAIC,UAAU,KAAK,QAAQ;EAChE;EACA,MAAMK,cAAc,GAClBJ,eAAe,KACdG,QAAQ,GACL,QAAQ,GACRL,OAAO,KAAK,MAAM,GAChB,SAAS,GACT,QAAQ,CAAC;EAEjB,MAAMO,YAAY,GAAG,IAAAC,cAAO,EAC1B,MAAM,IAAAC,8BAAmB,EAACH,cAAc,EAAEH,iBAAiB,CAAC,EAC5D,CAACA,iBAAiB,EAAEG,cAAc,CACpC,CAAC;EAED,OAAO;IACLC,YAAY;IACZG,SAAS,EAAEC,IAAI,CAACC,KAAK,CAACR,OAAO,GAAG,IAAI;EACtC,CAAC;AACH,CAAC;AAACS,OAAA,CAAAd,cAAA,GAAAA,cAAA","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -13,6 +13,7 @@ var _displayUnits = require("./model/display-units");
|
|
|
13
13
|
var _morphViewport = require("./view/morph-viewport");
|
|
14
14
|
var _numberRun = require("./view/number-run");
|
|
15
15
|
var _slotsRun = require("./view/slots-run");
|
|
16
|
+
var _tickerRun = require("./view/ticker-run");
|
|
16
17
|
var _textRun = require("./view/text-run");
|
|
17
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
19
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -27,12 +28,14 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
27
28
|
leading,
|
|
28
29
|
leadingKey,
|
|
29
30
|
leadingGap = 0,
|
|
31
|
+
numberMode = "morph",
|
|
32
|
+
shadow = false,
|
|
30
33
|
style,
|
|
31
34
|
containerStyle,
|
|
32
35
|
fontStyle,
|
|
33
36
|
animationDuration,
|
|
34
37
|
animationPreset,
|
|
35
|
-
stagger
|
|
38
|
+
stagger,
|
|
36
39
|
autoSize = true,
|
|
37
40
|
clipToBounds = false
|
|
38
41
|
}) {
|
|
@@ -41,14 +44,17 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
41
44
|
const leadingMap = isLeadingMap(leading) ? leading : undefined;
|
|
42
45
|
const resolvedLeading = leadingMap ? leadingMap[resolvedValue] : leading;
|
|
43
46
|
const resolvedLeadingKey = leadingMap ? resolvedValue : leadingKey;
|
|
47
|
+
const resolvedStagger = stagger ?? (variant === "number" && numberMode === "ticker" ? 0 : 0.02);
|
|
48
|
+
const useLayoutAutoSize = autoSize && variant === "number" && numberMode === "ticker";
|
|
44
49
|
const {
|
|
45
50
|
motionRecipe,
|
|
46
51
|
staggerMs
|
|
47
52
|
} = (0, _useMorphMotion.useMorphMotion)({
|
|
48
53
|
variant,
|
|
54
|
+
numberMode,
|
|
49
55
|
animationPreset,
|
|
50
56
|
animationDuration,
|
|
51
|
-
stagger
|
|
57
|
+
stagger: resolvedStagger
|
|
52
58
|
});
|
|
53
59
|
const {
|
|
54
60
|
textStyle
|
|
@@ -62,7 +68,7 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
62
68
|
// invalidate the probe when text style, leading content, or leading spacing changes
|
|
63
69
|
const measurementKey = _react.default.useMemo(() => {
|
|
64
70
|
const flattenedStyle = _reactNative.StyleSheet.flatten(textStyle);
|
|
65
|
-
return JSON.stringify([resolvedValue, flattenedStyle?.fontFamily, flattenedStyle?.fontSize, flattenedStyle?.fontStyle, flattenedStyle?.fontWeight, flattenedStyle?.fontVariant, flattenedStyle?.letterSpacing, flattenedStyle?.lineHeight, flattenedStyle?.textTransform,
|
|
71
|
+
return JSON.stringify([resolvedValue, flattenedStyle?.fontFamily, flattenedStyle?.fontSize, flattenedStyle?.fontStyle, flattenedStyle?.fontWeight, flattenedStyle?.fontVariant, flattenedStyle?.letterSpacing, flattenedStyle?.lineHeight, flattenedStyle?.textTransform, Boolean(resolvedLeading), resolvedLeadingKey, leadingGap]);
|
|
66
72
|
}, [leadingGap, resolvedLeading, resolvedLeadingKey, resolvedValue, textStyle, variant]);
|
|
67
73
|
const {
|
|
68
74
|
captureLayout,
|
|
@@ -88,6 +94,7 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
88
94
|
align: align,
|
|
89
95
|
containerStyle: containerStyle,
|
|
90
96
|
animatedWidthStyle: animatedWidthStyle,
|
|
97
|
+
autoSizeLayoutTransition: useLayoutAutoSize ? motionRecipe.layoutTransition : undefined,
|
|
91
98
|
onVisibleLayout: autoSize ? captureVisibleLayout : undefined,
|
|
92
99
|
measurement: shouldMeasure ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
93
100
|
onLayout: captureLayout,
|
|
@@ -95,7 +102,7 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
95
102
|
flexDirection: "row",
|
|
96
103
|
alignSelf: "flex-start"
|
|
97
104
|
},
|
|
98
|
-
children: [
|
|
105
|
+
children: [resolvedLeading ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
99
106
|
style: {
|
|
100
107
|
alignItems: "center",
|
|
101
108
|
justifyContent: "center",
|
|
@@ -114,7 +121,25 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
114
121
|
fontSize: fontSize,
|
|
115
122
|
textStyle: textStyle,
|
|
116
123
|
staggerMs: staggerMs,
|
|
117
|
-
className: className
|
|
124
|
+
className: className,
|
|
125
|
+
leading: resolvedLeading,
|
|
126
|
+
leadingKey: resolvedLeadingKey,
|
|
127
|
+
leadingGap: leadingGap,
|
|
128
|
+
ready: !autoSize || isAutoSizeReady,
|
|
129
|
+
shadow: shadow
|
|
130
|
+
}) : variant === "number" && numberMode === "ticker" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_tickerRun.TickerRun, {
|
|
131
|
+
value: resolvedValue,
|
|
132
|
+
motionRecipe: motionRecipe,
|
|
133
|
+
align: align,
|
|
134
|
+
fontSize: fontSize,
|
|
135
|
+
textStyle: textStyle,
|
|
136
|
+
staggerMs: staggerMs,
|
|
137
|
+
className: className,
|
|
138
|
+
leading: resolvedLeading,
|
|
139
|
+
leadingKey: resolvedLeadingKey,
|
|
140
|
+
leadingGap: leadingGap,
|
|
141
|
+
ready: !autoSize || isAutoSizeReady,
|
|
142
|
+
shadow: shadow
|
|
118
143
|
}) : variant === "number" ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_numberRun.NumberRun, {
|
|
119
144
|
value: resolvedValue,
|
|
120
145
|
motionRecipe: motionRecipe,
|
|
@@ -122,7 +147,11 @@ const Laminar = exports.Laminar = /*#__PURE__*/_react.default.memo(function Lami
|
|
|
122
147
|
fontSize: fontSize,
|
|
123
148
|
textStyle: textStyle,
|
|
124
149
|
staggerMs: staggerMs,
|
|
125
|
-
className: className
|
|
150
|
+
className: className,
|
|
151
|
+
leading: resolvedLeading,
|
|
152
|
+
leadingKey: resolvedLeadingKey,
|
|
153
|
+
leadingGap: leadingGap,
|
|
154
|
+
ready: !autoSize || isAutoSizeReady
|
|
126
155
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_textRun.TextRun, {
|
|
127
156
|
value: resolvedValue,
|
|
128
157
|
motionRecipe: motionRecipe,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_useInlineAutoWidth","_useMorphMotion","_useMorphTextStyle","_displayUnits","_morphViewport","_numberRun","_slotsRun","_textRun","_jsxRuntime","e","__esModule","default","Laminar","exports","React","memo","text","variant","fontSize","color","align","className","leading","leadingKey","leadingGap","style","containerStyle","fontStyle","animationDuration","animationPreset","stagger","autoSize","clipToBounds","resolvedValue","String","leadingMap","isLeadingMap","undefined","resolvedLeading","resolvedLeadingKey","motionRecipe","staggerMs","useMorphMotion","textStyle","useMorphTextStyle","measurementKey","useMemo","flattenedStyle","StyleSheet","flatten","JSON","stringify","fontFamily","fontWeight","fontVariant","letterSpacing","lineHeight","textTransform","Boolean","captureLayout","captureVisibleLayout","animatedWidthStyle","isReady","isAutoSizeReady","shouldMeasure","useInlineAutoWidth","enabled","driveToWidth","driveNumber","measuredValue","splitDisplayUnits","map","normalizeDisplayUnit","join","jsx","MorphViewport","onVisibleLayout","measurement","jsxs","View","onLayout","flexDirection","alignSelf","children","alignItems","justifyContent","marginRight","unit","index","Text","SlotsRun","value","NumberRun","TextRun","leadingLayoutGroup","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNative","_useInlineAutoWidth","_useMorphMotion","_useMorphTextStyle","_displayUnits","_morphViewport","_numberRun","_slotsRun","_tickerRun","_textRun","_jsxRuntime","e","__esModule","default","Laminar","exports","React","memo","text","variant","fontSize","color","align","className","leading","leadingKey","leadingGap","numberMode","shadow","style","containerStyle","fontStyle","animationDuration","animationPreset","stagger","autoSize","clipToBounds","resolvedValue","String","leadingMap","isLeadingMap","undefined","resolvedLeading","resolvedLeadingKey","resolvedStagger","useLayoutAutoSize","motionRecipe","staggerMs","useMorphMotion","textStyle","useMorphTextStyle","measurementKey","useMemo","flattenedStyle","StyleSheet","flatten","JSON","stringify","fontFamily","fontWeight","fontVariant","letterSpacing","lineHeight","textTransform","Boolean","captureLayout","captureVisibleLayout","animatedWidthStyle","isReady","isAutoSizeReady","shouldMeasure","useInlineAutoWidth","enabled","driveToWidth","driveNumber","measuredValue","splitDisplayUnits","map","normalizeDisplayUnit","join","jsx","MorphViewport","autoSizeLayoutTransition","layoutTransition","onVisibleLayout","measurement","jsxs","View","onLayout","flexDirection","alignSelf","children","alignItems","justifyContent","marginRight","unit","index","Text","SlotsRun","value","ready","TickerRun","NumberRun","TextRun","leadingLayoutGroup","isValidElement","Array","isArray"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -7,6 +7,7 @@ exports.resolveMotionRecipe = exports.MOTION_PRESETS = void 0;
|
|
|
7
7
|
var _reactNativeReanimated = require("react-native-reanimated");
|
|
8
8
|
// keep all presets on one curve family so layout and glyph motion agree
|
|
9
9
|
const DEFAULT_CURVE = [0.19, 1, 0.22, 1];
|
|
10
|
+
const TICKER_CURVE = [0.33, 1, 0.68, 1];
|
|
10
11
|
const MOTION_PRESETS = exports.MOTION_PRESETS = {
|
|
11
12
|
default: {
|
|
12
13
|
duration: 0.38,
|
|
@@ -26,6 +27,10 @@ const MOTION_PRESETS = exports.MOTION_PRESETS = {
|
|
|
26
27
|
type: "spring",
|
|
27
28
|
duration: 0.5,
|
|
28
29
|
bounce: 0.3
|
|
30
|
+
},
|
|
31
|
+
ticker: {
|
|
32
|
+
duration: 0.3,
|
|
33
|
+
ease: TICKER_CURVE
|
|
29
34
|
}
|
|
30
35
|
};
|
|
31
36
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeReanimated","require","DEFAULT_CURVE","MOTION_PRESETS","exports","default","duration","ease","smooth","type","bounce","snappy","bouncy","toMilliseconds","seconds","Math","round","toDampingRatio","max","min","createOpacityTransition","fromOpacity","toOpacity","durationMs","easing","initialValues","opacity","animations","withTiming","resolveMotionRecipe","presetName","durationOverride","preset","dampingRatio","Easing","bezier","layoutTransition","LinearTransition","factory","enterTransition","exitTransition","driveNumber","toValue","delayMs","animation","withSpring","overshootClamping","withDelay","timingPreset","x1","y1","x2","y2"],"sourceRoot":"../../../src","sources":["motion/preset-map.ts"],"mappings":";;;;;;AAAA,IAAAA,sBAAA,GAAAC,OAAA;AAeA;AACA,MAAMC,aAAa,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAU;
|
|
1
|
+
{"version":3,"names":["_reactNativeReanimated","require","DEFAULT_CURVE","TICKER_CURVE","MOTION_PRESETS","exports","default","duration","ease","smooth","type","bounce","snappy","bouncy","ticker","toMilliseconds","seconds","Math","round","toDampingRatio","max","min","createOpacityTransition","fromOpacity","toOpacity","durationMs","easing","initialValues","opacity","animations","withTiming","resolveMotionRecipe","presetName","durationOverride","preset","dampingRatio","Easing","bezier","layoutTransition","LinearTransition","factory","enterTransition","exitTransition","driveNumber","toValue","delayMs","animation","withSpring","overshootClamping","withDelay","timingPreset","x1","y1","x2","y2"],"sourceRoot":"../../../src","sources":["motion/preset-map.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.LeadingElement = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _reactNativeReanimated = _interopRequireDefault(require("react-native-reanimated"));
|
|
9
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
// render an inline element independently so it can enter, exit, and swap beside any run
|
|
12
|
+
const LeadingElement = exports.LeadingElement = /*#__PURE__*/_react.default.memo(function LeadingElement({
|
|
13
|
+
leading,
|
|
14
|
+
leadingKey,
|
|
15
|
+
leadingGap,
|
|
16
|
+
enterTransition,
|
|
17
|
+
elementEnterTransition,
|
|
18
|
+
exitTransition,
|
|
19
|
+
elementExitTransition
|
|
20
|
+
}) {
|
|
21
|
+
if (!leading) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
|
|
25
|
+
entering: elementEnterTransition ?? enterTransition,
|
|
26
|
+
exiting: elementExitTransition ?? exitTransition,
|
|
27
|
+
style: [{
|
|
28
|
+
alignItems: "center",
|
|
29
|
+
justifyContent: "center"
|
|
30
|
+
}, leadingGap > 0 ? {
|
|
31
|
+
marginRight: leadingGap
|
|
32
|
+
} : undefined],
|
|
33
|
+
children: leading
|
|
34
|
+
}, `leading:${String(leadingKey ?? "default")}`);
|
|
35
|
+
});
|
|
36
|
+
LeadingElement.displayName = "LeadingElement";
|
|
37
|
+
//# sourceMappingURL=leading-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireDefault","require","_reactNativeReanimated","_jsxRuntime","e","__esModule","default","LeadingElement","exports","React","memo","leading","leadingKey","leadingGap","enterTransition","elementEnterTransition","exitTransition","elementExitTransition","jsx","View","entering","exiting","style","alignItems","justifyContent","marginRight","undefined","children","String","displayName"],"sourceRoot":"../../../src","sources":["view/leading-element.tsx"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAEiC,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAYjC;AACO,MAAMG,cAAc,GAAAC,OAAA,CAAAD,cAAA,gBAAGE,cAAK,CAACC,IAAI,CAAC,SAASH,cAAcA,CAAC;EAC/DI,OAAO;EACPC,UAAU;EACVC,UAAU;EACVC,eAAe;EACfC,sBAAsB;EACtBC,cAAc;EACdC;AACmB,CAAC,EAAE;EACtB,IAAI,CAACN,OAAO,EAAE;IACZ,OAAO,IAAI;EACb;EAEA,oBACE,IAAAR,WAAA,CAAAe,GAAA,EAAChB,sBAAA,CAAAI,OAAQ,CAACa,IAAI;IAEZC,QAAQ,EAAEL,sBAAsB,IAAID,eAAgB;IACpDO,OAAO,EAAEJ,qBAAqB,IAAID,cAAe;IACjDM,KAAK,EAAE,CACL;MAAEC,UAAU,EAAE,QAAQ;MAAEC,cAAc,EAAE;IAAS,CAAC,EAClDX,UAAU,GAAG,CAAC,GAAG;MAAEY,WAAW,EAAEZ;IAAW,CAAC,GAAGa,SAAS,CACxD;IAAAC,QAAA,EAEDhB;EAAO,GARH,WAAWiB,MAAM,CAAChB,UAAU,IAAI,SAAS,CAAC,EASlC,CAAC;AAEpB,CAAC,CAAC;AAEFL,cAAc,CAACsB,WAAW,GAAG,gBAAgB","ignoreList":[]}
|
|
@@ -63,14 +63,40 @@ const MorphViewport = exports.MorphViewport = /*#__PURE__*/_react.default.memo((
|
|
|
63
63
|
align,
|
|
64
64
|
containerStyle,
|
|
65
65
|
animatedWidthStyle,
|
|
66
|
+
autoSizeLayoutTransition,
|
|
66
67
|
onVisibleLayout,
|
|
67
68
|
measurement,
|
|
68
69
|
children
|
|
69
70
|
}) => {
|
|
71
|
+
const hasRenderedRef = (0, _react.useRef)(false);
|
|
72
|
+
const shouldAnimateAutoSizeLayout = autoSizeLayoutTransition !== undefined && hasRenderedRef.current;
|
|
73
|
+
hasRenderedRef.current = true;
|
|
74
|
+
|
|
70
75
|
// compute alignment once so the animated shell and its child share one layout contract
|
|
71
76
|
const resolvedViewportStyle = (0, _react.useMemo)(() => [viewportStyle, viewportAlignStyles[align], clipToBounds ? clippedViewportStyle : unclippedViewportStyle], [align, clipToBounds]);
|
|
72
77
|
|
|
73
78
|
// keep measurement outside the visible viewport so it cannot affect accessibility or layout
|
|
79
|
+
if (autoSizeLayoutTransition) {
|
|
80
|
+
// Layout animation owns both width and the shell's aligned x-position.
|
|
81
|
+
// This is important for center/right auto-size: animating only a child
|
|
82
|
+
// width leaves the parent anchor at its old position.
|
|
83
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNativeReanimated.default.View, {
|
|
84
|
+
layout: shouldAnimateAutoSizeLayout ? autoSizeLayoutTransition : undefined,
|
|
85
|
+
style: [shellStyle, shellAlignStyles[align], containerStyle],
|
|
86
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
87
|
+
accessibilityElementsHidden: true,
|
|
88
|
+
collapsable: false,
|
|
89
|
+
importantForAccessibility: "no-hide-descendants",
|
|
90
|
+
pointerEvents: "none",
|
|
91
|
+
style: measuredContentStyle,
|
|
92
|
+
children: measurement
|
|
93
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
|
|
94
|
+
onLayout: onVisibleLayout,
|
|
95
|
+
style: resolvedViewportStyle,
|
|
96
|
+
children: children
|
|
97
|
+
})]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
74
100
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNative.View, {
|
|
75
101
|
style: [shellStyle, shellAlignStyles[align], containerStyle],
|
|
76
102
|
children: autoSize ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_interopRequireDefault","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","shellStyle","position","alignSelf","viewportStyle","measuredContentStyle","left","top","opacity","flexShrink","clippedViewportStyle","overflow","unclippedViewportStyle","fullWidthViewportStyle","width","shellAlignStyles","center","right","viewportAlignStyles","alignItems","MorphViewport","exports","React","memo","autoSize","clipToBounds","align","containerStyle","animatedWidthStyle","onVisibleLayout","measurement","children","resolvedViewportStyle","useMemo","
|
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_reactNative","_reactNativeReanimated","_interopRequireDefault","_jsxRuntime","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","shellStyle","position","alignSelf","viewportStyle","measuredContentStyle","left","top","opacity","flexShrink","clippedViewportStyle","overflow","unclippedViewportStyle","fullWidthViewportStyle","width","shellAlignStyles","center","right","viewportAlignStyles","alignItems","MorphViewport","exports","React","memo","autoSize","clipToBounds","align","containerStyle","animatedWidthStyle","autoSizeLayoutTransition","onVisibleLayout","measurement","children","hasRenderedRef","useRef","shouldAnimateAutoSizeLayout","undefined","current","resolvedViewportStyle","useMemo","jsxs","View","layout","style","jsx","accessibilityElementsHidden","collapsable","importantForAccessibility","pointerEvents","onLayout","Fragment","displayName"],"sourceRoot":"../../../src","sources":["view/morph-viewport.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -6,9 +6,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.NumberRun = void 0;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
8
|
var _reactNative = require("react-native");
|
|
9
|
+
var _reactNativeReanimated = _interopRequireDefault(require("react-native-reanimated"));
|
|
10
|
+
var _useLeadingAnimation = require("../hooks/use-leading-animation");
|
|
9
11
|
var _useNumericLanes = require("../hooks/use-numeric-lanes");
|
|
12
|
+
var _leadingElement = require("./leading-element");
|
|
10
13
|
var _numberLane = require("./number-lane");
|
|
11
14
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
15
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
16
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
13
17
|
const rowStyle = {
|
|
14
18
|
flexDirection: "row",
|
|
@@ -34,45 +38,89 @@ const NumberRun = exports.NumberRun = /*#__PURE__*/_react.default.memo(({
|
|
|
34
38
|
fontSize,
|
|
35
39
|
textStyle,
|
|
36
40
|
staggerMs,
|
|
37
|
-
className
|
|
41
|
+
className,
|
|
42
|
+
leading,
|
|
43
|
+
leadingKey,
|
|
44
|
+
leadingGap = 0,
|
|
45
|
+
ready = true
|
|
38
46
|
}) => {
|
|
47
|
+
const hasDisplayedRef = (0, _react.useRef)(false);
|
|
48
|
+
const displayedValueRef = (0, _react.useRef)(value);
|
|
49
|
+
const displayedLeadingRef = (0, _react.useRef)(leading);
|
|
50
|
+
const displayedLeadingKeyRef = (0, _react.useRef)(leadingKey);
|
|
51
|
+
const displayedLeadingGapRef = (0, _react.useRef)(leadingGap);
|
|
52
|
+
const shouldDisplayTarget = ready || !hasDisplayedRef.current;
|
|
53
|
+
const visibleValue = shouldDisplayTarget ? value : displayedValueRef.current;
|
|
54
|
+
const visibleLeading = shouldDisplayTarget ? leading : displayedLeadingRef.current;
|
|
55
|
+
const visibleLeadingKey = shouldDisplayTarget ? leadingKey : displayedLeadingKeyRef.current;
|
|
56
|
+
const visibleLeadingGap = shouldDisplayTarget ? leadingGap : displayedLeadingGapRef.current;
|
|
57
|
+
if (shouldDisplayTarget) {
|
|
58
|
+
hasDisplayedRef.current = true;
|
|
59
|
+
displayedValueRef.current = value;
|
|
60
|
+
displayedLeadingRef.current = leading;
|
|
61
|
+
displayedLeadingKeyRef.current = leadingKey;
|
|
62
|
+
displayedLeadingGapRef.current = leadingGap;
|
|
63
|
+
}
|
|
64
|
+
const {
|
|
65
|
+
elementEnterTransition,
|
|
66
|
+
elementExitTransition,
|
|
67
|
+
isLeadingChange,
|
|
68
|
+
isLeadingSwap
|
|
69
|
+
} = (0, _useLeadingAnimation.useLeadingAnimation)({
|
|
70
|
+
leading: visibleLeading,
|
|
71
|
+
leadingKey: visibleLeadingKey,
|
|
72
|
+
leadingGap: visibleLeadingGap,
|
|
73
|
+
motionRecipe
|
|
74
|
+
});
|
|
39
75
|
// the hook owns lane identity while this component owns row placement and timing
|
|
40
76
|
const {
|
|
41
77
|
units,
|
|
42
78
|
laneKeys,
|
|
43
79
|
direction,
|
|
44
80
|
leadLength
|
|
45
|
-
} = (0, _useNumericLanes.useNumericLanes)(
|
|
46
|
-
const lastValueRef = (0, _react.useRef)(
|
|
81
|
+
} = (0, _useNumericLanes.useNumericLanes)(visibleValue);
|
|
82
|
+
const lastValueRef = (0, _react.useRef)(visibleValue);
|
|
47
83
|
const hasAnimatedRef = (0, _react.useRef)(false);
|
|
48
84
|
|
|
49
85
|
// skip enter animations on first paint so the number feels settled
|
|
50
|
-
if (
|
|
86
|
+
if (visibleValue !== lastValueRef.current || isLeadingChange) {
|
|
51
87
|
hasAnimatedRef.current = true;
|
|
52
|
-
lastValueRef.current =
|
|
88
|
+
lastValueRef.current = visibleValue;
|
|
53
89
|
}
|
|
54
90
|
|
|
55
91
|
// scale travel from the font while keeping a minimum visible movement
|
|
56
92
|
const travelDistance = (0, _react.useMemo)(() => Math.max(8, Math.round((fontSize ?? 16) * 0.4)), [fontSize]);
|
|
57
93
|
const hasAnimated = hasAnimatedRef.current;
|
|
58
|
-
return /*#__PURE__*/(0, _jsxRuntime.
|
|
94
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactNative.View, {
|
|
59
95
|
style: [rowStyle, rowAlignStyles[align]],
|
|
60
|
-
children:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
96
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_leadingElement.LeadingElement, {
|
|
97
|
+
leading: visibleLeading,
|
|
98
|
+
leadingKey: visibleLeadingKey,
|
|
99
|
+
leadingGap: visibleLeadingGap,
|
|
100
|
+
enterTransition: hasAnimated ? motionRecipe.enterTransition : undefined,
|
|
101
|
+
elementEnterTransition: isLeadingSwap ? elementEnterTransition : undefined,
|
|
102
|
+
exitTransition: motionRecipe.exitTransition,
|
|
103
|
+
elementExitTransition: elementExitTransition
|
|
104
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactNativeReanimated.default.View, {
|
|
105
|
+
layout: isLeadingChange ? motionRecipe.layoutTransition : undefined,
|
|
106
|
+
style: rowStyle,
|
|
107
|
+
children: units.map((unit, index) => {
|
|
108
|
+
const inLead = index < leadLength;
|
|
109
|
+
const laneKey = inLead ? `lead:${index}` : `lane:${units.length - 1 - index}`;
|
|
110
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_numberLane.NumberLane, {
|
|
111
|
+
unit: unit,
|
|
112
|
+
tokenKey: laneKeys[index],
|
|
113
|
+
isLead: inLead,
|
|
114
|
+
hasAnimated: hasAnimated,
|
|
115
|
+
delayMs: index * staggerMs,
|
|
116
|
+
direction: direction,
|
|
117
|
+
travelDistance: travelDistance,
|
|
118
|
+
motionRecipe: motionRecipe,
|
|
119
|
+
textStyle: textStyle,
|
|
120
|
+
className: className
|
|
121
|
+
}, laneKey);
|
|
122
|
+
})
|
|
123
|
+
})]
|
|
76
124
|
});
|
|
77
125
|
});
|
|
78
126
|
NumberRun.displayName = "NumberRun";
|