voyager-ionic-core 8.8.12 → 9.0.1
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-1sJ0ZDPe.js +4 -0
- package/components/p-5ldEpNdG.js +4 -0
- package/components/p-6ZLn6K5e.js +4 -0
- package/components/p-B4lxwJ8N.js +4 -0
- package/components/{p-rCa2eL0j.js → p-BF48Oc0v.js} +1 -1
- package/components/p-BJr2B5hZ.js +4 -0
- package/components/p-BMPN55of.js +4 -0
- package/components/p-BNBnVi_1.js +4 -0
- package/components/{p-C4t5ymfq.js → p-BQyuFxYc.js} +1 -1
- package/components/p-BSQPZ79H.js +4 -0
- package/components/p-BT9-hMMz.js +4 -0
- package/components/p-BWoa-cki.js +4 -0
- package/components/p-BYJRZKHa.js +4 -0
- package/components/p-B_gJaBk0.js +4 -0
- package/components/p-BgkOsq-d.js +4 -0
- package/components/p-BhamHSw3.js +4 -0
- package/components/p-Bi-it1EH.js +4 -0
- package/components/p-C-NbvXu4.js +4 -0
- package/components/p-C0493tbX.js +4 -0
- package/components/p-C09TXohi.js +4 -0
- package/components/p-C4VpVfrJ.js +4 -0
- package/components/p-CEW4RXZO.js +4 -0
- package/components/p-CG_zZq_I.js +4 -0
- package/components/{p-B9jFTlwE.js → p-CJgnoKcN.js} +1 -1
- package/components/p-CMRYD_yR.js +4 -0
- package/components/{p-lE_JGpHD.js → p-CNLioZ3B.js} +1 -1
- package/components/{p--JUspHvy.js → p-COO0eJOA.js} +1 -1
- package/components/p-CWAks_S_.js +4 -0
- package/{dist/ionic/p-KjNvRoEp.js → components/p-Cd1WaN-0.js} +1 -1
- package/components/p-CqbGBmqb.js +4 -0
- package/components/p-CrAKlX71.js +4 -0
- package/components/p-Cw6WocLJ.js +4 -0
- package/components/p-D0YpjgON.js +4 -0
- package/components/{p-BirPFsRD.js → p-D5w_FlVa.js} +1 -1
- package/components/p-D7-vHX0A.js +4 -0
- package/components/p-D7wDJdFn.js +4 -0
- package/components/p-DFLJvuRK.js +4 -0
- package/components/p-DGPjJNOU.js +4 -0
- package/components/p-DJR0R0e1.js +4 -0
- package/components/p-DL13ieTa.js +4 -0
- package/components/{p-DqLB8yFQ.js → p-DM1gJSMP.js} +1 -1
- package/components/p-DMBiAyOR.js +4 -0
- package/components/p-DWCzVL3Y.js +4 -0
- package/components/p-DZRZic9C.js +4 -0
- package/components/{p-DNQI6d-L.js → p-DhNuxvJH.js} +1 -1
- package/components/p-DiuOa1vw.js +4 -0
- package/components/p-Dj40C8gm.js +4 -0
- package/components/p-Djmz-ssp.js +4 -0
- package/components/p-DnBNYc7u.js +4 -0
- package/components/p-DngGb-NV.js +4 -0
- package/components/p-Dojwmvde.js +4 -0
- package/components/p-DwSXbQSz.js +4 -0
- package/components/p-DxhHlJln.js +4 -0
- package/components/{p-DqZAXv2t.js → p-GGbIHyEF.js} +1 -1
- package/components/{p-j5IxBIan.js → p-Hp8t4RMX.js} +1 -1
- package/components/p-M34T2gyX.js +4 -0
- package/components/p-TWw4e4sO.js +4 -0
- package/components/{p-Cfx4M1Bn.js → p-YjMkHuvH.js} +1 -1
- package/components/p-byZM6qHV.js +4 -0
- package/components/p-cEN43Ahr.js +4 -0
- package/components/p-qAXsfUff.js +4 -0
- package/dist/cjs/{animation-BJq0kcy2.js → animation-Kd1N7WTN.js} +4 -4
- package/dist/cjs/{app-globals-BlqrqKTN.js → app-globals-b1G4t26O.js} +1 -1
- package/dist/cjs/{button-active-0mPOKmV2.js → button-active-CQCFubJJ.js} +3 -3
- package/dist/cjs/config-CjUbvdPW.js +36 -0
- package/dist/cjs/dir-zwDPRE5K.js +30 -0
- package/dist/cjs/{data-DLTUw-KF.js → format-bHU8N1g5.js} +48 -562
- package/dist/cjs/{framework-delegate-BtICZDHr.js → framework-delegate-d-fWfeI6.js} +5 -7
- package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-CeJslptU.js} +1 -2
- package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
- package/dist/cjs/{hardware-back-button-iUuF_76h.js → hardware-back-button-Bu4Dzw8l.js} +4 -4
- package/dist/cjs/{helpers-Cv23MFHM.js → helpers-7wzdhdeg.js} +15 -11
- package/dist/cjs/index-BbqUBe2T.js +429 -0
- package/dist/cjs/{index-D81eLYUM.js → index-C74Q3t6a.js} +3 -2
- package/dist/cjs/{index-BERfRao3.js → index-CQfEIyLK.js} +5 -5
- package/dist/cjs/{index-aC4x3Fk3.js → index-DFNrCX7M.js} +6 -7
- package/dist/cjs/{index-CAvQ7Tka.js → index-DRPqwSvU.js} +13 -30
- package/dist/cjs/{index-Ct7gcRif.js → index-DXoo08JC.js} +321 -26
- package/dist/cjs/{index-CIrkNXqJ.js → index-DtvKGwdh.js} +34 -2
- package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
- package/dist/cjs/index.cjs.js +19 -18
- package/dist/cjs/{input-shims-CFLg7uzj.js → input-shims-VJIiKBKv.js} +10 -11
- package/dist/cjs/input.utils-EHVE2RK_.js +35 -0
- package/dist/cjs/ion-accordion_2.cjs.entry.js +12 -12
- package/dist/cjs/ion-action-sheet.cjs.entry.js +92 -44
- package/dist/cjs/ion-alert.cjs.entry.js +144 -65
- package/dist/cjs/ion-app_8.cjs.entry.js +112 -40
- package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-back-button.cjs.entry.js +6 -5
- package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +8 -7
- package/dist/cjs/ion-button_2.cjs.entry.js +18 -10
- package/dist/cjs/ion-card_5.cjs.entry.js +6 -5
- package/dist/cjs/ion-checkbox.cjs.entry.js +25 -12
- package/dist/cjs/ion-chip.cjs.entry.js +3 -3
- package/dist/cjs/ion-col_3.cjs.entry.js +10 -6
- package/dist/cjs/ion-datetime-button.cjs.entry.js +29 -30
- package/dist/cjs/{ion-datetime_3.cjs.entry.js → ion-datetime.cjs.entry.js} +773 -796
- package/dist/cjs/ion-fab_3.cjs.entry.js +93 -14
- package/dist/cjs/ion-img.cjs.entry.js +7 -4
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +8 -6
- package/dist/cjs/ion-input-otp.cjs.entry.js +20 -29
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +9 -10
- package/dist/cjs/ion-input.cjs.entry.js +58 -70
- package/dist/cjs/ion-item-option_3.cjs.entry.js +21 -24
- package/dist/cjs/ion-item_8.cjs.entry.js +117 -33
- package/dist/cjs/ion-loading.cjs.entry.js +29 -15
- package/dist/cjs/ion-menu_3.cjs.entry.js +23 -24
- package/dist/cjs/ion-modal.cjs.entry.js +307 -159
- package/dist/cjs/ion-nav_2.cjs.entry.js +30 -138
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +8 -13
- package/dist/cjs/ion-picker-column.cjs.entry.js +218 -62
- package/dist/cjs/ion-picker.cjs.entry.js +4 -4
- package/dist/cjs/ion-popover.cjs.entry.js +50 -30
- package/dist/cjs/ion-progress-bar.cjs.entry.js +6 -5
- package/dist/cjs/ion-radio_2.cjs.entry.js +24 -14
- package/dist/cjs/ion-range.cjs.entry.js +30 -25
- package/dist/cjs/ion-refresher_2.cjs.entry.js +61 -26
- package/dist/cjs/ion-reorder_2.cjs.entry.js +10 -9
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +3 -3
- package/dist/cjs/ion-route_4.cjs.entry.js +36 -30
- package/dist/cjs/ion-searchbar.cjs.entry.js +27 -22
- package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment-view.cjs.entry.js +5 -6
- package/dist/cjs/ion-segment_2.cjs.entry.js +30 -26
- package/dist/cjs/ion-select-modal.cjs.entry.js +93 -38
- package/dist/cjs/ion-select_3.cjs.entry.js +495 -125
- package/dist/cjs/ion-spinner.cjs.entry.js +5 -6
- package/dist/cjs/ion-split-pane.cjs.entry.js +4 -4
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +15 -12
- package/dist/cjs/ion-tab_2.cjs.entry.js +26 -19
- package/dist/cjs/ion-text.cjs.entry.js +5 -5
- package/dist/cjs/ion-textarea.cjs.entry.js +56 -65
- package/dist/cjs/ion-toast.cjs.entry.js +26 -21
- package/dist/cjs/ion-toggle.cjs.entry.js +36 -15
- package/dist/cjs/{ionic-global-B-cA6LkY.js → ionic-global-CYJNT-2P.js} +13 -8
- package/dist/cjs/ionic.cjs.js +5 -5
- package/dist/cjs/{ios.transition-BOSWOaiK.js → ios.transition-DYGiD6gM.js} +14 -17
- package/dist/cjs/item-multiple-inputs-Dv6qrMhm.js +38 -0
- package/dist/cjs/{keyboard-hHzlEQpk.js → keyboard-Cix5TVkD.js} +2 -2
- package/dist/cjs/{keyboard-UuAS4D_9.js → keyboard-cHxZlTyz.js} +2 -2
- package/dist/cjs/{keyboard-controller-GXBiBRKS.js → keyboard-controller-PtZoN2GS.js} +6 -6
- package/dist/cjs/loader.cjs.js +4 -4
- package/dist/cjs/{md.transition-B8-wBZqt.js → md.transition-CrSkaoz6.js} +8 -8
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
- package/dist/cjs/{overlays-TbKsuC-K.js → overlays-BR21NUIG.js} +120 -57
- package/dist/cjs/select-option-render-CrbLc-1j.js +123 -0
- package/dist/cjs/slot-mutation-controller-D6IjSEIh.js +397 -0
- package/dist/cjs/{status-tap-BXX8H8_Y.js → status-tap-CNP5eD1R.js} +4 -3
- package/dist/cjs/{swipe-back-CCMaNiP2.js → swipe-back-CSIJQfu5.js} +5 -5
- package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
- package/dist/collection/collection-manifest.json +7 -11
- package/dist/collection/components/accordion/accordion.js +5 -6
- package/dist/collection/components/accordion-group/accordion-group.js +2 -2
- package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
- package/dist/collection/components/action-sheet/action-sheet.js +77 -31
- package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
- package/dist/collection/components/alert/alert.ios.css +279 -10
- package/dist/collection/components/alert/alert.js +127 -50
- package/dist/collection/components/alert/alert.md.css +268 -20
- package/dist/collection/components/breadcrumb/breadcrumb.js +1 -1
- package/dist/collection/components/breadcrumbs/breadcrumbs.js +1 -1
- package/dist/collection/components/button/button.js +11 -4
- package/dist/collection/components/card/card.js +1 -1
- package/dist/collection/components/checkbox/checkbox.ios.css +18 -0
- package/dist/collection/components/checkbox/checkbox.js +19 -8
- package/dist/collection/components/checkbox/checkbox.md.css +18 -0
- package/dist/collection/components/col/col.js +7 -3
- package/dist/collection/components/content/content.js +56 -6
- package/dist/collection/components/datetime/datetime.ios.css +42 -2
- package/dist/collection/components/datetime/datetime.js +193 -79
- package/dist/collection/components/datetime/datetime.md.css +42 -1
- package/dist/collection/components/datetime/utils/data.js +13 -14
- package/dist/collection/components/datetime/utils/format.js +21 -11
- package/dist/collection/components/datetime/utils/manipulation.js +8 -8
- package/dist/collection/components/datetime/utils/parse.js +10 -10
- package/dist/collection/components/datetime/utils/state.js +8 -2
- package/dist/collection/components/datetime/utils/validate.js +4 -5
- package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
- package/dist/collection/components/datetime-button/datetime-button.js +21 -25
- package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
- package/dist/collection/components/fab-button/fab-button.js +114 -10
- package/dist/collection/components/footer/footer.js +1 -1
- package/dist/collection/components/header/header.js +2 -2
- package/dist/collection/components/img/img.js +6 -1
- package/dist/collection/components/input/input.ios.css +57 -26
- package/dist/collection/components/input/input.js +51 -64
- package/dist/collection/components/input/input.md.css +79 -43
- package/dist/collection/components/input-otp/input-otp.js +15 -24
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +5 -6
- package/dist/collection/components/item/item.ios.css +11 -0
- package/dist/collection/components/item/item.js +99 -15
- package/dist/collection/components/item/item.md.css +11 -0
- package/dist/collection/components/item-divider/item-divider.js +2 -2
- package/dist/collection/components/item-group/item-group.js +1 -1
- package/dist/collection/components/item-option/item-option.js +2 -2
- package/dist/collection/components/item-options/item-options.js +1 -1
- package/dist/collection/components/item-sliding/item-sliding.js +12 -16
- package/dist/collection/components/label/label.js +2 -2
- package/dist/collection/components/list/list.js +2 -2
- package/dist/collection/components/list-header/list-header.js +2 -2
- package/dist/collection/components/loading/loading.js +17 -5
- package/dist/collection/components/menu/menu.js +6 -8
- package/dist/collection/components/menu-button/menu-button.js +2 -2
- package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
- package/dist/collection/components/modal/animations/ios.enter.js +1 -1
- package/dist/collection/components/modal/animations/md.enter.js +1 -1
- package/dist/collection/components/modal/gestures/sheet.js +47 -32
- package/dist/collection/components/modal/gestures/swipe-to-close.js +23 -33
- package/dist/collection/components/modal/gestures/utils.js +17 -0
- package/dist/collection/components/modal/modal.ios.css +8 -0
- package/dist/collection/components/modal/modal.js +158 -65
- package/dist/collection/components/modal/modal.md.css +8 -0
- package/dist/collection/components/modal/safe-area-utils.js +39 -5
- package/dist/collection/components/nav/nav.js +24 -235
- package/dist/collection/components/nav-link/nav-link.js +1 -1
- package/dist/collection/components/note/note.js +2 -2
- package/dist/collection/components/picker/picker.js +1 -2
- package/dist/collection/components/picker-column/picker-column.css +3 -0
- package/dist/collection/components/picker-column/picker-column.js +212 -58
- package/dist/collection/components/picker-column-option/picker-column-option.js +3 -10
- package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
- package/dist/collection/components/popover/animations/ios.enter.js +1 -2
- package/dist/collection/components/popover/animations/md.enter.js +1 -2
- package/dist/collection/components/popover/popover.ios.css +15 -0
- package/dist/collection/components/popover/popover.js +32 -9
- package/dist/collection/components/popover/popover.md.css +15 -0
- package/dist/collection/components/popover/utils.js +4 -6
- package/dist/collection/components/progress-bar/progress-bar.js +1 -1
- package/dist/collection/components/radio/radio.ios.css +11 -15
- package/dist/collection/components/radio/radio.js +17 -9
- package/dist/collection/components/radio/radio.md.css +11 -11
- package/dist/collection/components/radio-group/radio-group.js +2 -2
- package/dist/collection/components/range/range.js +24 -19
- package/dist/collection/components/refresher/refresher.js +49 -16
- package/dist/collection/components/refresher-content/refresher-content.js +1 -1
- package/dist/collection/components/reorder/reorder.js +1 -1
- package/dist/collection/components/reorder-group/reorder-group.js +1 -1
- package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
- package/dist/collection/components/route/route.js +1 -1
- package/dist/collection/components/router/router.js +2 -6
- package/dist/collection/components/router/utils/dom.js +25 -7
- package/dist/collection/components/router/utils/matching.js +6 -9
- package/dist/collection/components/router/utils/parser.js +1 -1
- package/dist/collection/components/router/utils/path.js +0 -1
- package/dist/collection/components/router-link/router-link.js +2 -2
- package/dist/collection/components/router-outlet/router-outlet.js +49 -10
- package/dist/collection/components/row/row.js +1 -1
- package/dist/collection/components/searchbar/searchbar.js +25 -20
- package/dist/collection/components/segment/segment.js +9 -11
- package/dist/collection/components/segment-button/segment-button.js +15 -9
- package/dist/collection/components/segment-content/segment-content.js +1 -1
- package/dist/collection/components/segment-view/segment-view.js +3 -4
- package/dist/collection/components/select/select.ios.css +96 -69
- package/dist/collection/components/select/select.js +405 -91
- package/dist/collection/components/select/select.md.css +118 -85
- package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
- package/dist/collection/components/select-modal/select-modal.js +80 -27
- package/dist/collection/components/select-modal/select-modal.md.css +164 -0
- package/dist/collection/components/select-option/select-option.js +67 -3
- package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
- package/dist/collection/components/select-popover/select-popover.js +78 -26
- package/dist/collection/components/select-popover/select-popover.md.css +164 -0
- package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
- package/dist/collection/components/spinner/spinner.js +2 -3
- package/dist/collection/components/split-pane/split-pane.js +2 -2
- package/dist/collection/components/tab/tab.js +20 -13
- package/dist/collection/components/tab-bar/tab-bar.js +2 -2
- package/dist/collection/components/tab-button/tab-button.js +6 -4
- package/dist/collection/components/tabs/tabs.js +2 -3
- package/dist/collection/components/text/text.js +2 -2
- package/dist/collection/components/textarea/textarea.ios.css +94 -62
- package/dist/collection/components/textarea/textarea.js +47 -57
- package/dist/collection/components/textarea/textarea.md.css +103 -77
- package/dist/collection/components/thumbnail/thumbnail.js +1 -1
- package/dist/collection/components/title/title.js +2 -2
- package/dist/collection/components/toast/toast.js +12 -9
- package/dist/collection/components/toggle/toggle.ios.css +12 -4
- package/dist/collection/components/toggle/toggle.js +27 -7
- package/dist/collection/components/toggle/toggle.md.css +42 -5
- package/dist/collection/components/toolbar/toolbar.js +7 -4
- package/dist/collection/global/config.js +3 -3
- package/dist/collection/global/ionic-global.js +8 -2
- package/dist/collection/index.js +1 -1
- package/dist/collection/utils/animation/animation.js +3 -3
- package/dist/collection/utils/config.js +5 -4
- package/dist/collection/utils/content/index.js +30 -0
- package/dist/collection/utils/focus-controller/index.js +1 -1
- package/dist/collection/utils/focus-trap.js +3 -3
- package/dist/collection/utils/forms/index.js +2 -0
- package/dist/collection/utils/forms/item-multiple-inputs.js +33 -0
- package/dist/collection/utils/forms/start-container-controller.js +132 -0
- package/dist/collection/utils/framework-delegate.js +4 -6
- package/dist/collection/utils/gesture/gesture-controller.js +1 -2
- package/dist/collection/utils/gesture/index.js +10 -2
- package/dist/collection/utils/gesture/listener.js +4 -27
- package/dist/collection/utils/hardware-back-button.js +3 -3
- package/dist/collection/utils/helpers.js +14 -10
- package/dist/collection/utils/input-shims/hacks/scroll-assist.js +4 -5
- package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
- package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
- package/dist/collection/utils/keyboard/keyboard.js +1 -1
- package/dist/collection/utils/logging/index.js +23 -4
- package/dist/collection/utils/menu-controller/index.js +1 -2
- package/dist/collection/utils/native/haptic.js +2 -3
- package/dist/collection/utils/native/keyboard.js +2 -2
- package/dist/collection/utils/native/status-bar.js +1 -1
- package/dist/collection/utils/overlay-control-label.js +45 -0
- package/dist/collection/utils/overlays.js +109 -47
- package/dist/collection/utils/platform.js +4 -5
- package/dist/collection/utils/rtl/dir.js +17 -7
- package/dist/collection/utils/sanitization/index.js +275 -20
- package/dist/collection/utils/select-option-render.js +118 -0
- package/dist/collection/utils/slot-mutation-controller.js +1 -2
- package/dist/collection/utils/test/late-props/late-props.js +69 -0
- package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +25 -0
- package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
- package/dist/collection/utils/test/playwright/drag-element.js +14 -0
- package/dist/collection/utils/test/playwright/generator.js +3 -4
- package/dist/collection/utils/test/playwright/index.js +2 -0
- package/dist/collection/utils/test/playwright/page/event-spy.js +2 -4
- package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
- package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
- package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +2 -3
- package/dist/collection/utils/test/press-keys.js +6 -16
- package/dist/collection/utils/theme.js +6 -1
- package/dist/collection/utils/transition/ios.transition.js +9 -13
- package/dist/collection/utils/transition/md.transition.js +3 -4
- package/dist/docs.json +972 -1402
- package/dist/esm/{animation-DLJpuoEz.js → animation-BFNVlYum.js} +4 -4
- package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-BgX0BGL1.js} +1 -1
- package/dist/esm/{button-active-BSpTQmS9.js → button-active-BfOvDr3b.js} +3 -3
- package/dist/esm/config-DWCzVL3Y.js +32 -0
- package/dist/esm/dir-Dojwmvde.js +28 -0
- package/dist/esm/{data-DZI70dKr.js → format-DDFE9jM5.js} +41 -554
- package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate-BwNhx9NR.js} +5 -7
- package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-B_gJaBk0.js} +1 -2
- package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
- package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-DmkiRgOT.js} +4 -4
- package/dist/esm/{helpers-HEqiOzXb.js → helpers-BSmc0nst.js} +15 -11
- package/dist/esm/{index-CfgBF1SE.js → index-BmLuEdV7.js} +13 -30
- package/dist/esm/{index-Q6UPU0Ay.js → index-BuPaALjU.js} +6 -7
- package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
- package/dist/esm/{index-MEDq2S8l.js → index-C1b9CLFg.js} +33 -3
- package/dist/esm/{index-tcQvqkiX.js → index-C23AVPx9.js} +303 -26
- package/dist/esm/{index-BRHzoo00.js → index-CJln0gS3.js} +3 -2
- package/dist/esm/index-CqoUoxgG.js +423 -0
- package/dist/esm/{index-B_dQk_WE.js → index-DnA_7Bnx.js} +5 -5
- package/dist/esm/index.js +17 -15
- package/dist/esm/{input-shims-D10mwcw1.js → input-shims-Dqk-Ou25.js} +10 -11
- package/dist/esm/input.utils-rqoH22pW.js +33 -0
- package/dist/esm/ion-accordion_2.entry.js +12 -12
- package/dist/esm/ion-action-sheet.entry.js +92 -44
- package/dist/esm/ion-alert.entry.js +143 -64
- package/dist/esm/ion-app_8.entry.js +112 -40
- package/dist/esm/ion-avatar_3.entry.js +4 -4
- package/dist/esm/ion-back-button.entry.js +6 -5
- package/dist/esm/ion-backdrop.entry.js +2 -2
- package/dist/esm/ion-breadcrumb_2.entry.js +8 -7
- package/dist/esm/ion-button_2.entry.js +18 -10
- package/dist/esm/ion-card_5.entry.js +6 -5
- package/dist/esm/ion-checkbox.entry.js +25 -12
- package/dist/esm/ion-chip.entry.js +3 -3
- package/dist/esm/ion-col_3.entry.js +10 -6
- package/dist/esm/ion-datetime-button.entry.js +28 -29
- package/dist/esm/{ion-datetime_3.entry.js → ion-datetime.entry.js} +712 -733
- package/dist/esm/ion-fab_3.entry.js +93 -14
- package/dist/esm/ion-img.entry.js +7 -4
- package/dist/esm/ion-infinite-scroll_2.entry.js +7 -5
- package/dist/esm/ion-input-otp.entry.js +20 -29
- package/dist/esm/ion-input-password-toggle.entry.js +9 -10
- package/dist/esm/ion-input.entry.js +56 -68
- package/dist/esm/ion-item-option_3.entry.js +21 -24
- package/dist/esm/ion-item_8.entry.js +117 -33
- package/dist/esm/ion-loading.entry.js +28 -14
- package/dist/esm/ion-menu_3.entry.js +23 -24
- package/dist/esm/ion-modal.entry.js +295 -147
- package/dist/esm/ion-nav_2.entry.js +30 -138
- package/dist/esm/ion-picker-column-option.entry.js +8 -13
- package/dist/esm/ion-picker-column.entry.js +218 -62
- package/dist/esm/ion-picker.entry.js +4 -4
- package/dist/esm/ion-popover.entry.js +50 -30
- package/dist/esm/ion-progress-bar.entry.js +6 -5
- package/dist/esm/ion-radio_2.entry.js +24 -14
- package/dist/esm/ion-range.entry.js +30 -25
- package/dist/esm/ion-refresher_2.entry.js +59 -24
- package/dist/esm/ion-reorder_2.entry.js +10 -9
- package/dist/esm/ion-ripple-effect.entry.js +3 -3
- package/dist/esm/ion-route_4.entry.js +36 -30
- package/dist/esm/ion-searchbar.entry.js +27 -22
- package/dist/esm/ion-segment-content.entry.js +2 -2
- package/dist/esm/ion-segment-view.entry.js +5 -6
- package/dist/esm/ion-segment_2.entry.js +30 -26
- package/dist/esm/ion-select-modal.entry.js +93 -38
- package/dist/esm/ion-select_3.entry.js +495 -125
- package/dist/esm/ion-spinner.entry.js +5 -6
- package/dist/esm/ion-split-pane.entry.js +4 -4
- package/dist/esm/ion-tab-bar_2.entry.js +15 -12
- package/dist/esm/ion-tab_2.entry.js +26 -19
- package/dist/esm/ion-text.entry.js +5 -5
- package/dist/esm/ion-textarea.entry.js +55 -64
- package/dist/esm/ion-toast.entry.js +25 -20
- package/dist/esm/ion-toggle.entry.js +36 -15
- package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-ZXjCXKH0.js} +13 -8
- package/dist/esm/ionic.js +6 -6
- package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-CWAgfQ1r.js} +14 -17
- package/dist/esm/item-multiple-inputs-DZnIiOO_.js +36 -0
- package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
- package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
- package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
- package/dist/esm/loader.js +5 -5
- package/dist/esm/{md.transition-D0msQmzI.js → md.transition-ZuqDDdDW.js} +8 -8
- package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
- package/dist/esm/{overlays-TbiM4mdr.js → overlays-DKE0DgvE.js} +119 -57
- package/dist/esm/select-option-render-1W6W9pbC.js +121 -0
- package/dist/esm/slot-mutation-controller-B5NpUZ-N.js +393 -0
- package/dist/esm/{status-tap-Kan2W7sh.js → status-tap-Cv9gb3ja.js} +4 -3
- package/dist/esm/{swipe-back-ZUWwA-KF.js → swipe-back-De5HlmeM.js} +5 -5
- package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
- package/dist/html.html-data.json +58 -82
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-06c6b540.entry.js +4 -0
- package/dist/ionic/p-099b7f9f.entry.js +4 -0
- package/dist/ionic/p-0dcb7bb6.entry.js +4 -0
- package/dist/ionic/p-1347880c.entry.js +4 -0
- package/dist/ionic/p-191a651e.entry.js +4 -0
- package/dist/ionic/p-1f24cb24.entry.js +4 -0
- package/dist/ionic/p-271c3640.entry.js +4 -0
- package/dist/ionic/p-2c52fe3e.entry.js +4 -0
- package/dist/ionic/p-2ea4bb36.entry.js +4 -0
- package/dist/ionic/p-338a02e0.entry.js +4 -0
- package/dist/ionic/p-38b9375b.entry.js +4 -0
- package/dist/ionic/p-3bba83ee.entry.js +4 -0
- package/dist/ionic/p-4712a8a9.entry.js +4 -0
- package/dist/ionic/p-4c3e50f8.entry.js +4 -0
- package/dist/ionic/p-4e2fef42.entry.js +4 -0
- package/dist/ionic/p-54cbb0a7.entry.js +4 -0
- package/dist/ionic/{p-2bb2cb18.entry.js → p-561af487.entry.js} +1 -1
- package/dist/ionic/p-5906ea6f.entry.js +4 -0
- package/dist/ionic/p-5cc09b40.entry.js +4 -0
- package/dist/ionic/p-5d9094ac.entry.js +4 -0
- package/dist/ionic/p-612ea3b1.entry.js +4 -0
- package/dist/ionic/p-66f150ec.entry.js +4 -0
- package/dist/ionic/p-68cc89a6.entry.js +4 -0
- package/dist/ionic/{p-dfa8d673.entry.js → p-6e386853.entry.js} +1 -1
- package/dist/ionic/p-77c96e08.entry.js +4 -0
- package/dist/ionic/p-7bfeccb3.entry.js +4 -0
- package/dist/ionic/p-7e394cc3.entry.js +4 -0
- package/dist/ionic/{p-0fa9c382.entry.js → p-7fbb3319.entry.js} +1 -1
- package/dist/ionic/p-837db1b9.entry.js +4 -0
- package/dist/ionic/p-85599fe3.entry.js +4 -0
- package/dist/ionic/p-8b80d9f9.entry.js +4 -0
- package/dist/ionic/p-90f50a65.entry.js +4 -0
- package/dist/ionic/p-9595e305.entry.js +4 -0
- package/dist/ionic/p-9c5f2691.entry.js +4 -0
- package/dist/ionic/p-BMPN55of.js +4 -0
- package/dist/ionic/p-BSQPZ79H.js +4 -0
- package/dist/ionic/p-BY6BzzPF.js +4 -0
- package/dist/ionic/p-B_gJaBk0.js +4 -0
- package/dist/ionic/p-BaeKWZ-a.js +4 -0
- package/dist/ionic/p-Bd72UYI2.js +4 -0
- package/dist/ionic/p-BgOvhHy_.js +4 -0
- package/dist/ionic/p-BhamHSw3.js +4 -0
- package/dist/ionic/p-BijjLYjT.js +4 -0
- package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
- package/dist/ionic/p-C23AVPx9.js +6 -0
- package/dist/ionic/p-C8XilMh0.js +4 -0
- package/dist/ionic/p-CER8qW8Y.js +4 -0
- package/dist/ionic/p-CFuOr1Tu.js +4 -0
- package/dist/ionic/p-CM5OBjTW.js +4 -0
- package/dist/ionic/p-CMZYmFb4.js +4 -0
- package/dist/ionic/p-CkxVYPtX.js +4 -0
- package/dist/ionic/p-CmXuiRT6.js +4 -0
- package/dist/ionic/p-D0YpjgON.js +4 -0
- package/dist/ionic/p-D4OrdtJf.js +4 -0
- package/dist/ionic/p-D5t_-oMk.js +4 -0
- package/dist/ionic/p-D6rHcCvc.js +4 -0
- package/dist/ionic/p-DLM95R4x.js +4 -0
- package/dist/ionic/p-DTxBioUO.js +4 -0
- package/dist/ionic/p-DWCzVL3Y.js +4 -0
- package/dist/ionic/p-DYUjHcuH.js +4 -0
- package/dist/ionic/p-DZ6Hmc-8.js +4 -0
- package/dist/ionic/p-D_gb-kdd.js +4 -0
- package/dist/ionic/p-DajLgJ4d.js +4 -0
- package/dist/ionic/p-Do3zTvCA.js +4 -0
- package/dist/ionic/p-Dojwmvde.js +4 -0
- package/dist/ionic/p-T71k3C35.js +4 -0
- package/dist/ionic/p-a1cc2861.entry.js +4 -0
- package/dist/ionic/p-a20a2ebe.entry.js +4 -0
- package/dist/ionic/p-a8ff2489.entry.js +4 -0
- package/dist/ionic/p-b3532b8d.entry.js +4 -0
- package/dist/ionic/p-b80c86c4.entry.js +4 -0
- package/dist/ionic/p-b9b4e85d.entry.js +4 -0
- package/dist/ionic/p-byZM6qHV.js +4 -0
- package/dist/ionic/p-c57fc396.entry.js +4 -0
- package/dist/ionic/{p-c6e49f3f.entry.js → p-ca1b8865.entry.js} +1 -1
- package/dist/ionic/p-cc4320d3.entry.js +4 -0
- package/dist/ionic/p-d6755739.entry.js +4 -0
- package/dist/ionic/p-d8c138d9.entry.js +4 -0
- package/dist/ionic/p-db449915.entry.js +4 -0
- package/dist/ionic/p-dd01be0a.entry.js +4 -0
- package/dist/ionic/p-ec00fd0d.entry.js +4 -0
- package/dist/ionic/p-ee09ac9d.entry.js +4 -0
- package/dist/ionic/{p-37e720da.entry.js → p-efc0cf82.entry.js} +1 -1
- package/dist/ionic/p-f0fb23c1.entry.js +4 -0
- package/dist/ionic/p-f83b3e0c.entry.js +4 -0
- package/dist/ionic/p-fU3rOYad.js +4 -0
- package/dist/ionic/p-zWf7R2xV.js +4 -0
- package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
- package/dist/types/components/alert/alert.d.ts +7 -0
- package/dist/types/components/checkbox/checkbox.d.ts +1 -0
- package/dist/types/components/content/content.d.ts +12 -0
- package/dist/types/components/datetime/datetime.d.ts +13 -1
- package/dist/types/components/fab-button/fab-button.d.ts +15 -0
- package/dist/types/components/img/img.d.ts +2 -0
- package/dist/types/components/input/input.d.ts +12 -6
- package/dist/types/components/item/item.d.ts +19 -0
- package/dist/types/components/modal/gestures/sheet.d.ts +1 -0
- package/dist/types/components/modal/gestures/utils.d.ts +11 -0
- package/dist/types/components/modal/modal-interface.d.ts +9 -0
- package/dist/types/components/modal/modal.d.ts +25 -7
- package/dist/types/components/modal/safe-area-utils.d.ts +6 -0
- package/dist/types/components/nav/nav-interface.d.ts +0 -1
- package/dist/types/components/nav/nav.d.ts +2 -22
- package/dist/types/components/picker-column/picker-column.d.ts +42 -0
- package/dist/types/components/radio/radio.d.ts +1 -0
- package/dist/types/components/range/range.d.ts +4 -1
- package/dist/types/components/refresher/refresher.d.ts +7 -0
- package/dist/types/components/route/route.d.ts +1 -1
- package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
- package/dist/types/components/searchbar/searchbar.d.ts +1 -1
- package/dist/types/components/select/select-interface.d.ts +31 -0
- package/dist/types/components/select/select.d.ts +30 -6
- package/dist/types/components/select-option/select-option.d.ts +42 -1
- package/dist/types/components/tab/tab.d.ts +1 -1
- package/dist/types/components/textarea/textarea.d.ts +12 -5
- package/dist/types/components/toggle/toggle.d.ts +1 -0
- package/dist/types/components.d.ts +94 -318
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interface.d.ts +0 -1
- package/dist/types/stencil-public-runtime.d.ts +12 -0
- package/dist/types/utils/config.d.ts +1 -8
- package/dist/types/utils/content/index.d.ts +12 -0
- package/dist/types/utils/forms/index.d.ts +2 -0
- package/dist/types/utils/forms/item-multiple-inputs.d.ts +13 -0
- package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
- package/dist/types/utils/helpers.d.ts +8 -5
- package/dist/types/utils/logging/index.d.ts +2 -1
- package/dist/types/utils/overlay-control-label.d.ts +32 -0
- package/dist/types/utils/overlays.d.ts +20 -9
- package/dist/types/utils/rtl/dir.d.ts +10 -4
- package/dist/types/utils/sanitization/index.d.ts +58 -2
- package/dist/types/utils/select-option-render.d.ts +53 -0
- package/dist/types/utils/test/playwright/apply-keyboard-focus.d.ts +16 -0
- package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
- package/dist/types/utils/test/playwright/index.d.ts +2 -0
- package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
- package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
- package/hydrate/index.js +3341 -2197
- package/hydrate/index.mjs +3341 -2197
- package/loader/index.d.ts +1 -1
- package/package.json +61 -17
- package/components/ion-picker-legacy-column.d.ts +0 -11
- package/components/ion-picker-legacy-column.js +0 -4
- package/components/ion-picker-legacy.d.ts +0 -11
- package/components/ion-picker-legacy.js +0 -4
- package/components/p-0NRupjzW.js +0 -4
- package/components/p-5bE_Wz4Y.js +0 -4
- package/components/p-B60hm8Qv.js +0 -4
- package/components/p-BAYYcg3o.js +0 -4
- package/components/p-BLmJ0zRm.js +0 -4
- package/components/p-BSEgsdFI.js +0 -4
- package/components/p-BTEOs1at.js +0 -4
- package/components/p-BTPfOxsU.js +0 -4
- package/components/p-BT_5jSqG.js +0 -4
- package/components/p-Baq1XyAy.js +0 -4
- package/components/p-BjfgFSSR.js +0 -4
- package/components/p-BjoEPDW5.js +0 -4
- package/components/p-BnqQlm7c.js +0 -4
- package/components/p-BsPelv04.js +0 -4
- package/components/p-Bth-EzJ0.js +0 -4
- package/components/p-Bz0dSlXZ.js +0 -4
- package/components/p-C1aScSTo.js +0 -4
- package/components/p-C2lKgrXx.js +0 -4
- package/components/p-C53feagD.js +0 -4
- package/components/p-CHqRYvYm.js +0 -4
- package/components/p-CI3ncNZm.js +0 -4
- package/components/p-CSZf8_j0.js +0 -4
- package/components/p-CU5rbWAW.js +0 -4
- package/components/p-C_xFdyXe.js +0 -4
- package/components/p-Ciz1-FuE.js +0 -4
- package/components/p-Cl0B-RWe.js +0 -4
- package/components/p-CmR5uXej.js +0 -4
- package/components/p-CtWGkNnJ.js +0 -4
- package/components/p-CtukzcyX.js +0 -4
- package/components/p-D13Eaw-8.js +0 -4
- package/components/p-D5Ubpm7D.js +0 -4
- package/components/p-D6Ynv7Xh.js +0 -4
- package/components/p-D7bSXQD3.js +0 -4
- package/components/p-DDWp95gH.js +0 -4
- package/components/p-DIE4pXMl.js +0 -4
- package/components/p-DOFCbuQR.js +0 -4
- package/components/p-DiVJyqlX.js +0 -4
- package/components/p-DnL1c9_X.js +0 -4
- package/components/p-W5nO8mX_.js +0 -4
- package/components/p-W9CZ2mWX.js +0 -4
- package/components/p-XlSIJDJ-.js +0 -4
- package/components/p-cyNmxje6.js +0 -4
- package/components/p-dhLYXa7A.js +0 -4
- package/components/p-ijF0iCrA.js +0 -4
- package/components/p-k_E4tX5Z.js +0 -4
- package/components/p-nQi4oKcG.js +0 -4
- package/components/p-ryqmO0B-.js +0 -4
- package/dist/cjs/config-xninhj0J.js +0 -201
- package/dist/cjs/dir-Cn0z1rJH.js +0 -20
- package/dist/cjs/input.utils-DetjmtH2.js +0 -150
- package/dist/cjs/notch-controller-18PzRGXd.js +0 -155
- package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
- package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
- package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
- package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
- package/dist/collection/components/picker-legacy/picker.js +0 -890
- package/dist/collection/components/picker-legacy/picker.md.css +0 -287
- package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
- package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
- package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
- package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
- package/dist/esm/config-DQCONYYp.js +0 -195
- package/dist/esm/dir-C53feagD.js +0 -18
- package/dist/esm/input.utils-Y6NgW8bw.js +0 -147
- package/dist/esm/notch-controller-DKDjU_O7.js +0 -153
- package/dist/ionic/p-00dbb17e.entry.js +0 -4
- package/dist/ionic/p-01f81ea5.entry.js +0 -4
- package/dist/ionic/p-06c232a4.entry.js +0 -4
- package/dist/ionic/p-0d005398.entry.js +0 -4
- package/dist/ionic/p-1ae21e4c.entry.js +0 -4
- package/dist/ionic/p-20b1a044.entry.js +0 -4
- package/dist/ionic/p-21eb76d5.entry.js +0 -4
- package/dist/ionic/p-2394a9a6.entry.js +0 -4
- package/dist/ionic/p-27d30585.entry.js +0 -4
- package/dist/ionic/p-2f55dc1a.entry.js +0 -4
- package/dist/ionic/p-30bf9737.entry.js +0 -4
- package/dist/ionic/p-3353c229.entry.js +0 -4
- package/dist/ionic/p-33704f20.entry.js +0 -4
- package/dist/ionic/p-390ca786.entry.js +0 -4
- package/dist/ionic/p-3a126bca.entry.js +0 -4
- package/dist/ionic/p-3a541154.entry.js +0 -4
- package/dist/ionic/p-3a7d1e91.entry.js +0 -4
- package/dist/ionic/p-3ae5f277.entry.js +0 -4
- package/dist/ionic/p-4745f534.entry.js +0 -4
- package/dist/ionic/p-4858af1f.entry.js +0 -4
- package/dist/ionic/p-4baa5b82.entry.js +0 -4
- package/dist/ionic/p-4dc1c33c.entry.js +0 -4
- package/dist/ionic/p-4e92a11f.entry.js +0 -4
- package/dist/ionic/p-50e1194a.entry.js +0 -4
- package/dist/ionic/p-5d1da0a2.entry.js +0 -4
- package/dist/ionic/p-75dc25ba.entry.js +0 -4
- package/dist/ionic/p-81ea5652.entry.js +0 -4
- package/dist/ionic/p-84d5ce05.entry.js +0 -4
- package/dist/ionic/p-874b4bd8.entry.js +0 -4
- package/dist/ionic/p-8c8eee7d.entry.js +0 -4
- package/dist/ionic/p-8eb8ee76.entry.js +0 -4
- package/dist/ionic/p-8fce95d5.entry.js +0 -4
- package/dist/ionic/p-94f2a736.entry.js +0 -4
- package/dist/ionic/p-9a65ac7f.entry.js +0 -4
- package/dist/ionic/p-9eeaBrnk.js +0 -4
- package/dist/ionic/p-9f1103ce.entry.js +0 -4
- package/dist/ionic/p-BGqMS-oh.js +0 -4
- package/dist/ionic/p-BTEOs1at.js +0 -4
- package/dist/ionic/p-BUFIpxKM.js +0 -4
- package/dist/ionic/p-C53feagD.js +0 -4
- package/dist/ionic/p-CFlfIb2g.js +0 -4
- package/dist/ionic/p-CKvCXMs9.js +0 -4
- package/dist/ionic/p-Cl0B-RWe.js +0 -4
- package/dist/ionic/p-CtWGkNnJ.js +0 -4
- package/dist/ionic/p-CwdymDLH.js +0 -4
- package/dist/ionic/p-Cx3IXROA.js +0 -4
- package/dist/ionic/p-D13Eaw-8.js +0 -4
- package/dist/ionic/p-DAAFkPFT.js +0 -4
- package/dist/ionic/p-DC3RagnA.js +0 -4
- package/dist/ionic/p-DIuEbVLu.js +0 -4
- package/dist/ionic/p-DSG2s2Eb.js +0 -4
- package/dist/ionic/p-Dfbt-q2k.js +0 -4
- package/dist/ionic/p-DiVJyqlX.js +0 -4
- package/dist/ionic/p-DoJvtrbw.js +0 -4
- package/dist/ionic/p-DzWaWHGc.js +0 -4
- package/dist/ionic/p-Nqf6uvGh.js +0 -4
- package/dist/ionic/p-SNAkTDfm.js +0 -4
- package/dist/ionic/p-VAemlbDS.js +0 -4
- package/dist/ionic/p-Wk5HzclC.js +0 -4
- package/dist/ionic/p-a21add2f.entry.js +0 -4
- package/dist/ionic/p-a3bdcae6.entry.js +0 -4
- package/dist/ionic/p-aa5d6b8f.entry.js +0 -4
- package/dist/ionic/p-c0fb8edd.entry.js +0 -4
- package/dist/ionic/p-c4d8641b.entry.js +0 -4
- package/dist/ionic/p-e0be05c5.entry.js +0 -4
- package/dist/ionic/p-e847a888.entry.js +0 -4
- package/dist/ionic/p-ec090e0a.entry.js +0 -4
- package/dist/ionic/p-ef4c3bee.entry.js +0 -4
- package/dist/ionic/p-fabcce6c.entry.js +0 -4
- package/dist/ionic/p-facfde02.entry.js +0 -4
- package/dist/ionic/p-fd7eebc4.entry.js +0 -4
- package/dist/ionic/p-mjKAFv89.js +0 -4
- package/dist/ionic/p-tcQvqkiX.js +0 -5
- package/dist/ionic/p-viFHDgRs.js +0 -4
- package/dist/ionic/p-xOfi7-Zn.js +0 -4
- package/dist/ionic/p-xWb6fgfq.js +0 -4
- package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
- package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
- package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
- package/dist/types/components/picker-legacy/picker.d.ts +0 -158
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
- package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
- /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
|
@@ -3,24 +3,25 @@
|
|
|
3
3
|
*/
|
|
4
4
|
'use strict';
|
|
5
5
|
|
|
6
|
-
var index$3 = require('./index-
|
|
7
|
-
var index$
|
|
8
|
-
var frameworkDelegate = require('./framework-delegate-
|
|
9
|
-
var helpers = require('./helpers-
|
|
6
|
+
var index$3 = require('./index-DXoo08JC.js');
|
|
7
|
+
var index$1 = require('./index-DtvKGwdh.js');
|
|
8
|
+
var frameworkDelegate = require('./framework-delegate-d-fWfeI6.js');
|
|
9
|
+
var helpers = require('./helpers-7wzdhdeg.js');
|
|
10
10
|
var lockController = require('./lock-controller-aDB9wrEf.js');
|
|
11
11
|
var capacitor = require('./capacitor-DmA66EwP.js');
|
|
12
|
-
var overlays = require('./overlays-
|
|
13
|
-
var theme = require('./theme-
|
|
14
|
-
var index$4 = require('./index-
|
|
15
|
-
var ionicGlobal = require('./ionic-global-
|
|
16
|
-
var keyboard = require('./keyboard-
|
|
17
|
-
var animation = require('./animation-
|
|
12
|
+
var overlays = require('./overlays-BR21NUIG.js');
|
|
13
|
+
var theme = require('./theme-Bw0rpaNN.js');
|
|
14
|
+
var index$4 = require('./index-CQfEIyLK.js');
|
|
15
|
+
var ionicGlobal = require('./ionic-global-CYJNT-2P.js');
|
|
16
|
+
var keyboard = require('./keyboard-Cix5TVkD.js');
|
|
17
|
+
var animation = require('./animation-Kd1N7WTN.js');
|
|
18
18
|
var cubicBezier = require('./cubic-bezier-DAjy1V-e.js');
|
|
19
|
-
var index$
|
|
19
|
+
var index$2 = require('./index-DRPqwSvU.js');
|
|
20
20
|
var index = require('./index-DkNv4J_i.js');
|
|
21
|
-
require('./
|
|
22
|
-
require('./
|
|
23
|
-
require('./
|
|
21
|
+
require('./dir-zwDPRE5K.js');
|
|
22
|
+
require('./hardware-back-button-Bu4Dzw8l.js');
|
|
23
|
+
require('./gesture-controller-CeJslptU.js');
|
|
24
|
+
require('./keyboard-cHxZlTyz.js');
|
|
24
25
|
|
|
25
26
|
var Style;
|
|
26
27
|
(function (Style) {
|
|
@@ -31,7 +32,7 @@ var Style;
|
|
|
31
32
|
const StatusBar = {
|
|
32
33
|
getEngine() {
|
|
33
34
|
const capacitor$1 = capacitor.getCapacitor();
|
|
34
|
-
if (capacitor$1
|
|
35
|
+
if (capacitor$1?.isPluginAvailable('StatusBar')) {
|
|
35
36
|
return capacitor$1.Plugins.StatusBar;
|
|
36
37
|
}
|
|
37
38
|
return undefined;
|
|
@@ -129,6 +130,21 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
|
|
|
129
130
|
StatusBar.setStyle({ style: defaultStyle });
|
|
130
131
|
};
|
|
131
132
|
|
|
133
|
+
/**
|
|
134
|
+
* Swiping is only possible when the content is scrolled to the top, so that we
|
|
135
|
+
* do not interfere with scrolling, and never on content with a refresher.
|
|
136
|
+
*
|
|
137
|
+
* Note: We cannot solve the refresher case with gesture priority as the iOS
|
|
138
|
+
* native refresh gesture uses a scroll listener in addition to a gesture.
|
|
139
|
+
*
|
|
140
|
+
* Note: Do not use `getScrollElement` here because we need this to be a
|
|
141
|
+
* synchronous operation, and `getScrollElement` is asynchronous.
|
|
142
|
+
*/
|
|
143
|
+
const canSwipeOnContent = (contentEl) => {
|
|
144
|
+
const scrollEl = index$1.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
|
|
145
|
+
const hasRefresherInContent = !!index$1.findRefresherInContent(contentEl);
|
|
146
|
+
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
147
|
+
};
|
|
132
148
|
const handleCanDismiss = async (el, animation) => {
|
|
133
149
|
/**
|
|
134
150
|
* If canDismiss is not a function
|
|
@@ -259,12 +275,11 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
259
275
|
let isOpen = false;
|
|
260
276
|
let canDismissBlocksGesture = false;
|
|
261
277
|
let contentEl = null;
|
|
262
|
-
let scrollEl = null;
|
|
263
278
|
const canDismissMaxStep = 0.2;
|
|
264
279
|
let initialScrollY = true;
|
|
265
280
|
let lastStep = 0;
|
|
266
281
|
const getScrollY = () => {
|
|
267
|
-
if (contentEl && index$
|
|
282
|
+
if (contentEl && index$1.isIonContent(contentEl)) {
|
|
268
283
|
return contentEl.scrollY;
|
|
269
284
|
/**
|
|
270
285
|
* Custom scroll containers are intended to be
|
|
@@ -282,12 +297,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
282
297
|
return true;
|
|
283
298
|
}
|
|
284
299
|
/**
|
|
285
|
-
* If we are swiping on the content,
|
|
286
|
-
* swiping should only be possible if
|
|
287
|
-
* the content is scrolled all the way
|
|
288
|
-
* to the top so that we do not interfere
|
|
289
|
-
* with scrolling.
|
|
290
|
-
*
|
|
291
300
|
* We cannot assume that the `ion-content`
|
|
292
301
|
* target will remain consistent between
|
|
293
302
|
* swipes. For example, when using
|
|
@@ -296,31 +305,9 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
296
305
|
* swipe again. The target content will not
|
|
297
306
|
* be the same between swipes.
|
|
298
307
|
*/
|
|
299
|
-
contentEl = index$
|
|
308
|
+
contentEl = index$1.findClosestIonContent(target);
|
|
300
309
|
if (contentEl) {
|
|
301
|
-
|
|
302
|
-
* The card should never swipe to close
|
|
303
|
-
* on the content with a refresher.
|
|
304
|
-
* Note: We cannot solve this by making the
|
|
305
|
-
* swipeToClose gesture have a higher priority
|
|
306
|
-
* than the refresher gesture as the iOS native
|
|
307
|
-
* refresh gesture uses a scroll listener in
|
|
308
|
-
* addition to a gesture.
|
|
309
|
-
*
|
|
310
|
-
* Note: Do not use getScrollElement here
|
|
311
|
-
* because we need this to be a synchronous
|
|
312
|
-
* operation, and getScrollElement is
|
|
313
|
-
* asynchronous.
|
|
314
|
-
*/
|
|
315
|
-
if (index$2.isIonContent(contentEl)) {
|
|
316
|
-
const root = helpers.getElementRoot(contentEl);
|
|
317
|
-
scrollEl = root.querySelector('.inner-scroll');
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
scrollEl = contentEl;
|
|
321
|
-
}
|
|
322
|
-
const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
|
|
323
|
-
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
310
|
+
return canSwipeOnContent(contentEl);
|
|
324
311
|
}
|
|
325
312
|
/**
|
|
326
313
|
* Card should be swipeable on all
|
|
@@ -334,6 +321,12 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
334
321
|
};
|
|
335
322
|
const onStart = (detail) => {
|
|
336
323
|
const { deltaY } = detail;
|
|
324
|
+
/**
|
|
325
|
+
* Firefox automatically selects the header text during drag
|
|
326
|
+
* due to the focusable wrapper (tabindex="-1"). Remove any
|
|
327
|
+
* selection that may have occurred.
|
|
328
|
+
*/
|
|
329
|
+
window.getSelection()?.removeAllRanges();
|
|
337
330
|
/**
|
|
338
331
|
* Get the initial scrollY value so
|
|
339
332
|
* that we can correctly reset the scrollY
|
|
@@ -356,7 +349,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
356
349
|
* happen at the same time as the gesture.
|
|
357
350
|
*/
|
|
358
351
|
if (deltaY > 0 && contentEl) {
|
|
359
|
-
index$
|
|
352
|
+
index$1.disableContentScrollY(contentEl);
|
|
360
353
|
}
|
|
361
354
|
animation.progressStart(true, isOpen ? 1 : 0);
|
|
362
355
|
onDragStart();
|
|
@@ -370,7 +363,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
370
363
|
* happen at the same time as the gesture.
|
|
371
364
|
*/
|
|
372
365
|
if (deltaY > 0 && contentEl) {
|
|
373
|
-
index$
|
|
366
|
+
index$1.disableContentScrollY(contentEl);
|
|
374
367
|
}
|
|
375
368
|
/**
|
|
376
369
|
* If we are swiping on the content
|
|
@@ -465,7 +458,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
465
458
|
isOpen = shouldComplete;
|
|
466
459
|
gesture.enable(false);
|
|
467
460
|
if (contentEl) {
|
|
468
|
-
index$
|
|
461
|
+
index$1.resetContentScrollY(contentEl, initialScrollY);
|
|
469
462
|
}
|
|
470
463
|
animation
|
|
471
464
|
.onFinish(() => {
|
|
@@ -486,22 +479,35 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
486
479
|
* check canDismiss. 25% was chosen
|
|
487
480
|
* to avoid accidental swipes.
|
|
488
481
|
*/
|
|
489
|
-
|
|
482
|
+
const isAttemptingCanDismiss = isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4;
|
|
483
|
+
if (isAttemptingCanDismiss) {
|
|
490
484
|
handleCanDismiss(el, animation);
|
|
491
485
|
}
|
|
492
486
|
else if (shouldComplete) {
|
|
493
487
|
onDismiss();
|
|
494
488
|
}
|
|
489
|
+
/**
|
|
490
|
+
* `shouldComplete` is not enough on its own, since it is always `false`
|
|
491
|
+
* when canDismiss blocks the gesture. `canDismiss: false` blocks it and
|
|
492
|
+
* never dismisses, because `handleCanDismiss` returns early when
|
|
493
|
+
* canDismiss is not a function. A canDismiss function dismisses through
|
|
494
|
+
* `handleCanDismiss`, which awaits the callback, so the outcome is not
|
|
495
|
+
* known when this event is emitted.
|
|
496
|
+
*/
|
|
497
|
+
const isDismissing = isAttemptingDismissWithCanDismiss
|
|
498
|
+
? isAttemptingCanDismiss && typeof el.canDismiss === 'function'
|
|
499
|
+
: shouldComplete;
|
|
495
500
|
const eventDetail = {
|
|
496
501
|
currentY: detail.currentY,
|
|
497
502
|
deltaY: detail.deltaY,
|
|
498
503
|
velocityY: detail.velocityY,
|
|
499
504
|
progress: calculateProgress(el, detail.deltaY),
|
|
505
|
+
isDismissing,
|
|
500
506
|
snapBreakpoint: shouldComplete ? 0 : 1,
|
|
501
507
|
};
|
|
502
508
|
onDragEnd(eventDetail);
|
|
503
509
|
};
|
|
504
|
-
const gesture = index$
|
|
510
|
+
const gesture = index$2.createGesture({
|
|
505
511
|
el,
|
|
506
512
|
gestureName: 'modalSwipeToClose',
|
|
507
513
|
gesturePriority: overlays.OVERLAY_GESTURE_PRIORITY,
|
|
@@ -634,7 +640,7 @@ const iosEnterAnimation = (baseEl, opts) => {
|
|
|
634
640
|
wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
|
|
635
641
|
// The content animation is only added if scrolling is enabled for
|
|
636
642
|
// all the breakpoints.
|
|
637
|
-
!expandToScroll &&
|
|
643
|
+
!expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
|
|
638
644
|
const baseAnimation = animation.createAnimation('entering-base')
|
|
639
645
|
.addElement(baseEl)
|
|
640
646
|
.easing('cubic-bezier(0.32,0.72,0,1)')
|
|
@@ -967,7 +973,7 @@ const mdEnterAnimation = (baseEl, opts) => {
|
|
|
967
973
|
wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
|
|
968
974
|
// The content animation is only added if scrolling is enabled for
|
|
969
975
|
// all the breakpoints.
|
|
970
|
-
!expandToScroll &&
|
|
976
|
+
!expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
|
|
971
977
|
const baseAnimation = animation.createAnimation()
|
|
972
978
|
.addElement(baseEl)
|
|
973
979
|
.easing('cubic-bezier(0.36,0.66,0.04,1)')
|
|
@@ -1026,6 +1032,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1026
1032
|
],
|
|
1027
1033
|
};
|
|
1028
1034
|
const contentEl = baseEl.querySelector('ion-content');
|
|
1035
|
+
// Cache the initial value so the gesture restores it instead of forcing scrolling on.
|
|
1036
|
+
const initialContentScrollY = contentEl?.scrollY ?? true;
|
|
1029
1037
|
const height = wrapperEl.clientHeight;
|
|
1030
1038
|
let currentBreakpoint = initialBreakpoint;
|
|
1031
1039
|
let offset = 0;
|
|
@@ -1091,9 +1099,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1091
1099
|
cachedFooterEl.style.removeProperty('height');
|
|
1092
1100
|
cachedFooterEl.style.removeProperty('top');
|
|
1093
1101
|
cachedFooterEl.style.removeProperty('left');
|
|
1094
|
-
page
|
|
1102
|
+
page?.style.removeProperty('padding-bottom');
|
|
1095
1103
|
// Move to page
|
|
1096
|
-
page
|
|
1104
|
+
page?.appendChild(cachedFooterEl);
|
|
1097
1105
|
});
|
|
1098
1106
|
}
|
|
1099
1107
|
else {
|
|
@@ -1137,7 +1145,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1137
1145
|
// when the footer is positioned absolutely. This has to be done before we
|
|
1138
1146
|
// make the footer absolutely positioned or we may accidentally cause the
|
|
1139
1147
|
// sheet to scroll.
|
|
1140
|
-
page
|
|
1148
|
+
page?.style.setProperty('padding-bottom', `${footerHeights}px`);
|
|
1141
1149
|
// Apply positioning styles to keep footer at bottom
|
|
1142
1150
|
cachedFooterEl.classList.add('modal-footer-moving');
|
|
1143
1151
|
// Apply our preserved styles to pin the footer
|
|
@@ -1162,7 +1170,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1162
1170
|
if (wrapperAnimation && backdropAnimation) {
|
|
1163
1171
|
wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
|
|
1164
1172
|
backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
|
|
1165
|
-
contentAnimation
|
|
1173
|
+
contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
|
|
1166
1174
|
animation.progressStart(true, 1 - currentBreakpoint);
|
|
1167
1175
|
/**
|
|
1168
1176
|
* If backdrop is not enabled, then content
|
|
@@ -1186,40 +1194,28 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1186
1194
|
}
|
|
1187
1195
|
const canStart = (detail) => {
|
|
1188
1196
|
/**
|
|
1189
|
-
* If we are swiping on the content, swiping should only be possible if the content
|
|
1190
|
-
* is scrolled all the way to the top so that we do not interfere with scrolling.
|
|
1191
|
-
*
|
|
1192
1197
|
* We cannot assume that the `ion-content` target will remain consistent between swipes.
|
|
1193
1198
|
* For example, when using ion-nav within a modal it is possible to swipe, push a view,
|
|
1194
1199
|
* and then swipe again. The target content will not be the same between swipes.
|
|
1195
1200
|
*/
|
|
1196
|
-
const contentEl = index$
|
|
1201
|
+
const contentEl = index$1.findClosestIonContent(detail.event.target);
|
|
1197
1202
|
currentBreakpoint = getCurrentBreakpoint();
|
|
1198
1203
|
/**
|
|
1199
|
-
*
|
|
1200
|
-
*
|
|
1204
|
+
* Upwards swipes on the content cannot move the sheet anyway, so this only
|
|
1205
|
+
* blocks swiping the sheet down from the content.
|
|
1201
1206
|
*/
|
|
1202
|
-
if (!expandToScroll
|
|
1203
|
-
|
|
1204
|
-
return scrollEl.scrollTop === 0;
|
|
1205
|
-
}
|
|
1206
|
-
if (currentBreakpoint === 1 && contentEl) {
|
|
1207
|
-
/**
|
|
1208
|
-
* The modal should never swipe to close on the content with a refresher.
|
|
1209
|
-
* Note 1: We cannot solve this by making this gesture have a higher priority than
|
|
1210
|
-
* the refresher gesture as the iOS native refresh gesture uses a scroll listener in
|
|
1211
|
-
* addition to a gesture.
|
|
1212
|
-
*
|
|
1213
|
-
* Note 2: Do not use getScrollElement here because we need this to be a synchronous
|
|
1214
|
-
* operation, and getScrollElement is asynchronous.
|
|
1215
|
-
*/
|
|
1216
|
-
const scrollEl = index$2.isIonContent(contentEl) ? helpers.getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
|
|
1217
|
-
const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
|
|
1218
|
-
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
1207
|
+
if (contentEl && (!expandToScroll || currentBreakpoint === 1)) {
|
|
1208
|
+
return canSwipeOnContent(contentEl);
|
|
1219
1209
|
}
|
|
1220
1210
|
return true;
|
|
1221
1211
|
};
|
|
1222
1212
|
const onStart = (detail) => {
|
|
1213
|
+
/**
|
|
1214
|
+
* Firefox automatically selects the header text during drag
|
|
1215
|
+
* due to the focusable wrapper (tabindex="-1"). Remove any
|
|
1216
|
+
* selection that may have occurred.
|
|
1217
|
+
*/
|
|
1218
|
+
window.getSelection()?.removeAllRanges();
|
|
1223
1219
|
/**
|
|
1224
1220
|
* If canDismiss is anything other than `true`
|
|
1225
1221
|
* then users should be able to swipe down
|
|
@@ -1239,9 +1235,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1239
1235
|
* which would impact performance significantly.
|
|
1240
1236
|
*/
|
|
1241
1237
|
if (!expandToScroll) {
|
|
1242
|
-
const targetEl = index$
|
|
1238
|
+
const targetEl = index$1.findClosestIonContent(detail.event.target);
|
|
1243
1239
|
cachedScrollEl =
|
|
1244
|
-
targetEl && index$
|
|
1240
|
+
targetEl && index$1.isIonContent(targetEl) ? helpers.getElementRoot(targetEl).querySelector('.inner-scroll') : targetEl;
|
|
1245
1241
|
}
|
|
1246
1242
|
/**
|
|
1247
1243
|
* If expandToScroll is disabled, we need to swap
|
|
@@ -1347,12 +1343,22 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1347
1343
|
};
|
|
1348
1344
|
const onEnd = (detail) => {
|
|
1349
1345
|
const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
|
|
1346
|
+
/**
|
|
1347
|
+
* `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
|
|
1348
|
+
* snaps to 0 but never dismisses, since `handleCanDismiss` returns early
|
|
1349
|
+
* when canDismiss is not a function. A canDismiss function dismisses
|
|
1350
|
+
* through `handleCanDismiss`, which awaits the callback, so the outcome
|
|
1351
|
+
* is not known when this event is emitted.
|
|
1352
|
+
*/
|
|
1353
|
+
const shouldPreventDismiss = canDismissBlocksGesture && snapBreakpoint === 0;
|
|
1354
|
+
const isDismissing = shouldPreventDismiss ? typeof baseEl.canDismiss === 'function' : snapBreakpoint === 0;
|
|
1350
1355
|
const eventDetail = {
|
|
1351
1356
|
currentY: detail.currentY,
|
|
1352
1357
|
deltaY: detail.deltaY,
|
|
1353
1358
|
velocityY: detail.velocityY,
|
|
1354
1359
|
progress: calculateProgress(detail.currentY),
|
|
1355
1360
|
snapBreakpoint,
|
|
1361
|
+
isDismissing,
|
|
1356
1362
|
};
|
|
1357
1363
|
/**
|
|
1358
1364
|
* If expandToScroll is disabled, we should not allow the moveSheetToBreakpoint
|
|
@@ -1368,7 +1374,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1368
1374
|
* swap to moving on drag and if we don't swap back here then the footer will get stuck.
|
|
1369
1375
|
*/
|
|
1370
1376
|
swapFooterPosition('stationary');
|
|
1371
|
-
|
|
1377
|
+
/**
|
|
1378
|
+
* The sheet does not move in this case, so the gesture
|
|
1379
|
+
* never dismisses the modal.
|
|
1380
|
+
*/
|
|
1381
|
+
onDragEnd({ ...eventDetail, isDismissing: false });
|
|
1372
1382
|
return;
|
|
1373
1383
|
}
|
|
1374
1384
|
moveSheetToBreakpoint({
|
|
@@ -1441,14 +1451,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1441
1451
|
onDismiss();
|
|
1442
1452
|
}
|
|
1443
1453
|
/**
|
|
1444
|
-
*
|
|
1445
|
-
* or if it allows scrolling at any breakpoint. Without this, there would
|
|
1454
|
+
* Restores the content's scroll setting immediately if the sheet is about to
|
|
1455
|
+
* fully expand or if it allows scrolling at any breakpoint. Without this, there would
|
|
1446
1456
|
* be a ~500ms delay while the modal animation completes, causing a
|
|
1447
1457
|
* noticeable lag. Native iOS allows scrolling as soon as the gesture is
|
|
1448
1458
|
* released, so we align with that behavior.
|
|
1449
1459
|
*/
|
|
1450
1460
|
if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
|
|
1451
|
-
contentEl.scrollY =
|
|
1461
|
+
contentEl.scrollY = initialContentScrollY;
|
|
1452
1462
|
}
|
|
1453
1463
|
/**
|
|
1454
1464
|
* If expandToScroll is disabled and we're animating
|
|
@@ -1483,7 +1493,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1483
1493
|
helpers.raf(() => {
|
|
1484
1494
|
wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
|
|
1485
1495
|
backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
|
|
1486
|
-
contentAnimation
|
|
1496
|
+
contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
|
|
1487
1497
|
animation.progressStart(true, 1 - snapToBreakpoint);
|
|
1488
1498
|
currentBreakpoint = snapToBreakpoint;
|
|
1489
1499
|
onBreakpointChange(currentBreakpoint);
|
|
@@ -1619,7 +1629,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1619
1629
|
*/
|
|
1620
1630
|
return viewportBottom - activeHeight;
|
|
1621
1631
|
};
|
|
1622
|
-
const gesture = index$
|
|
1632
|
+
const gesture = index$2.createGesture({
|
|
1623
1633
|
el: wrapperEl,
|
|
1624
1634
|
gestureName: 'modalSheet',
|
|
1625
1635
|
gesturePriority: 40,
|
|
@@ -1630,9 +1640,20 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1630
1640
|
onMove,
|
|
1631
1641
|
onEnd,
|
|
1632
1642
|
});
|
|
1643
|
+
/**
|
|
1644
|
+
* Puts the content back the way the app declared it. A sheet can dismiss
|
|
1645
|
+
* without going through moveSheetToBreakpoint, and an inline modal reuses
|
|
1646
|
+
* the same element on the next present.
|
|
1647
|
+
*/
|
|
1648
|
+
const resetContentScroll = () => {
|
|
1649
|
+
if (contentEl) {
|
|
1650
|
+
contentEl.scrollY = initialContentScrollY;
|
|
1651
|
+
}
|
|
1652
|
+
};
|
|
1633
1653
|
return {
|
|
1634
1654
|
gesture,
|
|
1635
1655
|
moveSheetToBreakpoint,
|
|
1656
|
+
resetContentScroll,
|
|
1636
1657
|
};
|
|
1637
1658
|
};
|
|
1638
1659
|
|
|
@@ -1682,8 +1703,8 @@ const getRootSafeAreaTop = () => {
|
|
|
1682
1703
|
if (cachedRootSafeAreaTop !== null) {
|
|
1683
1704
|
return cachedRootSafeAreaTop;
|
|
1684
1705
|
}
|
|
1685
|
-
const doc = index.win
|
|
1686
|
-
if (!
|
|
1706
|
+
const doc = index.win?.document;
|
|
1707
|
+
if (!doc?.body) {
|
|
1687
1708
|
return 0;
|
|
1688
1709
|
}
|
|
1689
1710
|
const el = doc.createElement('div');
|
|
@@ -1702,6 +1723,41 @@ const getRootSafeAreaTop = () => {
|
|
|
1702
1723
|
}
|
|
1703
1724
|
return value;
|
|
1704
1725
|
};
|
|
1726
|
+
/**
|
|
1727
|
+
* Calls back when the resolved root `--ion-safe-area-top` changes, which no
|
|
1728
|
+
* event and no window resize covers. The probe's height tracks the variable, so
|
|
1729
|
+
* a change to it becomes a size change the observer can see.
|
|
1730
|
+
*/
|
|
1731
|
+
const onRootSafeAreaTopChange = (callback) => {
|
|
1732
|
+
const doc = index.win?.document;
|
|
1733
|
+
if (!doc?.body || typeof ResizeObserver === 'undefined') {
|
|
1734
|
+
return () => undefined;
|
|
1735
|
+
}
|
|
1736
|
+
const probe = doc.createElement('div');
|
|
1737
|
+
probe.style.cssText =
|
|
1738
|
+
'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
|
|
1739
|
+
'height:var(--ion-safe-area-top,0px);';
|
|
1740
|
+
doc.body.appendChild(probe);
|
|
1741
|
+
/**
|
|
1742
|
+
* Seeded with the value the caller has already applied, so a change that
|
|
1743
|
+
* lands before the observer's first delivery still gets reported. Comparing
|
|
1744
|
+
* against an unset value instead would consume that first delivery and treat
|
|
1745
|
+
* the new inset as the baseline.
|
|
1746
|
+
*/
|
|
1747
|
+
let lastHeight = getRootSafeAreaTop();
|
|
1748
|
+
const observer = new ResizeObserver((entries) => {
|
|
1749
|
+
const { height } = entries[0].contentRect;
|
|
1750
|
+
if (height !== lastHeight) {
|
|
1751
|
+
lastHeight = height;
|
|
1752
|
+
callback(height);
|
|
1753
|
+
}
|
|
1754
|
+
});
|
|
1755
|
+
observer.observe(probe);
|
|
1756
|
+
return () => {
|
|
1757
|
+
observer.disconnect();
|
|
1758
|
+
probe.remove();
|
|
1759
|
+
};
|
|
1760
|
+
};
|
|
1705
1761
|
/**
|
|
1706
1762
|
* True when the modal host declares BOTH a non-fullscreen `--width` AND a
|
|
1707
1763
|
* non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
|
|
@@ -1786,10 +1842,9 @@ const getInitialSafeAreaConfig = (context) => {
|
|
|
1786
1842
|
* @returns SafeAreaConfig based on position
|
|
1787
1843
|
*/
|
|
1788
1844
|
const getPositionBasedSafeAreaConfig = (wrapperEl) => {
|
|
1789
|
-
var _a, _b;
|
|
1790
1845
|
const rect = wrapperEl.getBoundingClientRect();
|
|
1791
|
-
const vh =
|
|
1792
|
-
const vw =
|
|
1846
|
+
const vh = index.win?.innerHeight ?? 0;
|
|
1847
|
+
const vw = index.win?.innerWidth ?? 0;
|
|
1793
1848
|
// Only apply safe-area to sides where modal overlaps with screen edge
|
|
1794
1849
|
return {
|
|
1795
1850
|
top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
|
|
@@ -1822,9 +1877,9 @@ const clearSafeAreaOverrides = (hostEl) => {
|
|
|
1822
1877
|
hostEl.style.removeProperty('--ion-safe-area-right');
|
|
1823
1878
|
};
|
|
1824
1879
|
|
|
1825
|
-
const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-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
|
+
const modalIosCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{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}`;
|
|
1826
1881
|
|
|
1827
|
-
const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-shadow{position:absolute;background:transparent}@media only screen and (min-width: 768px) and (min-height: 600px){:host{--width:600px;--height:500px}}@media only screen and (min-width: 768px) and (min-height: 768px){:host{--width:600px;--height:600px}}.modal-handle{left:0px;right:0px;top:5px;border-radius:8px;-webkit-margin-start:auto;margin-inline-start:auto;-webkit-margin-end:auto;margin-inline-end:auto;position:absolute;width:36px;height:5px;-webkit-transform:translateZ(0);transform:translateZ(0);border:0;background:var(--ion-color-step-350, var(--ion-background-color-step-350, #c0c0be));cursor:pointer;z-index:11}.modal-handle::before{-webkit-padding-start:4px;padding-inline-start:4px;-webkit-padding-end:4px;padding-inline-end:4px;padding-top:4px;padding-bottom:4px;position:absolute;width:36px;height:5px;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);content:""}:host(.modal-sheet){--height:calc(100% - (var(--ion-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
|
+
const modalMdCss = () => `:host{--width:100%;--min-width:auto;--max-width:auto;--height:100%;--min-height:auto;--max-height:auto;--overflow:hidden;--border-radius:0;--border-width:0;--border-style:none;--border-color:transparent;--background:var(--ion-background-color, #fff);--box-shadow:none;--backdrop-opacity:0;left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;outline:none;color:var(--ion-text-color, #000);contain:strict}.modal-wrapper,ion-backdrop{pointer-events:auto}:host(.overlay-hidden){display:none}.modal-wrapper,.modal-shadow{border-radius:var(--border-radius);width:var(--width);min-width:var(--min-width);max-width:var(--max-width);height:var(--height);min-height:var(--min-height);max-height:var(--max-height);border-width:var(--border-width);border-style:var(--border-style);border-color:var(--border-color);background:var(--background);-webkit-box-shadow:var(--box-shadow);box-shadow:var(--box-shadow);overflow:var(--overflow);z-index:10}.modal-wrapper{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}`;
|
|
1828
1883
|
|
|
1829
1884
|
const Modal = class {
|
|
1830
1885
|
constructor(hostRef) {
|
|
@@ -1850,6 +1905,9 @@ const Modal = class {
|
|
|
1850
1905
|
this.inline = false;
|
|
1851
1906
|
// Whether or not modal is being dismissed via gesture
|
|
1852
1907
|
this.gestureAnimationDismissing = false;
|
|
1908
|
+
// True from the first safe-area write in `present()` until the enter
|
|
1909
|
+
// animation settles. A position-based read in that window is not the rest position.
|
|
1910
|
+
this.isPresenting = false;
|
|
1853
1911
|
this.presented = false;
|
|
1854
1912
|
/** @internal */
|
|
1855
1913
|
this.hasController = false;
|
|
@@ -1884,13 +1942,20 @@ const Modal = class {
|
|
|
1884
1942
|
/**
|
|
1885
1943
|
* The interaction behavior for the sheet modal when the handle is pressed.
|
|
1886
1944
|
*
|
|
1887
|
-
*
|
|
1888
|
-
*
|
|
1945
|
+
* Handle behavior is unavailable when the `handle` property is set to
|
|
1946
|
+
* `false` or when the `breakpoints` property is not set (using a
|
|
1947
|
+
* fullscreen or card modal).
|
|
1948
|
+
*
|
|
1949
|
+
* Set to `"cycle"` to make the handle focusable and let the sheet modal
|
|
1950
|
+
* cycle between available breakpoints when pressed. This keeps the sheet
|
|
1951
|
+
* operable with assistive technology.
|
|
1889
1952
|
*
|
|
1890
|
-
*
|
|
1891
|
-
*
|
|
1953
|
+
* Set to `"none"` to make the handle purely decorative when pressed and
|
|
1954
|
+
* removed from the tab order.
|
|
1955
|
+
*
|
|
1956
|
+
* Defaults to `"cycle"`.
|
|
1892
1957
|
*/
|
|
1893
|
-
this.handleBehavior = '
|
|
1958
|
+
this.handleBehavior = 'cycle';
|
|
1894
1959
|
/**
|
|
1895
1960
|
* If `true`, the modal will be dismissed when the backdrop is clicked.
|
|
1896
1961
|
*/
|
|
@@ -1999,8 +2064,13 @@ const Modal = class {
|
|
|
1999
2064
|
*/
|
|
2000
2065
|
this.onModalFocus = (ev) => {
|
|
2001
2066
|
const { dragHandleEl, el } = this;
|
|
2002
|
-
|
|
2003
|
-
|
|
2067
|
+
/**
|
|
2068
|
+
* Shadow DOM focus is retargeted to the host, so `ev.target === el` is also
|
|
2069
|
+
* true when a shadow child (the dialog wrapper present() focuses) is focused.
|
|
2070
|
+
* shadowRoot's activeElement is null only when the host was focused directly,
|
|
2071
|
+
* so redirect to the handle only then and leave present()'s wrapper focus intact.
|
|
2072
|
+
*/
|
|
2073
|
+
if (ev.target === el && el.shadowRoot?.activeElement == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
|
|
2004
2074
|
dragHandleEl.focus();
|
|
2005
2075
|
}
|
|
2006
2076
|
};
|
|
@@ -2074,6 +2144,17 @@ const Modal = class {
|
|
|
2074
2144
|
const { el } = this;
|
|
2075
2145
|
overlays.prepareOverlay(el);
|
|
2076
2146
|
this.triggerChanged();
|
|
2147
|
+
// A disconnect tears down state this presentation still needs and cannot
|
|
2148
|
+
// tell a re-insert from a removal, so put it back.
|
|
2149
|
+
if (this.presented || this.isPresenting) {
|
|
2150
|
+
this.restoreSafeAreaOverrides();
|
|
2151
|
+
}
|
|
2152
|
+
// A relocation from `willPresent` reaches these before `present()` has
|
|
2153
|
+
// applied the lock, so they apply it instead. Both are idempotent.
|
|
2154
|
+
if (this.presented) {
|
|
2155
|
+
overlays.restoreRootFocusTrapAccessibility(el);
|
|
2156
|
+
this.initParentRemovalObserver();
|
|
2157
|
+
}
|
|
2077
2158
|
}
|
|
2078
2159
|
disconnectedCallback() {
|
|
2079
2160
|
this.triggerController.removeClickListener();
|
|
@@ -2082,9 +2163,12 @@ const Modal = class {
|
|
|
2082
2163
|
// Also called in dismiss() — intentional dual cleanup covers both
|
|
2083
2164
|
// dismiss-then-remove and direct DOM removal without dismiss.
|
|
2084
2165
|
this.cleanupSafeAreaOverrides();
|
|
2166
|
+
// Clean up aria-hidden if removed without dismiss() being called
|
|
2167
|
+
if (this.presented) {
|
|
2168
|
+
overlays.cleanupRootFocusTrapAccessibility();
|
|
2169
|
+
}
|
|
2085
2170
|
}
|
|
2086
2171
|
componentWillLoad() {
|
|
2087
|
-
var _a;
|
|
2088
2172
|
const { breakpoints, initialBreakpoint, el, htmlAttributes } = this;
|
|
2089
2173
|
const isSheetModal = (this.isSheetModal = breakpoints !== undefined && initialBreakpoint !== undefined);
|
|
2090
2174
|
const attributesToInherit = ['aria-label', 'role'];
|
|
@@ -2119,7 +2203,10 @@ const Modal = class {
|
|
|
2119
2203
|
* htmlAttributes wins, but that's not a pattern that we recommend.
|
|
2120
2204
|
* The only time you'd need htmlAttributes is when using modalController.
|
|
2121
2205
|
*/
|
|
2122
|
-
this.inheritedAttributes =
|
|
2206
|
+
this.inheritedAttributes = {
|
|
2207
|
+
...this.inheritedAttributes,
|
|
2208
|
+
[attribute]: htmlAttributes[attribute],
|
|
2209
|
+
};
|
|
2123
2210
|
delete htmlAttributes[attribute];
|
|
2124
2211
|
}
|
|
2125
2212
|
});
|
|
@@ -2130,7 +2217,7 @@ const Modal = class {
|
|
|
2130
2217
|
if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
|
|
2131
2218
|
index$3.printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
|
|
2132
2219
|
}
|
|
2133
|
-
if (!
|
|
2220
|
+
if (!this.htmlAttributes?.id) {
|
|
2134
2221
|
overlays.setOverlayId(this.el);
|
|
2135
2222
|
}
|
|
2136
2223
|
}
|
|
@@ -2245,25 +2332,33 @@ const Modal = class {
|
|
|
2245
2332
|
// Recalculate isSheetModal before safe-area setup because framework
|
|
2246
2333
|
// bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
|
|
2247
2334
|
this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
2248
|
-
|
|
2249
|
-
this.setInitialSafeAreaOverrides();
|
|
2335
|
+
this.isPresenting = true;
|
|
2250
2336
|
const hasCardModal = presentingElement !== undefined;
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2337
|
+
// Wrapped so a throw cannot strand `isPresenting`, which would suppress
|
|
2338
|
+
// the position-based correction for the life of this instance.
|
|
2339
|
+
try {
|
|
2340
|
+
// Set initial safe-area overrides before animation
|
|
2341
|
+
this.setInitialSafeAreaOverrides();
|
|
2342
|
+
/**
|
|
2343
|
+
* We need to change the status bar at the
|
|
2344
|
+
* start of the animation so that it completes
|
|
2345
|
+
* by the time the card animation is done.
|
|
2346
|
+
*/
|
|
2347
|
+
if (hasCardModal && ionicGlobal.getIonMode(this) === 'ios') {
|
|
2348
|
+
// Cache the original status bar color before the modal is presented
|
|
2349
|
+
this.statusBarStyle = await StatusBar.getStyle();
|
|
2350
|
+
setCardStatusBarDark();
|
|
2351
|
+
}
|
|
2352
|
+
await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
2353
|
+
presentingEl: presentingElement,
|
|
2354
|
+
currentBreakpoint: this.initialBreakpoint,
|
|
2355
|
+
backdropBreakpoint: this.backdropBreakpoint,
|
|
2356
|
+
expandToScroll: this.expandToScroll,
|
|
2357
|
+
});
|
|
2358
|
+
}
|
|
2359
|
+
finally {
|
|
2360
|
+
this.isPresenting = false;
|
|
2260
2361
|
}
|
|
2261
|
-
await overlays.present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
2262
|
-
presentingEl: presentingElement,
|
|
2263
|
-
currentBreakpoint: this.initialBreakpoint,
|
|
2264
|
-
backdropBreakpoint: this.backdropBreakpoint,
|
|
2265
|
-
expandToScroll: this.expandToScroll,
|
|
2266
|
-
});
|
|
2267
2362
|
// Update safe-area based on actual position after animation
|
|
2268
2363
|
this.updateSafeAreaOverrides();
|
|
2269
2364
|
// Apply fullscreen safe-area padding if needed
|
|
@@ -2312,7 +2407,6 @@ const Modal = class {
|
|
|
2312
2407
|
unlock();
|
|
2313
2408
|
}
|
|
2314
2409
|
initSwipeToClose() {
|
|
2315
|
-
var _a;
|
|
2316
2410
|
if (ionicGlobal.getIonMode(this) !== 'ios') {
|
|
2317
2411
|
return;
|
|
2318
2412
|
}
|
|
@@ -2325,12 +2419,12 @@ const Modal = class {
|
|
|
2325
2419
|
presentingEl: this.presentingElement,
|
|
2326
2420
|
expandToScroll: this.expandToScroll,
|
|
2327
2421
|
}));
|
|
2328
|
-
const contentEl = index$
|
|
2422
|
+
const contentEl = index$1.findIonContent(el);
|
|
2329
2423
|
if (!contentEl) {
|
|
2330
|
-
index$
|
|
2424
|
+
index$1.printIonContentErrorMsg(el);
|
|
2331
2425
|
return;
|
|
2332
2426
|
}
|
|
2333
|
-
const statusBarStyle =
|
|
2427
|
+
const statusBarStyle = this.statusBarStyle ?? Style.Default;
|
|
2334
2428
|
this.gesture = createSwipeToCloseGesture(el, ani, statusBarStyle, () => this.cardOnDismiss(), () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
|
|
2335
2429
|
this.gesture.enable(true);
|
|
2336
2430
|
}
|
|
@@ -2347,7 +2441,7 @@ const Modal = class {
|
|
|
2347
2441
|
expandToScroll: this.expandToScroll,
|
|
2348
2442
|
}));
|
|
2349
2443
|
ani.progressStart(true, 1);
|
|
2350
|
-
const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () =>
|
|
2444
|
+
const { gesture, moveSheetToBreakpoint, resetContentScroll } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => this.currentBreakpoint ?? 0, () => this.sheetOnDismiss(), (breakpoint) => {
|
|
2351
2445
|
if (this.currentBreakpoint !== breakpoint) {
|
|
2352
2446
|
this.currentBreakpoint = breakpoint;
|
|
2353
2447
|
this.ionBreakpointDidChange.emit({ breakpoint });
|
|
@@ -2355,6 +2449,7 @@ const Modal = class {
|
|
|
2355
2449
|
}, () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
|
|
2356
2450
|
this.gesture = gesture;
|
|
2357
2451
|
this.moveSheetToBreakpoint = moveSheetToBreakpoint;
|
|
2452
|
+
this.resetSheetContentScroll = resetContentScroll;
|
|
2358
2453
|
this.gesture.enable(true);
|
|
2359
2454
|
/**
|
|
2360
2455
|
* When backdrop interaction is allowed, nested router outlets from child routes
|
|
@@ -2372,7 +2467,6 @@ const Modal = class {
|
|
|
2372
2467
|
* passthrough on child route page wrappers and nested router outlets.
|
|
2373
2468
|
*/
|
|
2374
2469
|
setupChildRoutePassthrough() {
|
|
2375
|
-
var _a;
|
|
2376
2470
|
// Cache the page parent for cleanup
|
|
2377
2471
|
this.cachedPageParent = this.getOriginalPageParent();
|
|
2378
2472
|
const pageParent = this.cachedPageParent;
|
|
@@ -2380,14 +2474,11 @@ const Modal = class {
|
|
|
2380
2474
|
if (!pageParent || pageParent.tagName === 'ION-APP') {
|
|
2381
2475
|
return;
|
|
2382
2476
|
}
|
|
2383
|
-
const hasVisibleContent = Array.from(pageParent.children).some((child) =>
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
|
|
2387
|
-
|
|
2388
|
-
child.tagName !== 'SLOT' &&
|
|
2389
|
-
!(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
|
|
2390
|
-
});
|
|
2477
|
+
const hasVisibleContent = Array.from(pageParent.children).some((child) => child !== this.el &&
|
|
2478
|
+
!(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
|
|
2479
|
+
child.tagName !== 'TEMPLATE' &&
|
|
2480
|
+
child.tagName !== 'SLOT' &&
|
|
2481
|
+
!(child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()));
|
|
2391
2482
|
if (hasVisibleContent) {
|
|
2392
2483
|
return;
|
|
2393
2484
|
}
|
|
@@ -2395,7 +2486,7 @@ const Modal = class {
|
|
|
2395
2486
|
pageParent.classList.add('ion-page-overlay-passthrough');
|
|
2396
2487
|
// Also make nested router outlets passthrough
|
|
2397
2488
|
const routerOutlet = pageParent.parentElement;
|
|
2398
|
-
if (
|
|
2489
|
+
if (routerOutlet?.tagName === 'ION-ROUTER-OUTLET' && routerOutlet.parentElement?.tagName !== 'ION-APP') {
|
|
2399
2490
|
routerOutlet.style.setProperty('pointer-events', 'none');
|
|
2400
2491
|
routerOutlet.setAttribute('data-overlay-passthrough', 'true');
|
|
2401
2492
|
}
|
|
@@ -2423,7 +2514,7 @@ const Modal = class {
|
|
|
2423
2514
|
}
|
|
2424
2515
|
pageParent.classList.remove('ion-page-overlay-passthrough');
|
|
2425
2516
|
const routerOutlet = pageParent.parentElement;
|
|
2426
|
-
if (routerOutlet
|
|
2517
|
+
if (routerOutlet?.hasAttribute('data-overlay-passthrough')) {
|
|
2427
2518
|
routerOutlet.style.removeProperty('pointer-events');
|
|
2428
2519
|
routerOutlet.removeAttribute('data-overlay-passthrough');
|
|
2429
2520
|
}
|
|
@@ -2486,7 +2577,6 @@ const Modal = class {
|
|
|
2486
2577
|
* For example, `cancel` or `backdrop`.
|
|
2487
2578
|
*/
|
|
2488
2579
|
async dismiss(data, role) {
|
|
2489
|
-
var _a;
|
|
2490
2580
|
if (this.gestureAnimationDismissing && role !== overlays.GESTURE) {
|
|
2491
2581
|
return false;
|
|
2492
2582
|
}
|
|
@@ -2531,7 +2621,7 @@ const Modal = class {
|
|
|
2531
2621
|
}
|
|
2532
2622
|
const dismissed = await overlays.dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
|
|
2533
2623
|
presentingEl: presentingElement,
|
|
2534
|
-
currentBreakpoint:
|
|
2624
|
+
currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
|
|
2535
2625
|
backdropBreakpoint: this.backdropBreakpoint,
|
|
2536
2626
|
expandToScroll: this.expandToScroll,
|
|
2537
2627
|
});
|
|
@@ -2545,6 +2635,13 @@ const Modal = class {
|
|
|
2545
2635
|
if (this.gesture) {
|
|
2546
2636
|
this.gesture.destroy();
|
|
2547
2637
|
}
|
|
2638
|
+
/**
|
|
2639
|
+
* The sheet gesture turns content scrolling off while the sheet sits below
|
|
2640
|
+
* the top breakpoint. Inline modals reuse the same content on the next
|
|
2641
|
+
* present, so hand it back before the gesture goes away.
|
|
2642
|
+
*/
|
|
2643
|
+
this.resetSheetContentScroll?.();
|
|
2644
|
+
this.resetSheetContentScroll = undefined;
|
|
2548
2645
|
this.cleanupViewTransitionListener();
|
|
2549
2646
|
this.cleanupParentRemovalObserver();
|
|
2550
2647
|
this.cleanupSafeAreaOverrides();
|
|
@@ -2719,7 +2816,7 @@ const Modal = class {
|
|
|
2719
2816
|
wrapperEl.style.transform = 'translateY(0vh)';
|
|
2720
2817
|
wrapperEl.style.opacity = '1';
|
|
2721
2818
|
}
|
|
2722
|
-
if (
|
|
2819
|
+
if (presentingElement?.tagName === 'ION-MODAL') {
|
|
2723
2820
|
const isPortrait = window.innerWidth < 768;
|
|
2724
2821
|
if (isPortrait) {
|
|
2725
2822
|
const transformOffset = !CSS.supports('width', 'max(0px, 1px)')
|
|
@@ -2735,7 +2832,7 @@ const Modal = class {
|
|
|
2735
2832
|
}
|
|
2736
2833
|
async dismissNestedModals() {
|
|
2737
2834
|
const nestedModals = document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);
|
|
2738
|
-
nestedModals
|
|
2835
|
+
nestedModals?.forEach(async (modal) => {
|
|
2739
2836
|
await modal.dismiss(undefined, 'parent-dismissed');
|
|
2740
2837
|
});
|
|
2741
2838
|
}
|
|
@@ -2763,15 +2860,17 @@ const Modal = class {
|
|
|
2763
2860
|
this.cachedOriginalParent.tagName === 'ION-APP') {
|
|
2764
2861
|
return;
|
|
2765
2862
|
}
|
|
2863
|
+
// Both `present()` and a reconnect call this, so drop any existing
|
|
2864
|
+
// observer. Below the guards, so a call that bails cannot leave none.
|
|
2865
|
+
this.cleanupParentRemovalObserver();
|
|
2766
2866
|
this.parentRemovalObserver = new MutationObserver((mutations) => {
|
|
2767
2867
|
mutations.forEach((mutation) => {
|
|
2768
2868
|
if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
|
|
2769
2869
|
// Check if our cached original parent was removed
|
|
2770
2870
|
const cachedParentWasRemoved = Array.from(mutation.removedNodes).some((node) => {
|
|
2771
|
-
var _a, _b;
|
|
2772
2871
|
const isDirectMatch = node === this.cachedOriginalParent;
|
|
2773
2872
|
const isContainedMatch = this.cachedOriginalParent
|
|
2774
|
-
?
|
|
2873
|
+
? node.contains?.(this.cachedOriginalParent)
|
|
2775
2874
|
: false;
|
|
2776
2875
|
return isDirectMatch || isContainedMatch;
|
|
2777
2876
|
});
|
|
@@ -2793,8 +2892,7 @@ const Modal = class {
|
|
|
2793
2892
|
});
|
|
2794
2893
|
}
|
|
2795
2894
|
cleanupParentRemovalObserver() {
|
|
2796
|
-
|
|
2797
|
-
(_a = this.parentRemovalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
2895
|
+
this.parentRemovalObserver?.disconnect();
|
|
2798
2896
|
this.parentRemovalObserver = undefined;
|
|
2799
2897
|
}
|
|
2800
2898
|
onDragStart() {
|
|
@@ -2834,22 +2932,30 @@ const Modal = class {
|
|
|
2834
2932
|
* sheets to prevent header content from getting double-offset padding).
|
|
2835
2933
|
*/
|
|
2836
2934
|
setInitialSafeAreaOverrides() {
|
|
2837
|
-
const context =
|
|
2935
|
+
const context = {
|
|
2936
|
+
...this.getSafeAreaContext(),
|
|
2937
|
+
hasCustomDimensions: hasCustomModalDimensions(this.el),
|
|
2938
|
+
};
|
|
2838
2939
|
const safeAreaConfig = getInitialSafeAreaConfig(context);
|
|
2839
2940
|
applySafeAreaOverrides(this.el, safeAreaConfig);
|
|
2840
2941
|
// Set the internal offset property with the resolved root safe-area-top value
|
|
2841
2942
|
if (context.isSheetModal) {
|
|
2842
2943
|
this.updateSheetOffsetTop();
|
|
2944
|
+
// A restore after a DOM move runs this a second time for the same
|
|
2945
|
+
// modal, so drop the previous subscription rather than stacking one.
|
|
2946
|
+
this.unsubscribeRootSafeAreaTop?.();
|
|
2947
|
+
this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
|
|
2843
2948
|
}
|
|
2844
2949
|
}
|
|
2845
2950
|
/**
|
|
2846
|
-
*
|
|
2847
|
-
*
|
|
2848
|
-
* Called on present
|
|
2951
|
+
* Sets the internal --ion-modal-offset-top property on the host element,
|
|
2952
|
+
* resolving the current root --ion-safe-area-top when no value is given.
|
|
2953
|
+
* Called on present, on resize (e.g., device rotation changes safe-area),
|
|
2954
|
+
* and whenever the root safe-area value itself changes.
|
|
2849
2955
|
*/
|
|
2850
|
-
updateSheetOffsetTop() {
|
|
2851
|
-
const
|
|
2852
|
-
this.el.style.setProperty('--ion-modal-offset-top', `${
|
|
2956
|
+
updateSheetOffsetTop(safeAreaTop) {
|
|
2957
|
+
const value = safeAreaTop ?? getRootSafeAreaTop();
|
|
2958
|
+
this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
|
|
2853
2959
|
}
|
|
2854
2960
|
/**
|
|
2855
2961
|
* Updates safe-area overrides during dynamic state changes.
|
|
@@ -2949,11 +3055,38 @@ const Modal = class {
|
|
|
2949
3055
|
*/
|
|
2950
3056
|
cleanupSafeAreaOverrides() {
|
|
2951
3057
|
clearSafeAreaOverrides(this.el);
|
|
3058
|
+
this.unsubscribeRootSafeAreaTop?.();
|
|
3059
|
+
this.unsubscribeRootSafeAreaTop = undefined;
|
|
2952
3060
|
// Remove internal sheet offset property
|
|
2953
3061
|
this.el.style.removeProperty('--ion-modal-offset-top');
|
|
2954
3062
|
const { contentEl } = this.findContentAndFooter();
|
|
2955
3063
|
this.clearContentSafeAreaPadding(contentEl);
|
|
2956
3064
|
}
|
|
3065
|
+
/**
|
|
3066
|
+
* Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
|
|
3067
|
+
* while presented. Anything needing no measurement goes on synchronously so
|
|
3068
|
+
* the modal is never painted without safe-area. The position-based
|
|
3069
|
+
* correction waits a frame for the layout pass it reads.
|
|
3070
|
+
*/
|
|
3071
|
+
restoreSafeAreaOverrides() {
|
|
3072
|
+
this.setInitialSafeAreaOverrides();
|
|
3073
|
+
this.applyFullscreenSafeArea();
|
|
3074
|
+
helpers.raf(() => {
|
|
3075
|
+
// A dismiss or another move can land first, and a read before the enter
|
|
3076
|
+
// animation settles is not the rest position. `present()` redoes it.
|
|
3077
|
+
if (!this.presented || !this.el.isConnected || this.isPresenting) {
|
|
3078
|
+
return;
|
|
3079
|
+
}
|
|
3080
|
+
// A hidden subtree carries `display: none`, so there is no box and the
|
|
3081
|
+
// read would write the safe-area for a modal touching no edge. The
|
|
3082
|
+
// prediction applied above holds until the modal is shown again.
|
|
3083
|
+
const { width, height } = this.el.getBoundingClientRect();
|
|
3084
|
+
if (width === 0 && height === 0) {
|
|
3085
|
+
return;
|
|
3086
|
+
}
|
|
3087
|
+
this.updateSafeAreaOverrides();
|
|
3088
|
+
});
|
|
3089
|
+
}
|
|
2957
3090
|
render() {
|
|
2958
3091
|
const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
|
|
2959
3092
|
const showHandle = handle !== false && isSheetModal;
|
|
@@ -2961,20 +3094,35 @@ const Modal = class {
|
|
|
2961
3094
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
2962
3095
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
2963
3096
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
2964
|
-
return (index$3.h(index$3.Host,
|
|
3097
|
+
return (index$3.h(index$3.Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
|
|
2965
3098
|
// Allow the modal to be navigable when the handle is focusable
|
|
2966
|
-
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1
|
|
3099
|
+
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
|
|
2967
3100
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
2968
|
-
}, class:
|
|
3101
|
+
}, class: {
|
|
3102
|
+
[mode]: true,
|
|
3103
|
+
['modal-default']: !isCardModal && !isSheetModal,
|
|
3104
|
+
[`modal-card`]: isCardModal,
|
|
3105
|
+
[`modal-sheet`]: isSheetModal,
|
|
3106
|
+
[`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
|
|
3107
|
+
'overlay-hidden': true,
|
|
3108
|
+
[overlays.FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
|
|
3109
|
+
...theme.getClassMap(this.cssClass),
|
|
3110
|
+
}, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, index$3.h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && index$3.h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), index$3.h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
|
|
2969
3111
|
/*
|
|
2970
3112
|
role and aria-modal must be used on the
|
|
2971
3113
|
same element. They must also be set inside the
|
|
2972
3114
|
shadow DOM otherwise ion-button will not be highlighted
|
|
2973
3115
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
3116
|
+
|
|
3117
|
+
tabIndex={-1} is required so present() can move focus to this
|
|
3118
|
+
element (which carries the dialog role) instead of the role-less
|
|
3119
|
+
host. role="dialog" alone does not make an element focusable, so
|
|
3120
|
+
without the tabindex focus() would be a no-op and screen readers
|
|
3121
|
+
may not properly announce the dialog and its content when it opens.
|
|
2974
3122
|
*/
|
|
2975
|
-
role: "dialog"
|
|
3123
|
+
role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (index$3.h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
|
|
2976
3124
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
2977
|
-
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), index$3.h("slot", { key: '
|
|
3125
|
+
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), index$3.h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
|
|
2978
3126
|
}
|
|
2979
3127
|
get el() { return index$3.getElement(this); }
|
|
2980
3128
|
static get watchers() { return {
|