react-native-morph-card 0.2.7 → 0.3.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 (34) hide show
  1. package/README.md +40 -31
  2. package/android/src/main/java/com/melivalesca/morphcard/MorphCardSourceView.kt +27 -72
  3. package/android/src/main/java/com/melivalesca/morphcard/MorphCardTargetManager.kt +2 -2
  4. package/android/src/main/java/com/melivalesca/morphcard/MorphCardTargetView.kt +34 -39
  5. package/android/src/main/java/com/melivalesca/morphcard/MorphCardUtils.kt +43 -0
  6. package/ios/Fabric/RNCMorphCardSourceComponentView.h +0 -3
  7. package/ios/Fabric/RNCMorphCardSourceComponentView.mm +110 -80
  8. package/ios/Fabric/RNCMorphCardTargetComponentView.h +1 -0
  9. package/ios/Fabric/RNCMorphCardTargetComponentView.mm +26 -14
  10. package/ios/RNCMorphCardSource.m +1 -1
  11. package/lib/commonjs/MorphCardSource.js +25 -2
  12. package/lib/commonjs/MorphCardSource.js.map +1 -1
  13. package/lib/commonjs/MorphCardTarget.js +31 -7
  14. package/lib/commonjs/MorphCardTarget.js.map +1 -1
  15. package/lib/commonjs/MorphChildrenRegistry.js +34 -0
  16. package/lib/commonjs/MorphChildrenRegistry.js.map +1 -0
  17. package/lib/module/MorphCardSource.js +25 -2
  18. package/lib/module/MorphCardSource.js.map +1 -1
  19. package/lib/module/MorphCardTarget.js +31 -7
  20. package/lib/module/MorphCardTarget.js.map +1 -1
  21. package/lib/module/MorphChildrenRegistry.js +27 -0
  22. package/lib/module/MorphChildrenRegistry.js.map +1 -0
  23. package/lib/typescript/src/MorphCardSource.d.ts +4 -4
  24. package/lib/typescript/src/MorphCardSource.d.ts.map +1 -1
  25. package/lib/typescript/src/MorphCardTarget.d.ts.map +1 -1
  26. package/lib/typescript/src/MorphChildrenRegistry.d.ts +13 -0
  27. package/lib/typescript/src/MorphChildrenRegistry.d.ts.map +1 -0
  28. package/lib/typescript/src/index.d.ts +1 -1
  29. package/lib/typescript/src/index.d.ts.map +1 -1
  30. package/package.json +1 -1
  31. package/src/MorphCardSource.tsx +27 -5
  32. package/src/MorphCardTarget.tsx +44 -9
  33. package/src/MorphChildrenRegistry.ts +43 -0
  34. package/src/index.tsx +1 -1
@@ -4,6 +4,7 @@ import * as React from 'react';
4
4
  import { Pressable, View, findNodeHandle } from 'react-native';
5
5
  import NativeMorphCardModule from './specs/NativeMorphCardModule';
6
6
  import NativeSourceViewSpec from './specs/NativeMorphCardSource';
7
+ import { setSourceEntry, setSourceLayout, clearSourceEntry } from './MorphChildrenRegistry';
7
8
  import { jsx as _jsx } from "react/jsx-runtime";
8
9
  const NativeSourceView = NativeSourceViewSpec ?? View;
9
10
  export const MorphCardSource = ({
@@ -14,12 +15,23 @@ export const MorphCardSource = ({
14
15
  height,
15
16
  borderRadius,
16
17
  backgroundColor,
17
- scaleMode,
18
+ resizeMode,
18
19
  onPress,
19
20
  ref
20
21
  }) => {
21
22
  const nativeRef = React.useRef(null);
22
23
  React.useImperativeHandle(ref, () => nativeRef.current);
24
+
25
+ // Store children in shared registry so MorphCardTarget can clone them
26
+ React.useEffect(() => {
27
+ const tag = findNodeHandle(nativeRef.current);
28
+ if (tag != null) {
29
+ setSourceEntry(tag, children, backgroundColor, resizeMode);
30
+ }
31
+ return () => {
32
+ if (tag != null) clearSourceEntry(tag);
33
+ };
34
+ }, [children, backgroundColor, resizeMode]);
23
35
  const style = {};
24
36
  if (width != null) style.width = width;
25
37
  if (height != null) style.height = height;
@@ -28,6 +40,16 @@ export const MorphCardSource = ({
28
40
  style.overflow = 'hidden';
29
41
  }
30
42
  if (backgroundColor != null) style.backgroundColor = backgroundColor;
43
+ const handleLayout = React.useCallback(e => {
44
+ const tag = findNodeHandle(nativeRef.current);
45
+ if (tag != null) {
46
+ const {
47
+ width: lw,
48
+ height: lh
49
+ } = e.nativeEvent.layout;
50
+ setSourceLayout(tag, lw, lh);
51
+ }
52
+ }, []);
31
53
  const handlePress = React.useCallback(() => {
32
54
  if (!onPress) return;
33
55
  const tag = findNodeHandle(nativeRef.current);
@@ -43,9 +65,10 @@ export const MorphCardSource = ({
43
65
  ref: nativeRef,
44
66
  duration: duration,
45
67
  expandDuration: expandDuration,
46
- scaleMode: scaleMode,
68
+ scaleMode: resizeMode === 'contain' ? 'aspectFit' : resizeMode === 'stretch' ? 'stretch' : 'aspectFill',
47
69
  cardBorderRadius: borderRadius,
48
70
  style: style,
71
+ onLayout: handleLayout,
49
72
  children: children
50
73
  });
51
74
  if (onPress) {
@@ -1 +1 @@
1
- {"version":3,"names":["React","Pressable","View","findNodeHandle","NativeMorphCardModule","NativeSourceViewSpec","jsx","_jsx","NativeSourceView","MorphCardSource","children","duration","expandDuration","width","height","borderRadius","backgroundColor","scaleMode","onPress","ref","nativeRef","useRef","useImperativeHandle","current","style","overflow","handlePress","useCallback","tag","prepareExpand","requestAnimationFrame","content","cardBorderRadius","getViewTag","viewRef","morphExpand","sourceRef","targetRef","sourceTag","targetTag","expand","morphCollapse","collapse"],"sourceRoot":"../../src","sources":["MorphCardSource.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Pressable","View","findNodeHandle","NativeMorphCardModule","NativeSourceViewSpec","setSourceEntry","setSourceLayout","clearSourceEntry","jsx","_jsx","NativeSourceView","MorphCardSource","children","duration","expandDuration","width","height","borderRadius","backgroundColor","resizeMode","onPress","ref","nativeRef","useRef","useImperativeHandle","current","useEffect","tag","style","overflow","handleLayout","useCallback","e","lw","lh","nativeEvent","layout","handlePress","prepareExpand","requestAnimationFrame","content","scaleMode","cardBorderRadius","onLayout","getViewTag","viewRef","morphExpand","sourceRef","targetRef","sourceTag","targetTag","expand","morphCollapse","collapse"],"sourceRoot":"../../src","sources":["MorphCardSource.tsx"],"mappings":"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","ignoreList":[]}
@@ -4,6 +4,7 @@ import * as React from 'react';
4
4
  import { View, findNodeHandle } from 'react-native';
5
5
  import NativeMorphCardModule from './specs/NativeMorphCardModule';
6
6
  import NativeTargetViewSpec from './specs/NativeMorphCardTarget';
7
+ import { getSourceEntry } from './MorphChildrenRegistry';
7
8
  import { jsx as _jsx } from "react/jsx-runtime";
8
9
  const NativeTargetView = NativeTargetViewSpec ?? View;
9
10
  export const MorphCardTarget = ({
@@ -46,16 +47,32 @@ export const MorphCardTarget = ({
46
47
  NativeMorphCardModule.setTargetConfig(sourceTag, lw, lh, borderRadius != null ? borderRadius : -1, contentOffsetY ?? 0, contentCentered ?? false);
47
48
  NativeMorphCardModule.expand(sourceTag, targetTag);
48
49
  }, [sourceTag, borderRadius, contentOffsetY, contentCentered]);
49
- const sizeStyle = {};
50
+ const sourceEntry = getSourceEntry(sourceTag);
51
+ const containerStyle = {
52
+ overflow: 'hidden'
53
+ };
54
+ if (sourceEntry?.backgroundColor) {
55
+ containerStyle.backgroundColor = sourceEntry.backgroundColor;
56
+ }
57
+ if (contentCentered) {
58
+ containerStyle.justifyContent = 'center';
59
+ containerStyle.alignItems = 'center';
60
+ }
61
+ if (contentOffsetY) {
62
+ containerStyle.paddingTop = contentOffsetY;
63
+ }
50
64
  if (width != null) {
51
- sizeStyle.width = width;
65
+ containerStyle.width = width;
52
66
  } else if (sourceSize) {
53
- sizeStyle.width = sourceSize.width;
67
+ containerStyle.width = sourceSize.width;
54
68
  }
55
69
  if (height != null) {
56
- sizeStyle.height = height;
70
+ containerStyle.height = height;
57
71
  } else if (sourceSize) {
58
- sizeStyle.height = sourceSize.height;
72
+ containerStyle.height = sourceSize.height;
73
+ }
74
+ if (borderRadius) {
75
+ containerStyle.borderRadius = borderRadius;
59
76
  }
60
77
  return /*#__PURE__*/_jsx(NativeTargetView, {
61
78
  ref: nativeRef,
@@ -64,8 +81,15 @@ export const MorphCardTarget = ({
64
81
  targetWidth: 0,
65
82
  targetHeight: 0,
66
83
  targetBorderRadius: borderRadius != null ? borderRadius : -1,
67
- style: sizeStyle,
68
- onLayout: handleLayout
84
+ style: containerStyle,
85
+ onLayout: handleLayout,
86
+ children: sourceEntry && !sourceEntry.scaleMode && (sourceEntry.backgroundColor && sourceEntry.layoutWidth ? /*#__PURE__*/_jsx(View, {
87
+ style: {
88
+ width: sourceEntry.layoutWidth,
89
+ height: sourceEntry.layoutHeight
90
+ },
91
+ children: sourceEntry.children
92
+ }) : sourceEntry.children)
69
93
  });
70
94
  };
71
95
  //# sourceMappingURL=MorphCardTarget.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","View","findNodeHandle","NativeMorphCardModule","NativeTargetViewSpec","jsx","_jsx","NativeTargetView","MorphCardTarget","sourceTag","collapseDuration","width","height","borderRadius","contentOffsetY","contentCentered","nativeRef","useRef","expandedRef","sourceSize","setSourceSize","useState","useEffect","cancelled","getSourceSize","then","size","catch","handleLayout","useCallback","e","current","lw","lh","nativeEvent","layout","targetTag","setTargetConfig","expand","sizeStyle","ref","targetWidth","targetHeight","targetBorderRadius","style","onLayout"],"sourceRoot":"../../src","sources":["MorphCardTarget.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","View","findNodeHandle","NativeMorphCardModule","NativeTargetViewSpec","getSourceEntry","jsx","_jsx","NativeTargetView","MorphCardTarget","sourceTag","collapseDuration","width","height","borderRadius","contentOffsetY","contentCentered","nativeRef","useRef","expandedRef","sourceSize","setSourceSize","useState","useEffect","cancelled","getSourceSize","then","size","catch","handleLayout","useCallback","e","current","lw","lh","nativeEvent","layout","targetTag","setTargetConfig","expand","sourceEntry","containerStyle","overflow","backgroundColor","justifyContent","alignItems","paddingTop","ref","targetWidth","targetHeight","targetBorderRadius","style","onLayout","children","scaleMode","layoutWidth","layoutHeight"],"sourceRoot":"../../src","sources":["MorphCardTarget.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ const registry = new Map();
4
+ export function setSourceEntry(tag, children, backgroundColor, scaleMode) {
5
+ const existing = registry.get(tag);
6
+ registry.set(tag, {
7
+ children,
8
+ backgroundColor,
9
+ scaleMode,
10
+ layoutWidth: existing?.layoutWidth,
11
+ layoutHeight: existing?.layoutHeight
12
+ });
13
+ }
14
+ export function setSourceLayout(tag, width, height) {
15
+ const existing = registry.get(tag);
16
+ if (existing) {
17
+ existing.layoutWidth = width;
18
+ existing.layoutHeight = height;
19
+ }
20
+ }
21
+ export function getSourceEntry(tag) {
22
+ return registry.get(tag);
23
+ }
24
+ export function clearSourceEntry(tag) {
25
+ registry.delete(tag);
26
+ }
27
+ //# sourceMappingURL=MorphChildrenRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["registry","Map","setSourceEntry","tag","children","backgroundColor","scaleMode","existing","get","set","layoutWidth","layoutHeight","setSourceLayout","width","height","getSourceEntry","clearSourceEntry","delete"],"sourceRoot":"../../src","sources":["MorphChildrenRegistry.ts"],"mappings":";;AAUA,MAAMA,QAAQ,GAAG,IAAIC,GAAG,CAAsB,CAAC;AAE/C,OAAO,SAASC,cAAcA,CAC5BC,GAAW,EACXC,QAAmB,EACnBC,eAAwB,EACxBC,SAAkB,EAClB;EACA,MAAMC,QAAQ,GAAGP,QAAQ,CAACQ,GAAG,CAACL,GAAG,CAAC;EAClCH,QAAQ,CAACS,GAAG,CAACN,GAAG,EAAE;IAChBC,QAAQ;IACRC,eAAe;IACfC,SAAS;IACTI,WAAW,EAAEH,QAAQ,EAAEG,WAAW;IAClCC,YAAY,EAAEJ,QAAQ,EAAEI;EAC1B,CAAC,CAAC;AACJ;AAEA,OAAO,SAASC,eAAeA,CAACT,GAAW,EAAEU,KAAa,EAAEC,MAAc,EAAE;EAC1E,MAAMP,QAAQ,GAAGP,QAAQ,CAACQ,GAAG,CAACL,GAAG,CAAC;EAClC,IAAII,QAAQ,EAAE;IACZA,QAAQ,CAACG,WAAW,GAAGG,KAAK;IAC5BN,QAAQ,CAACI,YAAY,GAAGG,MAAM;EAChC;AACF;AAEA,OAAO,SAASC,cAAcA,CAACZ,GAAW,EAA2B;EACnE,OAAOH,QAAQ,CAACQ,GAAG,CAACL,GAAG,CAAC;AAC1B;AAEA,OAAO,SAASa,gBAAgBA,CAACb,GAAW,EAAE;EAC5CH,QAAQ,CAACiB,MAAM,CAACd,GAAG,CAAC;AACtB","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { type DimensionValue } from 'react-native';
3
- export type ScaleMode = 'aspectFill' | 'aspectFit' | 'stretch';
3
+ export type ResizeMode = 'cover' | 'contain' | 'stretch';
4
4
  export interface MorphCardSourceProps {
5
5
  ref?: React.Ref<any>;
6
6
  duration?: number;
@@ -9,12 +9,12 @@ export interface MorphCardSourceProps {
9
9
  height?: DimensionValue;
10
10
  borderRadius?: number;
11
11
  backgroundColor?: string;
12
- /** How the snapshot scales in no-wrapper mode (no backgroundColor). Default: 'aspectFill' */
13
- scaleMode?: ScaleMode;
12
+ /** How the snapshot scales in no-wrapper mode (no backgroundColor). Default: 'cover' */
13
+ resizeMode?: ResizeMode;
14
14
  onPress?: (sourceTag: number) => void;
15
15
  children: React.ReactNode;
16
16
  }
17
- export declare const MorphCardSource: ({ children, duration, expandDuration, width, height, borderRadius, backgroundColor, scaleMode, onPress, ref, }: MorphCardSourceProps) => React.JSX.Element;
17
+ export declare const MorphCardSource: ({ children, duration, expandDuration, width, height, borderRadius, backgroundColor, resizeMode, onPress, ref, }: MorphCardSourceProps) => React.JSX.Element;
18
18
  /**
19
19
  * Get the native view tag from a ref. Useful for passing sourceTag
20
20
  * to the detail screen via navigation params.
@@ -1 +1 @@
1
- {"version":3,"file":"MorphCardSource.d.ts","sourceRoot":"","sources":["../../../src/MorphCardSource.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAGL,KAAK,cAAc,EAGpB,MAAM,cAAc,CAAC;AAMtB,MAAM,MAAM,SAAS,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,GAAI,gHAW7B,oBAAoB,sBAmCtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE"}
1
+ {"version":3,"file":"MorphCardSource.d.ts","sourceRoot":"","sources":["../../../src/MorphCardSource.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAGL,KAAK,cAAc,EAIpB,MAAM,cAAc,CAAC;AAOtB,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wFAAwF;IACxF,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,GAAI,iHAW7B,oBAAoB,sBAuDtB,CAAC;AAEF;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,CAEvE;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAC/B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,GAC9B,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"MorphCardTarget.d.ts","sourceRoot":"","sources":["../../../src/MorphCardTarget.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,cAAc,CAAC;AAMtB,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,sFAAsF;IACtF,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gGAAgG;IAChG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,GAAI,gGAQ7B,oBAAoB,sBAwEtB,CAAC"}
1
+ {"version":3,"file":"MorphCardTarget.d.ts","sourceRoot":"","sources":["../../../src/MorphCardTarget.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,cAAc,CAAC;AAOtB,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oFAAoF;IACpF,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,sFAAsF;IACtF,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,2GAA2G;IAC3G,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gGAAgG;IAChG,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gGAAgG;IAChG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,GAAI,gGAQ7B,oBAAoB,sBA0GtB,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface SourceEntry {
3
+ children: ReactNode;
4
+ backgroundColor?: string;
5
+ scaleMode?: string;
6
+ layoutWidth?: number;
7
+ layoutHeight?: number;
8
+ }
9
+ export declare function setSourceEntry(tag: number, children: ReactNode, backgroundColor?: string, scaleMode?: string): void;
10
+ export declare function setSourceLayout(tag: number, width: number, height: number): void;
11
+ export declare function getSourceEntry(tag: number): SourceEntry | undefined;
12
+ export declare function clearSourceEntry(tag: number): void;
13
+ //# sourceMappingURL=MorphChildrenRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MorphChildrenRegistry.d.ts","sourceRoot":"","sources":["../../../src/MorphChildrenRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,SAAS,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,SAAS,EACnB,eAAe,CAAC,EAAE,MAAM,EACxB,SAAS,CAAC,EAAE,MAAM,QAUnB;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAMzE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEnE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,QAE3C"}
@@ -1,5 +1,5 @@
1
1
  export { MorphCardSource, morphExpand, morphCollapse, getViewTag, } from './MorphCardSource';
2
- export type { MorphCardSourceProps, ScaleMode } from './MorphCardSource';
2
+ export type { MorphCardSourceProps, ResizeMode } from './MorphCardSource';
3
3
  export { MorphCardTarget } from './MorphCardTarget';
4
4
  export type { MorphCardTargetProps } from './MorphCardTarget';
5
5
  export { useMorphTarget } from './useMorphTarget';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-morph-card",
3
- "version": "0.2.7",
3
+ "version": "0.3.0",
4
4
  "description": "Native card-to-modal morph transition for React Native. iOS App Store-style expand animation.",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",
@@ -3,15 +3,17 @@ import {
3
3
  Pressable,
4
4
  type ViewStyle,
5
5
  type DimensionValue,
6
+ type LayoutChangeEvent,
6
7
  View,
7
8
  findNodeHandle,
8
9
  } from 'react-native';
9
10
  import NativeMorphCardModule from './specs/NativeMorphCardModule';
10
11
  import NativeSourceViewSpec from './specs/NativeMorphCardSource';
12
+ import { setSourceEntry, setSourceLayout, clearSourceEntry } from './MorphChildrenRegistry';
11
13
 
12
14
  const NativeSourceView = NativeSourceViewSpec ?? View;
13
15
 
14
- export type ScaleMode = 'aspectFill' | 'aspectFit' | 'stretch';
16
+ export type ResizeMode = 'cover' | 'contain' | 'stretch';
15
17
 
16
18
  export interface MorphCardSourceProps {
17
19
  ref?: React.Ref<any>;
@@ -21,8 +23,8 @@ export interface MorphCardSourceProps {
21
23
  height?: DimensionValue;
22
24
  borderRadius?: number;
23
25
  backgroundColor?: string;
24
- /** How the snapshot scales in no-wrapper mode (no backgroundColor). Default: 'aspectFill' */
25
- scaleMode?: ScaleMode;
26
+ /** How the snapshot scales in no-wrapper mode (no backgroundColor). Default: 'cover' */
27
+ resizeMode?: ResizeMode;
26
28
  onPress?: (sourceTag: number) => void;
27
29
  children: React.ReactNode;
28
30
  }
@@ -35,13 +37,24 @@ export const MorphCardSource = ({
35
37
  height,
36
38
  borderRadius,
37
39
  backgroundColor,
38
- scaleMode,
40
+ resizeMode,
39
41
  onPress,
40
42
  ref,
41
43
  }: MorphCardSourceProps) => {
42
44
  const nativeRef = React.useRef<any>(null);
43
45
  React.useImperativeHandle(ref, () => nativeRef.current);
44
46
 
47
+ // Store children in shared registry so MorphCardTarget can clone them
48
+ React.useEffect(() => {
49
+ const tag = findNodeHandle(nativeRef.current);
50
+ if (tag != null) {
51
+ setSourceEntry(tag, children, backgroundColor, resizeMode);
52
+ }
53
+ return () => {
54
+ if (tag != null) clearSourceEntry(tag);
55
+ };
56
+ }, [children, backgroundColor, resizeMode]);
57
+
45
58
  const style: ViewStyle = {};
46
59
  if (width != null) style.width = width as ViewStyle['width'];
47
60
  if (height != null) style.height = height as ViewStyle['height'];
@@ -50,6 +63,15 @@ export const MorphCardSource = ({
50
63
  style.overflow = 'hidden';
51
64
  }
52
65
  if (backgroundColor != null) style.backgroundColor = backgroundColor;
66
+
67
+ const handleLayout = React.useCallback((e: LayoutChangeEvent) => {
68
+ const tag = findNodeHandle(nativeRef.current);
69
+ if (tag != null) {
70
+ const { width: lw, height: lh } = e.nativeEvent.layout;
71
+ setSourceLayout(tag, lw, lh);
72
+ }
73
+ }, []);
74
+
53
75
  const handlePress = React.useCallback(() => {
54
76
  if (!onPress) return;
55
77
  const tag = findNodeHandle(nativeRef.current);
@@ -63,7 +85,7 @@ export const MorphCardSource = ({
63
85
  }, [onPress]);
64
86
 
65
87
  const content = (
66
- <NativeSourceView ref={nativeRef} duration={duration} expandDuration={expandDuration} scaleMode={scaleMode} cardBorderRadius={borderRadius} style={style}>
88
+ <NativeSourceView ref={nativeRef} duration={duration} expandDuration={expandDuration} scaleMode={resizeMode === 'contain' ? 'aspectFit' : resizeMode === 'stretch' ? 'stretch' : 'aspectFill'} cardBorderRadius={borderRadius} style={style} onLayout={handleLayout}>
67
89
  {children}
68
90
  </NativeSourceView>
69
91
  );
@@ -8,6 +8,7 @@ import {
8
8
  } from 'react-native';
9
9
  import NativeMorphCardModule from './specs/NativeMorphCardModule';
10
10
  import NativeTargetViewSpec from './specs/NativeMorphCardTarget';
11
+ import { getSourceEntry } from './MorphChildrenRegistry';
11
12
 
12
13
  const NativeTargetView = NativeTargetViewSpec ?? View;
13
14
 
@@ -77,23 +78,42 @@ export const MorphCardTarget = ({
77
78
  lh,
78
79
  borderRadius != null ? borderRadius : -1,
79
80
  contentOffsetY ?? 0,
80
- contentCentered ?? false
81
+ contentCentered ?? false,
81
82
  );
82
83
  NativeMorphCardModule.expand(sourceTag, targetTag);
83
84
  },
84
- [sourceTag, borderRadius, contentOffsetY, contentCentered]
85
+ [sourceTag, borderRadius, contentOffsetY, contentCentered],
85
86
  );
86
87
 
87
- const sizeStyle: ViewStyle = {};
88
+ const sourceEntry = getSourceEntry(sourceTag);
89
+
90
+ const containerStyle: ViewStyle = {
91
+ overflow: 'hidden',
92
+ };
93
+ if (sourceEntry?.backgroundColor) {
94
+ containerStyle.backgroundColor = sourceEntry.backgroundColor;
95
+ }
96
+ if (contentCentered) {
97
+ containerStyle.justifyContent = 'center';
98
+ containerStyle.alignItems = 'center';
99
+ }
100
+ if (contentOffsetY) {
101
+ containerStyle.paddingTop = contentOffsetY;
102
+ }
103
+
88
104
  if (width != null) {
89
- sizeStyle.width = width;
105
+ containerStyle.width = width;
90
106
  } else if (sourceSize) {
91
- sizeStyle.width = sourceSize.width;
107
+ containerStyle.width = sourceSize.width;
92
108
  }
93
109
  if (height != null) {
94
- sizeStyle.height = height;
110
+ containerStyle.height = height;
95
111
  } else if (sourceSize) {
96
- sizeStyle.height = sourceSize.height;
112
+ containerStyle.height = sourceSize.height;
113
+ }
114
+
115
+ if (borderRadius) {
116
+ containerStyle.borderRadius = borderRadius;
97
117
  }
98
118
 
99
119
  return (
@@ -104,8 +124,23 @@ export const MorphCardTarget = ({
104
124
  targetWidth={0}
105
125
  targetHeight={0}
106
126
  targetBorderRadius={borderRadius != null ? borderRadius : -1}
107
- style={sizeStyle}
127
+ style={containerStyle}
108
128
  onLayout={handleLayout}
109
- />
129
+ >
130
+ {sourceEntry &&
131
+ !sourceEntry.scaleMode &&
132
+ (sourceEntry.backgroundColor && sourceEntry.layoutWidth ? (
133
+ <View
134
+ style={{
135
+ width: sourceEntry.layoutWidth,
136
+ height: sourceEntry.layoutHeight,
137
+ }}
138
+ >
139
+ {sourceEntry.children}
140
+ </View>
141
+ ) : (
142
+ sourceEntry.children
143
+ ))}
144
+ </NativeTargetView>
110
145
  );
111
146
  };
@@ -0,0 +1,43 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ export interface SourceEntry {
4
+ children: ReactNode;
5
+ backgroundColor?: string;
6
+ scaleMode?: string;
7
+ layoutWidth?: number;
8
+ layoutHeight?: number;
9
+ }
10
+
11
+ const registry = new Map<number, SourceEntry>();
12
+
13
+ export function setSourceEntry(
14
+ tag: number,
15
+ children: ReactNode,
16
+ backgroundColor?: string,
17
+ scaleMode?: string
18
+ ) {
19
+ const existing = registry.get(tag);
20
+ registry.set(tag, {
21
+ children,
22
+ backgroundColor,
23
+ scaleMode,
24
+ layoutWidth: existing?.layoutWidth,
25
+ layoutHeight: existing?.layoutHeight,
26
+ });
27
+ }
28
+
29
+ export function setSourceLayout(tag: number, width: number, height: number) {
30
+ const existing = registry.get(tag);
31
+ if (existing) {
32
+ existing.layoutWidth = width;
33
+ existing.layoutHeight = height;
34
+ }
35
+ }
36
+
37
+ export function getSourceEntry(tag: number): SourceEntry | undefined {
38
+ return registry.get(tag);
39
+ }
40
+
41
+ export function clearSourceEntry(tag: number) {
42
+ registry.delete(tag);
43
+ }
package/src/index.tsx CHANGED
@@ -4,7 +4,7 @@ export {
4
4
  morphCollapse,
5
5
  getViewTag,
6
6
  } from './MorphCardSource';
7
- export type { MorphCardSourceProps, ScaleMode } from './MorphCardSource';
7
+ export type { MorphCardSourceProps, ResizeMode } from './MorphCardSource';
8
8
  export { MorphCardTarget } from './MorphCardTarget';
9
9
  export type { MorphCardTargetProps } from './MorphCardTarget';
10
10
  export { useMorphTarget } from './useMorphTarget';