@ionic/core 8.8.18-dev.11786108988.1fd94742 → 8.8.18-dev.11786109471.1285bcfb
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-legacy-column.d.ts +11 -0
- package/components/ion-picker-legacy-column.js +4 -0
- package/components/ion-picker-legacy.d.ts +11 -0
- package/components/ion-picker-legacy.js +4 -0
- 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-AqD_wmvU.js → p--JUspHvy.js} +1 -1
- package/components/p-A3O24YmY.js +4 -0
- package/components/p-ABkNVeU9.js +4 -0
- package/{dist/ionic/p-CHpEzg-o.js → components/p-B-JJgYSG.js} +1 -1
- package/components/p-B9jFTlwE.js +4 -0
- package/components/p-BLmJ0zRm.js +4 -0
- package/components/p-BMI53wYL.js +4 -0
- package/components/p-BMaKgJFV.js +4 -0
- package/components/p-BSEgsdFI.js +4 -0
- package/components/p-BTEOs1at.js +4 -0
- package/{dist/ionic/p-aL0G45tD.js → components/p-BkKAANMJ.js} +1 -1
- package/components/p-BlIAuGv2.js +4 -0
- package/components/p-Bnsn6KaP.js +4 -0
- package/components/p-BsBCoGa-.js +4 -0
- package/components/p-Bz0dSlXZ.js +4 -0
- package/components/p-C53feagD.js +4 -0
- package/components/p-CHqRYvYm.js +4 -0
- package/components/p-CQGnMY3n.js +4 -0
- package/components/p-CSZf8_j0.js +4 -0
- package/components/{p-ltNYIRmI.js → p-C_hpsif8.js} +1 -1
- package/components/p-C_xFdyXe.js +4 -0
- package/components/p-Cf2jSDS8.js +4 -0
- package/components/p-Cfx4M1Bn.js +4 -0
- package/components/{p-C6JOi8wS.js → p-ChIZKXUu.js} +1 -1
- package/components/p-CkMSOsFF.js +4 -0
- package/components/p-Cl0B-RWe.js +4 -0
- package/components/p-CmR5uXej.js +4 -0
- package/components/p-Cp4GRDqq.js +4 -0
- package/components/p-CsNJ1ULL.js +4 -0
- package/components/p-CtWGkNnJ.js +4 -0
- package/components/p-CzCbeKys.js +4 -0
- package/components/p-D-aHdMxW.js +4 -0
- package/components/p-D0d8qTwj.js +4 -0
- package/components/p-D13Eaw-8.js +4 -0
- package/components/{p-D0pL_HuH.js → p-D3xo7hqU.js} +1 -1
- package/components/p-D6Ynv7Xh.js +4 -0
- package/components/p-D7uN07a3.js +4 -0
- package/components/p-DCnGU1fF.js +4 -0
- package/components/p-DGvrK8dD.js +4 -0
- package/components/p-DOFCbuQR.js +4 -0
- package/components/p-DV5mPYQS.js +4 -0
- package/components/p-DWkAgceV.js +4 -0
- package/components/p-DiVJyqlX.js +4 -0
- package/components/{p-Dcu-SAJG.js → p-DqLB8yFQ.js} +1 -1
- package/components/p-DqZAXv2t.js +4 -0
- package/components/p-Osve4qkc.js +4 -0
- package/components/p-R8zmRi4c.js +4 -0
- package/components/p-SLS1rDZM.js +4 -0
- package/components/p-aJ6PBUvj.js +4 -0
- package/components/p-cyNmxje6.js +4 -0
- package/components/p-gAg0kXZp.js +4 -0
- package/components/p-j5IxBIan.js +4 -0
- package/components/p-k_E4tX5Z.js +4 -0
- package/components/p-oD4kcBRX.js +4 -0
- package/components/p-rCa2eL0j.js +4 -0
- package/components/p-scxfI1Dd.js +4 -0
- package/components/p-tr4_8ZS8.js +4 -0
- package/components/p-vRBNsYbs.js +4 -0
- package/components/p-yzCsOZE2.js +4 -0
- package/dist/cjs/{animation-D5WDBRvT.js → animation-BJq0kcy2.js} +4 -4
- package/dist/cjs/{app-globals-C2s3Cbal.js → app-globals-BlqrqKTN.js} +1 -1
- package/dist/cjs/{button-active-CXI2TseG.js → button-active-0mPOKmV2.js} +3 -3
- package/dist/cjs/config-xninhj0J.js +201 -0
- package/dist/cjs/{dir-Brx7VkvP.js → dir-Cn0z1rJH.js} +1 -1
- package/dist/cjs/{format-ZfKtcdit.js → format-PxvGiOik.js} +30 -40
- package/dist/cjs/{framework-delegate-Bdvk3JQO.js → framework-delegate-BtICZDHr.js} +7 -5
- package/dist/cjs/{gesture-controller-BDUH7687.js → gesture-controller-dtqlP_q4.js} +8 -15
- package/dist/cjs/{haptic-Ch-X4gRx.js → haptic-ClPPQ_PS.js} +3 -2
- package/dist/cjs/{hardware-back-button-zr8zeYaH.js → hardware-back-button-iUuF_76h.js} +4 -4
- package/dist/cjs/{helpers-DURh1XdY.js → helpers-Cv23MFHM.js} +3 -3
- package/dist/cjs/{index-DsoHs7Ly.js → index-BERfRao3.js} +5 -5
- package/dist/cjs/{index-P1nQxrpZ.js → index-CAvQ7Tka.js} +4 -10
- package/dist/cjs/{index-CAThePqm.js → index-Ct7gcRif.js} +6 -4
- package/dist/cjs/{index-Btdix80K.js → index-D81eLYUM.js} +2 -2
- package/dist/cjs/{index-wOmugbdg.js → index-DqmRDbxg.js} +1 -1
- package/dist/cjs/{index-BnhnwL1o.js → index-Dqpns5vP.js} +34 -2
- package/dist/cjs/{index-B7sCu6vN.js → index-aC4x3Fk3.js} +7 -6
- package/dist/cjs/index.cjs.js +18 -18
- package/dist/cjs/{input-shims-CPbWb84M.js → input-shims-DpA1zUN9.js} +11 -9
- package/dist/cjs/{input.utils-CkASW3mE.js → input.utils-DetjmtH2.js} +4 -3
- package/dist/cjs/ion-accordion_2.cjs.entry.js +340 -368
- package/dist/cjs/ion-action-sheet.cjs.entry.js +76 -187
- package/dist/cjs/ion-alert.cjs.entry.js +111 -273
- package/dist/cjs/ion-app_8.cjs.entry.js +190 -306
- package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -10
- package/dist/cjs/ion-back-button.cjs.entry.js +23 -47
- package/dist/cjs/ion-backdrop.cjs.entry.js +14 -18
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +121 -199
- package/dist/cjs/ion-button_2.cjs.entry.js +66 -138
- package/dist/cjs/ion-card_5.cjs.entry.js +30 -82
- package/dist/cjs/ion-checkbox.cjs.entry.js +101 -152
- package/dist/cjs/ion-chip.cjs.entry.js +11 -17
- package/dist/cjs/ion-col_3.cjs.entry.js +10 -134
- package/dist/cjs/ion-datetime-button.cjs.entry.js +241 -253
- package/dist/cjs/ion-datetime_3.cjs.entry.js +3164 -0
- package/dist/cjs/ion-fab_3.cjs.entry.js +81 -139
- package/dist/cjs/ion-img.cjs.entry.js +12 -34
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +72 -100
- package/dist/cjs/ion-input-otp.cjs.entry.js +370 -433
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +19 -33
- package/dist/cjs/ion-input.cjs.entry.js +168 -314
- package/dist/cjs/ion-item-option_3.cjs.entry.js +51 -91
- package/dist/cjs/ion-item_8.cjs.entry.js +82 -181
- package/dist/cjs/ion-loading.cjs.entry.js +60 -146
- package/dist/cjs/ion-menu_3.cjs.entry.js +101 -163
- package/dist/cjs/ion-modal.cjs.entry.js +283 -482
- package/dist/cjs/ion-nav_2.cjs.entry.js +157 -100
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +33 -37
- package/dist/cjs/ion-picker-column.cjs.entry.js +405 -417
- package/dist/cjs/ion-picker.cjs.entry.js +392 -401
- package/dist/cjs/ion-popover.cjs.entry.js +205 -319
- package/dist/cjs/ion-progress-bar.cjs.entry.js +25 -31
- package/dist/cjs/ion-radio_2.cjs.entry.js +133 -206
- package/dist/cjs/ion-range.cjs.entry.js +237 -302
- package/dist/cjs/ion-refresher_2.cjs.entry.js +94 -166
- package/dist/cjs/ion-reorder_2.cjs.entry.js +23 -53
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +14 -14
- package/dist/cjs/ion-route_4.cjs.entry.js +71 -175
- package/dist/cjs/ion-searchbar.cjs.entry.js +200 -291
- package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment-view.cjs.entry.js +17 -28
- package/dist/cjs/ion-segment_2.cjs.entry.js +126 -169
- package/dist/cjs/ion-select-modal.cjs.entry.js +48 -104
- package/dist/cjs/ion-select_3.cjs.entry.js +214 -759
- package/dist/cjs/ion-spinner.cjs.entry.js +10 -24
- package/dist/cjs/ion-split-pane.cjs.entry.js +16 -29
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +41 -100
- package/dist/cjs/ion-tab_2.cjs.entry.js +27 -53
- package/dist/cjs/ion-text.cjs.entry.js +5 -11
- package/dist/cjs/ion-textarea.cjs.entry.js +144 -263
- package/dist/cjs/ion-toast.cjs.entry.js +117 -236
- package/dist/cjs/ion-toggle.cjs.entry.js +122 -175
- package/dist/cjs/{ionic-global-dMut1Czp.js → ionic-global-B-cA6LkY.js} +8 -13
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-CeaFa0y2.js → ios.transition-BOSWOaiK.js} +17 -13
- package/dist/cjs/{item-multiple-inputs-HQO5Iy9I.js → item-multiple-inputs-D-gyg57c.js} +1 -1
- package/dist/cjs/{keyboard-cHxZlTyz.js → keyboard-UuAS4D_9.js} +2 -2
- package/dist/cjs/{keyboard-controller-PtZoN2GS.js → keyboard-controller-GXBiBRKS.js} +6 -6
- package/dist/cjs/{keyboard-Cix5TVkD.js → keyboard-hHzlEQpk.js} +2 -2
- package/dist/cjs/loader.cjs.js +4 -4
- package/dist/cjs/{md.transition-D4Q5jny7.js → md.transition-B8-wBZqt.js} +8 -7
- package/dist/cjs/{notch-controller-fMfidI-7.js → notch-controller-18PzRGXd.js} +1 -1
- package/dist/cjs/{overlays-C2qrqpHm.js → overlays-DdtIYQUH.js} +33 -48
- package/dist/cjs/{status-tap-CgjQ-6jq.js → status-tap-N1kaBbuk.js} +3 -3
- package/dist/cjs/{swipe-back-CmfRYdWQ.js → swipe-back-C0GCB18x.js} +5 -5
- package/dist/cjs/{theme-Bw0rpaNN.js → theme-CeDs6Hcv.js} +1 -6
- package/dist/collection/collection-manifest.json +10 -6
- package/dist/collection/components/accordion/accordion.js +312 -315
- package/dist/collection/components/accordion-group/accordion-group.js +25 -48
- package/dist/collection/components/action-sheet/action-sheet.ios.css +2 -228
- package/dist/collection/components/action-sheet/action-sheet.js +64 -173
- package/dist/collection/components/action-sheet/action-sheet.md.css +2 -174
- package/dist/collection/components/action-sheet/test/basic/fixture.js +0 -3
- package/dist/collection/components/alert/alert.ios.css +10 -279
- package/dist/collection/components/alert/alert.js +97 -257
- package/dist/collection/components/alert/alert.md.css +20 -268
- package/dist/collection/components/app/app.js +0 -3
- package/dist/collection/components/back-button/back-button.js +19 -42
- package/dist/collection/components/backdrop/backdrop.js +14 -16
- package/dist/collection/components/badge/badge.js +0 -6
- package/dist/collection/components/breadcrumb/breadcrumb.js +30 -91
- package/dist/collection/components/breadcrumbs/breadcrumbs.js +88 -103
- package/dist/collection/components/button/button.js +61 -132
- package/dist/collection/components/buttons/buttons.js +15 -13
- package/dist/collection/components/card/card.js +21 -54
- package/dist/collection/components/card-header/card-header.js +8 -12
- package/dist/collection/components/card-subtitle/card-subtitle.js +0 -6
- package/dist/collection/components/card-title/card-title.js +0 -6
- package/dist/collection/components/checkbox/checkbox.js +97 -147
- package/dist/collection/components/chip/chip.js +10 -14
- package/dist/collection/components/col/col.js +3 -127
- package/dist/collection/components/content/content.js +64 -92
- package/dist/collection/components/datetime/datetime.ios.css +2 -42
- package/dist/collection/components/datetime/datetime.js +812 -1047
- package/dist/collection/components/datetime/datetime.md.css +1 -42
- package/dist/collection/components/datetime/utils/data.js +14 -13
- package/dist/collection/components/datetime/utils/format.js +11 -21
- package/dist/collection/components/datetime/utils/manipulation.js +8 -8
- package/dist/collection/components/datetime/utils/parse.js +10 -10
- package/dist/collection/components/datetime/utils/state.js +2 -8
- package/dist/collection/components/datetime/utils/validate.js +5 -4
- package/dist/collection/components/datetime-button/datetime-button.ios.css +0 -5
- package/dist/collection/components/datetime-button/datetime-button.js +237 -247
- package/dist/collection/components/datetime-button/datetime-button.md.css +0 -5
- package/dist/collection/components/fab/fab.js +13 -20
- package/dist/collection/components/fab-button/fab-button.js +55 -104
- package/dist/collection/components/fab-list/fab-list.js +11 -10
- package/dist/collection/components/footer/footer.js +44 -50
- package/dist/collection/components/grid/grid.js +6 -4
- package/dist/collection/components/header/header.js +25 -35
- package/dist/collection/components/img/img.js +10 -34
- package/dist/collection/components/infinite-scroll/infinite-scroll.js +66 -73
- package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +3 -20
- package/dist/collection/components/input/input.ios.css +2 -1
- package/dist/collection/components/input/input.js +164 -309
- package/dist/collection/components/input/input.md.css +2 -1
- package/dist/collection/components/input-otp/input-otp.js +366 -428
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +16 -29
- package/dist/collection/components/item/item.js +53 -99
- package/dist/collection/components/item-divider/item-divider.js +10 -15
- package/dist/collection/components/item-option/item-option.js +21 -49
- package/dist/collection/components/item-options/item-options.js +7 -10
- package/dist/collection/components/item-sliding/item-sliding.js +20 -26
- package/dist/collection/components/label/label.js +4 -24
- package/dist/collection/components/list/list.js +7 -10
- package/dist/collection/components/list-header/list-header.js +0 -10
- package/dist/collection/components/loading/loading.js +51 -135
- package/dist/collection/components/menu/menu.js +59 -101
- package/dist/collection/components/menu-button/menu-button.js +20 -29
- package/dist/collection/components/menu-toggle/menu-toggle.js +13 -20
- package/dist/collection/components/modal/animations/ios.enter.js +1 -1
- package/dist/collection/components/modal/animations/md.enter.js +1 -1
- package/dist/collection/components/modal/gestures/sheet.js +12 -29
- package/dist/collection/components/modal/gestures/swipe-to-close.js +5 -33
- package/dist/collection/components/modal/gestures/utils.js +17 -0
- package/dist/collection/components/modal/modal.js +224 -393
- package/dist/collection/components/modal/safe-area-utils.js +5 -4
- package/dist/collection/components/modal/test/fixtures.js +0 -3
- package/dist/collection/components/nav/nav.js +247 -69
- package/dist/collection/components/nav/view-controller.js +1 -7
- package/dist/collection/components/nav-link/nav-link.js +9 -20
- package/dist/collection/components/note/note.js +0 -6
- package/dist/collection/components/picker/picker.js +390 -398
- package/dist/collection/components/picker-column/picker-column.css +0 -3
- package/dist/collection/components/picker-column/picker-column.js +404 -414
- package/dist/collection/components/picker-column-option/picker-column-option.js +31 -33
- package/dist/collection/components/picker-column-option/picker-column-option.md.css +1 -6
- package/dist/collection/components/picker-legacy/animations/ios.enter.js +27 -0
- package/dist/collection/components/picker-legacy/animations/ios.leave.js +23 -0
- package/dist/collection/components/picker-legacy/picker-interface.js +1 -0
- package/dist/collection/components/picker-legacy/picker.ios.css +300 -0
- package/dist/collection/components/picker-legacy/picker.js +890 -0
- package/dist/collection/components/picker-legacy/picker.md.css +287 -0
- package/dist/collection/components/picker-legacy-column/picker-column.ios.css +231 -0
- package/dist/collection/components/picker-legacy-column/picker-column.js +422 -0
- package/dist/collection/components/picker-legacy-column/picker-column.md.css +222 -0
- package/dist/collection/components/picker-legacy-column/test/test.utils.js +43 -0
- package/dist/collection/components/popover/animations/ios.enter.js +2 -1
- package/dist/collection/components/popover/animations/md.enter.js +2 -1
- package/dist/collection/components/popover/popover.ios.css +0 -15
- package/dist/collection/components/popover/popover.js +185 -302
- package/dist/collection/components/popover/popover.md.css +0 -15
- package/dist/collection/components/popover/test/fixture.js +0 -1
- package/dist/collection/components/popover/utils.js +6 -4
- package/dist/collection/components/progress-bar/progress-bar.js +23 -27
- package/dist/collection/components/radio/radio.js +66 -102
- package/dist/collection/components/radio-group/radio-group.js +65 -100
- package/dist/collection/components/radio-group/test/fixtures.js +0 -2
- package/dist/collection/components/range/range.js +232 -296
- package/dist/collection/components/refresher/refresher.js +80 -112
- package/dist/collection/components/refresher-content/refresher-content.js +4 -41
- package/dist/collection/components/reorder/reorder.js +1 -2
- package/dist/collection/components/reorder-group/reorder-group.js +15 -44
- package/dist/collection/components/ripple-effect/ripple-effect.js +13 -12
- package/dist/collection/components/route/route.js +10 -39
- package/dist/collection/components/route-redirect/route-redirect.js +0 -31
- package/dist/collection/components/router/router.js +33 -37
- package/dist/collection/components/router/utils/dom.js +7 -25
- package/dist/collection/components/router/utils/matching.js +9 -7
- package/dist/collection/components/router/utils/parser.js +1 -1
- package/dist/collection/components/router/utils/path.js +1 -0
- package/dist/collection/components/router-link/router-link.js +12 -37
- package/dist/collection/components/router-outlet/router-outlet.js +21 -82
- package/dist/collection/components/row/row.js +1 -1
- package/dist/collection/components/searchbar/searchbar.js +199 -289
- package/dist/collection/components/segment/segment.js +85 -120
- package/dist/collection/components/segment-button/segment-button.js +37 -43
- package/dist/collection/components/segment-content/segment-content.js +1 -1
- package/dist/collection/components/segment-view/segment-view.js +16 -26
- package/dist/collection/components/select/select.ios.css +0 -33
- package/dist/collection/components/select/select.js +166 -597
- package/dist/collection/components/select/select.md.css +0 -33
- package/dist/collection/components/select-modal/select-modal.ios.css +0 -218
- package/dist/collection/components/select-modal/select-modal.js +38 -92
- package/dist/collection/components/select-modal/select-modal.md.css +0 -164
- package/dist/collection/components/select-modal/test/fixtures.js +1 -8
- package/dist/collection/components/select-option/select-option.js +9 -110
- package/dist/collection/components/select-popover/select-popover.ios.css +0 -218
- package/dist/collection/components/select-popover/select-popover.js +36 -103
- package/dist/collection/components/select-popover/select-popover.md.css +0 -164
- package/dist/collection/components/select-popover/test/fixtures.js +1 -8
- package/dist/collection/components/skeleton-text/skeleton-text.js +8 -12
- package/dist/collection/components/spinner/spinner.js +9 -21
- package/dist/collection/components/split-pane/split-pane.js +15 -27
- package/dist/collection/components/tab/tab.js +6 -17
- package/dist/collection/components/tab-bar/tab-bar.js +14 -32
- package/dist/collection/components/tab-button/tab-button.js +23 -62
- package/dist/collection/components/tabs/tabs.js +20 -33
- package/dist/collection/components/text/text.js +2 -8
- package/dist/collection/components/textarea/textarea.js +139 -257
- package/dist/collection/components/thumbnail/thumbnail.js +1 -1
- package/dist/collection/components/title/title.js +2 -18
- package/dist/collection/components/toast/toast.js +106 -223
- package/dist/collection/components/toggle/toggle.js +115 -167
- package/dist/collection/components/toolbar/toolbar.js +7 -15
- package/dist/collection/global/config.js +6 -4
- package/dist/collection/global/ionic-global.js +2 -8
- package/dist/collection/index.js +1 -1
- package/dist/collection/utils/animation/animation.js +3 -3
- package/dist/collection/utils/config.js +4 -5
- package/dist/collection/utils/content/index.js +30 -0
- package/dist/collection/utils/focus-controller/index.js +1 -1
- package/dist/collection/utils/focus-trap.js +3 -3
- package/dist/collection/utils/framework-delegate.js +6 -4
- package/dist/collection/utils/gesture/gesture-controller.js +8 -15
- package/dist/collection/utils/gesture/index.js +2 -10
- package/dist/collection/utils/gesture/listener.js +1 -1
- package/dist/collection/utils/hardware-back-button.js +3 -3
- package/dist/collection/utils/helpers.js +2 -2
- package/dist/collection/utils/input-shims/hacks/scroll-assist.js +5 -4
- package/dist/collection/utils/input-shims/hacks/scroll-data.js +2 -1
- package/dist/collection/utils/keyboard/keyboard-controller.js +5 -5
- package/dist/collection/utils/keyboard/keyboard.js +1 -1
- package/dist/collection/utils/menu-controller/index.js +2 -1
- package/dist/collection/utils/native/haptic.js +3 -2
- package/dist/collection/utils/native/keyboard.js +2 -2
- package/dist/collection/utils/native/status-bar.js +1 -1
- package/dist/collection/utils/overlays.js +23 -38
- package/dist/collection/utils/platform.js +5 -4
- package/dist/collection/utils/rtl/dir.js +1 -1
- package/dist/collection/utils/sanitization/index.js +20 -276
- package/dist/collection/utils/slot-mutation-controller.js +2 -1
- package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +1 -1
- package/dist/collection/utils/test/playwright/drag-element.js +3 -2
- package/dist/collection/utils/test/playwright/generator.js +4 -3
- package/dist/collection/utils/test/playwright/page/event-spy.js +12 -11
- package/dist/collection/utils/test/playwright/page/utils/goto.js +5 -4
- package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
- package/dist/collection/utils/test/playwright/page/utils/set-ion-viewport.js +3 -2
- package/dist/collection/utils/test/press-keys.js +17 -10
- package/dist/collection/utils/theme.js +1 -6
- package/dist/collection/utils/transition/ios.transition.js +13 -9
- package/dist/collection/utils/transition/md.transition.js +4 -3
- package/dist/docs.json +1267 -551
- package/dist/esm/{animation-CVK55yMY.js → animation-DLJpuoEz.js} +4 -4
- package/dist/esm/{app-globals-Bk1_t4sH.js → app-globals-D0C5S4hU.js} +1 -1
- package/dist/esm/{button-active-CdCqmeT0.js → button-active-BSpTQmS9.js} +3 -3
- package/dist/esm/config-DQCONYYp.js +195 -0
- package/dist/esm/{dir-B-FxiyeI.js → dir-C53feagD.js} +1 -1
- package/dist/esm/{format-sMi4BZ_l.js → format-CAmvpAez.js} +31 -41
- package/dist/esm/{framework-delegate-BfAlKlW5.js → framework-delegate-FnPGymXL.js} +7 -5
- package/dist/esm/{gesture-controller-TXPDHL13.js → gesture-controller-BTEOs1at.js} +8 -15
- package/dist/esm/{haptic-Cq4UAeka.js → haptic-DzAMWJuk.js} +3 -2
- package/dist/esm/{hardware-back-button-DcHMMB9j.js → hardware-back-button-B93Gru0Y.js} +4 -4
- package/dist/esm/{helpers-BPcITY5s.js → helpers-HEqiOzXb.js} +3 -3
- package/dist/esm/{index-B9GsUd2c.js → index-BRHzoo00.js} +2 -2
- package/dist/esm/{index-DqVqy_Cy.js → index-B_dQk_WE.js} +5 -5
- package/dist/esm/{index-DppOcPFQ.js → index-CfgBF1SE.js} +4 -10
- package/dist/esm/{index-BvabGprD.js → index-DV3sJJW8.js} +2 -2
- package/dist/esm/{index-DcUt1pPn.js → index-Dw-wN0Ja.js} +33 -3
- package/dist/esm/{index-ks-BjikL.js → index-Q6UPU0Ay.js} +7 -6
- package/dist/esm/{index-D1CQtpUN.js → index-tcQvqkiX.js} +7 -5
- package/dist/esm/index.js +15 -16
- package/dist/esm/{input-shims-C1dCKVMO.js → input-shims-LXhI7LEx.js} +11 -9
- package/dist/esm/{input.utils-Dd5xwlP6.js → input.utils-Y6NgW8bw.js} +4 -3
- package/dist/esm/ion-accordion_2.entry.js +340 -368
- package/dist/esm/ion-action-sheet.entry.js +76 -187
- package/dist/esm/ion-alert.entry.js +110 -272
- package/dist/esm/ion-app_8.entry.js +190 -306
- package/dist/esm/ion-avatar_3.entry.js +4 -10
- package/dist/esm/ion-back-button.entry.js +23 -47
- package/dist/esm/ion-backdrop.entry.js +14 -18
- package/dist/esm/ion-breadcrumb_2.entry.js +121 -199
- package/dist/esm/ion-button_2.entry.js +66 -138
- package/dist/esm/ion-card_5.entry.js +30 -82
- package/dist/esm/ion-checkbox.entry.js +101 -152
- package/dist/esm/ion-chip.entry.js +11 -17
- package/dist/esm/ion-col_3.entry.js +10 -134
- package/dist/esm/ion-datetime-button.entry.js +241 -253
- package/dist/esm/ion-datetime_3.entry.js +3160 -0
- package/dist/esm/ion-fab_3.entry.js +81 -139
- package/dist/esm/ion-img.entry.js +12 -34
- package/dist/esm/ion-infinite-scroll_2.entry.js +71 -99
- package/dist/esm/ion-input-otp.entry.js +370 -433
- package/dist/esm/ion-input-password-toggle.entry.js +19 -33
- package/dist/esm/ion-input.entry.js +168 -314
- package/dist/esm/ion-item-option_3.entry.js +51 -91
- package/dist/esm/ion-item_8.entry.js +82 -181
- package/dist/esm/ion-loading.entry.js +59 -145
- package/dist/esm/ion-menu_3.entry.js +101 -163
- package/dist/esm/ion-modal.entry.js +271 -470
- package/dist/esm/ion-nav_2.entry.js +157 -100
- package/dist/esm/ion-picker-column-option.entry.js +33 -37
- package/dist/esm/ion-picker-column.entry.js +405 -417
- package/dist/esm/ion-picker.entry.js +392 -401
- package/dist/esm/ion-popover.entry.js +205 -319
- package/dist/esm/ion-progress-bar.entry.js +25 -31
- package/dist/esm/ion-radio_2.entry.js +133 -206
- package/dist/esm/ion-range.entry.js +237 -302
- package/dist/esm/ion-refresher_2.entry.js +92 -164
- package/dist/esm/ion-reorder_2.entry.js +23 -53
- package/dist/esm/ion-ripple-effect.entry.js +14 -14
- package/dist/esm/ion-route_4.entry.js +71 -175
- package/dist/esm/ion-searchbar.entry.js +200 -291
- package/dist/esm/ion-segment-content.entry.js +2 -2
- package/dist/esm/ion-segment-view.entry.js +17 -28
- package/dist/esm/ion-segment_2.entry.js +126 -169
- package/dist/esm/ion-select-modal.entry.js +48 -104
- package/dist/esm/ion-select_3.entry.js +215 -760
- package/dist/esm/ion-spinner.entry.js +10 -24
- package/dist/esm/ion-split-pane.entry.js +16 -29
- package/dist/esm/ion-tab-bar_2.entry.js +41 -100
- package/dist/esm/ion-tab_2.entry.js +27 -53
- package/dist/esm/ion-text.entry.js +5 -11
- package/dist/esm/ion-textarea.entry.js +144 -263
- package/dist/esm/ion-toast.entry.js +116 -235
- package/dist/esm/ion-toggle.entry.js +122 -175
- package/dist/esm/{ionic-global-5bZ91kOL.js → ionic-global-Cp_eT4sZ.js} +8 -13
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-OcwIGkv9.js → ios.transition-ClFrsIrS.js} +17 -13
- package/dist/esm/{item-multiple-inputs-ifd3ZrqY.js → item-multiple-inputs-DlNuqNJm.js} +1 -1
- package/dist/esm/{keyboard-DAF8GNJ9.js → keyboard-CUw4ekVy.js} +2 -2
- package/dist/esm/{keyboard-controller-DEwoa1ev.js → keyboard-controller-BaaVITYt.js} +6 -6
- package/dist/esm/{keyboard-Cj8mLJeq.js → keyboard-ywgs5efA.js} +2 -2
- package/dist/esm/loader.js +5 -5
- package/dist/esm/{md.transition-BetdF0bc.js → md.transition-D0msQmzI.js} +8 -7
- package/dist/esm/{notch-controller-DBSn-Uat.js → notch-controller-DKDjU_O7.js} +1 -1
- package/dist/esm/{overlays-DUzb9CQf.js → overlays-Dg0q2_tJ.js} +33 -48
- package/dist/esm/{status-tap-C-wNhea0.js → status-tap-vO-6s4Yp.js} +3 -3
- package/dist/esm/{swipe-back-D6YSgAn7.js → swipe-back-DQ1q5MgD.js} +5 -5
- package/dist/esm/{theme-byZM6qHV.js → theme-DiVJyqlX.js} +1 -6
- package/dist/html.html-data.json +80 -52
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-01f81ea5.entry.js +4 -0
- package/dist/ionic/p-06c232a4.entry.js +4 -0
- package/dist/ionic/p-0caa922c.entry.js +4 -0
- package/dist/ionic/p-0dc33652.entry.js +4 -0
- package/dist/ionic/p-0fa9c382.entry.js +4 -0
- package/dist/ionic/p-10e833ef.entry.js +4 -0
- package/dist/ionic/p-21eb76d5.entry.js +4 -0
- package/dist/ionic/p-27d30585.entry.js +4 -0
- package/dist/ionic/p-2a05aa64.entry.js +4 -0
- package/dist/ionic/p-2b204c59.entry.js +4 -0
- package/dist/ionic/p-2bb2cb18.entry.js +4 -0
- package/dist/ionic/p-2fa58e80.entry.js +4 -0
- package/dist/ionic/p-3353c229.entry.js +4 -0
- package/dist/ionic/p-34586ead.entry.js +4 -0
- package/dist/ionic/p-37e720da.entry.js +4 -0
- package/dist/ionic/p-390ca786.entry.js +4 -0
- package/dist/ionic/p-3ae5f277.entry.js +4 -0
- package/dist/ionic/p-4654ae1c.entry.js +4 -0
- package/dist/ionic/p-4745f534.entry.js +4 -0
- package/dist/ionic/p-4858af1f.entry.js +4 -0
- package/dist/ionic/p-4baa5b82.entry.js +4 -0
- package/dist/ionic/p-4e92a11f.entry.js +4 -0
- package/dist/ionic/p-5018dfc8.entry.js +4 -0
- package/dist/ionic/p-50e1194a.entry.js +4 -0
- package/dist/ionic/p-5334df12.entry.js +4 -0
- package/dist/ionic/p-5d1da0a2.entry.js +4 -0
- package/dist/ionic/p-5eb8e86d.entry.js +4 -0
- package/dist/ionic/p-65ebdf1b.entry.js +4 -0
- package/dist/ionic/p-746fa988.entry.js +4 -0
- package/dist/ionic/p-75dc25ba.entry.js +4 -0
- package/dist/ionic/p-7c319341.entry.js +4 -0
- package/dist/ionic/p-8158d422.entry.js +4 -0
- package/dist/ionic/p-829367ed.entry.js +4 -0
- package/dist/ionic/p-84d5ce05.entry.js +4 -0
- package/dist/ionic/p-874b4bd8.entry.js +4 -0
- package/dist/ionic/p-8eb8ee76.entry.js +4 -0
- package/dist/ionic/p-9eeaBrnk.js +4 -0
- package/dist/ionic/p-9f9db3a2.entry.js +4 -0
- package/dist/ionic/p-BGqMS-oh.js +4 -0
- package/dist/ionic/p-BTEOs1at.js +4 -0
- package/dist/ionic/p-BUFIpxKM.js +4 -0
- package/dist/ionic/p-C0eMdTCW.js +4 -0
- package/dist/ionic/p-C53feagD.js +4 -0
- package/dist/ionic/p-CFlfIb2g.js +4 -0
- package/dist/ionic/p-CKvCXMs9.js +4 -0
- package/dist/ionic/p-Cl0B-RWe.js +4 -0
- package/dist/ionic/p-CmcFnK-B.js +4 -0
- package/dist/ionic/p-CtWGkNnJ.js +4 -0
- package/dist/ionic/p-Cx3IXROA.js +4 -0
- package/dist/ionic/p-D-3ycHmd.js +4 -0
- package/dist/ionic/p-D13Eaw-8.js +4 -0
- package/dist/ionic/p-D4uTWt4-.js +4 -0
- package/{components/p-Cwsd9bue.js → dist/ionic/p-DC3RagnA.js} +1 -1
- package/dist/ionic/{p-BNKr91bi.js → p-DIuEbVLu.js} +1 -1
- package/dist/ionic/{p-BvabGprD.js → p-DV3sJJW8.js} +1 -1
- package/dist/ionic/p-DiVJyqlX.js +4 -0
- package/dist/ionic/{p-I9ETXg5W.js → p-DoJvtrbw.js} +1 -1
- package/dist/ionic/p-DqN5EA2O.js +4 -0
- package/dist/ionic/p-DzWaWHGc.js +4 -0
- package/{components/p-BXQ7upSC.js → dist/ionic/p-KjNvRoEp.js} +1 -1
- package/dist/ionic/p-Nqf6uvGh.js +4 -0
- package/dist/ionic/p-SNAkTDfm.js +4 -0
- package/dist/ionic/p-VAemlbDS.js +4 -0
- package/dist/ionic/p-a3bdcae6.entry.js +4 -0
- package/dist/ionic/{p-460da491.entry.js → p-aaeedb6b.entry.js} +1 -1
- package/dist/ionic/p-af55a72f.entry.js +4 -0
- package/dist/ionic/p-b2020591.entry.js +4 -0
- package/dist/ionic/p-b9fadbfe.entry.js +4 -0
- package/dist/ionic/p-biz8zWmJ.js +4 -0
- package/dist/ionic/p-c0fb8edd.entry.js +4 -0
- package/dist/ionic/p-c38b648e.entry.js +4 -0
- package/dist/ionic/p-c4d8641b.entry.js +4 -0
- package/dist/ionic/{p-b40c9715.entry.js → p-c6e49f3f.entry.js} +1 -1
- package/dist/ionic/p-ca2ab74d.entry.js +4 -0
- package/dist/ionic/p-d1aac015.entry.js +4 -0
- package/dist/ionic/p-d889ff6d.entry.js +4 -0
- package/dist/ionic/p-dfa8d673.entry.js +4 -0
- package/dist/ionic/p-ef4c3bee.entry.js +4 -0
- package/dist/ionic/p-f386f6ae.entry.js +4 -0
- package/dist/ionic/p-mjKAFv89.js +4 -0
- package/dist/ionic/p-tcQvqkiX.js +5 -0
- package/dist/ionic/p-uWtqTrG8.js +4 -0
- package/dist/ionic/p-viFHDgRs.js +4 -0
- package/dist/ionic/p-xWb6fgfq.js +4 -0
- package/dist/types/components/img/img.d.ts +0 -2
- package/dist/types/components/input/input.d.ts +1 -1
- package/dist/types/components/modal/gestures/utils.d.ts +11 -0
- package/dist/types/components/modal/modal.d.ts +4 -11
- package/dist/types/components/nav/nav-interface.d.ts +1 -0
- package/dist/types/components/nav/nav.d.ts +22 -2
- package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +5 -0
- package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +5 -0
- package/dist/types/components/picker-legacy/picker-interface.d.ts +52 -0
- package/dist/types/components/picker-legacy/picker.d.ts +158 -0
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +46 -0
- package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +9 -0
- package/dist/types/components/route/route.d.ts +1 -1
- package/dist/types/components/router-outlet/router-outlet.d.ts +0 -7
- package/dist/types/components/searchbar/searchbar.d.ts +1 -1
- package/dist/types/components/select/select-interface.d.ts +0 -31
- package/dist/types/components/select/select.d.ts +0 -18
- package/dist/types/components/select-option/select-option.d.ts +1 -42
- package/dist/types/components.d.ts +311 -74
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interface.d.ts +1 -0
- package/dist/types/utils/config.d.ts +8 -0
- package/dist/types/utils/content/index.d.ts +12 -0
- package/dist/types/utils/overlays.d.ts +9 -11
- package/dist/types/utils/sanitization/index.d.ts +2 -58
- package/dist/types/utils/test/playwright/playwright-page.d.ts +1 -1
- package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
- package/hydrate/index.js +7103 -10331
- package/hydrate/index.mjs +7103 -10331
- package/package.json +11 -54
- package/components/p-0tt0PTAe.js +0 -4
- package/components/p-3dKnMgX5.js +0 -4
- package/components/p-6e_5igwn.js +0 -4
- package/components/p-B-FxiyeI.js +0 -4
- package/components/p-B4COLbAV.js +0 -4
- package/components/p-B9zzUBwR.js +0 -4
- package/components/p-BFU7kgcj.js +0 -4
- package/components/p-BMPN55of.js +0 -4
- package/components/p-BPbRjpb2.js +0 -4
- package/components/p-BSQPZ79H.js +0 -4
- package/components/p-BhamHSw3.js +0 -4
- package/components/p-BrXE0XUu.js +0 -4
- package/components/p-Bv7Rqz3Z.js +0 -4
- package/components/p-Bw7MMRH7.js +0 -4
- package/components/p-C-X5vb8f.js +0 -4
- package/components/p-C117Majq.js +0 -4
- package/components/p-CCVPk59A.js +0 -4
- package/components/p-CEW4RXZO.js +0 -4
- package/components/p-CKMc290p.js +0 -4
- package/components/p-CO5nI-BZ.js +0 -4
- package/components/p-COQ_7Wwc.js +0 -4
- package/components/p-CQbh6Be_.js +0 -4
- package/components/p-CQtcj8t7.js +0 -4
- package/components/p-Cap9bvqr.js +0 -4
- package/components/p-CdP7ze2J.js +0 -4
- package/components/p-CfyJ_Ogc.js +0 -4
- package/components/p-ChWC4-vA.js +0 -4
- package/components/p-CmKf4pgI.js +0 -4
- package/components/p-CqYSqB9_.js +0 -4
- package/components/p-D0xd6h3Q.js +0 -4
- package/components/p-D28LaDuR.js +0 -4
- package/components/p-D7-vHX0A.js +0 -4
- package/components/p-D9KqizZs.js +0 -4
- package/components/p-DIZE3CVV.js +0 -4
- package/components/p-DL8rd5jo.js +0 -4
- package/components/p-DRcApg6F.js +0 -4
- package/components/p-DTTnwMiS.js +0 -4
- package/components/p-DWCzVL3Y.js +0 -4
- package/components/p-DYmrV1HT.js +0 -4
- package/components/p-DnINLmwC.js +0 -4
- package/components/p-DsNz6_gM.js +0 -4
- package/components/p-DtiuiOTk.js +0 -4
- package/components/p-DunYzubP.js +0 -4
- package/components/p-DwcSJ9u1.js +0 -4
- package/components/p-QCPSB1bo.js +0 -4
- package/components/p-RvtofbHn.js +0 -4
- package/components/p-TXPDHL13.js +0 -4
- package/components/p-WOFp6fXj.js +0 -4
- package/components/p-byZM6qHV.js +0 -4
- package/components/p-miSGCTAU.js +0 -4
- package/components/p-mpdX3emm.js +0 -4
- package/components/p-nvqVLrWC.js +0 -4
- package/components/p-qiWM96Sz.js +0 -4
- package/components/p-vlF0Bcfd.js +0 -4
- package/dist/cjs/config-CjUbvdPW.js +0 -36
- package/dist/cjs/index-DhSx3VvD.js +0 -429
- package/dist/cjs/ion-datetime.cjs.entry.js +0 -2767
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +0 -50
- package/dist/cjs/select-option-render-Dh16lTnA.js +0 -123
- package/dist/collection/utils/overlay-control-label.js +0 -45
- package/dist/collection/utils/select-option-render.js +0 -118
- package/dist/esm/config-DWCzVL3Y.js +0 -32
- package/dist/esm/index-DDa8edAS.js +0 -424
- package/dist/esm/ion-datetime.entry.js +0 -2765
- package/dist/esm/overlay-control-label-BSQPZ79H.js +0 -47
- package/dist/esm/select-option-render-DsW8svRr.js +0 -121
- package/dist/ionic/p-01eaee58.entry.js +0 -4
- package/dist/ionic/p-0c567140.entry.js +0 -4
- package/dist/ionic/p-105bb794.entry.js +0 -4
- package/dist/ionic/p-10d55bb6.entry.js +0 -4
- package/dist/ionic/p-173a87d8.entry.js +0 -4
- package/dist/ionic/p-178da672.entry.js +0 -4
- package/dist/ionic/p-1ead2857.entry.js +0 -4
- package/dist/ionic/p-224e2464.entry.js +0 -4
- package/dist/ionic/p-2268e718.entry.js +0 -4
- package/dist/ionic/p-2b5283f3.entry.js +0 -4
- package/dist/ionic/p-2b6decac.entry.js +0 -4
- package/dist/ionic/p-2da5d9c6.entry.js +0 -4
- package/dist/ionic/p-31890acd.entry.js +0 -4
- package/dist/ionic/p-34ef7425.entry.js +0 -4
- package/dist/ionic/p-34f7c1d8.entry.js +0 -4
- package/dist/ionic/p-3b1e6fa4.entry.js +0 -4
- package/dist/ionic/p-42fefd2c.entry.js +0 -4
- package/dist/ionic/p-440cd489.entry.js +0 -4
- package/dist/ionic/p-53f680e8.entry.js +0 -4
- package/dist/ionic/p-57ba508f.entry.js +0 -4
- package/dist/ionic/p-599e5a75.entry.js +0 -4
- package/dist/ionic/p-5f670a9e.entry.js +0 -4
- package/dist/ionic/p-63502088.entry.js +0 -4
- package/dist/ionic/p-6e6bf45d.entry.js +0 -4
- package/dist/ionic/p-6f0b6a48.entry.js +0 -4
- package/dist/ionic/p-7438c462.entry.js +0 -4
- package/dist/ionic/p-747716e7.entry.js +0 -4
- package/dist/ionic/p-7759fcaf.entry.js +0 -4
- package/dist/ionic/p-7a8338e2.entry.js +0 -4
- package/dist/ionic/p-80f9f1dc.entry.js +0 -4
- package/dist/ionic/p-83ff4dcb.entry.js +0 -4
- package/dist/ionic/p-86f03895.entry.js +0 -4
- package/dist/ionic/p-87b8d70e.entry.js +0 -4
- package/dist/ionic/p-888236bf.entry.js +0 -4
- package/dist/ionic/p-8a92ca23.entry.js +0 -4
- package/dist/ionic/p-8c9af4ad.entry.js +0 -4
- package/dist/ionic/p-9669f546.entry.js +0 -4
- package/dist/ionic/p-9bcd8b74.entry.js +0 -4
- package/dist/ionic/p-B-FxiyeI.js +0 -4
- package/dist/ionic/p-B2trYd8K.js +0 -4
- package/dist/ionic/p-BMPN55of.js +0 -4
- package/dist/ionic/p-BSQPZ79H.js +0 -4
- package/dist/ionic/p-BSzG1VcX.js +0 -4
- package/dist/ionic/p-BVgBHS96.js +0 -4
- package/dist/ionic/p-BX2IOAqC.js +0 -4
- package/dist/ionic/p-BhamHSw3.js +0 -4
- package/dist/ionic/p-BufXJ_A8.js +0 -4
- package/dist/ionic/p-C73UOs4m.js +0 -4
- package/dist/ionic/p-CUSwMljM.js +0 -4
- package/dist/ionic/p-CeOSrSdu.js +0 -4
- package/dist/ionic/p-CfkB7_FV.js +0 -4
- package/dist/ionic/p-CmKf4pgI.js +0 -4
- package/dist/ionic/p-CnM-CMw7.js +0 -4
- package/dist/ionic/p-D1CQtpUN.js +0 -5
- package/dist/ionic/p-D5t_-oMk.js +0 -4
- package/dist/ionic/p-DVYb1IVZ.js +0 -4
- package/dist/ionic/p-DWCzVL3Y.js +0 -4
- package/dist/ionic/p-DfJ-SVJf.js +0 -4
- package/dist/ionic/p-DmXrLsoD.js +0 -4
- package/dist/ionic/p-DtLHAMFW.js +0 -4
- package/dist/ionic/p-Dtlob2JL.js +0 -4
- package/dist/ionic/p-F7ipfyOA.js +0 -4
- package/dist/ionic/p-IaXd5VMv.js +0 -4
- package/dist/ionic/p-T71k3C35.js +0 -4
- package/dist/ionic/p-TXPDHL13.js +0 -4
- package/dist/ionic/p-acbb97c3.entry.js +0 -4
- package/dist/ionic/p-aeb85531.entry.js +0 -4
- package/dist/ionic/p-b157f80d.entry.js +0 -4
- package/dist/ionic/p-b158de5d.entry.js +0 -4
- package/dist/ionic/p-b852101e.entry.js +0 -4
- package/dist/ionic/p-byZM6qHV.js +0 -4
- package/dist/ionic/p-c0d81bee.entry.js +0 -4
- package/dist/ionic/p-c8a327fb.entry.js +0 -4
- package/dist/ionic/p-d42ae99f.entry.js +0 -4
- package/dist/ionic/p-d47ff529.entry.js +0 -4
- package/dist/ionic/p-eHi73fGE.js +0 -4
- package/dist/ionic/p-eeabce92.entry.js +0 -4
- package/dist/ionic/p-efc66d77.entry.js +0 -4
- package/dist/ionic/p-f6d203dc.entry.js +0 -4
- package/dist/ionic/p-u2a770LZ.js +0 -4
- package/dist/types/utils/overlay-control-label.d.ts +0 -32
- package/dist/types/utils/select-option-render.d.ts +0 -53
- /package/components/{p-LpMHEu3v.js → p-CO7fmmxt.js} +0 -0
|
@@ -2,17 +2,14 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { Build, Host, h, forceUpdate } from "@stencil/core";
|
|
5
|
-
import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
|
|
6
5
|
import { compareOptions, createNotchController, isOptionSelected, checkInvalidState } from "../../utils/forms/index";
|
|
7
6
|
import { focusVisibleElement, renderHiddenInput, inheritAttributes } from "../../utils/helpers";
|
|
8
7
|
import { printIonWarning } from "../../utils/logging/index";
|
|
9
8
|
import { actionSheetController, alertController, popoverController, modalController } from "../../utils/overlays";
|
|
10
9
|
import { isRTL } from "../../utils/rtl/index";
|
|
11
|
-
import { reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
|
|
12
10
|
import { createColorClasses, hostContext } from "../../utils/theme";
|
|
13
11
|
import { watchForOptions } from "../../utils/watch-options";
|
|
14
12
|
import { caretDownSharp, chevronExpand } from "ionicons/icons";
|
|
15
|
-
import { config } from "../../global/config";
|
|
16
13
|
import { getIonMode } from "../../global/ionic-global";
|
|
17
14
|
// TODO(FW-2832): types
|
|
18
15
|
/**
|
|
@@ -35,225 +32,139 @@ import { getIonMode } from "../../global/ionic-global";
|
|
|
35
32
|
* @part inner - The inner element of the wrapper that manages the slots, selected values or placeholder, and toggle icons.
|
|
36
33
|
*/
|
|
37
34
|
export class Select {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
* The text to display instead of the selected option's value.
|
|
165
|
-
*/
|
|
166
|
-
selectedText;
|
|
167
|
-
/**
|
|
168
|
-
* The toggle icon to use. Defaults to `chevronExpand` for `ios` mode,
|
|
169
|
-
* or `caretDownSharp` for `md` mode.
|
|
170
|
-
*/
|
|
171
|
-
toggleIcon;
|
|
172
|
-
/**
|
|
173
|
-
* The toggle icon to show when the select is open. If defined, the icon
|
|
174
|
-
* rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon`
|
|
175
|
-
* will be used for when the select is both open and closed.
|
|
176
|
-
*/
|
|
177
|
-
expandedIcon;
|
|
178
|
-
/**
|
|
179
|
-
* The shape of the select. If "round" it will have an increased border radius.
|
|
180
|
-
*/
|
|
181
|
-
shape;
|
|
182
|
-
/**
|
|
183
|
-
* The value of the select.
|
|
184
|
-
*/
|
|
185
|
-
value;
|
|
186
|
-
/**
|
|
187
|
-
* If true, screen readers will announce it as a required field. This property
|
|
188
|
-
* works only for accessibility purposes, it will not prevent the form from
|
|
189
|
-
* submitting if the value is invalid.
|
|
190
|
-
*/
|
|
191
|
-
required = false;
|
|
192
|
-
/**
|
|
193
|
-
* Emitted when the value has changed.
|
|
194
|
-
*
|
|
195
|
-
* This event will not emit when programmatically setting the `value` property.
|
|
196
|
-
*/
|
|
197
|
-
ionChange;
|
|
198
|
-
/**
|
|
199
|
-
* Emitted when the selection is cancelled.
|
|
200
|
-
*/
|
|
201
|
-
ionCancel;
|
|
202
|
-
/**
|
|
203
|
-
* Emitted when the overlay is dismissed.
|
|
204
|
-
*/
|
|
205
|
-
ionDismiss;
|
|
206
|
-
/**
|
|
207
|
-
* Emitted when the select has focus.
|
|
208
|
-
*/
|
|
209
|
-
ionFocus;
|
|
210
|
-
/**
|
|
211
|
-
* Emitted when the select loses focus.
|
|
212
|
-
*/
|
|
213
|
-
ionBlur;
|
|
214
|
-
/**
|
|
215
|
-
* Emitted when the styles change.
|
|
216
|
-
* @internal
|
|
217
|
-
*/
|
|
218
|
-
ionStyle;
|
|
35
|
+
constructor() {
|
|
36
|
+
this.inputId = `ion-sel-${selectIds++}`;
|
|
37
|
+
this.helperTextId = `${this.inputId}-helper-text`;
|
|
38
|
+
this.errorTextId = `${this.inputId}-error-text`;
|
|
39
|
+
this.inheritedAttributes = {};
|
|
40
|
+
this.isExpanded = false;
|
|
41
|
+
/**
|
|
42
|
+
* The `hasFocus` state ensures the focus class is
|
|
43
|
+
* added regardless of how the element is focused.
|
|
44
|
+
* The `ion-focused` class only applies when focused
|
|
45
|
+
* via tabbing, not by clicking.
|
|
46
|
+
* The `has-focus` logic was added to ensure the class
|
|
47
|
+
* is applied in both cases.
|
|
48
|
+
*/
|
|
49
|
+
this.hasFocus = false;
|
|
50
|
+
/**
|
|
51
|
+
* Track validation state for proper aria-live announcements.
|
|
52
|
+
*/
|
|
53
|
+
this.isInvalid = false;
|
|
54
|
+
/**
|
|
55
|
+
* The text to display on the cancel button.
|
|
56
|
+
*/
|
|
57
|
+
this.cancelText = 'Cancel';
|
|
58
|
+
/**
|
|
59
|
+
* If `true`, the user cannot interact with the select.
|
|
60
|
+
*/
|
|
61
|
+
this.disabled = false;
|
|
62
|
+
/**
|
|
63
|
+
* The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
|
|
64
|
+
*/
|
|
65
|
+
this.interface = 'alert';
|
|
66
|
+
/**
|
|
67
|
+
* Any additional options that the `alert`, `action-sheet` or `popover` interface
|
|
68
|
+
* can take. See the [ion-alert docs](./alert), the
|
|
69
|
+
* [ion-action-sheet docs](./action-sheet), the
|
|
70
|
+
* [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
|
|
71
|
+
* create options for each interface.
|
|
72
|
+
*
|
|
73
|
+
* Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
|
|
74
|
+
*/
|
|
75
|
+
this.interfaceOptions = {};
|
|
76
|
+
/**
|
|
77
|
+
* Where to place the label relative to the select.
|
|
78
|
+
* `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
|
|
79
|
+
* `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
|
|
80
|
+
* `"floating"`: The label will appear smaller and above the select when the select is focused or it has a value. Otherwise it will appear on top of the select.
|
|
81
|
+
* `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
|
|
82
|
+
* `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
|
|
83
|
+
* When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
|
|
84
|
+
*/
|
|
85
|
+
this.labelPlacement = 'start';
|
|
86
|
+
/**
|
|
87
|
+
* If `true`, the select can accept multiple values.
|
|
88
|
+
*/
|
|
89
|
+
this.multiple = false;
|
|
90
|
+
/**
|
|
91
|
+
* The name of the control, which is submitted with the form data.
|
|
92
|
+
*/
|
|
93
|
+
this.name = this.inputId;
|
|
94
|
+
/**
|
|
95
|
+
* The text to display on the ok button.
|
|
96
|
+
*/
|
|
97
|
+
this.okText = 'OK';
|
|
98
|
+
/**
|
|
99
|
+
* If true, screen readers will announce it as a required field. This property
|
|
100
|
+
* works only for accessibility purposes, it will not prevent the form from
|
|
101
|
+
* submitting if the value is invalid.
|
|
102
|
+
*/
|
|
103
|
+
this.required = false;
|
|
104
|
+
this.onClick = (ev) => {
|
|
105
|
+
const target = ev.target;
|
|
106
|
+
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
107
|
+
if (target === this.el || closestSlot === null) {
|
|
108
|
+
this.setFocus();
|
|
109
|
+
this.open(ev);
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
/**
|
|
113
|
+
* Prevent clicks to the start/end slots from opening the select.
|
|
114
|
+
* We ensure the target isn't this element in case the select is slotted
|
|
115
|
+
* in, for example, an item. This would prevent the select from ever
|
|
116
|
+
* being opened since the element itself has slot="start"/"end".
|
|
117
|
+
*
|
|
118
|
+
* Clicking a slotted element also causes a click
|
|
119
|
+
* on the <label> element (since it wraps the slots).
|
|
120
|
+
* Clicking <label> dispatches another click event on
|
|
121
|
+
* the native form control that then bubbles up to this
|
|
122
|
+
* listener. This additional event targets the host
|
|
123
|
+
* element, so the select overlay is opened.
|
|
124
|
+
*
|
|
125
|
+
* When the slotted elements are clicked (and therefore
|
|
126
|
+
* the ancestor <label> element) we want to prevent the label
|
|
127
|
+
* from dispatching another click event.
|
|
128
|
+
*
|
|
129
|
+
* Do not call stopPropagation() because this will cause
|
|
130
|
+
* click handlers on the slotted elements to never fire in React.
|
|
131
|
+
* When developers do onClick in React a native "click" listener
|
|
132
|
+
* is added on the root element, not the slotted element. When that
|
|
133
|
+
* native click listener fires, React then dispatches the synthetic
|
|
134
|
+
* click event on the slotted element. However, if stopPropagation
|
|
135
|
+
* is called then the native click event will never bubble up
|
|
136
|
+
* to the root element.
|
|
137
|
+
*/
|
|
138
|
+
ev.preventDefault();
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
this.onFocus = () => {
|
|
142
|
+
this.hasFocus = true;
|
|
143
|
+
this.ionFocus.emit();
|
|
144
|
+
};
|
|
145
|
+
this.onBlur = () => {
|
|
146
|
+
this.hasFocus = false;
|
|
147
|
+
this.ionBlur.emit();
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Stops propagation when the label is clicked,
|
|
151
|
+
* otherwise, two clicks will be triggered.
|
|
152
|
+
*/
|
|
153
|
+
this.onLabelClick = (ev) => {
|
|
154
|
+
// Only stop propagation if the click was directly on the label
|
|
155
|
+
// and not on the input or other child elements
|
|
156
|
+
if (ev.target === ev.currentTarget) {
|
|
157
|
+
ev.stopPropagation();
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
}
|
|
219
161
|
styleChanged() {
|
|
220
162
|
this.emitStyle();
|
|
221
163
|
}
|
|
222
164
|
setValue(value) {
|
|
223
|
-
if (this.isValueEqual(this.value, value)) {
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
165
|
this.value = value;
|
|
227
166
|
this.ionChange.emit({ value });
|
|
228
167
|
}
|
|
229
|
-
isValueEqual(currentValue, newValue) {
|
|
230
|
-
if (this.multiple) {
|
|
231
|
-
const currentArr = Array.isArray(currentValue) ? currentValue : [];
|
|
232
|
-
const newArr = Array.isArray(newValue) ? newValue : [];
|
|
233
|
-
if (currentArr.length !== newArr.length) {
|
|
234
|
-
return false;
|
|
235
|
-
}
|
|
236
|
-
// Multiset compare: each new value must match a distinct current value.
|
|
237
|
-
// A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
|
|
238
|
-
// ['a','b'] when both 'a' and 'b' map to options whose values overlap.
|
|
239
|
-
const remaining = currentArr.slice();
|
|
240
|
-
return newArr.every((val) => {
|
|
241
|
-
const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
|
|
242
|
-
if (idx === -1) {
|
|
243
|
-
return false;
|
|
244
|
-
}
|
|
245
|
-
remaining.splice(idx, 1);
|
|
246
|
-
return true;
|
|
247
|
-
});
|
|
248
|
-
}
|
|
249
|
-
if (currentValue == null && newValue == null) {
|
|
250
|
-
return true;
|
|
251
|
-
}
|
|
252
|
-
if (currentValue == null || newValue == null) {
|
|
253
|
-
return false;
|
|
254
|
-
}
|
|
255
|
-
return compareOptions(currentValue, newValue, this.compareWith);
|
|
256
|
-
}
|
|
257
168
|
async connectedCallback() {
|
|
258
169
|
const { el } = this;
|
|
259
170
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
@@ -488,11 +399,10 @@ export class Select {
|
|
|
488
399
|
.join(' ');
|
|
489
400
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
490
401
|
const isSelected = isOptionSelected(selectValue, value, this.compareWith);
|
|
491
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
492
402
|
return {
|
|
493
|
-
|
|
403
|
+
role: isSelected ? 'selected' : '',
|
|
404
|
+
text: option.textContent,
|
|
494
405
|
cssClass: optClass,
|
|
495
|
-
disabled: option.disabled,
|
|
496
406
|
handler: () => {
|
|
497
407
|
this.setValue(value);
|
|
498
408
|
},
|
|
@@ -500,9 +410,6 @@ export class Select {
|
|
|
500
410
|
'aria-checked': isSelected ? 'true' : 'false',
|
|
501
411
|
role: 'radio',
|
|
502
412
|
},
|
|
503
|
-
startContent,
|
|
504
|
-
endContent,
|
|
505
|
-
description: option.description,
|
|
506
413
|
};
|
|
507
414
|
});
|
|
508
415
|
// Add "cancel" button
|
|
@@ -523,19 +430,13 @@ export class Select {
|
|
|
523
430
|
.filter((cls) => cls !== 'hydrated')
|
|
524
431
|
.join(' ');
|
|
525
432
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
526
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
527
433
|
return {
|
|
528
434
|
type: inputType,
|
|
529
435
|
cssClass: optClass,
|
|
530
|
-
label:
|
|
436
|
+
label: option.textContent || '',
|
|
531
437
|
value,
|
|
532
438
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
533
439
|
disabled: option.disabled,
|
|
534
|
-
startContent,
|
|
535
|
-
endContent,
|
|
536
|
-
description: option.description,
|
|
537
|
-
labelPlacement: option.labelPlacement,
|
|
538
|
-
justify: option.justify,
|
|
539
440
|
};
|
|
540
441
|
});
|
|
541
442
|
return alertInputs;
|
|
@@ -548,9 +449,8 @@ export class Select {
|
|
|
548
449
|
.filter((cls) => cls !== 'hydrated')
|
|
549
450
|
.join(' ');
|
|
550
451
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
551
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
552
452
|
return {
|
|
553
|
-
text:
|
|
453
|
+
text: option.textContent || '',
|
|
554
454
|
cssClass: optClass,
|
|
555
455
|
value,
|
|
556
456
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
@@ -561,11 +461,6 @@ export class Select {
|
|
|
561
461
|
this.close();
|
|
562
462
|
}
|
|
563
463
|
},
|
|
564
|
-
startContent,
|
|
565
|
-
endContent,
|
|
566
|
-
description: option.description,
|
|
567
|
-
labelPlacement: option.labelPlacement,
|
|
568
|
-
justify: option.justify,
|
|
569
464
|
};
|
|
570
465
|
});
|
|
571
466
|
return popoverOptions;
|
|
@@ -594,43 +489,28 @@ export class Select {
|
|
|
594
489
|
*/
|
|
595
490
|
}
|
|
596
491
|
else {
|
|
597
|
-
event = {
|
|
598
|
-
...ev,
|
|
599
|
-
detail: {
|
|
492
|
+
event = Object.assign(Object.assign({}, ev), { detail: {
|
|
600
493
|
ionShadowTarget: this.nativeWrapperEl,
|
|
601
|
-
}
|
|
602
|
-
};
|
|
494
|
+
} });
|
|
603
495
|
}
|
|
604
|
-
const
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
mode,
|
|
608
|
-
event,
|
|
609
|
-
alignment: 'center',
|
|
610
|
-
size,
|
|
611
|
-
showBackdrop,
|
|
612
|
-
...interfaceOptions,
|
|
613
|
-
component: 'ion-select-popover',
|
|
614
|
-
cssClass: [
|
|
615
|
-
'select-popover',
|
|
616
|
-
hasRichContent ? 'select-popover-rich-content' : undefined,
|
|
617
|
-
interfaceOptions.cssClass,
|
|
618
|
-
],
|
|
619
|
-
componentProps: {
|
|
496
|
+
const popoverOpts = Object.assign(Object.assign({ mode,
|
|
497
|
+
event, alignment: 'center', size,
|
|
498
|
+
showBackdrop }, interfaceOptions), { component: 'ion-select-popover', cssClass: ['select-popover', interfaceOptions.cssClass], componentProps: {
|
|
620
499
|
header: interfaceOptions.header,
|
|
621
500
|
subHeader: interfaceOptions.subHeader,
|
|
622
501
|
message: interfaceOptions.message,
|
|
623
502
|
multiple,
|
|
624
503
|
value,
|
|
625
|
-
options,
|
|
626
|
-
}
|
|
627
|
-
};
|
|
504
|
+
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
505
|
+
} });
|
|
628
506
|
/**
|
|
629
507
|
* Workaround for Stencil to autodefine
|
|
630
508
|
* ion-select-popover and ion-popover when
|
|
631
509
|
* using Custom Elements build.
|
|
632
510
|
*/
|
|
511
|
+
// eslint-disable-next-line
|
|
633
512
|
if (false) {
|
|
513
|
+
// eslint-disable-next-line
|
|
634
514
|
// @ts-ignore
|
|
635
515
|
document.createElement('ion-select-popover');
|
|
636
516
|
document.createElement('ion-popover');
|
|
@@ -640,18 +520,15 @@ export class Select {
|
|
|
640
520
|
async openActionSheet() {
|
|
641
521
|
const mode = getIonMode(this);
|
|
642
522
|
const interfaceOptions = this.interfaceOptions;
|
|
643
|
-
const actionSheetOpts = {
|
|
644
|
-
mode,
|
|
645
|
-
...interfaceOptions,
|
|
646
|
-
buttons: this.createActionSheetButtons(this.childOpts, this.value),
|
|
647
|
-
cssClass: ['select-action-sheet', interfaceOptions.cssClass],
|
|
648
|
-
};
|
|
523
|
+
const actionSheetOpts = Object.assign(Object.assign({ mode }, interfaceOptions), { buttons: this.createActionSheetButtons(this.childOpts, this.value), cssClass: ['select-action-sheet', interfaceOptions.cssClass] });
|
|
649
524
|
/**
|
|
650
525
|
* Workaround for Stencil to autodefine
|
|
651
526
|
* ion-action-sheet when
|
|
652
527
|
* using Custom Elements build.
|
|
653
528
|
*/
|
|
529
|
+
// eslint-disable-next-line
|
|
654
530
|
if (false) {
|
|
531
|
+
// eslint-disable-next-line
|
|
655
532
|
// @ts-ignore
|
|
656
533
|
document.createElement('ion-action-sheet');
|
|
657
534
|
}
|
|
@@ -661,12 +538,7 @@ export class Select {
|
|
|
661
538
|
const interfaceOptions = this.interfaceOptions;
|
|
662
539
|
const inputType = this.multiple ? 'checkbox' : 'radio';
|
|
663
540
|
const mode = getIonMode(this);
|
|
664
|
-
const alertOpts = {
|
|
665
|
-
mode,
|
|
666
|
-
...interfaceOptions,
|
|
667
|
-
header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
|
|
668
|
-
inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
|
|
669
|
-
buttons: [
|
|
541
|
+
const alertOpts = Object.assign(Object.assign({ mode }, interfaceOptions), { header: interfaceOptions.header ? interfaceOptions.header : this.labelText, inputs: this.createAlertInputs(this.childOpts, inputType, this.value), buttons: [
|
|
670
542
|
{
|
|
671
543
|
text: this.cancelText,
|
|
672
544
|
role: 'cancel',
|
|
@@ -680,19 +552,19 @@ export class Select {
|
|
|
680
552
|
this.setValue(selectedValues);
|
|
681
553
|
},
|
|
682
554
|
},
|
|
683
|
-
],
|
|
684
|
-
cssClass: [
|
|
555
|
+
], cssClass: [
|
|
685
556
|
'select-alert',
|
|
686
557
|
interfaceOptions.cssClass,
|
|
687
558
|
this.multiple ? 'multiple-select-alert' : 'single-select-alert',
|
|
688
|
-
]
|
|
689
|
-
};
|
|
559
|
+
] });
|
|
690
560
|
/**
|
|
691
561
|
* Workaround for Stencil to autodefine
|
|
692
562
|
* ion-alert when
|
|
693
563
|
* using Custom Elements build.
|
|
694
564
|
*/
|
|
565
|
+
// eslint-disable-next-line
|
|
695
566
|
if (false) {
|
|
567
|
+
// eslint-disable-next-line
|
|
696
568
|
// @ts-ignore
|
|
697
569
|
document.createElement('ion-alert');
|
|
698
570
|
}
|
|
@@ -701,25 +573,21 @@ export class Select {
|
|
|
701
573
|
openModal() {
|
|
702
574
|
const { multiple, value, interfaceOptions } = this;
|
|
703
575
|
const mode = getIonMode(this);
|
|
704
|
-
const modalOpts = {
|
|
705
|
-
...interfaceOptions,
|
|
706
|
-
mode,
|
|
707
|
-
cssClass: ['select-modal', interfaceOptions.cssClass],
|
|
708
|
-
component: 'ion-select-modal',
|
|
709
|
-
componentProps: {
|
|
576
|
+
const modalOpts = Object.assign(Object.assign({}, interfaceOptions), { mode, cssClass: ['select-modal', interfaceOptions.cssClass], component: 'ion-select-modal', componentProps: {
|
|
710
577
|
header: interfaceOptions.header,
|
|
711
578
|
cancelText: this.cancelText,
|
|
712
579
|
multiple,
|
|
713
580
|
value,
|
|
714
581
|
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
715
|
-
}
|
|
716
|
-
};
|
|
582
|
+
} });
|
|
717
583
|
/**
|
|
718
584
|
* Workaround for Stencil to autodefine
|
|
719
585
|
* ion-select-modal and ion-modal when
|
|
720
586
|
* using Custom Elements build.
|
|
721
587
|
*/
|
|
588
|
+
// eslint-disable-next-line
|
|
722
589
|
if (false) {
|
|
590
|
+
// eslint-disable-next-line
|
|
723
591
|
// @ts-ignore
|
|
724
592
|
document.createElement('ion-select-modal');
|
|
725
593
|
document.createElement('ion-modal');
|
|
@@ -760,18 +628,12 @@ export class Select {
|
|
|
760
628
|
}
|
|
761
629
|
return;
|
|
762
630
|
}
|
|
763
|
-
|
|
764
|
-
* Returns the text to display in the select based on the selected value.
|
|
765
|
-
*
|
|
766
|
-
* @param useHTML If `true`, the returned text will include any custom HTML content from the selected option. If `false`, the returned text will be plain text without any HTML. Defaults to `false`.
|
|
767
|
-
* @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
|
|
768
|
-
*/
|
|
769
|
-
getText(useHTML = false) {
|
|
631
|
+
getText() {
|
|
770
632
|
const selectedText = this.selectedText;
|
|
771
633
|
if (selectedText != null && selectedText !== '') {
|
|
772
634
|
return selectedText;
|
|
773
635
|
}
|
|
774
|
-
return generateText(this.childOpts, this.value, this.compareWith
|
|
636
|
+
return generateText(this.childOpts, this.value, this.compareWith);
|
|
775
637
|
}
|
|
776
638
|
setFocus() {
|
|
777
639
|
if (this.focusEl) {
|
|
@@ -785,51 +647,6 @@ export class Select {
|
|
|
785
647
|
};
|
|
786
648
|
this.ionStyle.emit(style);
|
|
787
649
|
}
|
|
788
|
-
onClick = (ev) => {
|
|
789
|
-
const target = ev.target;
|
|
790
|
-
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
791
|
-
if (target === this.el || closestSlot === null) {
|
|
792
|
-
this.setFocus();
|
|
793
|
-
this.open(ev);
|
|
794
|
-
}
|
|
795
|
-
else {
|
|
796
|
-
/**
|
|
797
|
-
* Prevent clicks to the start/end slots from opening the select.
|
|
798
|
-
* We ensure the target isn't this element in case the select is slotted
|
|
799
|
-
* in, for example, an item. This would prevent the select from ever
|
|
800
|
-
* being opened since the element itself has slot="start"/"end".
|
|
801
|
-
*
|
|
802
|
-
* Clicking a slotted element also causes a click
|
|
803
|
-
* on the <label> element (since it wraps the slots).
|
|
804
|
-
* Clicking <label> dispatches another click event on
|
|
805
|
-
* the native form control that then bubbles up to this
|
|
806
|
-
* listener. This additional event targets the host
|
|
807
|
-
* element, so the select overlay is opened.
|
|
808
|
-
*
|
|
809
|
-
* When the slotted elements are clicked (and therefore
|
|
810
|
-
* the ancestor <label> element) we want to prevent the label
|
|
811
|
-
* from dispatching another click event.
|
|
812
|
-
*
|
|
813
|
-
* Do not call stopPropagation() because this will cause
|
|
814
|
-
* click handlers on the slotted elements to never fire in React.
|
|
815
|
-
* When developers do onClick in React a native "click" listener
|
|
816
|
-
* is added on the root element, not the slotted element. When that
|
|
817
|
-
* native click listener fires, React then dispatches the synthetic
|
|
818
|
-
* click event on the slotted element. However, if stopPropagation
|
|
819
|
-
* is called then the native click event will never bubble up
|
|
820
|
-
* to the root element.
|
|
821
|
-
*/
|
|
822
|
-
ev.preventDefault();
|
|
823
|
-
}
|
|
824
|
-
};
|
|
825
|
-
onFocus = () => {
|
|
826
|
-
this.hasFocus = true;
|
|
827
|
-
this.ionFocus.emit();
|
|
828
|
-
};
|
|
829
|
-
onBlur = () => {
|
|
830
|
-
this.hasFocus = false;
|
|
831
|
-
this.ionBlur.emit();
|
|
832
|
-
};
|
|
833
650
|
renderLabel() {
|
|
834
651
|
const { label } = this;
|
|
835
652
|
return (h("div", { class: {
|
|
@@ -838,7 +655,8 @@ export class Select {
|
|
|
838
655
|
}, part: "label" }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
839
656
|
}
|
|
840
657
|
componentDidRender() {
|
|
841
|
-
|
|
658
|
+
var _a;
|
|
659
|
+
(_a = this.notchController) === null || _a === void 0 ? void 0 : _a.calculateNotchWidth();
|
|
842
660
|
}
|
|
843
661
|
/**
|
|
844
662
|
* Gets any content passed into the `label` slot,
|
|
@@ -856,17 +674,6 @@ export class Select {
|
|
|
856
674
|
get hasLabel() {
|
|
857
675
|
return this.label !== undefined || this.labelSlot !== null;
|
|
858
676
|
}
|
|
859
|
-
/**
|
|
860
|
-
* Stops propagation when the label is clicked,
|
|
861
|
-
* otherwise, two clicks will be triggered.
|
|
862
|
-
*/
|
|
863
|
-
onLabelClick = (ev) => {
|
|
864
|
-
// Only stop propagation if the click was directly on the label
|
|
865
|
-
// and not on the input or other child elements
|
|
866
|
-
if (ev.target === ev.currentTarget) {
|
|
867
|
-
ev.stopPropagation();
|
|
868
|
-
}
|
|
869
|
-
};
|
|
870
677
|
/**
|
|
871
678
|
* Renders the border container
|
|
872
679
|
* when fill="outline".
|
|
@@ -896,46 +703,6 @@ export class Select {
|
|
|
896
703
|
*/
|
|
897
704
|
return this.renderLabel();
|
|
898
705
|
}
|
|
899
|
-
/**
|
|
900
|
-
* Wraps text nodes in the select text with span elements
|
|
901
|
-
* so spacing can be added between elements without
|
|
902
|
-
* changing the display to prevent losing the ellipses
|
|
903
|
-
* behavior.
|
|
904
|
-
*
|
|
905
|
-
* Only wraps when the string contains HTML elements
|
|
906
|
-
* alongside text.
|
|
907
|
-
*/
|
|
908
|
-
wrapSelectTextNodes(html) {
|
|
909
|
-
const temp = document.createElement('div');
|
|
910
|
-
temp.innerHTML = html;
|
|
911
|
-
const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
|
|
912
|
-
// Return the plain text
|
|
913
|
-
if (!hasElements) {
|
|
914
|
-
return html;
|
|
915
|
-
}
|
|
916
|
-
Array.from(temp.childNodes).forEach((node) => {
|
|
917
|
-
if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
|
|
918
|
-
const text = node.textContent;
|
|
919
|
-
/**
|
|
920
|
-
* Split comma separator from the text content
|
|
921
|
-
* e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
|
|
922
|
-
*/
|
|
923
|
-
const commaMatch = text.match(/^(,\s*)(.*)/);
|
|
924
|
-
if (commaMatch) {
|
|
925
|
-
const commaNode = document.createTextNode(commaMatch[1]);
|
|
926
|
-
const wrapper = document.createElement('span');
|
|
927
|
-
wrapper.textContent = commaMatch[2];
|
|
928
|
-
node.parentNode?.replaceChild(wrapper, node);
|
|
929
|
-
wrapper.parentNode?.insertBefore(commaNode, wrapper);
|
|
930
|
-
return;
|
|
931
|
-
}
|
|
932
|
-
const wrapper = document.createElement('span');
|
|
933
|
-
node.parentNode?.replaceChild(wrapper, node);
|
|
934
|
-
wrapper.appendChild(node);
|
|
935
|
-
}
|
|
936
|
-
});
|
|
937
|
-
return temp.innerHTML;
|
|
938
|
-
}
|
|
939
706
|
/**
|
|
940
707
|
* Renders either the placeholder
|
|
941
708
|
* or the selected values based on
|
|
@@ -943,7 +710,7 @@ export class Select {
|
|
|
943
710
|
*/
|
|
944
711
|
renderSelectText() {
|
|
945
712
|
const { placeholder } = this;
|
|
946
|
-
const displayValue = this.getText(
|
|
713
|
+
const displayValue = this.getText();
|
|
947
714
|
let addPlaceholderClass = false;
|
|
948
715
|
let selectText = displayValue;
|
|
949
716
|
if (selectText === '' && placeholder !== undefined) {
|
|
@@ -955,10 +722,6 @@ export class Select {
|
|
|
955
722
|
'select-placeholder': addPlaceholderClass,
|
|
956
723
|
};
|
|
957
724
|
const textPart = addPlaceholderClass ? 'placeholder' : 'text';
|
|
958
|
-
if (this.customHTMLEnabled) {
|
|
959
|
-
const wrapped = this.wrapSelectTextNodes(selectText);
|
|
960
|
-
return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
|
|
961
|
-
}
|
|
962
725
|
return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
|
|
963
726
|
}
|
|
964
727
|
/**
|
|
@@ -974,16 +737,16 @@ export class Select {
|
|
|
974
737
|
}
|
|
975
738
|
else {
|
|
976
739
|
const defaultIcon = mode === 'ios' ? chevronExpand : caretDownSharp;
|
|
977
|
-
icon = toggleIcon
|
|
740
|
+
icon = toggleIcon !== null && toggleIcon !== void 0 ? toggleIcon : defaultIcon;
|
|
978
741
|
}
|
|
979
742
|
return h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
|
|
980
743
|
}
|
|
981
744
|
get ariaLabel() {
|
|
745
|
+
var _a;
|
|
982
746
|
const { placeholder, inheritedAttributes } = this;
|
|
983
|
-
// Get the plain text from the selected text
|
|
984
747
|
const displayValue = this.getText();
|
|
985
748
|
// The aria label should be preferred over visible text if both are specified
|
|
986
|
-
const definedLabel = inheritedAttributes['aria-label']
|
|
749
|
+
const definedLabel = (_a = inheritedAttributes['aria-label']) !== null && _a !== void 0 ? _a : this.labelText;
|
|
987
750
|
/**
|
|
988
751
|
* If developer has specified a placeholder
|
|
989
752
|
* and there is nothing selected, the selectText
|
|
@@ -1075,7 +838,7 @@ export class Select {
|
|
|
1075
838
|
*/
|
|
1076
839
|
const labelShouldFloat = labelPlacement === 'stacked' ||
|
|
1077
840
|
(labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded || hasStartEndSlots));
|
|
1078
|
-
return (h(Host, { key: '
|
|
841
|
+
return (h(Host, { key: 'f16327d6866ffee76e1618fcd3281590ca0fd56d', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
1079
842
|
[mode]: true,
|
|
1080
843
|
'in-item': inItem,
|
|
1081
844
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -1093,7 +856,7 @@ export class Select {
|
|
|
1093
856
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
1094
857
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
1095
858
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
1096
|
-
}) }, h("label", { key: '
|
|
859
|
+
}) }, h("label", { key: 'db13f76b384a7a7461c1ad752108eadf9c0213be', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, this.renderLabelContainer(), h("div", { key: '2fb0e57bd596c0f525be79293b7da4aca55a9385', class: "select-wrapper-inner", part: "inner" }, h("slot", { key: 'cd694c36242789a89461ed3412af9891ad68411b', name: "start" }), h("div", { key: 'fdf62911be54f4ab29eb3c2eb153f082e76a8f49', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: 'a32f5c4b101d4d6ad45870f4c4446960009377f5', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '61f792024a5f221ef4f28a3c249bd3a0de5edeab', class: "select-highlight" })), this.renderBottomContent()));
|
|
1097
860
|
}
|
|
1098
861
|
static get is() { return "ion-select"; }
|
|
1099
862
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1753,219 +1516,25 @@ const parseValue = (value) => {
|
|
|
1753
1516
|
}
|
|
1754
1517
|
return value.toString();
|
|
1755
1518
|
};
|
|
1756
|
-
const generateText = (opts, value, compareWith
|
|
1519
|
+
const generateText = (opts, value, compareWith) => {
|
|
1757
1520
|
if (value === undefined) {
|
|
1758
1521
|
return '';
|
|
1759
1522
|
}
|
|
1760
1523
|
if (Array.isArray(value)) {
|
|
1761
1524
|
return value
|
|
1762
|
-
.map((v) => textForValue(opts, v, compareWith
|
|
1525
|
+
.map((v) => textForValue(opts, v, compareWith))
|
|
1763
1526
|
.filter((opt) => opt !== null)
|
|
1764
1527
|
.join(', ');
|
|
1765
1528
|
}
|
|
1766
1529
|
else {
|
|
1767
|
-
return textForValue(opts, value, compareWith
|
|
1530
|
+
return textForValue(opts, value, compareWith) || '';
|
|
1768
1531
|
}
|
|
1769
1532
|
};
|
|
1770
|
-
|
|
1771
|
-
* Returns the display text for a given value from the list of options.
|
|
1772
|
-
* When `useHTML` is true, returns sanitized HTML for the select text.
|
|
1773
|
-
* When `useHTML` is false, returns plain text for aria-label and other
|
|
1774
|
-
* text-only contexts.
|
|
1775
|
-
*
|
|
1776
|
-
* @param opts - The list of ion-select-option elements.
|
|
1777
|
-
* @param value - The value to find the matching option for.
|
|
1778
|
-
* @param compareWith - Custom comparison function or property name.
|
|
1779
|
-
* @param useHTML - If true, returns HTML string. If false, returns plain text.
|
|
1780
|
-
*/
|
|
1781
|
-
const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
1533
|
+
const textForValue = (opts, value, compareWith) => {
|
|
1782
1534
|
const selectOpt = opts.find((opt) => {
|
|
1783
1535
|
return compareOptions(value, getOptionValue(opt), compareWith);
|
|
1784
1536
|
});
|
|
1785
|
-
|
|
1786
|
-
if (!selectOpt) {
|
|
1787
|
-
return null;
|
|
1788
|
-
}
|
|
1789
|
-
// Return sanitized HTML for the select text
|
|
1790
|
-
if (customHTMLEnabled && useHTML) {
|
|
1791
|
-
return getOptionContent(selectOpt, undefined, true);
|
|
1792
|
-
}
|
|
1793
|
-
/**
|
|
1794
|
-
* When custom HTML is enabled, extract only the default slot content.
|
|
1795
|
-
* This ensures aria-label and other text-only contexts read only
|
|
1796
|
-
* the relevant option text.
|
|
1797
|
-
*/
|
|
1798
|
-
if (customHTMLEnabled) {
|
|
1799
|
-
const content = getOptionContent(selectOpt);
|
|
1800
|
-
if (typeof content === 'string') {
|
|
1801
|
-
return content;
|
|
1802
|
-
}
|
|
1803
|
-
/**
|
|
1804
|
-
* Elements were found in the default slot, extract and concatenate
|
|
1805
|
-
* their text content while trimming whitespace.
|
|
1806
|
-
*/
|
|
1807
|
-
if (content) {
|
|
1808
|
-
const texts = Array.from(content.childNodes)
|
|
1809
|
-
.map((n) => n.textContent?.trim())
|
|
1810
|
-
.filter((t) => t);
|
|
1811
|
-
return texts.join(' ') || null;
|
|
1812
|
-
}
|
|
1813
|
-
// Empty option
|
|
1814
|
-
return null;
|
|
1815
|
-
}
|
|
1816
|
-
return getDefaultSlotPlainText(selectOpt);
|
|
1817
|
-
};
|
|
1818
|
-
/**
|
|
1819
|
-
* Trims whitespace from all text nodes within a DOM tree.
|
|
1820
|
-
* This prevents invisible layout shifts and unwanted gaps between
|
|
1821
|
-
* elements when HTML content is injected via innerHTML or cloneNode,
|
|
1822
|
-
* as browsers preserve whitespace (tabs, newlines, spaces) from
|
|
1823
|
-
* the original source markup.
|
|
1824
|
-
*
|
|
1825
|
-
* @param node The root node to start trimming text nodes from.
|
|
1826
|
-
*/
|
|
1827
|
-
const trimTextNodes = (node) => {
|
|
1828
|
-
node.childNodes.forEach((child) => {
|
|
1829
|
-
if (child.nodeType === Node.TEXT_NODE) {
|
|
1830
|
-
child.textContent = child.textContent?.trim() || '';
|
|
1831
|
-
}
|
|
1832
|
-
else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
1833
|
-
trimTextNodes(child);
|
|
1834
|
-
}
|
|
1835
|
-
});
|
|
1836
|
-
};
|
|
1837
|
-
/**
|
|
1838
|
-
* Extracts and clones content from an `ion-select-option` element
|
|
1839
|
-
* for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
|
|
1840
|
-
*
|
|
1841
|
-
* @param option - The `ion-select-option` element to extract content from.
|
|
1842
|
-
* @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
|
|
1843
|
-
* @param useHTML - If `true`, the returned string will include any custom HTML content. If `false`, the returned string will be plain text without any HTML.
|
|
1844
|
-
* @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
|
|
1845
|
-
* div element containing cloned child nodes. Returns `null` if no matching
|
|
1846
|
-
* content is found.
|
|
1847
|
-
*/
|
|
1848
|
-
const getOptionContent = (option, slotName, useHTML = false) => {
|
|
1849
|
-
let nodes;
|
|
1850
|
-
if (slotName) {
|
|
1851
|
-
// Named slot: get elements with matching slot attribute
|
|
1852
|
-
nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
|
|
1853
|
-
}
|
|
1854
|
-
else {
|
|
1855
|
-
// Default slot: get nodes without a slot attribute
|
|
1856
|
-
const defaultSlot = getOptionDefaultSlot(option) || [];
|
|
1857
|
-
nodes = defaultSlot.filter((node) => {
|
|
1858
|
-
/**
|
|
1859
|
-
* Exclude whitespace-only text nodes (newline noise between
|
|
1860
|
-
* markup elements). Element nodes are always kept, even when
|
|
1861
|
-
* their textContent is empty (e.g. <svg>, <img>).
|
|
1862
|
-
*/
|
|
1863
|
-
if (node.nodeType === Node.TEXT_NODE) {
|
|
1864
|
-
return node.textContent?.trim().length !== 0;
|
|
1865
|
-
}
|
|
1866
|
-
return true;
|
|
1867
|
-
});
|
|
1868
|
-
}
|
|
1869
|
-
if (nodes.length === 0) {
|
|
1870
|
-
return null;
|
|
1871
|
-
}
|
|
1872
|
-
// Return plain text if no elements are found
|
|
1873
|
-
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1874
|
-
return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
|
|
1875
|
-
}
|
|
1876
|
-
/**
|
|
1877
|
-
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
1878
|
-
* onto attributes before cloning. Frameworks like Vue set these as
|
|
1879
|
-
* DOM properties, which `cloneNode` doesn't copy, so without this
|
|
1880
|
-
* step the cloned overlay copy renders without the prop's value.
|
|
1881
|
-
*/
|
|
1882
|
-
nodes.forEach((n) => {
|
|
1883
|
-
if (n.nodeType === Node.ELEMENT_NODE) {
|
|
1884
|
-
reflectPropertiesToAttributes(n);
|
|
1885
|
-
}
|
|
1886
|
-
});
|
|
1887
|
-
// Clone each node into a temporary container
|
|
1888
|
-
const container = document.createElement('div');
|
|
1889
|
-
nodes.forEach((n) => {
|
|
1890
|
-
const clone = n.cloneNode(true);
|
|
1891
|
-
if (clone.nodeType === Node.TEXT_NODE) {
|
|
1892
|
-
clone.textContent = clone.textContent?.trim() || '';
|
|
1893
|
-
}
|
|
1894
|
-
else {
|
|
1895
|
-
trimTextNodes(clone);
|
|
1896
|
-
}
|
|
1897
|
-
container.appendChild(clone);
|
|
1898
|
-
});
|
|
1899
|
-
/**
|
|
1900
|
-
* Sanitize the cloned DOM in place. Trusted attributes (size, color,
|
|
1901
|
-
* shape, etc.) are preserved; event handlers, javascript: URLs, and
|
|
1902
|
-
* blocked tags are stripped.
|
|
1903
|
-
*/
|
|
1904
|
-
sanitizeDOMTree(container);
|
|
1905
|
-
if (useHTML) {
|
|
1906
|
-
return container.innerHTML.trim() || null;
|
|
1907
|
-
}
|
|
1908
|
-
return container;
|
|
1909
|
-
};
|
|
1910
|
-
/**
|
|
1911
|
-
* Returns the child nodes that belong to the default slot of an
|
|
1912
|
-
* option element, excluding any nodes that are assigned to named
|
|
1913
|
-
* slots.
|
|
1914
|
-
*
|
|
1915
|
-
* @param option - The `ion-select-option` element to extract default-slot nodes from.
|
|
1916
|
-
* @returns An array of default slot nodes, or `null` if none are found.
|
|
1917
|
-
*/
|
|
1918
|
-
const getOptionDefaultSlot = (option) => {
|
|
1919
|
-
const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
|
|
1920
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1921
|
-
return !node.hasAttribute('slot');
|
|
1922
|
-
}
|
|
1923
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1924
|
-
});
|
|
1925
|
-
if (defaultSlotNodes.length === 0) {
|
|
1926
|
-
return null;
|
|
1927
|
-
}
|
|
1928
|
-
return defaultSlotNodes;
|
|
1929
|
-
};
|
|
1930
|
-
/**
|
|
1931
|
-
* Extracts plain text from only the default slot of an option,
|
|
1932
|
-
* excluding content assigned to named slots (start/end).
|
|
1933
|
-
*/
|
|
1934
|
-
const getDefaultSlotPlainText = (option) => {
|
|
1935
|
-
const texts = Array.from(option.childNodes)
|
|
1936
|
-
.filter((node) => {
|
|
1937
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1938
|
-
return !node.hasAttribute('slot');
|
|
1939
|
-
}
|
|
1940
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1941
|
-
})
|
|
1942
|
-
.filter((node) => node.nodeType === Node.TEXT_NODE)
|
|
1943
|
-
.map((n) => n.textContent?.trim())
|
|
1944
|
-
.filter((t) => t);
|
|
1945
|
-
return texts.join(' ');
|
|
1946
|
-
};
|
|
1947
|
-
/**
|
|
1948
|
-
* Extracts the rich content from an `ion-select-option`.
|
|
1949
|
-
* When `customHTMLEnabled` is `false`, only the plain text from the
|
|
1950
|
-
* default slot is read and the start and end slots are skipped.
|
|
1951
|
-
*
|
|
1952
|
-
* @param option - The `ion-select-option` element to extract content from.
|
|
1953
|
-
* @param customHTMLEnabled - Whether custom HTML rendering is enabled
|
|
1954
|
-
* via the `innerHTMLTemplatesEnabled` config.
|
|
1955
|
-
*/
|
|
1956
|
-
const extractOptionContent = (option, customHTMLEnabled) => {
|
|
1957
|
-
if (!customHTMLEnabled) {
|
|
1958
|
-
return {
|
|
1959
|
-
content: getDefaultSlotPlainText(option),
|
|
1960
|
-
startContent: undefined,
|
|
1961
|
-
endContent: undefined,
|
|
1962
|
-
};
|
|
1963
|
-
}
|
|
1964
|
-
return {
|
|
1965
|
-
content: getOptionContent(option),
|
|
1966
|
-
startContent: getOptionContent(option, 'start') ?? undefined,
|
|
1967
|
-
endContent: getOptionContent(option, 'end') ?? undefined,
|
|
1968
|
-
};
|
|
1537
|
+
return selectOpt ? selectOpt.textContent : null;
|
|
1969
1538
|
};
|
|
1970
1539
|
let selectIds = 0;
|
|
1971
1540
|
const OPTION_CLASS = 'select-interface-option';
|