react-panel-layout 0.6.0 → 0.6.1
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/dist/{FloatingPanelFrame-SgYLc6Ud.js → FloatingPanelFrame-3eU9AwPo.js} +2 -2
- package/dist/{FloatingPanelFrame-SgYLc6Ud.js.map → FloatingPanelFrame-3eU9AwPo.js.map} +1 -1
- package/dist/FloatingWindow-CUXnEtrb.js +827 -0
- package/dist/FloatingWindow-CUXnEtrb.js.map +1 -0
- package/dist/FloatingWindow-DMwyK0eK.cjs +2 -0
- package/dist/FloatingWindow-DMwyK0eK.cjs.map +1 -0
- package/dist/GridLayout-DKTg_N61.cjs +2 -0
- package/dist/{GridLayout-B4VRsC0r.cjs.map → GridLayout-DKTg_N61.cjs.map} +1 -1
- package/dist/{GridLayout-BltqeCPK.js → GridLayout-UWNxXw77.js} +34 -35
- package/dist/{GridLayout-BltqeCPK.js.map → GridLayout-UWNxXw77.js.map} +1 -1
- package/dist/{HorizontalDivider-WF1k_qND.js → HorizontalDivider-DdxzfV0l.js} +3 -3
- package/dist/{HorizontalDivider-WF1k_qND.js.map → HorizontalDivider-DdxzfV0l.js.map} +1 -1
- package/dist/{HorizontalDivider-B5Z-KZLk.cjs → HorizontalDivider-_pgV4Mcv.cjs} +2 -2
- package/dist/{HorizontalDivider-B5Z-KZLk.cjs.map → HorizontalDivider-_pgV4Mcv.cjs.map} +1 -1
- package/dist/{PanelSystem-Dr1TBhxM.js → PanelSystem-BqUzNtf2.js} +5 -5
- package/dist/{PanelSystem-Dr1TBhxM.js.map → PanelSystem-BqUzNtf2.js.map} +1 -1
- package/dist/{PanelSystem-Bs8bQwQF.cjs → PanelSystem-D603LKKv.cjs} +2 -2
- package/dist/{PanelSystem-Bs8bQwQF.cjs.map → PanelSystem-D603LKKv.cjs.map} +1 -1
- package/dist/ResizeHandle-CBcAS918.cjs +2 -0
- package/dist/{ResizeHandle-CScipO5l.cjs.map → ResizeHandle-CBcAS918.cjs.map} +1 -1
- package/dist/{ResizeHandle-CdA_JYfN.js → ResizeHandle-CXjc1meV.js} +28 -29
- package/dist/{ResizeHandle-CdA_JYfN.js.map → ResizeHandle-CXjc1meV.js.map} +1 -1
- package/dist/SwipePivotTabBar-DWrCuwEI.js +411 -0
- package/dist/SwipePivotTabBar-DWrCuwEI.js.map +1 -0
- package/dist/SwipePivotTabBar-fjjXkpj7.cjs +2 -0
- package/dist/SwipePivotTabBar-fjjXkpj7.cjs.map +1 -0
- package/dist/components/gesture/SwipeSafeZone.d.ts +40 -0
- package/dist/components/window/Drawer.d.ts +3 -1
- package/dist/components/window/DrawerLayers.d.ts +1 -1
- package/dist/components/window/drawerStyles.d.ts +69 -0
- package/dist/components/window/drawerSwipeConfig.d.ts +29 -0
- package/dist/components/window/useDrawerSwipeTransform.d.ts +23 -0
- package/dist/config.cjs +1 -1
- package/dist/config.js +3 -3
- package/dist/constants/styles.d.ts +17 -0
- package/dist/dialog/index.d.ts +69 -0
- package/dist/floating.js +1 -1
- package/dist/grid.cjs +1 -1
- package/dist/grid.js +2 -2
- package/dist/hooks/gesture/testing/createGestureSimulator.d.ts +7 -0
- package/dist/hooks/gesture/types.d.ts +48 -5
- package/dist/hooks/gesture/utils.d.ts +19 -0
- package/dist/hooks/useAnimationFrame.d.ts +2 -0
- package/dist/hooks/useOperationContinuity.d.ts +64 -0
- package/dist/hooks/useResizeObserver.d.ts +33 -1
- package/dist/hooks/useSharedElementTransition.d.ts +112 -0
- package/dist/hooks/useSwipeContentTransform.d.ts +9 -2
- package/dist/index.cjs +1 -1
- package/dist/index.js +7 -7
- package/dist/modules/dialog/AlertDialog.d.ts +9 -0
- package/dist/modules/dialog/DialogContainer.d.ts +37 -0
- package/dist/modules/dialog/Modal.d.ts +26 -0
- package/dist/modules/dialog/SwipeDialogContainer.d.ts +16 -0
- package/dist/modules/dialog/dialogAnimationUtils.d.ts +113 -0
- package/dist/modules/dialog/types.d.ts +183 -0
- package/dist/modules/dialog/useDialog.d.ts +39 -0
- package/dist/modules/dialog/useDialogContainer.d.ts +47 -0
- package/dist/modules/dialog/useDialogSwipeInput.d.ts +70 -0
- package/dist/modules/dialog/useDialogTransform.d.ts +82 -0
- package/dist/modules/drawer/types.d.ts +74 -0
- package/dist/modules/drawer/useDrawerSwipeInput.d.ts +24 -0
- package/dist/modules/pivot/SwipePivotTabBar.d.ts +3 -0
- package/dist/modules/stack/SwipeStackContent.d.ts +6 -3
- package/dist/modules/stack/SwipeStackOutlet.d.ts +4 -4
- package/dist/modules/stack/computeSwipeStackTransform.d.ts +1 -1
- package/dist/panels.cjs +1 -1
- package/dist/panels.js +1 -1
- package/dist/pivot.cjs +1 -1
- package/dist/pivot.js +1 -1
- package/dist/resizer.cjs +1 -1
- package/dist/resizer.js +2 -2
- package/dist/stack.cjs +1 -1
- package/dist/stack.cjs.map +1 -1
- package/dist/stack.js +503 -762
- package/dist/stack.js.map +1 -1
- package/dist/sticky-header/calculateStickyMetrics.d.ts +28 -0
- package/dist/sticky-header.cjs +1 -1
- package/dist/sticky-header.cjs.map +1 -1
- package/dist/sticky-header.js +59 -51
- package/dist/sticky-header.js.map +1 -1
- package/dist/{styles-DPPuJ0sf.js → styles-NkjuMOVS.js} +13 -13
- package/dist/{styles-DPPuJ0sf.js.map → styles-NkjuMOVS.js.map} +1 -1
- package/dist/styles-qf6ptVLD.cjs.map +1 -1
- package/dist/types.d.ts +16 -0
- package/dist/useDocumentPointerEvents-DXxw3qWj.js +54 -0
- package/dist/useDocumentPointerEvents-DXxw3qWj.js.map +1 -0
- package/dist/useDocumentPointerEvents-DxDSOtip.cjs +2 -0
- package/dist/useDocumentPointerEvents-DxDSOtip.cjs.map +1 -0
- package/dist/useNativeGestureGuard-C7TSqEkr.cjs +2 -0
- package/dist/useNativeGestureGuard-C7TSqEkr.cjs.map +1 -0
- package/dist/useNativeGestureGuard-CGYo6O0r.js +347 -0
- package/dist/useNativeGestureGuard-CGYo6O0r.js.map +1 -0
- package/dist/window/index.d.ts +2 -0
- package/dist/window.cjs +1 -1
- package/dist/window.cjs.map +1 -1
- package/dist/window.js +114 -103
- package/dist/window.js.map +1 -1
- package/package.json +6 -1
- package/src/components/gesture/SwipeSafeZone.tsx +69 -0
- package/src/components/window/Drawer.tsx +249 -162
- package/src/components/window/DrawerLayers.tsx +13 -3
- package/src/components/window/drawerStyles.spec.ts +263 -0
- package/src/components/window/drawerStyles.ts +228 -0
- package/src/components/window/drawerSwipeConfig.spec.ts +131 -0
- package/src/components/window/drawerSwipeConfig.ts +112 -0
- package/src/components/window/useDrawerSwipeTransform.spec.ts +234 -0
- package/src/components/window/useDrawerSwipeTransform.ts +129 -0
- package/src/constants/styles.ts +19 -0
- package/src/demo/pages/Dialog/alerts/index.tsx +22 -0
- package/src/demo/pages/Dialog/card/index.tsx +22 -0
- package/src/demo/pages/Dialog/components/AlertDialogDemo.tsx +124 -0
- package/src/demo/pages/Dialog/components/CardExpandDemo.module.css +243 -0
- package/src/demo/pages/Dialog/components/CardExpandDemo.tsx +204 -0
- package/src/demo/pages/Dialog/components/CustomAlertDialogDemo.tsx +219 -0
- package/src/demo/pages/Dialog/components/DialogDemos.module.css +77 -0
- package/src/demo/pages/Dialog/components/ModalBasics.tsx +45 -0
- package/src/demo/pages/Dialog/components/SwipeDialogDemo.module.css +77 -0
- package/src/demo/pages/Dialog/components/SwipeDialogDemo.tsx +181 -0
- package/src/demo/pages/Dialog/custom-alert/index.tsx +22 -0
- package/src/demo/pages/Dialog/modal/index.tsx +17 -0
- package/src/demo/pages/Dialog/swipe/index.tsx +22 -0
- package/src/demo/pages/Drawer/components/DrawerSwipe.module.css +316 -0
- package/src/demo/pages/Drawer/components/DrawerSwipe.tsx +178 -0
- package/src/demo/pages/Drawer/swipe/index.tsx +17 -0
- package/src/demo/pages/Pivot/components/SwipeTabsPivot.tsx +54 -23
- package/src/demo/pages/Pivot/swipe-debug/index.tsx +1 -1
- package/src/demo/pages/Stack/components/StackBasics.spec.tsx +152 -0
- package/src/demo/pages/Stack/components/StackBasics.tsx +179 -95
- package/src/demo/pages/Stack/components/StackTablet.spec.tsx +120 -0
- package/src/demo/pages/Stack/components/StackTablet.tsx +42 -21
- package/src/demo/routes.tsx +22 -1
- package/src/dialog/index.ts +85 -0
- package/src/hooks/gesture/testing/createGestureSimulator.spec.ts +68 -64
- package/src/hooks/gesture/testing/createGestureSimulator.ts +112 -37
- package/src/hooks/gesture/types.ts +83 -6
- package/src/hooks/gesture/useEdgeSwipeInput.spec.ts +22 -14
- package/src/hooks/gesture/useNativeGestureGuard.spec.ts +91 -31
- package/src/hooks/gesture/useNativeGestureGuard.ts +3 -1
- package/src/hooks/gesture/utils.ts +91 -0
- package/src/hooks/useAnimatedVisibility.spec.ts +44 -24
- package/src/hooks/useAnimatedVisibility.ts +28 -2
- package/src/hooks/useAnimationFrame.ts +8 -0
- package/src/hooks/useOperationContinuity.spec.ts +387 -0
- package/src/hooks/useOperationContinuity.ts +135 -0
- package/src/hooks/useResizeObserver.spec.tsx +277 -0
- package/src/hooks/useResizeObserver.tsx +108 -39
- package/src/hooks/useScrollContainer.ts +4 -10
- package/src/hooks/useSharedElementTransition.ts +333 -0
- package/src/hooks/useSwipeContentTransform.spec.ts +18 -18
- package/src/hooks/useSwipeContentTransform.ts +166 -28
- package/src/modules/dialog/AlertDialog.spec.tsx +387 -0
- package/src/modules/dialog/AlertDialog.tsx +221 -0
- package/src/modules/dialog/DialogContainer.spec.tsx +228 -0
- package/src/modules/dialog/DialogContainer.tsx +188 -0
- package/src/modules/dialog/Modal.spec.tsx +220 -0
- package/src/modules/dialog/Modal.tsx +182 -0
- package/src/modules/dialog/SwipeDialogContainer.tsx +208 -0
- package/src/modules/dialog/dialogAnimationUtils.spec.ts +253 -0
- package/src/modules/dialog/dialogAnimationUtils.ts +297 -0
- package/src/modules/dialog/types.ts +186 -0
- package/src/modules/dialog/useDialog.spec.tsx +447 -0
- package/src/modules/dialog/useDialog.ts +214 -0
- package/src/modules/dialog/useDialogContainer.spec.ts +331 -0
- package/src/modules/dialog/useDialogContainer.ts +150 -0
- package/src/modules/dialog/useDialogSwipeInput.spec.ts +157 -0
- package/src/modules/dialog/useDialogSwipeInput.ts +319 -0
- package/src/modules/dialog/useDialogTransform.spec.ts +370 -0
- package/src/modules/dialog/useDialogTransform.ts +407 -0
- package/src/modules/drawer/types.ts +102 -0
- package/src/modules/drawer/useDrawerSwipeInput.spec.ts +566 -0
- package/src/modules/drawer/useDrawerSwipeInput.ts +399 -0
- package/src/modules/panels/rendering/ContentRegistry.spec.tsx +21 -14
- package/src/modules/pivot/SwipePivotContent.position.spec.tsx +12 -8
- package/src/modules/pivot/SwipePivotContent.spec.tsx +55 -25
- package/src/modules/pivot/SwipePivotContent.tsx +2 -2
- package/src/modules/pivot/SwipePivotTabBar.spec.tsx +85 -68
- package/src/modules/pivot/SwipePivotTabBar.tsx +75 -15
- package/src/modules/pivot/scaleInputState.spec.ts +11 -2
- package/src/modules/pivot/usePivot.spec.ts +17 -3
- package/src/modules/pivot/usePivotSwipeInput.spec.ts +182 -123
- package/src/modules/stack/SwipeStackContent.spec.tsx +387 -100
- package/src/modules/stack/SwipeStackContent.tsx +43 -33
- package/src/modules/stack/SwipeStackOutlet.spec.tsx +14 -16
- package/src/modules/stack/SwipeStackOutlet.tsx +6 -6
- package/src/modules/stack/computeSwipeStackTransform.spec.ts +5 -5
- package/src/modules/stack/computeSwipeStackTransform.ts +3 -3
- package/src/modules/stack/swipeTransitionContinuity.spec.tsx +1133 -0
- package/src/modules/stack/useStackAnimationState.spec.ts +3 -1
- package/src/modules/stack/useStackAnimationState.ts +18 -13
- package/src/modules/stack/useStackNavigation.spec.ts +198 -3
- package/src/modules/stack/useStackNavigation.tsx +113 -56
- package/src/modules/stack/useStackSwipeInput.spec.ts +65 -32
- package/src/modules/stack/useStackSwipeInput.ts +1 -1
- package/src/sticky-header/StickyArea.tsx +29 -57
- package/src/sticky-header/calculateStickyMetrics.spec.ts +105 -0
- package/src/sticky-header/calculateStickyMetrics.ts +50 -0
- package/src/types.ts +18 -0
- package/src/window/index.ts +2 -0
- package/dist/FloatingWindow-BpdOpg_L.js +0 -400
- package/dist/FloatingWindow-BpdOpg_L.js.map +0 -1
- package/dist/FloatingWindow-TCDNY5gE.cjs +0 -2
- package/dist/FloatingWindow-TCDNY5gE.cjs.map +0 -1
- package/dist/GridLayout-B4VRsC0r.cjs +0 -2
- package/dist/ResizeHandle-CScipO5l.cjs +0 -2
- package/dist/SwipePivotTabBar-BGO9X94m.js +0 -407
- package/dist/SwipePivotTabBar-BGO9X94m.js.map +0 -1
- package/dist/SwipePivotTabBar-BrQismcZ.cjs +0 -2
- package/dist/SwipePivotTabBar-BrQismcZ.cjs.map +0 -1
- package/dist/useDocumentPointerEvents-CKdhGXd0.js +0 -46
- package/dist/useDocumentPointerEvents-CKdhGXd0.js.map +0 -1
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs +0 -2
- package/dist/useDocumentPointerEvents-ChqrKXDk.cjs.map +0 -1
- package/dist/useEffectEvent-Dp7HLCf0.js +0 -13
- package/dist/useEffectEvent-Dp7HLCf0.js.map +0 -1
- package/dist/useEffectEvent-huSsGUnl.cjs +0 -2
- package/dist/useEffectEvent-huSsGUnl.cjs.map +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
.container {
|
|
2
|
+
padding: 24px;
|
|
3
|
+
min-height: 400px;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
.section {
|
|
7
|
+
margin-bottom: 24px;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.section h3 {
|
|
11
|
+
margin: 0 0 8px 0;
|
|
12
|
+
font-size: 18px;
|
|
13
|
+
font-weight: 600;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.section p {
|
|
17
|
+
margin: 0 0 16px 0;
|
|
18
|
+
color: #666;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.modalContent {
|
|
22
|
+
min-width: 300px;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.modalContent p {
|
|
26
|
+
margin: 0 0 16px 0;
|
|
27
|
+
color: #666;
|
|
28
|
+
line-height: 1.5;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.formGroup {
|
|
32
|
+
margin-bottom: 16px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.formGroup label {
|
|
36
|
+
display: block;
|
|
37
|
+
margin-bottom: 4px;
|
|
38
|
+
font-weight: 500;
|
|
39
|
+
font-size: 14px;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.input {
|
|
43
|
+
width: 100%;
|
|
44
|
+
padding: 8px 12px;
|
|
45
|
+
border: 1px solid #e5e7eb;
|
|
46
|
+
border-radius: 4px;
|
|
47
|
+
font-size: 14px;
|
|
48
|
+
box-sizing: border-box;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.input:focus {
|
|
52
|
+
outline: none;
|
|
53
|
+
border-color: #2196f3;
|
|
54
|
+
box-shadow: 0 0 0 2px rgba(33, 150, 243, 0.1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.buttonRow {
|
|
58
|
+
display: flex;
|
|
59
|
+
justify-content: flex-end;
|
|
60
|
+
gap: 8px;
|
|
61
|
+
margin-top: 24px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.resultBox {
|
|
65
|
+
margin-top: 16px;
|
|
66
|
+
padding: 12px;
|
|
67
|
+
background: #f5f5f5;
|
|
68
|
+
border-radius: 4px;
|
|
69
|
+
font-family: monospace;
|
|
70
|
+
font-size: 13px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.buttonGroup {
|
|
74
|
+
display: flex;
|
|
75
|
+
flex-wrap: wrap;
|
|
76
|
+
gap: 8px;
|
|
77
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Modal basics demo
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { Modal } from "../../../../modules/dialog/Modal";
|
|
6
|
+
import { DemoButton } from "../../../components/ui/DemoButton";
|
|
7
|
+
import styles from "./DialogDemos.module.css";
|
|
8
|
+
|
|
9
|
+
export const ModalBasics: React.FC = () => {
|
|
10
|
+
const [isOpen, setIsOpen] = React.useState(false);
|
|
11
|
+
|
|
12
|
+
return (
|
|
13
|
+
<div className={styles.container}>
|
|
14
|
+
<div className={styles.section}>
|
|
15
|
+
<h3>Basic Modal</h3>
|
|
16
|
+
<p>A simple modal dialog centered on the screen. Click outside or press Escape to close.</p>
|
|
17
|
+
<DemoButton variant="primary" size="md" onClick={() => setIsOpen(true)}>
|
|
18
|
+
Open Modal
|
|
19
|
+
</DemoButton>
|
|
20
|
+
</div>
|
|
21
|
+
|
|
22
|
+
<Modal visible={isOpen} onClose={() => setIsOpen(false)} header={{ title: "Settings" }}>
|
|
23
|
+
<div className={styles.modalContent}>
|
|
24
|
+
<p>This is a modal dialog. It uses the native HTML dialog element to ensure it appears above all other content.</p>
|
|
25
|
+
<div className={styles.formGroup}>
|
|
26
|
+
<label>Username</label>
|
|
27
|
+
<input type="text" placeholder="Enter username" className={styles.input} />
|
|
28
|
+
</div>
|
|
29
|
+
<div className={styles.formGroup}>
|
|
30
|
+
<label>Email</label>
|
|
31
|
+
<input type="email" placeholder="Enter email" className={styles.input} />
|
|
32
|
+
</div>
|
|
33
|
+
<div className={styles.buttonRow}>
|
|
34
|
+
<DemoButton variant="secondary" size="md" onClick={() => setIsOpen(false)}>
|
|
35
|
+
Cancel
|
|
36
|
+
</DemoButton>
|
|
37
|
+
<DemoButton variant="primary" size="md" onClick={() => setIsOpen(false)}>
|
|
38
|
+
Save
|
|
39
|
+
</DemoButton>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
</Modal>
|
|
43
|
+
</div>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
.container {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
gap: 16px;
|
|
5
|
+
padding: 24px;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.section {
|
|
9
|
+
margin-bottom: 24px;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.label {
|
|
13
|
+
font-size: 12px;
|
|
14
|
+
font-weight: 600;
|
|
15
|
+
color: var(--color-text-secondary, #6b7280);
|
|
16
|
+
margin-bottom: 8px;
|
|
17
|
+
text-transform: uppercase;
|
|
18
|
+
letter-spacing: 0.05em;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.buttonGroup {
|
|
22
|
+
display: flex;
|
|
23
|
+
gap: 12px;
|
|
24
|
+
flex-wrap: wrap;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.modalContent {
|
|
28
|
+
padding: 24px;
|
|
29
|
+
min-height: 200px;
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
gap: 16px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.scrollableContent {
|
|
36
|
+
padding: 24px;
|
|
37
|
+
height: 400px;
|
|
38
|
+
overflow: auto;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.infoBox {
|
|
42
|
+
padding: 16px;
|
|
43
|
+
background-color: rgba(59, 130, 246, 0.1);
|
|
44
|
+
border-radius: 8px;
|
|
45
|
+
font-size: 14px;
|
|
46
|
+
line-height: 1.6;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.actionSheet {
|
|
50
|
+
width: 100%;
|
|
51
|
+
max-width: 400px;
|
|
52
|
+
background-color: var(--color-bg-primary, #fff);
|
|
53
|
+
border-radius: 16px 16px 0 0;
|
|
54
|
+
overflow: hidden;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.actionItem {
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 12px;
|
|
61
|
+
width: 100%;
|
|
62
|
+
padding: 16px 20px;
|
|
63
|
+
border: none;
|
|
64
|
+
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
|
|
65
|
+
background-color: transparent;
|
|
66
|
+
font-size: 16px;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
text-align: left;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.actionItem:hover {
|
|
72
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.actionIcon {
|
|
76
|
+
font-size: 20px;
|
|
77
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file SwipeDialogDemo - Demonstration of swipeable dialog functionality
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { Modal } from "../../../../modules/dialog/Modal.js";
|
|
6
|
+
import { DialogContainer } from "../../../../modules/dialog/DialogContainer.js";
|
|
7
|
+
import {
|
|
8
|
+
FloatingPanelFrame,
|
|
9
|
+
FloatingPanelHeader,
|
|
10
|
+
FloatingPanelTitle,
|
|
11
|
+
FloatingPanelContent,
|
|
12
|
+
} from "../../../../components/paneling/FloatingPanelFrame.js";
|
|
13
|
+
import { DemoButton } from "../../../components/ui/DemoButton.js";
|
|
14
|
+
import styles from "./SwipeDialogDemo.module.css";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Demo component for swipeable dialogs
|
|
18
|
+
*/
|
|
19
|
+
export const SwipeDialogDemo: React.FC = () => {
|
|
20
|
+
const [bottomModal, setBottomModal] = React.useState(false);
|
|
21
|
+
const [centerModal, setCenterModal] = React.useState(false);
|
|
22
|
+
const [scrollableModal, setScrollableModal] = React.useState(false);
|
|
23
|
+
const [customSheet, setCustomSheet] = React.useState(false);
|
|
24
|
+
|
|
25
|
+
return (
|
|
26
|
+
<div className={styles.container}>
|
|
27
|
+
{/* Bottom Sheet Style */}
|
|
28
|
+
<div className={styles.section}>
|
|
29
|
+
<div className={styles.label}>Bottom Sheet (Swipe Down)</div>
|
|
30
|
+
<div className={styles.buttonGroup}>
|
|
31
|
+
<DemoButton onClick={() => setBottomModal(true)}>
|
|
32
|
+
Open Bottom Sheet
|
|
33
|
+
</DemoButton>
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
{/* Center Modal with Swipe */}
|
|
38
|
+
<div className={styles.section}>
|
|
39
|
+
<div className={styles.label}>Center Modal (Swipe Down)</div>
|
|
40
|
+
<div className={styles.buttonGroup}>
|
|
41
|
+
<DemoButton variant="secondary" onClick={() => setCenterModal(true)}>
|
|
42
|
+
Open Center Modal
|
|
43
|
+
</DemoButton>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
|
|
47
|
+
{/* Scrollable Content */}
|
|
48
|
+
<div className={styles.section}>
|
|
49
|
+
<div className={styles.label}>With Scrollable Content</div>
|
|
50
|
+
<div className={styles.buttonGroup}>
|
|
51
|
+
<DemoButton variant="secondary" onClick={() => setScrollableModal(true)}>
|
|
52
|
+
Open Scrollable Modal
|
|
53
|
+
</DemoButton>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
|
|
57
|
+
{/* Custom Action Sheet */}
|
|
58
|
+
<div className={styles.section}>
|
|
59
|
+
<div className={styles.label}>Custom Action Sheet</div>
|
|
60
|
+
<div className={styles.buttonGroup}>
|
|
61
|
+
<DemoButton onClick={() => setCustomSheet(true)}>
|
|
62
|
+
Open Action Sheet
|
|
63
|
+
</DemoButton>
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
{/* Bottom Sheet Modal */}
|
|
68
|
+
<Modal
|
|
69
|
+
visible={bottomModal}
|
|
70
|
+
onClose={() => setBottomModal(false)}
|
|
71
|
+
transitionMode="swipe"
|
|
72
|
+
openDirection="bottom"
|
|
73
|
+
swipeDismissible={true}
|
|
74
|
+
header={{ title: "Bottom Sheet" }}
|
|
75
|
+
width={400}
|
|
76
|
+
>
|
|
77
|
+
<div className={styles.modalContent}>
|
|
78
|
+
<div className={styles.infoBox}>
|
|
79
|
+
Swipe down to close this modal. The animation has two phases: translate movement followed by a scale-down
|
|
80
|
+
effect.
|
|
81
|
+
</div>
|
|
82
|
+
<p>This modal opens from the bottom and can be dismissed by swiping down.</p>
|
|
83
|
+
<DemoButton variant="secondary" onClick={() => setBottomModal(false)}>
|
|
84
|
+
Close
|
|
85
|
+
</DemoButton>
|
|
86
|
+
</div>
|
|
87
|
+
</Modal>
|
|
88
|
+
|
|
89
|
+
{/* Center Modal */}
|
|
90
|
+
<Modal
|
|
91
|
+
visible={centerModal}
|
|
92
|
+
onClose={() => setCenterModal(false)}
|
|
93
|
+
transitionMode="swipe"
|
|
94
|
+
openDirection="center"
|
|
95
|
+
swipeDismissible={true}
|
|
96
|
+
header={{ title: "Swipeable Modal" }}
|
|
97
|
+
width={400}
|
|
98
|
+
>
|
|
99
|
+
<div className={styles.modalContent}>
|
|
100
|
+
<div className={styles.infoBox}>
|
|
101
|
+
Even centered modals can be dismissed by swiping down. The threshold is 30% of the container height or a
|
|
102
|
+
quick flick.
|
|
103
|
+
</div>
|
|
104
|
+
<p>Try swiping this modal down to dismiss it.</p>
|
|
105
|
+
<DemoButton variant="secondary" onClick={() => setCenterModal(false)}>
|
|
106
|
+
Close
|
|
107
|
+
</DemoButton>
|
|
108
|
+
</div>
|
|
109
|
+
</Modal>
|
|
110
|
+
|
|
111
|
+
{/* Scrollable Content Modal */}
|
|
112
|
+
<Modal
|
|
113
|
+
visible={scrollableModal}
|
|
114
|
+
onClose={() => setScrollableModal(false)}
|
|
115
|
+
transitionMode="swipe"
|
|
116
|
+
openDirection="bottom"
|
|
117
|
+
swipeDismissible={true}
|
|
118
|
+
header={{ title: "Scrollable Content" }}
|
|
119
|
+
width={400}
|
|
120
|
+
height={500}
|
|
121
|
+
>
|
|
122
|
+
<div className={styles.scrollableContent}>
|
|
123
|
+
<div className={styles.infoBox} style={{ marginBottom: "16px" }}>
|
|
124
|
+
Swipe gestures are detected only when NOT scrolling. Try scrolling the content below, then swipe down from
|
|
125
|
+
the header area.
|
|
126
|
+
</div>
|
|
127
|
+
{Array.from({ length: 20 }).map((_, i) => (
|
|
128
|
+
<p key={i} style={{ marginBottom: "12px" }}>
|
|
129
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et
|
|
130
|
+
dolore magna aliqua. Item {i + 1}.
|
|
131
|
+
</p>
|
|
132
|
+
))}
|
|
133
|
+
</div>
|
|
134
|
+
</Modal>
|
|
135
|
+
|
|
136
|
+
{/* Custom Action Sheet */}
|
|
137
|
+
<DialogContainer
|
|
138
|
+
visible={customSheet}
|
|
139
|
+
onClose={() => setCustomSheet(false)}
|
|
140
|
+
transitionMode="swipe"
|
|
141
|
+
openDirection="bottom"
|
|
142
|
+
swipeDismissible={true}
|
|
143
|
+
>
|
|
144
|
+
<div className={styles.actionSheet}>
|
|
145
|
+
<FloatingPanelFrame>
|
|
146
|
+
<FloatingPanelHeader>
|
|
147
|
+
<FloatingPanelTitle>Actions</FloatingPanelTitle>
|
|
148
|
+
</FloatingPanelHeader>
|
|
149
|
+
<FloatingPanelContent style={{ padding: 0 }}>
|
|
150
|
+
<ActionItem icon="📷" label="Take Photo" onClick={() => setCustomSheet(false)} />
|
|
151
|
+
<ActionItem icon="🖼️" label="Choose from Library" onClick={() => setCustomSheet(false)} />
|
|
152
|
+
<ActionItem icon="📁" label="Browse Files" onClick={() => setCustomSheet(false)} />
|
|
153
|
+
<ActionItem icon="❌" label="Cancel" onClick={() => setCustomSheet(false)} isDestructive />
|
|
154
|
+
</FloatingPanelContent>
|
|
155
|
+
</FloatingPanelFrame>
|
|
156
|
+
</div>
|
|
157
|
+
</DialogContainer>
|
|
158
|
+
</div>
|
|
159
|
+
);
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
type ActionItemProps = {
|
|
163
|
+
icon: string;
|
|
164
|
+
label: string;
|
|
165
|
+
onClick: () => void;
|
|
166
|
+
isDestructive?: boolean;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const ActionItem: React.FC<ActionItemProps> = ({ icon, label, onClick, isDestructive }) => {
|
|
170
|
+
return (
|
|
171
|
+
<button
|
|
172
|
+
type="button"
|
|
173
|
+
onClick={onClick}
|
|
174
|
+
className={styles.actionItem}
|
|
175
|
+
style={{ color: isDestructive ? "#ef4444" : undefined }}
|
|
176
|
+
>
|
|
177
|
+
<span className={styles.actionIcon}>{icon}</span>
|
|
178
|
+
<span>{label}</span>
|
|
179
|
+
</button>
|
|
180
|
+
);
|
|
181
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Dialog - Custom Alert page
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { CustomAlertDialogDemo } from "../components/CustomAlertDialogDemo";
|
|
6
|
+
import CustomAlertDialogDemoSource from "../components/CustomAlertDialogDemo.tsx?raw";
|
|
7
|
+
import { SingleSamplePage } from "../../../components/layout";
|
|
8
|
+
|
|
9
|
+
const Page: React.FC = () => {
|
|
10
|
+
return (
|
|
11
|
+
<SingleSamplePage
|
|
12
|
+
title="Dialog / Custom Alert Component"
|
|
13
|
+
code={CustomAlertDialogDemoSource}
|
|
14
|
+
codeTitle="CustomAlertDialogDemo.tsx"
|
|
15
|
+
previewHeight={520}
|
|
16
|
+
>
|
|
17
|
+
<CustomAlertDialogDemo />
|
|
18
|
+
</SingleSamplePage>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default Page;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Dialog - Modal page
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { ModalBasics } from "../components/ModalBasics";
|
|
6
|
+
import ModalBasicsSource from "../components/ModalBasics.tsx?raw";
|
|
7
|
+
import { SingleSamplePage } from "../../../components/layout";
|
|
8
|
+
|
|
9
|
+
const Page: React.FC = () => {
|
|
10
|
+
return (
|
|
11
|
+
<SingleSamplePage title="Dialog / Modal" code={ModalBasicsSource} codeTitle="ModalBasics.tsx" previewHeight={480}>
|
|
12
|
+
<ModalBasics />
|
|
13
|
+
</SingleSamplePage>
|
|
14
|
+
);
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export default Page;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Dialog - Swipe Dismiss page
|
|
3
|
+
*/
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { SwipeDialogDemo } from "../components/SwipeDialogDemo.js";
|
|
6
|
+
import SwipeDialogDemoSource from "../components/SwipeDialogDemo.tsx?raw";
|
|
7
|
+
import { SingleSamplePage } from "../../../components/layout/index.js";
|
|
8
|
+
|
|
9
|
+
const Page: React.FC = () => {
|
|
10
|
+
return (
|
|
11
|
+
<SingleSamplePage
|
|
12
|
+
title="Dialog / Swipe Dismiss"
|
|
13
|
+
code={SwipeDialogDemoSource}
|
|
14
|
+
codeTitle="SwipeDialogDemo.tsx"
|
|
15
|
+
previewHeight={600}
|
|
16
|
+
>
|
|
17
|
+
<SwipeDialogDemo />
|
|
18
|
+
</SingleSamplePage>
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export default Page;
|