@ionic/core 9.0.1-dev.11787248963.10a00c73 → 9.0.1-dev.11787949960.1e63841c
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-gFwXiYC_.js → p-5rFO7X8J.js} +1 -1
- package/components/{p-BpLt_Ptn.js → p-7qDu1bID.js} +1 -1
- package/components/{p-7PNwKFZi.js → p-B2L09UOs.js} +1 -1
- package/components/{p-DcOH6-o5.js → p-BAJ7NctL.js} +1 -1
- package/components/{p-Kmrg3Fed.js → p-BE9noJ1O.js} +1 -1
- package/components/{p-CgvDC7hC.js → p-BFwL2yyK.js} +1 -1
- package/components/{p-DysqCsJu.js → p-BWHBdLfY.js} +1 -1
- package/components/{p-SR-LLqp_.js → p-Bcm-GVQM.js} +1 -1
- package/{dist/ionic/p-9wczfs_v.js → components/p-BcuLPPAE.js} +1 -1
- package/components/p-BhlP16sB.js +4 -0
- package/components/{p-H1f2qsk4.js → p-BqE7e5gH.js} +1 -1
- package/components/{p-BqBDq1Ma.js → p-C12SAK00.js} +1 -1
- package/components/p-C8Tp0cQy.js +4 -0
- package/components/{p-A8MJRBIY.js → p-C8mPeq0D.js} +1 -1
- package/components/{p-Bx2saTHs.js → p-CB06XtlF.js} +1 -1
- package/components/{p-BgUIV8NQ.js → p-CBhGZ6rF.js} +1 -1
- package/components/{p-B8MQjdvk.js → p-CDKY4TZ_.js} +1 -1
- package/components/{p-CWETxTjE.js → p-CEkamjav.js} +1 -1
- package/components/p-CFtAWaB6.js +4 -0
- package/components/{p-DEW7CnUc.js → p-CJTKYpZv.js} +1 -1
- package/components/{p-BA_4ZIEg.js → p-CLZPNP7x.js} +1 -1
- package/components/{p-tX3UxCnU.js → p-COxY7PLK.js} +1 -1
- package/components/p-CQxPXWNM.js +4 -0
- package/components/{p-DDdkefwf.js → p-CRcX0EGs.js} +1 -1
- package/components/p-CVNvmbDp.js +4 -0
- package/components/p-CXpy69Ei.js +4 -0
- package/{dist/ionic/p-BZxjcGRP.js → components/p-CdSLe3Q3.js} +1 -1
- package/components/p-CoGD-oMG.js +4 -0
- package/components/p-CpYeYl3u.js +4 -0
- package/components/{p-CaiZOhfC.js → p-CuS0-WwK.js} +1 -1
- package/components/{p-Bnc0m4SW.js → p-CxiXpCtB.js} +1 -1
- package/components/{p-BFtL8t1r.js → p-CyKlfXdt.js} +1 -1
- package/components/p-D2XJVty5.js +4 -0
- package/components/p-DALTMT_o.js +4 -0
- package/{dist/ionic/p-D0dfUysx.js → components/p-DG-dUCKp.js} +1 -1
- package/{dist/ionic/p-DF_Uqql8.js → components/p-DH0rRXjx.js} +1 -1
- package/components/{p-D7ysFE2B.js → p-DMkSsriG.js} +1 -1
- package/components/{p-B6x5_b9w.js → p-DkEb3SCT.js} +1 -1
- package/components/p-Dr-rBSUW.js +4 -0
- package/components/p-MHpJ2A_m.js +4 -0
- package/components/p-N6lZFXYR.js +4 -0
- package/components/p-QgdyH-Zs.js +4 -0
- package/components/{p-BMfgF-Tv.js → p-RRH-7cpd.js} +1 -1
- package/components/p-UKksD3f9.js +4 -0
- package/components/{p-v2NpoOHp.js → p-VTfnz_8u.js} +1 -1
- package/components/p-fP0QF3iG.js +4 -0
- package/components/{p-BPDxVIRr.js → p-l-zxxFre.js} +1 -1
- package/components/{p-BrFaQbGY.js → p-mXsQnyWB.js} +1 -1
- package/components/p-ntAkt4Ra.js +4 -0
- package/components/p-ufB0gCSU.js +4 -0
- package/components/p-z-BF3clL.js +4 -0
- package/css/core.css +1 -1
- package/css/core.css.map +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/dist/cjs/{animation-D-OqR4a4.js → animation-ihPP_z2n.js} +1 -1
- package/dist/cjs/{app-globals-BzgwARwJ.js → app-globals-BlkzA410.js} +1 -1
- package/dist/cjs/{button-active-BlWSD7uK.js → button-active-ItGBjzmO.js} +1 -1
- package/dist/cjs/{format-D7ig6Vm0.js → format-CPIqtp4x.js} +1 -1
- package/dist/cjs/{framework-delegate-BZUx4TnE.js → framework-delegate-DhyWUPGg.js} +1 -1
- package/dist/cjs/{hardware-back-button-JOAEFSzc.js → hardware-back-button-D5f_kASb.js} +1 -1
- package/dist/cjs/{helpers-Dj5o76mq.js → helpers-BCLkFTTd.js} +1 -1
- package/dist/cjs/{index-C8zH6b3d.js → index-49DTLc_Z.js} +2 -2
- package/dist/cjs/{index-CZ6vzt_q.js → index-BcyiqD6R.js} +5 -5
- package/dist/cjs/{index-BrVMoqUk.js → index-Bgz6BcKx.js} +50 -16
- package/dist/cjs/{index-EJLjthTK.js → index-BocV_y-c.js} +2 -1
- package/dist/cjs/{index-2sO-zkZ2.js → index-CldjPPyP.js} +4 -4
- package/dist/cjs/{index-Csue6G3m.js → index-xum7jdbq.js} +2 -2
- package/dist/cjs/index.cjs.js +12 -12
- package/dist/cjs/{input-shims-Bh7bnt2v.js → input-shims-Jisy7U7-.js} +3 -3
- package/dist/cjs/{input.utils-Cq3g9uHy.js → input.utils-BDTpGrfn.js} +1 -1
- package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +45 -29
- package/dist/cjs/ion-alert.cjs.entry.js +29 -21
- package/dist/cjs/ion-app_8.cjs.entry.js +38 -16
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-back-button.cjs.entry.js +3 -3
- package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-button_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-card_5.cjs.entry.js +3 -3
- package/dist/cjs/ion-checkbox.cjs.entry.js +4 -4
- package/dist/cjs/ion-chip.cjs.entry.js +2 -2
- package/dist/cjs/ion-col_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime-button.cjs.entry.js +4 -4
- package/dist/cjs/ion-datetime.cjs.entry.js +32 -24
- package/dist/cjs/ion-fab_3.cjs.entry.js +3 -3
- package/dist/cjs/ion-img.cjs.entry.js +3 -3
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +5 -5
- package/dist/cjs/ion-input-otp.cjs.entry.js +3 -3
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +2 -2
- package/dist/cjs/ion-input.cjs.entry.js +5 -5
- package/dist/cjs/ion-item-option_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
- package/dist/cjs/ion-loading.cjs.entry.js +14 -10
- package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
- package/dist/cjs/ion-modal.cjs.entry.js +85 -32
- package/dist/cjs/ion-nav_2.cjs.entry.js +6 -6
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +3 -3
- package/dist/cjs/ion-picker-column.cjs.entry.js +210 -46
- package/dist/cjs/ion-picker.cjs.entry.js +2 -2
- package/dist/cjs/ion-popover.cjs.entry.js +23 -10
- package/dist/cjs/ion-progress-bar.cjs.entry.js +3 -3
- package/dist/cjs/ion-radio_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-range.cjs.entry.js +4 -4
- package/dist/cjs/ion-refresher_2.cjs.entry.js +6 -6
- package/dist/cjs/ion-reorder_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +2 -2
- package/dist/cjs/ion-route_4.cjs.entry.js +4 -4
- package/dist/cjs/ion-searchbar.cjs.entry.js +3 -3
- package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment-view.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-select-modal.cjs.entry.js +8 -8
- package/dist/cjs/ion-select_3.cjs.entry.js +57 -47
- package/dist/cjs/ion-spinner.cjs.entry.js +2 -2
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +5 -5
- package/dist/cjs/ion-toast.cjs.entry.js +8 -8
- package/dist/cjs/ion-toggle.cjs.entry.js +4 -4
- package/dist/cjs/{ionic-global-DvgIzM2F.js → ionic-global-BMU-Us1Q.js} +1 -1
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-zIgdoSYe.js → ios.transition-OCcCN--B.js} +4 -4
- package/dist/cjs/{item-multiple-inputs-DG-ZGm6j.js → item-multiple-inputs-BH9yPC66.js} +1 -1
- package/dist/cjs/loader.cjs.js +3 -3
- package/dist/cjs/{md.transition-CXeJ9rfh.js → md.transition-D0o2IIbo.js} +4 -4
- package/dist/cjs/{overlays-Bg0auTQa.js → overlays-HN9joo1Z.js} +59 -34
- package/dist/cjs/{select-option-render-7m1WdFzF.js → select-option-render-BPjGDlsG.js} +2 -2
- package/dist/cjs/{slot-mutation-controller-BJEJzx_e.js → slot-mutation-controller-IQ250LoG.js} +1 -1
- package/dist/cjs/{status-tap-DxbUM5XX.js → status-tap-Bakl9czs.js} +3 -3
- package/dist/cjs/{swipe-back-F_DBt-Aw.js → swipe-back-Cv4OZVJ5.js} +2 -2
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/action-sheet/action-sheet.js +36 -20
- package/dist/collection/components/alert/alert.js +20 -12
- package/dist/collection/components/content/content.js +26 -4
- package/dist/collection/components/datetime/datetime.js +25 -17
- package/dist/collection/components/loading/loading.js +7 -3
- package/dist/collection/components/modal/modal.ios.css +12 -1
- package/dist/collection/components/modal/modal.js +75 -22
- package/dist/collection/components/modal/modal.md.css +12 -1
- package/dist/collection/components/picker-column/picker-column.js +207 -43
- package/dist/collection/components/popover/popover.js +16 -3
- package/dist/collection/components/select/select.js +49 -39
- package/dist/collection/utils/overlays.js +53 -29
- package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
- package/dist/collection/utils/test/playwright/index.js +1 -0
- package/dist/docs.json +279 -48
- package/dist/esm/{animation-TxGPYeDn.js → animation-B6KGUJwl.js} +1 -1
- package/dist/esm/{app-globals-Do8rJest.js → app-globals-BvutUX8P.js} +1 -1
- package/dist/esm/{button-active-ChA4D-ml.js → button-active-DRNebs9r.js} +1 -1
- package/dist/esm/{format-CVk5e_GP.js → format-BF3btM7P.js} +1 -1
- package/dist/esm/{framework-delegate-DaLWnISz.js → framework-delegate-60cEIAgt.js} +1 -1
- package/dist/esm/{hardware-back-button-D8W4L0JP.js → hardware-back-button-rhkwRNk2.js} +1 -1
- package/dist/esm/{helpers-BIgoInJU.js → helpers-DLLANtRS.js} +1 -1
- package/dist/esm/{index-C8Dsa6li.js → index-BZHVn0iF.js} +4 -4
- package/dist/esm/{index-DHw2lZxe.js → index-Bl4BUvBL.js} +2 -2
- package/dist/esm/{index-BmOR8tCv.js → index-DOrtAUWV.js} +2 -2
- package/dist/esm/{index-C5ZdL0qp.js → index-D_7MeuVD.js} +5 -5
- package/dist/esm/{index-elneMH8y.js → index-JgU5uTSY.js} +2 -2
- package/dist/esm/{index-CKYcsw8f.js → index-h81G-QbJ.js} +50 -16
- package/dist/esm/index.js +12 -12
- package/dist/esm/{input-shims-09NN97kF.js → input-shims-C2ipc_XX.js} +3 -3
- package/dist/esm/{input.utils-BxyH9l1w.js → input.utils-D-qoPjqr.js} +1 -1
- package/dist/esm/ion-accordion_2.entry.js +3 -3
- package/dist/esm/ion-action-sheet.entry.js +45 -29
- package/dist/esm/ion-alert.entry.js +29 -21
- package/dist/esm/ion-app_8.entry.js +38 -16
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-back-button.entry.js +3 -3
- package/dist/esm/ion-backdrop.entry.js +2 -2
- package/dist/esm/ion-breadcrumb_2.entry.js +3 -3
- package/dist/esm/ion-button_2.entry.js +3 -3
- package/dist/esm/ion-card_5.entry.js +3 -3
- package/dist/esm/ion-checkbox.entry.js +4 -4
- package/dist/esm/ion-chip.entry.js +2 -2
- package/dist/esm/ion-col_3.entry.js +2 -2
- package/dist/esm/ion-datetime-button.entry.js +4 -4
- package/dist/esm/ion-datetime.entry.js +32 -24
- package/dist/esm/ion-fab_3.entry.js +3 -3
- package/dist/esm/ion-img.entry.js +3 -3
- package/dist/esm/ion-infinite-scroll_2.entry.js +5 -5
- package/dist/esm/ion-input-otp.entry.js +3 -3
- package/dist/esm/ion-input-password-toggle.entry.js +2 -2
- package/dist/esm/ion-input.entry.js +5 -5
- package/dist/esm/ion-item-option_3.entry.js +4 -4
- package/dist/esm/ion-item_8.entry.js +3 -3
- package/dist/esm/ion-loading.entry.js +14 -10
- package/dist/esm/ion-menu_3.entry.js +8 -8
- package/dist/esm/ion-modal.entry.js +85 -32
- package/dist/esm/ion-nav_2.entry.js +6 -6
- package/dist/esm/ion-picker-column-option.entry.js +3 -3
- package/dist/esm/ion-picker-column.entry.js +211 -47
- package/dist/esm/ion-picker.entry.js +2 -2
- package/dist/esm/ion-popover.entry.js +23 -10
- package/dist/esm/ion-progress-bar.entry.js +3 -3
- package/dist/esm/ion-radio_2.entry.js +4 -4
- package/dist/esm/ion-range.entry.js +4 -4
- package/dist/esm/ion-refresher_2.entry.js +6 -6
- package/dist/esm/ion-reorder_2.entry.js +4 -4
- package/dist/esm/ion-ripple-effect.entry.js +2 -2
- package/dist/esm/ion-route_4.entry.js +4 -4
- package/dist/esm/ion-searchbar.entry.js +3 -3
- package/dist/esm/ion-segment-content.entry.js +1 -1
- package/dist/esm/ion-segment-view.entry.js +1 -1
- package/dist/esm/ion-segment_2.entry.js +3 -3
- package/dist/esm/ion-select-modal.entry.js +8 -8
- package/dist/esm/ion-select_3.entry.js +57 -47
- package/dist/esm/ion-spinner.entry.js +2 -2
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +3 -3
- package/dist/esm/ion-tab_2.entry.js +3 -3
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +5 -5
- package/dist/esm/ion-toast.entry.js +8 -8
- package/dist/esm/ion-toggle.entry.js +4 -4
- package/dist/esm/{ionic-global-lrowsHfi.js → ionic-global-B7I1sdvg.js} +1 -1
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-BQhADrk1.js → ios.transition-C-6IaIxe.js} +4 -4
- package/dist/esm/{item-multiple-inputs-D_N3fDkD.js → item-multiple-inputs-DI91syHS.js} +1 -1
- package/dist/esm/loader.js +4 -4
- package/dist/esm/{md.transition-D58NpmRa.js → md.transition-dyqt0t0d.js} +4 -4
- package/dist/esm/{overlays-BpnIFlXI.js → overlays-Dz2cGX5q.js} +59 -35
- package/dist/esm/{select-option-render-lIuu64EV.js → select-option-render-CUJpruSC.js} +2 -2
- package/dist/esm/{slot-mutation-controller-rS_T3FDR.js → slot-mutation-controller-wFuztlVD.js} +1 -1
- package/dist/esm/{status-tap-CpFQMLl6.js → status-tap-Dn_42wiy.js} +3 -3
- package/dist/esm/{swipe-back-rmc7zeNW.js → swipe-back-CqOqrHW7.js} +2 -2
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-010601fe.entry.js +4 -0
- package/dist/ionic/{p-05800a02.entry.js → p-025763b2.entry.js} +1 -1
- package/dist/ionic/{p-d8deff43.entry.js → p-026e2e4c.entry.js} +1 -1
- package/dist/ionic/{p-RzUn7cKs.js → p-06ZcwRF5.js} +1 -1
- package/dist/ionic/{p-b62bfce8.entry.js → p-082b8125.entry.js} +1 -1
- package/dist/ionic/{p-16e9f542.entry.js → p-0b52d921.entry.js} +1 -1
- package/dist/ionic/p-0c2b3555.entry.js +4 -0
- package/dist/ionic/{p-485fb218.entry.js → p-1a20571c.entry.js} +1 -1
- package/dist/ionic/{p-90ba736e.entry.js → p-1f66c230.entry.js} +1 -1
- package/dist/ionic/{p-a0fee899.entry.js → p-2aabd568.entry.js} +1 -1
- package/dist/ionic/{p-295ff427.entry.js → p-2ff12c8a.entry.js} +1 -1
- package/dist/ionic/{p-5b906fd6.entry.js → p-326e0d05.entry.js} +1 -1
- package/dist/ionic/p-392079fa.entry.js +4 -0
- package/dist/ionic/{p-6f048604.entry.js → p-43bae3f5.entry.js} +1 -1
- package/dist/ionic/p-4778b90f.entry.js +4 -0
- package/dist/ionic/{p-d3384a40.entry.js → p-47b8b59a.entry.js} +1 -1
- package/dist/ionic/{p-478035a7.entry.js → p-53ba5651.entry.js} +1 -1
- package/dist/ionic/{p-bbf6878c.entry.js → p-546b1109.entry.js} +1 -1
- package/dist/ionic/{p-8dd4c026.entry.js → p-5dc53bdf.entry.js} +1 -1
- package/dist/ionic/{p-1df75f9e.entry.js → p-5ed60413.entry.js} +1 -1
- package/dist/ionic/p-639d3b55.entry.js +4 -0
- package/dist/ionic/{p-ddfb7e5f.entry.js → p-6d84fa9f.entry.js} +1 -1
- package/dist/ionic/{p-72ad7c64.entry.js → p-7c859f42.entry.js} +1 -1
- package/dist/ionic/p-7dec112e.entry.js +4 -0
- package/dist/ionic/{p-f376876b.entry.js → p-83aa7d47.entry.js} +1 -1
- package/dist/ionic/{p-959df5f8.entry.js → p-8d72244b.entry.js} +1 -1
- package/dist/ionic/{p-9e455875.entry.js → p-8e388a30.entry.js} +1 -1
- package/dist/ionic/{p-75887ee0.entry.js → p-90e06e60.entry.js} +1 -1
- package/dist/ionic/{p-b5f37106.entry.js → p-9452849d.entry.js} +1 -1
- package/dist/ionic/{p-a54bcd16.entry.js → p-9e688396.entry.js} +1 -1
- package/dist/ionic/{p-cad4eccf.entry.js → p-9eba0d8a.entry.js} +1 -1
- package/dist/ionic/{p-8e007f11.entry.js → p-9f2d3987.entry.js} +1 -1
- package/dist/ionic/p-9fef333a.entry.js +4 -0
- package/{components/p-BSARlp49.js → dist/ionic/p-BC17SPKH.js} +1 -1
- package/dist/ionic/p-BRa1Jjxr.js +4 -0
- package/dist/ionic/{p-De0eY881.js → p-BRc8gq5v.js} +1 -1
- package/{components/p-66ogmUZU.js → dist/ionic/p-BpG7jkT9.js} +1 -1
- package/dist/ionic/{p-B1Y7LZhV.js → p-C10K-FJg.js} +1 -1
- package/dist/ionic/{p-D9yvytgv.js → p-C2BY_4Wp.js} +1 -1
- package/dist/ionic/{p-BZVE25Gu.js → p-CH8tk7Pr.js} +1 -1
- package/dist/ionic/{p-CDBop-kz.js → p-CTBfxfjC.js} +1 -1
- package/dist/ionic/p-Cc-fFNy8.js +4 -0
- package/dist/ionic/p-Cc4w3fVf.js +4 -0
- package/{components/p-BuPAFTWI.js → dist/ionic/p-CoEa7CiN.js} +1 -1
- package/dist/ionic/p-CvRL-Eju.js +4 -0
- package/dist/ionic/p-DA88iqXQ.js +4 -0
- package/dist/ionic/{p-DXJgZWgi.js → p-DMj-M2c4.js} +1 -1
- package/dist/ionic/p-D_IgV7tz.js +4 -0
- package/dist/ionic/{p-VquyMbjp.js → p-DoUx_N0R.js} +1 -1
- package/dist/ionic/{p-C4IBDDj6.js → p-KJ5pLPiN.js} +1 -1
- package/dist/ionic/{p-ByLaqOPm.js → p-Q9w8L_Sw.js} +1 -1
- package/dist/ionic/{p-ClrlQU2y.js → p-S1shXW5M.js} +1 -1
- package/dist/ionic/{p-1db2afb4.entry.js → p-a2fccdaa.entry.js} +1 -1
- package/dist/ionic/{p-fbd83d4c.entry.js → p-ac71362a.entry.js} +1 -1
- package/dist/ionic/p-b8cd338d.entry.js +4 -0
- package/dist/ionic/{p-873a315a.entry.js → p-bdc01880.entry.js} +1 -1
- package/dist/ionic/{p-5f216b79.entry.js → p-ca57763d.entry.js} +1 -1
- package/dist/ionic/{p-39a8d4e0.entry.js → p-cc749877.entry.js} +1 -1
- package/dist/ionic/{p-56307aea.entry.js → p-d1539609.entry.js} +1 -1
- package/dist/ionic/{p-cdc5115e.entry.js → p-d1b888de.entry.js} +1 -1
- package/dist/ionic/p-d85e59b1.entry.js +4 -0
- package/dist/ionic/p-dad2f3e4.entry.js +4 -0
- package/dist/ionic/{p-70ee8888.entry.js → p-dadcb3d2.entry.js} +1 -1
- package/dist/ionic/{p-c49165af.entry.js → p-e93cc1e1.entry.js} +1 -1
- package/dist/ionic/{p-f7dd1ed9.entry.js → p-eab77a74.entry.js} +1 -1
- package/dist/ionic/{p-aebc4d69.entry.js → p-eaeac54e.entry.js} +1 -1
- package/dist/ionic/{p-e538f18d.entry.js → p-ecfc9c71.entry.js} +1 -1
- package/dist/ionic/{p-5ee2d7b1.entry.js → p-eeb65463.entry.js} +1 -1
- package/dist/ionic/{p-881b6954.entry.js → p-f0645c98.entry.js} +1 -1
- package/dist/ionic/{p-d8bae128.entry.js → p-f607ad4f.entry.js} +1 -1
- package/dist/ionic/{p-61c799d1.entry.js → p-fb4dabbb.entry.js} +1 -1
- package/dist/ionic/{p-63bbba8d.entry.js → p-fe80ebb1.entry.js} +1 -1
- package/dist/ionic/p-h81G-QbJ.js +6 -0
- package/dist/ionic/p-nxFQkv7U.js +4 -0
- package/dist/ionic/p-w3KTiug9.js +4 -0
- package/{components/p-RFfE9hF6.js → dist/ionic/p-wdSUbx5C.js} +1 -1
- 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/content/content.d.ts +7 -0
- package/dist/types/components/modal/modal.d.ts +8 -0
- package/dist/types/components/picker-column/picker-column.d.ts +42 -0
- package/dist/types/components.d.ts +1 -1
- package/dist/types/stencil-public-runtime.d.ts +12 -0
- package/dist/types/utils/overlays.d.ts +9 -0
- package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
- package/dist/types/utils/test/playwright/index.d.ts +1 -0
- package/hydrate/index.js +538 -195
- package/hydrate/index.mjs +538 -195
- package/loader/index.d.ts +1 -1
- package/package.json +2 -2
- package/components/p-6Vp915Y7.js +0 -4
- package/components/p-AQcCdH2_.js +0 -4
- package/components/p-BdwCtX8Y.js +0 -4
- package/components/p-Bg4OwDwb.js +0 -4
- package/components/p-BxhE2W85.js +0 -4
- package/components/p-CHswSpKy.js +0 -4
- package/components/p-CQAjyETU.js +0 -4
- package/components/p-CR9OgE6N.js +0 -4
- package/components/p-CaZeZIL2.js +0 -4
- package/components/p-CqyGR9Aq.js +0 -4
- package/components/p-DCWfzDM8.js +0 -4
- package/components/p-DQ1IPvZO.js +0 -4
- package/components/p-DfdYCsov.js +0 -4
- package/components/p-DhOoEIAs.js +0 -4
- package/components/p-Dl_7b_UJ.js +0 -4
- package/components/p-DqAI6tg7.js +0 -4
- package/components/p-DrehWDfv.js +0 -4
- package/components/p-HVYBAhFx.js +0 -4
- package/components/p-eFI3mtEX.js +0 -4
- package/dist/ionic/p-0eb50dca.entry.js +0 -4
- package/dist/ionic/p-18d532a3.entry.js +0 -4
- package/dist/ionic/p-34b9379b.entry.js +0 -4
- package/dist/ionic/p-4437015c.entry.js +0 -4
- package/dist/ionic/p-48c859fe.entry.js +0 -4
- package/dist/ionic/p-49b9d405.entry.js +0 -4
- package/dist/ionic/p-68507e70.entry.js +0 -4
- package/dist/ionic/p-886d9e66.entry.js +0 -4
- package/dist/ionic/p-8f51110d.entry.js +0 -4
- package/dist/ionic/p-B5RyLYvl.js +0 -4
- package/dist/ionic/p-BQv5i5Kf.js +0 -4
- package/dist/ionic/p-BnGA34Pd.js +0 -4
- package/dist/ionic/p-C06QNN45.js +0 -4
- package/dist/ionic/p-CCVlNZ__.js +0 -4
- package/dist/ionic/p-CKYcsw8f.js +0 -5
- package/dist/ionic/p-CazSodad.js +0 -4
- package/dist/ionic/p-DdhHqKj-.js +0 -4
- package/dist/ionic/p-DgUL3JbO.js +0 -4
- package/dist/ionic/p-b7a11b58.entry.js +0 -4
|
@@ -7,7 +7,7 @@ import { CoreDelegate, attachComponent, detachComponent } from "../../utils/fram
|
|
|
7
7
|
import { addEventListener, raf, hasLazyBuild } from "../../utils/helpers";
|
|
8
8
|
import { createLockController } from "../../utils/lock-controller";
|
|
9
9
|
import { printIonWarning } from "../../utils/logging/index";
|
|
10
|
-
import { BACKDROP, cleanupRootFocusTrapAccessibility, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, prepareOverlay, present, setOverlayId, } from "../../utils/overlays";
|
|
10
|
+
import { BACKDROP, cleanupRootFocusTrapAccessibility, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, prepareOverlay, present, restoreRootFocusTrapAccessibility, setOverlayId, } from "../../utils/overlays";
|
|
11
11
|
import { isPlatform } from "../../utils/platform";
|
|
12
12
|
import { getClassMap } from "../../utils/theme";
|
|
13
13
|
import { deepReady, waitForMount } from "../../utils/transition/index";
|
|
@@ -219,6 +219,13 @@ export class Popover {
|
|
|
219
219
|
const { configureTriggerInteraction, el } = this;
|
|
220
220
|
prepareOverlay(el);
|
|
221
221
|
configureTriggerInteraction();
|
|
222
|
+
// Re-apply the root lock if moved without dismiss() being called
|
|
223
|
+
if (this.presented) {
|
|
224
|
+
restoreRootFocusTrapAccessibility(el);
|
|
225
|
+
// The disconnect tore down the header observer, and `present()` is its
|
|
226
|
+
// only other caller, so a move mid-layout would lose the recalculation.
|
|
227
|
+
this.recalculateContentOnHeaderReady();
|
|
228
|
+
}
|
|
222
229
|
}
|
|
223
230
|
disconnectedCallback() {
|
|
224
231
|
const { destroyTriggerInteraction } = this;
|
|
@@ -396,6 +403,12 @@ export class Popover {
|
|
|
396
403
|
if (!header || contentElements.length === 0) {
|
|
397
404
|
return;
|
|
398
405
|
}
|
|
406
|
+
// Both `present()` and a reconnect call this, so drop any existing
|
|
407
|
+
// observer. Below the guards, so a call that bails cannot leave none.
|
|
408
|
+
if (this.headerResizeObserver) {
|
|
409
|
+
this.headerResizeObserver.disconnect();
|
|
410
|
+
this.headerResizeObserver = undefined;
|
|
411
|
+
}
|
|
399
412
|
this.headerResizeObserver = new ResizeObserver(async () => {
|
|
400
413
|
if (header.offsetHeight > 0) {
|
|
401
414
|
this.headerResizeObserver?.disconnect();
|
|
@@ -468,7 +481,7 @@ export class Popover {
|
|
|
468
481
|
const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
|
|
469
482
|
const desktop = isPlatform('desktop');
|
|
470
483
|
const enableArrow = arrow && !parentPopover;
|
|
471
|
-
return (h(Host, { key: '
|
|
484
|
+
return (h(Host, { key: 'b5e9c788f58397203976d5f8302dfb89e916efe1', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
|
|
472
485
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
473
486
|
}, class: {
|
|
474
487
|
...getClassMap(this.cssClass),
|
|
@@ -479,7 +492,7 @@ export class Popover {
|
|
|
479
492
|
[`popover-side-${side}`]: true,
|
|
480
493
|
[FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
|
|
481
494
|
'popover-nested': !!parentPopover,
|
|
482
|
-
}, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && h("ion-backdrop", { key: '
|
|
495
|
+
}, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && h("ion-backdrop", { key: 'f3977833c5b2c0087c286ee54363b478d69eb115', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: '1059893d6fd2932ca8adcdf8d45a5d66f4794727', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '24d7988bdd95882ad77fcaa7112aeda55878bee4', class: "popover-arrow", part: "arrow" }), h("div", { key: '4d6992e0a9d629f11763045f9199f9a77fa521ab', class: "popover-content", part: "content" }, h("slot", { key: 'b29747419620a01a6c34e9e846cd529b0b210145' })))));
|
|
483
496
|
}
|
|
484
497
|
static get is() { return "ion-popover"; }
|
|
485
498
|
static get encapsulation() { return "shadow"; }
|
|
@@ -8,7 +8,7 @@ import { focusVisibleElement, renderHiddenInput, inheritAttributes } from "../..
|
|
|
8
8
|
import { printIonWarning } from "../../utils/logging/index";
|
|
9
9
|
import { actionSheetController, alertController, popoverController, modalController } from "../../utils/overlays";
|
|
10
10
|
import { isRTL } from "../../utils/rtl/index";
|
|
11
|
-
import { reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
|
|
11
|
+
import { blockedTags, reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
|
|
12
12
|
import { createSlotMutationController } from "../../utils/slot-mutation-controller";
|
|
13
13
|
import { createColorClasses, hostContext } from "../../utils/theme";
|
|
14
14
|
import { watchForOptions } from "../../utils/watch-options";
|
|
@@ -947,7 +947,7 @@ export class Select {
|
|
|
947
947
|
const hasOutlineFill = mode === 'md' && fill === 'outline';
|
|
948
948
|
renderHiddenInput(true, el, name, parseValue(value), disabled);
|
|
949
949
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
|
|
950
|
-
return (h(Host, { key: '
|
|
950
|
+
return (h(Host, { key: 'b2f161e3706e139e61440cd13e162714b1b75d72', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
951
951
|
[mode]: true,
|
|
952
952
|
'in-item': inItem,
|
|
953
953
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -965,7 +965,7 @@ export class Select {
|
|
|
965
965
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
966
966
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
967
967
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
968
|
-
}) }, h("label", { key: '
|
|
968
|
+
}) }, h("label", { key: '944a2eb468154a21260d181fdaf67828a71eb902', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '927200c53548b1bb4f52d6a167605b724a7b7d0d', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: '6e14b95e9b95c116b16744d630600e90977782bc', name: "start" })), h("div", { key: '8451ed4300ac005963075be36a04ea8763bc0fdd', class: "select-control", part: "control" }, this.renderLabel(), h("div", { key: '207e7b63f3224a4870579365ac992da6784fb31f', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), h("div", { key: '5c17367d488db4d570f31b25e33560efa9011500', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), h("slot", { key: '21fd8c0d9bee8cffef9ef6984cacd31e8f38211c', name: "end" })), shouldRenderHighlight && h("div", { key: '1fff767db9a1ec07b274ef65ff7ae8fb976e6ad2', class: "select-highlight" })), this.renderBottomContent()));
|
|
969
969
|
}
|
|
970
970
|
static get is() { return "ion-select"; }
|
|
971
971
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1663,29 +1663,14 @@ const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
|
1663
1663
|
return getOptionContent(selectOpt, undefined, true);
|
|
1664
1664
|
}
|
|
1665
1665
|
/**
|
|
1666
|
-
*
|
|
1667
|
-
*
|
|
1668
|
-
* the
|
|
1666
|
+
* Every text-only context reads only the default slot, so the start
|
|
1667
|
+
* and end slots stay out of the `aria-label` and the overlay labels.
|
|
1668
|
+
* Both config paths derive that text through the same helper, so they
|
|
1669
|
+
* cannot disagree about what an option's text is. `null` marks an
|
|
1670
|
+
* option with no text, which is dropped from the joined text of a
|
|
1671
|
+
* `multiple` select rather than joined in as an empty entry.
|
|
1669
1672
|
*/
|
|
1670
|
-
|
|
1671
|
-
const content = getOptionContent(selectOpt);
|
|
1672
|
-
if (typeof content === 'string') {
|
|
1673
|
-
return content;
|
|
1674
|
-
}
|
|
1675
|
-
/**
|
|
1676
|
-
* Elements were found in the default slot, extract and concatenate
|
|
1677
|
-
* their text content while trimming whitespace.
|
|
1678
|
-
*/
|
|
1679
|
-
if (content) {
|
|
1680
|
-
const texts = Array.from(content.childNodes)
|
|
1681
|
-
.map((n) => n.textContent?.trim())
|
|
1682
|
-
.filter((t) => t);
|
|
1683
|
-
return texts.join(' ') || null;
|
|
1684
|
-
}
|
|
1685
|
-
// Empty option
|
|
1686
|
-
return null;
|
|
1687
|
-
}
|
|
1688
|
-
return getDefaultSlotPlainText(selectOpt);
|
|
1673
|
+
return getDefaultSlotPlainText(selectOpt) || null;
|
|
1689
1674
|
};
|
|
1690
1675
|
/**
|
|
1691
1676
|
* Trims whitespace from all text nodes within a DOM tree.
|
|
@@ -1741,9 +1726,13 @@ const getOptionContent = (option, slotName, useHTML = false) => {
|
|
|
1741
1726
|
if (nodes.length === 0) {
|
|
1742
1727
|
return null;
|
|
1743
1728
|
}
|
|
1744
|
-
|
|
1729
|
+
/**
|
|
1730
|
+
* Return plain text if no elements are found. This reads the option the
|
|
1731
|
+
* same way the non-custom-HTML path does, so the two do not disagree
|
|
1732
|
+
* about what an option's text is.
|
|
1733
|
+
*/
|
|
1745
1734
|
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1746
|
-
return
|
|
1735
|
+
return getDefaultSlotPlainText(option) || null;
|
|
1747
1736
|
}
|
|
1748
1737
|
/**
|
|
1749
1738
|
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
@@ -1799,22 +1788,43 @@ const getOptionDefaultSlot = (option) => {
|
|
|
1799
1788
|
}
|
|
1800
1789
|
return defaultSlotNodes;
|
|
1801
1790
|
};
|
|
1791
|
+
/**
|
|
1792
|
+
* Concatenates the text a node renders, skipping the subtrees of tags
|
|
1793
|
+
* whose contents the browser never paints (`script`, `style`, and the
|
|
1794
|
+
* rest of `blockedTags`). `textContent` includes those, so reading it
|
|
1795
|
+
* directly would put stylesheet or script source into the select text
|
|
1796
|
+
* and the `aria-label`.
|
|
1797
|
+
*
|
|
1798
|
+
* @param node - The node to read text from.
|
|
1799
|
+
* @returns The node's rendered text.
|
|
1800
|
+
*/
|
|
1801
|
+
const getRenderedTextContent = (node) => {
|
|
1802
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
1803
|
+
return node.textContent ?? '';
|
|
1804
|
+
}
|
|
1805
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
1806
|
+
return '';
|
|
1807
|
+
}
|
|
1808
|
+
if (blockedTags.includes(node.tagName.toLowerCase())) {
|
|
1809
|
+
return '';
|
|
1810
|
+
}
|
|
1811
|
+
return Array.from(node.childNodes)
|
|
1812
|
+
.map((child) => getRenderedTextContent(child))
|
|
1813
|
+
.join('');
|
|
1814
|
+
};
|
|
1802
1815
|
/**
|
|
1803
1816
|
* Extracts plain text from only the default slot of an option,
|
|
1804
|
-
* excluding content assigned to named slots (start/end).
|
|
1817
|
+
* excluding content assigned to named slots (start/end). Text is
|
|
1818
|
+
* concatenated with no separator and collapsible whitespace is
|
|
1819
|
+
* collapsed, approximating how the browser renders the option.
|
|
1820
|
+
* NBSP is not collapsible, so it is preserved.
|
|
1821
|
+
*
|
|
1822
|
+
* @param option - The `ion-select-option` element to read text from.
|
|
1823
|
+
* @returns The option's default slot text.
|
|
1805
1824
|
*/
|
|
1806
1825
|
const getDefaultSlotPlainText = (option) => {
|
|
1807
|
-
const
|
|
1808
|
-
|
|
1809
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1810
|
-
return !node.hasAttribute('slot');
|
|
1811
|
-
}
|
|
1812
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1813
|
-
})
|
|
1814
|
-
.filter((node) => node.nodeType === Node.TEXT_NODE)
|
|
1815
|
-
.map((n) => n.textContent?.trim())
|
|
1816
|
-
.filter((t) => t);
|
|
1817
|
-
return texts.join(' ');
|
|
1826
|
+
const text = (getOptionDefaultSlot(option) ?? []).map((node) => getRenderedTextContent(node)).join('');
|
|
1827
|
+
return text.replace(/[ \t\n\r\f]+/g, ' ').replace(/^[ \t\n\r\f]+|[ \t\n\r\f]+$/g, '');
|
|
1818
1828
|
};
|
|
1819
1829
|
/**
|
|
1820
1830
|
* Extracts the rich content from an `ion-select-option`.
|
|
@@ -21,6 +21,15 @@ export const activeAnimations = new WeakMap();
|
|
|
21
21
|
const isBackdropAlwaysBlocking = (el) => {
|
|
22
22
|
return el.showBackdrop !== false && !((el.backdropBreakpoint ?? 0) > 0);
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Whether the overlay takes the app root out of the accessibility tree and
|
|
26
|
+
* blocks body scroll while presented. Toasts never do, modal and popover can
|
|
27
|
+
* opt out with `focusTrap={false}`, and a backdrop that does not block
|
|
28
|
+
* (`showBackdrop={false}`, or a `backdropBreakpoint` above 0) is excluded.
|
|
29
|
+
*/
|
|
30
|
+
const locksAppRoot = (el) => {
|
|
31
|
+
return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
|
|
32
|
+
};
|
|
24
33
|
const createController = (tagName) => {
|
|
25
34
|
return {
|
|
26
35
|
create(options) {
|
|
@@ -391,6 +400,13 @@ export const getPresentedOverlay = (doc, overlayTag, id) => {
|
|
|
391
400
|
// Otherwise, return the last overlay with the given id
|
|
392
401
|
return (id === undefined ? overlays : overlays.filter((o) => o.id === id)).slice(-1)[0];
|
|
393
402
|
};
|
|
403
|
+
/**
|
|
404
|
+
* The element an app nests its views under. Overlays hide this rather than the
|
|
405
|
+
* whole root, so the overlay itself (a sibling) stays reachable.
|
|
406
|
+
*/
|
|
407
|
+
const getViewContainer = () => {
|
|
408
|
+
return getAppRoot(document).querySelector('ion-router-outlet, #ion-view-container-root');
|
|
409
|
+
};
|
|
394
410
|
/**
|
|
395
411
|
* When an overlay is presented, the main
|
|
396
412
|
* focus is the overlay not the page content.
|
|
@@ -414,8 +430,7 @@ export const getPresentedOverlay = (doc, overlayTag, id) => {
|
|
|
414
430
|
* for main content.
|
|
415
431
|
*/
|
|
416
432
|
export const setRootAriaHidden = (hidden = false) => {
|
|
417
|
-
const
|
|
418
|
-
const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
|
|
433
|
+
const viewContainer = getViewContainer();
|
|
419
434
|
if (!viewContainer) {
|
|
420
435
|
return;
|
|
421
436
|
}
|
|
@@ -440,15 +455,42 @@ export const cleanupRootFocusTrapAccessibility = () => {
|
|
|
440
455
|
return;
|
|
441
456
|
}
|
|
442
457
|
const remainingOverlays = getPresentedOverlays(document);
|
|
443
|
-
const hasRemainingLocking = remainingOverlays.some((o) =>
|
|
444
|
-
const el = o;
|
|
445
|
-
return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
|
|
446
|
-
});
|
|
458
|
+
const hasRemainingLocking = remainingOverlays.some((o) => locksAppRoot(o));
|
|
447
459
|
if (!hasRemainingLocking) {
|
|
448
460
|
setRootAriaHidden(false);
|
|
449
461
|
document.body.classList.remove(BACKDROP_NO_SCROLL);
|
|
450
462
|
}
|
|
451
463
|
};
|
|
464
|
+
/**
|
|
465
|
+
* Applies the root lock itself: `aria-hidden` on the view container, and
|
|
466
|
+
* `backdrop-no-scroll` on the body. Shared by `present()` and the restore
|
|
467
|
+
* below, which have to stay in lockstep.
|
|
468
|
+
*/
|
|
469
|
+
const applyRootLock = (el) => {
|
|
470
|
+
// Hiding the container the overlay now sits in would hide the overlay too.
|
|
471
|
+
if (!getViewContainer()?.contains(el)) {
|
|
472
|
+
setRootAriaHidden(true);
|
|
473
|
+
}
|
|
474
|
+
document.body.classList.add(BACKDROP_NO_SCROLL);
|
|
475
|
+
};
|
|
476
|
+
/**
|
|
477
|
+
* Re-applies the root lock that `cleanupRootFocusTrapAccessibility()` released.
|
|
478
|
+
* Call from `connectedCallback` when the overlay is still presented.
|
|
479
|
+
*
|
|
480
|
+
* A synchronous move keeps the overlay connected, so the lock survives. A
|
|
481
|
+
* detach with a re-insert in a later task releases it, which is the shape a
|
|
482
|
+
* framework produces when it takes a subtree out and puts it back.
|
|
483
|
+
*/
|
|
484
|
+
export const restoreRootFocusTrapAccessibility = (overlayEl) => {
|
|
485
|
+
if (typeof document === 'undefined') {
|
|
486
|
+
return;
|
|
487
|
+
}
|
|
488
|
+
const el = overlayEl;
|
|
489
|
+
if (!locksAppRoot(el)) {
|
|
490
|
+
return;
|
|
491
|
+
}
|
|
492
|
+
applyRootLock(el);
|
|
493
|
+
};
|
|
452
494
|
export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation, opts) => {
|
|
453
495
|
if (overlay.presented) {
|
|
454
496
|
return;
|
|
@@ -465,15 +507,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
|
|
|
465
507
|
restoreElementFocus(overlay.el);
|
|
466
508
|
}
|
|
467
509
|
/**
|
|
468
|
-
*
|
|
469
|
-
* focus traps.
|
|
470
|
-
*
|
|
471
|
-
* All other overlays should have focus traps to prevent
|
|
472
|
-
* the keyboard focus from leaving the overlay unless
|
|
473
|
-
* developers explicitly opt out (for example, sheet
|
|
474
|
-
* modals that should permit background interaction).
|
|
475
|
-
*
|
|
476
|
-
* Note: Some apps move inline overlays to a specific container
|
|
510
|
+
* Some apps move inline overlays to a specific container
|
|
477
511
|
* during the willPresent lifecycle (e.g., React portals via
|
|
478
512
|
* onWillPresent). Defer applying aria-hidden/inert to the app
|
|
479
513
|
* root until after willPresent so we can detect where the
|
|
@@ -482,18 +516,11 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
|
|
|
482
516
|
* to avoid disabling the overlay.
|
|
483
517
|
*/
|
|
484
518
|
const overlayEl = overlay.el;
|
|
485
|
-
const
|
|
486
|
-
const shouldLockRoot = shouldTrapFocus && isBackdropAlwaysBlocking(overlayEl);
|
|
519
|
+
const shouldLockRoot = locksAppRoot(overlayEl);
|
|
487
520
|
overlay.presented = true;
|
|
488
521
|
overlay.willPresent.emit();
|
|
489
522
|
if (shouldLockRoot) {
|
|
490
|
-
|
|
491
|
-
const viewContainer = root.querySelector('ion-router-outlet, #ion-view-container-root');
|
|
492
|
-
const overlayInsideViewContainer = viewContainer ? viewContainer.contains(overlayEl) : false;
|
|
493
|
-
if (!overlayInsideViewContainer) {
|
|
494
|
-
setRootAriaHidden(true);
|
|
495
|
-
}
|
|
496
|
-
document.body.classList.add(BACKDROP_NO_SCROLL);
|
|
523
|
+
applyRootLock(overlayEl);
|
|
497
524
|
}
|
|
498
525
|
overlay.willPresentShorthand?.emit();
|
|
499
526
|
const mode = getIonMode(overlay);
|
|
@@ -619,12 +646,9 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
|
|
|
619
646
|
* from the root element when the last focus-trapping overlay
|
|
620
647
|
* is dismissed.
|
|
621
648
|
*/
|
|
622
|
-
const overlaysLockingRoot = presentedOverlays.filter((o) =>
|
|
623
|
-
const el = o;
|
|
624
|
-
return el.tagName !== 'ION-TOAST' && el.focusTrap !== false && isBackdropAlwaysBlocking(el);
|
|
625
|
-
});
|
|
649
|
+
const overlaysLockingRoot = presentedOverlays.filter((o) => locksAppRoot(o));
|
|
626
650
|
const overlayEl = overlay.el;
|
|
627
|
-
const locksRoot =
|
|
651
|
+
const locksRoot = locksAppRoot(overlayEl);
|
|
628
652
|
/**
|
|
629
653
|
* If this is the last visible overlay that is trapping focus
|
|
630
654
|
* then we want to re-add the root to the accessibility tree.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Detaches an element and puts it back in a later task, the way a framework
|
|
6
|
+
* binding relocates a subtree it owns.
|
|
7
|
+
*
|
|
8
|
+
* A single `appendChild` won't do it. Custom element reactions run at the end
|
|
9
|
+
* of the same task, so `disconnectedCallback` fires with the element already
|
|
10
|
+
* back and nothing tears down. The detach has to survive a task before the
|
|
11
|
+
* disconnect is observable.
|
|
12
|
+
*
|
|
13
|
+
* Pass `containerSelector` to hold the element somewhere other than the body.
|
|
14
|
+
*/
|
|
15
|
+
export const detachAndReattach = async (locator, containerSelector = 'body') => {
|
|
16
|
+
await locator.evaluate(async (el, selector) => {
|
|
17
|
+
const holder = document.createElement('div');
|
|
18
|
+
document.querySelector(selector).appendChild(holder);
|
|
19
|
+
el.remove();
|
|
20
|
+
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
21
|
+
holder.appendChild(el);
|
|
22
|
+
}, containerSelector);
|
|
23
|
+
};
|