@ionic/core 8.8.5-nightly.20260427 → 8.8.5-nightly.20260428
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/ion-content.js +1 -1
- package/components/ion-modal.js +1 -1
- package/components/ion-select-modal.js +1 -1
- package/components/ion-select.js +1 -1
- package/components/{p-ApmKVjaE.js → p-BGHGpkPX.js} +1 -1
- package/components/p-DUqnmRFi.js +4 -0
- package/components/{p-BTF2nRLo.js → p-MlJRD6E1.js} +1 -1
- package/dist/cjs/ion-app_8.cjs.entry.js +1 -1
- package/dist/cjs/ion-modal.cjs.entry.js +99 -45
- package/dist/collection/components/content/content.css +1 -1
- package/dist/collection/components/modal/modal.js +73 -44
- package/dist/collection/components/modal/safe-area-utils.js +27 -2
- package/dist/docs.json +1 -1
- package/dist/esm/ion-app_8.entry.js +1 -1
- package/dist/esm/ion-modal.entry.js +99 -45
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-b5ea8cdd.entry.js +4 -0
- package/dist/ionic/p-e0287f41.entry.js +4 -0
- package/dist/types/components/modal/modal.d.ts +41 -3
- package/dist/types/components/modal/safe-area-utils.d.ts +16 -0
- package/hydrate/index.js +100 -46
- package/hydrate/index.mjs +100 -46
- package/package.json +1 -1
- package/components/p-BVnB3eEn.js +0 -4
- package/dist/ionic/p-16b65553.entry.js +0 -4
- package/dist/ionic/p-4819b469.entry.js +0 -4
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import{r as t,c as i,f as o,w as a,e,h as r,d as s,g as n}from"./p-IGIE5vDm.js";import{f as d,i as h,d as l,r as p,a as c,p as m}from"./p-B8xlpH8p.js";import{C as f,a as u,d as b}from"./p-CmFz1Mjc.js";import{e as v,g as x,r as w,b as g,h as y}from"./p-CGmVTdWh.js";import{c as k}from"./p-B-hirT0v.js";import{g as A}from"./p-CIGNaXM1.js";import{G as Y,O,F as E,e as S,B as D,j as T,k as M,f as C,g as B,h as P}from"./p-DTPR1Wpn.js";import{g as j}from"./p-DiVJyqlX.js";import{e as I,w as N}from"./p-BW_TRJm8.js";import{b as R}from"./p-NFFyoJ4Q.js";import{KEYBOARD_DID_OPEN as $}from"./p-9eeaBrnk.js";import{c as L}from"./p-Bum7H1fw.js";import{g as F}from"./p-hHmYLOfE.js";import{createGesture as W}from"./p-Cl0B-RWe.js";import{w as z}from"./p-ZjP4CjeZ.js";import"./p-DB_iPQC-.js";import"./p-BTEOs1at.js";import"./p-D13Eaw-8.js";var H;!function(t){t.Dark="DARK",t.Light="LIGHT",t.Default="DEFAULT"}(H||(H={}));const V={getEngine(){const t=A();if(null==t?void 0:t.isPluginAvailable("StatusBar"))return t.Plugins.StatusBar},setStyle(t){const i=this.getEngine();i&&i.setStyle(t)},getStyle:async function(){const t=this.getEngine();if(!t)return H.Default;const{style:i}=await t.getInfo();return i}},G=(t,i)=>{if(1===i)return 0;const o=1/(1-i);return t*o+-i*o},Z=()=>{!z||z.innerWidth>=768||V.setStyle({style:H.Dark})},_=(t=H.Default)=>{!z||z.innerWidth>=768||V.setStyle({style:t})},K=async(t,i)=>{"function"==typeof t.canDismiss&&await t.canDismiss(void 0,Y)&&(i.isRunning()?i.onFinish((()=>{t.dismiss(void 0,"handler")}),{oneTimeCallback:!0}):t.dismiss(void 0,"handler"))},J=t=>.00255275*2.71828**(-14.9619*t)-1.00255*2.71828**(-.0380968*t)+1,U=.915,Q=(t,i)=>v(400,t/Math.abs(1.1*i),500),X=(t,i)=>{const o=window.innerHeight,a=t.getBoundingClientRect().top,e=Math.round(1e3*(1-i/(o-a)))/1e3;return Math.max(0,Math.min(1,e))},q=t=>{const{currentBreakpoint:i,backdropBreakpoint:o,expandToScroll:a}=t,e=void 0===o||o<i,r=e?`calc(var(--backdrop-opacity) * ${i})`:"0",s=L("backdropAnimation").fromTo("opacity",0,r);return e&&s.beforeStyles({"pointer-events":"none"}).afterClearStyles(["pointer-events"]),{wrapperAnimation:L("wrapperAnimation").keyframes([{offset:0,opacity:1,transform:"translateY(100%)"},{offset:1,opacity:1,transform:`translateY(${100-100*i}%)`}]),backdropAnimation:s,contentAnimation:a?void 0:L("contentAnimation").keyframes([{offset:0,opacity:1,maxHeight:100*(1-i)+"%"},{offset:1,opacity:1,maxHeight:100*i+"%"}])}},tt=t=>{const{currentBreakpoint:i,backdropBreakpoint:o}=t,a=`calc(var(--backdrop-opacity) * ${G(i,o)})`,e=[{offset:0,opacity:a},{offset:1,opacity:0}],r=[{offset:0,opacity:a},{offset:o,opacity:0},{offset:1,opacity:0}],s=L("backdropAnimation").keyframes(0!==o?r:e);return{wrapperAnimation:L("wrapperAnimation").keyframes([{offset:0,opacity:1,transform:`translateY(${100-100*i}%)`},{offset:1,opacity:1,transform:"translateY(100%)"}]),backdropAnimation:s}},it=(t,i)=>{const{presentingEl:o,currentBreakpoint:a,expandToScroll:e}=i,r=x(t),{wrapperAnimation:s,backdropAnimation:n,contentAnimation:d}=void 0!==a?q(i):{backdropAnimation:L().fromTo("opacity",.01,"var(--backdrop-opacity)").beforeStyles({"pointer-events":"none"}).afterClearStyles(["pointer-events"]),wrapperAnimation:L().fromTo("transform","translateY(100vh)","translateY(0vh)"),contentAnimation:void 0};n.addElement(r.querySelector("ion-backdrop")),s.addElement(r.querySelectorAll(".modal-wrapper, .modal-shadow")).beforeStyles({opacity:1}),!e&&(null==d||d.addElement(t.querySelector(".ion-page")));const h=L("entering-base").addElement(t).easing("cubic-bezier(0.32,0.72,0,1)").duration(500).addAnimation([s]);if(d&&h.addAnimation(d),o){const t=window.innerWidth<768,i="ION-MODAL"===o.tagName&&void 0!==o.presentingElement,a=x(o),e=L().beforeStyles({transform:"translateY(0)","transform-origin":"top center",overflow:"hidden"}),r=document.body;if(t){const t=CSS.supports("width","max(0px, 1px)")?"max(30px, var(--ion-safe-area-top))":"30px",a=`translateY(${i?"-10px":t}) scale(0.915)`;e.afterStyles({transform:a}).beforeAddWrite((()=>r.style.setProperty("background-color","black"))).addElement(o).keyframes([{offset:0,filter:"contrast(1)",transform:"translateY(0px) scale(1)",borderRadius:"0px"},{offset:1,filter:"contrast(0.85)",transform:a,borderRadius:"10px 10px 0 0"}]),h.addAnimation(e)}else if(h.addAnimation(n),i){const t=`translateY(-10px) scale(${i?U:1})`;e.afterStyles({transform:t}).addElement(a.querySelector(".modal-wrapper")).keyframes([{offset:0,filter:"contrast(1)",transform:"translateY(0) scale(1)"},{offset:1,filter:"contrast(0.85)",transform:t}]);const o=L().afterStyles({transform:t}).addElement(a.querySelector(".modal-shadow")).keyframes([{offset:0,opacity:"1",transform:"translateY(0) scale(1)"},{offset:1,opacity:"0",transform:t}]);h.addAnimation([e,o])}else s.fromTo("opacity","0","1")}else h.addAnimation(n);return h},ot=(t,i,o=500)=>{const{presentingEl:a,currentBreakpoint:e}=i,r=x(t),{wrapperAnimation:s,backdropAnimation:n}=void 0!==e?tt(i):{backdropAnimation:L().fromTo("opacity","var(--backdrop-opacity)",0),wrapperAnimation:L().fromTo("transform","translateY(0vh)","translateY(100vh)")};n.addElement(r.querySelector("ion-backdrop")),s.addElement(r.querySelectorAll(".modal-wrapper, .modal-shadow")).beforeStyles({opacity:1});const d=L("leaving-base").addElement(t).easing("cubic-bezier(0.32,0.72,0,1)").duration(o).addAnimation(s);if(a){const t=window.innerWidth<768,i="ION-MODAL"===a.tagName&&void 0!==a.presentingElement,o=x(a),e=L().beforeClearStyles(["transform"]).afterClearStyles(["transform"]).onFinish((t=>{1===t&&(a.style.setProperty("overflow",""),Array.from(r.querySelectorAll("ion-modal:not(.overlay-hidden)")).filter((t=>void 0!==t.presentingElement)).length<=1&&r.style.setProperty("background-color",""))})),r=document.body;if(t){const t=CSS.supports("width","max(0px, 1px)")?"max(30px, var(--ion-safe-area-top))":"30px",o=`translateY(${i?"-10px":t}) scale(0.915)`;e.addElement(a).keyframes([{offset:0,filter:"contrast(0.85)",transform:o,borderRadius:"10px 10px 0 0"},{offset:1,filter:"contrast(1)",transform:"translateY(0px) scale(1)",borderRadius:"0px"}]),d.addAnimation(e)}else if(d.addAnimation(n),i){const t=`translateY(-10px) scale(${i?U:1})`;e.addElement(o.querySelector(".modal-wrapper")).afterStyles({transform:"translate3d(0, 0, 0)"}).keyframes([{offset:0,filter:"contrast(0.85)",transform:t},{offset:1,filter:"contrast(1)",transform:"translateY(0) scale(1)"}]);const a=L().addElement(o.querySelector(".modal-shadow")).afterStyles({transform:"translateY(0) scale(1)"}).keyframes([{offset:0,opacity:"0",transform:t},{offset:1,opacity:"1",transform:"translateY(0) scale(1)"}]);d.addAnimation([e,a])}else s.fromTo("opacity","1","0")}else d.addAnimation(n);return d},at=(t,i)=>{const{currentBreakpoint:o,expandToScroll:a}=i,e=x(t),{wrapperAnimation:r,backdropAnimation:s,contentAnimation:n}=void 0!==o?q(i):{backdropAnimation:L().fromTo("opacity",.01,"var(--backdrop-opacity)").beforeStyles({"pointer-events":"none"}).afterClearStyles(["pointer-events"]),wrapperAnimation:L().keyframes([{offset:0,opacity:.01,transform:"translateY(40px)"},{offset:1,opacity:1,transform:"translateY(0px)"}]),contentAnimation:void 0};s.addElement(e.querySelector("ion-backdrop")),r.addElement(e.querySelector(".modal-wrapper")),!a&&(null==n||n.addElement(t.querySelector(".ion-page")));const d=L().addElement(t).easing("cubic-bezier(0.36,0.66,0.04,1)").duration(280).addAnimation([s,r]);return n&&d.addAnimation(n),d},et=(t,i)=>{const{currentBreakpoint:o}=i,a=x(t),{wrapperAnimation:e,backdropAnimation:r}=void 0!==o?tt(i):{backdropAnimation:L().fromTo("opacity","var(--backdrop-opacity)",0),wrapperAnimation:L().keyframes([{offset:0,opacity:.99,transform:"translateY(0px)"},{offset:1,opacity:0,transform:"translateY(40px)"}])};return r.addElement(a.querySelector("ion-backdrop")),e.addElement(a.querySelector(".modal-wrapper")),L().easing("cubic-bezier(0.47,0,0.745,0.715)").duration(200).addAnimation([r,e])},rt=new Set(["","100%","100vw","100vh","100dvw","100dvh","100svw","100svh"]);let st=null,nt=!1;const dt=t=>{const i=getComputedStyle(t),o=i.getPropertyValue("--width").trim(),a=i.getPropertyValue("--height").trim();return!rt.has(o)&&!rt.has(a)},ht=(t,i)=>{t.style.setProperty("--ion-safe-area-top",i.top),t.style.setProperty("--ion-safe-area-bottom",i.bottom),t.style.setProperty("--ion-safe-area-left",i.left),t.style.setProperty("--ion-safe-area-right",i.right)},lt=class{constructor(o){t(this,o),this.didPresent=i(this,"ionModalDidPresent",7),this.willPresent=i(this,"ionModalWillPresent",7),this.willDismiss=i(this,"ionModalWillDismiss",7),this.didDismiss=i(this,"ionModalDidDismiss",7),this.ionBreakpointDidChange=i(this,"ionBreakpointDidChange",7),this.didPresentShorthand=i(this,"didPresent",7),this.willPresentShorthand=i(this,"willPresent",7),this.willDismissShorthand=i(this,"willDismiss",7),this.didDismissShorthand=i(this,"didDismiss",7),this.ionMount=i(this,"ionMount",7),this.ionDragStart=i(this,"ionDragStart",7),this.ionDragMove=i(this,"ionDragMove",7),this.ionDragEnd=i(this,"ionDragEnd",7),this.lockController=k(),this.triggerController=S(),this.coreDelegate=f(),this.isSheetModal=!1,this.inheritedAttributes={},this.inline=!1,this.gestureAnimationDismissing=!1,this.presented=!1,this.hasController=!1,this.keyboardClose=!0,this.expandToScroll=!0,this.backdropBreakpoint=0,this.handleBehavior="none",this.backdropDismiss=!0,this.showBackdrop=!0,this.animated=!0,this.isOpen=!1,this.keepContentsMounted=!1,this.focusTrap=!0,this.canDismiss=!0,this.onHandleClick=()=>{const{sheetTransition:t,handleBehavior:i}=this;"cycle"===i&&void 0===t&&this.moveToNextBreakpoint()},this.onBackdropTap=()=>{const{sheetTransition:t}=this;void 0===t&&this.dismiss(void 0,D)},this.onLifecycle=t=>{const i=this.usersElement,o=pt[t.type];if(i&&o){const a=new CustomEvent(o,{bubbles:!1,cancelable:!1,detail:t.detail});i.dispatchEvent(a)}},this.onModalFocus=t=>{const{dragHandleEl:i,el:o}=this;t.target===o&&i&&-1!==i.tabIndex&&i.focus()},this.onSlotChange=({target:t})=>{t.assignedElements().forEach((t=>{t.querySelectorAll("ion-modal").forEach((t=>{null===t.getAttribute("data-parent-ion-modal")&&t.setAttribute("data-parent-ion-modal",this.el.id)}))}))}}onIsOpenChange(t,i){!0===t&&!1===i?this.present():!1===t&&!0===i&&this.dismiss()}triggerChanged(){const{trigger:t,el:i,triggerController:o}=this;t&&o.addClickListener(i,t)}onWindowResize(){this.presented&&(clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout((()=>{const t=this.getSafeAreaContext();if(!t.isCardModal||this.enterAnimation||this.leaveAnimation||this.handleViewTransition(),t.isSheetModal&&this.updateSheetOffsetTop(),!t.isSheetModal&&!t.isCardModal){this.updateSafeAreaOverrides();const{contentEl:t,hasFooter:i}=this.findContentAndFooter();this.clearContentSafeAreaPadding(t),this.applyFullscreenSafeAreaTo(t,i)}}),50))}breakpointsChanged(t){void 0!==t&&(this.sortedBreakpoints=t.sort(((t,i)=>t-i)))}connectedCallback(){const{el:t}=this;T(t),this.triggerChanged()}disconnectedCallback(){this.triggerController.removeClickListener(),this.cleanupViewTransitionListener(),this.cleanupParentRemovalObserver(),this.cleanupSafeAreaOverrides()}componentWillLoad(){var t;const{breakpoints:i,initialBreakpoint:a,el:e,htmlAttributes:r}=this,s=this.isSheetModal=void 0!==i&&void 0!==a,n=["aria-label","role"];this.inheritedAttributes=g(e,n),e.parentNode&&(this.cachedOriginalParent=e.parentNode),void 0!==r&&n.forEach((t=>{r[t]&&(this.inheritedAttributes=Object.assign(Object.assign({},this.inheritedAttributes),{[t]:r[t]}),delete r[t])})),s&&(this.currentBreakpoint=this.initialBreakpoint),void 0===i||void 0===a||i.includes(a)||o("[ion-modal] - Your breakpoints array must include the initialBreakpoint value."),(null===(t=this.htmlAttributes)||void 0===t?void 0:t.id)||M(this.el)}componentDidLoad(){!0===this.isOpen&&w((()=>this.present())),this.breakpointsChanged(this.breakpoints),this.triggerChanged()}getDelegate(t=!1){if(this.workingDelegate&&!t)return{delegate:this.workingDelegate,inline:this.inline};const i=this.inline=null!==this.el.parentNode&&!this.hasController;return{inline:i,delegate:this.workingDelegate=i?this.delegate||this.coreDelegate:this.delegate}}async checkCanDismiss(t,i){const{canDismiss:o}=this;return"function"==typeof o?o(t,i):o}async present(){const t=await this.lockController.lock();if(this.presented)return void t();const{presentingElement:i,el:o}=this;this.currentBreakpoint=this.initialBreakpoint;const{inline:e,delegate:r}=this.getDelegate(!0);this.ionMount.emit(),this.usersElement=await u(r,o,this.component,["ion-page"],this.componentProps,e),y(o)?await I(this.usersElement):this.keepContentsMounted||await N(),a((()=>this.el.classList.add("show-modal"))),this.isSheetModal=void 0!==this.breakpoints&&void 0!==this.initialBreakpoint,this.setInitialSafeAreaOverrides();const s=void 0!==i;s&&"ios"===R(this)&&(this.statusBarStyle=await V.getStyle(),Z()),await C(this,"modalEnter",it,at,{presentingEl:i,currentBreakpoint:this.initialBreakpoint,backdropBreakpoint:this.backdropBreakpoint,expandToScroll:this.expandToScroll}),this.updateSafeAreaOverrides(),this.applyFullscreenSafeArea(),"undefined"!=typeof window&&(this.keyboardOpenCallback=()=>{this.gesture&&(this.gesture.enable(!1),w((()=>{this.gesture&&this.gesture.enable(!0)})))},window.addEventListener($,this.keyboardOpenCallback)),this.isSheetModal?this.initSheetGesture():s&&this.initSwipeToClose(),this.initViewTransitionListener(),this.initParentRemovalObserver(),t()}initSwipeToClose(){var t;if("ios"!==R(this))return;const{el:i}=this,o=this.leaveAnimation||e.get("modalLeave",ot),a=this.animation=o(i,{presentingEl:this.presentingElement,expandToScroll:this.expandToScroll});if(!c(i))return void m(i);const r=null!==(t=this.statusBarStyle)&&void 0!==t?t:H.Default;this.gesture=((t,i,o,a,e,r,s)=>{const n=.5,c=t.offsetHeight;let m=!1,f=!1,u=null,b=null,w=!0,g=0;const y=W({el:t,gestureName:"modalSwipeToClose",gesturePriority:O,direction:"y",threshold:10,canStart:t=>{const i=t.event.target;if(null===i||!i.closest)return!0;if(u=d(i),u){if(h(u)){const t=x(u);b=t.querySelector(".inner-scroll")}else b=u;return!u.querySelector("ion-refresher")&&0===b.scrollTop}return null===i.closest("ion-footer")},onStart:o=>{const{deltaY:a}=o;w=!u||!h(u)||u.scrollY,f=void 0!==t.canDismiss&&!0!==t.canDismiss,a>0&&u&&l(u),i.progressStart(!0,m?1:0),e()},onMove:a=>{const{deltaY:e}=a;e>0&&u&&l(u);const s=a.deltaY/c,d=s>=0&&f,h=d?.2:.9999,p=d?J(s/h):s,m=v(1e-4,p,h);i.progressStep(m),m>=n&&g<n?_(o):m<n&&g>=n&&Z(),g=m;const b={currentY:a.currentY,deltaY:a.deltaY,velocityY:a.velocityY,progress:X(t,a.deltaY)};r(b)},onEnd:o=>{const e=o.velocityY,r=o.deltaY/c,d=r>=0&&f,h=d?.2:.9999,l=d?J(r/h):r,b=v(1e-4,l,h),x=!d&&(o.deltaY+1e3*e)/c>=n;let g=x?-.001:.001;x?(i.easing("cubic-bezier(0.32, 0.72, 0, 1)"),g+=F([0,0],[.32,.72],[0,1],[1,1],b)[0]):(i.easing("cubic-bezier(1, 0, 0.68, 0.28)"),g+=F([0,0],[1,0],[.68,.28],[1,1],b)[0]);const k=Q(x?r*c:(1-b)*c,e);m=x,y.enable(!1),u&&p(u,w),i.onFinish((()=>{x||y.enable(!0)})).progressEnd(x?1:0,g,k),d&&b>h/4?K(t,i):x&&a();const A={currentY:o.currentY,deltaY:o.deltaY,velocityY:o.velocityY,progress:X(t,o.deltaY)};s(A)}});return y})(i,a,r,(()=>this.cardOnDismiss()),(()=>this.onDragStart()),(t=>this.onDragMove(t)),(t=>this.onDragEnd(t))),this.gesture.enable(!0)}initSheetGesture(){const{wrapperEl:t,initialBreakpoint:i,backdropBreakpoint:o}=this;if(!t||void 0===i)return;const a=this.enterAnimation||e.get("modalEnter",it),r=this.animation=a(this.el,{presentingEl:this.presentingElement,currentBreakpoint:i,backdropBreakpoint:o,expandToScroll:this.expandToScroll});r.progressStart(!0,1);const{gesture:s,moveSheetToBreakpoint:n}=((t,i,o,a,e,r,s=[],n,l,p,c,m,f,u)=>{const b={WRAPPER_KEYFRAMES:[{offset:0,transform:"translateY(0%)"},{offset:1,transform:"translateY(100%)"}],BACKDROP_KEYFRAMES:0!==e?[{offset:0,opacity:"var(--backdrop-opacity)"},{offset:1-e,opacity:0},{offset:1,opacity:0}]:[{offset:0,opacity:"var(--backdrop-opacity)"},{offset:1,opacity:.01}],CONTENT_KEYFRAMES:[{offset:0,maxHeight:"100%"},{offset:1,maxHeight:"0%"}]},g=t.querySelector("ion-content"),y=o.clientHeight;let k=a,A=0,Y=!1,O=null,S=null,D=null,T=null;const M=s[s.length-1],C=s[0],B=r.childAnimations.find((t=>"wrapperAnimation"===t.id)),P=r.childAnimations.find((t=>"backdropAnimation"===t.id)),j=r.childAnimations.find((t=>"contentAnimation"===t.id)),I=()=>{!1!==t.focusTrap&&!1!==t.showBackdrop&&(t.style.setProperty("pointer-events","auto"),i.style.setProperty("pointer-events","auto"),t.classList.remove(E))},N=()=>{t.style.setProperty("pointer-events","none"),i.style.setProperty("pointer-events","none"),t.classList.add(E)},R=i=>{if(!S&&(S=Array.from(t.querySelectorAll("ion-footer")),!S.length))return;const o=t.querySelector(".ion-page");if(T=i,"stationary"===i)S.forEach((t=>{t.classList.remove("modal-footer-moving"),t.style.removeProperty("position"),t.style.removeProperty("width"),t.style.removeProperty("height"),t.style.removeProperty("top"),t.style.removeProperty("left"),null==o||o.style.removeProperty("padding-bottom"),null==o||o.appendChild(t)}));else{let i=0;S.forEach(((o,a)=>{const e=o.getBoundingClientRect(),r=document.body.getBoundingClientRect();i+=o.clientHeight;const s=e.top-r.top,n=e.left-r.left;if(o.style.setProperty("--pinned-width",`${o.clientWidth}px`),o.style.setProperty("--pinned-height",`${o.clientHeight}px`),o.style.setProperty("--pinned-top",`${s}px`),o.style.setProperty("--pinned-left",`${n}px`),0===a){D=s;const i=t.querySelector("ion-header");i&&(D-=i.clientHeight)}})),S.forEach((t=>{null==o||o.style.setProperty("padding-bottom",`${i}px`),t.classList.add("modal-footer-moving"),t.style.setProperty("position","absolute"),t.style.setProperty("width","var(--pinned-width)"),t.style.setProperty("height","var(--pinned-height)"),t.style.setProperty("top","var(--pinned-top)"),t.style.setProperty("left","var(--pinned-left)"),document.body.appendChild(t)}))}};B&&P&&(B.keyframes([...b.WRAPPER_KEYFRAMES]),P.keyframes([...b.BACKDROP_KEYFRAMES]),null==j||j.keyframes([...b.CONTENT_KEYFRAMES]),r.progressStart(!0,1-k),k>e&&!1!==t.focusTrap&&!1!==t.showBackdrop?I():N()),g&&k!==M&&n&&(g.scrollY=!1);const $=i=>{const{breakpoint:o,canDismiss:a,breakpointOffset:d,animated:h}=i,l=a&&0===o,m=l?k:o,f=0!==m;return k=0,B&&P&&(B.keyframes([{offset:0,transform:`translateY(${100*d}%)`},{offset:1,transform:`translateY(${100*(1-m)}%)`}]),P.keyframes([{offset:0,opacity:`calc(var(--backdrop-opacity) * ${G(1-d,e)})`},{offset:1,opacity:`calc(var(--backdrop-opacity) * ${G(m,e)})`}]),j&&j.keyframes([{offset:0,maxHeight:100*(1-d)+"%"},{offset:1,maxHeight:100*m+"%"}]),r.progressStep(0)),H.enable(!1),l?K(t,r):f||p(),!g||m!==s[s.length-1]&&n||(g.scrollY=!0),n||0!==m||R("stationary"),new Promise((i=>{r.onFinish((()=>{f?(n||R("stationary"),B&&P?w((()=>{B.keyframes([...b.WRAPPER_KEYFRAMES]),P.keyframes([...b.BACKDROP_KEYFRAMES]),null==j||j.keyframes([...b.CONTENT_KEYFRAMES]),r.progressStart(!0,1-m),k=m,c(k),k>e&&!1!==t.focusTrap&&!1!==t.showBackdrop?I():N(),H.enable(!0),i()})):(H.enable(!0),i())):i()}),{oneTimeCallback:!0}).progressEnd(1,0,h?500:0)}))},L=t=>{const i=o.getBoundingClientRect().top+t,a=F(i);return s.reduce(((t,i)=>Math.abs(i-a)<Math.abs(t-a)?i:t))},F=t=>{const i=s[s.length-1],o=z(s[0]),a=z(i),e=Math.round((o-t)/(o-a)*1e3)/1e3;return Math.max(0,Math.min(1,e))},z=i=>{const o=t.getBoundingClientRect();return window.innerHeight-o.height*i},H=W({el:o,gestureName:"modalSheet",gesturePriority:40,direction:"y",threshold:10,canStart:t=>{const i=d(t.event.target);if(k=l(),!n&&i)return 0===(h(i)?x(i).querySelector(".inner-scroll"):i).scrollTop;if(1===k&&i){const t=h(i)?x(i).querySelector(".inner-scroll"):i;return!i.querySelector("ion-refresher")&&0===t.scrollTop}return!0},onStart:i=>{if(Y=void 0!==t.canDismiss&&!0!==t.canDismiss&&0===C,!n){const t=d(i.event.target);O=t&&h(t)?x(t).querySelector(".inner-scroll"):t}n||R("moving"),i.deltaY>0&&g&&(g.scrollY=!1),w((()=>{t.focus()})),r.progressStart(!0,1-k),m()},onMove:t=>{if(n||null===D||null===T||(t.currentY>=D&&"moving"===T?R("stationary"):t.currentY<D&&"stationary"===T&&R("moving")),!n&&t.deltaY<=0&&O)return;t.deltaY>0&&g&&(g.scrollY=!1);const i=s.length>1?1-s[1]:void 0,o=1-k+t.deltaY/y,a=void 0!==i&&o>=i&&Y,e=a?.95:.9999,d=a&&void 0!==i?i+J((o-i)/(e-i)):o;A=v(1e-4,d,e),r.progressStep(A);const h=L(t.deltaY),l={currentY:t.currentY,deltaY:t.deltaY,velocityY:t.velocityY,progress:F(t.currentY),snapBreakpoint:h};f(l)},onEnd:t=>{const i=L(t.deltaY),o={currentY:t.currentY,deltaY:t.deltaY,velocityY:t.velocityY,progress:F(t.currentY),snapBreakpoint:i};if(!n&&t.deltaY<=0&&O&&O.scrollTop>0)return R("stationary"),void u(o);$({breakpoint:i,breakpointOffset:A,canDismiss:Y,animated:!0}),u(o)}});return{gesture:H,moveSheetToBreakpoint:$}})(this.el,this.backdropEl,t,i,o,r,this.sortedBreakpoints,this.expandToScroll,(()=>{var t;return null!==(t=this.currentBreakpoint)&&void 0!==t?t:0}),(()=>this.sheetOnDismiss()),(t=>{this.currentBreakpoint!==t&&(this.currentBreakpoint=t,this.ionBreakpointDidChange.emit({breakpoint:t}))}),(()=>this.onDragStart()),(t=>this.onDragMove(t)),(t=>this.onDragEnd(t)));this.gesture=s,this.moveSheetToBreakpoint=n,this.gesture.enable(!0),(!1===this.showBackdrop||!1===this.focusTrap||o>0)&&this.setupChildRoutePassthrough()}setupChildRoutePassthrough(){var t;this.cachedPageParent=this.getOriginalPageParent();const i=this.cachedPageParent;if(!i||"ION-APP"===i.tagName)return;const o=Array.from(i.children).some((t=>{var i;return!(t===this.el||t instanceof HTMLElement&&"none"===window.getComputedStyle(t).display||"TEMPLATE"===t.tagName||"SLOT"===t.tagName||t.nodeType===Node.TEXT_NODE&&!(null===(i=t.textContent)||void 0===i?void 0:i.trim()))}));if(o)return;i.classList.add("ion-page-overlay-passthrough");const a=i.parentElement;"ION-ROUTER-OUTLET"===(null==a?void 0:a.tagName)&&"ION-APP"!==(null===(t=a.parentElement)||void 0===t?void 0:t.tagName)&&(a.style.setProperty("pointer-events","none"),a.setAttribute("data-overlay-passthrough","true"))}getOriginalPageParent(){if(!this.cachedOriginalParent)return null;let t=this.cachedOriginalParent;for(;t&&!t.classList.contains("ion-page");)t=t.parentElement;return t}cleanupChildRoutePassthrough(){const t=this.cachedPageParent;if(!t)return;t.classList.remove("ion-page-overlay-passthrough");const i=t.parentElement;(null==i?void 0:i.hasAttribute("data-overlay-passthrough"))&&(i.style.removeProperty("pointer-events"),i.removeAttribute("data-overlay-passthrough")),this.cachedPageParent=void 0}sheetOnDismiss(){this.gestureAnimationDismissing=!0,this.animation.onFinish((async()=>{this.currentBreakpoint=0,this.ionBreakpointDidChange.emit({breakpoint:this.currentBreakpoint}),await this.dismiss(void 0,Y),this.gestureAnimationDismissing=!1}))}cardOnDismiss(){this.gestureAnimationDismissing=!0,_(this.statusBarStyle),this.animation.onFinish((async()=>{await this.dismiss(void 0,Y),this.gestureAnimationDismissing=!1}))}async dismiss(t,i){var o;if(this.gestureAnimationDismissing&&i!==Y)return!1;clearTimeout(this.resizeTimeout),this.resizeTimeout=void 0;const e=await this.lockController.lock();if(await this.dismissNestedModals(),"handler"!==i&&!await this.checkCanDismiss(t,i))return e(),!1;const{presentingElement:r}=this;void 0!==r&&"ios"===R(this)&&_(this.statusBarStyle),"undefined"!=typeof window&&this.keyboardOpenCallback&&(window.removeEventListener($,this.keyboardOpenCallback),this.keyboardOpenCallback=void 0);const s=await B(this,t,i,"modalLeave",ot,et,{presentingEl:r,currentBreakpoint:null!==(o=this.currentBreakpoint)&&void 0!==o?o:this.initialBreakpoint,backdropBreakpoint:this.backdropBreakpoint,expandToScroll:this.expandToScroll});if(s){const{delegate:t}=this.getDelegate();await b(t,this.usersElement),a((()=>this.el.classList.remove("show-modal"))),this.animation&&this.animation.destroy(),this.gesture&&this.gesture.destroy(),this.cleanupViewTransitionListener(),this.cleanupParentRemovalObserver(),this.cleanupSafeAreaOverrides(),this.cleanupChildRoutePassthrough()}return this.currentBreakpoint=void 0,this.animation=void 0,e(),s}onDidDismiss(){return P(this.el,"ionModalDidDismiss")}onWillDismiss(){return P(this.el,"ionModalWillDismiss")}async setCurrentBreakpoint(t){if(!this.isSheetModal)return void o("[ion-modal] - setCurrentBreakpoint is only supported on sheet modals.");if(!this.breakpoints.includes(t))return void o(`[ion-modal] - Attempted to set invalid breakpoint value ${t}. Please double check that the breakpoint value is part of your defined breakpoints.`);const{currentBreakpoint:i,moveSheetToBreakpoint:a,canDismiss:e,breakpoints:r,animated:s}=this;i!==t&&a&&(this.sheetTransition=a({breakpoint:t,breakpointOffset:1-i,canDismiss:void 0!==e&&!0!==e&&0===r[0],animated:s}),await this.sheetTransition,this.sheetTransition=void 0)}async getCurrentBreakpoint(){return this.currentBreakpoint}async moveToNextBreakpoint(){const{breakpoints:t,currentBreakpoint:i}=this;if(!t||null==i)return!1;const o=t.filter((t=>0!==t)),a=o.indexOf(i),e=o[(a+1)%o.length];return await this.setCurrentBreakpoint(e),!0}initViewTransitionListener(){"ios"!==R(this)||!this.presentingElement||this.enterAnimation||this.leaveAnimation||(this.currentViewIsPortrait=window.innerWidth<768)}handleViewTransition(){if(!this.presented)return;const t=window.innerWidth<768;if(this.currentViewIsPortrait===t)return;this.viewTransitionAnimation&&(this.viewTransitionAnimation.destroy(),this.viewTransitionAnimation=void 0);const{presentingElement:i}=this;if(!i)return;let o;o=this.currentViewIsPortrait&&!t?((t,i,o=300)=>{const{presentingEl:a}=i;if(!a)return L("portrait-to-landscape-transition");const e="ION-MODAL"===a.tagName&&void 0!==a.presentingElement,r=x(a),s=document.body,n=L("portrait-to-landscape-transition").addElement(t).easing("cubic-bezier(0.32,0.72,0,1)").duration(o),d=L().beforeStyles({transform:"translateY(0)","transform-origin":"top center",overflow:"hidden"});if(e){const t="translateY(-10px) scale(0.915)",i="translateY(0px) scale(1)";d.addElement(a).afterStyles({transform:i}).fromTo("transform",t,i).fromTo("filter","contrast(0.85)","contrast(1)");const o=L().addElement(r.querySelector(".modal-shadow")).afterStyles({transform:i,opacity:"0"}).fromTo("transform",t,i);n.addAnimation([d,o])}else{const i=x(t),o=L().addElement(i.querySelectorAll(".modal-wrapper, .modal-shadow")).fromTo("opacity","1","1"),e=L().addElement(i.querySelector("ion-backdrop")).fromTo("opacity","var(--backdrop-opacity)","var(--backdrop-opacity)"),r=`translateY(${CSS.supports("width","max(0px, 1px)")?"max(30px, var(--ion-safe-area-top))":"30px"}) scale(0.915)`;d.addElement(a).afterStyles({transform:"translateY(0px) scale(1)","border-radius":"0px"}).beforeAddWrite((()=>s.style.setProperty("background-color",""))).fromTo("transform",r,"translateY(0px) scale(1)").fromTo("filter","contrast(0.85)","contrast(1)").fromTo("border-radius","10px 10px 0 0","0px"),n.addAnimation([d,o,e])}return n})(this.el,{presentingEl:i}):((t,i,o=300)=>{const{presentingEl:a}=i;if(!a)return L("landscape-to-portrait-transition");const e="ION-MODAL"===a.tagName&&void 0!==a.presentingElement,r=x(a),s=document.body,n=L("landscape-to-portrait-transition").addElement(t).easing("cubic-bezier(0.32,0.72,0,1)").duration(o),d=L().beforeStyles({transform:"translateY(0)","transform-origin":"top center",overflow:"hidden"});if(e){const t="translateY(-10px) scale(0.915)",i="translateY(0) scale(1)";d.addElement(a).afterStyles({transform:i}).fromTo("transform",t,i);const o=L().addElement(r.querySelector(".modal-shadow")).afterStyles({transform:i,opacity:"0"}).fromTo("transform",t,i);n.addAnimation([d,o])}else{const i=x(t),o=L().addElement(i.querySelectorAll(".modal-wrapper, .modal-shadow")).fromTo("opacity","1","1"),e=L().addElement(i.querySelector("ion-backdrop")).fromTo("opacity","var(--backdrop-opacity)","var(--backdrop-opacity)"),r=`translateY(${CSS.supports("width","max(0px, 1px)")?"max(30px, var(--ion-safe-area-top))":"30px"}) scale(0.915)`;d.addElement(a).afterStyles({transform:r}).beforeAddWrite((()=>s.style.setProperty("background-color","black"))).keyframes([{offset:0,transform:"translateY(0px) scale(1)",filter:"contrast(1)",borderRadius:"0px"},{offset:.2,transform:"translateY(0px) scale(1)",filter:"contrast(1)",borderRadius:"10px 10px 0 0"},{offset:1,transform:r,filter:"contrast(0.85)",borderRadius:"10px 10px 0 0"}]),n.addAnimation([d,o,e])}return n})(this.el,{presentingEl:i}),this.currentViewIsPortrait=t,this.viewTransitionAnimation=o,o.play().then((()=>{this.viewTransitionAnimation=void 0,w((()=>this.updateSafeAreaOverrides())),this.reinitSwipeToClose()}))}cleanupViewTransitionListener(){this.resizeTimeout&&(clearTimeout(this.resizeTimeout),this.resizeTimeout=void 0),this.viewTransitionAnimation&&(this.viewTransitionAnimation.destroy(),this.viewTransitionAnimation=void 0)}reinitSwipeToClose(){"ios"===R(this)&&this.presentingElement&&(this.gesture&&(this.gesture.destroy(),this.gesture=void 0),this.animation&&(this.animation.progressEnd(0,0,0),this.animation.destroy(),this.animation=void 0),w((()=>{this.ensureCorrectModalPosition(),this.initSwipeToClose()})))}ensureCorrectModalPosition(){const{el:t,presentingElement:i}=this,o=x(t).querySelector(".modal-wrapper");if(o&&(o.style.transform="translateY(0vh)",o.style.opacity="1"),"ION-MODAL"===(null==i?void 0:i.tagName))if(window.innerWidth<768){const t=CSS.supports("width","max(0px, 1px)")?"max(30px, var(--ion-safe-area-top))":"30px";i.style.transform=`translateY(${t}) scale(0.915)`}else i.style.transform="translateY(0px) scale(1)"}async dismissNestedModals(){const t=document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);null==t||t.forEach((async t=>{await t.dismiss(void 0,"parent-dismissed")}))}initParentRemovalObserver(){"undefined"!=typeof MutationObserver&&"undefined"!=typeof window&&this.cachedOriginalParent&&this.cachedOriginalParent.nodeType!==Node.DOCUMENT_NODE&&this.cachedOriginalParent.nodeType!==Node.DOCUMENT_FRAGMENT_NODE&&(this.hasController||this.cachedOriginalParent===document.body||"ION-APP"===this.cachedOriginalParent.tagName||(this.parentRemovalObserver=new MutationObserver((t=>{t.forEach((t=>{"childList"===t.type&&t.removedNodes.length>0&&(Array.from(t.removedNodes).some((t=>{var i,o;const a=t===this.cachedOriginalParent,e=!!this.cachedOriginalParent&&(null===(o=(i=t).contains)||void 0===o?void 0:o.call(i,this.cachedOriginalParent));return a||e}))||this.cachedOriginalParent&&!this.cachedOriginalParent.isConnected)&&(this.dismiss(void 0,"parent-removed"),this.cachedOriginalParent=void 0)}))})),this.parentRemovalObserver.observe(document.body,{childList:!0,subtree:!0})))}cleanupParentRemovalObserver(){var t;null===(t=this.parentRemovalObserver)||void 0===t||t.disconnect(),this.parentRemovalObserver=void 0}onDragStart(){this.ionDragStart.emit()}onDragMove(t){this.ionDragMove.emit(t)}onDragEnd(t){this.ionDragEnd.emit(t)}getSafeAreaContext(){return{isSheetModal:this.isSheetModal,isCardModal:void 0!==this.presentingElement&&"ios"===R(this),presentingElement:this.presentingElement,breakpoints:this.breakpoints,currentBreakpoint:this.currentBreakpoint}}setInitialSafeAreaOverrides(){const t=Object.assign(Object.assign({},this.getSafeAreaContext()),{hasCustomDimensions:dt(this.el)}),i=(t=>{const{isSheetModal:i,isCardModal:o}=t;return i?{top:"0px",bottom:"inherit",left:"0px",right:"0px"}:o?{top:"inherit",bottom:"inherit",left:"0px",right:"0px"}:z&&z.matchMedia("(min-width: 768px) and (min-height: 600px)").matches||t.hasCustomDimensions?{top:"0px",bottom:"0px",left:"0px",right:"0px"}:{top:"inherit",bottom:"inherit",left:"inherit",right:"inherit"}})(t);ht(this.el,i),t.isSheetModal&&this.updateSheetOffsetTop()}updateSheetOffsetTop(){const t=(()=>{if(null!==st)return st;const t=null==z?void 0:z.document;if(!(null==t?void 0:t.body))return 0;const i=t.createElement("div");i.style.cssText="position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;padding-top:var(--ion-safe-area-top,0px);",t.body.appendChild(i);const o=parseFloat(getComputedStyle(i).paddingTop)||0;return i.remove(),st=o,nt||(nt=!0,w((()=>{st=null,nt=!1}))),o})();this.el.style.setProperty("--ion-modal-offset-top",`${t}px`)}updateSafeAreaOverrides(){const{wrapperEl:t,el:i}=this,o=this.getSafeAreaContext();if(o.isSheetModal)return;if(o.isCardModal)return;if(!t)return;const a=(t=>{var i,o;const a=t.getBoundingClientRect(),e=null!==(i=null==z?void 0:z.innerHeight)&&void 0!==i?i:0,r=null!==(o=null==z?void 0:z.innerWidth)&&void 0!==o?o:0;return{top:a.top<=5?"inherit":"0px",bottom:a.bottom>=e-5?"inherit":"0px",left:a.left<=5?"inherit":"0px",right:a.right>=r-5?"inherit":"0px"}})(t);ht(i,a)}applyFullscreenSafeArea(){const t=this.getSafeAreaContext();if(t.isSheetModal||t.isCardModal)return;const{contentEl:i,hasFooter:o}=this.findContentAndFooter();this.applyFullscreenSafeAreaTo(i,o)}applyFullscreenSafeAreaTo(t,i){t&&!i&&t.style.setProperty("--ion-content-safe-area-padding-bottom","var(--ion-safe-area-bottom, 0px)")}clearContentSafeAreaPadding(t){t&&t.style.removeProperty("--ion-content-safe-area-padding-bottom")}findContentAndFooter(){let t=null,i=!1;for(const o of Array.from(this.el.children)){"ION-CONTENT"===o.tagName&&(t=o),"ION-FOOTER"===o.tagName&&(i=!0);for(const a of Array.from(o.children))"ION-CONTENT"!==a.tagName||t||(t=a),"ION-FOOTER"===a.tagName&&(i=!0)}return{contentEl:t,hasFooter:i}}cleanupSafeAreaOverrides(){var t;(t=this.el).style.removeProperty("--ion-safe-area-top"),t.style.removeProperty("--ion-safe-area-bottom"),t.style.removeProperty("--ion-safe-area-left"),t.style.removeProperty("--ion-safe-area-right"),this.el.style.removeProperty("--ion-modal-offset-top");const{contentEl:i}=this.findContentAndFooter();this.clearContentSafeAreaPadding(i)}render(){const{handle:t,isSheetModal:i,presentingElement:o,htmlAttributes:a,handleBehavior:e,inheritedAttributes:n,focusTrap:d,expandToScroll:h}=this,l=!1!==t&&i,p=R(this),c=void 0!==o&&"ios"===p,m="cycle"===e;return r(s,Object.assign({key:"4bf38aa67df9a3f977163bba5423960bbafd16de","no-router":!0,tabIndex:m&&i&&l?0:-1},a,{style:{zIndex:`${2e4+this.overlayIndex}`},class:Object.assign({[p]:!0,"modal-default":!c&&!i,"modal-card":c,"modal-sheet":i,"modal-no-expand-scroll":i&&!h,"overlay-hidden":!0,[E]:!1===d},j(this.cssClass)),onIonBackdropTap:this.onBackdropTap,onIonModalDidPresent:this.onLifecycle,onIonModalWillPresent:this.onLifecycle,onIonModalWillDismiss:this.onLifecycle,onIonModalDidDismiss:this.onLifecycle,onFocus:this.onModalFocus}),r("ion-backdrop",{key:"866da40cc5fc8d3e36637098fb3066a5bc9f4e0f",ref:t=>this.backdropEl=t,visible:this.showBackdrop,tappable:this.backdropDismiss,part:"backdrop"}),"ios"===p&&r("div",{key:"5a2a05514ea8592c8feb0465e504aa7c7af17963",class:"modal-shadow"}),r("div",Object.assign({key:"4d327115306451f57d190b06ab8cbb6191a6f1d7",role:"dialog"},n,{"aria-modal":"true",class:"modal-wrapper ion-overlay-wrapper",part:"content",ref:t=>this.wrapperEl=t}),l&&r("button",{key:"d1882835cc049232c0d957e3ba1e79676a07d179",class:"modal-handle",tabIndex:m?0:-1,"aria-label":"Activate to adjust the size of the dialog overlaying the screen",onClick:m?this.onHandleClick:void 0,part:"handle",ref:t=>this.dragHandleEl=t}),r("slot",{key:"81dc58b09cf7d7022b04cd170f53113604364d5e",onSlotchange:this.onSlotChange})))}get el(){return n(this)}static get watchers(){return{isOpen:[{onIsOpenChange:0}],trigger:[{triggerChanged:0}]}}},pt={ionModalDidPresent:"ionViewDidEnter",ionModalWillPresent:"ionViewWillEnter",ionModalWillDismiss:"ionViewWillLeave",ionModalDidDismiss:"ionViewDidLeave"};lt.style={ios:':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-modal-offset-top, 0px) + 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}',md:':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-modal-offset-top, 0px) + 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}'};export{lt as ion_modal}
|
|
@@ -382,6 +382,11 @@ export declare class Modal implements ComponentInterface, OverlayInterface {
|
|
|
382
382
|
private onDragEnd;
|
|
383
383
|
/**
|
|
384
384
|
* Creates the context object for safe-area utilities.
|
|
385
|
+
*
|
|
386
|
+
* `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
|
|
387
|
+
* because it is only read by `getInitialSafeAreaConfig()`. Other callers
|
|
388
|
+
* (resize handler, post-animation update, fullscreen-padding apply) would
|
|
389
|
+
* pay a `getComputedStyle()` cost for a value they never consult.
|
|
385
390
|
*/
|
|
386
391
|
private getSafeAreaContext;
|
|
387
392
|
/**
|
|
@@ -407,12 +412,45 @@ export declare class Modal implements ComponentInterface, OverlayInterface {
|
|
|
407
412
|
*/
|
|
408
413
|
private updateSafeAreaOverrides;
|
|
409
414
|
/**
|
|
410
|
-
* Applies
|
|
411
|
-
*
|
|
415
|
+
* Applies safe-area-bottom scroll padding to ion-content inside
|
|
416
|
+
* fullscreen modals that have no ion-footer. This prevents content
|
|
417
|
+
* from being hidden behind the system navigation bar while keeping
|
|
418
|
+
* the modal background edge-to-edge (no visible gap).
|
|
412
419
|
*/
|
|
413
420
|
private applyFullscreenSafeArea;
|
|
414
421
|
/**
|
|
415
|
-
*
|
|
422
|
+
* Sets --ion-content-safe-area-padding-bottom on the given ion-content
|
|
423
|
+
* when no footer is present, so ion-content's .inner-scroll includes
|
|
424
|
+
* safe-area-bottom in its scroll padding. This keeps the modal background
|
|
425
|
+
* edge-to-edge while ensuring content scrolls clear of the system nav bar.
|
|
426
|
+
*
|
|
427
|
+
* --ion-content-safe-area-padding-bottom is an internal CSS property used
|
|
428
|
+
* only by this code path. It is not part of ion-content's public API and
|
|
429
|
+
* should not be set by consumers. The default of 0px makes it a no-op
|
|
430
|
+
* when unset, which is the expected state for ion-content used outside of
|
|
431
|
+
* a fullscreen modal without a footer.
|
|
432
|
+
*/
|
|
433
|
+
private applyFullscreenSafeAreaTo;
|
|
434
|
+
/**
|
|
435
|
+
* Removes the internal --ion-content-safe-area-padding-bottom property
|
|
436
|
+
* from an already-located ion-content. Callers do their own
|
|
437
|
+
* findContentAndFooter() so they can also read hasFooter if needed.
|
|
438
|
+
*/
|
|
439
|
+
private clearContentSafeAreaPadding;
|
|
440
|
+
/**
|
|
441
|
+
* Finds ion-content and ion-footer among direct children and one level of
|
|
442
|
+
* grandchildren (for wrapped components like <app-footer><ion-footer>).
|
|
443
|
+
*
|
|
444
|
+
* Intentionally does NOT use findIonContent() or querySelector() because
|
|
445
|
+
* those search the full subtree and would match ion-content inside nested
|
|
446
|
+
* routes/pages. We only want direct slot children (+ one wrapper level).
|
|
447
|
+
*
|
|
448
|
+
* Uses a manual loop instead of querySelector(':scope > ...') because
|
|
449
|
+
* Stencil's mock-doc (used in spec tests) does not support :scope.
|
|
450
|
+
*/
|
|
451
|
+
private findContentAndFooter;
|
|
452
|
+
/**
|
|
453
|
+
* Clears all safe-area overrides and padding.
|
|
416
454
|
*/
|
|
417
455
|
private cleanupSafeAreaOverrides;
|
|
418
456
|
render(): any;
|
|
@@ -18,6 +18,11 @@ export interface ModalSafeAreaContext {
|
|
|
18
18
|
presentingElement?: HTMLElement;
|
|
19
19
|
breakpoints?: number[];
|
|
20
20
|
currentBreakpoint?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Only consulted by `getInitialSafeAreaConfig()`. Callers that only use the
|
|
23
|
+
* context for non-initial paths can omit this. See `hasCustomModalDimensions()`.
|
|
24
|
+
*/
|
|
25
|
+
hasCustomDimensions?: boolean;
|
|
21
26
|
}
|
|
22
27
|
/**
|
|
23
28
|
* Resolves the current root --ion-safe-area-top value to pixels.
|
|
@@ -28,6 +33,17 @@ export interface ModalSafeAreaContext {
|
|
|
28
33
|
* Results are cached for the current frame to avoid repeated reflows.
|
|
29
34
|
*/
|
|
30
35
|
export declare const getRootSafeAreaTop: () => number;
|
|
36
|
+
/**
|
|
37
|
+
* True when the modal host declares BOTH a non-fullscreen `--width` AND a
|
|
38
|
+
* non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
|
|
39
|
+
* touch any screen edge).
|
|
40
|
+
*
|
|
41
|
+
* The conservative "both axes" check avoids mis-zeroing safe-area for
|
|
42
|
+
* partial-custom modals where the modal still touches top/bottom edges
|
|
43
|
+
* (e.g. only `--width` overridden). Partial cases fall through to the
|
|
44
|
+
* existing position-based post-animation correction.
|
|
45
|
+
*/
|
|
46
|
+
export declare const hasCustomModalDimensions: (hostEl: HTMLElement) => boolean;
|
|
31
47
|
/**
|
|
32
48
|
* Returns the initial safe-area configuration based on modal type.
|
|
33
49
|
* This is called before animation starts and uses configuration-based prediction.
|
package/hydrate/index.js
CHANGED
|
@@ -12367,7 +12367,7 @@ const isRTL$1 = (hostEl) => {
|
|
|
12367
12367
|
return (document === null || document === void 0 ? void 0 : document.dir.toLowerCase()) === 'rtl';
|
|
12368
12368
|
};
|
|
12369
12369
|
|
|
12370
|
-
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)}`;
|
|
12370
|
+
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) + var(--ion-content-safe-area-padding-bottom, 0px));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)}`;
|
|
12371
12371
|
|
|
12372
12372
|
/**
|
|
12373
12373
|
* @slot - Content is placed in the scrollable area if provided without a slot.
|
|
@@ -25005,6 +25005,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
25005
25005
|
const MODAL_INSET_MIN_WIDTH = 768;
|
|
25006
25006
|
const MODAL_INSET_MIN_HEIGHT = 600;
|
|
25007
25007
|
const EDGE_THRESHOLD = 5;
|
|
25008
|
+
/**
|
|
25009
|
+
* CSS values for `--width` / `--height` that are treated as fullscreen
|
|
25010
|
+
* (modal touches the corresponding screen edges). Empty string means the
|
|
25011
|
+
* property was not overridden. See `hasCustomModalDimensions()`.
|
|
25012
|
+
*/
|
|
25013
|
+
const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
|
|
25008
25014
|
/**
|
|
25009
25015
|
* Cache for resolved root safe-area-top value, invalidated once per frame.
|
|
25010
25016
|
*/
|
|
@@ -25053,6 +25059,22 @@ const getRootSafeAreaTop = () => {
|
|
|
25053
25059
|
}
|
|
25054
25060
|
return value;
|
|
25055
25061
|
};
|
|
25062
|
+
/**
|
|
25063
|
+
* True when the modal host declares BOTH a non-fullscreen `--width` AND a
|
|
25064
|
+
* non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
|
|
25065
|
+
* touch any screen edge).
|
|
25066
|
+
*
|
|
25067
|
+
* The conservative "both axes" check avoids mis-zeroing safe-area for
|
|
25068
|
+
* partial-custom modals where the modal still touches top/bottom edges
|
|
25069
|
+
* (e.g. only `--width` overridden). Partial cases fall through to the
|
|
25070
|
+
* existing position-based post-animation correction.
|
|
25071
|
+
*/
|
|
25072
|
+
const hasCustomModalDimensions = (hostEl) => {
|
|
25073
|
+
const styles = getComputedStyle(hostEl);
|
|
25074
|
+
const width = styles.getPropertyValue('--width').trim();
|
|
25075
|
+
const height = styles.getPropertyValue('--height').trim();
|
|
25076
|
+
return !FULLSCREEN_SIZE_VALUES.has(width) && !FULLSCREEN_SIZE_VALUES.has(height);
|
|
25077
|
+
};
|
|
25056
25078
|
/**
|
|
25057
25079
|
* Returns the initial safe-area configuration based on modal type.
|
|
25058
25080
|
* This is called before animation starts and uses configuration-based prediction.
|
|
@@ -25087,8 +25109,11 @@ const getInitialSafeAreaConfig = (context) => {
|
|
|
25087
25109
|
}
|
|
25088
25110
|
// On viewports that meet the centered dialog media query breakpoints,
|
|
25089
25111
|
// regular modals render as centered dialogs (not fullscreen), so they
|
|
25090
|
-
// don't touch any screen edges and don't need safe-area insets.
|
|
25091
|
-
|
|
25112
|
+
// don't touch any screen edges and don't need safe-area insets. Also
|
|
25113
|
+
// applies to phone viewports when the modal declares custom --width and
|
|
25114
|
+
// --height; these don't touch screen edges either, so the initial
|
|
25115
|
+
// prediction must be zero to avoid a post-animation correction flash.
|
|
25116
|
+
if (isCenteredDialogViewport() || context.hasCustomDimensions) {
|
|
25092
25117
|
return {
|
|
25093
25118
|
top: '0px',
|
|
25094
25119
|
bottom: '0px',
|
|
@@ -25400,12 +25425,10 @@ class Modal {
|
|
|
25400
25425
|
// since the viewport may have crossed the centered-dialog breakpoint.
|
|
25401
25426
|
if (!context.isSheetModal && !context.isCardModal) {
|
|
25402
25427
|
this.updateSafeAreaOverrides();
|
|
25403
|
-
// Re-evaluate fullscreen safe-area padding: clear first, then re-apply
|
|
25404
|
-
|
|
25405
|
-
|
|
25406
|
-
|
|
25407
|
-
}
|
|
25408
|
-
this.applyFullscreenSafeArea();
|
|
25428
|
+
// Re-evaluate fullscreen safe-area padding: clear first, then re-apply.
|
|
25429
|
+
const { contentEl, hasFooter } = this.findContentAndFooter();
|
|
25430
|
+
this.clearContentSafeAreaPadding(contentEl);
|
|
25431
|
+
this.applyFullscreenSafeAreaTo(contentEl, hasFooter);
|
|
25409
25432
|
}
|
|
25410
25433
|
}, 50); // Debounce to avoid excessive calls during active resizing
|
|
25411
25434
|
}
|
|
@@ -26152,6 +26175,11 @@ class Modal {
|
|
|
26152
26175
|
}
|
|
26153
26176
|
/**
|
|
26154
26177
|
* Creates the context object for safe-area utilities.
|
|
26178
|
+
*
|
|
26179
|
+
* `hasCustomDimensions` is only set by `setInitialSafeAreaOverrides()`
|
|
26180
|
+
* because it is only read by `getInitialSafeAreaConfig()`. Other callers
|
|
26181
|
+
* (resize handler, post-animation update, fullscreen-padding apply) would
|
|
26182
|
+
* pay a `getComputedStyle()` cost for a value they never consult.
|
|
26155
26183
|
*/
|
|
26156
26184
|
getSafeAreaContext() {
|
|
26157
26185
|
return {
|
|
@@ -26173,7 +26201,7 @@ class Modal {
|
|
|
26173
26201
|
* sheets to prevent header content from getting double-offset padding).
|
|
26174
26202
|
*/
|
|
26175
26203
|
setInitialSafeAreaOverrides() {
|
|
26176
|
-
const context = this.getSafeAreaContext();
|
|
26204
|
+
const context = Object.assign(Object.assign({}, this.getSafeAreaContext()), { hasCustomDimensions: hasCustomModalDimensions(this.el) });
|
|
26177
26205
|
const safeAreaConfig = getInitialSafeAreaConfig(context);
|
|
26178
26206
|
applySafeAreaOverrides(this.el, safeAreaConfig);
|
|
26179
26207
|
// Set the internal offset property with the resolved root safe-area-top value
|
|
@@ -26213,59 +26241,85 @@ class Modal {
|
|
|
26213
26241
|
applySafeAreaOverrides(el, safeAreaConfig);
|
|
26214
26242
|
}
|
|
26215
26243
|
/**
|
|
26216
|
-
* Applies
|
|
26217
|
-
*
|
|
26244
|
+
* Applies safe-area-bottom scroll padding to ion-content inside
|
|
26245
|
+
* fullscreen modals that have no ion-footer. This prevents content
|
|
26246
|
+
* from being hidden behind the system navigation bar while keeping
|
|
26247
|
+
* the modal background edge-to-edge (no visible gap).
|
|
26218
26248
|
*/
|
|
26219
26249
|
applyFullscreenSafeArea() {
|
|
26220
|
-
const { wrapperEl, el } = this;
|
|
26221
|
-
if (!wrapperEl)
|
|
26222
|
-
return;
|
|
26223
26250
|
const context = this.getSafeAreaContext();
|
|
26224
26251
|
if (context.isSheetModal || context.isCardModal)
|
|
26225
26252
|
return;
|
|
26226
|
-
|
|
26227
|
-
|
|
26228
|
-
|
|
26229
|
-
|
|
26230
|
-
|
|
26231
|
-
|
|
26253
|
+
const { contentEl, hasFooter } = this.findContentAndFooter();
|
|
26254
|
+
this.applyFullscreenSafeAreaTo(contentEl, hasFooter);
|
|
26255
|
+
}
|
|
26256
|
+
/**
|
|
26257
|
+
* Sets --ion-content-safe-area-padding-bottom on the given ion-content
|
|
26258
|
+
* when no footer is present, so ion-content's .inner-scroll includes
|
|
26259
|
+
* safe-area-bottom in its scroll padding. This keeps the modal background
|
|
26260
|
+
* edge-to-edge while ensuring content scrolls clear of the system nav bar.
|
|
26261
|
+
*
|
|
26262
|
+
* --ion-content-safe-area-padding-bottom is an internal CSS property used
|
|
26263
|
+
* only by this code path. It is not part of ion-content's public API and
|
|
26264
|
+
* should not be set by consumers. The default of 0px makes it a no-op
|
|
26265
|
+
* when unset, which is the expected state for ion-content used outside of
|
|
26266
|
+
* a fullscreen modal without a footer.
|
|
26267
|
+
*/
|
|
26268
|
+
applyFullscreenSafeAreaTo(contentEl, hasFooter) {
|
|
26269
|
+
// Only apply for standard Ionic layouts (has ion-content but no
|
|
26270
|
+
// ion-footer). When a footer is present it handles its own safe-area
|
|
26271
|
+
// padding. Custom modals with raw HTML are developer-controlled.
|
|
26272
|
+
if (!contentEl || hasFooter)
|
|
26273
|
+
return;
|
|
26274
|
+
contentEl.style.setProperty('--ion-content-safe-area-padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
|
|
26275
|
+
}
|
|
26276
|
+
/**
|
|
26277
|
+
* Removes the internal --ion-content-safe-area-padding-bottom property
|
|
26278
|
+
* from an already-located ion-content. Callers do their own
|
|
26279
|
+
* findContentAndFooter() so they can also read hasFooter if needed.
|
|
26280
|
+
*/
|
|
26281
|
+
clearContentSafeAreaPadding(contentEl) {
|
|
26282
|
+
if (!contentEl)
|
|
26283
|
+
return;
|
|
26284
|
+
contentEl.style.removeProperty('--ion-content-safe-area-padding-bottom');
|
|
26285
|
+
}
|
|
26286
|
+
/**
|
|
26287
|
+
* Finds ion-content and ion-footer among direct children and one level of
|
|
26288
|
+
* grandchildren (for wrapped components like <app-footer><ion-footer>).
|
|
26289
|
+
*
|
|
26290
|
+
* Intentionally does NOT use findIonContent() or querySelector() because
|
|
26291
|
+
* those search the full subtree and would match ion-content inside nested
|
|
26292
|
+
* routes/pages. We only want direct slot children (+ one wrapper level).
|
|
26293
|
+
*
|
|
26294
|
+
* Uses a manual loop instead of querySelector(':scope > ...') because
|
|
26295
|
+
* Stencil's mock-doc (used in spec tests) does not support :scope.
|
|
26296
|
+
*/
|
|
26297
|
+
findContentAndFooter() {
|
|
26298
|
+
let contentEl = null;
|
|
26232
26299
|
let hasFooter = false;
|
|
26233
|
-
for (const child of Array.from(el.children)) {
|
|
26300
|
+
for (const child of Array.from(this.el.children)) {
|
|
26234
26301
|
if (child.tagName === 'ION-CONTENT')
|
|
26235
|
-
|
|
26302
|
+
contentEl = child;
|
|
26236
26303
|
if (child.tagName === 'ION-FOOTER')
|
|
26237
26304
|
hasFooter = true;
|
|
26238
26305
|
for (const grandchild of Array.from(child.children)) {
|
|
26239
|
-
if (grandchild.tagName === 'ION-CONTENT')
|
|
26240
|
-
|
|
26306
|
+
if (grandchild.tagName === 'ION-CONTENT' && !contentEl)
|
|
26307
|
+
contentEl = grandchild;
|
|
26241
26308
|
if (grandchild.tagName === 'ION-FOOTER')
|
|
26242
26309
|
hasFooter = true;
|
|
26243
26310
|
}
|
|
26244
26311
|
}
|
|
26245
|
-
|
|
26246
|
-
// but no ion-footer). Custom modals with raw HTML are fully
|
|
26247
|
-
// developer-controlled and should not be modified.
|
|
26248
|
-
if (!hasContent || hasFooter)
|
|
26249
|
-
return;
|
|
26250
|
-
// Reduce wrapper height by safe-area and add equivalent padding so the
|
|
26251
|
-
// total visual size stays the same but the flex content area shrinks.
|
|
26252
|
-
// Using height + padding instead of box-sizing: border-box avoids
|
|
26253
|
-
// breaking custom modals that set --border-width (border-box would
|
|
26254
|
-
// include the border inside the height, changing the layout).
|
|
26255
|
-
wrapperEl.style.setProperty('height', 'calc(var(--height) - var(--ion-safe-area-bottom, 0px))');
|
|
26256
|
-
wrapperEl.style.setProperty('padding-bottom', 'var(--ion-safe-area-bottom, 0px)');
|
|
26312
|
+
return { contentEl, hasFooter };
|
|
26257
26313
|
}
|
|
26258
26314
|
/**
|
|
26259
|
-
* Clears all safe-area overrides and padding
|
|
26315
|
+
* Clears all safe-area overrides and padding.
|
|
26260
26316
|
*/
|
|
26261
26317
|
cleanupSafeAreaOverrides() {
|
|
26262
26318
|
clearSafeAreaOverrides(this.el);
|
|
26263
26319
|
// Remove internal sheet offset property
|
|
26264
26320
|
this.el.style.removeProperty('--ion-modal-offset-top');
|
|
26265
|
-
|
|
26266
|
-
|
|
26267
|
-
this.wrapperEl.style.removeProperty('padding-bottom');
|
|
26268
|
-
}
|
|
26321
|
+
const { contentEl } = this.findContentAndFooter();
|
|
26322
|
+
this.clearContentSafeAreaPadding(contentEl);
|
|
26269
26323
|
}
|
|
26270
26324
|
render() {
|
|
26271
26325
|
const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
|
|
@@ -26274,20 +26328,20 @@ class Modal {
|
|
|
26274
26328
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
26275
26329
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
26276
26330
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
26277
|
-
return (hAsync(Host, Object.assign({ key: '
|
|
26331
|
+
return (hAsync(Host, Object.assign({ key: '4bf38aa67df9a3f977163bba5423960bbafd16de', "no-router": true,
|
|
26278
26332
|
// Allow the modal to be navigable when the handle is focusable
|
|
26279
26333
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
26280
26334
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
26281
|
-
}, 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 }), hAsync("ion-backdrop", { key: '
|
|
26335
|
+
}, 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 }), hAsync("ion-backdrop", { key: '866da40cc5fc8d3e36637098fb3066a5bc9f4e0f', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && hAsync("div", { key: '5a2a05514ea8592c8feb0465e504aa7c7af17963', class: "modal-shadow" }), hAsync("div", Object.assign({ key: '4d327115306451f57d190b06ab8cbb6191a6f1d7',
|
|
26282
26336
|
/*
|
|
26283
26337
|
role and aria-modal must be used on the
|
|
26284
26338
|
same element. They must also be set inside the
|
|
26285
26339
|
shadow DOM otherwise ion-button will not be highlighted
|
|
26286
26340
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
26287
26341
|
*/
|
|
26288
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: '
|
|
26342
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (hAsync("button", { key: 'd1882835cc049232c0d957e3ba1e79676a07d179', class: "modal-handle",
|
|
26289
26343
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
26290
|
-
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) })), hAsync("slot", { key: '
|
|
26344
|
+
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) })), hAsync("slot", { key: '81dc58b09cf7d7022b04cd170f53113604364d5e', onSlotchange: this.onSlotChange }))));
|
|
26291
26345
|
}
|
|
26292
26346
|
get el() { return getElement(this); }
|
|
26293
26347
|
static get watchers() { return {
|