@hzblj/kara-components 0.15.3 → 0.16.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/CHANGELOG.md +22 -0
- package/lib/module/organisms/context-menu/context-menu.android.js +4 -1
- package/lib/module/organisms/context-menu/context-menu.android.js.map +1 -1
- package/lib/module/organisms/context-menu/context-menu.ios.js +11 -0
- package/lib/module/organisms/context-menu/context-menu.ios.js.map +1 -1
- package/lib/typescript/organisms/context-menu/context-menu.types.d.ts +12 -0
- package/package.json +4 -4
- package/src/organisms/context-menu/context-menu.android.tsx +10 -2
- package/src/organisms/context-menu/context-menu.ios.tsx +16 -0
- package/src/organisms/context-menu/context-menu.types.ts +12 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# @hzblj/kara-components
|
|
2
2
|
|
|
3
|
+
## 0.16.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#49](https://github.com/hzblj/kara-ui/pull/49) [`1b82690`](https://github.com/hzblj/kara-ui/commit/1b826908a729399b4b9ef8038836b60539d1fa41) Thanks [@hzblj](https://github.com/hzblj)! - A tapped `ContextMenu` preview can morph into a screen that is already loaded, the way Apple's apps open a preview. Preload the detail in the new `onOpenChange` (React Navigation's `preload`) and pass its route key as `preloadedScreenId`: the screen is pushed natively in the same frame, and with `zoom` the whole preview grows into it, rounded and shadowed like the menu's platter, while the menu fades away. `pop` and `dismiss` push it as soon as UIKit's commit animation ends. Uses `@hzblj/expo-zoom-transition` 0.2.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- Updated dependencies [[`1b82690`](https://github.com/hzblj/kara-ui/commit/1b826908a729399b4b9ef8038836b60539d1fa41)]:
|
|
12
|
+
- @hzblj/kara-native@0.16.0
|
|
13
|
+
- @hzblj/kara-sx@0.16.0
|
|
14
|
+
- @hzblj/kara-theme@0.16.0
|
|
15
|
+
|
|
16
|
+
## 0.15.4
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependencies [[`15aa9db`](https://github.com/hzblj/kara-ui/commit/15aa9db0b1c22dd4a55cb301982643449ad28dd0)]:
|
|
21
|
+
- @hzblj/kara-native@0.15.4
|
|
22
|
+
- @hzblj/kara-theme@0.15.4
|
|
23
|
+
- @hzblj/kara-sx@0.15.4
|
|
24
|
+
|
|
3
25
|
## 0.15.3
|
|
4
26
|
|
|
5
27
|
### Patch Changes
|
|
@@ -51,7 +51,8 @@ const MenuRow = ({
|
|
|
51
51
|
* Android's own take on a context menu, since Material has no lifted preview: a long press ripples the trigger, ticks
|
|
52
52
|
* the long-press haptic, and opens a Material dropdown where the finger is — the trigger stays highlighted while the
|
|
53
53
|
* menu is up. The host behind the menu mounts on the first long press and stays, so a list of triggers that are only
|
|
54
|
-
* scrolled past never builds one. `preview`, `onPreviewPress
|
|
54
|
+
* scrolled past never builds one. `preview`, `onPreviewPress`, `previewTransition`, `onOpenChange` and
|
|
55
|
+
* `preloadedScreenId` are iOS-only.
|
|
55
56
|
*/
|
|
56
57
|
const ContextMenuRoot = ({
|
|
57
58
|
actions,
|
|
@@ -60,7 +61,9 @@ const ContextMenuRoot = ({
|
|
|
60
61
|
...props
|
|
61
62
|
}) => {
|
|
62
63
|
const {
|
|
64
|
+
onOpenChange: _onOpenChange,
|
|
63
65
|
onPreviewPress: _onPreviewPress,
|
|
66
|
+
preloadedScreenId: _preloadedScreenId,
|
|
64
67
|
preview: _preview,
|
|
65
68
|
previewTransition: _previewTransition,
|
|
66
69
|
...sx
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Text","ComposeText","DropdownMenu","DropdownMenuItem","Host","haptics","useSx","useAppTheme","useCallback","useMemo","useRef","useState","Pressable","StyleSheet","View","Icon","HostBoundary","splitForRipple","jsx","_jsx","jsxs","_jsxs","styles","create","anchor","height","position","width","MenuRow","action","onDismiss","theme","color","destructive","onClick","onPress","children","colorString","style","typography","body","label","icon","LeadingIcon","name","size","ContextMenuRoot","actions","testID","props","onPreviewPress","_onPreviewPress","preview","_preview","previewTransition","_previewTransition","sx","resolved","trigger","setAnchor","expanded","setExpanded","inner","outer","ripple","highlight","backgroundColor","open","event","pageX","pageY","nativeEvent","longPress","current","measure","_x","_y","_width","_height","left","top","x","y","dismiss","android_ripple","onLongPress","ref","pointerEvents","absoluteFill","colorScheme","dark","seedColor","materialSeed","onDismissRequest","Items","map","Exclusion","ContextMenu","Object","assign"],"sourceRoot":"../../../../src","sources":["organisms/context-menu/context-menu.android.tsx"],"mappings":";;AAAA,SAAQA,IAAI,IAAIC,WAAW,EAAEC,YAAY,EAAEC,gBAAgB,EAAEC,IAAI,QAAO,0BAA0B;AAClG,SAAQC,OAAO,QAAO,0BAA0B;AAChD,SAAQC,KAAK,QAAO,gBAAgB;AACpC,SAAQC,WAAW,QAAO,mBAAmB;AAC7C,SAAQC,WAAW,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,QAAO,OAAO;AAC5D,SAAoCC,SAAS,EAAEC,UAAU,EAAEC,IAAI,QAAO,cAAc;AACpF,SAAQC,IAAI,QAAO,2BAAkB;AACrC,SAAQC,YAAY,QAAO,uBAAoB;AAC/C,SAAQC,cAAc,QAAO,sBAAmB;AAAA,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAMhD,MAAMC,MAAM,GAAGT,UAAU,CAACU,MAAM,CAAC;EAC/B;EACAC,MAAM,EAAE;IAACC,MAAM,EAAE,CAAC;IAAEC,QAAQ,EAAE,UAAU;IAAEC,KAAK,EAAE;EAAC;AACpD,CAAC,CAAC;AAOF;AACA,MAAMC,OAAO,GAAGA,CAAC;EAACC,MAAM;EAAEC;AAAuB,CAAC,KAAK;EACrD,MAAMC,KAAK,GAAGxB,WAAW,CAAC,CAAC;EAC3B,MAAMyB,KAAK,GAAGH,MAAM,CAACI,WAAW,GAAG,qBAAqB,GAAG,iBAAiB;EAE5E,MAAMC,OAAO,GAAG1B,WAAW,CAAC,MAAM;IAChCsB,SAAS,CAAC,CAAC;IACXD,MAAM,CAACM,OAAO,CAAC,CAAC;EAClB,CAAC,EAAE,CAACN,MAAM,EAAEC,SAAS,CAAC,CAAC;EAEvB,oBACET,KAAA,CAAClB,gBAAgB;IAAC+B,OAAO,EAAEA,OAAQ;IAAAE,QAAA,gBACjCjB,IAAA,CAAChB,gBAAgB,CAACH,IAAI;MAAAoC,QAAA,eACpBjB,IAAA,CAAClB,WAAW;QAAC+B,KAAK,EAAED,KAAK,CAACM,WAAW,CAACL,KAAK,CAAE;QAACM,KAAK,EAAEP,KAAK,CAACQ,UAAU,CAACC,IAAK;QAAAJ,QAAA,EACxEP,MAAM,CAACY;MAAK,CACF;IAAC,CACO,CAAC,EACvBZ,MAAM,CAACa,IAAI,gBACVvB,IAAA,CAAChB,gBAAgB,CAACwC,WAAW;MAAAP,QAAA,eAC3BjB,IAAA,CAACJ,IAAI;QAACiB,KAAK,EAAEA,KAAM;QAACY,IAAI,EAAEf,MAAM,CAACa,IAAK;QAACG,IAAI,EAAC;MAAK,CAAE;IAAC,CACxB,CAAC,GAC7B,IAAI;EAAA,CACQ,CAAC;AAEvB,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,eAAe,GAAGA,CAAC;EAACC,OAAO;EAAEX,QAAQ;EAAEY,MAAM;EAAE,GAAGC;AAAuB,CAAC,KAAK;EACnF,MAAM;
|
|
1
|
+
{"version":3,"names":["Text","ComposeText","DropdownMenu","DropdownMenuItem","Host","haptics","useSx","useAppTheme","useCallback","useMemo","useRef","useState","Pressable","StyleSheet","View","Icon","HostBoundary","splitForRipple","jsx","_jsx","jsxs","_jsxs","styles","create","anchor","height","position","width","MenuRow","action","onDismiss","theme","color","destructive","onClick","onPress","children","colorString","style","typography","body","label","icon","LeadingIcon","name","size","ContextMenuRoot","actions","testID","props","onOpenChange","_onOpenChange","onPreviewPress","_onPreviewPress","preloadedScreenId","_preloadedScreenId","preview","_preview","previewTransition","_previewTransition","sx","resolved","trigger","setAnchor","expanded","setExpanded","inner","outer","ripple","highlight","backgroundColor","open","event","pageX","pageY","nativeEvent","longPress","current","measure","_x","_y","_width","_height","left","top","x","y","dismiss","android_ripple","onLongPress","ref","pointerEvents","absoluteFill","colorScheme","dark","seedColor","materialSeed","onDismissRequest","Items","map","Exclusion","ContextMenu","Object","assign"],"sourceRoot":"../../../../src","sources":["organisms/context-menu/context-menu.android.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -8,7 +8,9 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
8
8
|
const ContextMenuRoot = ({
|
|
9
9
|
actions,
|
|
10
10
|
children,
|
|
11
|
+
onOpenChange,
|
|
11
12
|
onPreviewPress,
|
|
13
|
+
preloadedScreenId,
|
|
12
14
|
preview,
|
|
13
15
|
previewTransition,
|
|
14
16
|
testID,
|
|
@@ -24,10 +26,19 @@ const ContextMenuRoot = ({
|
|
|
24
26
|
title: action.label
|
|
25
27
|
})), [actions]);
|
|
26
28
|
const onSelectItem = useCallback(id => actions[Number(id)]?.onPress(), [actions]);
|
|
29
|
+
const onMenuOpen = useCallback(() => onOpenChange?.(true), [onOpenChange]);
|
|
30
|
+
const onMenuClose = useCallback(isCommitted => {
|
|
31
|
+
if (!isCommitted) {
|
|
32
|
+
onOpenChange?.(false);
|
|
33
|
+
}
|
|
34
|
+
}, [onOpenChange]);
|
|
27
35
|
return /*#__PURE__*/_jsx(NativeContextMenu, {
|
|
28
36
|
items: items,
|
|
37
|
+
onMenuClose: onOpenChange ? onMenuClose : undefined,
|
|
38
|
+
onMenuOpen: onOpenChange ? onMenuOpen : undefined,
|
|
29
39
|
onPreviewPress: onPreviewPress,
|
|
30
40
|
onSelectItem: onSelectItem,
|
|
41
|
+
preloadedScreenId: preloadedScreenId,
|
|
31
42
|
preview: preview,
|
|
32
43
|
previewTransition: previewTransition,
|
|
33
44
|
style: style,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["iconResourceName","ContextMenu","NativeContextMenu","ContextMenuExclusion","NativeContextMenuExclusion","useSx","useCallback","useMemo","jsx","_jsx","ContextMenuRoot","actions","children","onPreviewPress","preview","previewTransition","testID","sx","style","items","map","action","index","destructive","id","String","image","icon","undefined","title","label","onSelectItem","Number","onPress","Exclusion","Object","assign"],"sourceRoot":"../../../../src","sources":["organisms/context-menu/context-menu.ios.tsx"],"mappings":";;AAAA,SAAQA,gBAAgB,QAAO,0BAA0B;AACzD,SAEEC,WAAW,IAAIC,iBAAiB,EAChCC,oBAAoB,IAAIC,0BAA0B,QAC7C,6BAA6B;AACpC,SAAQC,KAAK,QAAO,gBAAgB;AACpC,SAAQC,WAAW,EAAEC,OAAO,QAAO,OAAO;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAG1C,MAAMC,eAAe,GAAGA,CAAC;EACvBC,OAAO;EACPC,QAAQ;EACRC,cAAc;EACdC,OAAO;EACPC,iBAAiB;EACjBC,MAAM;EACN,GAAGC;AACa,CAAC,KAAK;EACtB,MAAMC,KAAK,
|
|
1
|
+
{"version":3,"names":["iconResourceName","ContextMenu","NativeContextMenu","ContextMenuExclusion","NativeContextMenuExclusion","useSx","useCallback","useMemo","jsx","_jsx","ContextMenuRoot","actions","children","onOpenChange","onPreviewPress","preloadedScreenId","preview","previewTransition","testID","sx","style","items","map","action","index","destructive","id","String","image","icon","undefined","title","label","onSelectItem","Number","onPress","onMenuOpen","onMenuClose","isCommitted","Exclusion","Object","assign"],"sourceRoot":"../../../../src","sources":["organisms/context-menu/context-menu.ios.tsx"],"mappings":";;AAAA,SAAQA,gBAAgB,QAAO,0BAA0B;AACzD,SAEEC,WAAW,IAAIC,iBAAiB,EAChCC,oBAAoB,IAAIC,0BAA0B,QAC7C,6BAA6B;AACpC,SAAQC,KAAK,QAAO,gBAAgB;AACpC,SAAQC,WAAW,EAAEC,OAAO,QAAO,OAAO;AAAA,SAAAC,GAAA,IAAAC,IAAA;AAG1C,MAAMC,eAAe,GAAGA,CAAC;EACvBC,OAAO;EACPC,QAAQ;EACRC,YAAY;EACZC,cAAc;EACdC,iBAAiB;EACjBC,OAAO;EACPC,iBAAiB;EACjBC,MAAM;EACN,GAAGC;AACa,CAAC,KAAK;EACtB,MAAMC,KAAK,GAAGf,KAAK,CAACc,EAAE,CAAC;;EAEvB;EACA,MAAME,KAAK,GAAGd,OAAO,CACnB,MACEI,OAAO,CAACW,GAAG,CAAC,CAACC,MAAM,EAAEC,KAAK,MAAM;IAC9BC,WAAW,EAAEF,MAAM,CAACE,WAAW;IAC/BC,EAAE,EAAEC,MAAM,CAACH,KAAK,CAAC;IACjBI,KAAK,EAAEL,MAAM,CAACM,IAAI,GAAG7B,gBAAgB,CAACuB,MAAM,CAACM,IAAI,CAAC,GAAGC,SAAS;IAC9DC,KAAK,EAAER,MAAM,CAACS;EAChB,CAAC,CAAC,CAAC,EACL,CAACrB,OAAO,CACV,CAAC;EAED,MAAMsB,YAAY,GAAG3B,WAAW,CAAEoB,EAAU,IAAKf,OAAO,CAACuB,MAAM,CAACR,EAAE,CAAC,CAAC,EAAES,OAAO,CAAC,CAAC,EAAE,CAACxB,OAAO,CAAC,CAAC;EAE3F,MAAMyB,UAAU,GAAG9B,WAAW,CAAC,MAAMO,YAAY,GAAG,IAAI,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;EAE1E,MAAMwB,WAAW,GAAG/B,WAAW,CAC5BgC,WAAoB,IAAK;IACxB,IAAI,CAACA,WAAW,EAAE;MAChBzB,YAAY,GAAG,KAAK,CAAC;IACvB;EACF,CAAC,EACD,CAACA,YAAY,CACf,CAAC;EAED,oBACEJ,IAAA,CAACP,iBAAiB;IAChBmB,KAAK,EAAEA,KAAM;IACbgB,WAAW,EAAExB,YAAY,GAAGwB,WAAW,GAAGP,SAAU;IACpDM,UAAU,EAAEvB,YAAY,GAAGuB,UAAU,GAAGN,SAAU;IAClDhB,cAAc,EAAEA,cAAe;IAC/BmB,YAAY,EAAEA,YAAa;IAC3BlB,iBAAiB,EAAEA,iBAAkB;IACrCC,OAAO,EAAEA,OAAQ;IACjBC,iBAAiB,EAAEA,iBAAkB;IACrCG,KAAK,EAAEA,KAAM;IACbF,MAAM,EAAEA,MAAO;IAAAN,QAAA,EAEdA;EAAQ,CACQ,CAAC;AAExB,CAAC;AAED,MAAM2B,SAAS,GAAGA,CAAC;EAAC3B;AAAmC,CAAC,kBACtDH,IAAA,CAACL,0BAA0B;EAAAQ,QAAA,EAAEA;AAAQ,CAA6B,CACnE;AAED,OAAO,MAAMX,WAAiC,GAAGuC,MAAM,CAACC,MAAM,CAAC/B,eAAe,EAAE;EAAC6B;AAAS,CAAC,CAAC","ignoreList":[]}
|
|
@@ -13,8 +13,20 @@ export type ContextMenuProps = ResponsiveViewSx & {
|
|
|
13
13
|
actions: MenuAction[];
|
|
14
14
|
/** The trigger, laid out as usual. */
|
|
15
15
|
children: ReactNode;
|
|
16
|
+
/**
|
|
17
|
+
* iOS: `true` when the menu appears, `false` when it ends without a tap on the preview. Preload the detail the card
|
|
18
|
+
* stands for here, and drop the preload on `false`.
|
|
19
|
+
*/
|
|
20
|
+
onOpenChange?: (isOpen: boolean) => void;
|
|
16
21
|
/** iOS: the user tapped the lifted preview, committing to it. Open the detail the card stands for. */
|
|
17
22
|
onPreviewPress?: () => void;
|
|
23
|
+
/**
|
|
24
|
+
* iOS: the route key of that detail, preloaded in the enclosing native stack while the menu is open (React
|
|
25
|
+
* Navigation's `preload`, Expo Router's `router.prefetch`). A tapped preview pushes it natively in the same frame
|
|
26
|
+
* and, with `zoom`, morphs the whole preview into it, the way Apple's apps open a preview. Move the route into the
|
|
27
|
+
* stack in `onPreviewPress`.
|
|
28
|
+
*/
|
|
29
|
+
preloadedScreenId?: string;
|
|
18
30
|
/**
|
|
19
31
|
* iOS: lifted in place of the trigger while the menu is open (a larger version of the card, say). A snapshot of the
|
|
20
32
|
* trigger when unset. Mounted only once a finger has rested on the trigger, so a list of cards does not pay for
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hzblj/kara-components",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.0",
|
|
4
4
|
"description": "The atoms, molecules, organisms and templates of @hzblj/kara-ui — real SwiftUI and Jetpack Compose views through @expo/ui.",
|
|
5
5
|
"author": "Jan Blazej",
|
|
6
6
|
"license": "MIT",
|
|
@@ -61,9 +61,9 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@hzblj/expo-native-icons": "^0.1.0",
|
|
63
63
|
"@hzblj/expo-rich-haptics": "^0.1.0",
|
|
64
|
-
"@hzblj/kara-native": "^0.
|
|
65
|
-
"@hzblj/kara-sx": "^0.
|
|
66
|
-
"@hzblj/kara-theme": "^0.
|
|
64
|
+
"@hzblj/kara-native": "^0.16.0",
|
|
65
|
+
"@hzblj/kara-sx": "^0.16.0",
|
|
66
|
+
"@hzblj/kara-theme": "^0.16.0",
|
|
67
67
|
"sf-symbols-typescript": "^2.2.0"
|
|
68
68
|
},
|
|
69
69
|
"peerDependencies": {
|
|
@@ -52,10 +52,18 @@ const MenuRow = ({action, onDismiss}: MenuRowProps) => {
|
|
|
52
52
|
* Android's own take on a context menu, since Material has no lifted preview: a long press ripples the trigger, ticks
|
|
53
53
|
* the long-press haptic, and opens a Material dropdown where the finger is — the trigger stays highlighted while the
|
|
54
54
|
* menu is up. The host behind the menu mounts on the first long press and stays, so a list of triggers that are only
|
|
55
|
-
* scrolled past never builds one. `preview`, `onPreviewPress
|
|
55
|
+
* scrolled past never builds one. `preview`, `onPreviewPress`, `previewTransition`, `onOpenChange` and
|
|
56
|
+
* `preloadedScreenId` are iOS-only.
|
|
56
57
|
*/
|
|
57
58
|
const ContextMenuRoot = ({actions, children, testID, ...props}: ContextMenuProps) => {
|
|
58
|
-
const {
|
|
59
|
+
const {
|
|
60
|
+
onOpenChange: _onOpenChange,
|
|
61
|
+
onPreviewPress: _onPreviewPress,
|
|
62
|
+
preloadedScreenId: _preloadedScreenId,
|
|
63
|
+
preview: _preview,
|
|
64
|
+
previewTransition: _previewTransition,
|
|
65
|
+
...sx
|
|
66
|
+
} = props
|
|
59
67
|
const theme = useAppTheme()
|
|
60
68
|
const resolved = useSx(sx)
|
|
61
69
|
const trigger = useRef<View>(null)
|
|
@@ -11,7 +11,9 @@ import type {ContextMenuComponent, ContextMenuExclusionProps, ContextMenuProps}
|
|
|
11
11
|
const ContextMenuRoot = ({
|
|
12
12
|
actions,
|
|
13
13
|
children,
|
|
14
|
+
onOpenChange,
|
|
14
15
|
onPreviewPress,
|
|
16
|
+
preloadedScreenId,
|
|
15
17
|
preview,
|
|
16
18
|
previewTransition,
|
|
17
19
|
testID,
|
|
@@ -33,11 +35,25 @@ const ContextMenuRoot = ({
|
|
|
33
35
|
|
|
34
36
|
const onSelectItem = useCallback((id: string) => actions[Number(id)]?.onPress(), [actions])
|
|
35
37
|
|
|
38
|
+
const onMenuOpen = useCallback(() => onOpenChange?.(true), [onOpenChange])
|
|
39
|
+
|
|
40
|
+
const onMenuClose = useCallback(
|
|
41
|
+
(isCommitted: boolean) => {
|
|
42
|
+
if (!isCommitted) {
|
|
43
|
+
onOpenChange?.(false)
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
[onOpenChange]
|
|
47
|
+
)
|
|
48
|
+
|
|
36
49
|
return (
|
|
37
50
|
<NativeContextMenu
|
|
38
51
|
items={items}
|
|
52
|
+
onMenuClose={onOpenChange ? onMenuClose : undefined}
|
|
53
|
+
onMenuOpen={onOpenChange ? onMenuOpen : undefined}
|
|
39
54
|
onPreviewPress={onPreviewPress}
|
|
40
55
|
onSelectItem={onSelectItem}
|
|
56
|
+
preloadedScreenId={preloadedScreenId}
|
|
41
57
|
preview={preview}
|
|
42
58
|
previewTransition={previewTransition}
|
|
43
59
|
style={style}
|
|
@@ -14,8 +14,20 @@ export type ContextMenuProps = ResponsiveViewSx & {
|
|
|
14
14
|
actions: MenuAction[]
|
|
15
15
|
/** The trigger, laid out as usual. */
|
|
16
16
|
children: ReactNode
|
|
17
|
+
/**
|
|
18
|
+
* iOS: `true` when the menu appears, `false` when it ends without a tap on the preview. Preload the detail the card
|
|
19
|
+
* stands for here, and drop the preload on `false`.
|
|
20
|
+
*/
|
|
21
|
+
onOpenChange?: (isOpen: boolean) => void
|
|
17
22
|
/** iOS: the user tapped the lifted preview, committing to it. Open the detail the card stands for. */
|
|
18
23
|
onPreviewPress?: () => void
|
|
24
|
+
/**
|
|
25
|
+
* iOS: the route key of that detail, preloaded in the enclosing native stack while the menu is open (React
|
|
26
|
+
* Navigation's `preload`, Expo Router's `router.prefetch`). A tapped preview pushes it natively in the same frame
|
|
27
|
+
* and, with `zoom`, morphs the whole preview into it, the way Apple's apps open a preview. Move the route into the
|
|
28
|
+
* stack in `onPreviewPress`.
|
|
29
|
+
*/
|
|
30
|
+
preloadedScreenId?: string
|
|
19
31
|
/**
|
|
20
32
|
* iOS: lifted in place of the trigger while the menu is open (a larger version of the card, say). A snapshot of the
|
|
21
33
|
* trigger when unset. Mounted only once a finger has rested on the trigger, so a list of cards does not pay for
|