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
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
-
import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-
|
|
5
|
-
import { f as
|
|
6
|
-
import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-
|
|
7
|
-
import {
|
|
4
|
+
import { r as registerInstance, c as createEvent, f as printIonWarning, w as writeTask, e as config, h, d as Host, g as getElement } from './index-C23AVPx9.js';
|
|
5
|
+
import { i as isIonContent, f as findRefresherInContent, a as findClosestIonContent, d as disableContentScrollY, r as resetContentScrollY, b as findIonContent, p as printIonContentErrorMsg } from './index-C1b9CLFg.js';
|
|
6
|
+
import { C as CoreDelegate, a as attachComponent, d as detachComponent } from './framework-delegate-BwNhx9NR.js';
|
|
7
|
+
import { g as getElementRoot, e as clamp, r as raf, b as inheritAttributes, h as hasLazyBuild } from './helpers-BSmc0nst.js';
|
|
8
8
|
import { c as createLockController } from './lock-controller-B-hirT0v.js';
|
|
9
9
|
import { g as getCapacitor } from './capacitor-CFERIeaU.js';
|
|
10
|
-
import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS,
|
|
11
|
-
import { g as getClassMap } from './theme-
|
|
12
|
-
import { e as deepReady, w as waitForMount } from './index-
|
|
13
|
-
import { b as getIonMode } from './ionic-global-
|
|
14
|
-
import { KEYBOARD_DID_OPEN } from './keyboard-
|
|
15
|
-
import { c as createAnimation } from './animation-
|
|
10
|
+
import { G as GESTURE, O as OVERLAY_GESTURE_PRIORITY, F as FOCUS_TRAP_DISABLE_CLASS, d as createTriggerController, B as BACKDROP, h as prepareOverlay, r as restoreRootFocusTrapAccessibility, j as cleanupRootFocusTrapAccessibility, k as setOverlayId, e as present, f as dismiss, g as eventMethod } from './overlays-DKE0DgvE.js';
|
|
11
|
+
import { g as getClassMap } from './theme-byZM6qHV.js';
|
|
12
|
+
import { e as deepReady, w as waitForMount } from './index-DnA_7Bnx.js';
|
|
13
|
+
import { b as getIonMode } from './ionic-global-ZXjCXKH0.js';
|
|
14
|
+
import { KEYBOARD_DID_OPEN } from './keyboard-Cj8mLJeq.js';
|
|
15
|
+
import { c as createAnimation } from './animation-BFNVlYum.js';
|
|
16
16
|
import { g as getTimeGivenProgression } from './cubic-bezier-hHmYLOfE.js';
|
|
17
|
-
import { createGesture } from './index-
|
|
17
|
+
import { createGesture } from './index-BmLuEdV7.js';
|
|
18
18
|
import { w as win } from './index-ZjP4CjeZ.js';
|
|
19
|
-
import './
|
|
20
|
-
import './
|
|
21
|
-
import './
|
|
19
|
+
import './dir-Dojwmvde.js';
|
|
20
|
+
import './hardware-back-button-DmkiRgOT.js';
|
|
21
|
+
import './gesture-controller-B_gJaBk0.js';
|
|
22
|
+
import './keyboard-DAF8GNJ9.js';
|
|
22
23
|
|
|
23
24
|
var Style;
|
|
24
25
|
(function (Style) {
|
|
@@ -29,7 +30,7 @@ var Style;
|
|
|
29
30
|
const StatusBar = {
|
|
30
31
|
getEngine() {
|
|
31
32
|
const capacitor = getCapacitor();
|
|
32
|
-
if (capacitor
|
|
33
|
+
if (capacitor?.isPluginAvailable('StatusBar')) {
|
|
33
34
|
return capacitor.Plugins.StatusBar;
|
|
34
35
|
}
|
|
35
36
|
return undefined;
|
|
@@ -127,6 +128,21 @@ const setCardStatusBarDefault = (defaultStyle = Style.Default) => {
|
|
|
127
128
|
StatusBar.setStyle({ style: defaultStyle });
|
|
128
129
|
};
|
|
129
130
|
|
|
131
|
+
/**
|
|
132
|
+
* Swiping is only possible when the content is scrolled to the top, so that we
|
|
133
|
+
* do not interfere with scrolling, and never on content with a refresher.
|
|
134
|
+
*
|
|
135
|
+
* Note: We cannot solve the refresher case with gesture priority as the iOS
|
|
136
|
+
* native refresh gesture uses a scroll listener in addition to a gesture.
|
|
137
|
+
*
|
|
138
|
+
* Note: Do not use `getScrollElement` here because we need this to be a
|
|
139
|
+
* synchronous operation, and `getScrollElement` is asynchronous.
|
|
140
|
+
*/
|
|
141
|
+
const canSwipeOnContent = (contentEl) => {
|
|
142
|
+
const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
|
|
143
|
+
const hasRefresherInContent = !!findRefresherInContent(contentEl);
|
|
144
|
+
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
145
|
+
};
|
|
130
146
|
const handleCanDismiss = async (el, animation) => {
|
|
131
147
|
/**
|
|
132
148
|
* If canDismiss is not a function
|
|
@@ -257,7 +273,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
257
273
|
let isOpen = false;
|
|
258
274
|
let canDismissBlocksGesture = false;
|
|
259
275
|
let contentEl = null;
|
|
260
|
-
let scrollEl = null;
|
|
261
276
|
const canDismissMaxStep = 0.2;
|
|
262
277
|
let initialScrollY = true;
|
|
263
278
|
let lastStep = 0;
|
|
@@ -280,12 +295,6 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
280
295
|
return true;
|
|
281
296
|
}
|
|
282
297
|
/**
|
|
283
|
-
* If we are swiping on the content,
|
|
284
|
-
* swiping should only be possible if
|
|
285
|
-
* the content is scrolled all the way
|
|
286
|
-
* to the top so that we do not interfere
|
|
287
|
-
* with scrolling.
|
|
288
|
-
*
|
|
289
298
|
* We cannot assume that the `ion-content`
|
|
290
299
|
* target will remain consistent between
|
|
291
300
|
* swipes. For example, when using
|
|
@@ -296,29 +305,7 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
296
305
|
*/
|
|
297
306
|
contentEl = findClosestIonContent(target);
|
|
298
307
|
if (contentEl) {
|
|
299
|
-
|
|
300
|
-
* The card should never swipe to close
|
|
301
|
-
* on the content with a refresher.
|
|
302
|
-
* Note: We cannot solve this by making the
|
|
303
|
-
* swipeToClose gesture have a higher priority
|
|
304
|
-
* than the refresher gesture as the iOS native
|
|
305
|
-
* refresh gesture uses a scroll listener in
|
|
306
|
-
* addition to a gesture.
|
|
307
|
-
*
|
|
308
|
-
* Note: Do not use getScrollElement here
|
|
309
|
-
* because we need this to be a synchronous
|
|
310
|
-
* operation, and getScrollElement is
|
|
311
|
-
* asynchronous.
|
|
312
|
-
*/
|
|
313
|
-
if (isIonContent(contentEl)) {
|
|
314
|
-
const root = getElementRoot(contentEl);
|
|
315
|
-
scrollEl = root.querySelector('.inner-scroll');
|
|
316
|
-
}
|
|
317
|
-
else {
|
|
318
|
-
scrollEl = contentEl;
|
|
319
|
-
}
|
|
320
|
-
const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
|
|
321
|
-
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
308
|
+
return canSwipeOnContent(contentEl);
|
|
322
309
|
}
|
|
323
310
|
/**
|
|
324
311
|
* Card should be swipeable on all
|
|
@@ -332,6 +319,12 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
332
319
|
};
|
|
333
320
|
const onStart = (detail) => {
|
|
334
321
|
const { deltaY } = detail;
|
|
322
|
+
/**
|
|
323
|
+
* Firefox automatically selects the header text during drag
|
|
324
|
+
* due to the focusable wrapper (tabindex="-1"). Remove any
|
|
325
|
+
* selection that may have occurred.
|
|
326
|
+
*/
|
|
327
|
+
window.getSelection()?.removeAllRanges();
|
|
335
328
|
/**
|
|
336
329
|
* Get the initial scrollY value so
|
|
337
330
|
* that we can correctly reset the scrollY
|
|
@@ -484,17 +477,30 @@ const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismiss, onD
|
|
|
484
477
|
* check canDismiss. 25% was chosen
|
|
485
478
|
* to avoid accidental swipes.
|
|
486
479
|
*/
|
|
487
|
-
|
|
480
|
+
const isAttemptingCanDismiss = isAttemptingDismissWithCanDismiss && clampedStep > maxStep / 4;
|
|
481
|
+
if (isAttemptingCanDismiss) {
|
|
488
482
|
handleCanDismiss(el, animation);
|
|
489
483
|
}
|
|
490
484
|
else if (shouldComplete) {
|
|
491
485
|
onDismiss();
|
|
492
486
|
}
|
|
487
|
+
/**
|
|
488
|
+
* `shouldComplete` is not enough on its own, since it is always `false`
|
|
489
|
+
* when canDismiss blocks the gesture. `canDismiss: false` blocks it and
|
|
490
|
+
* never dismisses, because `handleCanDismiss` returns early when
|
|
491
|
+
* canDismiss is not a function. A canDismiss function dismisses through
|
|
492
|
+
* `handleCanDismiss`, which awaits the callback, so the outcome is not
|
|
493
|
+
* known when this event is emitted.
|
|
494
|
+
*/
|
|
495
|
+
const isDismissing = isAttemptingDismissWithCanDismiss
|
|
496
|
+
? isAttemptingCanDismiss && typeof el.canDismiss === 'function'
|
|
497
|
+
: shouldComplete;
|
|
493
498
|
const eventDetail = {
|
|
494
499
|
currentY: detail.currentY,
|
|
495
500
|
deltaY: detail.deltaY,
|
|
496
501
|
velocityY: detail.velocityY,
|
|
497
502
|
progress: calculateProgress(el, detail.deltaY),
|
|
503
|
+
isDismissing,
|
|
498
504
|
snapBreakpoint: shouldComplete ? 0 : 1,
|
|
499
505
|
};
|
|
500
506
|
onDragEnd(eventDetail);
|
|
@@ -632,7 +638,7 @@ const iosEnterAnimation = (baseEl, opts) => {
|
|
|
632
638
|
wrapperAnimation.addElement(root.querySelectorAll('.modal-wrapper, .modal-shadow')).beforeStyles({ opacity: 1 });
|
|
633
639
|
// The content animation is only added if scrolling is enabled for
|
|
634
640
|
// all the breakpoints.
|
|
635
|
-
!expandToScroll &&
|
|
641
|
+
!expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
|
|
636
642
|
const baseAnimation = createAnimation('entering-base')
|
|
637
643
|
.addElement(baseEl)
|
|
638
644
|
.easing('cubic-bezier(0.32,0.72,0,1)')
|
|
@@ -965,7 +971,7 @@ const mdEnterAnimation = (baseEl, opts) => {
|
|
|
965
971
|
wrapperAnimation.addElement(root.querySelector('.modal-wrapper'));
|
|
966
972
|
// The content animation is only added if scrolling is enabled for
|
|
967
973
|
// all the breakpoints.
|
|
968
|
-
!expandToScroll &&
|
|
974
|
+
!expandToScroll && contentAnimation?.addElement(baseEl.querySelector('.ion-page'));
|
|
969
975
|
const baseAnimation = createAnimation()
|
|
970
976
|
.addElement(baseEl)
|
|
971
977
|
.easing('cubic-bezier(0.36,0.66,0.04,1)')
|
|
@@ -1024,6 +1030,8 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1024
1030
|
],
|
|
1025
1031
|
};
|
|
1026
1032
|
const contentEl = baseEl.querySelector('ion-content');
|
|
1033
|
+
// Cache the initial value so the gesture restores it instead of forcing scrolling on.
|
|
1034
|
+
const initialContentScrollY = contentEl?.scrollY ?? true;
|
|
1027
1035
|
const height = wrapperEl.clientHeight;
|
|
1028
1036
|
let currentBreakpoint = initialBreakpoint;
|
|
1029
1037
|
let offset = 0;
|
|
@@ -1089,9 +1097,9 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1089
1097
|
cachedFooterEl.style.removeProperty('height');
|
|
1090
1098
|
cachedFooterEl.style.removeProperty('top');
|
|
1091
1099
|
cachedFooterEl.style.removeProperty('left');
|
|
1092
|
-
page
|
|
1100
|
+
page?.style.removeProperty('padding-bottom');
|
|
1093
1101
|
// Move to page
|
|
1094
|
-
page
|
|
1102
|
+
page?.appendChild(cachedFooterEl);
|
|
1095
1103
|
});
|
|
1096
1104
|
}
|
|
1097
1105
|
else {
|
|
@@ -1135,7 +1143,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1135
1143
|
// when the footer is positioned absolutely. This has to be done before we
|
|
1136
1144
|
// make the footer absolutely positioned or we may accidentally cause the
|
|
1137
1145
|
// sheet to scroll.
|
|
1138
|
-
page
|
|
1146
|
+
page?.style.setProperty('padding-bottom', `${footerHeights}px`);
|
|
1139
1147
|
// Apply positioning styles to keep footer at bottom
|
|
1140
1148
|
cachedFooterEl.classList.add('modal-footer-moving');
|
|
1141
1149
|
// Apply our preserved styles to pin the footer
|
|
@@ -1160,7 +1168,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1160
1168
|
if (wrapperAnimation && backdropAnimation) {
|
|
1161
1169
|
wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
|
|
1162
1170
|
backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
|
|
1163
|
-
contentAnimation
|
|
1171
|
+
contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
|
|
1164
1172
|
animation.progressStart(true, 1 - currentBreakpoint);
|
|
1165
1173
|
/**
|
|
1166
1174
|
* If backdrop is not enabled, then content
|
|
@@ -1184,9 +1192,6 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1184
1192
|
}
|
|
1185
1193
|
const canStart = (detail) => {
|
|
1186
1194
|
/**
|
|
1187
|
-
* If we are swiping on the content, swiping should only be possible if the content
|
|
1188
|
-
* is scrolled all the way to the top so that we do not interfere with scrolling.
|
|
1189
|
-
*
|
|
1190
1195
|
* We cannot assume that the `ion-content` target will remain consistent between swipes.
|
|
1191
1196
|
* For example, when using ion-nav within a modal it is possible to swipe, push a view,
|
|
1192
1197
|
* and then swipe again. The target content will not be the same between swipes.
|
|
@@ -1194,30 +1199,21 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1194
1199
|
const contentEl = findClosestIonContent(detail.event.target);
|
|
1195
1200
|
currentBreakpoint = getCurrentBreakpoint();
|
|
1196
1201
|
/**
|
|
1197
|
-
*
|
|
1198
|
-
*
|
|
1202
|
+
* Upwards swipes on the content cannot move the sheet anyway, so this only
|
|
1203
|
+
* blocks swiping the sheet down from the content.
|
|
1199
1204
|
*/
|
|
1200
|
-
if (!expandToScroll
|
|
1201
|
-
|
|
1202
|
-
return scrollEl.scrollTop === 0;
|
|
1203
|
-
}
|
|
1204
|
-
if (currentBreakpoint === 1 && contentEl) {
|
|
1205
|
-
/**
|
|
1206
|
-
* The modal should never swipe to close on the content with a refresher.
|
|
1207
|
-
* Note 1: We cannot solve this by making this gesture have a higher priority than
|
|
1208
|
-
* the refresher gesture as the iOS native refresh gesture uses a scroll listener in
|
|
1209
|
-
* addition to a gesture.
|
|
1210
|
-
*
|
|
1211
|
-
* Note 2: Do not use getScrollElement here because we need this to be a synchronous
|
|
1212
|
-
* operation, and getScrollElement is asynchronous.
|
|
1213
|
-
*/
|
|
1214
|
-
const scrollEl = isIonContent(contentEl) ? getElementRoot(contentEl).querySelector('.inner-scroll') : contentEl;
|
|
1215
|
-
const hasRefresherInContent = !!contentEl.querySelector('ion-refresher');
|
|
1216
|
-
return !hasRefresherInContent && scrollEl.scrollTop === 0;
|
|
1205
|
+
if (contentEl && (!expandToScroll || currentBreakpoint === 1)) {
|
|
1206
|
+
return canSwipeOnContent(contentEl);
|
|
1217
1207
|
}
|
|
1218
1208
|
return true;
|
|
1219
1209
|
};
|
|
1220
1210
|
const onStart = (detail) => {
|
|
1211
|
+
/**
|
|
1212
|
+
* Firefox automatically selects the header text during drag
|
|
1213
|
+
* due to the focusable wrapper (tabindex="-1"). Remove any
|
|
1214
|
+
* selection that may have occurred.
|
|
1215
|
+
*/
|
|
1216
|
+
window.getSelection()?.removeAllRanges();
|
|
1221
1217
|
/**
|
|
1222
1218
|
* If canDismiss is anything other than `true`
|
|
1223
1219
|
* then users should be able to swipe down
|
|
@@ -1345,12 +1341,22 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1345
1341
|
};
|
|
1346
1342
|
const onEnd = (detail) => {
|
|
1347
1343
|
const snapBreakpoint = calculateSnapBreakpoint(detail.deltaY);
|
|
1344
|
+
/**
|
|
1345
|
+
* `snapBreakpoint === 0` is not enough on its own. `canDismiss: false`
|
|
1346
|
+
* snaps to 0 but never dismisses, since `handleCanDismiss` returns early
|
|
1347
|
+
* when canDismiss is not a function. A canDismiss function dismisses
|
|
1348
|
+
* through `handleCanDismiss`, which awaits the callback, so the outcome
|
|
1349
|
+
* is not known when this event is emitted.
|
|
1350
|
+
*/
|
|
1351
|
+
const shouldPreventDismiss = canDismissBlocksGesture && snapBreakpoint === 0;
|
|
1352
|
+
const isDismissing = shouldPreventDismiss ? typeof baseEl.canDismiss === 'function' : snapBreakpoint === 0;
|
|
1348
1353
|
const eventDetail = {
|
|
1349
1354
|
currentY: detail.currentY,
|
|
1350
1355
|
deltaY: detail.deltaY,
|
|
1351
1356
|
velocityY: detail.velocityY,
|
|
1352
1357
|
progress: calculateProgress(detail.currentY),
|
|
1353
1358
|
snapBreakpoint,
|
|
1359
|
+
isDismissing,
|
|
1354
1360
|
};
|
|
1355
1361
|
/**
|
|
1356
1362
|
* If expandToScroll is disabled, we should not allow the moveSheetToBreakpoint
|
|
@@ -1366,7 +1372,11 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1366
1372
|
* swap to moving on drag and if we don't swap back here then the footer will get stuck.
|
|
1367
1373
|
*/
|
|
1368
1374
|
swapFooterPosition('stationary');
|
|
1369
|
-
|
|
1375
|
+
/**
|
|
1376
|
+
* The sheet does not move in this case, so the gesture
|
|
1377
|
+
* never dismisses the modal.
|
|
1378
|
+
*/
|
|
1379
|
+
onDragEnd({ ...eventDetail, isDismissing: false });
|
|
1370
1380
|
return;
|
|
1371
1381
|
}
|
|
1372
1382
|
moveSheetToBreakpoint({
|
|
@@ -1439,14 +1449,14 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1439
1449
|
onDismiss();
|
|
1440
1450
|
}
|
|
1441
1451
|
/**
|
|
1442
|
-
*
|
|
1443
|
-
* or if it allows scrolling at any breakpoint. Without this, there would
|
|
1452
|
+
* Restores the content's scroll setting immediately if the sheet is about to
|
|
1453
|
+
* fully expand or if it allows scrolling at any breakpoint. Without this, there would
|
|
1444
1454
|
* be a ~500ms delay while the modal animation completes, causing a
|
|
1445
1455
|
* noticeable lag. Native iOS allows scrolling as soon as the gesture is
|
|
1446
1456
|
* released, so we align with that behavior.
|
|
1447
1457
|
*/
|
|
1448
1458
|
if (contentEl && (snapToBreakpoint === breakpoints[breakpoints.length - 1] || !expandToScroll)) {
|
|
1449
|
-
contentEl.scrollY =
|
|
1459
|
+
contentEl.scrollY = initialContentScrollY;
|
|
1450
1460
|
}
|
|
1451
1461
|
/**
|
|
1452
1462
|
* If expandToScroll is disabled and we're animating
|
|
@@ -1481,7 +1491,7 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1481
1491
|
raf(() => {
|
|
1482
1492
|
wrapperAnimation.keyframes([...SheetDefaults.WRAPPER_KEYFRAMES]);
|
|
1483
1493
|
backdropAnimation.keyframes([...SheetDefaults.BACKDROP_KEYFRAMES]);
|
|
1484
|
-
contentAnimation
|
|
1494
|
+
contentAnimation?.keyframes([...SheetDefaults.CONTENT_KEYFRAMES]);
|
|
1485
1495
|
animation.progressStart(true, 1 - snapToBreakpoint);
|
|
1486
1496
|
currentBreakpoint = snapToBreakpoint;
|
|
1487
1497
|
onBreakpointChange(currentBreakpoint);
|
|
@@ -1628,9 +1638,20 @@ const createSheetGesture = (baseEl, backdropEl, wrapperEl, initialBreakpoint, ba
|
|
|
1628
1638
|
onMove,
|
|
1629
1639
|
onEnd,
|
|
1630
1640
|
});
|
|
1641
|
+
/**
|
|
1642
|
+
* Puts the content back the way the app declared it. A sheet can dismiss
|
|
1643
|
+
* without going through moveSheetToBreakpoint, and an inline modal reuses
|
|
1644
|
+
* the same element on the next present.
|
|
1645
|
+
*/
|
|
1646
|
+
const resetContentScroll = () => {
|
|
1647
|
+
if (contentEl) {
|
|
1648
|
+
contentEl.scrollY = initialContentScrollY;
|
|
1649
|
+
}
|
|
1650
|
+
};
|
|
1631
1651
|
return {
|
|
1632
1652
|
gesture,
|
|
1633
1653
|
moveSheetToBreakpoint,
|
|
1654
|
+
resetContentScroll,
|
|
1634
1655
|
};
|
|
1635
1656
|
};
|
|
1636
1657
|
|
|
@@ -1680,8 +1701,8 @@ const getRootSafeAreaTop = () => {
|
|
|
1680
1701
|
if (cachedRootSafeAreaTop !== null) {
|
|
1681
1702
|
return cachedRootSafeAreaTop;
|
|
1682
1703
|
}
|
|
1683
|
-
const doc = win
|
|
1684
|
-
if (!
|
|
1704
|
+
const doc = win?.document;
|
|
1705
|
+
if (!doc?.body) {
|
|
1685
1706
|
return 0;
|
|
1686
1707
|
}
|
|
1687
1708
|
const el = doc.createElement('div');
|
|
@@ -1700,6 +1721,41 @@ const getRootSafeAreaTop = () => {
|
|
|
1700
1721
|
}
|
|
1701
1722
|
return value;
|
|
1702
1723
|
};
|
|
1724
|
+
/**
|
|
1725
|
+
* Calls back when the resolved root `--ion-safe-area-top` changes, which no
|
|
1726
|
+
* event and no window resize covers. The probe's height tracks the variable, so
|
|
1727
|
+
* a change to it becomes a size change the observer can see.
|
|
1728
|
+
*/
|
|
1729
|
+
const onRootSafeAreaTopChange = (callback) => {
|
|
1730
|
+
const doc = win?.document;
|
|
1731
|
+
if (!doc?.body || typeof ResizeObserver === 'undefined') {
|
|
1732
|
+
return () => undefined;
|
|
1733
|
+
}
|
|
1734
|
+
const probe = doc.createElement('div');
|
|
1735
|
+
probe.style.cssText =
|
|
1736
|
+
'position:fixed;visibility:hidden;pointer-events:none;top:0;left:0;width:0;' +
|
|
1737
|
+
'height:var(--ion-safe-area-top,0px);';
|
|
1738
|
+
doc.body.appendChild(probe);
|
|
1739
|
+
/**
|
|
1740
|
+
* Seeded with the value the caller has already applied, so a change that
|
|
1741
|
+
* lands before the observer's first delivery still gets reported. Comparing
|
|
1742
|
+
* against an unset value instead would consume that first delivery and treat
|
|
1743
|
+
* the new inset as the baseline.
|
|
1744
|
+
*/
|
|
1745
|
+
let lastHeight = getRootSafeAreaTop();
|
|
1746
|
+
const observer = new ResizeObserver((entries) => {
|
|
1747
|
+
const { height } = entries[0].contentRect;
|
|
1748
|
+
if (height !== lastHeight) {
|
|
1749
|
+
lastHeight = height;
|
|
1750
|
+
callback(height);
|
|
1751
|
+
}
|
|
1752
|
+
});
|
|
1753
|
+
observer.observe(probe);
|
|
1754
|
+
return () => {
|
|
1755
|
+
observer.disconnect();
|
|
1756
|
+
probe.remove();
|
|
1757
|
+
};
|
|
1758
|
+
};
|
|
1703
1759
|
/**
|
|
1704
1760
|
* True when the modal host declares BOTH a non-fullscreen `--width` AND a
|
|
1705
1761
|
* non-fullscreen `--height` (i.e. a centered-dialog-like modal that doesn't
|
|
@@ -1784,10 +1840,9 @@ const getInitialSafeAreaConfig = (context) => {
|
|
|
1784
1840
|
* @returns SafeAreaConfig based on position
|
|
1785
1841
|
*/
|
|
1786
1842
|
const getPositionBasedSafeAreaConfig = (wrapperEl) => {
|
|
1787
|
-
var _a, _b;
|
|
1788
1843
|
const rect = wrapperEl.getBoundingClientRect();
|
|
1789
|
-
const vh =
|
|
1790
|
-
const vw =
|
|
1844
|
+
const vh = win?.innerHeight ?? 0;
|
|
1845
|
+
const vw = win?.innerWidth ?? 0;
|
|
1791
1846
|
// Only apply safe-area to sides where modal overlaps with screen edge
|
|
1792
1847
|
return {
|
|
1793
1848
|
top: rect.top <= EDGE_THRESHOLD ? 'inherit' : '0px',
|
|
@@ -1820,9 +1875,9 @@ const clearSafeAreaOverrides = (hostEl) => {
|
|
|
1820
1875
|
hostEl.style.removeProperty('--ion-safe-area-right');
|
|
1821
1876
|
};
|
|
1822
1877
|
|
|
1823
|
-
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}`;
|
|
1878
|
+
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}`;
|
|
1824
1879
|
|
|
1825
|
-
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}`;
|
|
1880
|
+
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}`;
|
|
1826
1881
|
|
|
1827
1882
|
const Modal = class {
|
|
1828
1883
|
constructor(hostRef) {
|
|
@@ -1848,6 +1903,9 @@ const Modal = class {
|
|
|
1848
1903
|
this.inline = false;
|
|
1849
1904
|
// Whether or not modal is being dismissed via gesture
|
|
1850
1905
|
this.gestureAnimationDismissing = false;
|
|
1906
|
+
// True from the first safe-area write in `present()` until the enter
|
|
1907
|
+
// animation settles. A position-based read in that window is not the rest position.
|
|
1908
|
+
this.isPresenting = false;
|
|
1851
1909
|
this.presented = false;
|
|
1852
1910
|
/** @internal */
|
|
1853
1911
|
this.hasController = false;
|
|
@@ -1882,13 +1940,20 @@ const Modal = class {
|
|
|
1882
1940
|
/**
|
|
1883
1941
|
* The interaction behavior for the sheet modal when the handle is pressed.
|
|
1884
1942
|
*
|
|
1885
|
-
*
|
|
1886
|
-
*
|
|
1943
|
+
* Handle behavior is unavailable when the `handle` property is set to
|
|
1944
|
+
* `false` or when the `breakpoints` property is not set (using a
|
|
1945
|
+
* fullscreen or card modal).
|
|
1946
|
+
*
|
|
1947
|
+
* Set to `"cycle"` to make the handle focusable and let the sheet modal
|
|
1948
|
+
* cycle between available breakpoints when pressed. This keeps the sheet
|
|
1949
|
+
* operable with assistive technology.
|
|
1887
1950
|
*
|
|
1888
|
-
*
|
|
1889
|
-
*
|
|
1951
|
+
* Set to `"none"` to make the handle purely decorative when pressed and
|
|
1952
|
+
* removed from the tab order.
|
|
1953
|
+
*
|
|
1954
|
+
* Defaults to `"cycle"`.
|
|
1890
1955
|
*/
|
|
1891
|
-
this.handleBehavior = '
|
|
1956
|
+
this.handleBehavior = 'cycle';
|
|
1892
1957
|
/**
|
|
1893
1958
|
* If `true`, the modal will be dismissed when the backdrop is clicked.
|
|
1894
1959
|
*/
|
|
@@ -1997,8 +2062,13 @@ const Modal = class {
|
|
|
1997
2062
|
*/
|
|
1998
2063
|
this.onModalFocus = (ev) => {
|
|
1999
2064
|
const { dragHandleEl, el } = this;
|
|
2000
|
-
|
|
2001
|
-
|
|
2065
|
+
/**
|
|
2066
|
+
* Shadow DOM focus is retargeted to the host, so `ev.target === el` is also
|
|
2067
|
+
* true when a shadow child (the dialog wrapper present() focuses) is focused.
|
|
2068
|
+
* shadowRoot's activeElement is null only when the host was focused directly,
|
|
2069
|
+
* so redirect to the handle only then and leave present()'s wrapper focus intact.
|
|
2070
|
+
*/
|
|
2071
|
+
if (ev.target === el && el.shadowRoot?.activeElement == null && dragHandleEl && dragHandleEl.tabIndex !== -1) {
|
|
2002
2072
|
dragHandleEl.focus();
|
|
2003
2073
|
}
|
|
2004
2074
|
};
|
|
@@ -2072,6 +2142,17 @@ const Modal = class {
|
|
|
2072
2142
|
const { el } = this;
|
|
2073
2143
|
prepareOverlay(el);
|
|
2074
2144
|
this.triggerChanged();
|
|
2145
|
+
// A disconnect tears down state this presentation still needs and cannot
|
|
2146
|
+
// tell a re-insert from a removal, so put it back.
|
|
2147
|
+
if (this.presented || this.isPresenting) {
|
|
2148
|
+
this.restoreSafeAreaOverrides();
|
|
2149
|
+
}
|
|
2150
|
+
// A relocation from `willPresent` reaches these before `present()` has
|
|
2151
|
+
// applied the lock, so they apply it instead. Both are idempotent.
|
|
2152
|
+
if (this.presented) {
|
|
2153
|
+
restoreRootFocusTrapAccessibility(el);
|
|
2154
|
+
this.initParentRemovalObserver();
|
|
2155
|
+
}
|
|
2075
2156
|
}
|
|
2076
2157
|
disconnectedCallback() {
|
|
2077
2158
|
this.triggerController.removeClickListener();
|
|
@@ -2080,9 +2161,12 @@ const Modal = class {
|
|
|
2080
2161
|
// Also called in dismiss() — intentional dual cleanup covers both
|
|
2081
2162
|
// dismiss-then-remove and direct DOM removal without dismiss.
|
|
2082
2163
|
this.cleanupSafeAreaOverrides();
|
|
2164
|
+
// Clean up aria-hidden if removed without dismiss() being called
|
|
2165
|
+
if (this.presented) {
|
|
2166
|
+
cleanupRootFocusTrapAccessibility();
|
|
2167
|
+
}
|
|
2083
2168
|
}
|
|
2084
2169
|
componentWillLoad() {
|
|
2085
|
-
var _a;
|
|
2086
2170
|
const { breakpoints, initialBreakpoint, el, htmlAttributes } = this;
|
|
2087
2171
|
const isSheetModal = (this.isSheetModal = breakpoints !== undefined && initialBreakpoint !== undefined);
|
|
2088
2172
|
const attributesToInherit = ['aria-label', 'role'];
|
|
@@ -2117,7 +2201,10 @@ const Modal = class {
|
|
|
2117
2201
|
* htmlAttributes wins, but that's not a pattern that we recommend.
|
|
2118
2202
|
* The only time you'd need htmlAttributes is when using modalController.
|
|
2119
2203
|
*/
|
|
2120
|
-
this.inheritedAttributes =
|
|
2204
|
+
this.inheritedAttributes = {
|
|
2205
|
+
...this.inheritedAttributes,
|
|
2206
|
+
[attribute]: htmlAttributes[attribute],
|
|
2207
|
+
};
|
|
2121
2208
|
delete htmlAttributes[attribute];
|
|
2122
2209
|
}
|
|
2123
2210
|
});
|
|
@@ -2128,7 +2215,7 @@ const Modal = class {
|
|
|
2128
2215
|
if (breakpoints !== undefined && initialBreakpoint !== undefined && !breakpoints.includes(initialBreakpoint)) {
|
|
2129
2216
|
printIonWarning('[ion-modal] - Your breakpoints array must include the initialBreakpoint value.');
|
|
2130
2217
|
}
|
|
2131
|
-
if (!
|
|
2218
|
+
if (!this.htmlAttributes?.id) {
|
|
2132
2219
|
setOverlayId(this.el);
|
|
2133
2220
|
}
|
|
2134
2221
|
}
|
|
@@ -2243,25 +2330,33 @@ const Modal = class {
|
|
|
2243
2330
|
// Recalculate isSheetModal before safe-area setup because framework
|
|
2244
2331
|
// bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
|
|
2245
2332
|
this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
2246
|
-
|
|
2247
|
-
this.setInitialSafeAreaOverrides();
|
|
2333
|
+
this.isPresenting = true;
|
|
2248
2334
|
const hasCardModal = presentingElement !== undefined;
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2335
|
+
// Wrapped so a throw cannot strand `isPresenting`, which would suppress
|
|
2336
|
+
// the position-based correction for the life of this instance.
|
|
2337
|
+
try {
|
|
2338
|
+
// Set initial safe-area overrides before animation
|
|
2339
|
+
this.setInitialSafeAreaOverrides();
|
|
2340
|
+
/**
|
|
2341
|
+
* We need to change the status bar at the
|
|
2342
|
+
* start of the animation so that it completes
|
|
2343
|
+
* by the time the card animation is done.
|
|
2344
|
+
*/
|
|
2345
|
+
if (hasCardModal && getIonMode(this) === 'ios') {
|
|
2346
|
+
// Cache the original status bar color before the modal is presented
|
|
2347
|
+
this.statusBarStyle = await StatusBar.getStyle();
|
|
2348
|
+
setCardStatusBarDark();
|
|
2349
|
+
}
|
|
2350
|
+
await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
2351
|
+
presentingEl: presentingElement,
|
|
2352
|
+
currentBreakpoint: this.initialBreakpoint,
|
|
2353
|
+
backdropBreakpoint: this.backdropBreakpoint,
|
|
2354
|
+
expandToScroll: this.expandToScroll,
|
|
2355
|
+
});
|
|
2356
|
+
}
|
|
2357
|
+
finally {
|
|
2358
|
+
this.isPresenting = false;
|
|
2258
2359
|
}
|
|
2259
|
-
await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
2260
|
-
presentingEl: presentingElement,
|
|
2261
|
-
currentBreakpoint: this.initialBreakpoint,
|
|
2262
|
-
backdropBreakpoint: this.backdropBreakpoint,
|
|
2263
|
-
expandToScroll: this.expandToScroll,
|
|
2264
|
-
});
|
|
2265
2360
|
// Update safe-area based on actual position after animation
|
|
2266
2361
|
this.updateSafeAreaOverrides();
|
|
2267
2362
|
// Apply fullscreen safe-area padding if needed
|
|
@@ -2310,7 +2405,6 @@ const Modal = class {
|
|
|
2310
2405
|
unlock();
|
|
2311
2406
|
}
|
|
2312
2407
|
initSwipeToClose() {
|
|
2313
|
-
var _a;
|
|
2314
2408
|
if (getIonMode(this) !== 'ios') {
|
|
2315
2409
|
return;
|
|
2316
2410
|
}
|
|
@@ -2328,7 +2422,7 @@ const Modal = class {
|
|
|
2328
2422
|
printIonContentErrorMsg(el);
|
|
2329
2423
|
return;
|
|
2330
2424
|
}
|
|
2331
|
-
const statusBarStyle =
|
|
2425
|
+
const statusBarStyle = this.statusBarStyle ?? Style.Default;
|
|
2332
2426
|
this.gesture = createSwipeToCloseGesture(el, ani, statusBarStyle, () => this.cardOnDismiss(), () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
|
|
2333
2427
|
this.gesture.enable(true);
|
|
2334
2428
|
}
|
|
@@ -2345,7 +2439,7 @@ const Modal = class {
|
|
|
2345
2439
|
expandToScroll: this.expandToScroll,
|
|
2346
2440
|
}));
|
|
2347
2441
|
ani.progressStart(true, 1);
|
|
2348
|
-
const { gesture, moveSheetToBreakpoint } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () =>
|
|
2442
|
+
const { gesture, moveSheetToBreakpoint, resetContentScroll } = createSheetGesture(this.el, this.backdropEl, wrapperEl, initialBreakpoint, backdropBreakpoint, ani, this.sortedBreakpoints, this.expandToScroll, () => this.currentBreakpoint ?? 0, () => this.sheetOnDismiss(), (breakpoint) => {
|
|
2349
2443
|
if (this.currentBreakpoint !== breakpoint) {
|
|
2350
2444
|
this.currentBreakpoint = breakpoint;
|
|
2351
2445
|
this.ionBreakpointDidChange.emit({ breakpoint });
|
|
@@ -2353,6 +2447,7 @@ const Modal = class {
|
|
|
2353
2447
|
}, () => this.onDragStart(), (detail) => this.onDragMove(detail), (detail) => this.onDragEnd(detail));
|
|
2354
2448
|
this.gesture = gesture;
|
|
2355
2449
|
this.moveSheetToBreakpoint = moveSheetToBreakpoint;
|
|
2450
|
+
this.resetSheetContentScroll = resetContentScroll;
|
|
2356
2451
|
this.gesture.enable(true);
|
|
2357
2452
|
/**
|
|
2358
2453
|
* When backdrop interaction is allowed, nested router outlets from child routes
|
|
@@ -2370,7 +2465,6 @@ const Modal = class {
|
|
|
2370
2465
|
* passthrough on child route page wrappers and nested router outlets.
|
|
2371
2466
|
*/
|
|
2372
2467
|
setupChildRoutePassthrough() {
|
|
2373
|
-
var _a;
|
|
2374
2468
|
// Cache the page parent for cleanup
|
|
2375
2469
|
this.cachedPageParent = this.getOriginalPageParent();
|
|
2376
2470
|
const pageParent = this.cachedPageParent;
|
|
@@ -2378,14 +2472,11 @@ const Modal = class {
|
|
|
2378
2472
|
if (!pageParent || pageParent.tagName === 'ION-APP') {
|
|
2379
2473
|
return;
|
|
2380
2474
|
}
|
|
2381
|
-
const hasVisibleContent = Array.from(pageParent.children).some((child) =>
|
|
2382
|
-
|
|
2383
|
-
|
|
2384
|
-
|
|
2385
|
-
|
|
2386
|
-
child.tagName !== 'SLOT' &&
|
|
2387
|
-
!(child.nodeType === Node.TEXT_NODE && !((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()));
|
|
2388
|
-
});
|
|
2475
|
+
const hasVisibleContent = Array.from(pageParent.children).some((child) => child !== this.el &&
|
|
2476
|
+
!(child instanceof HTMLElement && window.getComputedStyle(child).display === 'none') &&
|
|
2477
|
+
child.tagName !== 'TEMPLATE' &&
|
|
2478
|
+
child.tagName !== 'SLOT' &&
|
|
2479
|
+
!(child.nodeType === Node.TEXT_NODE && !child.textContent?.trim()));
|
|
2389
2480
|
if (hasVisibleContent) {
|
|
2390
2481
|
return;
|
|
2391
2482
|
}
|
|
@@ -2393,7 +2484,7 @@ const Modal = class {
|
|
|
2393
2484
|
pageParent.classList.add('ion-page-overlay-passthrough');
|
|
2394
2485
|
// Also make nested router outlets passthrough
|
|
2395
2486
|
const routerOutlet = pageParent.parentElement;
|
|
2396
|
-
if (
|
|
2487
|
+
if (routerOutlet?.tagName === 'ION-ROUTER-OUTLET' && routerOutlet.parentElement?.tagName !== 'ION-APP') {
|
|
2397
2488
|
routerOutlet.style.setProperty('pointer-events', 'none');
|
|
2398
2489
|
routerOutlet.setAttribute('data-overlay-passthrough', 'true');
|
|
2399
2490
|
}
|
|
@@ -2421,7 +2512,7 @@ const Modal = class {
|
|
|
2421
2512
|
}
|
|
2422
2513
|
pageParent.classList.remove('ion-page-overlay-passthrough');
|
|
2423
2514
|
const routerOutlet = pageParent.parentElement;
|
|
2424
|
-
if (routerOutlet
|
|
2515
|
+
if (routerOutlet?.hasAttribute('data-overlay-passthrough')) {
|
|
2425
2516
|
routerOutlet.style.removeProperty('pointer-events');
|
|
2426
2517
|
routerOutlet.removeAttribute('data-overlay-passthrough');
|
|
2427
2518
|
}
|
|
@@ -2484,7 +2575,6 @@ const Modal = class {
|
|
|
2484
2575
|
* For example, `cancel` or `backdrop`.
|
|
2485
2576
|
*/
|
|
2486
2577
|
async dismiss(data, role) {
|
|
2487
|
-
var _a;
|
|
2488
2578
|
if (this.gestureAnimationDismissing && role !== GESTURE) {
|
|
2489
2579
|
return false;
|
|
2490
2580
|
}
|
|
@@ -2529,7 +2619,7 @@ const Modal = class {
|
|
|
2529
2619
|
}
|
|
2530
2620
|
const dismissed = await dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation, {
|
|
2531
2621
|
presentingEl: presentingElement,
|
|
2532
|
-
currentBreakpoint:
|
|
2622
|
+
currentBreakpoint: this.currentBreakpoint ?? this.initialBreakpoint,
|
|
2533
2623
|
backdropBreakpoint: this.backdropBreakpoint,
|
|
2534
2624
|
expandToScroll: this.expandToScroll,
|
|
2535
2625
|
});
|
|
@@ -2543,6 +2633,13 @@ const Modal = class {
|
|
|
2543
2633
|
if (this.gesture) {
|
|
2544
2634
|
this.gesture.destroy();
|
|
2545
2635
|
}
|
|
2636
|
+
/**
|
|
2637
|
+
* The sheet gesture turns content scrolling off while the sheet sits below
|
|
2638
|
+
* the top breakpoint. Inline modals reuse the same content on the next
|
|
2639
|
+
* present, so hand it back before the gesture goes away.
|
|
2640
|
+
*/
|
|
2641
|
+
this.resetSheetContentScroll?.();
|
|
2642
|
+
this.resetSheetContentScroll = undefined;
|
|
2546
2643
|
this.cleanupViewTransitionListener();
|
|
2547
2644
|
this.cleanupParentRemovalObserver();
|
|
2548
2645
|
this.cleanupSafeAreaOverrides();
|
|
@@ -2717,7 +2814,7 @@ const Modal = class {
|
|
|
2717
2814
|
wrapperEl.style.transform = 'translateY(0vh)';
|
|
2718
2815
|
wrapperEl.style.opacity = '1';
|
|
2719
2816
|
}
|
|
2720
|
-
if (
|
|
2817
|
+
if (presentingElement?.tagName === 'ION-MODAL') {
|
|
2721
2818
|
const isPortrait = window.innerWidth < 768;
|
|
2722
2819
|
if (isPortrait) {
|
|
2723
2820
|
const transformOffset = !CSS.supports('width', 'max(0px, 1px)')
|
|
@@ -2733,7 +2830,7 @@ const Modal = class {
|
|
|
2733
2830
|
}
|
|
2734
2831
|
async dismissNestedModals() {
|
|
2735
2832
|
const nestedModals = document.querySelectorAll(`ion-modal[data-parent-ion-modal="${this.el.id}"]`);
|
|
2736
|
-
nestedModals
|
|
2833
|
+
nestedModals?.forEach(async (modal) => {
|
|
2737
2834
|
await modal.dismiss(undefined, 'parent-dismissed');
|
|
2738
2835
|
});
|
|
2739
2836
|
}
|
|
@@ -2761,15 +2858,17 @@ const Modal = class {
|
|
|
2761
2858
|
this.cachedOriginalParent.tagName === 'ION-APP') {
|
|
2762
2859
|
return;
|
|
2763
2860
|
}
|
|
2861
|
+
// Both `present()` and a reconnect call this, so drop any existing
|
|
2862
|
+
// observer. Below the guards, so a call that bails cannot leave none.
|
|
2863
|
+
this.cleanupParentRemovalObserver();
|
|
2764
2864
|
this.parentRemovalObserver = new MutationObserver((mutations) => {
|
|
2765
2865
|
mutations.forEach((mutation) => {
|
|
2766
2866
|
if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
|
|
2767
2867
|
// Check if our cached original parent was removed
|
|
2768
2868
|
const cachedParentWasRemoved = Array.from(mutation.removedNodes).some((node) => {
|
|
2769
|
-
var _a, _b;
|
|
2770
2869
|
const isDirectMatch = node === this.cachedOriginalParent;
|
|
2771
2870
|
const isContainedMatch = this.cachedOriginalParent
|
|
2772
|
-
?
|
|
2871
|
+
? node.contains?.(this.cachedOriginalParent)
|
|
2773
2872
|
: false;
|
|
2774
2873
|
return isDirectMatch || isContainedMatch;
|
|
2775
2874
|
});
|
|
@@ -2791,8 +2890,7 @@ const Modal = class {
|
|
|
2791
2890
|
});
|
|
2792
2891
|
}
|
|
2793
2892
|
cleanupParentRemovalObserver() {
|
|
2794
|
-
|
|
2795
|
-
(_a = this.parentRemovalObserver) === null || _a === void 0 ? void 0 : _a.disconnect();
|
|
2893
|
+
this.parentRemovalObserver?.disconnect();
|
|
2796
2894
|
this.parentRemovalObserver = undefined;
|
|
2797
2895
|
}
|
|
2798
2896
|
onDragStart() {
|
|
@@ -2832,22 +2930,30 @@ const Modal = class {
|
|
|
2832
2930
|
* sheets to prevent header content from getting double-offset padding).
|
|
2833
2931
|
*/
|
|
2834
2932
|
setInitialSafeAreaOverrides() {
|
|
2835
|
-
const context =
|
|
2933
|
+
const context = {
|
|
2934
|
+
...this.getSafeAreaContext(),
|
|
2935
|
+
hasCustomDimensions: hasCustomModalDimensions(this.el),
|
|
2936
|
+
};
|
|
2836
2937
|
const safeAreaConfig = getInitialSafeAreaConfig(context);
|
|
2837
2938
|
applySafeAreaOverrides(this.el, safeAreaConfig);
|
|
2838
2939
|
// Set the internal offset property with the resolved root safe-area-top value
|
|
2839
2940
|
if (context.isSheetModal) {
|
|
2840
2941
|
this.updateSheetOffsetTop();
|
|
2942
|
+
// A restore after a DOM move runs this a second time for the same
|
|
2943
|
+
// modal, so drop the previous subscription rather than stacking one.
|
|
2944
|
+
this.unsubscribeRootSafeAreaTop?.();
|
|
2945
|
+
this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
|
|
2841
2946
|
}
|
|
2842
2947
|
}
|
|
2843
2948
|
/**
|
|
2844
|
-
*
|
|
2845
|
-
*
|
|
2846
|
-
* Called on present
|
|
2949
|
+
* Sets the internal --ion-modal-offset-top property on the host element,
|
|
2950
|
+
* resolving the current root --ion-safe-area-top when no value is given.
|
|
2951
|
+
* Called on present, on resize (e.g., device rotation changes safe-area),
|
|
2952
|
+
* and whenever the root safe-area value itself changes.
|
|
2847
2953
|
*/
|
|
2848
|
-
updateSheetOffsetTop() {
|
|
2849
|
-
const
|
|
2850
|
-
this.el.style.setProperty('--ion-modal-offset-top', `${
|
|
2954
|
+
updateSheetOffsetTop(safeAreaTop) {
|
|
2955
|
+
const value = safeAreaTop ?? getRootSafeAreaTop();
|
|
2956
|
+
this.el.style.setProperty('--ion-modal-offset-top', `${value}px`);
|
|
2851
2957
|
}
|
|
2852
2958
|
/**
|
|
2853
2959
|
* Updates safe-area overrides during dynamic state changes.
|
|
@@ -2947,11 +3053,38 @@ const Modal = class {
|
|
|
2947
3053
|
*/
|
|
2948
3054
|
cleanupSafeAreaOverrides() {
|
|
2949
3055
|
clearSafeAreaOverrides(this.el);
|
|
3056
|
+
this.unsubscribeRootSafeAreaTop?.();
|
|
3057
|
+
this.unsubscribeRootSafeAreaTop = undefined;
|
|
2950
3058
|
// Remove internal sheet offset property
|
|
2951
3059
|
this.el.style.removeProperty('--ion-modal-offset-top');
|
|
2952
3060
|
const { contentEl } = this.findContentAndFooter();
|
|
2953
3061
|
this.clearContentSafeAreaPadding(contentEl);
|
|
2954
3062
|
}
|
|
3063
|
+
/**
|
|
3064
|
+
* Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
|
|
3065
|
+
* while presented. Anything needing no measurement goes on synchronously so
|
|
3066
|
+
* the modal is never painted without safe-area. The position-based
|
|
3067
|
+
* correction waits a frame for the layout pass it reads.
|
|
3068
|
+
*/
|
|
3069
|
+
restoreSafeAreaOverrides() {
|
|
3070
|
+
this.setInitialSafeAreaOverrides();
|
|
3071
|
+
this.applyFullscreenSafeArea();
|
|
3072
|
+
raf(() => {
|
|
3073
|
+
// A dismiss or another move can land first, and a read before the enter
|
|
3074
|
+
// animation settles is not the rest position. `present()` redoes it.
|
|
3075
|
+
if (!this.presented || !this.el.isConnected || this.isPresenting) {
|
|
3076
|
+
return;
|
|
3077
|
+
}
|
|
3078
|
+
// A hidden subtree carries `display: none`, so there is no box and the
|
|
3079
|
+
// read would write the safe-area for a modal touching no edge. The
|
|
3080
|
+
// prediction applied above holds until the modal is shown again.
|
|
3081
|
+
const { width, height } = this.el.getBoundingClientRect();
|
|
3082
|
+
if (width === 0 && height === 0) {
|
|
3083
|
+
return;
|
|
3084
|
+
}
|
|
3085
|
+
this.updateSafeAreaOverrides();
|
|
3086
|
+
});
|
|
3087
|
+
}
|
|
2955
3088
|
render() {
|
|
2956
3089
|
const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
|
|
2957
3090
|
const showHandle = handle !== false && isSheetModal;
|
|
@@ -2959,20 +3092,35 @@ const Modal = class {
|
|
|
2959
3092
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
2960
3093
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
2961
3094
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
2962
|
-
return (h(Host,
|
|
3095
|
+
return (h(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
|
|
2963
3096
|
// Allow the modal to be navigable when the handle is focusable
|
|
2964
|
-
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1
|
|
3097
|
+
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
|
|
2965
3098
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
2966
|
-
}, class:
|
|
3099
|
+
}, class: {
|
|
3100
|
+
[mode]: true,
|
|
3101
|
+
['modal-default']: !isCardModal && !isSheetModal,
|
|
3102
|
+
[`modal-card`]: isCardModal,
|
|
3103
|
+
[`modal-sheet`]: isSheetModal,
|
|
3104
|
+
[`modal-no-expand-scroll`]: isSheetModal && !expandToScroll,
|
|
3105
|
+
'overlay-hidden': true,
|
|
3106
|
+
[FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
|
|
3107
|
+
...getClassMap(this.cssClass),
|
|
3108
|
+
}, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '01b5b5765fb3a32393c736065c824bf760728823', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '40fa7727a0923f7d7461dd027f1511a6a148d84a', class: "modal-shadow" }), h("div", { key: '9af934b607f60795bd5bff7bee6eacfc9b14fa35',
|
|
2967
3109
|
/*
|
|
2968
3110
|
role and aria-modal must be used on the
|
|
2969
3111
|
same element. They must also be set inside the
|
|
2970
3112
|
shadow DOM otherwise ion-button will not be highlighted
|
|
2971
3113
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
3114
|
+
|
|
3115
|
+
tabIndex={-1} is required so present() can move focus to this
|
|
3116
|
+
element (which carries the dialog role) instead of the role-less
|
|
3117
|
+
host. role="dialog" alone does not make an element focusable, so
|
|
3118
|
+
without the tabindex focus() would be a no-op and screen readers
|
|
3119
|
+
may not properly announce the dialog and its content when it opens.
|
|
2972
3120
|
*/
|
|
2973
|
-
role: "dialog"
|
|
3121
|
+
role: "dialog", ...inheritedAttributes, "aria-modal": "true", tabIndex: -1, class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }, showHandle && (h("button", { key: 'df84a6806413b13efc5b03c862edde83151579a7', class: "modal-handle",
|
|
2974
3122
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
2975
|
-
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '
|
|
3123
|
+
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '072d3929ec6f25481946b184d8ac24219011e783', onSlotchange: this.onSlotChange }))));
|
|
2976
3124
|
}
|
|
2977
3125
|
get el() { return getElement(this); }
|
|
2978
3126
|
static get watchers() { return {
|