@ionic/core 9.0.1-dev.11787949960.1e63841c → 9.0.1-dev.11788285010.17561004
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/{dist/ionic/p-BpG7jkT9.js → components/p-66ogmUZU.js} +1 -1
- package/components/p-6Vp915Y7.js +4 -0
- package/components/{p-B2L09UOs.js → p-7PNwKFZi.js} +1 -1
- package/components/{p-C8mPeq0D.js → p-A8MJRBIY.js} +1 -1
- package/components/p-AQcCdH2_.js +4 -0
- package/components/{p-DkEb3SCT.js → p-B6x5_b9w.js} +1 -1
- package/components/{p-CDKY4TZ_.js → p-B8MQjdvk.js} +1 -1
- package/components/{p-CLZPNP7x.js → p-BA_4ZIEg.js} +1 -1
- package/components/{p-CyKlfXdt.js → p-BFtL8t1r.js} +1 -1
- package/components/{p-RRH-7cpd.js → p-BMfgF-Tv.js} +1 -1
- package/components/{p-l-zxxFre.js → p-BPDxVIRr.js} +1 -1
- package/{dist/ionic/p-BC17SPKH.js → components/p-BSARlp49.js} +1 -1
- package/components/p-BdwCtX8Y.js +4 -0
- package/components/p-Bg4OwDwb.js +4 -0
- package/components/{p-CBhGZ6rF.js → p-BgUIV8NQ.js} +1 -1
- package/components/{p-CxiXpCtB.js → p-Bnc0m4SW.js} +1 -1
- package/components/{p-7qDu1bID.js → p-BpLt_Ptn.js} +1 -1
- package/components/{p-C12SAK00.js → p-BqBDq1Ma.js} +1 -1
- package/components/{p-mXsQnyWB.js → p-BrFaQbGY.js} +1 -1
- package/{dist/ionic/p-CoEa7CiN.js → components/p-BuPAFTWI.js} +1 -1
- package/components/{p-CB06XtlF.js → p-Bx2saTHs.js} +1 -1
- package/components/p-BxhE2W85.js +4 -0
- package/components/p-CHswSpKy.js +4 -0
- package/components/p-CQAjyETU.js +4 -0
- package/components/p-CR9OgE6N.js +4 -0
- package/components/{p-CEkamjav.js → p-CWETxTjE.js} +1 -1
- package/components/p-CaZeZIL2.js +4 -0
- package/components/{p-CuS0-WwK.js → p-CaiZOhfC.js} +1 -1
- package/components/{p-BFwL2yyK.js → p-CgvDC7hC.js} +1 -1
- package/components/p-CqyGR9Aq.js +4 -0
- package/components/{p-DMkSsriG.js → p-D7ysFE2B.js} +1 -1
- package/components/p-DCWfzDM8.js +4 -0
- package/{dist/ionic/p-DA88iqXQ.js → components/p-DDdkefwf.js} +1 -1
- package/components/{p-CJTKYpZv.js → p-DEW7CnUc.js} +1 -1
- package/components/p-DQ1IPvZO.js +4 -0
- package/components/{p-BAJ7NctL.js → p-DcOH6-o5.js} +1 -1
- package/components/p-DfdYCsov.js +4 -0
- package/{dist/ionic/p-DoUx_N0R.js → components/p-DhOoEIAs.js} +1 -1
- package/components/p-Dl_7b_UJ.js +4 -0
- package/components/p-DqAI6tg7.js +4 -0
- package/components/p-DrehWDfv.js +4 -0
- package/components/{p-BWHBdLfY.js → p-DysqCsJu.js} +1 -1
- package/components/{p-BqE7e5gH.js → p-H1f2qsk4.js} +1 -1
- package/components/p-HVYBAhFx.js +4 -0
- package/components/{p-BE9noJ1O.js → p-Kmrg3Fed.js} +1 -1
- package/{dist/ionic/p-wdSUbx5C.js → components/p-RFfE9hF6.js} +1 -1
- package/components/{p-Bcm-GVQM.js → p-SR-LLqp_.js} +1 -1
- package/components/p-eFI3mtEX.js +4 -0
- package/components/{p-5rFO7X8J.js → p-gFwXiYC_.js} +1 -1
- package/components/{p-COxY7PLK.js → p-tX3UxCnU.js} +1 -1
- package/components/{p-VTfnz_8u.js → p-v2NpoOHp.js} +1 -1
- package/css/core.css +1 -1
- package/css/core.css.map +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/dist/cjs/{animation-ihPP_z2n.js → animation-D-OqR4a4.js} +1 -1
- package/dist/cjs/{app-globals-BlkzA410.js → app-globals-BzgwARwJ.js} +1 -1
- package/dist/cjs/{button-active-ItGBjzmO.js → button-active-BlWSD7uK.js} +1 -1
- package/dist/cjs/{format-CPIqtp4x.js → format-D7ig6Vm0.js} +1 -1
- package/dist/cjs/{framework-delegate-DhyWUPGg.js → framework-delegate-BZUx4TnE.js} +1 -1
- package/dist/cjs/{hardware-back-button-D5f_kASb.js → hardware-back-button-JOAEFSzc.js} +1 -1
- package/dist/cjs/{helpers-BCLkFTTd.js → helpers-Dj5o76mq.js} +1 -1
- package/dist/cjs/{index-CldjPPyP.js → index-2sO-zkZ2.js} +4 -4
- package/dist/cjs/{index-Bgz6BcKx.js → index-BrVMoqUk.js} +16 -50
- package/dist/cjs/{index-49DTLc_Z.js → index-C8zH6b3d.js} +2 -2
- package/dist/cjs/{index-BcyiqD6R.js → index-CZ6vzt_q.js} +5 -5
- package/dist/cjs/{index-xum7jdbq.js → index-Csue6G3m.js} +2 -2
- package/dist/cjs/{index-BocV_y-c.js → index-EJLjthTK.js} +1 -2
- package/dist/cjs/index.cjs.js +12 -12
- package/dist/cjs/{input-shims-Jisy7U7-.js → input-shims-Bh7bnt2v.js} +3 -3
- package/dist/cjs/{input.utils-BDTpGrfn.js → input.utils-Cq3g9uHy.js} +1 -1
- package/dist/cjs/ion-accordion_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +29 -45
- package/dist/cjs/ion-alert.cjs.entry.js +21 -29
- package/dist/cjs/ion-app_8.cjs.entry.js +16 -38
- 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 +24 -32
- 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 +15 -13
- package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
- package/dist/cjs/ion-loading.cjs.entry.js +10 -14
- package/dist/cjs/ion-menu_3.cjs.entry.js +8 -8
- package/dist/cjs/ion-modal.cjs.entry.js +32 -85
- 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 +46 -210
- package/dist/cjs/ion-picker.cjs.entry.js +2 -2
- package/dist/cjs/ion-popover.cjs.entry.js +10 -23
- 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 +10 -14
- package/dist/cjs/ion-select-modal.cjs.entry.js +8 -8
- package/dist/cjs/ion-select_3.cjs.entry.js +47 -57
- 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-BMU-Us1Q.js → ionic-global-DvgIzM2F.js} +1 -1
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-OCcCN--B.js → ios.transition-zIgdoSYe.js} +4 -4
- package/dist/cjs/{item-multiple-inputs-BH9yPC66.js → item-multiple-inputs-DG-ZGm6j.js} +1 -1
- package/dist/cjs/loader.cjs.js +3 -3
- package/dist/cjs/{md.transition-D0o2IIbo.js → md.transition-CXeJ9rfh.js} +4 -4
- package/dist/cjs/{overlays-HN9joo1Z.js → overlays-Bg0auTQa.js} +34 -59
- package/dist/cjs/{select-option-render-BPjGDlsG.js → select-option-render-7m1WdFzF.js} +2 -2
- package/dist/cjs/{slot-mutation-controller-IQ250LoG.js → slot-mutation-controller-BJEJzx_e.js} +1 -1
- package/dist/cjs/{status-tap-Bakl9czs.js → status-tap-DxbUM5XX.js} +3 -3
- package/dist/cjs/{swipe-back-Cv4OZVJ5.js → swipe-back-F_DBt-Aw.js} +2 -2
- package/dist/collection/collection-manifest.json +1 -1
- package/dist/collection/components/action-sheet/action-sheet.js +20 -36
- package/dist/collection/components/alert/alert.js +12 -20
- package/dist/collection/components/content/content.js +4 -26
- package/dist/collection/components/datetime/datetime.js +17 -25
- package/dist/collection/components/item-sliding/item-sliding.js +12 -10
- package/dist/collection/components/loading/loading.js +3 -7
- package/dist/collection/components/modal/modal.ios.css +1 -12
- package/dist/collection/components/modal/modal.js +22 -75
- package/dist/collection/components/modal/modal.md.css +1 -12
- package/dist/collection/components/picker-column/picker-column.js +43 -207
- package/dist/collection/components/popover/popover.js +3 -16
- package/dist/collection/components/segment-button/segment-button.js +7 -11
- package/dist/collection/components/select/select.js +39 -49
- package/dist/collection/utils/overlays.js +29 -53
- package/dist/collection/utils/test/playwright/index.js +0 -1
- package/dist/docs.json +48 -279
- package/dist/esm/{animation-B6KGUJwl.js → animation-TxGPYeDn.js} +1 -1
- package/dist/esm/{app-globals-BvutUX8P.js → app-globals-Do8rJest.js} +1 -1
- package/dist/esm/{button-active-DRNebs9r.js → button-active-ChA4D-ml.js} +1 -1
- package/dist/esm/{format-BF3btM7P.js → format-CVk5e_GP.js} +1 -1
- package/dist/esm/{framework-delegate-60cEIAgt.js → framework-delegate-DaLWnISz.js} +1 -1
- package/dist/esm/{hardware-back-button-rhkwRNk2.js → hardware-back-button-D8W4L0JP.js} +1 -1
- package/dist/esm/{helpers-DLLANtRS.js → helpers-BIgoInJU.js} +1 -1
- package/dist/esm/{index-DOrtAUWV.js → index-BmOR8tCv.js} +2 -2
- package/dist/esm/{index-D_7MeuVD.js → index-C5ZdL0qp.js} +5 -5
- package/dist/esm/{index-BZHVn0iF.js → index-C8Dsa6li.js} +4 -4
- package/dist/esm/{index-h81G-QbJ.js → index-CKYcsw8f.js} +16 -50
- package/dist/esm/{index-Bl4BUvBL.js → index-DHw2lZxe.js} +2 -2
- package/dist/esm/{index-JgU5uTSY.js → index-elneMH8y.js} +2 -2
- package/dist/esm/index.js +12 -12
- package/dist/esm/{input-shims-C2ipc_XX.js → input-shims-09NN97kF.js} +3 -3
- package/dist/esm/{input.utils-D-qoPjqr.js → input.utils-BxyH9l1w.js} +1 -1
- package/dist/esm/ion-accordion_2.entry.js +3 -3
- package/dist/esm/ion-action-sheet.entry.js +29 -45
- package/dist/esm/ion-alert.entry.js +21 -29
- package/dist/esm/ion-app_8.entry.js +16 -38
- 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 +24 -32
- 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 +15 -13
- package/dist/esm/ion-item_8.entry.js +3 -3
- package/dist/esm/ion-loading.entry.js +10 -14
- package/dist/esm/ion-menu_3.entry.js +8 -8
- package/dist/esm/ion-modal.entry.js +32 -85
- 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 +47 -211
- package/dist/esm/ion-picker.entry.js +2 -2
- package/dist/esm/ion-popover.entry.js +10 -23
- 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 +10 -14
- package/dist/esm/ion-select-modal.entry.js +8 -8
- package/dist/esm/ion-select_3.entry.js +47 -57
- 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-B7I1sdvg.js → ionic-global-lrowsHfi.js} +1 -1
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-C-6IaIxe.js → ios.transition-BQhADrk1.js} +4 -4
- package/dist/esm/{item-multiple-inputs-DI91syHS.js → item-multiple-inputs-D_N3fDkD.js} +1 -1
- package/dist/esm/loader.js +4 -4
- package/dist/esm/{md.transition-dyqt0t0d.js → md.transition-D58NpmRa.js} +4 -4
- package/dist/esm/{overlays-Dz2cGX5q.js → overlays-BpnIFlXI.js} +35 -59
- package/dist/esm/{select-option-render-CUJpruSC.js → select-option-render-lIuu64EV.js} +2 -2
- package/dist/esm/{slot-mutation-controller-wFuztlVD.js → slot-mutation-controller-rS_T3FDR.js} +1 -1
- package/dist/esm/{status-tap-Dn_42wiy.js → status-tap-CpFQMLl6.js} +3 -3
- package/dist/esm/{swipe-back-CqOqrHW7.js → swipe-back-rmc7zeNW.js} +2 -2
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-025763b2.entry.js → p-05800a02.entry.js} +1 -1
- package/dist/ionic/p-0eb50dca.entry.js +4 -0
- package/dist/ionic/{p-0b52d921.entry.js → p-16e9f542.entry.js} +1 -1
- package/dist/ionic/p-18d532a3.entry.js +4 -0
- package/dist/ionic/{p-a2fccdaa.entry.js → p-1db2afb4.entry.js} +1 -1
- package/dist/ionic/{p-5ed60413.entry.js → p-1df75f9e.entry.js} +1 -1
- package/dist/ionic/{p-2ff12c8a.entry.js → p-295ff427.entry.js} +1 -1
- package/dist/ionic/p-34b9379b.entry.js +4 -0
- package/dist/ionic/{p-cc749877.entry.js → p-39a8d4e0.entry.js} +1 -1
- package/dist/ionic/p-4437015c.entry.js +4 -0
- package/dist/ionic/{p-53ba5651.entry.js → p-478035a7.entry.js} +1 -1
- package/dist/ionic/{p-1a20571c.entry.js → p-485fb218.entry.js} +1 -1
- package/dist/ionic/p-48c859fe.entry.js +4 -0
- package/dist/ionic/p-49b9d405.entry.js +4 -0
- package/dist/ionic/{p-d1539609.entry.js → p-56307aea.entry.js} +1 -1
- package/dist/ionic/{p-eeb65463.entry.js → p-5ee2d7b1.entry.js} +1 -1
- package/dist/ionic/{p-ca57763d.entry.js → p-5f216b79.entry.js} +1 -1
- package/dist/ionic/{p-fb4dabbb.entry.js → p-61c799d1.entry.js} +1 -1
- package/dist/ionic/{p-fe80ebb1.entry.js → p-63bbba8d.entry.js} +1 -1
- package/dist/ionic/p-68507e70.entry.js +4 -0
- package/dist/ionic/{p-43bae3f5.entry.js → p-6f048604.entry.js} +1 -1
- package/dist/ionic/{p-dadcb3d2.entry.js → p-70ee8888.entry.js} +1 -1
- package/dist/ionic/{p-7c859f42.entry.js → p-72ad7c64.entry.js} +1 -1
- package/dist/ionic/{p-90e06e60.entry.js → p-75887ee0.entry.js} +1 -1
- package/dist/ionic/{p-bdc01880.entry.js → p-873a315a.entry.js} +1 -1
- package/dist/ionic/{p-f0645c98.entry.js → p-881b6954.entry.js} +1 -1
- package/dist/ionic/p-886d9e66.entry.js +4 -0
- package/dist/ionic/{p-5dc53bdf.entry.js → p-8dd4c026.entry.js} +1 -1
- package/dist/ionic/{p-9f2d3987.entry.js → p-8e007f11.entry.js} +1 -1
- package/dist/ionic/p-8f464a8f.entry.js +4 -0
- package/dist/ionic/p-8f51110d.entry.js +4 -0
- package/dist/ionic/{p-1f66c230.entry.js → p-90ba736e.entry.js} +1 -1
- package/dist/ionic/{p-8d72244b.entry.js → p-959df5f8.entry.js} +1 -1
- package/dist/ionic/{p-8e388a30.entry.js → p-9e455875.entry.js} +1 -1
- package/{components/p-BcuLPPAE.js → dist/ionic/p-9wczfs_v.js} +1 -1
- package/dist/ionic/{p-C10K-FJg.js → p-B1Y7LZhV.js} +1 -1
- package/dist/ionic/p-B5RyLYvl.js +4 -0
- package/dist/ionic/p-BQv5i5Kf.js +4 -0
- package/dist/ionic/{p-CH8tk7Pr.js → p-BZVE25Gu.js} +1 -1
- package/{components/p-CdSLe3Q3.js → dist/ionic/p-BZxjcGRP.js} +1 -1
- package/dist/ionic/p-BnGA34Pd.js +4 -0
- package/dist/ionic/{p-Q9w8L_Sw.js → p-ByLaqOPm.js} +1 -1
- package/dist/ionic/p-C06QNN45.js +4 -0
- package/dist/ionic/{p-KJ5pLPiN.js → p-C4IBDDj6.js} +1 -1
- package/dist/ionic/p-CCVlNZ__.js +4 -0
- package/dist/ionic/{p-CTBfxfjC.js → p-CDBop-kz.js} +1 -1
- package/dist/ionic/p-CKYcsw8f.js +5 -0
- package/dist/ionic/p-CazSodad.js +4 -0
- package/dist/ionic/{p-S1shXW5M.js → p-ClrlQU2y.js} +1 -1
- package/{components/p-DG-dUCKp.js → dist/ionic/p-D0dfUysx.js} +1 -1
- package/dist/ionic/{p-C2BY_4Wp.js → p-D9yvytgv.js} +1 -1
- package/{components/p-DH0rRXjx.js → dist/ionic/p-DF_Uqql8.js} +1 -1
- package/dist/ionic/{p-DMj-M2c4.js → p-DXJgZWgi.js} +1 -1
- package/dist/ionic/p-DdhHqKj-.js +4 -0
- package/dist/ionic/{p-BRc8gq5v.js → p-De0eY881.js} +1 -1
- package/dist/ionic/p-DgUL3JbO.js +4 -0
- package/dist/ionic/{p-06ZcwRF5.js → p-RzUn7cKs.js} +1 -1
- package/dist/ionic/p-VquyMbjp.js +4 -0
- package/dist/ionic/{p-2aabd568.entry.js → p-a0fee899.entry.js} +1 -1
- package/dist/ionic/{p-9e688396.entry.js → p-a54bcd16.entry.js} +1 -1
- package/dist/ionic/{p-eaeac54e.entry.js → p-aebc4d69.entry.js} +1 -1
- package/dist/ionic/{p-9452849d.entry.js → p-b5f37106.entry.js} +1 -1
- package/dist/ionic/{p-082b8125.entry.js → p-b62bfce8.entry.js} +1 -1
- package/dist/ionic/p-b7a11b58.entry.js +4 -0
- package/dist/ionic/{p-546b1109.entry.js → p-bbf6878c.entry.js} +1 -1
- package/dist/ionic/{p-e93cc1e1.entry.js → p-c49165af.entry.js} +1 -1
- package/dist/ionic/{p-9eba0d8a.entry.js → p-cad4eccf.entry.js} +1 -1
- package/dist/ionic/{p-d1b888de.entry.js → p-cdc5115e.entry.js} +1 -1
- package/dist/ionic/{p-47b8b59a.entry.js → p-d3384a40.entry.js} +1 -1
- package/dist/ionic/{p-f607ad4f.entry.js → p-d8bae128.entry.js} +1 -1
- package/dist/ionic/{p-026e2e4c.entry.js → p-d8deff43.entry.js} +1 -1
- package/dist/ionic/{p-6d84fa9f.entry.js → p-ddfb7e5f.entry.js} +1 -1
- package/dist/ionic/{p-ecfc9c71.entry.js → p-e538f18d.entry.js} +1 -1
- package/dist/ionic/{p-83aa7d47.entry.js → p-f376876b.entry.js} +1 -1
- package/dist/ionic/p-f521b13c.entry.js +4 -0
- package/dist/ionic/{p-ac71362a.entry.js → p-fbd83d4c.entry.js} +1 -1
- package/dist/types/components/action-sheet/action-sheet.d.ts +0 -10
- package/dist/types/components/alert/alert.d.ts +0 -7
- package/dist/types/components/content/content.d.ts +0 -7
- package/dist/types/components/modal/modal.d.ts +0 -8
- package/dist/types/components/picker-column/picker-column.d.ts +0 -42
- package/dist/types/components.d.ts +1 -1
- package/dist/types/stencil-public-runtime.d.ts +0 -12
- package/dist/types/utils/overlays.d.ts +0 -9
- package/dist/types/utils/test/playwright/index.d.ts +0 -1
- package/hydrate/index.js +213 -558
- package/hydrate/index.mjs +213 -558
- package/loader/index.d.ts +1 -1
- package/package.json +2 -2
- package/components/p-BhlP16sB.js +0 -4
- package/components/p-C8Tp0cQy.js +0 -4
- package/components/p-CFtAWaB6.js +0 -4
- package/components/p-CQxPXWNM.js +0 -4
- package/components/p-CRcX0EGs.js +0 -4
- package/components/p-CVNvmbDp.js +0 -4
- package/components/p-CXpy69Ei.js +0 -4
- package/components/p-CoGD-oMG.js +0 -4
- package/components/p-CpYeYl3u.js +0 -4
- package/components/p-D2XJVty5.js +0 -4
- package/components/p-DALTMT_o.js +0 -4
- package/components/p-Dr-rBSUW.js +0 -4
- package/components/p-MHpJ2A_m.js +0 -4
- package/components/p-N6lZFXYR.js +0 -4
- package/components/p-QgdyH-Zs.js +0 -4
- package/components/p-UKksD3f9.js +0 -4
- package/components/p-fP0QF3iG.js +0 -4
- package/components/p-ntAkt4Ra.js +0 -4
- package/components/p-ufB0gCSU.js +0 -4
- package/components/p-z-BF3clL.js +0 -4
- package/dist/collection/utils/test/late-props/late-props.js +0 -69
- package/dist/collection/utils/test/playwright/detach-reattach.js +0 -23
- package/dist/ionic/p-010601fe.entry.js +0 -4
- package/dist/ionic/p-0c2b3555.entry.js +0 -4
- package/dist/ionic/p-326e0d05.entry.js +0 -4
- package/dist/ionic/p-392079fa.entry.js +0 -4
- package/dist/ionic/p-4778b90f.entry.js +0 -4
- package/dist/ionic/p-639d3b55.entry.js +0 -4
- package/dist/ionic/p-7dec112e.entry.js +0 -4
- package/dist/ionic/p-9fef333a.entry.js +0 -4
- package/dist/ionic/p-BRa1Jjxr.js +0 -4
- package/dist/ionic/p-Cc-fFNy8.js +0 -4
- package/dist/ionic/p-Cc4w3fVf.js +0 -4
- package/dist/ionic/p-CvRL-Eju.js +0 -4
- package/dist/ionic/p-D_IgV7tz.js +0 -4
- package/dist/ionic/p-b8cd338d.entry.js +0 -4
- package/dist/ionic/p-d85e59b1.entry.js +0 -4
- package/dist/ionic/p-dad2f3e4.entry.js +0 -4
- package/dist/ionic/p-eab77a74.entry.js +0 -4
- package/dist/ionic/p-h81G-QbJ.js +0 -6
- package/dist/ionic/p-nxFQkv7U.js +0 -4
- package/dist/ionic/p-w3KTiug9.js +0 -4
- package/dist/types/utils/test/playwright/detach-reattach.d.ts +0 -13
|
@@ -20,12 +20,6 @@ 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;
|
|
29
23
|
this.ariaLabel = null;
|
|
30
24
|
this.isActive = false;
|
|
31
25
|
/**
|
|
@@ -57,12 +51,6 @@ export class PickerColumn {
|
|
|
57
51
|
*/
|
|
58
52
|
this.canExitInputMode = canExitInputMode;
|
|
59
53
|
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();
|
|
66
54
|
scrollEl.scroll({
|
|
67
55
|
top,
|
|
68
56
|
left: 0,
|
|
@@ -117,117 +105,6 @@ export class PickerColumn {
|
|
|
117
105
|
}
|
|
118
106
|
this.isActive = state;
|
|
119
107
|
};
|
|
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
|
-
};
|
|
231
108
|
/**
|
|
232
109
|
* When the column scrolls, the component
|
|
233
110
|
* needs to determine which item is centered
|
|
@@ -235,42 +112,27 @@ export class PickerColumn {
|
|
|
235
112
|
* the item object.
|
|
236
113
|
*/
|
|
237
114
|
this.initializeScrollListener = () => {
|
|
238
|
-
|
|
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');
|
|
239
121
|
const { el, scrollEl } = this;
|
|
122
|
+
let timeout;
|
|
240
123
|
let activeEl = this.activeItem;
|
|
241
124
|
const scrollCallback = () => {
|
|
242
125
|
raf(() => {
|
|
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)
|
|
126
|
+
if (!scrollEl)
|
|
248
127
|
return;
|
|
249
|
-
|
|
250
|
-
|
|
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;
|
|
128
|
+
if (timeout) {
|
|
129
|
+
clearTimeout(timeout);
|
|
130
|
+
timeout = undefined;
|
|
259
131
|
}
|
|
260
|
-
// Armed before the early returns below, so a scroll never ends uncommitted.
|
|
261
|
-
this.resetScrollEndTimeout();
|
|
262
132
|
if (!this.isScrolling) {
|
|
263
|
-
|
|
133
|
+
enableHaptics && hapticSelectionStart();
|
|
264
134
|
this.isScrolling = true;
|
|
265
135
|
}
|
|
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
|
-
}
|
|
274
136
|
/**
|
|
275
137
|
* Select item in the center of the column
|
|
276
138
|
* which is the month/year that we want to select
|
|
@@ -330,23 +192,18 @@ export class PickerColumn {
|
|
|
330
192
|
newActiveElement = fallbackActiveElement;
|
|
331
193
|
}
|
|
332
194
|
}
|
|
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
|
-
*/
|
|
338
|
-
if (newActiveElement === undefined || newActiveElement.disabled) {
|
|
339
|
-
return;
|
|
340
|
-
}
|
|
341
195
|
if (activeEl !== undefined) {
|
|
342
196
|
this.setPickerItemActiveState(activeEl, false);
|
|
343
197
|
}
|
|
198
|
+
if (newActiveElement === undefined || newActiveElement.disabled) {
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
344
201
|
/**
|
|
345
202
|
* If we are selecting a new value,
|
|
346
203
|
* we need to run haptics again.
|
|
347
204
|
*/
|
|
348
205
|
if (newActiveElement !== activeEl) {
|
|
349
|
-
|
|
206
|
+
enableHaptics && hapticSelectionChanged();
|
|
350
207
|
if (this.canExitInputMode) {
|
|
351
208
|
/**
|
|
352
209
|
* The native iOS wheel picker
|
|
@@ -378,14 +235,32 @@ export class PickerColumn {
|
|
|
378
235
|
if (this.updateValueTextOnScroll) {
|
|
379
236
|
this.assistiveFocusable?.setAttribute('aria-valuetext', this.getOptionValueText(newActiveElement));
|
|
380
237
|
}
|
|
381
|
-
|
|
238
|
+
timeout = setTimeout(() => {
|
|
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);
|
|
382
262
|
});
|
|
383
263
|
};
|
|
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
|
-
};
|
|
389
264
|
/**
|
|
390
265
|
* Wrap this in an raf so that the scroll callback
|
|
391
266
|
* does not fire when component is initially shown.
|
|
@@ -394,19 +269,8 @@ export class PickerColumn {
|
|
|
394
269
|
if (!scrollEl)
|
|
395
270
|
return;
|
|
396
271
|
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 });
|
|
405
272
|
this.destroyScrollListener = () => {
|
|
406
273
|
scrollEl.removeEventListener('scroll', scrollCallback);
|
|
407
|
-
scrollEl.removeEventListener('pointerdown', userScrollCallback);
|
|
408
|
-
scrollEl.removeEventListener('wheel', userScrollCallback);
|
|
409
|
-
scrollEl.removeEventListener('touchmove', userScrollCallback);
|
|
410
274
|
};
|
|
411
275
|
});
|
|
412
276
|
};
|
|
@@ -591,14 +455,6 @@ export class PickerColumn {
|
|
|
591
455
|
}
|
|
592
456
|
else {
|
|
593
457
|
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;
|
|
602
458
|
if (this.destroyScrollListener) {
|
|
603
459
|
this.destroyScrollListener();
|
|
604
460
|
this.destroyScrollListener = undefined;
|
|
@@ -669,13 +525,6 @@ export class PickerColumn {
|
|
|
669
525
|
connectedCallback() {
|
|
670
526
|
this.ariaLabel = this.el.getAttribute('aria-label') ?? 'Select a value';
|
|
671
527
|
}
|
|
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
|
-
}
|
|
679
528
|
get activeItem() {
|
|
680
529
|
const { value } = this;
|
|
681
530
|
const options = Array.from(this.el.querySelectorAll('ion-picker-column-option'));
|
|
@@ -693,14 +542,14 @@ export class PickerColumn {
|
|
|
693
542
|
render() {
|
|
694
543
|
const { color, disabled, isActive, numericInput } = this;
|
|
695
544
|
const mode = getIonMode(this);
|
|
696
|
-
return (h(Host, { key: '
|
|
545
|
+
return (h(Host, { key: '78b46ad10d88ea1bb43ca8c36748767912f03224', class: createColorClasses(color, {
|
|
697
546
|
[mode]: true,
|
|
698
547
|
['picker-column-active']: isActive,
|
|
699
548
|
['picker-column-numeric-input']: numericInput,
|
|
700
549
|
['picker-column-disabled']: disabled,
|
|
701
|
-
}) }, h("slot", { key: '
|
|
550
|
+
}) }, h("slot", { key: '761e501df77f7de896ffb3ebb99ebf88c5c3bf70', name: "prefix" }), h("div", { key: '9f4caaeef8ab704522a85f30876d371712f47c5c', class: "picker-opts", ref: (el) => {
|
|
702
551
|
this.scrollEl = el;
|
|
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: '
|
|
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: '9d3533436aba6c61c93f65f84a077fba832194a0', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '3f18d3a47361f06f55321b65fdf5742a61722b26', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: 'eac0d20ab8c533ef829875e323e93e1ee2067d6d', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("slot", { key: '92e25989ef41cf6f910c73238e1a0a5ac03f1c1f' }), h("div", { key: '33a84644ebdc84108b44a8e3a129b54e824939c8', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '128ad61a3a68c7ff2d2e44a6e968424fcc608a15', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0"), h("div", { key: '6e4d59a4f75befcbbf47279a263f28a69b12dbbd', class: "picker-item-empty", "aria-hidden": "true" }, "\u00A0")), h("slot", { key: '3c6621b64438792a3024c90e3d9916a0a3614506', name: "suffix" })));
|
|
704
553
|
}
|
|
705
554
|
static get is() { return "ion-picker-column"; }
|
|
706
555
|
static get encapsulation() { return "shadow"; }
|
|
@@ -924,16 +773,3 @@ export class PickerColumn {
|
|
|
924
773
|
}
|
|
925
774
|
}
|
|
926
775
|
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;
|
|
@@ -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,
|
|
10
|
+
import { BACKDROP, cleanupRootFocusTrapAccessibility, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, prepareOverlay, present, 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,13 +219,6 @@ 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
|
-
}
|
|
229
222
|
}
|
|
230
223
|
disconnectedCallback() {
|
|
231
224
|
const { destroyTriggerInteraction } = this;
|
|
@@ -403,12 +396,6 @@ export class Popover {
|
|
|
403
396
|
if (!header || contentElements.length === 0) {
|
|
404
397
|
return;
|
|
405
398
|
}
|
|
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
|
-
}
|
|
412
399
|
this.headerResizeObserver = new ResizeObserver(async () => {
|
|
413
400
|
if (header.offsetHeight > 0) {
|
|
414
401
|
this.headerResizeObserver?.disconnect();
|
|
@@ -481,7 +468,7 @@ export class Popover {
|
|
|
481
468
|
const { onLifecycle, parentPopover, dismissOnSelect, side, arrow, htmlAttributes, focusTrap } = this;
|
|
482
469
|
const desktop = isPlatform('desktop');
|
|
483
470
|
const enableArrow = arrow && !parentPopover;
|
|
484
|
-
return (h(Host, { key: '
|
|
471
|
+
return (h(Host, { key: '52ffc7116969ae1b8b927e67f2acbfe5f5434f70', "aria-modal": "true", "no-router": true, tabindex: "-1", ...htmlAttributes, style: {
|
|
485
472
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
486
473
|
}, class: {
|
|
487
474
|
...getClassMap(this.cssClass),
|
|
@@ -492,7 +479,7 @@ export class Popover {
|
|
|
492
479
|
[`popover-side-${side}`]: true,
|
|
493
480
|
[FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false,
|
|
494
481
|
'popover-nested': !!parentPopover,
|
|
495
|
-
}, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && h("ion-backdrop", { key: '
|
|
482
|
+
}, onIonPopoverDidPresent: onLifecycle, onIonPopoverWillPresent: onLifecycle, onIonPopoverWillDismiss: onLifecycle, onIonPopoverDidDismiss: onLifecycle, onIonBackdropTap: this.onBackdropTap }, !parentPopover && h("ion-backdrop", { key: '79a8e851dbd22119e21ffb2f4709c555251045c8', tappable: this.backdropDismiss, visible: this.showBackdrop, part: "backdrop" }), h("div", { key: 'c46c9f62c3ef3f902e23f27404eaa446a5d8cf88', class: "popover-wrapper ion-overlay-wrapper", onClick: dismissOnSelect ? () => this.dismiss() : undefined }, enableArrow && h("div", { key: '9fdcbbc4ea6c7bde74f646d48eb77296b2c9dd83', class: "popover-arrow", part: "arrow" }), h("div", { key: '138e56bb83462ebb0908edb522b45ecf94b82aeb', class: "popover-content", part: "content" }, h("slot", { key: 'daeefcf002e8d89e91d6e0faf7f63f75b68a2dbe' })))));
|
|
496
483
|
}
|
|
497
484
|
static get is() { return "ion-popover"; }
|
|
498
485
|
static get encapsulation() { return "shadow"; }
|
|
@@ -58,6 +58,11 @@ export class SegmentButton {
|
|
|
58
58
|
addEventListener(segmentEl, 'ionSelect', this.updateState);
|
|
59
59
|
addEventListener(segmentEl, 'ionStyle', this.updateStyle);
|
|
60
60
|
}
|
|
61
|
+
// Prevent buttons from being disabled when associated with segment content
|
|
62
|
+
if (this.contentId && this.disabled) {
|
|
63
|
+
printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
|
|
64
|
+
this.disabled = false;
|
|
65
|
+
}
|
|
61
66
|
}
|
|
62
67
|
disconnectedCallback() {
|
|
63
68
|
const segmentEl = this.segmentEl;
|
|
@@ -74,15 +79,6 @@ export class SegmentButton {
|
|
|
74
79
|
// Return if there is no contentId defined
|
|
75
80
|
if (!this.contentId)
|
|
76
81
|
return;
|
|
77
|
-
/**
|
|
78
|
-
* Checked here rather than in `connectedCallback` so frameworks that assign element
|
|
79
|
-
* props after inserting the element have set `disabled` by now. A disabled ion-segment
|
|
80
|
-
* pushes that onto its buttons too, which this guard should not undo.
|
|
81
|
-
*/
|
|
82
|
-
if (this.disabled && this.segmentEl?.disabled !== true) {
|
|
83
|
-
printIonWarning(`[ion-segment-button] - Segment buttons cannot be disabled when associated with an <ion-segment-content>.`);
|
|
84
|
-
this.disabled = false;
|
|
85
|
-
}
|
|
86
82
|
// Attempt to find the Segment Content by its contentId
|
|
87
83
|
const segmentContent = document.getElementById(this.contentId);
|
|
88
84
|
// If no associated Segment Content exists, log an error and return
|
|
@@ -117,7 +113,7 @@ export class SegmentButton {
|
|
|
117
113
|
const { checked, type, disabled, hasIcon, hasLabel, layout, segmentEl } = this;
|
|
118
114
|
const mode = getIonMode(this);
|
|
119
115
|
const hasSegmentColor = () => segmentEl?.color !== undefined;
|
|
120
|
-
return (h(Host, { key: '
|
|
116
|
+
return (h(Host, { key: '2b4b7ad8b981d2ee39aba5b9c734de8a5bd045ba', class: {
|
|
121
117
|
[mode]: true,
|
|
122
118
|
'in-toolbar': hostContext('ion-toolbar', this.el),
|
|
123
119
|
'in-toolbar-color': hostContext('ion-toolbar[color]', this.el),
|
|
@@ -133,7 +129,7 @@ export class SegmentButton {
|
|
|
133
129
|
'ion-activatable': true,
|
|
134
130
|
'ion-activatable-instant': true,
|
|
135
131
|
'ion-focusable': true,
|
|
136
|
-
} }, h("button", { key: '
|
|
132
|
+
} }, h("button", { key: '9cc58cfbe70844a0f5e1a307002e0d04e044be99', "aria-selected": checked ? 'true' : 'false', role: "tab", ref: (el) => (this.nativeEl = el), type: type, class: "button-native", part: "native", disabled: disabled, ...this.inheritedAttributes }, h("span", { key: '6443551951ce589efdb2d0e1fd1a14e35b82ed19', class: "button-inner" }, h("slot", { key: 'c3548b469ae6e5477d8372cb28bc70dff3a24d18' })), mode === 'md' && h("ion-ripple-effect", { key: 'fb176415ca1702766c4d7a5964ec0bb467bdcb55' })), h("div", { key: 'aa22b4752f8336d0e232a1e0894e87023b284a08', part: "indicator", class: "segment-button-indicator segment-button-indicator-animated" }, h("div", { key: '61e29ea52048fa0583fce6c20c81614a4d0199cb', part: "indicator-background", class: "segment-button-indicator-background" }))));
|
|
137
133
|
}
|
|
138
134
|
static get is() { return "ion-segment-button"; }
|
|
139
135
|
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 {
|
|
11
|
+
import { 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: '5d1e5bf46d0f204efdcb55cc42cfde52e6db304b', 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: '15fd1f8e06510ae8472c621cf8cf90e51172e0be', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '7964e3d9351671899793b117896acdda25ec24c4', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: 'aa309ef155c4025acfd7ed5739b5221c85097b36', name: "start" })), h("div", { key: '23d5a9dfea64a9d81b0b36d9426b15bed98901b9', class: "select-control", part: "control" }, this.renderLabel(), h("div", { key: '810da9fbfa8771e09b5fb768d64e5f04858b5833', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), h("div", { key: 'bf1c04704326ecfa14cf2e49bb76d3fb45beb08d', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), h("slot", { key: '76a8bcaeefdcaa908aebd820d93171b08165cee3', name: "end" })), shouldRenderHighlight && h("div", { key: '55a9c417a82323a44e16328fd62a634d9d7c558b', class: "select-highlight" })), this.renderBottomContent()));
|
|
969
969
|
}
|
|
970
970
|
static get is() { return "ion-select"; }
|
|
971
971
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1663,14 +1663,29 @@ const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
|
1663
1663
|
return getOptionContent(selectOpt, undefined, true);
|
|
1664
1664
|
}
|
|
1665
1665
|
/**
|
|
1666
|
-
*
|
|
1667
|
-
*
|
|
1668
|
-
*
|
|
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.
|
|
1666
|
+
* When custom HTML is enabled, extract only the default slot content.
|
|
1667
|
+
* This ensures aria-label and other text-only contexts read only
|
|
1668
|
+
* the relevant option text.
|
|
1672
1669
|
*/
|
|
1673
|
-
|
|
1670
|
+
if (customHTMLEnabled) {
|
|
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);
|
|
1674
1689
|
};
|
|
1675
1690
|
/**
|
|
1676
1691
|
* Trims whitespace from all text nodes within a DOM tree.
|
|
@@ -1726,13 +1741,9 @@ const getOptionContent = (option, slotName, useHTML = false) => {
|
|
|
1726
1741
|
if (nodes.length === 0) {
|
|
1727
1742
|
return null;
|
|
1728
1743
|
}
|
|
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
|
-
*/
|
|
1744
|
+
// Return plain text if no elements are found
|
|
1734
1745
|
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1735
|
-
return
|
|
1746
|
+
return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
|
|
1736
1747
|
}
|
|
1737
1748
|
/**
|
|
1738
1749
|
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
@@ -1788,43 +1799,22 @@ const getOptionDefaultSlot = (option) => {
|
|
|
1788
1799
|
}
|
|
1789
1800
|
return defaultSlotNodes;
|
|
1790
1801
|
};
|
|
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
|
-
};
|
|
1815
1802
|
/**
|
|
1816
1803
|
* Extracts plain text from only the default slot of an option,
|
|
1817
|
-
* excluding content assigned to named slots (start/end).
|
|
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.
|
|
1804
|
+
* excluding content assigned to named slots (start/end).
|
|
1824
1805
|
*/
|
|
1825
1806
|
const getDefaultSlotPlainText = (option) => {
|
|
1826
|
-
const
|
|
1827
|
-
|
|
1807
|
+
const texts = Array.from(option.childNodes)
|
|
1808
|
+
.filter((node) => {
|
|
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(' ');
|
|
1828
1818
|
};
|
|
1829
1819
|
/**
|
|
1830
1820
|
* Extracts the rich content from an `ion-select-option`.
|