@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.
Files changed (42) hide show
  1. package/components/content.js +6 -79
  2. package/components/ion-tab-bar.js +23 -3
  3. package/components/modal.js +12 -200
  4. package/components/popover.js +10 -73
  5. package/dist/cjs/ion-app_8.cjs.entry.js +5 -78
  6. package/dist/cjs/ion-modal.cjs.entry.js +12 -200
  7. package/dist/cjs/ion-popover.cjs.entry.js +10 -73
  8. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +23 -3
  9. package/dist/collection/components/content/content.css +0 -10
  10. package/dist/collection/components/content/content.js +4 -77
  11. package/dist/collection/components/modal/gestures/sheet.js +1 -3
  12. package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -3
  13. package/dist/collection/components/modal/modal.ios.css +4 -0
  14. package/dist/collection/components/modal/modal.js +8 -192
  15. package/dist/collection/components/modal/modal.md.css +4 -0
  16. package/dist/collection/components/popover/animations/ios.enter.js +5 -21
  17. package/dist/collection/components/popover/animations/md.enter.js +4 -20
  18. package/dist/collection/components/popover/utils.js +1 -32
  19. package/dist/collection/components/tab-bar/tab-bar.js +23 -3
  20. package/dist/docs.json +1 -1
  21. package/dist/esm/ion-app_8.entry.js +6 -79
  22. package/dist/esm/ion-modal.entry.js +12 -200
  23. package/dist/esm/ion-popover.entry.js +10 -73
  24. package/dist/esm/ion-tab-bar_2.entry.js +23 -3
  25. package/dist/ionic/ionic.esm.js +1 -1
  26. package/dist/ionic/p-172a579f.entry.js +4 -0
  27. package/dist/ionic/p-732b2fd6.entry.js +4 -0
  28. package/dist/ionic/p-91840a80.entry.js +4 -0
  29. package/dist/ionic/p-f9061316.entry.js +4 -0
  30. package/dist/types/components/content/content.d.ts +0 -24
  31. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  32. package/dist/types/components/modal/gestures/swipe-to-close.d.ts +1 -1
  33. package/dist/types/components/modal/modal.d.ts +0 -39
  34. package/dist/types/components/popover/utils.d.ts +0 -2
  35. package/dist/types/components/tab-bar/tab-bar.d.ts +1 -0
  36. package/hydrate/index.js +50 -353
  37. package/hydrate/index.mjs +50 -353
  38. package/package.json +1 -1
  39. package/dist/ionic/p-3830217a.entry.js +0 -4
  40. package/dist/ionic/p-7268efa5.entry.js +0 -4
  41. package/dist/ionic/p-a4827773.entry.js +0 -4
  42. 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, i as forceUpdate, a as readTask, w as writeTask, j as printIonError } from './index-C8IsBmNU.js';
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)}:host(.safe-area-top) #background-content,:host(.safe-area-top) .inner-scroll{top:var(--ion-safe-area-top, 0px)}:host(.safe-area-bottom) #background-content,:host(.safe-area-bottom) .inner-scroll{bottom:var(--ion-safe-area-bottom, 0px)}::slotted([slot=fixed]){position:absolute;-webkit-transform:translateZ(0);transform:translateZ(0)}";
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, hasFooter, hasHeader, inheritedAttributes, isMainContent, scrollX, scrollY, el } = this;
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: 'c8e3a93e0b1ba6f7aa81a6a6065145ece9a6e2ef', role: isMainContent ? 'main' : undefined, class: createColorClasses(this.color, {
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: '4c0482cda885348eea9eb66d7f076af6b38c52e5', ref: (el) => (this.backgroundContentEl = el), id: "background-content", part: "background" }), fixedSlotPlacement === 'before' ? h("slot", { name: "fixed" }) : null, h("div", { key: '6fbb39bf7ab7120009c56aea9340de45c934eeed', class: {
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: '6425bc84edbc0c5b1f2764a1d611df1b46628274' })), transitionShadow ? (h("div", { class: "transition-effect" }, h("div", { class: "transition-cover" }), h("div", { class: "transition-shadow" }))) : null, fixedSlotPlacement === 'after' ? h("slot", { name: "fixed" }) : null));
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, onGestureMove) => {
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, onGestureMove) => {
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
- // Invalidate safe-area cache on resize (device rotation may change values)
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
- }, () => this.updateSafeAreaOverrides());
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
- this.updateSafeAreaOverrides();
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, _b;
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: '11cd16cc481093a38a327abdd94467be3f71718d', "no-router": true,
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: '125658fbb071960da3905854668078e15bce56da', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '4a63815ef165e5806fef85ef48bf509813ff55c9', class: "modal-shadow" }), h("div", Object.assign({ key: 'cfc4b20354cbf2c0f873f6aee91c9b8f553de61d',
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: '33a4ee89bb8b6512883cb8756641c1e27fdb0ebc', class: "modal-handle",
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: '986fafb71234591c96e927f92b7330bb5c76fc2e', onSlotchange: this.onSlotChange }))));
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 {