react-native-laminar 1.4.2 → 1.4.3

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 (35) hide show
  1. package/lib/commonjs/hooks/use-inline-auto-width.js +105 -18
  2. package/lib/commonjs/hooks/use-inline-auto-width.js.map +1 -1
  3. package/lib/commonjs/index.js +5 -1
  4. package/lib/commonjs/index.js.map +1 -1
  5. package/lib/commonjs/view/morph-viewport.js +2 -0
  6. package/lib/commonjs/view/morph-viewport.js.map +1 -1
  7. package/lib/commonjs/view/text-run.js +30 -12
  8. package/lib/commonjs/view/text-run.js.map +1 -1
  9. package/lib/module/hooks/use-inline-auto-width.js +106 -19
  10. package/lib/module/hooks/use-inline-auto-width.js.map +1 -1
  11. package/lib/module/index.js +5 -1
  12. package/lib/module/index.js.map +1 -1
  13. package/lib/module/view/morph-viewport.js +2 -0
  14. package/lib/module/view/morph-viewport.js.map +1 -1
  15. package/lib/module/view/text-run.js +30 -12
  16. package/lib/module/view/text-run.js.map +1 -1
  17. package/lib/typescript/commonjs/hooks/use-inline-auto-width.d.ts +2 -0
  18. package/lib/typescript/commonjs/hooks/use-inline-auto-width.d.ts.map +1 -1
  19. package/lib/typescript/commonjs/index.d.ts.map +1 -1
  20. package/lib/typescript/commonjs/view/morph-viewport.d.ts +3 -2
  21. package/lib/typescript/commonjs/view/morph-viewport.d.ts.map +1 -1
  22. package/lib/typescript/commonjs/view/text-run.d.ts +2 -1
  23. package/lib/typescript/commonjs/view/text-run.d.ts.map +1 -1
  24. package/lib/typescript/module/hooks/use-inline-auto-width.d.ts +2 -0
  25. package/lib/typescript/module/hooks/use-inline-auto-width.d.ts.map +1 -1
  26. package/lib/typescript/module/index.d.ts.map +1 -1
  27. package/lib/typescript/module/view/morph-viewport.d.ts +3 -2
  28. package/lib/typescript/module/view/morph-viewport.d.ts.map +1 -1
  29. package/lib/typescript/module/view/text-run.d.ts +2 -1
  30. package/lib/typescript/module/view/text-run.d.ts.map +1 -1
  31. package/package.json +1 -1
  32. package/src/hooks/use-inline-auto-width.ts +160 -18
  33. package/src/index.tsx +10 -1
  34. package/src/view/morph-viewport.tsx +7 -2
  35. package/src/view/text-run.tsx +49 -15
@@ -62,7 +62,9 @@ export const Laminar = /*#__PURE__*/React.memo(function Laminar({
62
62
  }, [leadingGap, resolvedLeading, resolvedLeadingKey, resolvedValue, textStyle, variant]);
63
63
  const {
64
64
  captureLayout,
65
+ captureVisibleLayout,
65
66
  animatedWidthStyle,
67
+ isReady: isAutoSizeReady,
66
68
  shouldMeasure
67
69
  } = useInlineAutoWidth({
68
70
  enabled: autoSize,
@@ -82,6 +84,7 @@ export const Laminar = /*#__PURE__*/React.memo(function Laminar({
82
84
  align: align,
83
85
  containerStyle: containerStyle,
84
86
  animatedWidthStyle: animatedWidthStyle,
87
+ onVisibleLayout: autoSize ? captureVisibleLayout : undefined,
85
88
  measurement: shouldMeasure ? /*#__PURE__*/_jsxs(View, {
86
89
  onLayout: captureLayout,
87
90
  style: {
@@ -99,7 +102,7 @@ export const Laminar = /*#__PURE__*/React.memo(function Laminar({
99
102
  style: textStyle,
100
103
  children: normalizeDisplayUnit(unit)
101
104
  }, `${unit}-${index}`))]
102
- }) : undefined,
105
+ }, measurementKey) : undefined,
103
106
  children: variant === "slots" ? /*#__PURE__*/_jsx(SlotsRun, {
104
107
  value: resolvedValue,
105
108
  motionRecipe: motionRecipe,
@@ -123,6 +126,7 @@ export const Laminar = /*#__PURE__*/React.memo(function Laminar({
123
126
  leading: resolvedLeading,
124
127
  leadingKey: resolvedLeadingKey,
125
128
  leadingGap: leadingGap,
129
+ ready: !autoSize || isAutoSizeReady,
126
130
  textStyle: textStyle,
127
131
  className: className
128
132
  })
@@ -1 +1 @@
1
- {"version":3,"names":["React","StyleSheet","Text","View","useInlineAutoWidth","useMorphMotion","useMorphTextStyle","normalizeDisplayUnit","splitDisplayUnits","MorphViewport","NumberRun","SlotsRun","TextRun","jsx","_jsx","jsxs","_jsxs","Laminar","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","textStyle","measurementKey","useMemo","flattenedStyle","flatten","JSON","stringify","fontFamily","fontWeight","fontVariant","letterSpacing","lineHeight","textTransform","Boolean","captureLayout","animatedWidthStyle","shouldMeasure","enabled","driveToWidth","driveNumber","measuredValue","map","join","measurement","onLayout","flexDirection","alignSelf","children","alignItems","justifyContent","marginRight","unit","index","value","isValidElement","Array","isArray"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","StyleSheet","Text","View","useInlineAutoWidth","useMorphMotion","useMorphTextStyle","normalizeDisplayUnit","splitDisplayUnits","MorphViewport","NumberRun","SlotsRun","TextRun","jsx","_jsx","jsxs","_jsxs","Laminar","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","textStyle","measurementKey","useMemo","flattenedStyle","flatten","JSON","stringify","fontFamily","fontWeight","fontVariant","letterSpacing","lineHeight","textTransform","Boolean","captureLayout","captureVisibleLayout","animatedWidthStyle","isReady","isAutoSizeReady","shouldMeasure","enabled","driveToWidth","driveNumber","measuredValue","map","join","onVisibleLayout","measurement","onLayout","flexDirection","alignSelf","children","alignItems","justifyContent","marginRight","unit","index","value","ready","isValidElement","Array","isArray"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":"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","ignoreList":[]}
@@ -57,6 +57,7 @@ export const MorphViewport = /*#__PURE__*/React.memo(({
57
57
  align,
58
58
  containerStyle,
59
59
  animatedWidthStyle,
60
+ onVisibleLayout,
60
61
  measurement,
61
62
  children
62
63
  }) => {
@@ -75,6 +76,7 @@ export const MorphViewport = /*#__PURE__*/React.memo(({
75
76
  style: measuredContentStyle,
76
77
  children: measurement
77
78
  }), /*#__PURE__*/_jsx(Animated.View, {
79
+ onLayout: onVisibleLayout,
78
80
  style: [resolvedViewportStyle, animatedWidthStyle],
79
81
  children: children
80
82
  })]
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","View","Animated","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","shellStyle","position","alignSelf","viewportStyle","measuredContentStyle","left","top","opacity","flexShrink","clippedViewportStyle","overflow","unclippedViewportStyle","fullWidthViewportStyle","width","shellAlignStyles","center","right","viewportAlignStyles","alignItems","MorphViewport","memo","autoSize","clipToBounds","align","containerStyle","animatedWidthStyle","measurement","children","resolvedViewportStyle","style","accessibilityElementsHidden","collapsable","importantForAccessibility","pointerEvents","displayName"],"sourceRoot":"../../../src","sources":["view/morph-viewport.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AAEtC,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,QAAQ,MAAM,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAG/C,MAAMC,UAAU,GAAG;EACjBC,QAAQ,EAAE,UAAU;EACpBC,SAAS,EAAE;AACb,CAAU;AAEV,MAAMC,aAAa,GAAG;EACpBD,SAAS,EAAE;AACb,CAAU;AAEV,MAAME,oBAA+B,GAAG;EACtCH,QAAQ,EAAE,UAAU;EACpBI,IAAI,EAAE,CAAC;EACPC,GAAG,EAAE,CAAC;EACNC,OAAO,EAAE,CAAC;EACVL,SAAS,EAAE,YAAY;EACvBM,UAAU,EAAE;AACd,CAAC;AAED,MAAMC,oBAA+B,GAAG;EACtCC,QAAQ,EAAE;AACZ,CAAC;AAED,MAAMC,sBAAiC,GAAG;EACxCD,QAAQ,EAAE;AACZ,CAAC;AAED,MAAME,sBAAiC,GAAG;EACxCC,KAAK,EAAE;AACT,CAAC;AAED,MAAMC,gBAAiD,GAAG;EACxDT,IAAI,EAAE;IAAEH,SAAS,EAAE;EAAa,CAAC;EACjCa,MAAM,EAAE;IAAEb,SAAS,EAAE;EAAS,CAAC;EAC/Bc,KAAK,EAAE;IAAEd,SAAS,EAAE;EAAW;AACjC,CAAC;AAED,MAAMe,mBAAoD,GAAG;EAC3DZ,IAAI,EAAE;IAAEa,UAAU,EAAE;EAAa,CAAC;EAClCH,MAAM,EAAE;IAAEG,UAAU,EAAE;EAAS,CAAC;EAChCF,KAAK,EAAE;IAAEE,UAAU,EAAE;EAAW;AAClC,CAAC;AAYD;AACA,OAAO,MAAMC,aAAa,gBAAG7B,KAAK,CAAC8B,IAAI,CACrC,CAAC;EACCC,QAAQ;EACRC,YAAY;EACZC,KAAK;EACLC,cAAc;EACdC,kBAAkB;EAClBC,WAAW;EACXC;AACkB,CAAC,KAAK;EACxB;EACA,MAAMC,qBAAqB,GAAGrC,OAAO,CACnC,MAAM,CACJY,aAAa,EACbc,mBAAmB,CAACM,KAAK,CAAC,EAC1BD,YAAY,GAAGb,oBAAoB,GAAGE,sBAAsB,CAC7D,EACD,CAACY,KAAK,EAAED,YAAY,CACtB,CAAC;;EAED;EACA,oBACE3B,IAAA,CAACH,IAAI;IAACqC,KAAK,EAAE,CAAC7B,UAAU,EAAEc,gBAAgB,CAACS,KAAK,CAAC,EAAEC,cAAc,CAAE;IAAAG,QAAA,EAChEN,QAAQ,gBACPtB,KAAA,CAAAF,SAAA;MAAA8B,QAAA,gBACEhC,IAAA,CAACH,IAAI;QACHsC,2BAA2B;QAC3BC,WAAW,EAAE,KAAM;QACnBC,yBAAyB,EAAC,qBAAqB;QAC/CC,aAAa,EAAC,MAAM;QACpBJ,KAAK,EAAEzB,oBAAqB;QAAAuB,QAAA,EAE3BD;MAAW,CACR,CAAC,eACP/B,IAAA,CAACF,QAAQ,CAACD,IAAI;QAACqC,KAAK,EAAE,CAACD,qBAAqB,EAAEH,kBAAkB,CAAE;QAAAE,QAAA,EAC/DA;MAAQ,CACI,CAAC;IAAA,CAChB,CAAC,gBAEHhC,IAAA,CAACH,IAAI;MAACqC,KAAK,EAAE,CAACD,qBAAqB,EAAEhB,sBAAsB,CAAE;MAAAe,QAAA,EAC1DA;IAAQ,CACL;EACP,CACG,CAAC;AAEX,CACF,CAAC;AAEDR,aAAa,CAACe,WAAW,GAAG,eAAe","ignoreList":[]}
1
+ {"version":3,"names":["React","useMemo","View","Animated","jsx","_jsx","Fragment","_Fragment","jsxs","_jsxs","shellStyle","position","alignSelf","viewportStyle","measuredContentStyle","left","top","opacity","flexShrink","clippedViewportStyle","overflow","unclippedViewportStyle","fullWidthViewportStyle","width","shellAlignStyles","center","right","viewportAlignStyles","alignItems","MorphViewport","memo","autoSize","clipToBounds","align","containerStyle","animatedWidthStyle","onVisibleLayout","measurement","children","resolvedViewportStyle","style","accessibilityElementsHidden","collapsable","importantForAccessibility","pointerEvents","onLayout","displayName"],"sourceRoot":"../../../src","sources":["view/morph-viewport.tsx"],"mappings":";;AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AAEtC,SAASC,IAAI,QAAQ,cAAc;AACnC,OAAOC,QAAQ,MAAM,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,QAAA,IAAAC,SAAA,EAAAC,IAAA,IAAAC,KAAA;AAG/C,MAAMC,UAAU,GAAG;EACjBC,QAAQ,EAAE,UAAU;EACpBC,SAAS,EAAE;AACb,CAAU;AAEV,MAAMC,aAAa,GAAG;EACpBD,SAAS,EAAE;AACb,CAAU;AAEV,MAAME,oBAA+B,GAAG;EACtCH,QAAQ,EAAE,UAAU;EACpBI,IAAI,EAAE,CAAC;EACPC,GAAG,EAAE,CAAC;EACNC,OAAO,EAAE,CAAC;EACVL,SAAS,EAAE,YAAY;EACvBM,UAAU,EAAE;AACd,CAAC;AAED,MAAMC,oBAA+B,GAAG;EACtCC,QAAQ,EAAE;AACZ,CAAC;AAED,MAAMC,sBAAiC,GAAG;EACxCD,QAAQ,EAAE;AACZ,CAAC;AAED,MAAME,sBAAiC,GAAG;EACxCC,KAAK,EAAE;AACT,CAAC;AAED,MAAMC,gBAAiD,GAAG;EACxDT,IAAI,EAAE;IAAEH,SAAS,EAAE;EAAa,CAAC;EACjCa,MAAM,EAAE;IAAEb,SAAS,EAAE;EAAS,CAAC;EAC/Bc,KAAK,EAAE;IAAEd,SAAS,EAAE;EAAW;AACjC,CAAC;AAED,MAAMe,mBAAoD,GAAG;EAC3DZ,IAAI,EAAE;IAAEa,UAAU,EAAE;EAAa,CAAC;EAClCH,MAAM,EAAE;IAAEG,UAAU,EAAE;EAAS,CAAC;EAChCF,KAAK,EAAE;IAAEE,UAAU,EAAE;EAAW;AAClC,CAAC;AAaD;AACA,OAAO,MAAMC,aAAa,gBAAG7B,KAAK,CAAC8B,IAAI,CACrC,CAAC;EACCC,QAAQ;EACRC,YAAY;EACZC,KAAK;EACLC,cAAc;EACdC,kBAAkB;EAClBC,eAAe;EACfC,WAAW;EACXC;AACkB,CAAC,KAAK;EACxB;EACA,MAAMC,qBAAqB,GAAGtC,OAAO,CACnC,MAAM,CACJY,aAAa,EACbc,mBAAmB,CAACM,KAAK,CAAC,EAC1BD,YAAY,GAAGb,oBAAoB,GAAGE,sBAAsB,CAC7D,EACD,CAACY,KAAK,EAAED,YAAY,CACtB,CAAC;;EAED;EACA,oBACE3B,IAAA,CAACH,IAAI;IAACsC,KAAK,EAAE,CAAC9B,UAAU,EAAEc,gBAAgB,CAACS,KAAK,CAAC,EAAEC,cAAc,CAAE;IAAAI,QAAA,EAChEP,QAAQ,gBACPtB,KAAA,CAAAF,SAAA;MAAA+B,QAAA,gBACEjC,IAAA,CAACH,IAAI;QACHuC,2BAA2B;QAC3BC,WAAW,EAAE,KAAM;QACnBC,yBAAyB,EAAC,qBAAqB;QAC/CC,aAAa,EAAC,MAAM;QACpBJ,KAAK,EAAE1B,oBAAqB;QAAAwB,QAAA,EAE3BD;MAAW,CACR,CAAC,eACPhC,IAAA,CAACF,QAAQ,CAACD,IAAI;QACZ2C,QAAQ,EAAET,eAAgB;QAC1BI,KAAK,EAAE,CAACD,qBAAqB,EAAEJ,kBAAkB,CAAE;QAAAG,QAAA,EAElDA;MAAQ,CACI,CAAC;IAAA,CAChB,CAAC,gBAEHjC,IAAA,CAACH,IAAI;MAACsC,KAAK,EAAE,CAACD,qBAAqB,EAAEjB,sBAAsB,CAAE;MAAAgB,QAAA,EAC1DA;IAAQ,CACL;EACP,CACG,CAAC;AAEX,CACF,CAAC;AAEDT,aAAa,CAACiB,WAAW,GAAG,eAAe","ignoreList":[]}
@@ -14,22 +14,40 @@ export const TextRun = /*#__PURE__*/React.memo(({
14
14
  leading,
15
15
  leadingKey,
16
16
  leadingGap = 0,
17
+ ready = true,
17
18
  textStyle,
18
19
  className
19
20
  }) => {
20
21
  // namespace ids per instance so repeated strings do not collide
21
22
  const scopeId = useId();
22
- const lastValueRef = useRef(value);
23
- const lastLeadingPresenceRef = useRef(Boolean(leading));
24
- const lastLeadingKeyRef = useRef(leadingKey);
23
+ const hasDisplayedRef = useRef(false);
24
+ const displayedValueRef = useRef(value);
25
+ const displayedLeadingRef = useRef(leading);
26
+ const displayedLeadingKeyRef = useRef(leadingKey);
27
+ const displayedLeadingGapRef = useRef(leadingGap);
28
+ const shouldDisplayTarget = ready || !hasDisplayedRef.current;
29
+ const visibleValue = shouldDisplayTarget ? value : displayedValueRef.current;
30
+ const visibleLeading = shouldDisplayTarget ? leading : displayedLeadingRef.current;
31
+ const visibleLeadingKey = shouldDisplayTarget ? leadingKey : displayedLeadingKeyRef.current;
32
+ const visibleLeadingGap = shouldDisplayTarget ? leadingGap : displayedLeadingGapRef.current;
33
+ if (shouldDisplayTarget) {
34
+ hasDisplayedRef.current = true;
35
+ displayedValueRef.current = value;
36
+ displayedLeadingRef.current = leading;
37
+ displayedLeadingKeyRef.current = leadingKey;
38
+ displayedLeadingGapRef.current = leadingGap;
39
+ }
40
+ const lastValueRef = useRef(visibleValue);
41
+ const lastLeadingPresenceRef = useRef(Boolean(visibleLeading));
42
+ const lastLeadingKeyRef = useRef(visibleLeadingKey);
25
43
  const hasAnimatedRef = useRef(false);
26
- const isLeadingSwap = Boolean(leading) && lastLeadingPresenceRef.current && leadingKey !== lastLeadingKeyRef.current;
44
+ const isLeadingSwap = Boolean(visibleLeading) && lastLeadingPresenceRef.current && visibleLeadingKey !== lastLeadingKeyRef.current;
27
45
  // update the worklet flag after commit so render never writes a shared value
28
46
  const leadingSwapProgress = useSharedValue(0);
29
47
  useLayoutEffect(() => {
30
48
  leadingSwapProgress.value = isLeadingSwap ? 1 : 0;
31
49
  }, [isLeadingSwap, leadingSwapProgress]);
32
- const glyphs = useTextGlyphs(value, scopeId, leading, leadingKey);
50
+ const glyphs = useTextGlyphs(visibleValue, scopeId, visibleLeading, visibleLeadingKey);
33
51
  const elementEnterTransition = useMemo(() => createLeadingEnterTransition({
34
52
  durationMs: motionRecipe.durationMs,
35
53
  easing: motionRecipe.easing
@@ -37,16 +55,16 @@ export const TextRun = /*#__PURE__*/React.memo(({
37
55
  const elementExitTransition = useMemo(() => createLeadingExitTransition({
38
56
  durationMs: motionRecipe.durationMs,
39
57
  easing: motionRecipe.easing,
40
- leadingGap,
58
+ leadingGap: visibleLeadingGap,
41
59
  scale: leadingSwapProgress
42
- }), [leadingGap, leadingSwapProgress, motionRecipe.durationMs, motionRecipe.easing]);
60
+ }), [visibleLeadingGap, leadingSwapProgress, motionRecipe.durationMs, motionRecipe.easing]);
43
61
 
44
62
  // mark the first value as settled and later changes as eligible for motion
45
- if (value !== lastValueRef.current || Boolean(leading) !== lastLeadingPresenceRef.current || leadingKey !== lastLeadingKeyRef.current) {
63
+ if (visibleValue !== lastValueRef.current || Boolean(visibleLeading) !== lastLeadingPresenceRef.current || visibleLeadingKey !== lastLeadingKeyRef.current) {
46
64
  hasAnimatedRef.current = true;
47
- lastValueRef.current = value;
48
- lastLeadingPresenceRef.current = Boolean(leading);
49
- lastLeadingKeyRef.current = leadingKey;
65
+ lastValueRef.current = visibleValue;
66
+ lastLeadingPresenceRef.current = Boolean(visibleLeading);
67
+ lastLeadingKeyRef.current = visibleLeadingKey;
50
68
  }
51
69
  const hasAnimated = hasAnimatedRef.current;
52
70
  return /*#__PURE__*/_jsx(GlyphRun, {
@@ -56,7 +74,7 @@ export const TextRun = /*#__PURE__*/React.memo(({
56
74
  elementEnterTransition: isLeadingSwap ? elementEnterTransition : undefined,
57
75
  exitTransition: motionRecipe.exitTransition,
58
76
  elementExitTransition: elementExitTransition,
59
- leadingGap: leadingGap,
77
+ leadingGap: visibleLeadingGap,
60
78
  align: align,
61
79
  textStyle: textStyle,
62
80
  className: className
@@ -1 +1 @@
1
- {"version":3,"names":["React","useId","useLayoutEffect","useMemo","useRef","useSharedValue","useTextGlyphs","createLeadingEnterTransition","createLeadingExitTransition","GlyphRun","jsx","_jsx","TextRun","memo","value","motionRecipe","align","leading","leadingKey","leadingGap","textStyle","className","scopeId","lastValueRef","lastLeadingPresenceRef","Boolean","lastLeadingKeyRef","hasAnimatedRef","isLeadingSwap","current","leadingSwapProgress","glyphs","elementEnterTransition","durationMs","easing","elementExitTransition","scale","hasAnimated","layoutTransition","undefined","enterTransition","exitTransition","displayName"],"sourceRoot":"../../../src","sources":["view/text-run.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useId","useLayoutEffect","useMemo","useRef","useSharedValue","useTextGlyphs","createLeadingEnterTransition","createLeadingExitTransition","GlyphRun","jsx","_jsx","TextRun","memo","value","motionRecipe","align","leading","leadingKey","leadingGap","ready","textStyle","className","scopeId","hasDisplayedRef","displayedValueRef","displayedLeadingRef","displayedLeadingKeyRef","displayedLeadingGapRef","shouldDisplayTarget","current","visibleValue","visibleLeading","visibleLeadingKey","visibleLeadingGap","lastValueRef","lastLeadingPresenceRef","Boolean","lastLeadingKeyRef","hasAnimatedRef","isLeadingSwap","leadingSwapProgress","glyphs","elementEnterTransition","durationMs","easing","elementExitTransition","scale","hasAnimated","layoutTransition","undefined","enterTransition","exitTransition","displayName"],"sourceRoot":"../../../src","sources":["view/text-run.tsx"],"mappings":"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","ignoreList":[]}
@@ -6,11 +6,13 @@ type Params = {
6
6
  };
7
7
  export declare const useInlineAutoWidth: ({ enabled, driveToWidth, measurementKey, }: Params) => {
8
8
  captureLayout: (event: LayoutChangeEvent) => void;
9
+ captureVisibleLayout: (event: LayoutChangeEvent) => void;
9
10
  animatedWidthStyle: {
10
11
  width: number;
11
12
  } | {
12
13
  width?: undefined;
13
14
  };
15
+ isReady: boolean;
14
16
  shouldMeasure: boolean;
15
17
  };
16
18
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"use-inline-auto-width.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-inline-auto-width.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAAI,4CAIhC,MAAM;2BA6BG,iBAAiB;;;;;;;CAqD5B,CAAC"}
1
+ {"version":3,"file":"use-inline-auto-width.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-inline-auto-width.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAUF,eAAO,MAAM,kBAAkB,GAAI,4CAIhC,MAAM;2BAyGG,iBAAiB;kCAlCjB,iBAAiB;;;;;;;;CA8I5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOpE,eAAO,MAAM,OAAO,yDAqJhB,CAAC;AAcL,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOpE,eAAO,MAAM,OAAO,yDA8JhB,CAAC;AAcL,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { StyleProp, ViewStyle } from "react-native";
2
+ import type { LayoutChangeEvent, StyleProp, ViewStyle } from "react-native";
3
3
  import Animated from "react-native-reanimated";
4
4
  import type { LaminarAlign } from "../types";
5
5
  type MorphViewportProps = {
@@ -8,9 +8,10 @@ type MorphViewportProps = {
8
8
  readonly align: LaminarAlign;
9
9
  readonly containerStyle?: StyleProp<ViewStyle>;
10
10
  readonly animatedWidthStyle?: React.ComponentProps<typeof Animated.View>["style"];
11
+ readonly onVisibleLayout?: (event: LayoutChangeEvent) => void;
11
12
  readonly measurement?: React.ReactNode;
12
13
  readonly children: React.ReactNode;
13
14
  };
14
- export declare const MorphViewport: React.MemoExoticComponent<({ autoSize, clipToBounds, align, containerStyle, animatedWidthStyle, measurement, children, }: MorphViewportProps) => React.JSX.Element>;
15
+ export declare const MorphViewport: React.MemoExoticComponent<({ autoSize, clipToBounds, align, containerStyle, animatedWidthStyle, onVisibleLayout, measurement, children, }: MorphViewportProps) => React.JSX.Element>;
15
16
  export {};
16
17
  //# sourceMappingURL=morph-viewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"morph-viewport.d.ts","sourceRoot":"","sources":["../../../../src/view/morph-viewport.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA4C7C,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,CAAC;AAGF,eAAO,MAAM,aAAa,4HASrB,kBAAkB,uBAqCtB,CAAC"}
1
+ {"version":3,"file":"morph-viewport.d.ts","sourceRoot":"","sources":["../../../../src/view/morph-viewport.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA4C7C,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,CAAC;AAGF,eAAO,MAAM,aAAa,6IAUrB,kBAAkB,uBAwCtB,CAAC"}
@@ -9,9 +9,10 @@ type TextRunProps = {
9
9
  readonly leading?: ReactNode;
10
10
  readonly leadingKey?: string | number;
11
11
  readonly leadingGap?: number;
12
+ readonly ready?: boolean;
12
13
  readonly textStyle?: StyleProp<TextStyle>;
13
14
  readonly className?: string;
14
15
  };
15
- export declare const TextRun: React.MemoExoticComponent<({ value, motionRecipe, align, leading, leadingKey, leadingGap, textStyle, className, }: TextRunProps) => React.JSX.Element>;
16
+ export declare const TextRun: React.MemoExoticComponent<({ value, motionRecipe, align, leading, leadingKey, leadingGap, ready, textStyle, className, }: TextRunProps) => React.JSX.Element>;
16
17
  export {};
17
18
  //# sourceMappingURL=text-run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-run.d.ts","sourceRoot":"","sources":["../../../../src/view/text-run.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG3D,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAGF,eAAO,MAAM,OAAO,qHAUf,YAAY,uBA8EhB,CAAC"}
1
+ {"version":3,"file":"text-run.d.ts","sourceRoot":"","sources":["../../../../src/view/text-run.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG3D,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAGF,eAAO,MAAM,OAAO,4HAWf,YAAY,uBA8GhB,CAAC"}
@@ -6,11 +6,13 @@ type Params = {
6
6
  };
7
7
  export declare const useInlineAutoWidth: ({ enabled, driveToWidth, measurementKey, }: Params) => {
8
8
  captureLayout: (event: LayoutChangeEvent) => void;
9
+ captureVisibleLayout: (event: LayoutChangeEvent) => void;
9
10
  animatedWidthStyle: {
10
11
  width: number;
11
12
  } | {
12
13
  width?: undefined;
13
14
  };
15
+ isReady: boolean;
14
16
  shouldMeasure: boolean;
15
17
  };
16
18
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"use-inline-auto-width.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-inline-auto-width.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAAI,4CAIhC,MAAM;2BA6BG,iBAAiB;;;;;;;CAqD5B,CAAC"}
1
+ {"version":3,"file":"use-inline-auto-width.d.ts","sourceRoot":"","sources":["../../../../src/hooks/use-inline-auto-width.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtD,KAAK,MAAM,GAAG;IACZ,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAUF,eAAO,MAAM,kBAAkB,GAAI,4CAIhC,MAAM;2BAyGG,iBAAiB;kCAlCjB,iBAAiB;;;;;;;;CA8I5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOpE,eAAO,MAAM,OAAO,yDAqJhB,CAAC;AAcL,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAS1B,OAAO,KAAK,EAAqB,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAOpE,eAAO,MAAM,OAAO,yDA8JhB,CAAC;AAcL,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,SAAS,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { StyleProp, ViewStyle } from "react-native";
2
+ import type { LayoutChangeEvent, StyleProp, ViewStyle } from "react-native";
3
3
  import Animated from "react-native-reanimated";
4
4
  import type { LaminarAlign } from "../types";
5
5
  type MorphViewportProps = {
@@ -8,9 +8,10 @@ type MorphViewportProps = {
8
8
  readonly align: LaminarAlign;
9
9
  readonly containerStyle?: StyleProp<ViewStyle>;
10
10
  readonly animatedWidthStyle?: React.ComponentProps<typeof Animated.View>["style"];
11
+ readonly onVisibleLayout?: (event: LayoutChangeEvent) => void;
11
12
  readonly measurement?: React.ReactNode;
12
13
  readonly children: React.ReactNode;
13
14
  };
14
- export declare const MorphViewport: React.MemoExoticComponent<({ autoSize, clipToBounds, align, containerStyle, animatedWidthStyle, measurement, children, }: MorphViewportProps) => React.JSX.Element>;
15
+ export declare const MorphViewport: React.MemoExoticComponent<({ autoSize, clipToBounds, align, containerStyle, animatedWidthStyle, onVisibleLayout, measurement, children, }: MorphViewportProps) => React.JSX.Element>;
15
16
  export {};
16
17
  //# sourceMappingURL=morph-viewport.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"morph-viewport.d.ts","sourceRoot":"","sources":["../../../../src/view/morph-viewport.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzD,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA4C7C,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,CAAC;AAGF,eAAO,MAAM,aAAa,4HASrB,kBAAkB,uBAqCtB,CAAC"}
1
+ {"version":3,"file":"morph-viewport.d.ts","sourceRoot":"","sources":["../../../../src/view/morph-viewport.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA4C7C,KAAK,kBAAkB,GAAG;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;IAClF,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CACpC,CAAC;AAGF,eAAO,MAAM,aAAa,6IAUrB,kBAAkB,uBAwCtB,CAAC"}
@@ -9,9 +9,10 @@ type TextRunProps = {
9
9
  readonly leading?: ReactNode;
10
10
  readonly leadingKey?: string | number;
11
11
  readonly leadingGap?: number;
12
+ readonly ready?: boolean;
12
13
  readonly textStyle?: StyleProp<TextStyle>;
13
14
  readonly className?: string;
14
15
  };
15
- export declare const TextRun: React.MemoExoticComponent<({ value, motionRecipe, align, leading, leadingKey, leadingGap, textStyle, className, }: TextRunProps) => React.JSX.Element>;
16
+ export declare const TextRun: React.MemoExoticComponent<({ value, motionRecipe, align, leading, leadingKey, leadingGap, ready, textStyle, className, }: TextRunProps) => React.JSX.Element>;
16
17
  export {};
17
18
  //# sourceMappingURL=text-run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"text-run.d.ts","sourceRoot":"","sources":["../../../../src/view/text-run.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG3D,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAGF,eAAO,MAAM,OAAO,qHAUf,YAAY,uBA8EhB,CAAC"}
1
+ {"version":3,"file":"text-run.d.ts","sourceRoot":"","sources":["../../../../src/view/text-run.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkD,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAG3D,KAAK,YAAY,GAAG;IAClB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAGF,eAAO,MAAM,OAAO,4HAWf,YAAY,uBA8GhB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-laminar",
3
- "version": "1.4.2",
3
+ "version": "1.4.3",
4
4
  "description": "A React Native component for morphing text and numbers with character-level identity.",
5
5
  "keywords": [
6
6
  "react-native",
@@ -1,4 +1,10 @@
1
- import { useCallback, useEffect, useRef, useState } from "react";
1
+ import {
2
+ useCallback,
3
+ useEffect,
4
+ useLayoutEffect,
5
+ useRef,
6
+ useState,
7
+ } from "react";
2
8
  import type { LayoutChangeEvent } from "react-native";
3
9
  import { useAnimatedStyle, useSharedValue } from "react-native-reanimated";
4
10
 
@@ -8,6 +14,11 @@ type Params = {
8
14
  measurementKey: string;
9
15
  };
10
16
 
17
+ type PendingProbe = {
18
+ key: string;
19
+ width: number;
20
+ };
21
+
11
22
  const WIDTH_CACHE_LIMIT = 64;
12
23
 
13
24
  // measure each content signature once and drive later changes through one width value
@@ -17,10 +28,24 @@ export const useInlineAutoWidth = ({
17
28
  measurementKey,
18
29
  }: Params) => {
19
30
  const widthValue = useSharedValue(0);
31
+ const hasBootstrappedWidth = useSharedValue(false);
20
32
  const measuredWidthRef = useRef<number | null>(null);
21
33
  const bootstrappedRef = useRef(false);
22
34
  const widthCacheRef = useRef(new Map<string, number>());
23
- const [hasBootstrappedWidth, setHasBootstrappedWidth] = useState(false);
35
+ const hasCapturedVisibleLayoutRef = useRef(false);
36
+ const initialMeasurementKeyRef = useRef<string | null>(null);
37
+ const firstProbeRef = useRef<PendingProbe | null>(null);
38
+ const latestProbeRef = useRef<PendingProbe | null>(null);
39
+ const bootstrapTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
40
+ const [readyMeasurementKey, setReadyMeasurementKey] = useState<string | null>(
41
+ null
42
+ );
43
+
44
+ const markMeasurementReady = useCallback((key: string) => {
45
+ setReadyMeasurementKey((currentKey) =>
46
+ currentKey === key ? currentKey : key
47
+ );
48
+ }, []);
24
49
 
25
50
  // the first measurement establishes the shell without animating from zero
26
51
  const applyWidth = useCallback(
@@ -34,7 +59,7 @@ export const useInlineAutoWidth = ({
34
59
  if (!bootstrappedRef.current) {
35
60
  bootstrappedRef.current = true;
36
61
  widthValue.value = nextWidth;
37
- setHasBootstrappedWidth(true);
62
+ hasBootstrappedWidth.value = true;
38
63
  return;
39
64
  }
40
65
 
@@ -43,6 +68,68 @@ export const useInlineAutoWidth = ({
43
68
  [driveToWidth, widthValue]
44
69
  );
45
70
 
71
+ const bootstrapFromProbe = useCallback(() => {
72
+ bootstrapTimerRef.current = null;
73
+
74
+ if (hasCapturedVisibleLayoutRef.current) {
75
+ return;
76
+ }
77
+
78
+ const firstProbe = firstProbeRef.current;
79
+ if (!firstProbe) {
80
+ return;
81
+ }
82
+
83
+ // The visible layout did not arrive in time, so use the first probe as a
84
+ // safe fallback. A later probe can still animate from this baseline.
85
+ hasCapturedVisibleLayoutRef.current = true;
86
+ initialMeasurementKeyRef.current = firstProbe.key;
87
+ applyWidth(firstProbe.width);
88
+
89
+ const latestProbe = latestProbeRef.current;
90
+ if (latestProbe && latestProbe.key !== firstProbe.key) {
91
+ // The target width is already cached. Defer its animation until the
92
+ // ready render so the shell and the new glyph row start together.
93
+ markMeasurementReady(latestProbe.key);
94
+ } else {
95
+ markMeasurementReady(firstProbe.key);
96
+ }
97
+ }, [applyWidth, markMeasurementReady]);
98
+
99
+ const captureVisibleLayout = useCallback(
100
+ (event: LayoutChangeEvent) => {
101
+ if (!enabled || hasCapturedVisibleLayoutRef.current) {
102
+ return;
103
+ }
104
+
105
+ if (bootstrapTimerRef.current !== null) {
106
+ clearTimeout(bootstrapTimerRef.current);
107
+ bootstrapTimerRef.current = null;
108
+ }
109
+
110
+ hasCapturedVisibleLayoutRef.current = true;
111
+ // bootstrap from the visible tree so the first explicit width matches
112
+ // the geometry that was already painted to the user
113
+ const nextWidth = Math.max(0, event.nativeEvent.layout.width);
114
+ // retain the visible width for the initial key so a later cache hit does
115
+ // not reintroduce the probe-to-visible mismatch
116
+ widthCacheRef.current.delete(measurementKey);
117
+ widthCacheRef.current.set(measurementKey, nextWidth);
118
+ const firstProbe = firstProbeRef.current;
119
+ if (firstProbe && firstProbe.key !== measurementKey) {
120
+ initialMeasurementKeyRef.current = firstProbe.key;
121
+ applyWidth(firstProbe.width);
122
+ markMeasurementReady(measurementKey);
123
+ return;
124
+ }
125
+
126
+ initialMeasurementKeyRef.current = measurementKey;
127
+ applyWidth(nextWidth);
128
+ markMeasurementReady(measurementKey);
129
+ },
130
+ [applyWidth, enabled, markMeasurementReady, measurementKey]
131
+ );
132
+
46
133
  const captureLayout = useCallback(
47
134
  (event: LayoutChangeEvent) => {
48
135
  if (!enabled) {
@@ -52,49 +139,104 @@ export const useInlineAutoWidth = ({
52
139
  // round up so fractional native measurements cannot clip the final glyph
53
140
  const nextWidth = Math.max(0, Math.ceil(event.nativeEvent.layout.width));
54
141
 
55
- // delete before setting so a repeated key moves to the most recent position
56
- widthCacheRef.current.delete(measurementKey);
142
+ const isInitialMeasurement =
143
+ initialMeasurementKeyRef.current === measurementKey;
144
+
145
+ if (!isInitialMeasurement) {
146
+ // delete before setting so a repeated key moves to the most recent position
147
+ widthCacheRef.current.delete(measurementKey);
57
148
 
58
- if (widthCacheRef.current.size >= WIDTH_CACHE_LIMIT) {
59
- // map insertion order gives the lru entry at the front
60
- const oldestKey = widthCacheRef.current.keys().next().value;
149
+ if (widthCacheRef.current.size >= WIDTH_CACHE_LIMIT) {
150
+ // map insertion order gives the lru entry at the front
151
+ const oldestKey = widthCacheRef.current.keys().next().value;
61
152
 
62
- if (oldestKey !== undefined) {
63
- widthCacheRef.current.delete(oldestKey);
153
+ if (oldestKey !== undefined) {
154
+ widthCacheRef.current.delete(oldestKey);
155
+ }
64
156
  }
157
+
158
+ widthCacheRef.current.set(measurementKey, nextWidth);
65
159
  }
66
160
 
67
- widthCacheRef.current.set(measurementKey, nextWidth);
68
- applyWidth(nextWidth);
161
+ const probe = { key: measurementKey, width: nextWidth };
162
+ if (!firstProbeRef.current) {
163
+ firstProbeRef.current = probe;
164
+ }
165
+ latestProbeRef.current = probe;
166
+
167
+ if (
168
+ !hasCapturedVisibleLayoutRef.current &&
169
+ bootstrapTimerRef.current === null
170
+ ) {
171
+ bootstrapTimerRef.current = setTimeout(bootstrapFromProbe, 0);
172
+ }
173
+
174
+ // Do not let the initial probe override the visible first frame.
175
+ if (hasCapturedVisibleLayoutRef.current && !isInitialMeasurement) {
176
+ // captureLayout only records the target. The cache effect applies the
177
+ // animation during the render that releases the new glyph row.
178
+ markMeasurementReady(measurementKey);
179
+ }
69
180
  },
70
- [applyWidth, enabled, measurementKey]
181
+ [
182
+ applyWidth,
183
+ bootstrapFromProbe,
184
+ enabled,
185
+ markMeasurementReady,
186
+ measurementKey,
187
+ ]
71
188
  );
72
189
 
73
190
  const cachedWidth = widthCacheRef.current.get(measurementKey);
74
191
 
75
192
  // a cached width can restore the shell before the hidden probe renders again
76
- useEffect(() => {
77
- if (enabled && cachedWidth !== undefined) {
193
+ useLayoutEffect(() => {
194
+ if (
195
+ enabled &&
196
+ cachedWidth !== undefined &&
197
+ hasCapturedVisibleLayoutRef.current
198
+ ) {
78
199
  // promote cache hits so active states stay available longer
79
200
  widthCacheRef.current.delete(measurementKey);
80
201
  widthCacheRef.current.set(measurementKey, cachedWidth);
81
202
  applyWidth(cachedWidth);
203
+ markMeasurementReady(measurementKey);
82
204
  }
83
- }, [applyWidth, cachedWidth, enabled, measurementKey]);
205
+ }, [
206
+ applyWidth,
207
+ cachedWidth,
208
+ enabled,
209
+ markMeasurementReady,
210
+ measurementKey,
211
+ ]);
212
+
213
+ useEffect(
214
+ () => () => {
215
+ if (bootstrapTimerRef.current !== null) {
216
+ clearTimeout(bootstrapTimerRef.current);
217
+ }
218
+ },
219
+ []
220
+ );
84
221
 
85
222
  const animatedWidthStyle = useAnimatedStyle(
86
223
  () =>
87
- enabled && hasBootstrappedWidth
224
+ enabled && hasBootstrappedWidth.value
88
225
  ? {
89
226
  width: widthValue.value,
90
227
  }
91
228
  : {},
92
- [enabled, hasBootstrappedWidth]
229
+ [enabled]
93
230
  );
94
231
 
95
232
  return {
96
233
  captureLayout,
234
+ captureVisibleLayout,
97
235
  animatedWidthStyle,
236
+ isReady:
237
+ !enabled ||
238
+ cachedWidth !== undefined ||
239
+ readyMeasurementKey === measurementKey,
98
240
  shouldMeasure: enabled && cachedWidth === undefined,
99
241
  };
100
242
  };