@ionic/core 8.8.4-dev.11776186452.1cc0af05 → 8.8.4-dev.11776246162.138c2737
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/components/index.js +1 -1
- package/components/ion-action-sheet.js +1 -1
- package/components/ion-alert.js +1 -1
- package/components/ion-datetime.js +1 -1
- package/components/ion-infinite-scroll-content.js +1 -1
- package/components/ion-loading.js +1 -1
- package/components/ion-menu.js +1 -1
- package/components/ion-modal.js +1 -1
- package/components/ion-picker-legacy.js +1 -1
- package/components/ion-popover.js +1 -1
- package/components/ion-refresher-content.js +1 -1
- package/components/ion-select-modal.js +1 -1
- package/components/ion-select-option.js +1 -1
- package/components/ion-select-popover.js +1 -1
- package/components/ion-select.js +1 -1
- package/components/ion-skeleton-text.js +1 -1
- package/components/ion-spinner.js +1 -1
- package/components/ion-split-pane.js +1 -1
- package/components/ion-tab-bar.js +1 -1
- package/components/ion-tab-button.js +1 -1
- package/components/ion-tab.js +1 -1
- package/components/ion-tabs.js +1 -1
- package/components/ion-text.js +1 -1
- package/components/ion-textarea.js +1 -1
- package/components/ion-thumbnail.js +1 -1
- package/components/ion-title.js +1 -1
- package/components/ion-toast.js +1 -1
- package/components/ion-toggle.js +1 -1
- package/components/ion-toolbar.js +1 -1
- package/components/p-B36-MWK0.js +4 -0
- package/components/p-BDPU2685.js +4 -0
- package/components/p-BrNzoF1U.js +4 -0
- package/components/{p-B0orUoaV.js → p-C-_EGKki.js} +1 -1
- package/components/{p-qhBzWoOF.js → p-C2cZvGcF.js} +1 -1
- package/components/p-CEUppJkx.js +4 -0
- package/components/p-CSexRbnt.js +4 -0
- package/components/{p-ZRp3l6Dk.js → p-CoarhFWH.js} +1 -1
- package/components/p-DNdBtsfu.js +4 -0
- package/components/p-Njik5v4C.js +4 -0
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/ion-action-sheet.cjs.entry.js +34 -25
- package/dist/cjs/ion-alert.cjs.entry.js +51 -44
- package/dist/cjs/ion-app_8.cjs.entry.js +4 -4
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime_3.cjs.entry.js +28 -4
- package/dist/cjs/ion-item_8.cjs.entry.js +2 -2
- package/dist/cjs/ion-loading.cjs.entry.js +29 -4
- package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-modal.cjs.entry.js +176 -79
- package/dist/cjs/ion-popover.cjs.entry.js +90 -4
- package/dist/cjs/ion-select-modal.cjs.entry.js +27 -60
- package/dist/cjs/ion-select_3.cjs.entry.js +48 -191
- package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +3 -3
- package/dist/cjs/ion-toast.cjs.entry.js +32 -4
- package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{overlays-Dhoy6v_5.js → overlays-BbhewSIQ.js} +4 -4
- package/dist/collection/components/action-sheet/action-sheet.ios.css +0 -84
- package/dist/collection/components/action-sheet/action-sheet.js +8 -22
- package/dist/collection/components/action-sheet/action-sheet.md.css +0 -84
- package/dist/collection/components/action-sheet/animations/ionic.enter.js +27 -0
- package/dist/collection/components/action-sheet/animations/ionic.leave.js +21 -0
- package/dist/collection/components/alert/alert.ios.css +0 -83
- package/dist/collection/components/alert/alert.js +24 -41
- package/dist/collection/components/alert/alert.md.css +0 -83
- package/dist/collection/components/alert/animations/ionic.enter.js +28 -0
- package/dist/collection/components/alert/animations/ionic.leave.js +19 -0
- package/dist/collection/components/loading/animations/ionic.enter.js +28 -0
- package/dist/collection/components/loading/animations/ionic.leave.js +22 -0
- package/dist/collection/components/loading/loading.js +4 -3
- package/dist/collection/components/modal/animations/ionic.enter.js +40 -0
- package/dist/collection/components/modal/animations/ionic.leave.js +28 -0
- package/dist/collection/components/modal/gestures/sheet.js +71 -9
- package/dist/collection/components/modal/modal.ionic.css +1 -1
- package/dist/collection/components/modal/modal.js +6 -5
- package/dist/collection/components/picker-legacy/animations/ionic.enter.js +27 -0
- package/dist/collection/components/picker-legacy/animations/ionic.leave.js +23 -0
- package/dist/collection/components/picker-legacy/picker.js +4 -3
- package/dist/collection/components/popover/animations/ionic.enter.js +91 -0
- package/dist/collection/components/popover/animations/ionic.leave.js +29 -0
- package/dist/collection/components/popover/popover.js +4 -3
- package/dist/collection/components/select/select.ionic.css +0 -31
- package/dist/collection/components/select/select.ios.css +0 -31
- package/dist/collection/components/select/select.js +14 -125
- package/dist/collection/components/select/select.md.css +0 -31
- package/dist/collection/components/select-modal/select-modal.ionic.css +0 -24
- package/dist/collection/components/select-modal/select-modal.ios.css +0 -77
- package/dist/collection/components/select-modal/select-modal.js +23 -56
- package/dist/collection/components/select-modal/select-modal.md.css +1 -80
- package/dist/collection/components/select-option/select-option.js +2 -21
- package/dist/collection/components/select-popover/select-popover.ios.css +0 -77
- package/dist/collection/components/select-popover/select-popover.js +26 -59
- package/dist/collection/components/select-popover/select-popover.md.css +0 -77
- package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
- package/dist/collection/components/spinner/spinner.js +1 -1
- package/dist/collection/components/split-pane/split-pane.js +2 -2
- package/dist/collection/components/tab/tab.js +2 -2
- package/dist/collection/components/tab-bar/tab-bar.js +2 -2
- package/dist/collection/components/tab-button/tab-button.js +2 -2
- package/dist/collection/components/tabs/tabs.js +1 -1
- package/dist/collection/components/text/text.js +2 -2
- package/dist/collection/components/textarea/textarea.js +3 -3
- package/dist/collection/components/thumbnail/thumbnail.js +2 -2
- package/dist/collection/components/title/title.js +2 -2
- package/dist/collection/components/toast/animations/ionic.enter.js +33 -0
- package/dist/collection/components/toast/animations/ionic.leave.js +16 -0
- package/dist/collection/components/toast/toast.js +4 -3
- package/dist/collection/components/toggle/toggle.js +3 -3
- package/dist/collection/components/toolbar/toolbar.js +2 -2
- package/dist/collection/utils/overlays.js +5 -5
- package/dist/docs.json +1 -135
- package/dist/esm/index.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +34 -25
- package/dist/esm/ion-alert.entry.js +51 -44
- package/dist/esm/ion-app_8.entry.js +4 -4
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-datetime_3.entry.js +28 -4
- package/dist/esm/ion-item_8.entry.js +2 -2
- package/dist/esm/ion-loading.entry.js +29 -4
- package/dist/esm/ion-menu_3.entry.js +1 -1
- package/dist/esm/ion-modal.entry.js +177 -80
- package/dist/esm/ion-popover.entry.js +90 -4
- package/dist/esm/ion-select-modal.entry.js +27 -60
- package/dist/esm/ion-select_3.entry.js +49 -192
- package/dist/esm/ion-spinner.entry.js +1 -1
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +4 -4
- package/dist/esm/ion-tab_2.entry.js +3 -3
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +3 -3
- package/dist/esm/ion-toast.entry.js +32 -4
- package/dist/esm/ion-toggle.entry.js +3 -3
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{overlays-CvFHfO3y.js → overlays-VA-4NWjf.js} +5 -5
- package/dist/html.html-data.json +0 -4
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-07b129d5.entry.js +4 -0
- package/dist/ionic/p-0cb50208.entry.js +4 -0
- package/dist/ionic/{p-db4f4eaf.entry.js → p-1efe83c8.entry.js} +1 -1
- package/dist/ionic/{p-d2fe6791.entry.js → p-2193e875.entry.js} +1 -1
- package/dist/ionic/{p-69033ad6.entry.js → p-2bf931ae.entry.js} +1 -1
- package/dist/ionic/{p-26595044.entry.js → p-3bf01c2c.entry.js} +1 -1
- package/dist/ionic/p-3d4c8528.entry.js +4 -0
- package/dist/ionic/{p-9e71982e.entry.js → p-49799a34.entry.js} +1 -1
- package/dist/ionic/p-64341e32.entry.js +4 -0
- package/dist/ionic/p-6992d9d6.entry.js +4 -0
- package/dist/ionic/{p-aa8c1e64.entry.js → p-6c8c37c2.entry.js} +1 -1
- package/dist/ionic/{p-a94016be.entry.js → p-91e242e4.entry.js} +1 -1
- package/dist/ionic/{p-96ec9a10.entry.js → p-9b9b1450.entry.js} +1 -1
- package/dist/ionic/p-9dd4276b.entry.js +4 -0
- package/dist/ionic/p-BExfzy0B.js +4 -0
- package/dist/ionic/p-a3d794ba.entry.js +4 -0
- package/dist/ionic/p-ba9f8cbb.entry.js +4 -0
- package/dist/ionic/{p-2095969c.entry.js → p-bae3ebe5.entry.js} +1 -1
- package/dist/ionic/{p-a1c8ba8c.entry.js → p-bc5713f7.entry.js} +1 -1
- package/dist/ionic/{p-71f28573.entry.js → p-cdfbe4cc.entry.js} +1 -1
- package/dist/ionic/p-fa701753.entry.js +4 -0
- package/dist/types/components/action-sheet/animations/ionic.enter.d.ts +5 -0
- package/dist/types/components/action-sheet/animations/ionic.leave.d.ts +5 -0
- package/dist/types/components/alert/animations/ionic.enter.d.ts +5 -0
- package/dist/types/components/alert/animations/ionic.leave.d.ts +5 -0
- package/dist/types/components/loading/animations/ionic.enter.d.ts +5 -0
- package/dist/types/components/loading/animations/ionic.leave.d.ts +5 -0
- package/dist/types/components/modal/animations/ionic.enter.d.ts +6 -0
- package/dist/types/components/modal/animations/ionic.leave.d.ts +6 -0
- package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
- package/dist/types/components/picker-legacy/animations/ionic.enter.d.ts +5 -0
- package/dist/types/components/picker-legacy/animations/ionic.leave.d.ts +5 -0
- package/dist/types/components/popover/animations/ionic.enter.d.ts +5 -0
- package/dist/types/components/popover/animations/ionic.leave.d.ts +5 -0
- package/dist/types/components/select/select-interface.d.ts +0 -21
- package/dist/types/components/select/select.d.ts +0 -7
- package/dist/types/components/select-option/select-option.d.ts +0 -4
- package/dist/types/components/toast/animations/ionic.enter.d.ts +6 -0
- package/dist/types/components/toast/animations/ionic.leave.d.ts +5 -0
- package/dist/types/components.d.ts +0 -9
- package/dist/types/utils/overlays.d.ts +1 -1
- package/hydrate/index.js +534 -489
- package/hydrate/index.mjs +534 -489
- package/package.json +1 -1
- package/components/p-B6czg-mf.js +0 -4
- package/components/p-BObmvbuR.js +0 -4
- package/components/p-C8Dne7pI.js +0 -4
- package/components/p-Cm7hjN9B.js +0 -4
- package/components/p-DQY5lHUa.js +0 -4
- package/components/p-D_uMZULz.js +0 -4
- package/components/p-GytrfCp8.js +0 -4
- package/components/p-ZeIAjDcZ.js +0 -4
- package/dist/cjs/select-option-render-qQf4xz8P.js +0 -67
- package/dist/collection/components/action-sheet/action-sheet.ionic.css +0 -834
- package/dist/collection/components/alert/alert.ionic.css +0 -1165
- package/dist/collection/components/select-popover/select-popover.ionic.css +0 -489
- package/dist/collection/utils/select-option-render.js +0 -62
- package/dist/esm/select-option-render-BQUT9Aqa.js +0 -65
- package/dist/ionic/p-003b40fc.entry.js +0 -4
- package/dist/ionic/p-35aa95dc.entry.js +0 -4
- package/dist/ionic/p-37f895a8.entry.js +0 -4
- package/dist/ionic/p-3884bfa4.entry.js +0 -4
- package/dist/ionic/p-38897781.entry.js +0 -4
- package/dist/ionic/p-575061c0.entry.js +0 -4
- package/dist/ionic/p-6bffc700.entry.js +0 -4
- package/dist/ionic/p-BYtS2rae.js +0 -4
- package/dist/ionic/p-Dr3N4o63.js +0 -4
- package/dist/ionic/p-c3335fe0.entry.js +0 -4
- package/dist/ionic/p-ef0c281a.entry.js +0 -4
- package/dist/types/utils/select-option-render.d.ts +0 -26
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-Omi_TcwW.js';
|
|
5
5
|
import { f as findClosestIonContent, i as isIonContent, d as disableContentScrollY, r as resetContentScrollY, a as findIonContent, p as printIonContentErrorMsg } from './index-BmkLokUL.js';
|
|
6
6
|
import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-CjVwn_KZ.js';
|
|
7
|
-
import {
|
|
7
|
+
import { g as getElementRoot, e as clamp, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-Do7zwvM1.js';
|
|
8
8
|
import { c as createLockController } from './lock-controller-B-hirT0v.js';
|
|
9
9
|
import { g as getCapacitor } from './capacitor-C4lYa1nV.js';
|
|
10
|
-
import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-
|
|
10
|
+
import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, e as createTriggerController, B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, g as dismiss, h as eventMethod } from './overlays-VA-4NWjf.js';
|
|
11
11
|
import { g as getClassMap } from './theme-DaJxRxSQ.js';
|
|
12
12
|
import { e as deepReady, w as waitForMount } from './index-CGthURny.js';
|
|
13
13
|
import { w as win, b as getIonMode, c as getIonTheme } from './ionic-global-CAZb-5i-.js';
|
|
@@ -126,6 +126,104 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
|
|
|
126
126
|
StatusBar.setStyle({ style: defaultStyle });
|
|
127
127
|
};
|
|
128
128
|
|
|
129
|
+
const createSheetEnterAnimation = (opts) => {
|
|
130
|
+
const { currentBreakpoint, backdropBreakpoint, expandToScroll, staticBackdropOpacity } = opts;
|
|
131
|
+
/**
|
|
132
|
+
* If the backdropBreakpoint is undefined, then the backdrop
|
|
133
|
+
* should always fade in. If the backdropBreakpoint came before the
|
|
134
|
+
* current breakpoint, then the backdrop should be fading in.
|
|
135
|
+
*/
|
|
136
|
+
const shouldShowBackdrop = backdropBreakpoint === undefined || backdropBreakpoint < currentBreakpoint;
|
|
137
|
+
let initialBackdrop = '0';
|
|
138
|
+
if (staticBackdropOpacity) {
|
|
139
|
+
initialBackdrop = 'calc(var(--backdrop-opacity)';
|
|
140
|
+
}
|
|
141
|
+
else if (shouldShowBackdrop) {
|
|
142
|
+
initialBackdrop = `calc(var(--backdrop-opacity) * ${currentBreakpoint})`;
|
|
143
|
+
}
|
|
144
|
+
const backdropAnimation = createAnimation('backdropAnimation').fromTo('opacity', 0, initialBackdrop);
|
|
145
|
+
if (shouldShowBackdrop) {
|
|
146
|
+
backdropAnimation
|
|
147
|
+
.beforeStyles({
|
|
148
|
+
'pointer-events': 'none',
|
|
149
|
+
})
|
|
150
|
+
.afterClearStyles(['pointer-events']);
|
|
151
|
+
}
|
|
152
|
+
const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
|
|
153
|
+
{ offset: 0, opacity: 1, transform: 'translateY(100%)' },
|
|
154
|
+
{ offset: 1, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
|
|
155
|
+
]);
|
|
156
|
+
/**
|
|
157
|
+
* This allows the content to be scrollable at any breakpoint.
|
|
158
|
+
*/
|
|
159
|
+
const contentAnimation = !expandToScroll
|
|
160
|
+
? createAnimation('contentAnimation').keyframes([
|
|
161
|
+
{ offset: 0, opacity: 1, maxHeight: `${(1 - currentBreakpoint) * 100}%` },
|
|
162
|
+
{ offset: 1, opacity: 1, maxHeight: `${currentBreakpoint * 100}%` },
|
|
163
|
+
])
|
|
164
|
+
: undefined;
|
|
165
|
+
return { wrapperAnimation, backdropAnimation, contentAnimation };
|
|
166
|
+
};
|
|
167
|
+
const createSheetLeaveAnimation = (opts) => {
|
|
168
|
+
const { currentBreakpoint, backdropBreakpoint } = opts;
|
|
169
|
+
/**
|
|
170
|
+
* Backdrop does not always fade in from 0 to 1 if backdropBreakpoint
|
|
171
|
+
* is defined, so we need to account for that offset by figuring out
|
|
172
|
+
* what the current backdrop value should be.
|
|
173
|
+
*/
|
|
174
|
+
const backdropValue = `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(currentBreakpoint, backdropBreakpoint)})`;
|
|
175
|
+
const defaultBackdrop = [
|
|
176
|
+
{ offset: 0, opacity: backdropValue },
|
|
177
|
+
{ offset: 1, opacity: 0 },
|
|
178
|
+
];
|
|
179
|
+
const customBackdrop = [
|
|
180
|
+
{ offset: 0, opacity: backdropValue },
|
|
181
|
+
{ offset: backdropBreakpoint, opacity: 0 },
|
|
182
|
+
{ offset: 1, opacity: 0 },
|
|
183
|
+
];
|
|
184
|
+
const backdropAnimation = createAnimation('backdropAnimation').keyframes(backdropBreakpoint !== 0 ? customBackdrop : defaultBackdrop);
|
|
185
|
+
const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
|
|
186
|
+
{ offset: 0, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
|
|
187
|
+
{ offset: 1, opacity: 1, transform: `translateY(100%)` },
|
|
188
|
+
]);
|
|
189
|
+
return { wrapperAnimation, backdropAnimation };
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const createEnterAnimation$2 = () => {
|
|
193
|
+
const backdropAnimation = createAnimation()
|
|
194
|
+
.fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
|
|
195
|
+
.beforeStyles({
|
|
196
|
+
'pointer-events': 'none',
|
|
197
|
+
})
|
|
198
|
+
.afterClearStyles(['pointer-events']);
|
|
199
|
+
const wrapperAnimation = createAnimation().keyframes([
|
|
200
|
+
{ offset: 0, opacity: 0.01, transform: 'translateY(40px)' },
|
|
201
|
+
{ offset: 1, opacity: 1, transform: `translateY(0px)` },
|
|
202
|
+
]);
|
|
203
|
+
return { backdropAnimation, wrapperAnimation, contentAnimation: undefined };
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Ionic Modal Enter Animation
|
|
207
|
+
*/
|
|
208
|
+
const ionicEnterAnimation = (baseEl, opts) => {
|
|
209
|
+
const { currentBreakpoint, expandToScroll } = opts;
|
|
210
|
+
const root = getElementRoot(baseEl);
|
|
211
|
+
const { wrapperAnimation, backdropAnimation, contentAnimation } = currentBreakpoint !== undefined ? createSheetEnterAnimation(opts) : createEnterAnimation$2();
|
|
212
|
+
backdropAnimation.addElement(root.querySelector('ion-backdrop'));
|
|
213
|
+
wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
|
|
214
|
+
// The content animation is only added if scrolling is enabled for
|
|
215
|
+
// all the breakpoints.
|
|
216
|
+
!expandToScroll && (contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.addElement(baseEl.querySelector('.ion-page')));
|
|
217
|
+
backdropAnimation.duration(300).easing('ease-out');
|
|
218
|
+
wrapperAnimation.duration(400).easing('cubic-bezier(0.32, 0.68, 0, 1)');
|
|
219
|
+
contentAnimation === null || contentAnimation === void 0 ? void 0 : contentAnimation.duration(400).easing('cubic-bezier(0.32, 0.68, 0, 1)');
|
|
220
|
+
const baseAnimation = createAnimation().addElement(baseEl).addAnimation([backdropAnimation, wrapperAnimation]);
|
|
221
|
+
if (contentAnimation) {
|
|
222
|
+
baseAnimation.addAnimation(contentAnimation);
|
|
223
|
+
}
|
|
224
|
+
return baseAnimation;
|
|
225
|
+
};
|
|
226
|
+
|
|
129
227
|
const handleCanDismiss = async (el, animation) => {
|
|
130
228
|
/**
|
|
131
229
|
* If canDismiss is not a function
|
|
@@ -552,69 +650,6 @@ const calculateProgress = (el, deltaY) => {
|
|
|
552
650
|
return Math.max(0, Math.min(1, roundedProgress));
|
|
553
651
|
};
|
|
554
652
|
|
|
555
|
-
const createSheetEnterAnimation = (opts) => {
|
|
556
|
-
const { currentBreakpoint, backdropBreakpoint, expandToScroll, staticBackdropOpacity } = opts;
|
|
557
|
-
/**
|
|
558
|
-
* If the backdropBreakpoint is undefined, then the backdrop
|
|
559
|
-
* should always fade in. If the backdropBreakpoint came before the
|
|
560
|
-
* current breakpoint, then the backdrop should be fading in.
|
|
561
|
-
*/
|
|
562
|
-
const shouldShowBackdrop = backdropBreakpoint === undefined || backdropBreakpoint < currentBreakpoint;
|
|
563
|
-
let initialBackdrop = '0';
|
|
564
|
-
if (staticBackdropOpacity) {
|
|
565
|
-
initialBackdrop = 'calc(var(--backdrop-opacity)';
|
|
566
|
-
}
|
|
567
|
-
else if (shouldShowBackdrop) {
|
|
568
|
-
initialBackdrop = `calc(var(--backdrop-opacity) * ${currentBreakpoint})`;
|
|
569
|
-
}
|
|
570
|
-
const backdropAnimation = createAnimation('backdropAnimation').fromTo('opacity', 0, initialBackdrop);
|
|
571
|
-
if (shouldShowBackdrop) {
|
|
572
|
-
backdropAnimation
|
|
573
|
-
.beforeStyles({
|
|
574
|
-
'pointer-events': 'none',
|
|
575
|
-
})
|
|
576
|
-
.afterClearStyles(['pointer-events']);
|
|
577
|
-
}
|
|
578
|
-
const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
|
|
579
|
-
{ offset: 0, opacity: 1, transform: 'translateY(100%)' },
|
|
580
|
-
{ offset: 1, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
|
|
581
|
-
]);
|
|
582
|
-
/**
|
|
583
|
-
* This allows the content to be scrollable at any breakpoint.
|
|
584
|
-
*/
|
|
585
|
-
const contentAnimation = !expandToScroll
|
|
586
|
-
? createAnimation('contentAnimation').keyframes([
|
|
587
|
-
{ offset: 0, opacity: 1, maxHeight: `${(1 - currentBreakpoint) * 100}%` },
|
|
588
|
-
{ offset: 1, opacity: 1, maxHeight: `${currentBreakpoint * 100}%` },
|
|
589
|
-
])
|
|
590
|
-
: undefined;
|
|
591
|
-
return { wrapperAnimation, backdropAnimation, contentAnimation };
|
|
592
|
-
};
|
|
593
|
-
const createSheetLeaveAnimation = (opts) => {
|
|
594
|
-
const { currentBreakpoint, backdropBreakpoint } = opts;
|
|
595
|
-
/**
|
|
596
|
-
* Backdrop does not always fade in from 0 to 1 if backdropBreakpoint
|
|
597
|
-
* is defined, so we need to account for that offset by figuring out
|
|
598
|
-
* what the current backdrop value should be.
|
|
599
|
-
*/
|
|
600
|
-
const backdropValue = `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(currentBreakpoint, backdropBreakpoint)})`;
|
|
601
|
-
const defaultBackdrop = [
|
|
602
|
-
{ offset: 0, opacity: backdropValue },
|
|
603
|
-
{ offset: 1, opacity: 0 },
|
|
604
|
-
];
|
|
605
|
-
const customBackdrop = [
|
|
606
|
-
{ offset: 0, opacity: backdropValue },
|
|
607
|
-
{ offset: backdropBreakpoint, opacity: 0 },
|
|
608
|
-
{ offset: 1, opacity: 0 },
|
|
609
|
-
];
|
|
610
|
-
const backdropAnimation = createAnimation('backdropAnimation').keyframes(backdropBreakpoint !== 0 ? customBackdrop : defaultBackdrop);
|
|
611
|
-
const wrapperAnimation = createAnimation('wrapperAnimation').keyframes([
|
|
612
|
-
{ offset: 0, opacity: 1, transform: `translateY(${100 - currentBreakpoint * 100}%)` },
|
|
613
|
-
{ offset: 1, opacity: 1, transform: `translateY(100%)` },
|
|
614
|
-
]);
|
|
615
|
-
return { wrapperAnimation, backdropAnimation };
|
|
616
|
-
};
|
|
617
|
-
|
|
618
653
|
const createEnterAnimation$1 = () => {
|
|
619
654
|
const backdropAnimation = createAnimation()
|
|
620
655
|
.fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
|
|
@@ -1005,16 +1040,16 @@ const mdLeaveAnimation = (baseEl, opts) => {
|
|
|
1005
1040
|
return baseAnimation;
|
|
1006
1041
|
};
|
|
1007
1042
|
|
|
1008
|
-
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange,
|
|
1043
|
+
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange, isIonicTheme, onDragStart, onDragMove, onDragEnd) => {
|
|
1009
1044
|
// Defaults for the sheet swipe animation
|
|
1010
1045
|
const defaultBackdrop = [
|
|
1011
1046
|
{ offset: 0, opacity: 'var(--backdrop-opacity)' },
|
|
1012
|
-
{ offset: 1, opacity:
|
|
1047
|
+
{ offset: 1, opacity: isIonicTheme ? 'var(--backdrop-opacity)' : 0.01 },
|
|
1013
1048
|
];
|
|
1014
1049
|
const customBackdrop = [
|
|
1015
1050
|
{ offset: 0, opacity: 'var(--backdrop-opacity)' },
|
|
1016
|
-
{ offset: 1 - backdropBreakpoint, opacity:
|
|
1017
|
-
{ offset: 1, opacity:
|
|
1051
|
+
{ offset: 1 - backdropBreakpoint, opacity: isIonicTheme ? 'var(--backdrop-opacity)' : 0 },
|
|
1052
|
+
{ offset: 1, opacity: isIonicTheme ? 'var(--backdrop-opacity)' : 0 },
|
|
1018
1053
|
];
|
|
1019
1054
|
const SheetDefaults = {
|
|
1020
1055
|
WRAPPER_KEYFRAMES: [
|
|
@@ -1337,7 +1372,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1337
1372
|
: step;
|
|
1338
1373
|
offset = clamp(0.0001, processedStep, maxStep);
|
|
1339
1374
|
animation.progressStep(offset);
|
|
1340
|
-
const snapBreakpoint =
|
|
1375
|
+
const snapBreakpoint = isIonicTheme
|
|
1376
|
+
? calculateIonicSnapBreakpoint(detail.deltaY, detail.velocityY, detail.currentY)
|
|
1377
|
+
: calculateSnapBreakpoint(detail.deltaY);
|
|
1341
1378
|
const eventDetail = {
|
|
1342
1379
|
currentY: detail.currentY,
|
|
1343
1380
|
deltaY: detail.deltaY,
|
|
@@ -1348,7 +1385,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1348
1385
|
onDragMove(eventDetail);
|
|
1349
1386
|
};
|
|
1350
1387
|
const onEnd = (detail) => {
|
|
1351
|
-
const snapBreakpoint =
|
|
1388
|
+
const snapBreakpoint = isIonicTheme
|
|
1389
|
+
? calculateIonicSnapBreakpoint(detail.deltaY, detail.velocityY, detail.currentY)
|
|
1390
|
+
: calculateSnapBreakpoint(detail.deltaY);
|
|
1352
1391
|
const eventDetail = {
|
|
1353
1392
|
currentY: detail.currentY,
|
|
1354
1393
|
deltaY: detail.deltaY,
|
|
@@ -1395,6 +1434,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1395
1434
|
*/
|
|
1396
1435
|
const shouldPreventDismiss = canDismiss && breakpoint === 0;
|
|
1397
1436
|
const snapToBreakpoint = shouldPreventDismiss ? currentBreakpoint : breakpoint;
|
|
1437
|
+
/**
|
|
1438
|
+
* Detect snap-back behavior: when the snap target is the same as the current breakpoint,
|
|
1439
|
+
* the user released before crossing the threshold to a new breakpoint.
|
|
1440
|
+
* Apply different timing and easing for snap-back vs. snap-to-new.
|
|
1441
|
+
*/
|
|
1442
|
+
const isSnapBack = snapToBreakpoint === currentBreakpoint;
|
|
1443
|
+
const duration = isIonicTheme ? (isSnapBack ? 300 : 400) : 500;
|
|
1444
|
+
const easing = isSnapBack ? 'cubic-bezier(0.34, 1.4, 0.64, 1)' : 'cubic-bezier(0.32, 0.68, 0, 1)';
|
|
1398
1445
|
const shouldRemainOpen = snapToBreakpoint !== 0;
|
|
1399
1446
|
currentBreakpoint = 0;
|
|
1400
1447
|
/**
|
|
@@ -1409,13 +1456,13 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1409
1456
|
backdropAnimation.keyframes([
|
|
1410
1457
|
{
|
|
1411
1458
|
offset: 0,
|
|
1412
|
-
opacity:
|
|
1459
|
+
opacity: isIonicTheme
|
|
1413
1460
|
? 'var(--backdrop-opacity)'
|
|
1414
1461
|
: `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(1 - breakpointOffset, backdropBreakpoint)})`,
|
|
1415
1462
|
},
|
|
1416
1463
|
{
|
|
1417
1464
|
offset: 1,
|
|
1418
|
-
opacity:
|
|
1465
|
+
opacity: isIonicTheme
|
|
1419
1466
|
? 'var(--backdrop-opacity)'
|
|
1420
1467
|
: `calc(var(--backdrop-opacity) * ${getBackdropValueForSheet(snapToBreakpoint, backdropBreakpoint)})`,
|
|
1421
1468
|
},
|
|
@@ -1435,6 +1482,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1435
1482
|
}
|
|
1436
1483
|
animation.progressStep(0);
|
|
1437
1484
|
}
|
|
1485
|
+
/**
|
|
1486
|
+
* Apply the appropriate easing curve for this snap behavior.
|
|
1487
|
+
*/
|
|
1488
|
+
if (isIonicTheme) {
|
|
1489
|
+
animation.easing(easing);
|
|
1490
|
+
}
|
|
1438
1491
|
/**
|
|
1439
1492
|
* Gesture should remain disabled until the
|
|
1440
1493
|
* snapping animation completes.
|
|
@@ -1524,7 +1577,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1524
1577
|
* be added every time onEnd runs.
|
|
1525
1578
|
*/
|
|
1526
1579
|
}, { oneTimeCallback: true })
|
|
1527
|
-
.progressEnd(1, 0, animated ?
|
|
1580
|
+
.progressEnd(1, 0, animated ? duration : 0);
|
|
1528
1581
|
});
|
|
1529
1582
|
};
|
|
1530
1583
|
/**
|
|
@@ -1555,6 +1608,50 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1555
1608
|
});
|
|
1556
1609
|
return snapBreakpoint;
|
|
1557
1610
|
};
|
|
1611
|
+
/**
|
|
1612
|
+
* Calculates the Ionic-specific snap breakpoint using velocity-based logic.
|
|
1613
|
+
* This provides a more intuitive and responsive sheet behavior for the Ionic theme.
|
|
1614
|
+
*
|
|
1615
|
+
* Rules:
|
|
1616
|
+
* 1. Fast downward flick (> 500 px/s) always dismisses, regardless of position
|
|
1617
|
+
* 2. Fast upward flick (> 400 px/s) snaps to the next breakpoint above
|
|
1618
|
+
* 3. If dragged 40% below current snap point without fast upward flick, dismisses
|
|
1619
|
+
* 4. Otherwise, falls back to position-based snap (closest breakpoint)
|
|
1620
|
+
*
|
|
1621
|
+
* @param deltaY The change in Y position since gesture started
|
|
1622
|
+
* @param velocityY The velocity in pixels per millisecond
|
|
1623
|
+
* @param currentY The current Y position of the gesture
|
|
1624
|
+
* @returns The snap breakpoint value
|
|
1625
|
+
*/
|
|
1626
|
+
const calculateIonicSnapBreakpoint = (deltaY, velocityY, currentY) => {
|
|
1627
|
+
// Convert velocity from px/ms to px/s for easier threshold comparison
|
|
1628
|
+
const velocityYPerSecond = velocityY * 1000;
|
|
1629
|
+
// Calculate current progress (0 = fully closed, 1 = fully expanded)
|
|
1630
|
+
const currentProgress = calculateProgress(currentY);
|
|
1631
|
+
// Rule 1: Fast downward flick always dismisses
|
|
1632
|
+
if (velocityYPerSecond > 500) {
|
|
1633
|
+
return minBreakpoint;
|
|
1634
|
+
}
|
|
1635
|
+
// Rule 2: Fast upward flick moves to next breakpoint above
|
|
1636
|
+
if (velocityYPerSecond < -400) {
|
|
1637
|
+
// Find next breakpoint above current position
|
|
1638
|
+
const nextBreakpoint = breakpoints.find((bp) => bp > currentProgress);
|
|
1639
|
+
// If no breakpoint above, stay at max breakpoint
|
|
1640
|
+
return nextBreakpoint !== null && nextBreakpoint !== void 0 ? nextBreakpoint : maxBreakpoint;
|
|
1641
|
+
}
|
|
1642
|
+
// Rule 3: 40% dismissal rule (only if not flicking up and 0 breakpoint exists)
|
|
1643
|
+
if (minBreakpoint === 0 && currentBreakpoint > 0) {
|
|
1644
|
+
// Calculate how far we've moved below the current snap point
|
|
1645
|
+
const distanceBelowSnap = currentBreakpoint - currentProgress;
|
|
1646
|
+
const percentageBelowSnap = distanceBelowSnap / currentBreakpoint;
|
|
1647
|
+
// If dragged more than 40% below and not flicking up, dismiss
|
|
1648
|
+
if (percentageBelowSnap > 0.4 && velocityYPerSecond <= 400) {
|
|
1649
|
+
return 0;
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
// Rule 4: Fallback to position-based snap (existing logic)
|
|
1653
|
+
return calculateSnapBreakpoint(deltaY);
|
|
1654
|
+
};
|
|
1558
1655
|
/**
|
|
1559
1656
|
* Calculates the progress of the swipe gesture.
|
|
1560
1657
|
*
|
|
@@ -1803,7 +1900,7 @@ const clearSafeAreaOverrides = (hostEl) => {
|
|
|
1803
1900
|
hostEl.style.removeProperty('--ion-safe-area-right');
|
|
1804
1901
|
};
|
|
1805
1902
|
|
|
1806
|
-
const modalIonicCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-width:0;--border-style:none;--border-color:transparent;--box-shadow:none;right:0;left:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}.modal-handle{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;cursor:pointer;z-index:11}.modal-handle::before{position:absolute;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--background:var(--token-bg-surface-default, var(--token-primitives-base-white, #ffffff));--box-shadow:var(--token-elevation-3, 0px 2px 7px 0px rgba(0, 0, 0, 0.05), 0px 6px 32px 0px rgba(0, 0, 0, 0.16));--backdrop-opacity:
|
|
1903
|
+
const modalIonicCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-width:0;--border-style:none;--border-color:transparent;--box-shadow:none;right:0;left:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}.modal-handle{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;cursor:pointer;z-index:11}.modal-handle::before{position:absolute;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--background:var(--token-bg-surface-default, var(--token-primitives-base-white, #ffffff));--box-shadow:var(--token-elevation-3, 0px 2px 7px 0px rgba(0, 0, 0, 0.05), 0px 6px 32px 0px rgba(0, 0, 0, 0.16));--backdrop-opacity:0.7;color:var(--token-text-default, var(--token-primitives-neutral-1200, #242424))}:host(.modal-round){--border-radius:var(--token-border-radius-1000, var(--token-scale-1000, 40px))}:host(.modal-soft){--border-radius:var(--token-border-radius-400, var(--token-scale-400, 16px))}:host(.modal-rectangular){--border-radius:var(--token-border-radius-0, var(--token-scale-0, 0px))}:host(.select-modal.modal-default){--max-height:45%;--max-width:calc(100% - (var(--token-space-400, var(--token-scale-400, 16px)) * 2));--min-height:340px}.modal-handle{right:0px;left:0px;top:var(--token-space-300, var(--token-scale-300, 12px));border-radius:var(--token-border-radius-100, var(--token-scale-100, 4px));width:var(--token-scale-1100, 44px);height:var(--token-scale-100, 4px);background-color:var(--token-primitives-neutral-300, #e0e0e0)}.modal-handle::before{-webkit-padding-start:var(--token-space-100, var(--token-scale-100, 4px));padding-inline-start:var(--token-space-100, var(--token-scale-100, 4px));-webkit-padding-end:var(--token-space-100, var(--token-scale-100, 4px));padding-inline-end:var(--token-space-100, var(--token-scale-100, 4px));padding-top:var(--token-space-100, var(--token-scale-100, 4px));padding-bottom:var(--token-space-100, var(--token-scale-100, 4px))}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + var(--token-scale-250, 10px)))}`;
|
|
1807
1904
|
|
|
1808
1905
|
const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-width:0;--border-style:none;--border-color:transparent;--box-shadow:none;right:0;left:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}.modal-handle{-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;cursor:pointer;z-index:11}.modal-handle::before{position:absolute;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet) .modal-wrapper,:host(.modal-sheet) .modal-shadow{position:absolute;bottom:0}:host(.modal-sheet.modal-no-expand-scroll) ion-footer{position:absolute;bottom:0;width:var(--width)}:host{--background:var(--ion-background-color, #fff);--border-radius:0;--backdrop-opacity:0;color:var(--ion-text-color, #000)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px;--ion-safe-area-top:0px;--ion-safe-area-bottom:0px;--ion-safe-area-right:0px;--ion-safe-area-left:0px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{right:0px;left:0px;top:5px;border-radius:8px;width:36px;height:5px;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be))}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;width:36px;height:5px}:host(.modal-sheet){--height:calc(100% - (var(--ion-modal-offset-top, 0px) + 10px))}:host{--backdrop-opacity:var(--ion-backdrop-opacity, 0.4)}:host(.modal-card),:host(.modal-sheet){--border-radius:10px}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:10px}}.modal-wrapper{-webkit-transform:translate3d(0, 100%, 0);transform:translate3d(0, 100%, 0)}@media screen and (max-width: 767px){@supports (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - max(30px, var(--ion-safe-area-top)) - 10px)}}@supports not (width: max(0px, 1px)){:host(.modal-card){--height:calc(100% - 40px)}}:host(.modal-card) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}:host(.modal-card){--backdrop-opacity:0;--width:100%;-ms-flex-align:end;align-items:flex-end}:host(.modal-card) .modal-shadow{display:none}:host(.modal-card) ion-backdrop{pointer-events:none}}@media screen and (min-width: 768px){:host(.modal-card){--width:calc(100% - 120px);--height:calc(100% - (120px + var(--ion-safe-area-top) + var(--ion-safe-area-bottom)));--max-width:720px;--max-height:1000px;--backdrop-opacity:0;--box-shadow:0px 0px 30px 10px rgba(0, 0, 0, 0.1);-webkit-transition:all 0.5s ease-in-out;transition:all 0.5s ease-in-out}:host(.modal-card) .modal-wrapper{-webkit-box-shadow:none;box-shadow:none}:host(.modal-card) .modal-shadow{-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow)}}:host(.modal-sheet) .modal-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0;border-end-start-radius:0}`;
|
|
1809
1906
|
|
|
@@ -2243,7 +2340,7 @@ const Modal = class {
|
|
|
2243
2340
|
this.statusBarStyle = await StatusBar.getStyle();
|
|
2244
2341
|
setCardStatusBarDark();
|
|
2245
2342
|
}
|
|
2246
|
-
await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
2343
|
+
await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, ionicEnterAnimation, {
|
|
2247
2344
|
presentingEl: presentingElement,
|
|
2248
2345
|
currentBreakpoint: this.initialBreakpoint,
|
|
2249
2346
|
backdropBreakpoint: this.backdropBreakpoint,
|
|
@@ -2930,20 +3027,20 @@ const Modal = class {
|
|
|
2930
3027
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
2931
3028
|
const shape = this.getShape();
|
|
2932
3029
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
2933
|
-
return (h(Host, Object.assign({ key: '
|
|
3030
|
+
return (h(Host, Object.assign({ key: '3011c8f49c1ccb6c20c01db35b59fe4f6e22ec01', "no-router": true,
|
|
2934
3031
|
// Allow the modal to be navigable when the handle is focusable
|
|
2935
3032
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
2936
3033
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
2937
|
-
}, class: Object.assign({ [theme]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-${shape}`]: shape !== undefined, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '
|
|
3034
|
+
}, class: Object.assign({ [theme]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-${shape}`]: shape !== undefined, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: 'ab99fb4ff1b335b06d5676890012dfe3cd1a1a01', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), theme === 'ios' && h("div", { key: '95d4c79c4455c6a5ae6d581fa9dfaabdbee8c567', class: "modal-shadow" }), h("div", Object.assign({ key: '2d7d2406cdb986c69ef52708d33eca67d8a877f8',
|
|
2938
3035
|
/*
|
|
2939
3036
|
role and aria-modal must be used on the
|
|
2940
3037
|
same element. They must also be set inside the
|
|
2941
3038
|
shadow DOM otherwise ion-button will not be highlighted
|
|
2942
3039
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
2943
3040
|
*/
|
|
2944
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '
|
|
3041
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'ccec8bfc314763bd6dd868b69fbfdc085f5957c9', class: "modal-handle",
|
|
2945
3042
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
2946
|
-
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '
|
|
3043
|
+
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '38469e3447b46983783627d697e12cadcef614fa', onSlotchange: this.onSlotChange }))));
|
|
2947
3044
|
}
|
|
2948
3045
|
get el() { return getElement(this); }
|
|
2949
3046
|
static get watchers() { return {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { r as registerInstance, c as createEvent, f as printIonWarning, h, d as Host, g as getElement } from './index-Omi_TcwW.js';
|
|
5
|
-
import { B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, n as focusFirstDescendant, g as dismiss, h as eventMethod, F as FOCUS_TRAP_DISABLE_CLASS } from './overlays-
|
|
5
|
+
import { B as BACKDROP, j as prepareOverlay, k as setOverlayId, f as present, n as focusFirstDescendant, g as dismiss, h as eventMethod, F as FOCUS_TRAP_DISABLE_CLASS } from './overlays-VA-4NWjf.js';
|
|
6
6
|
import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-CjVwn_KZ.js';
|
|
7
7
|
import { g as getElementRoot, r as raf, f as addEventListener, h as hasLazyBuild } from './helpers-Do7zwvM1.js';
|
|
8
8
|
import { c as createLockController } from './lock-controller-B-hirT0v.js';
|
|
@@ -830,6 +830,92 @@ const shouldShowArrow = (side, didAdjustBounds = false, ev, trigger) => {
|
|
|
830
830
|
return true;
|
|
831
831
|
};
|
|
832
832
|
|
|
833
|
+
const POPOVER_MD_BODY_PADDING$1 = 12;
|
|
834
|
+
/**
|
|
835
|
+
* Ionic Popover Enter Animation
|
|
836
|
+
*/
|
|
837
|
+
// TODO(FW-2832): types
|
|
838
|
+
const ionicEnterAnimation = (baseEl, opts) => {
|
|
839
|
+
var _a;
|
|
840
|
+
const { event: ev, size, trigger, reference, side, align } = opts;
|
|
841
|
+
const doc = baseEl.ownerDocument;
|
|
842
|
+
const isRTL = doc.dir === 'rtl';
|
|
843
|
+
const bodyWidth = doc.defaultView.innerWidth;
|
|
844
|
+
const bodyHeight = doc.defaultView.innerHeight;
|
|
845
|
+
const root = getElementRoot(baseEl);
|
|
846
|
+
const contentEl = root.querySelector('.popover-content');
|
|
847
|
+
const referenceSizeEl = trigger || ((_a = ev === null || ev === void 0 ? void 0 : ev.detail) === null || _a === void 0 ? void 0 : _a.ionShadowTarget) || (ev === null || ev === void 0 ? void 0 : ev.target);
|
|
848
|
+
const { contentWidth, contentHeight } = getPopoverDimensions(size, contentEl, referenceSizeEl);
|
|
849
|
+
const defaultPosition = {
|
|
850
|
+
top: bodyHeight / 2 - contentHeight / 2,
|
|
851
|
+
left: bodyWidth / 2 - contentWidth / 2,
|
|
852
|
+
originX: isRTL ? 'right' : 'left',
|
|
853
|
+
originY: 'top',
|
|
854
|
+
};
|
|
855
|
+
const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
|
|
856
|
+
const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING$1;
|
|
857
|
+
// MD mode now applies safe-area insets (previously passed 0, ignoring all safe areas).
|
|
858
|
+
// This is needed for Android edge-to-edge (API 36+) where system bars overlap content.
|
|
859
|
+
const safeArea = size === 'cover' ? { top: 0, bottom: 0, left: 0, right: 0 } : getSafeAreaInsets(doc);
|
|
860
|
+
const { originX, originY, top, left, bottom, checkSafeAreaLeft, checkSafeAreaRight, checkSafeAreaTop, checkSafeAreaBottom, addPopoverBottomClass, } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, safeArea, results.originX, results.originY, results.referenceCoordinates);
|
|
861
|
+
const safeAreaLeftCalc = ' + var(--ion-safe-area-left, 0px)';
|
|
862
|
+
const safeAreaRightCalc = ' - var(--ion-safe-area-right, 0px)';
|
|
863
|
+
let leftValue = `${left}px`;
|
|
864
|
+
if (checkSafeAreaLeft) {
|
|
865
|
+
leftValue = `${left}px${safeAreaLeftCalc}`;
|
|
866
|
+
}
|
|
867
|
+
if (checkSafeAreaRight) {
|
|
868
|
+
leftValue = `${left}px${safeAreaRightCalc}`;
|
|
869
|
+
}
|
|
870
|
+
let topValue = `${top}px`;
|
|
871
|
+
if (checkSafeAreaTop) {
|
|
872
|
+
topValue = `${top}px + var(--ion-safe-area-top, 0px)`;
|
|
873
|
+
}
|
|
874
|
+
const baseAnimation = createAnimation();
|
|
875
|
+
const backdropAnimation = createAnimation();
|
|
876
|
+
const wrapperAnimation = createAnimation();
|
|
877
|
+
const contentAnimation = createAnimation();
|
|
878
|
+
const viewportAnimation = createAnimation();
|
|
879
|
+
backdropAnimation
|
|
880
|
+
.addElement(root.querySelector('ion-backdrop'))
|
|
881
|
+
.fromTo('opacity', 0.01, 'var(--backdrop-opacity)')
|
|
882
|
+
.beforeStyles({
|
|
883
|
+
'pointer-events': 'none',
|
|
884
|
+
})
|
|
885
|
+
.afterClearStyles(['pointer-events']);
|
|
886
|
+
wrapperAnimation.addElement(root.querySelector('.popover-wrapper')).duration(150).fromTo('opacity', 0.01, 1);
|
|
887
|
+
contentAnimation
|
|
888
|
+
.addElement(contentEl)
|
|
889
|
+
.beforeStyles({
|
|
890
|
+
top: `calc(${topValue} + var(--offset-y, 0px))`,
|
|
891
|
+
left: `calc(${leftValue} + var(--offset-x, 0px))`,
|
|
892
|
+
'transform-origin': `${originY} ${originX}`,
|
|
893
|
+
})
|
|
894
|
+
.beforeAddWrite(() => {
|
|
895
|
+
if (bottom !== undefined) {
|
|
896
|
+
let bottomValue = `${bottom}px`;
|
|
897
|
+
if (checkSafeAreaBottom) {
|
|
898
|
+
bottomValue = `${bottom}px + var(--ion-safe-area-bottom, 0px)`;
|
|
899
|
+
}
|
|
900
|
+
contentEl.style.setProperty('bottom', `calc(${bottomValue})`);
|
|
901
|
+
}
|
|
902
|
+
})
|
|
903
|
+
.fromTo('transform', 'scale(0.8)', 'scale(1)');
|
|
904
|
+
viewportAnimation.addElement(root.querySelector('.popover-viewport')).fromTo('opacity', 0.01, 1);
|
|
905
|
+
return baseAnimation
|
|
906
|
+
.easing('cubic-bezier(0.36,0.66,0.04,1)')
|
|
907
|
+
.duration(300)
|
|
908
|
+
.beforeAddWrite(() => {
|
|
909
|
+
if (size === 'cover') {
|
|
910
|
+
baseEl.style.setProperty('--width', `${contentWidth}px`);
|
|
911
|
+
}
|
|
912
|
+
if (addPopoverBottomClass) {
|
|
913
|
+
baseEl.classList.add('popover-bottom');
|
|
914
|
+
}
|
|
915
|
+
})
|
|
916
|
+
.addAnimation([backdropAnimation, wrapperAnimation, contentAnimation, viewportAnimation]);
|
|
917
|
+
};
|
|
918
|
+
|
|
833
919
|
const POPOVER_IOS_BODY_PADDING = 5;
|
|
834
920
|
/**
|
|
835
921
|
* Minimum edge margin for iOS popovers ensures visual spacing from screen
|
|
@@ -1434,7 +1520,7 @@ const Popover = class {
|
|
|
1434
1520
|
else if (!this.keepContentsMounted) {
|
|
1435
1521
|
await waitForMount();
|
|
1436
1522
|
}
|
|
1437
|
-
await present(this, 'popoverEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
1523
|
+
await present(this, 'popoverEnter', iosEnterAnimation, mdEnterAnimation, ionicEnterAnimation, {
|
|
1438
1524
|
event: event || this.event,
|
|
1439
1525
|
size: this.size,
|
|
1440
1526
|
trigger: this.triggerEl,
|
|
@@ -1543,9 +1629,9 @@ const Popover = class {
|
|
|
1543
1629
|
const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
|
|
1544
1630
|
const desktop = isPlatform('desktop');
|
|
1545
1631
|
const enableArrow = arrow && !parentPopover;
|
|
1546
|
-
return (h(Host, Object.assign({ key: '
|
|
1632
|
+
return (h(Host, Object.assign({ key: '398b4c72cfea89fb743d427e3c2b48507649aff1', "aria-modal": "true", "no-router": true, tabindex: "-1" }, htmlAttributes, { style: {
|
|
1547
1633
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
1548
|
-
}, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [theme]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: '
|
|
1634
|
+
}, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [theme]: true, 'popover-translucent': this.translucent, 'overlay-hidden': true, 'popover-desktop': desktop, [`popover-side-${side}`]: true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false, 'popover-nested': !!parentPopover }), onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }), !parentPopover && h("ion-backdrop", { key: '6baec0b33665557c55425ffad9c6b31741c25651', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '6ce3a61164f478560cc45c618fc5b7f62b491ecd', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: 'a36815fc0417a10fb350429909a79cb4025baf3a', class: "popover-arrow", part: "arrow" }), h("div", { key: 'cec3436cdb2cb6fa839c37abb3cb6daf7de453de', class: "popover-content", part: "content" }, h("slot", { key: '5405fb03bab017acd7fa09d00cfe1b7cfbdfae92' })))));
|
|
1549
1635
|
}
|
|
1550
1636
|
get el() { return getElement(this); }
|
|
1551
1637
|
static get watchers() { return {
|