@ionic/core 9.0.4-nightly.20260914 → 9.0.4-nightly.20260916
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/index.js +1 -1
- package/components/ion-accordion-group.js +1 -1
- package/components/ion-accordion.js +1 -1
- package/components/ion-action-sheet.js +1 -1
- package/components/ion-alert.js +1 -1
- package/components/ion-app.js +1 -1
- package/components/ion-avatar.js +1 -1
- package/components/ion-back-button.js +1 -1
- package/components/ion-backdrop.js +1 -1
- package/components/ion-badge.js +1 -1
- package/components/ion-breadcrumb.js +1 -1
- package/components/ion-breadcrumbs.js +1 -1
- package/components/ion-button.js +1 -1
- package/components/ion-buttons.js +1 -1
- package/components/ion-card-content.js +1 -1
- package/components/ion-card-header.js +1 -1
- package/components/ion-card-subtitle.js +1 -1
- package/components/ion-card-title.js +1 -1
- package/components/ion-card.js +1 -1
- package/components/ion-checkbox.js +1 -1
- package/components/ion-chip.js +1 -1
- package/components/ion-col.js +1 -1
- package/components/ion-content.js +1 -1
- package/components/ion-datetime-button.js +1 -1
- package/components/ion-datetime.js +1 -1
- package/components/ion-fab-button.js +1 -1
- package/components/ion-fab-list.js +1 -1
- package/components/ion-fab.js +1 -1
- package/components/ion-footer.js +1 -1
- package/components/ion-grid.js +1 -1
- package/components/ion-header.js +1 -1
- package/components/ion-icon.js +1 -1
- package/components/ion-img.js +1 -1
- package/components/ion-infinite-scroll-content.js +1 -1
- package/components/ion-infinite-scroll.js +1 -1
- package/components/ion-input-otp.js +1 -1
- package/components/ion-input-password-toggle.js +1 -1
- package/components/ion-input.js +1 -1
- package/components/ion-item-divider.js +1 -1
- package/components/ion-item-group.js +1 -1
- package/components/ion-item-option.js +1 -1
- package/components/ion-item-options.js +1 -1
- package/components/ion-item-sliding.js +1 -1
- package/components/ion-item.js +1 -1
- package/components/ion-label.js +1 -1
- package/components/ion-list-header.js +1 -1
- package/components/ion-list.js +1 -1
- package/components/ion-loading.js +1 -1
- package/components/ion-menu-button.js +1 -1
- package/components/ion-menu-toggle.js +1 -1
- package/components/ion-menu.js +1 -1
- package/components/ion-modal.js +1 -1
- package/components/ion-nav-link.js +1 -1
- package/components/ion-nav.js +1 -1
- package/components/ion-note.js +1 -1
- package/components/ion-picker-column-option.js +1 -1
- package/components/ion-picker-column.js +1 -1
- package/components/ion-picker.js +1 -1
- package/components/ion-popover.js +1 -1
- package/components/ion-progress-bar.js +1 -1
- package/components/ion-radio-group.js +1 -1
- package/components/ion-radio.js +1 -1
- package/components/ion-range.js +1 -1
- package/components/ion-refresher-content.js +1 -1
- package/components/ion-refresher.js +1 -1
- package/components/ion-reorder-group.js +1 -1
- package/components/ion-reorder.js +1 -1
- package/components/ion-ripple-effect.js +1 -1
- package/components/ion-route-redirect.js +1 -1
- package/components/ion-route.js +1 -1
- package/components/ion-router-link.js +1 -1
- package/components/ion-router-outlet.js +1 -1
- package/components/ion-router.js +1 -1
- package/components/ion-row.js +1 -1
- package/components/ion-searchbar.js +1 -1
- package/components/ion-segment-button.js +1 -1
- package/components/ion-segment-content.js +1 -1
- package/components/ion-segment-view.js +1 -1
- package/components/ion-segment.js +1 -1
- package/components/ion-select-modal.js +1 -1
- package/components/ion-select-option.js +1 -1
- package/components/ion-select-popover.js +1 -1
- package/components/ion-select.js +1 -1
- package/components/ion-skeleton-text.js +1 -1
- package/components/ion-spinner.js +1 -1
- package/components/ion-split-pane.js +1 -1
- package/components/ion-tab-bar.js +1 -1
- package/components/ion-tab-button.js +1 -1
- package/components/ion-tab.js +1 -1
- package/components/ion-tabs.js +1 -1
- package/components/ion-text.js +1 -1
- package/components/ion-textarea.js +1 -1
- package/components/ion-thumbnail.js +1 -1
- package/components/ion-title.js +1 -1
- package/components/ion-toast.js +1 -1
- package/components/ion-toggle.js +1 -1
- package/components/ion-toolbar.js +1 -1
- package/components/p--pR3YKVX.js +4 -0
- package/components/{p-BJr2B5hZ.js → p-2ta4uE9-.js} +1 -1
- package/components/{p-YjMkHuvH.js → p-47h0_nN4.js} +1 -1
- package/components/{p-C8Ck7_Eo.js → p-8MzqWBTT.js} +1 -1
- package/components/{p-CNLioZ3B.js → p-BGChz0G8.js} +1 -1
- package/components/{p-DZRZic9C.js → p-BLe-edUh.js} +1 -1
- package/components/{p-CJgnoKcN.js → p-BMHhG7Xh.js} +1 -1
- package/components/{p-TWw4e4sO.js → p-BPbgEuCf.js} +1 -1
- package/components/{p-DnBNYc7u.js → p-Bc-3W2an.js} +1 -1
- package/{dist/ionic/p-DTxBioUO.js → components/p-BezPzC13.js} +1 -1
- package/components/{p-B1_TL6RQ.js → p-BezRi1ML.js} +1 -1
- package/{dist/ionic/p-DcCEP7Ss.js → components/p-Bi8VGu4M.js} +1 -1
- package/components/{p-DL13ieTa.js → p-BjizFeM6.js} +1 -1
- package/components/{p-BF48Oc0v.js → p-BuxZkazO.js} +1 -1
- package/components/p-BxCcX93a.js +4 -0
- package/components/{p-BW_SlU2D.js → p-C0tpzcpi.js} +1 -1
- package/components/{p-DMBiAyOR.js → p-C6WYVtle.js} +1 -1
- package/components/p-CDt7Q7Dj.js +4 -0
- package/components/p-CDvyV0r0.js +4 -0
- package/components/{p-C4VpVfrJ.js → p-CEs5NmKW.js} +1 -1
- package/components/{p-CMRYD_yR.js → p-CLVgYpRn.js} +1 -1
- package/components/{p-Cd1WaN-0.js → p-CMT0YmOj.js} +1 -1
- package/components/{p-DFLJvuRK.js → p-CPGp3WWG.js} +1 -1
- package/components/{p-B4lxwJ8N.js → p-CXuRZoWE.js} +1 -1
- package/components/{p-D7wDJdFn.js → p-CaY8IRMT.js} +1 -1
- package/components/{p-BQyuFxYc.js → p-CcOl6jEv.js} +1 -1
- package/components/{p-Ctop2IWW.js → p-CeGQfrDU.js} +1 -1
- package/components/{p-cEN43Ahr.js → p-CkffScdn.js} +1 -1
- package/components/{p-BT9-hMMz.js → p-CpcdCRug.js} +1 -1
- package/components/{p-Hp8t4RMX.js → p-Csi6iX-c.js} +1 -1
- package/components/{p-1sJ0ZDPe.js → p-CthoZqG1.js} +1 -1
- package/components/{p-Fl7ZFU74.js → p-DBGxvxkE.js} +1 -1
- package/components/p-DEvF_E6y.js +4 -0
- package/components/{p-COO0eJOA.js → p-DKX1mWld.js} +1 -1
- package/components/{p-CqbGBmqb.js → p-DMT-4tHM.js} +1 -1
- package/components/p-DOwsU7Mc.js +4 -0
- package/components/{p-5ldEpNdG.js → p-DSuBagxs.js} +1 -1
- package/{dist/ionic/p-DZ6Hmc-8.js → components/p-DVHC9GYb.js} +1 -1
- package/components/p-DWe-YApm.js +4 -0
- package/components/{p-Bi-it1EH.js → p-DX_3N4fh.js} +1 -1
- package/components/{p-C-NbvXu4.js → p-DcrAT6v8.js} +1 -1
- package/components/p-DftucGJR.js +4 -0
- package/components/{p-qAXsfUff.js → p-HO1CDBeU.js} +1 -1
- package/components/{p-DM1gJSMP.js → p-MLplUp3U.js} +1 -1
- package/{dist/ionic/p-BMiZX1LT.js → components/p-MOwrp7hX.js} +1 -1
- package/components/{p-D5w_FlVa.js → p-MSr4IlyS.js} +1 -1
- package/components/{p-GGbIHyEF.js → p-PWHvigWP.js} +1 -1
- package/components/p-S-gGoI4A.js +4 -0
- package/components/{p-BYJRZKHa.js → p-gyjG_IM4.js} +1 -1
- package/components/p-k92zpBT6.js +4 -0
- package/components/{p-DxhHlJln.js → p-rDUBp56G.js} +1 -1
- package/css/core.css +1 -1
- package/css/core.css.map +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/dist/cjs/{animation-Kd1N7WTN.js → animation-2DHlng-f.js} +3 -3
- package/dist/cjs/{app-globals-b1G4t26O.js → app-globals-BeC95igM.js} +1 -1
- package/dist/cjs/{button-active-CQCFubJJ.js → button-active-CTyeZB16.js} +2 -2
- package/dist/cjs/{capacitor-DmA66EwP.js → capacitor-cADDPMtd.js} +3 -3
- package/dist/cjs/{format-bHU8N1g5.js → format-BbkxKT7p.js} +1 -1
- package/dist/cjs/{framework-delegate-d-fWfeI6.js → framework-delegate-DYIuFqQx.js} +1 -1
- package/dist/cjs/{haptic-Ch-X4gRx.js → haptic-CqPss9_L.js} +1 -1
- package/dist/cjs/{helpers-7wzdhdeg.js → helpers-DHjAEaU9.js} +45 -1
- package/dist/cjs/{index-C74Q3t6a.js → index-B-R-H1Z2.js} +7 -8
- package/dist/cjs/{index-DtvKGwdh.js → index-BLq7TkUV.js} +2 -2
- package/dist/cjs/{index-CQfEIyLK.js → index-D_D542p0.js} +4 -4
- package/dist/cjs/{index-DFNrCX7M.js → index-Da83wbmS.js} +8 -9
- package/dist/cjs/{index-KiSZqhYS.js → index-MdIUU940.js} +1 -1
- package/dist/cjs/{index-DXoo08JC.js → index-T36W_eKv.js} +13 -8
- package/dist/cjs/index.cjs.js +17 -19
- package/dist/cjs/{input-shims-VJIiKBKv.js → input-shims-DYxL0Fdm.js} +16 -17
- package/dist/cjs/{input.utils-EHVE2RK_.js → input.utils-B_32Xwga.js} +1 -1
- package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +26 -28
- package/dist/cjs/ion-alert.cjs.entry.js +27 -29
- package/dist/cjs/ion-app_8.cjs.entry.js +72 -24
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
- package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
- package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
- package/dist/cjs/ion-chip.cjs.entry.js +2 -2
- package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
- package/dist/cjs/ion-datetime.cjs.entry.js +7 -9
- package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
- package/dist/cjs/ion-img.cjs.entry.js +3 -3
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
- package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
- package/dist/cjs/ion-input.cjs.entry.js +5 -6
- package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
- package/dist/cjs/ion-loading.cjs.entry.js +18 -20
- package/dist/cjs/ion-menu_3.cjs.entry.js +15 -17
- package/dist/cjs/ion-modal.cjs.entry.js +177 -172
- package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
- package/dist/cjs/ion-picker-column.cjs.entry.js +8 -9
- package/dist/cjs/ion-picker.cjs.entry.js +2 -2
- package/dist/cjs/ion-popover.cjs.entry.js +18 -20
- package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
- package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-range.cjs.entry.js +4 -4
- package/dist/cjs/ion-refresher_2.cjs.entry.js +8 -9
- package/dist/cjs/ion-reorder_2.cjs.entry.js +6 -7
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
- package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
- package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
- package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-select-modal.cjs.entry.js +8 -10
- package/dist/cjs/ion-select_3.cjs.entry.js +13 -15
- package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +6 -7
- package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +5 -6
- package/dist/cjs/ion-toast.cjs.entry.js +49 -51
- package/dist/cjs/ion-toggle.cjs.entry.js +6 -7
- package/dist/cjs/{ionic-global-CYJNT-2P.js → ionic-global-BWd7usAF.js} +1 -1
- package/dist/cjs/ionic.cjs.js +5 -5
- package/dist/cjs/{ios.transition-DYGiD6gM.js → ios.transition-6AFNO6uU.js} +4 -5
- package/dist/cjs/{item-multiple-inputs-Dv6qrMhm.js → item-multiple-inputs-BaBx_Te8.js} +1 -1
- package/dist/cjs/{keyboard-Cix5TVkD.js → keyboard-BJEm-3HF.js} +5 -3
- package/dist/cjs/{keyboard-cHxZlTyz.js → keyboard-DstMw6u1.js} +1 -1
- package/dist/cjs/{keyboard-controller-PtZoN2GS.js → keyboard-controller-DaUNT15d.js} +9 -9
- package/dist/cjs/loader.cjs.js +4 -4
- package/dist/cjs/{md.transition-CrSkaoz6.js → md.transition-CPq0ckrU.js} +4 -5
- package/dist/cjs/{overlays-BR21NUIG.js → overlays-DwMDYc_O.js} +162 -9
- package/dist/cjs/{select-option-render-D8ZEjYji.js → select-option-render-Cu-ABBRH.js} +2 -2
- package/dist/cjs/{slot-mutation-controller-yNStVQqX.js → slot-mutation-controller-CtYZdaWI.js} +4 -5
- package/dist/cjs/{status-tap-CNP5eD1R.js → status-tap-BUfv_eD4.js} +3 -3
- package/dist/cjs/{swipe-back-BYb_nLJe.js → swipe-back-DYKxJU5r.js} +2 -2
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/content/content.js +62 -8
- package/dist/collection/components/modal/modal.ios.css +12 -1
- package/dist/collection/components/modal/modal.js +31 -8
- package/dist/collection/components/modal/modal.md.css +12 -1
- package/dist/collection/components/modal/safe-area-utils.js +69 -90
- package/dist/collection/components/modal/utils.js +7 -0
- package/dist/collection/utils/helpers.js +39 -0
- package/dist/collection/utils/overlays.js +34 -0
- package/dist/docs.json +2 -2
- package/dist/esm/{animation-BFNVlYum.js → animation-CAzXJ2I1.js} +2 -2
- package/dist/esm/{app-globals-BgX0BGL1.js → app-globals-DGJXnnkm.js} +1 -1
- package/dist/esm/{button-active-BfOvDr3b.js → button-active-DyyWVqU3.js} +2 -2
- package/dist/esm/{capacitor-CFERIeaU.js → capacitor-C041I3qZ.js} +1 -1
- package/dist/esm/{format-DDFE9jM5.js → format-D78cdY12.js} +1 -1
- package/dist/esm/{framework-delegate-BwNhx9NR.js → framework-delegate-CUDbUfWS.js} +1 -1
- package/dist/esm/{haptic-Cq4UAeka.js → haptic-D3njgGLB.js} +1 -1
- package/dist/esm/{helpers-BSmc0nst.js → helpers-BJFnZngp.js} +43 -2
- package/dist/esm/{index-DnA_7Bnx.js → index-CdoVp_rZ.js} +4 -4
- package/dist/esm/{index-D76bbuoi.js → index-DmnOg_xm.js} +1 -1
- package/dist/esm/{index-CJln0gS3.js → index-DoY4e_3F.js} +2 -3
- package/dist/esm/{index-C23AVPx9.js → index-Dvqtt_WK.js} +13 -8
- package/dist/esm/{index-BuPaALjU.js → index-iurdcGHg.js} +5 -6
- package/dist/esm/{index-C1b9CLFg.js → index-obGyiHiO.js} +2 -2
- package/dist/esm/index.js +11 -13
- package/dist/esm/{input-shims-Dqk-Ou25.js → input-shims-DognYvwv.js} +5 -6
- package/dist/esm/{input.utils-rqoH22pW.js → input.utils-C3mVJhji.js} +1 -1
- package/dist/esm/ion-accordion_2.entry.js +3 -3
- package/dist/esm/ion-action-sheet.entry.js +11 -13
- package/dist/esm/ion-alert.entry.js +11 -13
- package/dist/esm/ion-app_8.entry.js +72 -24
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-back-button.entry.js +3 -3
- package/dist/esm/ion-backdrop.entry.js +2 -2
- package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
- package/dist/esm/ion-button_2.entry.js +3 -3
- package/dist/esm/ion-card_5.entry.js +3 -3
- package/dist/esm/ion-checkbox.entry.js +4 -4
- package/dist/esm/ion-chip.entry.js +2 -2
- package/dist/esm/ion-col_3.entry.js +2 -2
- package/dist/esm/ion-datetime-button.entry.js +4 -4
- package/dist/esm/ion-datetime.entry.js +6 -8
- package/dist/esm/ion-fab_3.entry.js +3 -3
- package/dist/esm/ion-img.entry.js +3 -3
- package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
- package/dist/esm/ion-input-otp.entry.js +3 -3
- package/dist/esm/ion-input-password-toggle.entry.js +2 -2
- package/dist/esm/ion-input.entry.js +5 -6
- package/dist/esm/ion-item-option_3.entry.js +4 -4
- package/dist/esm/ion-item_8.entry.js +3 -3
- package/dist/esm/ion-loading.entry.js +7 -9
- package/dist/esm/ion-menu_3.entry.js +7 -9
- package/dist/esm/ion-modal.entry.js +115 -110
- package/dist/esm/ion-nav_2.entry.js +6 -6
- package/dist/esm/ion-picker-column-option.entry.js +3 -3
- package/dist/esm/ion-picker-column.entry.js +5 -6
- package/dist/esm/ion-picker.entry.js +2 -2
- package/dist/esm/ion-popover.entry.js +7 -9
- package/dist/esm/ion-progress-bar.entry.js +3 -3
- package/dist/esm/ion-radio_2.entry.js +4 -4
- package/dist/esm/ion-range.entry.js +4 -4
- package/dist/esm/ion-refresher_2.entry.js +8 -9
- package/dist/esm/ion-reorder_2.entry.js +6 -7
- package/dist/esm/ion-ripple-effect.entry.js +2 -2
- package/dist/esm/ion-route_4.entry.js +4 -4
- package/dist/esm/ion-searchbar.entry.js +3 -3
- package/dist/esm/ion-segment-content.entry.js +1 -1
- package/dist/esm/ion-segment-view.entry.js +1 -1
- package/dist/esm/ion-segment_2.entry.js +3 -3
- package/dist/esm/ion-select-modal.entry.js +7 -9
- package/dist/esm/ion-select_3.entry.js +8 -10
- package/dist/esm/ion-spinner.entry.js +2 -2
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +6 -7
- package/dist/esm/ion-tab_2.entry.js +3 -3
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +5 -6
- package/dist/esm/ion-toast.entry.js +7 -9
- package/dist/esm/ion-toggle.entry.js +6 -7
- package/dist/esm/{ionic-global-ZXjCXKH0.js → ionic-global-BSaFA7np.js} +1 -1
- package/dist/esm/ionic.js +6 -6
- package/dist/esm/{ios.transition-CWAgfQ1r.js → ios.transition-ofa92pAl.js} +4 -5
- package/dist/esm/{item-multiple-inputs-DZnIiOO_.js → item-multiple-inputs-CffmpUe9.js} +1 -1
- package/dist/esm/{keyboard-DAF8GNJ9.js → keyboard-Cz4hUjuj.js} +1 -1
- package/dist/esm/{keyboard-Cj8mLJeq.js → keyboard-Dsc85bts.js} +5 -3
- package/dist/esm/{keyboard-controller-DEwoa1ev.js → keyboard-controller-BLvRgxgP.js} +2 -2
- package/dist/esm/loader.js +5 -5
- package/dist/esm/{md.transition-ZuqDDdDW.js → md.transition-DnFfqsAv.js} +4 -5
- package/dist/esm/{overlays-DKE0DgvE.js → overlays-a_5AhqWk.js} +156 -7
- package/dist/esm/{select-option-render-CRP_teb1.js → select-option-render-C_PCwA67.js} +2 -2
- package/dist/esm/{slot-mutation-controller-BVnANfIt.js → slot-mutation-controller-D7n8Peo2.js} +1 -2
- package/dist/esm/{status-tap-Cv9gb3ja.js → status-tap-BsTKKfug.js} +3 -3
- package/dist/esm/{swipe-back-B2CmabKY.js → swipe-back-ibFGqXH2.js} +2 -2
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-063769cf.entry.js +4 -0
- package/dist/ionic/{p-d8c138d9.entry.js → p-097a0cf5.entry.js} +1 -1
- package/dist/ionic/{p-ec00fd0d.entry.js → p-0a14a6a3.entry.js} +1 -1
- package/dist/ionic/p-0a824cef.entry.js +4 -0
- package/dist/ionic/{p-9c5f2691.entry.js → p-12ea6d13.entry.js} +1 -1
- package/dist/ionic/p-1c4926e9.entry.js +4 -0
- package/dist/ionic/p-1dac4211.entry.js +4 -0
- package/dist/ionic/{p-a8ff2489.entry.js → p-23afeeb2.entry.js} +1 -1
- package/dist/ionic/{p-ca1b8865.entry.js → p-25abc69d.entry.js} +1 -1
- package/dist/ionic/{p-099b7f9f.entry.js → p-26d89234.entry.js} +1 -1
- package/dist/ionic/{p-8b80d9f9.entry.js → p-28952272.entry.js} +1 -1
- package/dist/ionic/{p-5cc09b40.entry.js → p-29687c0b.entry.js} +1 -1
- package/dist/ionic/p-2ecebfd9.entry.js +4 -0
- package/dist/ionic/p-302e4d74.entry.js +4 -0
- package/dist/ionic/p-38d3e1cb.entry.js +4 -0
- package/dist/ionic/p-41254776.entry.js +4 -0
- package/dist/ionic/{p-6e386853.entry.js → p-416bec74.entry.js} +1 -1
- package/dist/ionic/{p-354d38d3.entry.js → p-41ae57ea.entry.js} +1 -1
- package/dist/ionic/{p-7bfeccb3.entry.js → p-4dc3f2b3.entry.js} +1 -1
- package/dist/ionic/{p-efc0cf82.entry.js → p-5272e103.entry.js} +1 -1
- package/dist/ionic/{p-68cc89a6.entry.js → p-59305088.entry.js} +1 -1
- package/dist/ionic/p-5b9b245e.entry.js +4 -0
- package/dist/ionic/{p-561af487.entry.js → p-5eadc64e.entry.js} +1 -1
- package/dist/ionic/p-5f695204.entry.js +4 -0
- package/dist/ionic/{p-38b9375b.entry.js → p-60ca717e.entry.js} +1 -1
- package/dist/ionic/{p-4c3e50f8.entry.js → p-63eb4550.entry.js} +1 -1
- package/dist/ionic/{p-90f50a65.entry.js → p-689f7a37.entry.js} +1 -1
- package/dist/ionic/{p-54cbb0a7.entry.js → p-7da532af.entry.js} +1 -1
- package/dist/ionic/{p-271c3640.entry.js → p-84dea138.entry.js} +1 -1
- package/dist/ionic/{p-4712a8a9.entry.js → p-88cf4127.entry.js} +1 -1
- package/dist/ionic/{p-3bba83ee.entry.js → p-89e04e63.entry.js} +1 -1
- package/dist/ionic/{p-dd01be0a.entry.js → p-8af458bf.entry.js} +1 -1
- package/dist/ionic/p-8d68604a.entry.js +4 -0
- package/dist/ionic/p-B13Uv-FT.js +4 -0
- package/dist/ionic/p-B8K6OHqa.js +4 -0
- package/dist/ionic/p-BD0v0Sx_.js +4 -0
- package/dist/ionic/p-BDs20Dfe.js +4 -0
- package/dist/ionic/p-BIj0Lfim.js +4 -0
- package/dist/ionic/p-BRZstBYy.js +4 -0
- package/dist/ionic/{p-T71k3C35.js → p-BRlwrQ6h.js} +1 -1
- package/dist/ionic/{p-DYUjHcuH.js → p-BT0-h-eD.js} +1 -1
- package/dist/ionic/p-Ba_yQZdQ.js +4 -0
- package/dist/ionic/p-BnMJqJBa.js +4 -0
- package/{components/p-6ZLn6K5e.js → dist/ionic/p-BrbwGxm1.js} +1 -1
- package/dist/ionic/p-Bu6uWqQM.js +4 -0
- package/dist/ionic/p-Bx46Dlpo.js +4 -0
- package/dist/ionic/p-C0vJzNM9.js +4 -0
- package/dist/ionic/p-C4FdGOym.js +4 -0
- package/dist/ionic/p-C5SsTfux.js +4 -0
- package/dist/ionic/p-CD77BF32.js +4 -0
- package/dist/ionic/p-CESQIy-V.js +4 -0
- package/dist/ionic/{p-BaeKWZ-a.js → p-CazJOH5P.js} +1 -1
- package/dist/ionic/p-D14knedj.js +4 -0
- package/dist/ionic/p-DQcKi6P6.js +4 -0
- package/dist/ionic/p-DlvB1Idh.js +4 -0
- package/dist/ionic/{p-C23AVPx9.js → p-Dvqtt_WK.js} +1 -1
- package/dist/ionic/{p-CJv-wOAd.js → p-NL1pxcde.js} +1 -1
- package/dist/ionic/{p-191a651e.entry.js → p-a1d733a3.entry.js} +1 -1
- package/dist/ionic/p-a4a2ce90.entry.js +4 -0
- package/dist/ionic/p-a6a95175.entry.js +4 -0
- package/dist/ionic/p-ac6a1168.entry.js +4 -0
- package/dist/ionic/{p-cc4320d3.entry.js → p-bcf18c26.entry.js} +1 -1
- package/dist/ionic/p-be8ae1cc.entry.js +4 -0
- package/dist/ionic/{p-85599fe3.entry.js → p-c0dd14f4.entry.js} +1 -1
- package/dist/ionic/{p-f0fb23c1.entry.js → p-c9952851.entry.js} +1 -1
- package/dist/ionic/p-cb893f35.entry.js +4 -0
- package/dist/ionic/p-d7fb1d2a.entry.js +4 -0
- package/dist/ionic/{p-ee09ac9d.entry.js → p-d8a6ebfd.entry.js} +1 -1
- package/dist/ionic/{p-7fbb3319.entry.js → p-dd89474c.entry.js} +1 -1
- package/dist/ionic/{p-fe9ed9bd.entry.js → p-df272a41.entry.js} +1 -1
- package/dist/ionic/{p-b9b4e85d.entry.js → p-e04a7110.entry.js} +1 -1
- package/dist/ionic/{p-D7jHfs0Y.js → p-e0g1fYYm.js} +1 -1
- package/dist/ionic/{p-a8df96c8.entry.js → p-e3a98575.entry.js} +1 -1
- package/dist/ionic/{p-d6755739.entry.js → p-efa78f73.entry.js} +1 -1
- package/dist/ionic/{p-1f24cb24.entry.js → p-f97ef975.entry.js} +1 -1
- package/dist/ionic/p-fc3312a4.entry.js +4 -0
- package/dist/ionic/{p-5d9094ac.entry.js → p-fd220f9c.entry.js} +1 -1
- package/dist/ionic/p-g9SK-dv1.js +4 -0
- package/dist/ionic/p-yYEBg4iw.js +4 -0
- package/dist/ionic/{p-BMPN55of.js → p-yiP8rgDC.js} +1 -1
- package/dist/types/components/content/content.d.ts +28 -3
- package/dist/types/components/modal/modal.d.ts +9 -1
- package/dist/types/components/modal/safe-area-utils.d.ts +28 -14
- package/dist/types/components/modal/utils.d.ts +4 -0
- package/dist/types/components.d.ts +1 -1
- package/dist/types/stencil-public-runtime.d.ts +61 -55
- package/dist/types/utils/helpers.d.ts +17 -0
- package/dist/types/utils/overlays.d.ts +15 -0
- package/hydrate/index.js +315 -136
- package/hydrate/index.mjs +315 -136
- package/package.json +1 -1
- package/components/p-BNIsryb2.js +0 -4
- package/components/p-BU8a2IhR.js +0 -4
- package/components/p-BWoa-cki.js +0 -4
- package/components/p-BgkOsq-d.js +0 -4
- package/components/p-C09TXohi.js +0 -4
- package/components/p-CG_zZq_I.js +0 -4
- package/components/p-CWAks_S_.js +0 -4
- package/components/p-CWuIRJQN.js +0 -4
- package/components/p-CobW5muY.js +0 -4
- package/components/p-CrAKlX71.js +0 -4
- package/components/p-DhNuxvJH.js +0 -4
- package/components/p-DiuOa1vw.js +0 -4
- package/components/p-M34T2gyX.js +0 -4
- package/dist/cjs/hardware-back-button-Bu4Dzw8l.js +0 -121
- package/dist/cjs/index-DkNv4J_i.js +0 -10
- package/dist/esm/hardware-back-button-DmkiRgOT.js +0 -115
- package/dist/esm/index-ZjP4CjeZ.js +0 -7
- package/dist/ionic/p-171a2278.entry.js +0 -4
- package/dist/ionic/p-1e64f5c7.entry.js +0 -4
- package/dist/ionic/p-2ea4bb36.entry.js +0 -4
- package/dist/ionic/p-338a02e0.entry.js +0 -4
- package/dist/ionic/p-3e01c744.entry.js +0 -4
- package/dist/ionic/p-458715a9.entry.js +0 -4
- package/dist/ionic/p-5906ea6f.entry.js +0 -4
- package/dist/ionic/p-612ea3b1.entry.js +0 -4
- package/dist/ionic/p-723f4dcd.entry.js +0 -4
- package/dist/ionic/p-77c96e08.entry.js +0 -4
- package/dist/ionic/p-803059b6.entry.js +0 -4
- package/dist/ionic/p-9595e305.entry.js +0 -4
- package/dist/ionic/p-BY6BzzPF.js +0 -4
- package/dist/ionic/p-Bd72UYI2.js +0 -4
- package/dist/ionic/p-BgOvhHy_.js +0 -4
- package/dist/ionic/p-BhamHSw3.js +0 -4
- package/dist/ionic/p-BijjLYjT.js +0 -4
- package/dist/ionic/p-C8XilMh0.js +0 -4
- package/dist/ionic/p-CER8qW8Y.js +0 -4
- package/dist/ionic/p-CFuOr1Tu.js +0 -4
- package/dist/ionic/p-CIGNaXM1.js +0 -4
- package/dist/ionic/p-CMZYmFb4.js +0 -4
- package/dist/ionic/p-CmXuiRT6.js +0 -4
- package/dist/ionic/p-D5t_-oMk.js +0 -4
- package/dist/ionic/p-D6rHcCvc.js +0 -4
- package/dist/ionic/p-DLM95R4x.js +0 -4
- package/dist/ionic/p-D_gb-kdd.js +0 -4
- package/dist/ionic/p-DajLgJ4d.js +0 -4
- package/dist/ionic/p-Do3zTvCA.js +0 -4
- package/dist/ionic/p-ZjP4CjeZ.js +0 -4
- package/dist/ionic/p-aff52029.entry.js +0 -4
- package/dist/ionic/p-b3532b8d.entry.js +0 -4
- package/dist/ionic/p-d526798a.entry.js +0 -4
- package/dist/ionic/p-e7f4b1e0.entry.js +0 -4
- package/dist/ionic/p-ed725cdf.entry.js +0 -4
- package/dist/ionic/p-fa50d493.entry.js +0 -4
- package/dist/ionic/p-zWf7R2xV.js +0 -4
|
@@ -3,25 +3,23 @@
|
|
|
3
3
|
*/
|
|
4
4
|
'use strict';
|
|
5
5
|
|
|
6
|
-
var index$
|
|
7
|
-
var index
|
|
8
|
-
var frameworkDelegate = require('./framework-delegate-
|
|
9
|
-
var helpers = require('./helpers-
|
|
6
|
+
var index$2 = require('./index-T36W_eKv.js');
|
|
7
|
+
var index = require('./index-BLq7TkUV.js');
|
|
8
|
+
var frameworkDelegate = require('./framework-delegate-DYIuFqQx.js');
|
|
9
|
+
var helpers = require('./helpers-DHjAEaU9.js');
|
|
10
10
|
var lockController = require('./lock-controller-aDB9wrEf.js');
|
|
11
|
-
var capacitor = require('./capacitor-
|
|
12
|
-
var
|
|
11
|
+
var capacitor = require('./capacitor-cADDPMtd.js');
|
|
12
|
+
var hardwareBackButton = require('./overlays-DwMDYc_O.js');
|
|
13
13
|
var theme = require('./theme-Bw0rpaNN.js');
|
|
14
|
-
var index$
|
|
15
|
-
var ionicGlobal = require('./ionic-global-
|
|
16
|
-
var keyboard = require('./keyboard-
|
|
17
|
-
var animation = require('./animation-
|
|
14
|
+
var index$3 = require('./index-D_D542p0.js');
|
|
15
|
+
var ionicGlobal = require('./ionic-global-BWd7usAF.js');
|
|
16
|
+
var keyboard = require('./keyboard-BJEm-3HF.js');
|
|
17
|
+
var animation = require('./animation-2DHlng-f.js');
|
|
18
18
|
var cubicBezier = require('./cubic-bezier-DAjy1V-e.js');
|
|
19
|
-
var index$
|
|
20
|
-
var index = require('./index-DkNv4J_i.js');
|
|
19
|
+
var index$1 = require('./index-DRPqwSvU.js');
|
|
21
20
|
require('./dir-zwDPRE5K.js');
|
|
22
|
-
require('./hardware-back-button-Bu4Dzw8l.js');
|
|
23
21
|
require('./gesture-controller-CeJslptU.js');
|
|
24
|
-
require('./keyboard-
|
|
22
|
+
require('./keyboard-DstMw6u1.js');
|
|
25
23
|
|
|
26
24
|
var Style;
|
|
27
25
|
(function (Style) {
|
|
@@ -118,17 +116,23 @@ const getBackdropValueForSheet = (x, backdropBreakpoint) => {
|
|
|
118
116
|
*
|
|
119
117
|
*/
|
|
120
118
|
const setCardStatusBarDark = () => {
|
|
121
|
-
if (!
|
|
119
|
+
if (!helpers.win || helpers.win.innerWidth >= 768) {
|
|
122
120
|
return;
|
|
123
121
|
}
|
|
124
122
|
StatusBar.setStyle({ style: Style.Dark });
|
|
125
123
|
};
|
|
126
124
|
const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
|
|
127
|
-
if (!
|
|
125
|
+
if (!helpers.win || helpers.win.innerWidth >= 768) {
|
|
128
126
|
return;
|
|
129
127
|
}
|
|
130
128
|
StatusBar.setStyle({ style: defaultStyle });
|
|
131
129
|
};
|
|
130
|
+
/**
|
|
131
|
+
* Calls back when the modal's resolved `--height` changes.
|
|
132
|
+
*/
|
|
133
|
+
const onModalHeightChange = (hostEl, callback) => {
|
|
134
|
+
return helpers.onCustomPropertyChange(hostEl, '--height', () => callback());
|
|
135
|
+
};
|
|
132
136
|
|
|
133
137
|
/**
|
|
134
138
|
* Swiping is only possible when the content is scrolled to the top, so that we
|
|
@@ -141,8 +145,8 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
|
|
|
141
145
|
* synchronous operation, and `getScrollElement` is asynchronous.
|
|
142
146
|
*/
|
|
143
147
|
const canSwipeOnContent = (contentEl) => {
|
|
144
|
-
const scrollEl = index
|
|
145
|
-
const hasRefresherInContent = !!index
|
|
148
|
+
const scrollEl = index.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
|
|
149
|
+
const hasRefresherInContent = !!index.findRefresherInContent(contentEl);
|
|
146
150
|
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
147
151
|
};
|
|
148
152
|
const handleCanDismiss = async (el, animation) => {
|
|
@@ -162,7 +166,7 @@ const handleCanDismiss = async (el, animation) => {
|
|
|
162
166
|
* If the function returns `true`,
|
|
163
167
|
* then we can proceed with dismiss.
|
|
164
168
|
*/
|
|
165
|
-
const shouldDismiss = await el.canDismiss(undefined,
|
|
169
|
+
const shouldDismiss = await el.canDismiss(undefined, hardwareBackButton.GESTURE);
|
|
166
170
|
if (!shouldDismiss) {
|
|
167
171
|
return;
|
|
168
172
|
}
|
|
@@ -279,7 +283,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
279
283
|
let initialScrollY = true;
|
|
280
284
|
let lastStep = 0;
|
|
281
285
|
const getScrollY = () => {
|
|
282
|
-
if (contentEl && index
|
|
286
|
+
if (contentEl && index.isIonContent(contentEl)) {
|
|
283
287
|
return contentEl.scrollY;
|
|
284
288
|
/**
|
|
285
289
|
* Custom scroll containers are intended to be
|
|
@@ -305,7 +309,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
305
309
|
* swipe again. The target content will not
|
|
306
310
|
* be the same between swipes.
|
|
307
311
|
*/
|
|
308
|
-
contentEl = index
|
|
312
|
+
contentEl = index.findClosestIonContent(target);
|
|
309
313
|
if (contentEl) {
|
|
310
314
|
return canSwipeOnContent(contentEl);
|
|
311
315
|
}
|
|
@@ -349,7 +353,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
349
353
|
* happen at the same time as the gesture.
|
|
350
354
|
*/
|
|
351
355
|
if (deltaY > 0 && contentEl) {
|
|
352
|
-
index
|
|
356
|
+
index.disableContentScrollY(contentEl);
|
|
353
357
|
}
|
|
354
358
|
animation.progressStart(true, isOpen ? 1 : 0);
|
|
355
359
|
onDragStart();
|
|
@@ -363,7 +367,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
363
367
|
* happen at the same time as the gesture.
|
|
364
368
|
*/
|
|
365
369
|
if (deltaY > 0 && contentEl) {
|
|
366
|
-
index
|
|
370
|
+
index.disableContentScrollY(contentEl);
|
|
367
371
|
}
|
|
368
372
|
/**
|
|
369
373
|
* If we are swiping on the content
|
|
@@ -458,7 +462,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
458
462
|
isOpen = shouldComplete;
|
|
459
463
|
gesture.enable(false);
|
|
460
464
|
if (contentEl) {
|
|
461
|
-
index
|
|
465
|
+
index.resetContentScrollY(contentEl, initialScrollY);
|
|
462
466
|
}
|
|
463
467
|
animation
|
|
464
468
|
.onFinish(() => {
|
|
@@ -506,10 +510,10 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
506
510
|
};
|
|
507
511
|
onDragEnd(eventDetail);
|
|
508
512
|
};
|
|
509
|
-
const gesture = index$
|
|
513
|
+
const gesture = index$1.createGesture({
|
|
510
514
|
el,
|
|
511
515
|
gestureName: 'modalSwipeToClose',
|
|
512
|
-
gesturePriority:
|
|
516
|
+
gesturePriority: hardwareBackButton.OVERLAY_GESTURE_PRIORITY,
|
|
513
517
|
direction: 'y',
|
|
514
518
|
threshold: 10,
|
|
515
519
|
canStart,
|
|
@@ -1061,7 +1065,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1061
1065
|
* as inputs should not be focusable outside
|
|
1062
1066
|
* the sheet.
|
|
1063
1067
|
*/
|
|
1064
|
-
baseEl.classList.remove(
|
|
1068
|
+
baseEl.classList.remove(hardwareBackButton.FOCUS_TRAP_DISABLE_CLASS);
|
|
1065
1069
|
};
|
|
1066
1070
|
const disableBackdrop = () => {
|
|
1067
1071
|
baseEl.style.setProperty('pointer-events', 'none');
|
|
@@ -1073,7 +1077,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1073
1077
|
* Adding this class disables focus trapping
|
|
1074
1078
|
* for the sheet temporarily.
|
|
1075
1079
|
*/
|
|
1076
|
-
baseEl.classList.add(
|
|
1080
|
+
baseEl.classList.add(hardwareBackButton.FOCUS_TRAP_DISABLE_CLASS);
|
|
1077
1081
|
};
|
|
1078
1082
|
/**
|
|
1079
1083
|
* Toggles the footer to an absolute position while moving to prevent
|
|
@@ -1197,7 +1201,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1197
1201
|
* For example, when using ion-nav within a modal it is possible to swipe, push a view,
|
|
1198
1202
|
* and then swipe again. The target content will not be the same between swipes.
|
|
1199
1203
|
*/
|
|
1200
|
-
const contentEl = index
|
|
1204
|
+
const contentEl = index.findClosestIonContent(detail.event.target);
|
|
1201
1205
|
currentBreakpoint = getCurrentBreakpoint();
|
|
1202
1206
|
/**
|
|
1203
1207
|
* Upwards swipes on the content cannot move the sheet anyway, so this only
|
|
@@ -1234,9 +1238,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1234
1238
|
* which would impact performance significantly.
|
|
1235
1239
|
*/
|
|
1236
1240
|
if (!expandToScroll) {
|
|
1237
|
-
const targetEl = index
|
|
1241
|
+
const targetEl = index.findClosestIonContent(detail.event.target);
|
|
1238
1242
|
cachedScrollEl =
|
|
1239
|
-
targetEl && index
|
|
1243
|
+
targetEl && index.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
|
|
1240
1244
|
}
|
|
1241
1245
|
/**
|
|
1242
1246
|
* If expandToScroll is disabled, we need to swap
|
|
@@ -1628,7 +1632,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1628
1632
|
*/
|
|
1629
1633
|
return viewportBottom - activeHeight;
|
|
1630
1634
|
};
|
|
1631
|
-
const gesture = index$
|
|
1635
|
+
const gesture = index$1.createGesture({
|
|
1632
1636
|
el: wrapperEl,
|
|
1633
1637
|
gestureName: 'modalSheet',
|
|
1634
1638
|
gesturePriority: 40,
|
|
@@ -1656,40 +1660,12 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1656
1660
|
};
|
|
1657
1661
|
};
|
|
1658
1662
|
|
|
1659
|
-
/**
|
|
1660
|
-
* These thresholds match the SCSS media query breakpoints in modal.vars.scss
|
|
1661
|
-
* that trigger the centered dialog layout (non-fullscreen modal).
|
|
1662
|
-
*
|
|
1663
|
-
* SCSS defines two height breakpoints: $modal-inset-min-height-small (600px)
|
|
1664
|
-
* and $modal-inset-min-height-large (768px). We use the smaller one because
|
|
1665
|
-
* that's the threshold where the modal transitions from fullscreen to centered
|
|
1666
|
-
* dialog — the larger breakpoint only increases the dialog's height.
|
|
1667
|
-
*/
|
|
1668
|
-
const MODAL_INSET_MIN_WIDTH = 768;
|
|
1669
|
-
const MODAL_INSET_MIN_HEIGHT = 600;
|
|
1670
1663
|
const EDGE_THRESHOLD = 5;
|
|
1671
|
-
/**
|
|
1672
|
-
* CSS values for `--width` / `--height` that are treated as fullscreen
|
|
1673
|
-
* (modal touches the corresponding screen edges). Empty string means the
|
|
1674
|
-
* property was not overridden. See `hasCustomModalDimensions()`.
|
|
1675
|
-
*/
|
|
1676
|
-
const FULLSCREEN_SIZE_VALUES = new Set(['', '100%', '100vw', '100vh', '100dvw', '100dvh', '100svw', '100svh']);
|
|
1677
1664
|
/**
|
|
1678
1665
|
* Cache for resolved root safe-area-top value, invalidated once per frame.
|
|
1679
1666
|
*/
|
|
1680
1667
|
let cachedRootSafeAreaTop = null;
|
|
1681
1668
|
let cacheInvalidationScheduled = false;
|
|
1682
|
-
/**
|
|
1683
|
-
* Determines if the current viewport meets the CSS media query conditions
|
|
1684
|
-
* that cause regular modals to render as centered dialogs instead of fullscreen.
|
|
1685
|
-
* Matches: @media (min-width: 768px) and (min-height: 600px)
|
|
1686
|
-
*/
|
|
1687
|
-
const isCenteredDialogViewport = () => {
|
|
1688
|
-
if (!index.win)
|
|
1689
|
-
return false;
|
|
1690
|
-
return index.win.matchMedia(`(min-width: ${MODAL_INSET_MIN_WIDTH}px) and (min-height: ${MODAL_INSET_MIN_HEIGHT}px)`)
|
|
1691
|
-
.matches;
|
|
1692
|
-
};
|
|
1693
1669
|
/**
|
|
1694
1670
|
* Resolves the current root --ion-safe-area-top value to pixels.
|
|
1695
1671
|
* Uses a temporary element because getComputedStyle on :root returns
|
|
@@ -1702,7 +1678,7 @@ const getRootSafeAreaTop = () => {
|
|
|
1702
1678
|
if (cachedRootSafeAreaTop !== null) {
|
|
1703
1679
|
return cachedRootSafeAreaTop;
|
|
1704
1680
|
}
|
|
1705
|
-
const doc =
|
|
1681
|
+
const doc = helpers.win?.document;
|
|
1706
1682
|
if (!doc?.body) {
|
|
1707
1683
|
return 0;
|
|
1708
1684
|
}
|
|
@@ -1723,55 +1699,64 @@ const getRootSafeAreaTop = () => {
|
|
|
1723
1699
|
return value;
|
|
1724
1700
|
};
|
|
1725
1701
|
/**
|
|
1726
|
-
* Calls back when the resolved root `--ion-safe-area-top` changes
|
|
1727
|
-
*
|
|
1728
|
-
*
|
|
1702
|
+
* Calls back when the resolved root `--ion-safe-area-top` changes. The value
|
|
1703
|
+
* the caller already applied is passed as the baseline, so a change between
|
|
1704
|
+
* that read and the observer starting is still reported.
|
|
1729
1705
|
*/
|
|
1730
1706
|
const onRootSafeAreaTopChange = (callback) => {
|
|
1731
|
-
|
|
1732
|
-
if (!doc?.body || typeof ResizeObserver === 'undefined') {
|
|
1733
|
-
return () => undefined;
|
|
1734
|
-
}
|
|
1735
|
-
const probe = doc.createElement('div');
|
|
1736
|
-
probe.style.cssText =
|
|
1737
|
-
'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
|
|
1738
|
-
'height:var(--ion-safe-area-top,0px);';
|
|
1739
|
-
doc.body.appendChild(probe);
|
|
1740
|
-
/**
|
|
1741
|
-
* Seeded with the value the caller has already applied, so a change that
|
|
1742
|
-
* lands before the observer's first delivery still gets reported. Comparing
|
|
1743
|
-
* against an unset value instead would consume that first delivery and treat
|
|
1744
|
-
* the new inset as the baseline.
|
|
1745
|
-
*/
|
|
1746
|
-
let lastHeight = getRootSafeAreaTop();
|
|
1747
|
-
const observer = new ResizeObserver((entries) => {
|
|
1748
|
-
const { height } = entries[0].contentRect;
|
|
1749
|
-
if (height !== lastHeight) {
|
|
1750
|
-
lastHeight = height;
|
|
1751
|
-
callback(height);
|
|
1752
|
-
}
|
|
1753
|
-
});
|
|
1754
|
-
observer.observe(probe);
|
|
1755
|
-
return () => {
|
|
1756
|
-
observer.disconnect();
|
|
1757
|
-
probe.remove();
|
|
1758
|
-
};
|
|
1707
|
+
return helpers.onCustomPropertyChange(helpers.win?.document?.body, '--ion-safe-area-top', callback, getRootSafeAreaTop());
|
|
1759
1708
|
};
|
|
1760
1709
|
/**
|
|
1761
|
-
*
|
|
1762
|
-
*
|
|
1763
|
-
*
|
|
1710
|
+
* Determines which viewport axes the modal spans so safe-area requirements
|
|
1711
|
+
* can be predicted independently for each axis.
|
|
1712
|
+
*
|
|
1713
|
+
* A modal that spans an axis reaches both edges on that axis and needs the
|
|
1714
|
+
* corresponding safe-area insets. A modal that does not span an axis reaches
|
|
1715
|
+
* neither edge on that axis.
|
|
1764
1716
|
*
|
|
1765
|
-
*
|
|
1766
|
-
*
|
|
1767
|
-
*
|
|
1768
|
-
*
|
|
1717
|
+
* When both `--width` and `--height` are `fullscreen`, coverage can be
|
|
1718
|
+
* determined directly. Otherwise, coverage is based on the rendered wrapper,
|
|
1719
|
+
* including cases where content sizing or `--max-height` causes the modal
|
|
1720
|
+
* to reach the viewport.
|
|
1769
1721
|
*/
|
|
1770
|
-
const
|
|
1722
|
+
const getModalCoveredAxes = (hostEl) => {
|
|
1771
1723
|
const styles = getComputedStyle(hostEl);
|
|
1772
|
-
const width = styles.getPropertyValue('--width')
|
|
1773
|
-
const height = styles.getPropertyValue('--height')
|
|
1774
|
-
|
|
1724
|
+
const width = hardwareBackButton.getOverlaySizeType(styles.getPropertyValue('--width'));
|
|
1725
|
+
const height = hardwareBackButton.getOverlaySizeType(styles.getPropertyValue('--height'));
|
|
1726
|
+
if (width === 'fullscreen' && height === 'fullscreen') {
|
|
1727
|
+
return { vertical: true, horizontal: true };
|
|
1728
|
+
}
|
|
1729
|
+
return measureCoveredAxes(hostEl);
|
|
1730
|
+
};
|
|
1731
|
+
/**
|
|
1732
|
+
* Measures the modal wrapper to determine whether it spans the viewport
|
|
1733
|
+
* on each axis.
|
|
1734
|
+
*
|
|
1735
|
+
* The wrapper has no box while the modal is hidden, so `overlay-hidden`
|
|
1736
|
+
* is temporarily removed to allow the wrapper to be measured. The class
|
|
1737
|
+
* is restored in the same task before the browser can paint.
|
|
1738
|
+
*
|
|
1739
|
+
* Only the wrapper's size is measured. Its position is affected by the
|
|
1740
|
+
* enter animation, which initially translates it by its own height, while
|
|
1741
|
+
* the translation does not affect its measured size.
|
|
1742
|
+
*/
|
|
1743
|
+
const measureCoveredAxes = (hostEl) => {
|
|
1744
|
+
const wrapperEl = hostEl.shadowRoot?.querySelector('.modal-wrapper');
|
|
1745
|
+
if (wrapperEl == null || helpers.win === undefined) {
|
|
1746
|
+
return { vertical: false, horizontal: false };
|
|
1747
|
+
}
|
|
1748
|
+
const wasHidden = hostEl.classList.contains('overlay-hidden');
|
|
1749
|
+
if (wasHidden) {
|
|
1750
|
+
hostEl.classList.remove('overlay-hidden');
|
|
1751
|
+
}
|
|
1752
|
+
const { width, height } = wrapperEl.getBoundingClientRect();
|
|
1753
|
+
if (wasHidden) {
|
|
1754
|
+
hostEl.classList.add('overlay-hidden');
|
|
1755
|
+
}
|
|
1756
|
+
return {
|
|
1757
|
+
vertical: height >= helpers.win.innerHeight - EDGE_THRESHOLD,
|
|
1758
|
+
horizontal: width >= helpers.win.innerWidth - EDGE_THRESHOLD,
|
|
1759
|
+
};
|
|
1775
1760
|
};
|
|
1776
1761
|
/**
|
|
1777
1762
|
* Returns the initial safe-area configuration based on modal type.
|
|
@@ -1805,26 +1790,23 @@ const getInitialSafeAreaConfig = (context) => {
|
|
|
1805
1790
|
right: '0px',
|
|
1806
1791
|
};
|
|
1807
1792
|
}
|
|
1808
|
-
|
|
1809
|
-
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
|
|
1815
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
};
|
|
1821
|
-
}
|
|
1822
|
-
// Fullscreen modals on phone - inherit all safe areas
|
|
1793
|
+
/**
|
|
1794
|
+
* Each axis is evaluated independently because a modal can span one axis
|
|
1795
|
+
* without spanning the other. This allows the initial safe-area configuration
|
|
1796
|
+
* to match the modal's expected dimensions and avoids correcting an incorrect
|
|
1797
|
+
* pair of insets after presentation.
|
|
1798
|
+
*
|
|
1799
|
+
* A modal can span the horizontal axis while remaining inset vertically, or
|
|
1800
|
+
* span the vertical axis while remaining inset horizontally. Wide viewports
|
|
1801
|
+
* can also render regular modals as centered dialogs, while content-sized
|
|
1802
|
+
* modals may still be clamped to the viewport.
|
|
1803
|
+
*/
|
|
1804
|
+
const { vertical, horizontal } = context.coveredAxes ?? { vertical: true, horizontal: true };
|
|
1823
1805
|
return {
|
|
1824
|
-
top: 'inherit',
|
|
1825
|
-
bottom: 'inherit',
|
|
1826
|
-
left: 'inherit',
|
|
1827
|
-
right: 'inherit',
|
|
1806
|
+
top: vertical ? 'inherit' : '0px',
|
|
1807
|
+
bottom: vertical ? 'inherit' : '0px',
|
|
1808
|
+
left: horizontal ? 'inherit' : '0px',
|
|
1809
|
+
right: horizontal ? 'inherit' : '0px',
|
|
1828
1810
|
};
|
|
1829
1811
|
};
|
|
1830
1812
|
/**
|
|
@@ -1842,8 +1824,8 @@ const getInitialSafeAreaConfig = (context) => {
|
|
|
1842
1824
|
*/
|
|
1843
1825
|
const getPositionBasedSafeAreaConfig = (wrapperEl) => {
|
|
1844
1826
|
const rect = wrapperEl.getBoundingClientRect();
|
|
1845
|
-
const vh =
|
|
1846
|
-
const vw =
|
|
1827
|
+
const vh = helpers.win?.innerHeight ?? 0;
|
|
1828
|
+
const vw = helpers.win?.innerWidth ?? 0;
|
|
1847
1829
|
// Only apply safe-area to sides where modal overlaps with screen edge
|
|
1848
1830
|
return {
|
|
1849
1831
|
top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
|
|
@@ -1876,28 +1858,28 @@ const clearSafeAreaOverrides = (hostEl) => {
|
|
|
1876
1858
|
hostEl.style.removeProperty('--ion-safe-area-right');
|
|
1877
1859
|
};
|
|
1878
1860
|
|
|
1879
|
-
const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:
|
|
1861
|
+
const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:100%;--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-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;outline:none}.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}`;
|
|
1880
1862
|
|
|
1881
|
-
const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:
|
|
1863
|
+
const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:100%;--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-wrapper{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;outline:none}.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}`;
|
|
1882
1864
|
|
|
1883
1865
|
const Modal = class {
|
|
1884
1866
|
constructor(hostRef) {
|
|
1885
|
-
index$
|
|
1886
|
-
this.didPresent = index$
|
|
1887
|
-
this.willPresent = index$
|
|
1888
|
-
this.willDismiss = index$
|
|
1889
|
-
this.didDismiss = index$
|
|
1890
|
-
this.ionBreakpointDidChange = index$
|
|
1891
|
-
this.didPresentShorthand = index$
|
|
1892
|
-
this.willPresentShorthand = index$
|
|
1893
|
-
this.willDismissShorthand = index$
|
|
1894
|
-
this.didDismissShorthand = index$
|
|
1895
|
-
this.ionMount = index$
|
|
1896
|
-
this.ionDragStart = index$
|
|
1897
|
-
this.ionDragMove = index$
|
|
1898
|
-
this.ionDragEnd = index$
|
|
1867
|
+
index$2.registerInstance(this, hostRef);
|
|
1868
|
+
this.didPresent = index$2.createEvent(this, "ionModalDidPresent", 7);
|
|
1869
|
+
this.willPresent = index$2.createEvent(this, "ionModalWillPresent", 7);
|
|
1870
|
+
this.willDismiss = index$2.createEvent(this, "ionModalWillDismiss", 7);
|
|
1871
|
+
this.didDismiss = index$2.createEvent(this, "ionModalDidDismiss", 7);
|
|
1872
|
+
this.ionBreakpointDidChange = index$2.createEvent(this, "ionBreakpointDidChange", 7);
|
|
1873
|
+
this.didPresentShorthand = index$2.createEvent(this, "didPresent", 7);
|
|
1874
|
+
this.willPresentShorthand = index$2.createEvent(this, "willPresent", 7);
|
|
1875
|
+
this.willDismissShorthand = index$2.createEvent(this, "willDismiss", 7);
|
|
1876
|
+
this.didDismissShorthand = index$2.createEvent(this, "didDismiss", 7);
|
|
1877
|
+
this.ionMount = index$2.createEvent(this, "ionMount", 7);
|
|
1878
|
+
this.ionDragStart = index$2.createEvent(this, "ionDragStart", 7);
|
|
1879
|
+
this.ionDragMove = index$2.createEvent(this, "ionDragMove", 7);
|
|
1880
|
+
this.ionDragEnd = index$2.createEvent(this, "ionDragEnd", 7);
|
|
1899
1881
|
this.lockController = lockController.createLockController();
|
|
1900
|
-
this.triggerController =
|
|
1882
|
+
this.triggerController = hardwareBackButton.createTriggerController();
|
|
1901
1883
|
this.coreDelegate = frameworkDelegate.CoreDelegate();
|
|
1902
1884
|
this.isSheetModal = false;
|
|
1903
1885
|
this.inheritedAttributes = {};
|
|
@@ -2043,7 +2025,7 @@ const Modal = class {
|
|
|
2043
2025
|
*/
|
|
2044
2026
|
return;
|
|
2045
2027
|
}
|
|
2046
|
-
this.dismiss(undefined,
|
|
2028
|
+
this.dismiss(undefined, hardwareBackButton.BACKDROP);
|
|
2047
2029
|
};
|
|
2048
2030
|
this.onLifecycle = (modalEvent) => {
|
|
2049
2031
|
const el = this.usersElement;
|
|
@@ -2141,7 +2123,7 @@ const Modal = class {
|
|
|
2141
2123
|
}
|
|
2142
2124
|
connectedCallback() {
|
|
2143
2125
|
const { el } = this;
|
|
2144
|
-
|
|
2126
|
+
hardwareBackButton.prepareOverlay(el);
|
|
2145
2127
|
this.triggerChanged();
|
|
2146
2128
|
// A disconnect tears down state this presentation still needs and cannot
|
|
2147
2129
|
// tell a re-insert from a removal, so put it back.
|
|
@@ -2151,7 +2133,7 @@ const Modal = class {
|
|
|
2151
2133
|
// A relocation from `willPresent` reaches these before `present()` has
|
|
2152
2134
|
// applied the lock, so they apply it instead. Both are idempotent.
|
|
2153
2135
|
if (this.presented) {
|
|
2154
|
-
|
|
2136
|
+
hardwareBackButton.restoreRootFocusTrapAccessibility(el);
|
|
2155
2137
|
this.initParentRemovalObserver();
|
|
2156
2138
|
}
|
|
2157
2139
|
}
|
|
@@ -2164,7 +2146,7 @@ const Modal = class {
|
|
|
2164
2146
|
this.cleanupSafeAreaOverrides();
|
|
2165
2147
|
// Clean up aria-hidden if removed without dismiss() being called
|
|
2166
2148
|
if (this.presented) {
|
|
2167
|
-
|
|
2149
|
+
hardwareBackButton.cleanupRootFocusTrapAccessibility();
|
|
2168
2150
|
}
|
|
2169
2151
|
}
|
|
2170
2152
|
componentWillLoad() {
|
|
@@ -2214,10 +2196,10 @@ const Modal = class {
|
|
|
2214
2196
|
this.currentBreakpoint = this.initialBreakpoint;
|
|
2215
2197
|
}
|
|
2216
2198
|
if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
|
|
2217
|
-
index$
|
|
2199
|
+
index$2.printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
|
|
2218
2200
|
}
|
|
2219
2201
|
if (!this.htmlAttributes?.id) {
|
|
2220
|
-
|
|
2202
|
+
hardwareBackButton.setOverlayId(this.el);
|
|
2221
2203
|
}
|
|
2222
2204
|
}
|
|
2223
2205
|
componentDidLoad() {
|
|
@@ -2314,7 +2296,7 @@ const Modal = class {
|
|
|
2314
2296
|
* get the transition incorrect.
|
|
2315
2297
|
*/
|
|
2316
2298
|
if (helpers.hasLazyBuild(el)) {
|
|
2317
|
-
await index$
|
|
2299
|
+
await index$3.deepReady(this.usersElement);
|
|
2318
2300
|
/**
|
|
2319
2301
|
* If keepContentsMounted="true" then the
|
|
2320
2302
|
* JS Framework has already mounted the inner
|
|
@@ -2325,9 +2307,9 @@ const Modal = class {
|
|
|
2325
2307
|
*/
|
|
2326
2308
|
}
|
|
2327
2309
|
else if (!this.keepContentsMounted) {
|
|
2328
|
-
await index$
|
|
2310
|
+
await index$3.waitForMount();
|
|
2329
2311
|
}
|
|
2330
|
-
index$
|
|
2312
|
+
index$2.writeTask(() => this.el.classList.add('show-modal'));
|
|
2331
2313
|
// Recalculate isSheetModal before safe-area setup because framework
|
|
2332
2314
|
// bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
|
|
2333
2315
|
this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
@@ -2348,7 +2330,7 @@ const Modal = class {
|
|
|
2348
2330
|
this.statusBarStyle = await StatusBar.getStyle();
|
|
2349
2331
|
setCardStatusBarDark();
|
|
2350
2332
|
}
|
|
2351
|
-
await
|
|
2333
|
+
await hardwareBackButton.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
2352
2334
|
presentingEl: presentingElement,
|
|
2353
2335
|
currentBreakpoint: this.initialBreakpoint,
|
|
2354
2336
|
backdropBreakpoint: this.backdropBreakpoint,
|
|
@@ -2413,14 +2395,14 @@ const Modal = class {
|
|
|
2413
2395
|
// All of the elements needed for the swipe gesture
|
|
2414
2396
|
// should be in the DOM and referenced by now, except
|
|
2415
2397
|
// for the presenting el
|
|
2416
|
-
const animationBuilder = this.leaveAnimation || index$
|
|
2398
|
+
const animationBuilder = this.leaveAnimation || index$2.config.get('modalLeave', iosLeaveAnimation);
|
|
2417
2399
|
const ani = (this.animation = animationBuilder(el, {
|
|
2418
2400
|
presentingEl: this.presentingElement,
|
|
2419
2401
|
expandToScroll: this.expandToScroll,
|
|
2420
2402
|
}));
|
|
2421
|
-
const contentEl = index
|
|
2403
|
+
const contentEl = index.findIonContent(el);
|
|
2422
2404
|
if (!contentEl) {
|
|
2423
|
-
index
|
|
2405
|
+
index.printIonContentErrorMsg(el);
|
|
2424
2406
|
return;
|
|
2425
2407
|
}
|
|
2426
2408
|
const statusBarStyle = this.statusBarStyle ?? Style.Default;
|
|
@@ -2432,7 +2414,7 @@ const Modal = class {
|
|
|
2432
2414
|
if (!wrapperEl || initialBreakpoint === undefined) {
|
|
2433
2415
|
return;
|
|
2434
2416
|
}
|
|
2435
|
-
const animationBuilder = this.enterAnimation || index$
|
|
2417
|
+
const animationBuilder = this.enterAnimation || index$2.config.get('modalEnter', iosEnterAnimation);
|
|
2436
2418
|
const ani = (this.animation = animationBuilder(this.el, {
|
|
2437
2419
|
presentingEl: this.presentingElement,
|
|
2438
2420
|
currentBreakpoint: initialBreakpoint,
|
|
@@ -2535,7 +2517,7 @@ const Modal = class {
|
|
|
2535
2517
|
this.animation.onFinish(async () => {
|
|
2536
2518
|
this.currentBreakpoint = 0;
|
|
2537
2519
|
this.ionBreakpointDidChange.emit({ breakpoint: this.currentBreakpoint });
|
|
2538
|
-
await this.dismiss(undefined,
|
|
2520
|
+
await this.dismiss(undefined, hardwareBackButton.GESTURE);
|
|
2539
2521
|
this.gestureAnimationDismissing = false;
|
|
2540
2522
|
});
|
|
2541
2523
|
}
|
|
@@ -2561,7 +2543,7 @@ const Modal = class {
|
|
|
2561
2543
|
*/
|
|
2562
2544
|
setCardStatusBarDefault(this.statusBarStyle);
|
|
2563
2545
|
this.animation.onFinish(async () => {
|
|
2564
|
-
await this.dismiss(undefined,
|
|
2546
|
+
await this.dismiss(undefined, hardwareBackButton.GESTURE);
|
|
2565
2547
|
this.gestureAnimationDismissing = false;
|
|
2566
2548
|
});
|
|
2567
2549
|
}
|
|
@@ -2576,7 +2558,7 @@ const Modal = class {
|
|
|
2576
2558
|
* For example, `cancel` or `backdrop`.
|
|
2577
2559
|
*/
|
|
2578
2560
|
async dismiss(data, role) {
|
|
2579
|
-
if (this.gestureAnimationDismissing && role !==
|
|
2561
|
+
if (this.gestureAnimationDismissing && role !== hardwareBackButton.GESTURE) {
|
|
2580
2562
|
return false;
|
|
2581
2563
|
}
|
|
2582
2564
|
// Cancel any pending resize timeout to prevent stale updates during dismiss
|
|
@@ -2618,7 +2600,7 @@ const Modal = class {
|
|
|
2618
2600
|
window.removeEventListener(keyboard.KEYBOARD_DID_OPEN, this.keyboardOpenCallback);
|
|
2619
2601
|
this.keyboardOpenCallback = undefined;
|
|
2620
2602
|
}
|
|
2621
|
-
const dismissed = await
|
|
2603
|
+
const dismissed = await hardwareBackButton.dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
|
|
2622
2604
|
presentingEl: presentingElement,
|
|
2623
2605
|
currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
|
|
2624
2606
|
backdropBreakpoint: this.backdropBreakpoint,
|
|
@@ -2627,7 +2609,7 @@ const Modal = class {
|
|
|
2627
2609
|
if (dismissed) {
|
|
2628
2610
|
const { delegate } = this.getDelegate();
|
|
2629
2611
|
await frameworkDelegate.detachComponent(delegate, this.usersElement);
|
|
2630
|
-
index$
|
|
2612
|
+
index$2.writeTask(() => this.el.classList.remove('show-modal'));
|
|
2631
2613
|
if (this.animation) {
|
|
2632
2614
|
this.animation.destroy();
|
|
2633
2615
|
}
|
|
@@ -2655,13 +2637,13 @@ const Modal = class {
|
|
|
2655
2637
|
* Returns a promise that resolves when the modal did dismiss.
|
|
2656
2638
|
*/
|
|
2657
2639
|
onDidDismiss() {
|
|
2658
|
-
return
|
|
2640
|
+
return hardwareBackButton.eventMethod(this.el, 'ionModalDidDismiss');
|
|
2659
2641
|
}
|
|
2660
2642
|
/**
|
|
2661
2643
|
* Returns a promise that resolves when the modal will dismiss.
|
|
2662
2644
|
*/
|
|
2663
2645
|
onWillDismiss() {
|
|
2664
|
-
return
|
|
2646
|
+
return hardwareBackButton.eventMethod(this.el, 'ionModalWillDismiss');
|
|
2665
2647
|
}
|
|
2666
2648
|
/**
|
|
2667
2649
|
* Move a sheet style modal to a specific breakpoint.
|
|
@@ -2671,11 +2653,11 @@ const Modal = class {
|
|
|
2671
2653
|
*/
|
|
2672
2654
|
async setCurrentBreakpoint(breakpoint) {
|
|
2673
2655
|
if (!this.isSheetModal) {
|
|
2674
|
-
index$
|
|
2656
|
+
index$2.printIonWarning('[ion-modal] - setCurrentBreakpoint is only supported on sheet modals.');
|
|
2675
2657
|
return;
|
|
2676
2658
|
}
|
|
2677
2659
|
if (!this.breakpoints.includes(breakpoint)) {
|
|
2678
|
-
index$
|
|
2660
|
+
index$2.printIonWarning(`[ion-modal] - Attempted to set invalid breakpoint value ${breakpoint}. Please double check that the breakpoint value is part of your defined breakpoints.`);
|
|
2679
2661
|
return;
|
|
2680
2662
|
}
|
|
2681
2663
|
const { currentBreakpoint, moveSheetToBreakpoint, canDismiss, breakpoints, animated } = this;
|
|
@@ -2906,7 +2888,7 @@ const Modal = class {
|
|
|
2906
2888
|
/**
|
|
2907
2889
|
* Creates the context object for safe-area utilities.
|
|
2908
2890
|
*
|
|
2909
|
-
* `
|
|
2891
|
+
* `coveredAxes` is only set by `setInitialSafeAreaOverrides()`
|
|
2910
2892
|
* because it is only read by `getInitialSafeAreaConfig()`. Other callers
|
|
2911
2893
|
* (resize handler, post-animation update, fullscreen-padding apply) would
|
|
2912
2894
|
* pay a `getComputedStyle()` cost for a value they never consult.
|
|
@@ -2920,6 +2902,26 @@ const Modal = class {
|
|
|
2920
2902
|
currentBreakpoint: this.currentBreakpoint,
|
|
2921
2903
|
};
|
|
2922
2904
|
}
|
|
2905
|
+
/**
|
|
2906
|
+
* Keeps the content's sizing in sync with `--height`. The content reads the
|
|
2907
|
+
* property to determine whether it should size itself to its content, and
|
|
2908
|
+
* changes to `--height` on an ancestor or the root can change that behavior
|
|
2909
|
+
* without changing the modal itself.
|
|
2910
|
+
*/
|
|
2911
|
+
watchHeightForContent() {
|
|
2912
|
+
/**
|
|
2913
|
+
* A sheet's height comes from its breakpoints, so its content never sizes
|
|
2914
|
+
* itself to `--height`. Watching it would cause the drag to recalculate on
|
|
2915
|
+
* every frame.
|
|
2916
|
+
*/
|
|
2917
|
+
if (this.isSheetModal) {
|
|
2918
|
+
return;
|
|
2919
|
+
}
|
|
2920
|
+
this.unsubscribeHeightChange?.();
|
|
2921
|
+
this.unsubscribeHeightChange = onModalHeightChange(this.el, () => {
|
|
2922
|
+
this.el.querySelectorAll('ion-content').forEach((contentEl) => contentEl.recalculateDimensions());
|
|
2923
|
+
});
|
|
2924
|
+
}
|
|
2923
2925
|
/**
|
|
2924
2926
|
* Sets initial safe-area overrides before modal animation.
|
|
2925
2927
|
* Called in present() before animation starts.
|
|
@@ -2933,10 +2935,11 @@ const Modal = class {
|
|
|
2933
2935
|
setInitialSafeAreaOverrides() {
|
|
2934
2936
|
const context = {
|
|
2935
2937
|
...this.getSafeAreaContext(),
|
|
2936
|
-
|
|
2938
|
+
coveredAxes: getModalCoveredAxes(this.el),
|
|
2937
2939
|
};
|
|
2938
2940
|
const safeAreaConfig = getInitialSafeAreaConfig(context);
|
|
2939
2941
|
applySafeAreaOverrides(this.el, safeAreaConfig);
|
|
2942
|
+
this.watchHeightForContent();
|
|
2940
2943
|
// Set the internal offset property with the resolved root safe-area-top value
|
|
2941
2944
|
if (context.isSheetModal) {
|
|
2942
2945
|
this.updateSheetOffsetTop();
|
|
@@ -3056,6 +3059,8 @@ const Modal = class {
|
|
|
3056
3059
|
clearSafeAreaOverrides(this.el);
|
|
3057
3060
|
this.unsubscribeRootSafeAreaTop?.();
|
|
3058
3061
|
this.unsubscribeRootSafeAreaTop = undefined;
|
|
3062
|
+
this.unsubscribeHeightChange?.();
|
|
3063
|
+
this.unsubscribeHeightChange = undefined;
|
|
3059
3064
|
// Remove internal sheet offset property
|
|
3060
3065
|
this.el.style.removeProperty('--ion-modal-offset-top');
|
|
3061
3066
|
const { contentEl } = this.findContentAndFooter();
|
|
@@ -3093,7 +3098,7 @@ const Modal = class {
|
|
|
3093
3098
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
3094
3099
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
3095
3100
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
3096
|
-
return (index$
|
|
3101
|
+
return (index$2.h(index$2.Host, { key: '17a95bd7722bac2344bea041aff97db17f55c0cf', "no-router": true,
|
|
3097
3102
|
// Allow the modal to be navigable when the handle is focusable
|
|
3098
3103
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
|
|
3099
3104
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
@@ -3104,9 +3109,9 @@ const Modal = class {
|
|
|
3104
3109
|
[`modal-sheet`]: isSheetModal,
|
|
3105
3110
|
[`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
|
|
3106
3111
|
'overlay-hidden': true,
|
|
3107
|
-
[
|
|
3112
|
+
[hardwareBackButton.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
|
|
3108
3113
|
...theme.getClassMap(this.cssClass),
|
|
3109
|
-
}, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$
|
|
3114
|
+
}, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$2.h("ion-backdrop", { key: '9dab1ef4771c0d847ba2be8672afbaa2748517f3', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$2.h("div", { key: '64af7ed1c5f552b61fc4b9387b926acc76c8a99a', class: "modal-shadow" }), index$2.h("div", { key: '7e76d77d5b2e8f0467bb793facf5aa86f8d01bbe',
|
|
3110
3115
|
/*
|
|
3111
3116
|
role and aria-modal must be used on the
|
|
3112
3117
|
same element. They must also be set inside the
|
|
@@ -3119,11 +3124,11 @@ const Modal = class {
|
|
|
3119
3124
|
without the tabindex focus() would be a no-op and screen readers
|
|
3120
3125
|
may not properly announce the dialog and its content when it opens.
|
|
3121
3126
|
*/
|
|
3122
|
-
role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$
|
|
3127
|
+
role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$2.h("button", { key: '5efc0bb0a59adcc594ac48da9fd90e57908a7ffb', class: "modal-handle",
|
|
3123
3128
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
3124
|
-
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$
|
|
3129
|
+
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$2.h("slot", { key: '6175fcd0b39c086b4e9eb9e96c4d631c2a86774b', onSlotchange: this.onSlotChange }))));
|
|
3125
3130
|
}
|
|
3126
|
-
get el() { return index$
|
|
3131
|
+
get el() { return index$2.getElement(this); }
|
|
3127
3132
|
static get watchers() { return {
|
|
3128
3133
|
"isOpen": [{
|
|
3129
3134
|
"onIsOpenChange": 0
|