@ionic/core 8.7.17-dev.11767636336.113b441d → 8.7.17-dev.11767641184.14a165bc

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 (34) hide show
  1. package/components/ion-tab-bar.js +3 -17
  2. package/components/modal.js +144 -11
  3. package/components/popover.js +60 -10
  4. package/dist/cjs/ion-modal.cjs.entry.js +144 -11
  5. package/dist/cjs/ion-popover.cjs.entry.js +60 -10
  6. package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -17
  7. package/dist/collection/components/modal/gestures/sheet.js +3 -1
  8. package/dist/collection/components/modal/gestures/swipe-to-close.js +3 -1
  9. package/dist/collection/components/modal/modal.ios.css +0 -4
  10. package/dist/collection/components/modal/modal.js +136 -7
  11. package/dist/collection/components/modal/modal.md.css +0 -4
  12. package/dist/collection/components/popover/animations/ios.enter.js +21 -5
  13. package/dist/collection/components/popover/animations/md.enter.js +20 -4
  14. package/dist/collection/components/popover/utils.js +19 -1
  15. package/dist/collection/components/tab-bar/tab-bar.js +3 -17
  16. package/dist/docs.json +1 -1
  17. package/dist/esm/ion-modal.entry.js +144 -11
  18. package/dist/esm/ion-popover.entry.js +60 -10
  19. package/dist/esm/ion-tab-bar_2.entry.js +3 -17
  20. package/dist/ionic/ionic.esm.js +1 -1
  21. package/dist/ionic/p-301ad219.entry.js +4 -0
  22. package/dist/ionic/p-7268efa5.entry.js +4 -0
  23. package/dist/ionic/p-fedca459.entry.js +4 -0
  24. package/dist/types/components/modal/gestures/sheet.d.ts +1 -1
  25. package/dist/types/components/modal/gestures/swipe-to-close.d.ts +1 -1
  26. package/dist/types/components/modal/modal.d.ts +29 -0
  27. package/dist/types/components/popover/utils.d.ts +2 -0
  28. package/dist/types/components/tab-bar/tab-bar.d.ts +0 -1
  29. package/hydrate/index.js +207 -38
  30. package/hydrate/index.mjs +207 -38
  31. package/package.json +1 -1
  32. package/dist/ionic/p-0d0eb444.entry.js +0 -4
  33. package/dist/ionic/p-91840a80.entry.js +0 -4
  34. package/dist/ionic/p-f9061316.entry.js +0 -4
@@ -249,7 +249,7 @@ const calculateSpringStep = (t) => {
249
249
  const SwipeToCloseDefaults = {
250
250
  MIN_PRESENTING_SCALE: 0.915,
251
251
  };
252
- const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss) => {
252
+ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onGestureMove) => {
253
253
  /**
254
254
  * The step value at which a card modal
255
255
  * is eligible for dismissing via gesture.
@@ -406,6 +406,8 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss) =>
406
406
  const processedStep = isAttemptingDismissWithCanDismiss ? calculateSpringStep(step / maxStep) : step;
407
407
  const clampedStep = helpers.clamp(0.0001, processedStep, maxStep);
408
408
  animation.progressStep(clampedStep);
409
+ // Notify modal of position change for safe-area updates
410
+ onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
409
411
  /**
410
412
  * When swiping down half way, the status bar style
411
413
  * should be reset to its default value.
@@ -949,7 +951,7 @@ const mdLeaveAnimation = (baseEl, opts) => {
949
951
  return baseAnimation;
950
952
  };
951
953
 
952
- const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
954
+ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange, onGestureMove) => {
953
955
  // Defaults for the sheet swipe animation
954
956
  const defaultBackdrop = [
955
957
  { offset: 0, opacity: 'var(--backdrop-opacity)' },
@@ -1280,6 +1282,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1280
1282
  : step;
1281
1283
  offset = helpers.clamp(0.0001, processedStep, maxStep);
1282
1284
  animation.progressStep(offset);
1285
+ // Notify modal of position change for safe-area updates
1286
+ onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
1283
1287
  };
1284
1288
  const onEnd = (detail) => {
1285
1289
  /**
@@ -1474,9 +1478,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
1474
1478
  };
1475
1479
  };
1476
1480
 
1477
- 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}";
1481
+ 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}";
1478
1482
 
1479
- 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}";
1483
+ 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}";
1480
1484
 
1481
1485
  const Modal = class {
1482
1486
  constructor(hostRef) {
@@ -1499,6 +1503,8 @@ const Modal = class {
1499
1503
  this.inline = false;
1500
1504
  // Whether or not modal is being dismissed via gesture
1501
1505
  this.gestureAnimationDismissing = false;
1506
+ // Whether to skip coordinate-based safe-area detection (for fullscreen phone modals)
1507
+ this.skipSafeAreaCoordinateDetection = false;
1502
1508
  this.presented = false;
1503
1509
  /** @internal */
1504
1510
  this.hasController = false;
@@ -1689,7 +1695,9 @@ const Modal = class {
1689
1695
  }
1690
1696
  }
1691
1697
  onWindowResize() {
1692
- // Only handle resize for iOS card modals when no custom animations are provided
1698
+ // Update safe-area overrides for all modal types on resize
1699
+ this.updateSafeAreaOverrides();
1700
+ // Only handle view transition for iOS card modals when no custom animations are provided
1693
1701
  if (ionicGlobal.getIonMode(this) !== 'ios' || !this.presentingElement || this.enterAnimation || this.leaveAnimation) {
1694
1702
  return;
1695
1703
  }
@@ -1871,6 +1879,8 @@ const Modal = class {
1871
1879
  else if (!this.keepContentsMounted) {
1872
1880
  await index$4.waitForMount();
1873
1881
  }
1882
+ // Predict safe-area needs based on modal configuration to avoid visual snap
1883
+ this.setInitialSafeAreaOverrides(presentingElement);
1874
1884
  index$3.writeTask(() => this.el.classList.add('show-modal'));
1875
1885
  const hasCardModal = presentingElement !== undefined;
1876
1886
  /**
@@ -1932,6 +1942,8 @@ const Modal = class {
1932
1942
  else if (hasCardModal) {
1933
1943
  this.initSwipeToClose();
1934
1944
  }
1945
+ // Now that animation is complete, update safe-area based on actual position
1946
+ this.updateSafeAreaOverrides();
1935
1947
  // Initialize view transition listener for iOS card modals
1936
1948
  this.initViewTransitionListener();
1937
1949
  // Initialize parent removal observer
@@ -1983,7 +1995,7 @@ const Modal = class {
1983
1995
  await this.dismiss(undefined, overlays.GESTURE);
1984
1996
  this.gestureAnimationDismissing = false;
1985
1997
  });
1986
- });
1998
+ }, () => this.updateSafeAreaOverrides());
1987
1999
  this.gesture.enable(true);
1988
2000
  }
1989
2001
  initSheetGesture() {
@@ -2004,7 +2016,8 @@ const Modal = class {
2004
2016
  this.currentBreakpoint = breakpoint;
2005
2017
  this.ionBreakpointDidChange.emit({ breakpoint });
2006
2018
  }
2007
- });
2019
+ this.updateSafeAreaOverrides();
2020
+ }, () => this.updateSafeAreaOverrides());
2008
2021
  this.gesture = gesture;
2009
2022
  this.moveSheetToBreakpoint = moveSheetToBreakpoint;
2010
2023
  this.gesture.enable(true);
@@ -2082,6 +2095,124 @@ const Modal = class {
2082
2095
  // Clear the cached reference
2083
2096
  this.cachedPageParent = undefined;
2084
2097
  }
2098
+ /**
2099
+ * Sets initial safe-area overrides based on modal configuration before
2100
+ * the modal becomes visible. This predicts whether the modal will touch
2101
+ * screen edges to avoid a visual snap after animation completes.
2102
+ */
2103
+ setInitialSafeAreaOverrides(presentingElement) {
2104
+ const style = this.el.style;
2105
+ const mode = ionicGlobal.getIonMode(this);
2106
+ const isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
2107
+ // Card modals only exist in iOS mode - in MD mode, presentingElement is ignored
2108
+ const isCardModal = presentingElement !== undefined && mode === 'ios';
2109
+ const isTablet = window.innerWidth >= 768;
2110
+ // Sheet modals always touch bottom edge, never top/left/right
2111
+ if (isSheetModal) {
2112
+ style.setProperty('--ion-safe-area-top', '0px');
2113
+ style.setProperty('--ion-safe-area-left', '0px');
2114
+ style.setProperty('--ion-safe-area-right', '0px');
2115
+ return;
2116
+ }
2117
+ // Card modals have rounded top corners
2118
+ if (isCardModal) {
2119
+ style.setProperty('--ion-safe-area-top', '0px');
2120
+ if (isTablet) {
2121
+ // On tablets, card modals are inset from all edges
2122
+ this.zeroAllSafeAreas();
2123
+ }
2124
+ else {
2125
+ // On phones, card modals still extend to the bottom edge
2126
+ style.setProperty('--ion-safe-area-left', '0px');
2127
+ style.setProperty('--ion-safe-area-right', '0px');
2128
+ this.applyFullscreenSafeArea();
2129
+ }
2130
+ return;
2131
+ }
2132
+ // Phone-sized fullscreen modals inherit safe areas and use wrapper padding
2133
+ if (!isTablet) {
2134
+ this.applyFullscreenSafeArea();
2135
+ return;
2136
+ }
2137
+ // Check if tablet modal is fullscreen via CSS custom properties
2138
+ const computedStyle = getComputedStyle(this.el);
2139
+ const width = computedStyle.getPropertyValue('--width').trim();
2140
+ const height = computedStyle.getPropertyValue('--height').trim();
2141
+ const isFullscreen = width === '100%' && height === '100%';
2142
+ if (isFullscreen) {
2143
+ this.applyFullscreenSafeArea();
2144
+ }
2145
+ else {
2146
+ // Centered dialog doesn't touch edges
2147
+ this.zeroAllSafeAreas();
2148
+ }
2149
+ }
2150
+ /**
2151
+ * Applies safe-area handling for fullscreen modals.
2152
+ * Adds wrapper padding when no footer is present to prevent
2153
+ * content from overlapping system navigation areas.
2154
+ */
2155
+ applyFullscreenSafeArea() {
2156
+ this.skipSafeAreaCoordinateDetection = true;
2157
+ const hasFooter = this.el.querySelector('ion-footer') !== null;
2158
+ if (!hasFooter && this.wrapperEl) {
2159
+ this.wrapperEl.style.setProperty('padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
2160
+ this.wrapperEl.style.setProperty('box-sizing', 'border-box');
2161
+ }
2162
+ }
2163
+ /**
2164
+ * Sets all safe-area CSS variables to 0px for modals that
2165
+ * don't touch screen edges.
2166
+ */
2167
+ zeroAllSafeAreas() {
2168
+ const style = this.el.style;
2169
+ style.setProperty('--ion-safe-area-top', '0px');
2170
+ style.setProperty('--ion-safe-area-bottom', '0px');
2171
+ style.setProperty('--ion-safe-area-left', '0px');
2172
+ style.setProperty('--ion-safe-area-right', '0px');
2173
+ }
2174
+ /**
2175
+ * Gets the root safe-area values from the document element.
2176
+ * These represent the actual device safe areas before any overlay overrides.
2177
+ */
2178
+ getRootSafeAreaValues() {
2179
+ const rootStyle = getComputedStyle(document.documentElement);
2180
+ return {
2181
+ top: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-top')) || 0,
2182
+ bottom: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-bottom')) || 0,
2183
+ left: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-left')) || 0,
2184
+ right: parseFloat(rootStyle.getPropertyValue('--ion-safe-area-right')) || 0,
2185
+ };
2186
+ }
2187
+ /**
2188
+ * Updates safe-area CSS variable overrides based on whether the modal
2189
+ * extends into each safe-area region. Called after animation
2190
+ * and during gestures to handle dynamic position changes.
2191
+ */
2192
+ updateSafeAreaOverrides() {
2193
+ if (this.skipSafeAreaCoordinateDetection) {
2194
+ return;
2195
+ }
2196
+ const wrapper = this.wrapperEl;
2197
+ if (!wrapper) {
2198
+ return;
2199
+ }
2200
+ const rect = wrapper.getBoundingClientRect();
2201
+ const safeAreas = this.getRootSafeAreaValues();
2202
+ const extendsIntoTop = rect.top < safeAreas.top;
2203
+ const extendsIntoBottom = rect.bottom > window.innerHeight - safeAreas.bottom;
2204
+ const extendsIntoLeft = rect.left < safeAreas.left;
2205
+ const extendsIntoRight = rect.right > window.innerWidth - safeAreas.right;
2206
+ const style = this.el.style;
2207
+ extendsIntoTop ? style.removeProperty('--ion-safe-area-top') : style.setProperty('--ion-safe-area-top', '0px');
2208
+ extendsIntoBottom
2209
+ ? style.removeProperty('--ion-safe-area-bottom')
2210
+ : style.setProperty('--ion-safe-area-bottom', '0px');
2211
+ extendsIntoLeft ? style.removeProperty('--ion-safe-area-left') : style.setProperty('--ion-safe-area-left', '0px');
2212
+ extendsIntoRight
2213
+ ? style.removeProperty('--ion-safe-area-right')
2214
+ : style.setProperty('--ion-safe-area-right', '0px');
2215
+ }
2085
2216
  sheetOnDismiss() {
2086
2217
  /**
2087
2218
  * While the gesture animation is finishing
@@ -2174,6 +2305,8 @@ const Modal = class {
2174
2305
  }
2175
2306
  this.currentBreakpoint = undefined;
2176
2307
  this.animation = undefined;
2308
+ // Reset safe-area detection flag for potential re-presentation
2309
+ this.skipSafeAreaCoordinateDetection = false;
2177
2310
  unlock();
2178
2311
  return dismissed;
2179
2312
  }
@@ -2423,20 +2556,20 @@ const Modal = class {
2423
2556
  const isCardModal = presentingElement !== undefined && mode === 'ios';
2424
2557
  const isHandleCycle = handleBehavior === 'cycle';
2425
2558
  const isSheetModalWithHandle = isSheetModal && showHandle;
2426
- return (index$3.h(index$3.Host, Object.assign({ key: '87328006ea6c75ebc518ace300438492a567223e', "no-router": true,
2559
+ return (index$3.h(index$3.Host, Object.assign({ key: '07ebca6a70eb99f8a2236e1d66a03097a7bb67d8', "no-router": true,
2427
2560
  // Allow the modal to be navigable when the handle is focusable
2428
2561
  tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
2429
2562
  zIndex: `${20000 + this.overlayIndex}`,
2430
- }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, theme.getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), index$3.h("ion-backdrop", { key: 'ee94ff8e09b691dd4ad4e4db1720f06bc3c5a469', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: 'bffd69b4635c22d9f249725bd952c1e93d5615c7', class: "modal-shadow" }), index$3.h("div", Object.assign({ key: '1d394d3c68916e464ff1fbf5242419f4a3d3cca1',
2563
+ }, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, theme.getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), index$3.h("ion-backdrop", { key: '1b6850d9b9f6e8f3865b49e0a14399e2ef43a5d6', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: 'eab52c0ebccb820781e92392dc6fa90db93525d5', class: "modal-shadow" }), index$3.h("div", Object.assign({ key: 'ab9448cabdf03a633319999771ce1ca1edce5699',
2431
2564
  /*
2432
2565
  role and aria-modal must be used on the
2433
2566
  same element. They must also be set inside the
2434
2567
  shadow DOM otherwise ion-button will not be highlighted
2435
2568
  when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
2436
2569
  */
2437
- role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (index$3.h("button", { key: '2dcf58792018e557e0c323baad2d672bc99c0bb1', class: "modal-handle",
2570
+ role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (index$3.h("button", { key: 'b2b8c0a8d8add0d43e928dd3d3519f184551e62b', class: "modal-handle",
2438
2571
  // Prevents the handle from receiving keyboard focus when it does not cycle
2439
- 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) })), index$3.h("slot", { key: '44164b1e8710c3895400ad9f44ecd99873874ad5', onSlotchange: this.onSlotChange }))));
2572
+ 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) })), index$3.h("slot", { key: 'b994f206765f7b340971d378f00999c0da334102', onSlotchange: this.onSlotChange }))));
2440
2573
  }
2441
2574
  get el() { return index$3.getElement(this); }
2442
2575
  static get watchers() { return {
@@ -660,6 +660,8 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
660
660
  let bottom;
661
661
  let originX = contentOriginX;
662
662
  let originY = contentOriginY;
663
+ let checkSafeAreaTop = false;
664
+ let checkSafeAreaBottom = false;
663
665
  let checkSafeAreaLeft = false;
664
666
  let checkSafeAreaRight = false;
665
667
  const triggerTop = triggerCoordinates
@@ -704,10 +706,18 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
704
706
  * We chose 12 here so that the popover position looks a bit nicer as
705
707
  * it is not right up against the edge of the screen.
706
708
  */
707
- top = Math.max(12, triggerTop - contentHeight - triggerHeight - (arrowHeight - 1));
709
+ top = Math.max(bodyPadding, triggerTop - contentHeight - triggerHeight - (arrowHeight - 1));
708
710
  arrowTop = top + contentHeight;
709
711
  originY = 'bottom';
710
712
  addPopoverBottomClass = true;
713
+ /**
714
+ * If the popover is positioned near the top edge, account for safe area.
715
+ * This ensures the popover doesn't overlap with status bars or notches.
716
+ */
717
+ if (top <= bodyPadding + safeAreaMargin) {
718
+ checkSafeAreaTop = true;
719
+ top = bodyPadding;
720
+ }
711
721
  /**
712
722
  * If not enough room for popover to appear
713
723
  * above trigger, then cut it off.
@@ -715,6 +725,12 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
715
725
  }
716
726
  else {
717
727
  bottom = bodyPadding;
728
+ /**
729
+ * When the popover is pinned to the bottom, account for safe area.
730
+ * This ensures the popover doesn't overlap with home indicators
731
+ * or navigation bars (e.g., Android API 36+ edge-to-edge).
732
+ */
733
+ checkSafeAreaBottom = true;
718
734
  }
719
735
  }
720
736
  return {
@@ -723,6 +739,8 @@ const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyW
723
739
  bottom,
724
740
  originX,
725
741
  originY,
742
+ checkSafeAreaTop,
743
+ checkSafeAreaBottom,
726
744
  checkSafeAreaLeft,
727
745
  checkSafeAreaRight,
728
746
  arrowTop,
@@ -783,7 +801,7 @@ const iosEnterAnimation = (baseEl, opts) => {
783
801
  const results = getPopoverPosition(isRTL, contentWidth, contentHeight, arrowWidth, arrowHeight, reference, side, align, defaultPosition, trigger, ev);
784
802
  const padding = size === 'cover' ? 0 : POPOVER_IOS_BODY_PADDING;
785
803
  const margin = size === 'cover' ? 0 : 25;
786
- const { originX, originY, top, left, bottom, checkSafeAreaLeft, checkSafeAreaRight, arrowTop, arrowLeft, addPopoverBottomClass, } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, margin, results.originX, results.originY, results.referenceCoordinates, results.arrowTop, results.arrowLeft, arrowHeight);
804
+ const { originX, originY, top, left, bottom, checkSafeAreaTop, checkSafeAreaBottom, checkSafeAreaLeft, checkSafeAreaRight, arrowTop, arrowLeft, addPopoverBottomClass, } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, margin, results.originX, results.originY, results.referenceCoordinates, results.arrowTop, results.arrowLeft, arrowHeight);
787
805
  const baseAnimation = animation.createAnimation();
788
806
  const backdropAnimation = animation.createAnimation();
789
807
  const contentAnimation = animation.createAnimation();
@@ -813,19 +831,35 @@ const iosEnterAnimation = (baseEl, opts) => {
813
831
  if (addPopoverBottomClass) {
814
832
  baseEl.classList.add('popover-bottom');
815
833
  }
816
- if (bottom !== undefined) {
817
- contentEl.style.setProperty('bottom', `${bottom}px`);
818
- }
834
+ /**
835
+ * Safe area CSS variable adjustments.
836
+ * When the popover is positioned near an edge, we add the corresponding
837
+ * safe-area inset to ensure the popover doesn't overlap with system UI
838
+ * (status bars, home indicators, navigation bars on Android API 36+, etc.)
839
+ */
840
+ const safeAreaTop = ' + var(--ion-safe-area-top, 0)';
841
+ const safeAreaBottom = ' + var(--ion-safe-area-bottom, 0)';
819
842
  const safeAreaLeft = ' + var(--ion-safe-area-left, 0)';
820
843
  const safeAreaRight = ' - var(--ion-safe-area-right, 0)';
844
+ let topValue = `${top}px`;
845
+ let bottomValue = bottom !== undefined ? `${bottom}px` : undefined;
821
846
  let leftValue = `${left}px`;
847
+ if (checkSafeAreaTop) {
848
+ topValue = `${top}px${safeAreaTop}`;
849
+ }
850
+ if (checkSafeAreaBottom && bottomValue !== undefined) {
851
+ bottomValue = `${bottom}px${safeAreaBottom}`;
852
+ }
822
853
  if (checkSafeAreaLeft) {
823
854
  leftValue = `${left}px${safeAreaLeft}`;
824
855
  }
825
856
  if (checkSafeAreaRight) {
826
857
  leftValue = `${left}px${safeAreaRight}`;
827
858
  }
828
- contentEl.style.setProperty('top', `calc(${top}px + var(--offset-y, 0))`);
859
+ if (bottomValue !== undefined) {
860
+ contentEl.style.setProperty('bottom', `calc(${bottomValue})`);
861
+ }
862
+ contentEl.style.setProperty('top', `calc(${topValue} + var(--offset-y, 0))`);
829
863
  contentEl.style.setProperty('left', `calc(${leftValue} + var(--offset-x, 0))`);
830
864
  contentEl.style.setProperty('transform-origin', `${originY} ${originX}`);
831
865
  if (arrowEl !== null) {
@@ -901,7 +935,23 @@ const mdEnterAnimation = (baseEl, opts) => {
901
935
  };
902
936
  const results = getPopoverPosition(isRTL, contentWidth, contentHeight, 0, 0, reference, side, align, defaultPosition, trigger, ev);
903
937
  const padding = size === 'cover' ? 0 : POPOVER_MD_BODY_PADDING;
904
- const { originX, originY, top, left, bottom } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, 0, results.originX, results.originY, results.referenceCoordinates);
938
+ const { originX, originY, top, left, bottom, checkSafeAreaTop, checkSafeAreaBottom } = calculateWindowAdjustment(side, results.top, results.left, padding, bodyWidth, bodyHeight, contentWidth, contentHeight, 0, results.originX, results.originY, results.referenceCoordinates);
939
+ /**
940
+ * Safe area CSS variable adjustments.
941
+ * When the popover is positioned near an edge, we add the corresponding
942
+ * safe-area inset to ensure the popover doesn't overlap with system UI
943
+ * (status bars, home indicators, navigation bars on Android API 36+, etc.)
944
+ */
945
+ const safeAreaTop = ' + var(--ion-safe-area-top, 0)';
946
+ const safeAreaBottom = ' + var(--ion-safe-area-bottom, 0)';
947
+ let topValue = `${top}px`;
948
+ let bottomValue = bottom !== undefined ? `${bottom}px` : undefined;
949
+ if (checkSafeAreaTop) {
950
+ topValue = `${top}px${safeAreaTop}`;
951
+ }
952
+ if (checkSafeAreaBottom && bottomValue !== undefined) {
953
+ bottomValue = `${bottom}px${safeAreaBottom}`;
954
+ }
905
955
  const baseAnimation = animation.createAnimation();
906
956
  const backdropAnimation = animation.createAnimation();
907
957
  const wrapperAnimation = animation.createAnimation();
@@ -918,13 +968,13 @@ const mdEnterAnimation = (baseEl, opts) => {
918
968
  contentAnimation
919
969
  .addElement(contentEl)
920
970
  .beforeStyles({
921
- top: `calc(${top}px + var(--offset-y, 0px))`,
971
+ top: `calc(${topValue} + var(--offset-y, 0px))`,
922
972
  left: `calc(${left}px + var(--offset-x, 0px))`,
923
973
  'transform-origin': `${originY} ${originX}`,
924
974
  })
925
975
  .beforeAddWrite(() => {
926
- if (bottom !== undefined) {
927
- contentEl.style.setProperty('bottom', `${bottom}px`);
976
+ if (bottomValue !== undefined) {
977
+ contentEl.style.setProperty('bottom', `calc(${bottomValue})`);
928
978
  }
929
979
  })
930
980
  .fromTo('transform', 'scale(0.8)', 'scale(1)');
@@ -23,7 +23,6 @@ const TabBar = class {
23
23
  this.ionTabBarLoaded = index.createEvent(this, "ionTabBarLoaded", 7);
24
24
  this.keyboardCtrl = null;
25
25
  this.didLoad = false;
26
- this.isComponentConnected = false;
27
26
  this.keyboardVisible = false;
28
27
  /**
29
28
  * If `true`, the tab bar will be translucent.
@@ -58,8 +57,7 @@ const TabBar = class {
58
57
  }
59
58
  }
60
59
  async connectedCallback() {
61
- this.isComponentConnected = true;
62
- const keyboardCtrl = await keyboardController.createKeyboardController(async (keyboardOpen, waitForResize) => {
60
+ this.keyboardCtrl = await keyboardController.createKeyboardController(async (keyboardOpen, waitForResize) => {
63
61
  /**
64
62
  * If the keyboard is hiding, then we need to wait
65
63
  * for the webview to resize. Otherwise, the tab bar
@@ -70,33 +68,21 @@ const TabBar = class {
70
68
  }
71
69
  this.keyboardVisible = keyboardOpen; // trigger re-render by updating state
72
70
  });
73
- /**
74
- * Destroy the keyboard controller if the component was
75
- * disconnected during async initialization to prevent memory leaks.
76
- */
77
- if (this.isComponentConnected) {
78
- this.keyboardCtrl = keyboardCtrl;
79
- }
80
- else {
81
- keyboardCtrl.destroy();
82
- }
83
71
  }
84
72
  disconnectedCallback() {
85
- this.isComponentConnected = false;
86
73
  if (this.keyboardCtrl) {
87
74
  this.keyboardCtrl.destroy();
88
- this.keyboardCtrl = null;
89
75
  }
90
76
  }
91
77
  render() {
92
78
  const { color, translucent, keyboardVisible } = this;
93
79
  const mode = ionicGlobal.getIonMode(this);
94
80
  const shouldHide = keyboardVisible && this.el.getAttribute('slot') !== 'top';
95
- return (index.h(index.Host, { key: '1f721132a86fd0db988bf9af0fbc1e8e6fa6b7da', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: theme.createColorClasses(color, {
81
+ return (index.h(index.Host, { key: '388ec37ce308035bab78d6c9a016bb616e9517a9', role: "tablist", "aria-hidden": shouldHide ? 'true' : null, class: theme.createColorClasses(color, {
96
82
  [mode]: true,
97
83
  'tab-bar-translucent': translucent,
98
84
  'tab-bar-hidden': shouldHide,
99
- }) }, index.h("slot", { key: '828838764307f150c64e9bbbbbafbdee6fa8e9f2' })));
85
+ }) }, index.h("slot", { key: 'ce10ade2b86725e24f3254516483eeedd8ecb16a' })));
100
86
  }
101
87
  get el() { return index.getElement(this); }
102
88
  static get watchers() { return {
@@ -7,7 +7,7 @@ import { clamp, getElementRoot, raf } from "../../../utils/helpers";
7
7
  import { FOCUS_TRAP_DISABLE_CLASS } from "../../../utils/overlays";
8
8
  import { getBackdropValueForSheet } from "../utils";
9
9
  import { calculateSpringStep, handleCanDismiss } from "./utils";
10
- export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange) => {
10
+ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, animation, breakpoints = [], expandToScroll, getCurrentBreakpoint, onDismiss, onBreakpointChange, onGestureMove) => {
11
11
  // Defaults for the sheet swipe animation
12
12
  const defaultBackdrop = [
13
13
  { offset: 0, opacity: 'var(--backdrop-opacity)' },
@@ -338,6 +338,8 @@ export const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpo
338
338
  : step;
339
339
  offset = clamp(0.0001, processedStep, maxStep);
340
340
  animation.progressStep(offset);
341
+ // Notify modal of position change for safe-area updates
342
+ onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
341
343
  };
342
344
  const onEnd = (detail) => {
343
345
  /**
@@ -12,7 +12,7 @@ import { calculateSpringStep, handleCanDismiss } from "./utils";
12
12
  export const SwipeToCloseDefaults = {
13
13
  MIN_PRESENTING_SCALE: 0.915,
14
14
  };
15
- export const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss) => {
15
+ export const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onGestureMove) => {
16
16
  /**
17
17
  * The step value at which a card modal
18
18
  * is eligible for dismissing via gesture.
@@ -169,6 +169,8 @@ export const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismi
169
169
  const processedStep = isAttemptingDismissWithCanDismiss ? calculateSpringStep(step / maxStep) : step;
170
170
  const clampedStep = clamp(0.0001, processedStep, maxStep);
171
171
  animation.progressStep(clampedStep);
172
+ // Notify modal of position change for safe-area updates
173
+ onGestureMove === null || onGestureMove === void 0 ? void 0 : onGestureMove();
172
174
  /**
173
175
  * When swiping down half way, the status bar style
174
176
  * should be reset to its default value.
@@ -135,10 +135,6 @@ ion-backdrop {
135
135
  :host {
136
136
  --width: 600px;
137
137
  --height: 500px;
138
- --ion-safe-area-top: 0px;
139
- --ion-safe-area-bottom: 0px;
140
- --ion-safe-area-right: 0px;
141
- --ion-safe-area-left: 0px;
142
138
  }
143
139
  }
144
140
  @media only screen and (min-width: 768px) and (min-height: 768px) {