@ionic/core 8.7.17-dev.11767796972.148e4bc4 → 8.7.17-dev.11767895575.16ea7cef
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/content.js +6 -79
- package/components/ion-tab-bar.js +23 -3
- package/components/modal.js +12 -200
- package/components/popover.js +10 -73
- package/dist/cjs/ion-app_8.cjs.entry.js +5 -78
- package/dist/cjs/ion-modal.cjs.entry.js +12 -200
- package/dist/cjs/ion-popover.cjs.entry.js +10 -73
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +23 -3
- package/dist/collection/components/content/content.css +0 -10
- package/dist/collection/components/content/content.js +4 -77
- package/dist/collection/components/modal/gestures/sheet.js +1 -3
- package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -3
- package/dist/collection/components/modal/modal.ios.css +4 -0
- package/dist/collection/components/modal/modal.js +8 -192
- package/dist/collection/components/modal/modal.md.css +4 -0
- package/dist/collection/components/popover/animations/ios.enter.js +5 -21
- package/dist/collection/components/popover/animations/md.enter.js +4 -20
- package/dist/collection/components/popover/utils.js +1 -32
- package/dist/collection/components/tab-bar/tab-bar.js +23 -3
- package/dist/docs.json +1 -1
- package/dist/esm/ion-app_8.entry.js +6 -79
- package/dist/esm/ion-modal.entry.js +12 -200
- package/dist/esm/ion-popover.entry.js +10 -73
- package/dist/esm/ion-tab-bar_2.entry.js +23 -3
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-172a579f.entry.js +4 -0
- package/dist/ionic/p-732b2fd6.entry.js +4 -0
- package/dist/ionic/p-91840a80.entry.js +4 -0
- package/dist/ionic/p-f9061316.entry.js +4 -0
- package/dist/types/components/content/content.d.ts +0 -24
- package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
- package/dist/types/components/modal/gestures/swipe-to-close.d.ts +1 -1
- package/dist/types/components/modal/modal.d.ts +0 -39
- package/dist/types/components/popover/utils.d.ts +0 -2
- package/dist/types/components/tab-bar/tab-bar.d.ts +1 -0
- package/hydrate/index.js +50 -353
- package/hydrate/index.mjs +50 -353
- package/package.json +1 -1
- package/dist/ionic/p-3830217a.entry.js +0 -4
- package/dist/ionic/p-7268efa5.entry.js +0 -4
- package/dist/ionic/p-a4827773.entry.js +0 -4
- package/dist/ionic/p-cecd141b.entry.js +0 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
-
import { r as registerInstance, h, e as config, d as Host, g as getElement, f as printIonWarning, c as createEvent,
|
|
4
|
+
import { r as registerInstance, h, e as config, d as Host, g as getElement, f as printIonWarning, c as createEvent, a as readTask, i as forceUpdate, w as writeTask, j as printIonError } from './index-C8IsBmNU.js';
|
|
5
5
|
import { shouldUseCloseWatcher } from './hardware-back-button-CPLxO-Ev.js';
|
|
6
6
|
import { b as getIonMode, a as isPlatform } from './ionic-global-CDrldh-5.js';
|
|
7
7
|
import { i as inheritAriaAttributes, h as hasLazyBuild, c as componentOnReady, e as clamp, s as shallowEqualStringMap } from './helpers-DEn3pfjm.js';
|
|
@@ -152,7 +152,7 @@ Buttons.style = {
|
|
|
152
152
|
md: buttonsMdCss
|
|
153
153
|
};
|
|
154
154
|
|
|
155
|
-
const contentCss = ":host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:\"\"}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}
|
|
155
|
+
const contentCss = ":host{--background:var(--ion-background-color, #fff);--color:var(--ion-text-color, #000);--padding-top:0px;--padding-bottom:0px;--padding-start:0px;--padding-end:0px;--keyboard-offset:0px;--offset-top:0px;--offset-bottom:0px;--overflow:auto;display:block;position:relative;-ms-flex:1;flex:1;width:100%;height:100%;margin:0 !important;padding:0 !important;font-family:var(--ion-font-family, inherit);contain:size style}:host(.ion-color) .inner-scroll{background:var(--ion-color-base);color:var(--ion-color-contrast)}#background-content{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);position:absolute;background:var(--background)}.inner-scroll{left:0px;right:0px;top:calc(var(--offset-top) * -1);bottom:calc(var(--offset-bottom) * -1);-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:calc(var(--padding-top) + var(--offset-top));padding-bottom:calc(var(--padding-bottom) + var(--keyboard-offset) + var(--offset-bottom));position:absolute;color:var(--color);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;-ms-touch-action:pan-x pan-y pinch-zoom;touch-action:pan-x pan-y pinch-zoom}.scroll-y,.scroll-x{-webkit-overflow-scrolling:touch;z-index:0;will-change:scroll-position}.scroll-y{overflow-y:var(--overflow);overscroll-behavior-y:contain}.scroll-x{overflow-x:var(--overflow);overscroll-behavior-x:contain}.overscroll::before,.overscroll::after{position:absolute;width:1px;height:1px;content:\"\"}.overscroll::before{bottom:-1px}.overscroll::after{top:-1px}:host(.content-sizing){display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-height:0;contain:none}:host(.content-sizing) .inner-scroll{position:relative;top:0;bottom:0;margin-top:calc(var(--offset-top) * -1);margin-bottom:calc(var(--offset-bottom) * -1)}.transition-effect{display:none;position:absolute;width:100%;height:100vh;opacity:0;pointer-events:none}:host(.content-ltr) .transition-effect{left:-100%;}:host(.content-rtl) .transition-effect{right:-100%;}.transition-cover{position:absolute;right:0;width:100%;height:100%;background:black;opacity:0.1}.transition-shadow{display:block;position:absolute;width:100%;height:100%;-webkit-box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03);box-shadow:inset -9px 0 9px 0 rgba(0, 0, 100, 0.03)}:host(.content-ltr) .transition-shadow{right:0;}:host(.content-rtl) .transition-shadow{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}";
|
|
156
156
|
|
|
157
157
|
const Content = class {
|
|
158
158
|
constructor(hostRef) {
|
|
@@ -169,12 +169,6 @@ const Content = class {
|
|
|
169
169
|
this.isMainContent = true;
|
|
170
170
|
this.resizeTimeout = null;
|
|
171
171
|
this.inheritedAttributes = {};
|
|
172
|
-
/**
|
|
173
|
-
* Track whether this content has sibling header/footer elements.
|
|
174
|
-
* When absent, we need to apply safe-area padding directly.
|
|
175
|
-
*/
|
|
176
|
-
this.hasHeader = false;
|
|
177
|
-
this.hasFooter = false;
|
|
178
172
|
this.tabsElement = null;
|
|
179
173
|
// Detail is used in a hot loop in the scroll event, by allocating it here
|
|
180
174
|
// V8 will be able to inline any read/write to it since it's a monomorphic class.
|
|
@@ -230,8 +224,6 @@ const Content = class {
|
|
|
230
224
|
}
|
|
231
225
|
connectedCallback() {
|
|
232
226
|
this.isMainContent = this.el.closest('ion-menu, ion-popover, ion-modal') === null;
|
|
233
|
-
// Detect sibling header/footer for safe-area handling
|
|
234
|
-
this.detectSiblingElements();
|
|
235
227
|
/**
|
|
236
228
|
* The fullscreen content offsets need to be
|
|
237
229
|
* computed after the tab bar has loaded. Since
|
|
@@ -267,71 +259,8 @@ const Content = class {
|
|
|
267
259
|
}
|
|
268
260
|
}
|
|
269
261
|
}
|
|
270
|
-
/**
|
|
271
|
-
* Detects sibling ion-header and ion-footer elements and sets up
|
|
272
|
-
* a mutation observer to handle dynamic changes (e.g., conditional rendering).
|
|
273
|
-
*/
|
|
274
|
-
detectSiblingElements() {
|
|
275
|
-
this.updateSiblingDetection();
|
|
276
|
-
// Watch for dynamic header/footer changes (common in React conditional rendering)
|
|
277
|
-
const parent = this.el.parentElement;
|
|
278
|
-
if (parent && !this.parentMutationObserver) {
|
|
279
|
-
this.parentMutationObserver = new MutationObserver(() => {
|
|
280
|
-
this.updateSiblingDetection();
|
|
281
|
-
forceUpdate(this);
|
|
282
|
-
});
|
|
283
|
-
this.parentMutationObserver.observe(parent, { childList: true });
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Updates hasHeader/hasFooter based on current DOM state.
|
|
288
|
-
* Checks both direct siblings and elements wrapped in custom components
|
|
289
|
-
* (e.g., <my-header><ion-header>...</ion-header></my-header>).
|
|
290
|
-
*/
|
|
291
|
-
updateSiblingDetection() {
|
|
292
|
-
const parent = this.el.parentElement;
|
|
293
|
-
if (parent) {
|
|
294
|
-
// First check for direct ion-header/ion-footer siblings
|
|
295
|
-
this.hasHeader = parent.querySelector(':scope > ion-header') !== null;
|
|
296
|
-
this.hasFooter = parent.querySelector(':scope > ion-footer') !== null;
|
|
297
|
-
// If not found, check if any sibling contains them (wrapped components)
|
|
298
|
-
if (!this.hasHeader) {
|
|
299
|
-
this.hasHeader = this.siblingContainsElement(parent, 'ion-header');
|
|
300
|
-
}
|
|
301
|
-
if (!this.hasFooter) {
|
|
302
|
-
this.hasFooter = this.siblingContainsElement(parent, 'ion-footer');
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
// If no footer found, check if we're inside ion-tabs which has ion-tab-bar
|
|
306
|
-
if (!this.hasFooter) {
|
|
307
|
-
const tabs = this.el.closest('ion-tabs');
|
|
308
|
-
if (tabs) {
|
|
309
|
-
this.hasFooter = tabs.querySelector(':scope > ion-tab-bar') !== null;
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Checks if any sibling element of ion-content contains the specified element.
|
|
315
|
-
* Only searches one level deep to avoid finding elements in nested pages.
|
|
316
|
-
*/
|
|
317
|
-
siblingContainsElement(parent, tagName) {
|
|
318
|
-
for (const sibling of parent.children) {
|
|
319
|
-
// Skip ion-content itself
|
|
320
|
-
if (sibling === this.el)
|
|
321
|
-
continue;
|
|
322
|
-
// Check if this sibling contains the target element as an immediate child
|
|
323
|
-
if (sibling.querySelector(`:scope > ${tagName}`) !== null) {
|
|
324
|
-
return true;
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
return false;
|
|
328
|
-
}
|
|
329
262
|
disconnectedCallback() {
|
|
330
|
-
var _a;
|
|
331
263
|
this.onScrollEnd();
|
|
332
|
-
// Clean up mutation observer to prevent memory leaks
|
|
333
|
-
(_a = this.parentMutationObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
334
|
-
this.parentMutationObserver = undefined;
|
|
335
264
|
if (hasLazyBuild(this.el)) {
|
|
336
265
|
/**
|
|
337
266
|
* The event listener and tabs caches need to
|
|
@@ -578,28 +507,26 @@ const Content = class {
|
|
|
578
507
|
}
|
|
579
508
|
}
|
|
580
509
|
render() {
|
|
581
|
-
const { fixedSlotPlacement,
|
|
510
|
+
const { fixedSlotPlacement, inheritedAttributes, isMainContent, scrollX, scrollY, el } = this;
|
|
582
511
|
const rtl = isRTL(el) ? 'rtl' : 'ltr';
|
|
583
512
|
const mode = getIonMode(this);
|
|
584
513
|
const forceOverscroll = this.shouldForceOverscroll();
|
|
585
514
|
const transitionShadow = mode === 'ios';
|
|
586
515
|
this.resize();
|
|
587
|
-
return (h(Host, Object.assign({ key: '
|
|
516
|
+
return (h(Host, Object.assign({ key: 'cd8781f848d8dc926fe66f43d43c49564425a507', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
|
|
588
517
|
[mode]: true,
|
|
589
518
|
'content-sizing': hostContext('ion-popover', this.el),
|
|
590
519
|
overscroll: forceOverscroll,
|
|
591
520
|
[`content-${rtl}`]: true,
|
|
592
|
-
'safe-area-top': isMainContent && !hasHeader,
|
|
593
|
-
'safe-area-bottom': isMainContent && !hasFooter,
|
|
594
521
|
}), style: {
|
|
595
522
|
'--offset-top': `${this.cTop}px`,
|
|
596
523
|
'--offset-bottom': `${this.cBottom}px`,
|
|
597
|
-
} }, inheritedAttributes), h("div", { key: '
|
|
524
|
+
} }, inheritedAttributes), h("div", { key: '95b112d7cae30f22ef778ceffb88edb4d941c170', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '2fdfcbc39fb66f11b6191911f2941c660f4c12e5', class: {
|
|
598
525
|
'inner-scroll': true,
|
|
599
526
|
'scroll-x': scrollX,
|
|
600
527
|
'scroll-y': scrollY,
|
|
601
528
|
overscroll: (scrollX || scrollY) && forceOverscroll,
|
|
602
|
-
}, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '
|
|
529
|
+
}, ref: (scrollEl) => (this.scrollEl = scrollEl), onScroll: this.scrollEvents ? (ev) => this.onScroll(ev) : undefined, part: "scroll" }, h("slot", { key: '6bc77e0054ec8e21635a7f2abfe0ca46e0962e03' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
|
|
603
530
|
}
|
|
604
531
|
get el() { return getElement(this); }
|
|
605
532
|
};
|
|
@@ -247,7 +247,7 @@ const calculateSpringStep = (t) => {
|
|
|
247
247
|
const SwipeToCloseDefaults = {
|
|
248
248
|
MIN_PRESENTING_SCALE: 0.915,
|
|
249
249
|
};
|
|
250
|
-
const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss
|
|
250
|
+
const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss) => {
|
|
251
251
|
/**
|
|
252
252
|
* The step value at which a card modal
|
|
253
253
|
* is eligible for dismissing via gesture.
|
|
@@ -404,8 +404,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onG
|
|
|
404
404
|
const processedStep = isAttemptingDismissWithCanDismiss ? calculateSpringStep(step / maxStep) : step;
|
|
405
405
|
const clampedStep = clamp(0.0001, processedStep, maxStep);
|
|
406
406
|
animation.progressStep(clampedStep);
|
|
407
|
-
// Notify modal of position change for safe-area updates
|
|
408
|
-
onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
|
|
409
407
|
/**
|
|
410
408
|
* When swiping down half way, the status bar style
|
|
411
409
|
* should be reset to its default value.
|
|
@@ -949,7 +947,7 @@ const mdLeaveAnimation = (baseEl, opts) => {
|
|
|
949
947
|
return baseAnimation;
|
|
950
948
|
};
|
|
951
949
|
|
|
952
|
-
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange
|
|
950
|
+
const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
|
|
953
951
|
// Defaults for the sheet swipe animation
|
|
954
952
|
const defaultBackdrop = [
|
|
955
953
|
{ offset: 0, opacity: 'var(--backdrop-opacity)' },
|
|
@@ -1280,8 +1278,6 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1280
1278
|
: step;
|
|
1281
1279
|
offset = clamp(0.0001, processedStep, maxStep);
|
|
1282
1280
|
animation.progressStep(offset);
|
|
1283
|
-
// Notify modal of position change for safe-area updates
|
|
1284
|
-
onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
|
|
1285
1281
|
};
|
|
1286
1282
|
const onEnd = (detail) => {
|
|
1287
1283
|
/**
|
|
@@ -1476,9 +1472,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1476
1472
|
};
|
|
1477
1473
|
};
|
|
1478
1474
|
|
|
1479
|
-
const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right: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;color:var(--ion-text-color, #000);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}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.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;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}: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{--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}";
|
|
1475
|
+
const modalIosCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right: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;color:var(--ion-text-color, #000);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}@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{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.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;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}: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{--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}";
|
|
1480
1476
|
|
|
1481
|
-
const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right: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;color:var(--ion-text-color, #000);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}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.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;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}: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{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
|
|
1477
|
+
const modalMdCss = ":host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right: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;color:var(--ion-text-color, #000);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}@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{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.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;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:\"\"}:host(.modal-sheet){--height:calc(100% - (var(--ion-safe-area-top) + 10px))}: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{--backdrop-opacity:var(--ion-backdrop-opacity, 0.32)}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--border-radius:2px;--box-shadow:0 28px 48px rgba(0, 0, 0, 0.4)}}.modal-wrapper{-webkit-transform:translate3d(0, 40px, 0);transform:translate3d(0, 40px, 0);opacity:0.01}";
|
|
1482
1478
|
|
|
1483
1479
|
const Modal = class {
|
|
1484
1480
|
constructor(hostRef) {
|
|
@@ -1501,10 +1497,6 @@ const Modal = class {
|
|
|
1501
1497
|
this.inline = false;
|
|
1502
1498
|
// Whether or not modal is being dismissed via gesture
|
|
1503
1499
|
this.gestureAnimationDismissing = false;
|
|
1504
|
-
// Whether to skip coordinate-based safe-area detection (for fullscreen phone modals)
|
|
1505
|
-
this.skipSafeAreaCoordinateDetection = false;
|
|
1506
|
-
// Track previous safe-area state to avoid redundant DOM writes
|
|
1507
|
-
this.prevSafeAreaState = { top: false, bottom: false, left: false, right: false };
|
|
1508
1500
|
this.presented = false;
|
|
1509
1501
|
/** @internal */
|
|
1510
1502
|
this.hasController = false;
|
|
@@ -1695,10 +1687,7 @@ const Modal = class {
|
|
|
1695
1687
|
}
|
|
1696
1688
|
}
|
|
1697
1689
|
onWindowResize() {
|
|
1698
|
-
//
|
|
1699
|
-
this.cachedSafeAreas = undefined;
|
|
1700
|
-
this.updateSafeAreaOverrides();
|
|
1701
|
-
// Only handle view transition for iOS card modals when no custom animations are provided
|
|
1690
|
+
// Only handle resize for iOS card modals when no custom animations are provided
|
|
1702
1691
|
if (getIonMode(this) !== 'ios' || !this.presentingElement || this.enterAnimation || this.leaveAnimation) {
|
|
1703
1692
|
return;
|
|
1704
1693
|
}
|
|
@@ -1880,8 +1869,6 @@ const Modal = class {
|
|
|
1880
1869
|
else if (!this.keepContentsMounted) {
|
|
1881
1870
|
await waitForMount();
|
|
1882
1871
|
}
|
|
1883
|
-
// Predict safe-area needs based on modal configuration to avoid visual snap
|
|
1884
|
-
this.setInitialSafeAreaOverrides(presentingElement);
|
|
1885
1872
|
writeTask(() => this.el.classList.add('show-modal'));
|
|
1886
1873
|
const hasCardModal = presentingElement !== undefined;
|
|
1887
1874
|
/**
|
|
@@ -1943,8 +1930,6 @@ const Modal = class {
|
|
|
1943
1930
|
else if (hasCardModal) {
|
|
1944
1931
|
this.initSwipeToClose();
|
|
1945
1932
|
}
|
|
1946
|
-
// Now that animation is complete, update safe-area based on actual position
|
|
1947
|
-
this.updateSafeAreaOverrides();
|
|
1948
1933
|
// Initialize view transition listener for iOS card modals
|
|
1949
1934
|
this.initViewTransitionListener();
|
|
1950
1935
|
// Initialize parent removal observer
|
|
@@ -1996,7 +1981,7 @@ const Modal = class {
|
|
|
1996
1981
|
await this.dismiss(undefined, GESTURE);
|
|
1997
1982
|
this.gestureAnimationDismissing = false;
|
|
1998
1983
|
});
|
|
1999
|
-
}
|
|
1984
|
+
});
|
|
2000
1985
|
this.gesture.enable(true);
|
|
2001
1986
|
}
|
|
2002
1987
|
initSheetGesture() {
|
|
@@ -2017,8 +2002,7 @@ const Modal = class {
|
|
|
2017
2002
|
this.currentBreakpoint = breakpoint;
|
|
2018
2003
|
this.ionBreakpointDidChange.emit({ breakpoint });
|
|
2019
2004
|
}
|
|
2020
|
-
|
|
2021
|
-
}, () => this.updateSafeAreaOverrides());
|
|
2005
|
+
});
|
|
2022
2006
|
this.gesture = gesture;
|
|
2023
2007
|
this.moveSheetToBreakpoint = moveSheetToBreakpoint;
|
|
2024
2008
|
this.gesture.enable(true);
|
|
@@ -2096,161 +2080,6 @@ const Modal = class {
|
|
|
2096
2080
|
// Clear the cached reference
|
|
2097
2081
|
this.cachedPageParent = undefined;
|
|
2098
2082
|
}
|
|
2099
|
-
/**
|
|
2100
|
-
* Sets initial safe-area overrides based on modal configuration before
|
|
2101
|
-
* the modal becomes visible. This predicts whether the modal will touch
|
|
2102
|
-
* screen edges to avoid a visual snap after animation completes.
|
|
2103
|
-
*/
|
|
2104
|
-
setInitialSafeAreaOverrides(presentingElement) {
|
|
2105
|
-
const style = this.el.style;
|
|
2106
|
-
const mode = getIonMode(this);
|
|
2107
|
-
const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
2108
|
-
// Card modals only exist in iOS mode - in MD mode, presentingElement is ignored
|
|
2109
|
-
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
2110
|
-
const isTablet = window.innerWidth >= 768;
|
|
2111
|
-
// Sheet modals always touch bottom edge, never top/left/right
|
|
2112
|
-
if (isSheetModal) {
|
|
2113
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
2114
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
2115
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
2116
|
-
return;
|
|
2117
|
-
}
|
|
2118
|
-
// Card modals have rounded top corners
|
|
2119
|
-
if (isCardModal) {
|
|
2120
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
2121
|
-
if (isTablet) {
|
|
2122
|
-
// On tablets, card modals are inset from all edges
|
|
2123
|
-
this.zeroAllSafeAreas();
|
|
2124
|
-
}
|
|
2125
|
-
else {
|
|
2126
|
-
// On phones, card modals still extend to the bottom edge
|
|
2127
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
2128
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
2129
|
-
this.applyFullscreenSafeArea();
|
|
2130
|
-
}
|
|
2131
|
-
return;
|
|
2132
|
-
}
|
|
2133
|
-
// Phone-sized fullscreen modals inherit safe areas and use wrapper padding
|
|
2134
|
-
if (!isTablet) {
|
|
2135
|
-
this.applyFullscreenSafeArea();
|
|
2136
|
-
return;
|
|
2137
|
-
}
|
|
2138
|
-
// Check if tablet modal is fullscreen via CSS custom properties
|
|
2139
|
-
const computedStyle = getComputedStyle(this.el);
|
|
2140
|
-
const width = computedStyle.getPropertyValue('--width').trim();
|
|
2141
|
-
const height = computedStyle.getPropertyValue('--height').trim();
|
|
2142
|
-
const isFullscreen = width === '100%' && height === '100%';
|
|
2143
|
-
if (isFullscreen) {
|
|
2144
|
-
this.applyFullscreenSafeArea();
|
|
2145
|
-
}
|
|
2146
|
-
else {
|
|
2147
|
-
// Centered dialog doesn't touch edges
|
|
2148
|
-
this.zeroAllSafeAreas();
|
|
2149
|
-
}
|
|
2150
|
-
}
|
|
2151
|
-
/**
|
|
2152
|
-
* Applies safe-area handling for fullscreen modals.
|
|
2153
|
-
* Adds wrapper padding when no footer is present to prevent
|
|
2154
|
-
* content from overlapping system navigation areas.
|
|
2155
|
-
*/
|
|
2156
|
-
applyFullscreenSafeArea() {
|
|
2157
|
-
this.skipSafeAreaCoordinateDetection = true;
|
|
2158
|
-
this.updateFooterPadding();
|
|
2159
|
-
// Watch for dynamic footer additions/removals (e.g., async data loading)
|
|
2160
|
-
if (!this.footerObserver) {
|
|
2161
|
-
this.footerObserver = new MutationObserver(() => this.updateFooterPadding());
|
|
2162
|
-
this.footerObserver.observe(this.el, { childList: true, subtree: true });
|
|
2163
|
-
}
|
|
2164
|
-
}
|
|
2165
|
-
/**
|
|
2166
|
-
* Updates wrapper padding based on footer presence.
|
|
2167
|
-
* Called initially and when footer is dynamically added/removed.
|
|
2168
|
-
*/
|
|
2169
|
-
updateFooterPadding() {
|
|
2170
|
-
if (!this.wrapperEl)
|
|
2171
|
-
return;
|
|
2172
|
-
const hasFooter = this.el.querySelector('ion-footer') !== null;
|
|
2173
|
-
if (hasFooter) {
|
|
2174
|
-
this.wrapperEl.style.removeProperty('padding-bottom');
|
|
2175
|
-
this.wrapperEl.style.removeProperty('box-sizing');
|
|
2176
|
-
}
|
|
2177
|
-
else {
|
|
2178
|
-
this.wrapperEl.style.setProperty('padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
|
|
2179
|
-
this.wrapperEl.style.setProperty('box-sizing', 'border-box');
|
|
2180
|
-
}
|
|
2181
|
-
}
|
|
2182
|
-
/**
|
|
2183
|
-
* Sets all safe-area CSS variables to 0px for modals that
|
|
2184
|
-
* don't touch screen edges.
|
|
2185
|
-
*/
|
|
2186
|
-
zeroAllSafeAreas() {
|
|
2187
|
-
const style = this.el.style;
|
|
2188
|
-
style.setProperty('--ion-safe-area-top', '0px');
|
|
2189
|
-
style.setProperty('--ion-safe-area-bottom', '0px');
|
|
2190
|
-
style.setProperty('--ion-safe-area-left', '0px');
|
|
2191
|
-
style.setProperty('--ion-safe-area-right', '0px');
|
|
2192
|
-
}
|
|
2193
|
-
/**
|
|
2194
|
-
* Gets the root safe-area values from the document element.
|
|
2195
|
-
* Uses cached values during gestures to avoid getComputedStyle calls.
|
|
2196
|
-
*/
|
|
2197
|
-
getSafeAreaValues() {
|
|
2198
|
-
if (!this.cachedSafeAreas) {
|
|
2199
|
-
const rootStyle = getComputedStyle(document.documentElement);
|
|
2200
|
-
this.cachedSafeAreas = {
|
|
2201
|
-
top: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-top')) || 0,
|
|
2202
|
-
bottom: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-bottom')) || 0,
|
|
2203
|
-
left: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-left')) || 0,
|
|
2204
|
-
right: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-right')) || 0,
|
|
2205
|
-
};
|
|
2206
|
-
}
|
|
2207
|
-
return this.cachedSafeAreas;
|
|
2208
|
-
}
|
|
2209
|
-
/**
|
|
2210
|
-
* Updates safe-area CSS variable overrides based on whether the modal
|
|
2211
|
-
* extends into each safe-area region. Called after animation
|
|
2212
|
-
* and during gestures to handle dynamic position changes.
|
|
2213
|
-
*
|
|
2214
|
-
* Optimized to avoid redundant DOM writes by tracking previous state.
|
|
2215
|
-
*/
|
|
2216
|
-
updateSafeAreaOverrides() {
|
|
2217
|
-
if (this.skipSafeAreaCoordinateDetection) {
|
|
2218
|
-
return;
|
|
2219
|
-
}
|
|
2220
|
-
const wrapper = this.wrapperEl;
|
|
2221
|
-
if (!wrapper) {
|
|
2222
|
-
return;
|
|
2223
|
-
}
|
|
2224
|
-
const rect = wrapper.getBoundingClientRect();
|
|
2225
|
-
const safeAreas = this.getSafeAreaValues();
|
|
2226
|
-
const extendsIntoTop = rect.top < safeAreas.top;
|
|
2227
|
-
const extendsIntoBottom = rect.bottom > window.innerHeight - safeAreas.bottom;
|
|
2228
|
-
const extendsIntoLeft = rect.left < safeAreas.left;
|
|
2229
|
-
const extendsIntoRight = rect.right > window.innerWidth - safeAreas.right;
|
|
2230
|
-
// Only update DOM when state actually changes
|
|
2231
|
-
const prev = this.prevSafeAreaState;
|
|
2232
|
-
const style = this.el.style;
|
|
2233
|
-
if (extendsIntoTop !== prev.top) {
|
|
2234
|
-
extendsIntoTop ? style.removeProperty('--ion-safe-area-top') : style.setProperty('--ion-safe-area-top', '0px');
|
|
2235
|
-
prev.top = extendsIntoTop;
|
|
2236
|
-
}
|
|
2237
|
-
if (extendsIntoBottom !== prev.bottom) {
|
|
2238
|
-
extendsIntoBottom
|
|
2239
|
-
? style.removeProperty('--ion-safe-area-bottom')
|
|
2240
|
-
: style.setProperty('--ion-safe-area-bottom', '0px');
|
|
2241
|
-
prev.bottom = extendsIntoBottom;
|
|
2242
|
-
}
|
|
2243
|
-
if (extendsIntoLeft !== prev.left) {
|
|
2244
|
-
extendsIntoLeft ? style.removeProperty('--ion-safe-area-left') : style.setProperty('--ion-safe-area-left', '0px');
|
|
2245
|
-
prev.left = extendsIntoLeft;
|
|
2246
|
-
}
|
|
2247
|
-
if (extendsIntoRight !== prev.right) {
|
|
2248
|
-
extendsIntoRight
|
|
2249
|
-
? style.removeProperty('--ion-safe-area-right')
|
|
2250
|
-
: style.setProperty('--ion-safe-area-right', '0px');
|
|
2251
|
-
prev.right = extendsIntoRight;
|
|
2252
|
-
}
|
|
2253
|
-
}
|
|
2254
2083
|
sheetOnDismiss() {
|
|
2255
2084
|
/**
|
|
2256
2085
|
* While the gesture animation is finishing
|
|
@@ -2281,7 +2110,7 @@ const Modal = class {
|
|
|
2281
2110
|
* For example, `cancel` or `backdrop`.
|
|
2282
2111
|
*/
|
|
2283
2112
|
async dismiss(data, role) {
|
|
2284
|
-
var _a
|
|
2113
|
+
var _a;
|
|
2285
2114
|
if (this.gestureAnimationDismissing && role !== GESTURE) {
|
|
2286
2115
|
return false;
|
|
2287
2116
|
}
|
|
@@ -2343,23 +2172,6 @@ const Modal = class {
|
|
|
2343
2172
|
}
|
|
2344
2173
|
this.currentBreakpoint = undefined;
|
|
2345
2174
|
this.animation = undefined;
|
|
2346
|
-
// Reset safe-area state for potential re-presentation
|
|
2347
|
-
this.skipSafeAreaCoordinateDetection = false;
|
|
2348
|
-
this.cachedSafeAreas = undefined;
|
|
2349
|
-
this.prevSafeAreaState = { top: false, bottom: false, left: false, right: false };
|
|
2350
|
-
(_b = this.footerObserver) === null || _b === void 0 ? void 0 : _b.disconnect();
|
|
2351
|
-
this.footerObserver = undefined;
|
|
2352
|
-
// Clear styles that may have been set for safe-area handling
|
|
2353
|
-
if (this.wrapperEl) {
|
|
2354
|
-
this.wrapperEl.style.removeProperty('padding-bottom');
|
|
2355
|
-
this.wrapperEl.style.removeProperty('box-sizing');
|
|
2356
|
-
}
|
|
2357
|
-
// Clear safe-area CSS variable overrides
|
|
2358
|
-
const style = this.el.style;
|
|
2359
|
-
style.removeProperty('--ion-safe-area-top');
|
|
2360
|
-
style.removeProperty('--ion-safe-area-bottom');
|
|
2361
|
-
style.removeProperty('--ion-safe-area-left');
|
|
2362
|
-
style.removeProperty('--ion-safe-area-right');
|
|
2363
2175
|
unlock();
|
|
2364
2176
|
return dismissed;
|
|
2365
2177
|
}
|
|
@@ -2609,20 +2421,20 @@ const Modal = class {
|
|
|
2609
2421
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
2610
2422
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
2611
2423
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
2612
|
-
return (h(Host, Object.assign({ key: '
|
|
2424
|
+
return (h(Host, Object.assign({ key: '87328006ea6c75ebc518ace300438492a567223e', "no-router": true,
|
|
2613
2425
|
// Allow the modal to be navigable when the handle is focusable
|
|
2614
2426
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
2615
2427
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
2616
|
-
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`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: '
|
|
2428
|
+
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`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: 'ee94ff8e09b691dd4ad4e4db1720f06bc3c5a469', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: 'bffd69b4635c22d9f249725bd952c1e93d5615c7', class: "modal-shadow" }), h("div", Object.assign({ key: '1d394d3c68916e464ff1fbf5242419f4a3d3cca1',
|
|
2617
2429
|
/*
|
|
2618
2430
|
role and aria-modal must be used on the
|
|
2619
2431
|
same element. They must also be set inside the
|
|
2620
2432
|
shadow DOM otherwise ion-button will not be highlighted
|
|
2621
2433
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
2622
2434
|
*/
|
|
2623
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '
|
|
2435
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: '2dcf58792018e557e0c323baad2d672bc99c0bb1', class: "modal-handle",
|
|
2624
2436
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
2625
|
-
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: '
|
|
2437
|
+
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: '44164b1e8710c3895400ad9f44ecd99873874ad5', onSlotchange: this.onSlotChange }))));
|
|
2626
2438
|
}
|
|
2627
2439
|
get el() { return getElement(this); }
|
|
2628
2440
|
static get watchers() { return {
|