@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
|
@@ -5,7 +5,7 @@ import { Host, h } from "@stencil/core";
|
|
|
5
5
|
import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
|
|
6
6
|
import { raf } from "../../utils/helpers";
|
|
7
7
|
import { createLockController } from "../../utils/lock-controller";
|
|
8
|
-
import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, prepareOverlay, present, setOverlayId, } from "../../utils/overlays";
|
|
8
|
+
import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, prepareOverlay, present, restoreRootFocusTrapAccessibility, setOverlayId, } from "../../utils/overlays";
|
|
9
9
|
import { sanitizeDOMString } from "../../utils/sanitization/index";
|
|
10
10
|
import { getClassMap } from "../../utils/theme";
|
|
11
11
|
import { config } from "../../global/config";
|
|
@@ -82,6 +82,10 @@ export class Loading {
|
|
|
82
82
|
connectedCallback() {
|
|
83
83
|
prepareOverlay(this.el);
|
|
84
84
|
this.triggerChanged();
|
|
85
|
+
// Re-apply the root lock if moved without dismiss() being called
|
|
86
|
+
if (this.presented) {
|
|
87
|
+
restoreRootFocusTrapAccessibility(this.el);
|
|
88
|
+
}
|
|
85
89
|
}
|
|
86
90
|
componentWillLoad() {
|
|
87
91
|
if (this.spinner === undefined) {
|
|
@@ -182,14 +186,14 @@ export class Loading {
|
|
|
182
186
|
* Otherwise, don't set aria-labelledby.
|
|
183
187
|
*/
|
|
184
188
|
const ariaLabelledBy = message !== undefined ? msgId : null;
|
|
185
|
-
return (h(Host, { key: '
|
|
189
|
+
return (h(Host, { key: 'b4430bc66aedeca19d5645667cba73c169c4bd76', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1", ...htmlAttributes, style: {
|
|
186
190
|
zIndex: `${40000 + this.overlayIndex}`,
|
|
187
191
|
}, onIonBackdropTap: this.onBackdropTap, class: {
|
|
188
192
|
...getClassMap(this.cssClass),
|
|
189
193
|
[mode]: true,
|
|
190
194
|
'overlay-hidden': true,
|
|
191
195
|
'loading-translucent': this.translucent,
|
|
192
|
-
} }, h("ion-backdrop", { key: '
|
|
196
|
+
} }, h("ion-backdrop", { key: 'dec0df942ae778c99ebd4dbf08d6c2a0a992639d', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: '71b2d5fc259666225047fc901648ada1efcd5d4b', tabindex: "0", "aria-hidden": "true" }), h("div", { key: '1d83dc3b57ee70c9e8c0f006c6fa576bd96ecded', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (h("div", { key: 'd1cd127e044b8831e396b53122322c1db7e89904', class: "loading-spinner" }, h("ion-spinner", { key: '38c2580cf5659da612872f01801a5fbdc2c023ba', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), h("div", { key: '90e5e32ffe0df2c691f364149f43374e676bfaa3', tabindex: "0", "aria-hidden": "true" })));
|
|
193
197
|
}
|
|
194
198
|
static get is() { return "ion-loading"; }
|
|
195
199
|
static get encapsulation() { return "scoped"; }
|
|
@@ -77,7 +77,12 @@
|
|
|
77
77
|
--max-width: auto;
|
|
78
78
|
--height: 100%;
|
|
79
79
|
--min-height: auto;
|
|
80
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Clamps a content-sized `--height` (auto, fit-content, ...) to the
|
|
82
|
+
* overlay, giving the wrapper's flex children something to shrink
|
|
83
|
+
* toward so `ion-content` scrolls instead of overflowing.
|
|
84
|
+
*/
|
|
85
|
+
--max-height: 100%;
|
|
81
86
|
--overflow: hidden;
|
|
82
87
|
--border-radius: 0;
|
|
83
88
|
--border-width: 0;
|
|
@@ -129,8 +134,14 @@ ion-backdrop {
|
|
|
129
134
|
/**
|
|
130
135
|
* The wrapper receives programmatic focus for screen readers but should not
|
|
131
136
|
* show a visible focus ring, which is meant only for keyboard navigation.
|
|
137
|
+
*
|
|
138
|
+
* A flex layout is required for the wrapper to size itself to its content
|
|
139
|
+
* when the modal is content-sized (`--height` is auto, fit-content, ...).
|
|
140
|
+
* This makes it so that the content can scroll when it overflows the wrapper.
|
|
132
141
|
*/
|
|
133
142
|
.modal-wrapper {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
134
145
|
outline: none;
|
|
135
146
|
}
|
|
136
147
|
|
|
@@ -8,7 +8,7 @@ import { raf, inheritAttributes, hasLazyBuild, getElementRoot } from "../../util
|
|
|
8
8
|
import { createLockController } from "../../utils/lock-controller";
|
|
9
9
|
import { printIonWarning } from "../../utils/logging/index";
|
|
10
10
|
import { Style as StatusBarStyle, StatusBar } from "../../utils/native/status-bar";
|
|
11
|
-
import { BACKDROP, cleanupRootFocusTrapAccessibility, createTriggerController, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, GESTURE, prepareOverlay, present, setOverlayId, } from "../../utils/overlays";
|
|
11
|
+
import { BACKDROP, cleanupRootFocusTrapAccessibility, createTriggerController, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, GESTURE, prepareOverlay, present, restoreRootFocusTrapAccessibility, setOverlayId, } from "../../utils/overlays";
|
|
12
12
|
import { getClassMap } from "../../utils/theme";
|
|
13
13
|
import { deepReady, waitForMount } from "../../utils/transition/index";
|
|
14
14
|
import { config } from "../../global/config";
|
|
@@ -43,6 +43,9 @@ export class Modal {
|
|
|
43
43
|
this.inline = false;
|
|
44
44
|
// Whether or not modal is being dismissed via gesture
|
|
45
45
|
this.gestureAnimationDismissing = false;
|
|
46
|
+
// True from the first safe-area write in `present()` until the enter
|
|
47
|
+
// animation settles. A position-based read in that window is not the rest position.
|
|
48
|
+
this.isPresenting = false;
|
|
46
49
|
this.presented = false;
|
|
47
50
|
/** @internal */
|
|
48
51
|
this.hasController = false;
|
|
@@ -279,6 +282,17 @@ export class Modal {
|
|
|
279
282
|
const { el } = this;
|
|
280
283
|
prepareOverlay(el);
|
|
281
284
|
this.triggerChanged();
|
|
285
|
+
// A disconnect tears down state this presentation still needs and cannot
|
|
286
|
+
// tell a re-insert from a removal, so put it back.
|
|
287
|
+
if (this.presented || this.isPresenting) {
|
|
288
|
+
this.restoreSafeAreaOverrides();
|
|
289
|
+
}
|
|
290
|
+
// A relocation from `willPresent` reaches these before `present()` has
|
|
291
|
+
// applied the lock, so they apply it instead. Both are idempotent.
|
|
292
|
+
if (this.presented) {
|
|
293
|
+
restoreRootFocusTrapAccessibility(el);
|
|
294
|
+
this.initParentRemovalObserver();
|
|
295
|
+
}
|
|
282
296
|
}
|
|
283
297
|
disconnectedCallback() {
|
|
284
298
|
this.triggerController.removeClickListener();
|
|
@@ -456,25 +470,33 @@ export class Modal {
|
|
|
456
470
|
// Recalculate isSheetModal before safe-area setup because framework
|
|
457
471
|
// bindings (e.g., Angular) may not have been applied when componentWillLoad ran.
|
|
458
472
|
this.isSheetModal = this.breakpoints !== undefined && this.initialBreakpoint !== undefined;
|
|
459
|
-
|
|
460
|
-
this.setInitialSafeAreaOverrides();
|
|
473
|
+
this.isPresenting = true;
|
|
461
474
|
const hasCardModal = presentingElement !== undefined;
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
475
|
+
// Wrapped so a throw cannot strand `isPresenting`, which would suppress
|
|
476
|
+
// the position-based correction for the life of this instance.
|
|
477
|
+
try {
|
|
478
|
+
// Set initial safe-area overrides before animation
|
|
479
|
+
this.setInitialSafeAreaOverrides();
|
|
480
|
+
/**
|
|
481
|
+
* We need to change the status bar at the
|
|
482
|
+
* start of the animation so that it completes
|
|
483
|
+
* by the time the card animation is done.
|
|
484
|
+
*/
|
|
485
|
+
if (hasCardModal && getIonMode(this) === 'ios') {
|
|
486
|
+
// Cache the original status bar color before the modal is presented
|
|
487
|
+
this.statusBarStyle = await StatusBar.getStyle();
|
|
488
|
+
setCardStatusBarDark();
|
|
489
|
+
}
|
|
490
|
+
await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
491
|
+
presentingEl: presentingElement,
|
|
492
|
+
currentBreakpoint: this.initialBreakpoint,
|
|
493
|
+
backdropBreakpoint: this.backdropBreakpoint,
|
|
494
|
+
expandToScroll: this.expandToScroll,
|
|
495
|
+
});
|
|
496
|
+
}
|
|
497
|
+
finally {
|
|
498
|
+
this.isPresenting = false;
|
|
471
499
|
}
|
|
472
|
-
await present(this, 'modalEnter', iosEnterAnimation, mdEnterAnimation, {
|
|
473
|
-
presentingEl: presentingElement,
|
|
474
|
-
currentBreakpoint: this.initialBreakpoint,
|
|
475
|
-
backdropBreakpoint: this.backdropBreakpoint,
|
|
476
|
-
expandToScroll: this.expandToScroll,
|
|
477
|
-
});
|
|
478
500
|
// Update safe-area based on actual position after animation
|
|
479
501
|
this.updateSafeAreaOverrides();
|
|
480
502
|
// Apply fullscreen safe-area padding if needed
|
|
@@ -984,6 +1006,9 @@ export class Modal {
|
|
|
984
1006
|
this.cachedOriginalParent.tagName === 'ION-APP') {
|
|
985
1007
|
return;
|
|
986
1008
|
}
|
|
1009
|
+
// Both `present()` and a reconnect call this, so drop any existing
|
|
1010
|
+
// observer. Below the guards, so a call that bails cannot leave none.
|
|
1011
|
+
this.cleanupParentRemovalObserver();
|
|
987
1012
|
this.parentRemovalObserver = new MutationObserver((mutations) => {
|
|
988
1013
|
mutations.forEach((mutation) => {
|
|
989
1014
|
if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
|
|
@@ -1062,6 +1087,9 @@ export class Modal {
|
|
|
1062
1087
|
// Set the internal offset property with the resolved root safe-area-top value
|
|
1063
1088
|
if (context.isSheetModal) {
|
|
1064
1089
|
this.updateSheetOffsetTop();
|
|
1090
|
+
// A restore after a DOM move runs this a second time for the same
|
|
1091
|
+
// modal, so drop the previous subscription rather than stacking one.
|
|
1092
|
+
this.unsubscribeRootSafeAreaTop?.();
|
|
1065
1093
|
this.unsubscribeRootSafeAreaTop = onRootSafeAreaTopChange((safeAreaTop) => this.updateSheetOffsetTop(safeAreaTop));
|
|
1066
1094
|
}
|
|
1067
1095
|
}
|
|
@@ -1180,6 +1208,31 @@ export class Modal {
|
|
|
1180
1208
|
const { contentEl } = this.findContentAndFooter();
|
|
1181
1209
|
this.clearContentSafeAreaPadding(contentEl);
|
|
1182
1210
|
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Re-applies what `cleanupSafeAreaOverrides()` removed for a modal moved
|
|
1213
|
+
* while presented. Anything needing no measurement goes on synchronously so
|
|
1214
|
+
* the modal is never painted without safe-area. The position-based
|
|
1215
|
+
* correction waits a frame for the layout pass it reads.
|
|
1216
|
+
*/
|
|
1217
|
+
restoreSafeAreaOverrides() {
|
|
1218
|
+
this.setInitialSafeAreaOverrides();
|
|
1219
|
+
this.applyFullscreenSafeArea();
|
|
1220
|
+
raf(() => {
|
|
1221
|
+
// A dismiss or another move can land first, and a read before the enter
|
|
1222
|
+
// animation settles is not the rest position. `present()` redoes it.
|
|
1223
|
+
if (!this.presented || !this.el.isConnected || this.isPresenting) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
// A hidden subtree carries `display: none`, so there is no box and the
|
|
1227
|
+
// read would write the safe-area for a modal touching no edge. The
|
|
1228
|
+
// prediction applied above holds until the modal is shown again.
|
|
1229
|
+
const { width, height } = this.el.getBoundingClientRect();
|
|
1230
|
+
if (width === 0 && height === 0) {
|
|
1231
|
+
return;
|
|
1232
|
+
}
|
|
1233
|
+
this.updateSafeAreaOverrides();
|
|
1234
|
+
});
|
|
1235
|
+
}
|
|
1183
1236
|
render() {
|
|
1184
1237
|
const { handle, isSheetModal, presentingElement, htmlAttributes, handleBehavior, inheritedAttributes, focusTrap, expandToScroll, } = this;
|
|
1185
1238
|
const showHandle = handle !== false && isSheetModal;
|
|
@@ -1187,7 +1240,7 @@ export class Modal {
|
|
|
1187
1240
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
1188
1241
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
1189
1242
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
1190
|
-
return (h(Host, { key: '
|
|
1243
|
+
return (h(Host, { key: '7c9c736052c5a788cf31040b6b2386dd9ea7454b', "no-router": true,
|
|
1191
1244
|
// Allow the modal to be navigable when the handle is focusable
|
|
1192
1245
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1, ...htmlAttributes, style: {
|
|
1193
1246
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
@@ -1200,7 +1253,7 @@ export class Modal {
|
|
|
1200
1253
|
'overlay-hidden': true,
|
|
1201
1254
|
[FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
|
|
1202
1255
|
...getClassMap(this.cssClass),
|
|
1203
|
-
}, onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }, h("ion-backdrop", { key: '
|
|
1256
|
+
}, 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',
|
|
1204
1257
|
/*
|
|
1205
1258
|
role and aria-modal must be used on the
|
|
1206
1259
|
same element. They must also be set inside the
|
|
@@ -1213,9 +1266,9 @@ export class Modal {
|
|
|
1213
1266
|
without the tabindex focus() would be a no-op and screen readers
|
|
1214
1267
|
may not properly announce the dialog and its content when it opens.
|
|
1215
1268
|
*/
|
|
1216
|
-
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: '
|
|
1269
|
+
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",
|
|
1217
1270
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
1218
|
-
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: '
|
|
1271
|
+
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 }))));
|
|
1219
1272
|
}
|
|
1220
1273
|
static get is() { return "ion-modal"; }
|
|
1221
1274
|
static get encapsulation() { return "shadow"; }
|
|
@@ -77,7 +77,12 @@
|
|
|
77
77
|
--max-width: auto;
|
|
78
78
|
--height: 100%;
|
|
79
79
|
--min-height: auto;
|
|
80
|
-
|
|
80
|
+
/**
|
|
81
|
+
* Clamps a content-sized `--height` (auto, fit-content, ...) to the
|
|
82
|
+
* overlay, giving the wrapper's flex children something to shrink
|
|
83
|
+
* toward so `ion-content` scrolls instead of overflowing.
|
|
84
|
+
*/
|
|
85
|
+
--max-height: 100%;
|
|
81
86
|
--overflow: hidden;
|
|
82
87
|
--border-radius: 0;
|
|
83
88
|
--border-width: 0;
|
|
@@ -129,8 +134,14 @@ ion-backdrop {
|
|
|
129
134
|
/**
|
|
130
135
|
* The wrapper receives programmatic focus for screen readers but should not
|
|
131
136
|
* show a visible focus ring, which is meant only for keyboard navigation.
|
|
137
|
+
*
|
|
138
|
+
* A flex layout is required for the wrapper to size itself to its content
|
|
139
|
+
* when the modal is content-sized (`--height` is auto, fit-content, ...).
|
|
140
|
+
* This makes it so that the content can scroll when it overflows the wrapper.
|
|
132
141
|
*/
|
|
133
142
|
.modal-wrapper {
|
|
143
|
+
display: flex;
|
|
144
|
+
flex-direction: column;
|
|
134
145
|
outline: none;
|
|
135
146
|
}
|
|
136
147
|
|
|
@@ -20,6 +20,12 @@ export class PickerColumn {
|
|
|
20
20
|
this.isColumnVisible = false;
|
|
21
21
|
this.canExitInputMode = true;
|
|
22
22
|
this.updateValueTextOnScroll = false;
|
|
23
|
+
this.isUserScroll = false;
|
|
24
|
+
/**
|
|
25
|
+
* The haptics for the wheel picker are an iOS-only feature. As a result,
|
|
26
|
+
* they should be disabled on Android.
|
|
27
|
+
*/
|
|
28
|
+
this.enableHaptics = false;
|
|
23
29
|
this.ariaLabel = null;
|
|
24
30
|
this.isActive = false;
|
|
25
31
|
/**
|
|
@@ -51,6 +57,12 @@ export class PickerColumn {
|
|
|
51
57
|
*/
|
|
52
58
|
this.canExitInputMode = canExitInputMode;
|
|
53
59
|
this.updateValueTextOnScroll = false;
|
|
60
|
+
/**
|
|
61
|
+
* This scroll takes over from whatever the user was doing, so an outside
|
|
62
|
+
* press must not commit an option the column is only passing through.
|
|
63
|
+
*/
|
|
64
|
+
this.isUserScroll = false;
|
|
65
|
+
this.stopWatchingForOutsidePress();
|
|
54
66
|
scrollEl.scroll({
|
|
55
67
|
top,
|
|
56
68
|
left: 0,
|
|
@@ -105,6 +117,117 @@ export class PickerColumn {
|
|
|
105
117
|
}
|
|
106
118
|
this.isActive = state;
|
|
107
119
|
};
|
|
120
|
+
this.clearScrollEndTimeout = () => {
|
|
121
|
+
if (this.scrollEndTimeout) {
|
|
122
|
+
clearTimeout(this.scrollEndTimeout);
|
|
123
|
+
this.scrollEndTimeout = undefined;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Resets the idle timer that commits the centered option.
|
|
128
|
+
*/
|
|
129
|
+
this.resetScrollEndTimeout = () => {
|
|
130
|
+
this.clearScrollEndTimeout();
|
|
131
|
+
this.scrollEndTimeout = setTimeout(this.settle, SCROLL_END_DELAY);
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* Capture so the column still commits if an application's own pointerdown
|
|
135
|
+
* handler stops the event before it reaches the document.
|
|
136
|
+
*/
|
|
137
|
+
this.watchForOutsidePress = () => {
|
|
138
|
+
doc?.addEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
|
|
139
|
+
};
|
|
140
|
+
this.stopWatchingForOutsidePress = () => {
|
|
141
|
+
doc?.removeEventListener('pointerdown', this.onPointerDownOutside, { capture: true });
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* Resets everything the current scroll interaction is holding, so nothing
|
|
145
|
+
* pending on it can commit later.
|
|
146
|
+
*/
|
|
147
|
+
this.discardScroll = () => {
|
|
148
|
+
this.stopWatchingForOutsidePress();
|
|
149
|
+
this.clearScrollEndTimeout();
|
|
150
|
+
this.scrollEndCallback = undefined;
|
|
151
|
+
this.centeredOption = undefined;
|
|
152
|
+
this.haltedAtScrollTop = undefined;
|
|
153
|
+
this.isScrolling = false;
|
|
154
|
+
this.isUserScroll = false;
|
|
155
|
+
this.canExitInputMode = true;
|
|
156
|
+
};
|
|
157
|
+
/**
|
|
158
|
+
* Commits the option that is currently centered under the highlight and ends
|
|
159
|
+
* the scroll interaction.
|
|
160
|
+
*/
|
|
161
|
+
this.settle = () => {
|
|
162
|
+
const { centeredOption } = this;
|
|
163
|
+
this.clearScrollEndTimeout();
|
|
164
|
+
this.stopWatchingForOutsidePress();
|
|
165
|
+
this.isUserScroll = false;
|
|
166
|
+
this.isScrolling = false;
|
|
167
|
+
this.updateValueTextOnScroll = true;
|
|
168
|
+
this.enableHaptics && hapticSelectionEnd();
|
|
169
|
+
/**
|
|
170
|
+
* Certain tasks (such as those that
|
|
171
|
+
* cause re-renders) should only be done
|
|
172
|
+
* once scrolling has finished, otherwise
|
|
173
|
+
* flickering may occur.
|
|
174
|
+
*/
|
|
175
|
+
const { scrollEndCallback } = this;
|
|
176
|
+
if (scrollEndCallback) {
|
|
177
|
+
scrollEndCallback();
|
|
178
|
+
this.scrollEndCallback = undefined;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Reset this flag as the
|
|
182
|
+
* next scroll interaction could
|
|
183
|
+
* be a scroll from the user. In this
|
|
184
|
+
* case, we should exit input mode.
|
|
185
|
+
*/
|
|
186
|
+
this.canExitInputMode = true;
|
|
187
|
+
if (centeredOption !== undefined) {
|
|
188
|
+
// Cleared here so a later scroll that centers nothing cannot fall back on it.
|
|
189
|
+
this.centeredOption = undefined;
|
|
190
|
+
if (centeredOption.isConnected) {
|
|
191
|
+
this.setValue(centeredOption.value);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Commits the option the user can see when they press anything outside of the
|
|
197
|
+
* column during a scroll they started. This runs on pointerdown rather than
|
|
198
|
+
* click so the value is up to date by the time an application's own click
|
|
199
|
+
* handler (a Save button, for example) reads it.
|
|
200
|
+
*/
|
|
201
|
+
this.onPointerDownOutside = (ev) => {
|
|
202
|
+
const { centeredOption, parentEl, scrollEl } = this;
|
|
203
|
+
if (!this.isScrolling) {
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* The column can live in another component's Shadow DOM, where a document
|
|
208
|
+
* listener sees the target retargeted to the outer host. The composed path
|
|
209
|
+
* is the only reliable way to tell a press on the column apart.
|
|
210
|
+
*/
|
|
211
|
+
const path = ev.composedPath();
|
|
212
|
+
/**
|
|
213
|
+
* A press anywhere in the parent picker counts as inside, so reaching for a
|
|
214
|
+
* sibling wheel leaves this column coasting.
|
|
215
|
+
*/
|
|
216
|
+
if (path.includes(this.el) || (parentEl != null && path.includes(parentEl))) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Landing on the centered option halts the in-flight momentum scroll, so the
|
|
221
|
+
* committed value and the option the user is left looking at agree. The
|
|
222
|
+
* option list can be replaced mid-scroll, and a detached option has no
|
|
223
|
+
* offset to center on.
|
|
224
|
+
*/
|
|
225
|
+
if (centeredOption !== undefined && centeredOption.isConnected) {
|
|
226
|
+
this.centerPickerItemInView(centeredOption, false, false);
|
|
227
|
+
this.haltedAtScrollTop = scrollEl?.scrollTop;
|
|
228
|
+
}
|
|
229
|
+
this.settle();
|
|
230
|
+
};
|
|
108
231
|
/**
|
|
109
232
|
* When the column scrolls, the component
|
|
110
233
|
* needs to determine which item is centered
|
|
@@ -112,27 +235,42 @@ export class PickerColumn {
|
|
|
112
235
|
* the item object.
|
|
113
236
|
*/
|
|
114
237
|
this.initializeScrollListener = () => {
|
|
115
|
-
|
|
116
|
-
* The haptics for the wheel picker are
|
|
117
|
-
* an iOS-only feature. As a result, they should
|
|
118
|
-
* be disabled on Android.
|
|
119
|
-
*/
|
|
120
|
-
const enableHaptics = isPlatform('ios');
|
|
238
|
+
this.enableHaptics = isPlatform('ios');
|
|
121
239
|
const { el, scrollEl } = this;
|
|
122
|
-
let timeout;
|
|
123
240
|
let activeEl = this.activeItem;
|
|
124
241
|
const scrollCallback = () => {
|
|
125
242
|
raf(() => {
|
|
126
|
-
|
|
243
|
+
/**
|
|
244
|
+
* This frame cannot be cancelled, and moving the column disconnects it
|
|
245
|
+
* without the observer reporting a change, so this checks live state.
|
|
246
|
+
*/
|
|
247
|
+
if (!this.el.isConnected || !this.isColumnVisible || !scrollEl)
|
|
127
248
|
return;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
249
|
+
const { haltedAtScrollTop } = this;
|
|
250
|
+
if (haltedAtScrollTop !== undefined) {
|
|
251
|
+
/**
|
|
252
|
+
* Still at the halted position, so this frame is the halt landing
|
|
253
|
+
* rather than the wheel moving, and re-arming would start a second
|
|
254
|
+
* commit cycle.
|
|
255
|
+
*/
|
|
256
|
+
if (Math.abs(scrollEl.scrollTop - haltedAtScrollTop) <= HALT_TOLERANCE)
|
|
257
|
+
return;
|
|
258
|
+
this.haltedAtScrollTop = undefined;
|
|
131
259
|
}
|
|
260
|
+
// Armed before the early returns below, so a scroll never ends uncommitted.
|
|
261
|
+
this.resetScrollEndTimeout();
|
|
132
262
|
if (!this.isScrolling) {
|
|
133
|
-
enableHaptics && hapticSelectionStart();
|
|
263
|
+
this.enableHaptics && hapticSelectionStart();
|
|
134
264
|
this.isScrolling = true;
|
|
135
265
|
}
|
|
266
|
+
/**
|
|
267
|
+
* Only a user-driven scroll holds an uncommitted selection. Checked every
|
|
268
|
+
* frame because the user can take hold of the wheel mid-scroll, and
|
|
269
|
+
* re-adding the same listener is a no-op.
|
|
270
|
+
*/
|
|
271
|
+
if (this.isUserScroll) {
|
|
272
|
+
this.watchForOutsidePress();
|
|
273
|
+
}
|
|
136
274
|
/**
|
|
137
275
|
* Select item in the center of the column
|
|
138
276
|
* which is the month/year that we want to select
|
|
@@ -192,18 +330,23 @@ export class PickerColumn {
|
|
|
192
330
|
newActiveElement = fallbackActiveElement;
|
|
193
331
|
}
|
|
194
332
|
}
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
333
|
+
/**
|
|
334
|
+
* A scroll can land with no selectable option centered, such as an
|
|
335
|
+
* overscroll bounce briefly centering the empty padding rows. Keep the
|
|
336
|
+
* current selection until an option is centered again.
|
|
337
|
+
*/
|
|
198
338
|
if (newActiveElement === undefined || newActiveElement.disabled) {
|
|
199
339
|
return;
|
|
200
340
|
}
|
|
341
|
+
if (activeEl !== undefined) {
|
|
342
|
+
this.setPickerItemActiveState(activeEl, false);
|
|
343
|
+
}
|
|
201
344
|
/**
|
|
202
345
|
* If we are selecting a new value,
|
|
203
346
|
* we need to run haptics again.
|
|
204
347
|
*/
|
|
205
348
|
if (newActiveElement !== activeEl) {
|
|
206
|
-
enableHaptics && hapticSelectionChanged();
|
|
349
|
+
this.enableHaptics && hapticSelectionChanged();
|
|
207
350
|
if (this.canExitInputMode) {
|
|
208
351
|
/**
|
|
209
352
|
* The native iOS wheel picker
|
|
@@ -235,32 +378,14 @@ export class PickerColumn {
|
|
|
235
378
|
if (this.updateValueTextOnScroll) {
|
|
236
379
|
this.assistiveFocusable?.setAttribute('aria-valuetext', this.getOptionValueText(newActiveElement));
|
|
237
380
|
}
|
|
238
|
-
|
|
239
|
-
this.isScrolling = false;
|
|
240
|
-
this.updateValueTextOnScroll = true;
|
|
241
|
-
enableHaptics && hapticSelectionEnd();
|
|
242
|
-
/**
|
|
243
|
-
* Certain tasks (such as those that
|
|
244
|
-
* cause re-renders) should only be done
|
|
245
|
-
* once scrolling has finished, otherwise
|
|
246
|
-
* flickering may occur.
|
|
247
|
-
*/
|
|
248
|
-
const { scrollEndCallback } = this;
|
|
249
|
-
if (scrollEndCallback) {
|
|
250
|
-
scrollEndCallback();
|
|
251
|
-
this.scrollEndCallback = undefined;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Reset this flag as the
|
|
255
|
-
* next scroll interaction could
|
|
256
|
-
* be a scroll from the user. In this
|
|
257
|
-
* case, we should exit input mode.
|
|
258
|
-
*/
|
|
259
|
-
this.canExitInputMode = true;
|
|
260
|
-
this.setValue(newActiveElement.value);
|
|
261
|
-
}, 250);
|
|
381
|
+
this.centeredOption = newActiveElement;
|
|
262
382
|
});
|
|
263
383
|
};
|
|
384
|
+
const userScrollCallback = () => {
|
|
385
|
+
this.isUserScroll = true;
|
|
386
|
+
// Taking hold of the wheel ends the halt even if it has not moved yet.
|
|
387
|
+
this.haltedAtScrollTop = undefined;
|
|
388
|
+
};
|
|
264
389
|
/**
|
|
265
390
|
* Wrap this in an raf so that the scroll callback
|
|
266
391
|
* does not fire when component is initially shown.
|
|
@@ -269,8 +394,19 @@ export class PickerColumn {
|
|
|
269
394
|
if (!scrollEl)
|
|
270
395
|
return;
|
|
271
396
|
scrollEl.addEventListener('scroll', scrollCallback);
|
|
397
|
+
scrollEl.addEventListener('pointerdown', userScrollCallback);
|
|
398
|
+
scrollEl.addEventListener('wheel', userScrollCallback, { passive: true });
|
|
399
|
+
/**
|
|
400
|
+
* A `pointerdown` fires once per touch, so a drag that pauses long enough
|
|
401
|
+
* to commit would look like a scroll the column started. A `touchmove`
|
|
402
|
+
* keeps arriving while the finger moves.
|
|
403
|
+
*/
|
|
404
|
+
scrollEl.addEventListener('touchmove', userScrollCallback, { passive: true });
|
|
272
405
|
this.destroyScrollListener = () => {
|
|
273
406
|
scrollEl.removeEventListener('scroll', scrollCallback);
|
|
407
|
+
scrollEl.removeEventListener('pointerdown', userScrollCallback);
|
|
408
|
+
scrollEl.removeEventListener('wheel', userScrollCallback);
|
|
409
|
+
scrollEl.removeEventListener('touchmove', userScrollCallback);
|
|
274
410
|
};
|
|
275
411
|
});
|
|
276
412
|
};
|
|
@@ -455,6 +591,14 @@ export class PickerColumn {
|
|
|
455
591
|
}
|
|
456
592
|
else {
|
|
457
593
|
this.isColumnVisible = false;
|
|
594
|
+
/**
|
|
595
|
+
* The pending timer still runs so it resets the scroll state, but the
|
|
596
|
+
* option it would have committed is dropped. A column the user cannot
|
|
597
|
+
* see should not change its value.
|
|
598
|
+
*/
|
|
599
|
+
this.stopWatchingForOutsidePress();
|
|
600
|
+
this.centeredOption = undefined;
|
|
601
|
+
this.haltedAtScrollTop = undefined;
|
|
458
602
|
if (this.destroyScrollListener) {
|
|
459
603
|
this.destroyScrollListener();
|
|
460
604
|
this.destroyScrollListener = undefined;
|
|
@@ -525,6 +669,13 @@ export class PickerColumn {
|
|
|
525
669
|
connectedCallback() {
|
|
526
670
|
this.ariaLabel = this.el.getAttribute('aria-label') ?? 'Select a value';
|
|
527
671
|
}
|
|
672
|
+
disconnectedCallback() {
|
|
673
|
+
/**
|
|
674
|
+
* A pending settle would otherwise commit a value on a column that is no
|
|
675
|
+
* longer in the DOM.
|
|
676
|
+
*/
|
|
677
|
+
this.discardScroll();
|
|
678
|
+
}
|
|
528
679
|
get activeItem() {
|
|
529
680
|
const { value } = this;
|
|
530
681
|
const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
|
|
@@ -542,14 +693,14 @@ export class PickerColumn {
|
|
|
542
693
|
render() {
|
|
543
694
|
const { color, disabled, isActive, numericInput } = this;
|
|
544
695
|
const mode = getIonMode(this);
|
|
545
|
-
return (h(Host, { key: '
|
|
696
|
+
return (h(Host, { key: '60a893619d0b01fba53fbccef67a10d533a22657', class: createColorClasses(color, {
|
|
546
697
|
[mode]: true,
|
|
547
698
|
['picker-column-active']: isActive,
|
|
548
699
|
['picker-column-numeric-input']: numericInput,
|
|
549
700
|
['picker-column-disabled']: disabled,
|
|
550
|
-
}) }, h("slot", { key: '
|
|
701
|
+
}) }, h("slot", { key: '79f1e047f89c5ec916ed02efaac56ef3f73b8969', name: "prefix" }), h("div", { key: 'c45c86e88353a196ff38159f40f390bc27852c9e', class: "picker-opts", ref: (el) => {
|
|
551
702
|
this.scrollEl = el;
|
|
552
|
-
}, role: "slider", tabindex: this.disabled ? undefined : 0, "aria-label": this.ariaLabel, "aria-valuemin": 0, "aria-valuemax": 0, "aria-valuenow": 0, "aria-valuetext": this.getOptionValueText(this.activeItem), "aria-orientation": "vertical", onKeyDown: (ev) => this.onKeyDown(ev) }, h("div", { key: '
|
|
703
|
+
}, role: "slider", tabindex: this.disabled ? undefined : 0, "aria-label": this.ariaLabel, "aria-valuemin": 0, "aria-valuemax": 0, "aria-valuenow": 0, "aria-valuetext": this.getOptionValueText(this.activeItem), "aria-orientation": "vertical", onKeyDown: (ev) => this.onKeyDown(ev) }, h("div", { key: 'e02d76752f5d3dd4cd2846fbc28645f1508a4b49', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'd577bcbadc530970b2781692b050811633625c5a', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'c89e78c3a896bc1f55b922d01df16fdbb1259bdd', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", { key: '6c597ff899692597432ee2aa0b42de53b86deed4' }), h("div", { key: '91686ed94f14c47647836ed4d63e54b5c54ee3b9', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '2ff058c6d0e8cef4e143c2d848f9a52684579af1', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'bc7386bec6fced36e44084a7a137b3fe6506c996', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { key: '8835fd3f4e025bce964e6f05984c9aaadc20d7fb', name: "suffix" })));
|
|
553
704
|
}
|
|
554
705
|
static get is() { return "ion-picker-column"; }
|
|
555
706
|
static get encapsulation() { return "shadow"; }
|
|
@@ -773,3 +924,16 @@ export class PickerColumn {
|
|
|
773
924
|
}
|
|
774
925
|
}
|
|
775
926
|
const PICKER_ITEM_ACTIVE_CLASS = 'option-active';
|
|
927
|
+
/**
|
|
928
|
+
* How long the column must be idle before the centered option is treated as
|
|
929
|
+
* the user's selection. Replaceable by the `scrollend` event once that is
|
|
930
|
+
* supported everywhere (https://caniuse.com/?search=scrollend).
|
|
931
|
+
*/
|
|
932
|
+
const SCROLL_END_DELAY = 250;
|
|
933
|
+
/**
|
|
934
|
+
* How far, in pixels, the column may report from where it was halted and still
|
|
935
|
+
* count as having stayed there. Centering targets a position between two snap
|
|
936
|
+
* points, so mandatory snapping corrects it by half the column height less
|
|
937
|
+
* three option heights: 2px at the default sizes.
|
|
938
|
+
*/
|
|
939
|
+
const HALT_TOLERANCE = 2;
|