@ionic/core 8.8.19-dev.11787007863.1976a30e → 8.8.19-dev.11787083540.1511caf2
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-DV85C0e0.js → p--JUspHvy.js} +1 -1
- package/components/p-0LM2oPMC.js +4 -0
- package/components/{p-_0JhwClE.js → p-6J0vc7Z8.js} +1 -1
- package/components/p-9GFIh9p1.js +4 -0
- package/components/p-B21528L5.js +4 -0
- package/components/p-B2nSfLHH.js +4 -0
- package/components/p-B3qf4bEn.js +4 -0
- package/components/p-B9jFTlwE.js +4 -0
- package/components/p-BDd9Zrb9.js +4 -0
- package/components/p-BLmJ0zRm.js +4 -0
- package/components/p-BMYNBJgf.js +4 -0
- package/components/p-BRYd8D-I.js +4 -0
- package/components/p-BSEgsdFI.js +4 -0
- package/components/p-BTEOs1at.js +4 -0
- package/components/p-BTJrYwxN.js +4 -0
- package/components/p-BV-zKay-.js +4 -0
- package/components/p-BYRVyMu9.js +4 -0
- package/components/{p-DwpKZ6rl.js → p-BkKAANMJ.js} +1 -1
- package/components/p-Bmq8qlkW.js +4 -0
- package/components/p-BuxQcfHK.js +4 -0
- package/components/p-Bz0dSlXZ.js +4 -0
- package/components/p-C7II1iDj.js +4 -0
- package/components/p-CHqRYvYm.js +4 -0
- package/components/p-CSZf8_j0.js +4 -0
- package/components/p-CTdRooFV.js +4 -0
- package/components/p-Cf2jSDS8.js +4 -0
- package/components/p-Cfx4M1Bn.js +4 -0
- package/components/p-CgkrslTX.js +4 -0
- package/components/p-CiCzYG2V.js +4 -0
- package/{dist/ionic/p-BkfAWuv6.js → components/p-Ck0lEczL.js} +1 -1
- package/components/p-CmR5uXej.js +4 -0
- package/components/p-CniZht3v.js +4 -0
- package/components/p-CsaojgEs.js +4 -0
- package/components/p-CtWGkNnJ.js +4 -0
- package/components/p-D13Eaw-8.js +4 -0
- package/components/p-D4FYu-4R.js +4 -0
- package/components/p-D6Ynv7Xh.js +4 -0
- package/components/p-DARjq3GM.js +4 -0
- package/components/p-DEZ2myA3.js +4 -0
- package/components/p-DOFCbuQR.js +4 -0
- package/components/p-DVe41iHI.js +4 -0
- package/components/p-DX5m9g56.js +4 -0
- package/components/p-DboHi2CL.js +4 -0
- package/components/p-DiVJyqlX.js +4 -0
- package/components/p-DmzFY5IC.js +4 -0
- package/components/{p-ryyf_ItD.js → p-DqLB8yFQ.js} +1 -1
- package/components/p-DqZAXv2t.js +4 -0
- package/components/p-Dv8w0kqz.js +4 -0
- package/components/p-Dw7GNDKq.js +4 -0
- package/components/p-Dww01PNs.js +4 -0
- package/components/p-Gy276IJk.js +4 -0
- package/components/p-ZzLXTvyt.js +4 -0
- package/components/p-cyNmxje6.js +4 -0
- package/components/p-j5IxBIan.js +4 -0
- package/components/p-k_E4tX5Z.js +4 -0
- package/components/p-lVAbdiAu.js +4 -0
- package/components/p-o8OKV5aD.js +4 -0
- package/components/{p-30_sZS2V.js → p-qMmFisyx.js} +1 -1
- package/components/p-rCa2eL0j.js +4 -0
- package/dist/cjs/{animation-C0mOHzej.js → animation-Ch16T-Nb.js} +4 -4
- package/dist/cjs/{app-globals-BREG4twP.js → app-globals-Dd89e0MR.js} +1 -1
- package/dist/cjs/{button-active-BKj1rdFx.js → button-active-AWp_ygDP.js} +3 -3
- package/dist/cjs/config-D6C-KlA9.js +201 -0
- package/dist/cjs/dir-DD0jPVH3.js +31 -0
- package/dist/cjs/{format-pp0Du3K-.js → format-BUFWn4Bn.js} +30 -40
- package/dist/cjs/{framework-delegate-NTLQ5YzV.js → framework-delegate-CEzl4MEA.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-fqpYh-kd.js → hardware-back-button-CXmUnTJC.js} +4 -4
- package/dist/cjs/{helpers-CaLhEmTE.js → helpers-DdZyl6WL.js} +15 -11
- package/dist/cjs/{index-P1nQxrpZ.js → index-BJ2-LydH.js} +7 -36
- package/dist/cjs/{index-uvry__L4.js → index-BfaXsATC.js} +14 -31
- package/dist/cjs/{index-D48vawBq.js → index-CD92bI7B.js} +2 -2
- package/dist/cjs/{index-Ck9advCT.js → index-CukZnH1U.js} +5 -5
- package/dist/cjs/{index-D2X6b92x.js → index-DOiZqxWZ.js} +7 -6
- package/dist/cjs/{index-wOmugbdg.js → index-DqmRDbxg.js} +1 -1
- package/dist/cjs/{index-BlshL9ib.js → index-MWAIyVLl.js} +3 -2
- package/dist/cjs/index.cjs.js +19 -18
- package/dist/cjs/{input-shims-DvHAFqiP.js → input-shims-CPKgrIe3.js} +12 -9
- package/dist/cjs/input.utils-DQaUGGed.js +150 -0
- package/dist/cjs/ion-accordion_2.cjs.entry.js +341 -368
- package/dist/cjs/ion-action-sheet.cjs.entry.js +77 -187
- package/dist/cjs/ion-alert.cjs.entry.js +112 -273
- package/dist/cjs/ion-app_8.cjs.entry.js +190 -307
- package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -10
- package/dist/cjs/ion-back-button.cjs.entry.js +24 -47
- package/dist/cjs/ion-backdrop.cjs.entry.js +14 -18
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +122 -199
- package/dist/cjs/ion-button_2.cjs.entry.js +67 -138
- package/dist/cjs/ion-card_5.cjs.entry.js +31 -82
- package/dist/cjs/ion-checkbox.cjs.entry.js +102 -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 +242 -253
- package/dist/cjs/ion-datetime_3.cjs.entry.js +3167 -0
- package/dist/cjs/ion-fab_3.cjs.entry.js +82 -139
- package/dist/cjs/ion-img.cjs.entry.js +13 -34
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +73 -100
- package/dist/cjs/ion-input-otp.cjs.entry.js +372 -435
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +22 -36
- package/dist/cjs/ion-input.cjs.entry.js +212 -343
- package/dist/cjs/ion-item-option_3.cjs.entry.js +55 -94
- package/dist/cjs/ion-item_8.cjs.entry.js +93 -191
- package/dist/cjs/ion-loading.cjs.entry.js +61 -146
- package/dist/cjs/ion-menu_3.cjs.entry.js +109 -170
- package/dist/cjs/ion-modal.cjs.entry.js +262 -455
- package/dist/cjs/ion-nav_2.cjs.entry.js +159 -101
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +34 -37
- package/dist/cjs/ion-picker-column.cjs.entry.js +406 -417
- package/dist/cjs/ion-picker.cjs.entry.js +393 -401
- package/dist/cjs/ion-popover.cjs.entry.js +206 -319
- package/dist/cjs/ion-progress-bar.cjs.entry.js +26 -31
- package/dist/cjs/ion-radio_2.cjs.entry.js +135 -207
- package/dist/cjs/ion-range.cjs.entry.js +237 -302
- package/dist/cjs/ion-refresher_2.cjs.entry.js +94 -165
- package/dist/cjs/ion-reorder_2.cjs.entry.js +24 -53
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +14 -14
- package/dist/cjs/ion-route_4.cjs.entry.js +72 -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 +49 -104
- package/dist/cjs/ion-select_3.cjs.entry.js +260 -787
- 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 +42 -100
- package/dist/cjs/ion-tab_2.cjs.entry.js +28 -53
- package/dist/cjs/ion-text.cjs.entry.js +5 -11
- package/dist/cjs/ion-textarea.cjs.entry.js +189 -296
- package/dist/cjs/ion-toast.cjs.entry.js +118 -236
- package/dist/cjs/ion-toggle.cjs.entry.js +122 -175
- package/dist/cjs/{ionic-global-k6hOWWpn.js → ionic-global-BerQGEpE.js} +8 -13
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-KvuRAe2W.js → ios.transition-CTiTDh3m.js} +18 -13
- package/dist/cjs/{item-multiple-inputs-BdYSbfKN.js → item-multiple-inputs-jOJZE_I0.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-Bjl5Ozph.js → md.transition-BpiTAaqF.js} +9 -7
- package/dist/cjs/notch-controller-aiy8aQb-.js +155 -0
- package/dist/cjs/{overlays-IlP4H2Gn.js → overlays-CQ_c1fko.js} +33 -48
- package/dist/cjs/{status-tap-BR_ujYHg.js → status-tap-7FzRlXNr.js} +4 -3
- package/dist/cjs/{swipe-back-DzQKEl5g.js → swipe-back-DwTZiAc9.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 -93
- package/dist/collection/components/datetime/datetime.ios.css +2 -42
- package/dist/collection/components/datetime/datetime.js +816 -1051
- 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 +26 -57
- package/dist/collection/components/input/input.js +206 -336
- package/dist/collection/components/input/input.md.css +43 -79
- package/dist/collection/components/input-otp/input-otp.js +368 -430
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +19 -32
- package/dist/collection/components/item/item.js +53 -99
- package/dist/collection/components/item-divider/item-divider.js +12 -17
- package/dist/collection/components/item-group/item-group.js +1 -1
- package/dist/collection/components/item-option/item-option.js +22 -50
- package/dist/collection/components/item-options/item-options.js +8 -11
- package/dist/collection/components/item-sliding/item-sliding.js +21 -27
- package/dist/collection/components/label/label.js +6 -26
- package/dist/collection/components/list/list.js +8 -11
- package/dist/collection/components/list-header/list-header.js +2 -12
- package/dist/collection/components/loading/loading.js +51 -135
- package/dist/collection/components/menu/menu.js +63 -105
- package/dist/collection/components/menu-button/menu-button.js +21 -30
- package/dist/collection/components/menu-toggle/menu-toggle.js +15 -22
- 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 +10 -22
- package/dist/collection/components/modal/gestures/swipe-to-close.js +3 -15
- package/dist/collection/components/modal/modal.js +228 -398
- package/dist/collection/components/modal/safe-area-utils.js +7 -6
- 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 +10 -21
- package/dist/collection/components/note/note.js +2 -8
- 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 +66 -101
- 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 +78 -110
- 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 +69 -96
- package/dist/collection/components/select/select.js +213 -629
- package/dist/collection/components/select/select.md.css +85 -118
- 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.ios.css +62 -94
- package/dist/collection/components/textarea/textarea.js +181 -287
- package/dist/collection/components/textarea/textarea.md.css +77 -103
- 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/focus-controller/index.js +1 -1
- package/dist/collection/utils/focus-trap.js +3 -3
- package/dist/collection/utils/forms/index.js +0 -1
- 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 +4 -27
- package/dist/collection/utils/hardware-back-button.js +3 -3
- package/dist/collection/utils/helpers.js +14 -10
- package/dist/collection/utils/input-shims/hacks/scroll-assist.js +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/logging/index.js +4 -23
- 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 +18 -7
- 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 +1256 -556
- package/dist/esm/{animation-CGFdmGk9.js → animation-DLJpuoEz.js} +4 -4
- package/dist/esm/{app-globals-CYmMeGdU.js → app-globals-D0C5S4hU.js} +1 -1
- package/dist/esm/{button-active--80YqSHA.js → button-active-CXXy0FIE.js} +3 -3
- package/dist/esm/config-DQCONYYp.js +195 -0
- package/dist/esm/dir-o8OKV5aD.js +29 -0
- package/dist/esm/{format-Dcwga61t.js → format-CAmvpAez.js} +31 -41
- package/dist/esm/{framework-delegate--ajhSeKH.js → framework-delegate-B9yvYzqV.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-gLJHMX_F.js → hardware-back-button-B93Gru0Y.js} +4 -4
- package/dist/esm/{helpers-DexiPLIC.js → helpers-DkCLSLI9.js} +15 -11
- package/dist/esm/{index-_Za5VB9w.js → index-B_8X7INq.js} +2 -2
- package/dist/esm/{index-DppOcPFQ.js → index-Bck1OwMs.js} +7 -36
- package/dist/esm/{index-BvabGprD.js → index-DV3sJJW8.js} +2 -2
- package/dist/esm/{index-CumkqGQF.js → index-DdeElWma.js} +7 -6
- package/dist/esm/{index-8s8kZKJ7.js → index-Dsz7OTeL.js} +5 -5
- package/dist/esm/{index-BCgUwrV0.js → index-DwNKJodj.js} +3 -2
- package/dist/esm/{index-ChhhtsGZ.js → index-tcQvqkiX.js} +15 -32
- package/dist/esm/index.js +16 -16
- package/dist/esm/{input-shims-BB0AKb_k.js → input-shims-d-hDv86G.js} +12 -9
- package/dist/esm/input.utils-Cd23Gdd1.js +147 -0
- package/dist/esm/ion-accordion_2.entry.js +341 -368
- package/dist/esm/ion-action-sheet.entry.js +77 -187
- package/dist/esm/ion-alert.entry.js +111 -272
- package/dist/esm/ion-app_8.entry.js +190 -307
- package/dist/esm/ion-avatar_3.entry.js +4 -10
- package/dist/esm/ion-back-button.entry.js +24 -47
- package/dist/esm/ion-backdrop.entry.js +14 -18
- package/dist/esm/ion-breadcrumb_2.entry.js +122 -199
- package/dist/esm/ion-button_2.entry.js +67 -138
- package/dist/esm/ion-card_5.entry.js +31 -82
- package/dist/esm/ion-checkbox.entry.js +102 -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 +242 -253
- package/dist/esm/ion-datetime_3.entry.js +3163 -0
- package/dist/esm/ion-fab_3.entry.js +82 -139
- package/dist/esm/ion-img.entry.js +13 -34
- package/dist/esm/ion-infinite-scroll_2.entry.js +72 -99
- package/dist/esm/ion-input-otp.entry.js +372 -435
- package/dist/esm/ion-input-password-toggle.entry.js +22 -36
- package/dist/esm/ion-input.entry.js +210 -341
- package/dist/esm/ion-item-option_3.entry.js +55 -94
- package/dist/esm/ion-item_8.entry.js +93 -191
- package/dist/esm/ion-loading.entry.js +60 -145
- package/dist/esm/ion-menu_3.entry.js +109 -170
- package/dist/esm/ion-modal.entry.js +262 -455
- package/dist/esm/ion-nav_2.entry.js +159 -101
- package/dist/esm/ion-picker-column-option.entry.js +34 -37
- package/dist/esm/ion-picker-column.entry.js +406 -417
- package/dist/esm/ion-picker.entry.js +393 -401
- package/dist/esm/ion-popover.entry.js +206 -319
- package/dist/esm/ion-progress-bar.entry.js +26 -31
- package/dist/esm/ion-radio_2.entry.js +135 -207
- package/dist/esm/ion-range.entry.js +237 -302
- package/dist/esm/ion-refresher_2.entry.js +92 -163
- package/dist/esm/ion-reorder_2.entry.js +24 -53
- package/dist/esm/ion-ripple-effect.entry.js +14 -14
- package/dist/esm/ion-route_4.entry.js +72 -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 +49 -104
- package/dist/esm/ion-select_3.entry.js +260 -787
- 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 +42 -100
- package/dist/esm/ion-tab_2.entry.js +28 -53
- package/dist/esm/ion-text.entry.js +5 -11
- package/dist/esm/ion-textarea.entry.js +188 -295
- package/dist/esm/ion-toast.entry.js +117 -235
- package/dist/esm/ion-toggle.entry.js +122 -175
- package/dist/esm/{ionic-global-BVB7BrLT.js → ionic-global-Cp_eT4sZ.js} +8 -13
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-BdhybwLl.js → ios.transition-CxNhMt4a.js} +18 -13
- package/dist/esm/{item-multiple-inputs-rU8VaNNg.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-B5lqKGCs.js → md.transition-IE4mC3kp.js} +9 -7
- package/dist/esm/notch-controller-Doqis1td.js +153 -0
- package/dist/esm/{overlays-CjWwtvf1.js → overlays-COCl_nm9.js} +33 -48
- package/dist/esm/{status-tap-DpLhkDWs.js → status-tap-HhO5eQI9.js} +4 -3
- package/dist/esm/{swipe-back-cz4-lyG3.js → swipe-back-DK6afpuO.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-0283ea73.entry.js +4 -0
- package/dist/ionic/p-02ecae65.entry.js +4 -0
- package/dist/ionic/p-0672f677.entry.js +4 -0
- package/dist/ionic/p-0c06fe60.entry.js +4 -0
- package/dist/ionic/p-0fa9c382.entry.js +4 -0
- package/dist/ionic/p-1af4d74c.entry.js +4 -0
- package/dist/ionic/p-1d7ef0d2.entry.js +4 -0
- package/dist/ionic/p-26f05d3a.entry.js +4 -0
- package/dist/ionic/p-27d30585.entry.js +4 -0
- package/dist/ionic/p-2bb2cb18.entry.js +4 -0
- package/dist/ionic/p-31e7bd05.entry.js +4 -0
- package/dist/ionic/p-32f53010.entry.js +4 -0
- package/dist/ionic/p-35eb8b5c.entry.js +4 -0
- package/dist/ionic/p-37e720da.entry.js +4 -0
- package/dist/ionic/p-3efa137b.entry.js +4 -0
- package/dist/ionic/p-432bd72c.entry.js +4 -0
- package/dist/ionic/p-47214c72.entry.js +4 -0
- package/dist/ionic/p-4e172429.entry.js +4 -0
- package/dist/ionic/p-5c3da84e.entry.js +4 -0
- package/dist/ionic/p-5d1da0a2.entry.js +4 -0
- package/dist/ionic/p-5d8082fe.entry.js +4 -0
- package/dist/ionic/p-613d3c43.entry.js +4 -0
- package/dist/ionic/p-616e4d4f.entry.js +4 -0
- package/dist/ionic/p-65d611b2.entry.js +4 -0
- package/dist/ionic/p-67806e3f.entry.js +4 -0
- package/dist/ionic/p-68307fbf.entry.js +4 -0
- package/dist/ionic/p-68cbb2fc.entry.js +4 -0
- package/dist/ionic/p-737ae9eb.entry.js +4 -0
- package/dist/ionic/p-7b0d6248.entry.js +4 -0
- package/dist/ionic/p-7e71e470.entry.js +4 -0
- package/dist/ionic/p-84d5ce05.entry.js +4 -0
- package/dist/ionic/p-85d49987.entry.js +4 -0
- package/dist/ionic/p-8945088b.entry.js +4 -0
- package/dist/ionic/p-8b155568.entry.js +4 -0
- package/dist/ionic/p-90267c4b.entry.js +4 -0
- package/dist/ionic/p-92ad8a67.entry.js +4 -0
- package/dist/ionic/p-9a97d4e0.entry.js +4 -0
- package/dist/ionic/p-9e4b0894.entry.js +4 -0
- package/dist/ionic/p-9eeaBrnk.js +4 -0
- package/dist/ionic/p-B2kaj8sx.js +4 -0
- package/dist/ionic/p-B4y7nxsg.js +4 -0
- package/dist/ionic/p-B8t9Ro6f.js +4 -0
- package/dist/ionic/p-BEOxsxBw.js +4 -0
- package/dist/ionic/p-BJ2NxSHp.js +4 -0
- package/dist/ionic/p-BLiL8g0v.js +4 -0
- package/dist/ionic/p-BTEOs1at.js +4 -0
- package/dist/ionic/p-BUFIpxKM.js +4 -0
- package/dist/ionic/p-BYRVyMu9.js +4 -0
- package/dist/ionic/p-C0eMdTCW.js +4 -0
- package/dist/ionic/p-CKvCXMs9.js +4 -0
- package/dist/ionic/p-CPTv7G9B.js +4 -0
- package/dist/ionic/{p-CQ_4TirR.js → p-Cd4H8ft-.js} +1 -1
- package/dist/ionic/{p-I3In7hMC.js → p-ClM02LPk.js} +1 -1
- package/dist/ionic/p-CtWGkNnJ.js +4 -0
- package/dist/ionic/p-CxMyXUtt.js +4 -0
- package/dist/ionic/p-D13Eaw-8.js +4 -0
- package/dist/ionic/p-DCoy2elM.js +4 -0
- package/dist/ionic/{p-BvabGprD.js → p-DV3sJJW8.js} +1 -1
- package/dist/ionic/p-DZaO33Mw.js +4 -0
- package/dist/ionic/p-DiVJyqlX.js +4 -0
- package/dist/ionic/p-DipZFfzN.js +4 -0
- package/dist/ionic/p-DqN5EA2O.js +4 -0
- package/dist/ionic/p-Dr9fTCb1.js +4 -0
- package/dist/ionic/p-DzWaWHGc.js +4 -0
- package/dist/ionic/p-EkpneKVM.js +4 -0
- package/dist/ionic/p-Nqf6uvGh.js +4 -0
- package/dist/ionic/p-SNAkTDfm.js +4 -0
- package/dist/ionic/p-ab00b0d8.entry.js +4 -0
- package/dist/ionic/p-c2175309.entry.js +4 -0
- package/dist/ionic/p-c4b69d9b.entry.js +4 -0
- package/dist/ionic/p-c4d8641b.entry.js +4 -0
- package/dist/ionic/{p-40424a88.entry.js → p-c6e49f3f.entry.js} +1 -1
- package/dist/ionic/p-ce637936.entry.js +4 -0
- package/dist/ionic/{p-08443c08.entry.js → p-da85e958.entry.js} +1 -1
- package/dist/ionic/p-dfa8d673.entry.js +4 -0
- package/dist/ionic/p-e139357c.entry.js +4 -0
- package/dist/ionic/p-f37ca594.entry.js +4 -0
- package/dist/ionic/p-f8dd336e.entry.js +4 -0
- package/dist/ionic/p-f9de757b.entry.js +4 -0
- package/dist/ionic/p-fe11cf51.entry.js +4 -0
- package/dist/ionic/p-mjKAFv89.js +4 -0
- package/dist/ionic/p-o8OKV5aD.js +4 -0
- package/dist/ionic/p-tcQvqkiX.js +5 -0
- package/dist/types/components/img/img.d.ts +0 -2
- package/dist/types/components/input/input.d.ts +6 -12
- package/dist/types/components/modal/modal-interface.d.ts +0 -9
- 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 +6 -30
- package/dist/types/components/select-option/select-option.d.ts +1 -42
- package/dist/types/components/textarea/textarea.d.ts +5 -12
- 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 -1
- package/dist/types/utils/forms/index.d.ts +0 -1
- package/dist/types/utils/helpers.d.ts +8 -5
- package/dist/types/utils/logging/index.d.ts +1 -2
- package/dist/types/utils/overlays.d.ts +9 -11
- package/dist/types/utils/rtl/dir.d.ts +10 -4
- 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 +7265 -10630
- package/hydrate/index.mjs +7265 -10630
- package/package.json +12 -55
- package/components/p--m5cCjbK.js +0 -4
- package/components/p-8FN7p701.js +0 -4
- package/components/p-B-FxiyeI.js +0 -4
- package/components/p-B4uHHhPK.js +0 -4
- package/components/p-BMPN55of.js +0 -4
- package/components/p-BMS4t-kJ.js +0 -4
- package/components/p-BOvLNVKq.js +0 -4
- package/components/p-BSQPZ79H.js +0 -4
- package/components/p-BWBigMsI.js +0 -4
- package/components/p-BZ4-QTes.js +0 -4
- package/components/p-BhamHSw3.js +0 -4
- package/components/p-BjluhQMI.js +0 -4
- package/components/p-BlsIikdZ.js +0 -4
- package/components/p-Blug1Vxu.js +0 -4
- package/components/p-BpG8kBfD.js +0 -4
- package/components/p-BqPNzJf6.js +0 -4
- package/components/p-C5KYjZWD.js +0 -4
- package/components/p-C91npEel.js +0 -4
- package/components/p-C9BGR5fy.js +0 -4
- package/components/p-CD4fmpem.js +0 -4
- package/components/p-CEW4RXZO.js +0 -4
- package/components/p-CKhiNOEg.js +0 -4
- package/components/p-CO2zzh3W.js +0 -4
- package/components/p-CVb3x_r3.js +0 -4
- package/components/p-CWLrHG8Y.js +0 -4
- package/components/p-CbhUdtjf.js +0 -4
- package/components/p-CejmQs3h.js +0 -4
- package/components/p-CfnNZz_d.js +0 -4
- package/components/p-CmKf4pgI.js +0 -4
- package/components/p-Cs5f-uOS.js +0 -4
- package/components/p-D7-vHX0A.js +0 -4
- package/components/p-DKrhJJV0.js +0 -4
- package/components/p-DRfgH82D.js +0 -4
- package/components/p-DSzSbVP2.js +0 -4
- package/components/p-DVKS-ovH.js +0 -4
- package/components/p-DWCzVL3Y.js +0 -4
- package/components/p-Dd8ajo9a.js +0 -4
- package/components/p-DdnhY_oj.js +0 -4
- package/components/p-DgZOZQjJ.js +0 -4
- package/components/p-Dmd2xqCe.js +0 -4
- package/components/p-G0TxqHfe.js +0 -4
- package/components/p-GG5GhznE.js +0 -4
- package/components/p-J-p0EtHR.js +0 -4
- package/components/p-LXu5-6Ti.js +0 -4
- package/components/p-TXPDHL13.js +0 -4
- package/components/p-UQSiXX2Z.js +0 -4
- package/components/p-UuPYCOZE.js +0 -4
- package/components/p-WeeS7GvC.js +0 -4
- package/components/p-_IKFD3ID.js +0 -4
- package/components/p-byZM6qHV.js +0 -4
- package/components/p-hh7qIC-X.js +0 -4
- package/components/p-idq4JFo2.js +0 -4
- package/components/p-qT1szVjw.js +0 -4
- package/components/p-wzAhIh03.js +0 -4
- package/components/p-ypuYdSDB.js +0 -4
- package/components/p-yuj4Nkm_.js +0 -4
- package/dist/cjs/config-CjUbvdPW.js +0 -36
- package/dist/cjs/dir-Brx7VkvP.js +0 -20
- package/dist/cjs/index-B7zJsYWS.js +0 -429
- package/dist/cjs/input.utils-BZdMWVrt.js +0 -35
- package/dist/cjs/ion-datetime.cjs.entry.js +0 -2770
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +0 -50
- package/dist/cjs/select-option-render-pULCGldr.js +0 -123
- package/dist/cjs/slot-mutation-controller-CgTGFqlW.js +0 -397
- package/dist/collection/utils/forms/start-container-controller.js +0 -132
- 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/dir-B-FxiyeI.js +0 -18
- package/dist/esm/index-CKM1DdGm.js +0 -424
- package/dist/esm/input.utils-B1ValN_N.js +0 -33
- package/dist/esm/ion-datetime.entry.js +0 -2768
- package/dist/esm/overlay-control-label-BSQPZ79H.js +0 -47
- package/dist/esm/select-option-render-C4m76VGH.js +0 -121
- package/dist/esm/slot-mutation-controller-u741eD3Z.js +0 -393
- package/dist/ionic/p-06533d51.entry.js +0 -4
- package/dist/ionic/p-0FNc80PN.js +0 -4
- package/dist/ionic/p-141f5b47.entry.js +0 -4
- package/dist/ionic/p-14a5e8f5.entry.js +0 -4
- package/dist/ionic/p-19269e04.entry.js +0 -4
- package/dist/ionic/p-19abbc33.entry.js +0 -4
- package/dist/ionic/p-1edf0573.entry.js +0 -4
- package/dist/ionic/p-4204184c.entry.js +0 -4
- package/dist/ionic/p-4bc3ecdb.entry.js +0 -4
- package/dist/ionic/p-4eOQC00Z.js +0 -4
- package/dist/ionic/p-4eed9ca1.entry.js +0 -4
- package/dist/ionic/p-53bac1c9.entry.js +0 -4
- package/dist/ionic/p-5506caeb.entry.js +0 -4
- package/dist/ionic/p-5521dc1f.entry.js +0 -4
- package/dist/ionic/p-5993a77f.entry.js +0 -4
- package/dist/ionic/p-5c3626de.entry.js +0 -4
- package/dist/ionic/p-5d3b411c.entry.js +0 -4
- package/dist/ionic/p-60576951.entry.js +0 -4
- package/dist/ionic/p-7116e558.entry.js +0 -4
- package/dist/ionic/p-711a8319.entry.js +0 -4
- package/dist/ionic/p-71419a55.entry.js +0 -4
- package/dist/ionic/p-79325ffe.entry.js +0 -4
- package/dist/ionic/p-7bb3e957.entry.js +0 -4
- package/dist/ionic/p-82525fb0.entry.js +0 -4
- package/dist/ionic/p-84a38904.entry.js +0 -4
- package/dist/ionic/p-865fa114.entry.js +0 -4
- package/dist/ionic/p-8e1d9e3a.entry.js +0 -4
- package/dist/ionic/p-8f204f1e.entry.js +0 -4
- package/dist/ionic/p-9055e897.entry.js +0 -4
- package/dist/ionic/p-9658e083.entry.js +0 -4
- package/dist/ionic/p-988baee1.entry.js +0 -4
- package/dist/ionic/p-9nmHvEvw.js +0 -4
- package/dist/ionic/p-B-FxiyeI.js +0 -4
- package/dist/ionic/p-BB0LlG4y.js +0 -4
- package/dist/ionic/p-BMPN55of.js +0 -4
- package/dist/ionic/p-BQ8oNV0v.js +0 -4
- package/dist/ionic/p-BSQPZ79H.js +0 -4
- package/dist/ionic/p-BhamHSw3.js +0 -4
- package/dist/ionic/p-BjvtSsVI.js +0 -4
- package/dist/ionic/p-BwIp10KV.js +0 -4
- package/dist/ionic/p-C-94tAim.js +0 -4
- package/dist/ionic/p-C6eME8Ey.js +0 -4
- package/dist/ionic/p-CKUuSnDR.js +0 -4
- package/dist/ionic/p-CMRtMbJc.js +0 -4
- package/dist/ionic/p-CPcPmkGv.js +0 -4
- package/dist/ionic/p-CaRuIadB.js +0 -4
- package/dist/ionic/p-Cdjxf_yg.js +0 -4
- package/dist/ionic/p-ChhhtsGZ.js +0 -5
- package/dist/ionic/p-CmKf4pgI.js +0 -4
- package/dist/ionic/p-D5t_-oMk.js +0 -4
- package/dist/ionic/p-D94b61er.js +0 -4
- package/dist/ionic/p-DAztxQR0.js +0 -4
- package/dist/ionic/p-DCI3rXQo.js +0 -4
- package/dist/ionic/p-DDhtUaaA.js +0 -4
- package/dist/ionic/p-DWCzVL3Y.js +0 -4
- package/dist/ionic/p-DkUB-ROc.js +0 -4
- package/dist/ionic/p-Dn0mqQ_R.js +0 -4
- package/dist/ionic/p-T71k3C35.js +0 -4
- package/dist/ionic/p-TXPDHL13.js +0 -4
- package/dist/ionic/p-a71232d6.entry.js +0 -4
- package/dist/ionic/p-a73d8742.entry.js +0 -4
- package/dist/ionic/p-a8421d18.entry.js +0 -4
- package/dist/ionic/p-a8c2c343.entry.js +0 -4
- package/dist/ionic/p-acf0a6af.entry.js +0 -4
- package/dist/ionic/p-ad98e3ff.entry.js +0 -4
- package/dist/ionic/p-af5166f5.entry.js +0 -4
- package/dist/ionic/p-bc2bad5f.entry.js +0 -4
- package/dist/ionic/p-be08d500.entry.js +0 -4
- package/dist/ionic/p-be9a4f51.entry.js +0 -4
- package/dist/ionic/p-byZM6qHV.js +0 -4
- package/dist/ionic/p-ccc5044d.entry.js +0 -4
- package/dist/ionic/p-ce32912b.entry.js +0 -4
- package/dist/ionic/p-ded69ceb.entry.js +0 -4
- package/dist/ionic/p-e0c6e31e.entry.js +0 -4
- package/dist/ionic/p-e1e5b507.entry.js +0 -4
- package/dist/ionic/p-e8c3e08a.entry.js +0 -4
- package/dist/ionic/p-ed5d540d.entry.js +0 -4
- package/dist/ionic/p-f046aa37.entry.js +0 -4
- package/dist/ionic/p-f2802440.entry.js +0 -4
- package/dist/ionic/p-f402f5a4.entry.js +0 -4
- package/dist/ionic/p-fe1bfbcf.entry.js +0 -4
- package/dist/types/utils/forms/start-container-controller.d.ts +0 -34
- 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,18 +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 {
|
|
6
|
-
import { compareOptions, createNotchController, createStartContainerController, isOptionSelected, checkInvalidState, } from "../../utils/forms/index";
|
|
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
|
-
import { createSlotMutationController } from "../../utils/slot-mutation-controller";
|
|
13
10
|
import { createColorClasses, hostContext } from "../../utils/theme";
|
|
14
11
|
import { watchForOptions } from "../../utils/watch-options";
|
|
15
12
|
import { caretDownSharp, chevronExpand } from "ionicons/icons";
|
|
16
|
-
import { config } from "../../global/config";
|
|
17
13
|
import { getIonMode } from "../../global/ionic-global";
|
|
18
14
|
// TODO(FW-2832): types
|
|
19
15
|
/**
|
|
@@ -33,244 +29,145 @@ import { getIonMode } from "../../global/ionic-global";
|
|
|
33
29
|
* @part error-text - Supporting text displayed beneath the select when the select is invalid and touched.
|
|
34
30
|
* @part bottom - The container element for helper text, error text, and counter.
|
|
35
31
|
* @part wrapper - The clickable label element that wraps the entire form field (label text, slots, selected values or placeholder, and toggle icons).
|
|
36
|
-
* @part
|
|
37
|
-
* @part control - The wrapper element containing the label and native select control. When the label is not floating or stacked, this part also contains the dropdown icon.
|
|
38
|
-
* @part end - The wrapper element for the content in the end slot. When the label is floating or stacked, this part also contains the dropdown icon.
|
|
32
|
+
* @part inner - The inner element of the wrapper that manages the slots, selected values or placeholder, and toggle icons.
|
|
39
33
|
*/
|
|
40
34
|
export class Select {
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
*/
|
|
168
|
-
placeholder;
|
|
169
|
-
/**
|
|
170
|
-
* The text to display instead of the selected option's value.
|
|
171
|
-
*/
|
|
172
|
-
selectedText;
|
|
173
|
-
/**
|
|
174
|
-
* The toggle icon to use. Defaults to `chevronExpand` for `ios` mode,
|
|
175
|
-
* or `caretDownSharp` for `md` mode.
|
|
176
|
-
*/
|
|
177
|
-
toggleIcon;
|
|
178
|
-
/**
|
|
179
|
-
* The toggle icon to show when the select is open. If defined, the icon
|
|
180
|
-
* rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon`
|
|
181
|
-
* will be used for when the select is both open and closed.
|
|
182
|
-
*/
|
|
183
|
-
expandedIcon;
|
|
184
|
-
/**
|
|
185
|
-
* The shape of the select. If "round" it will have an increased border radius.
|
|
186
|
-
*/
|
|
187
|
-
shape;
|
|
188
|
-
/**
|
|
189
|
-
* The value of the select.
|
|
190
|
-
*/
|
|
191
|
-
value;
|
|
192
|
-
/**
|
|
193
|
-
* If true, screen readers will announce it as a required field. This property
|
|
194
|
-
* works only for accessibility purposes, it will not prevent the form from
|
|
195
|
-
* submitting if the value is invalid.
|
|
196
|
-
*/
|
|
197
|
-
required = false;
|
|
198
|
-
/**
|
|
199
|
-
* Emitted when the value has changed.
|
|
200
|
-
*
|
|
201
|
-
* This event will not emit when programmatically setting the `value` property.
|
|
202
|
-
*/
|
|
203
|
-
ionChange;
|
|
204
|
-
/**
|
|
205
|
-
* Emitted when the selection is cancelled.
|
|
206
|
-
*/
|
|
207
|
-
ionCancel;
|
|
208
|
-
/**
|
|
209
|
-
* Emitted when the overlay is dismissed.
|
|
210
|
-
*/
|
|
211
|
-
ionDismiss;
|
|
212
|
-
/**
|
|
213
|
-
* Emitted when the select has focus.
|
|
214
|
-
*/
|
|
215
|
-
ionFocus;
|
|
216
|
-
/**
|
|
217
|
-
* Emitted when the select loses focus.
|
|
218
|
-
*/
|
|
219
|
-
ionBlur;
|
|
220
|
-
/**
|
|
221
|
-
* Emitted when the styles change.
|
|
222
|
-
* @internal
|
|
223
|
-
*/
|
|
224
|
-
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
|
+
}
|
|
225
161
|
styleChanged() {
|
|
226
162
|
this.emitStyle();
|
|
227
163
|
}
|
|
228
164
|
setValue(value) {
|
|
229
|
-
if (this.isValueEqual(this.value, value)) {
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
165
|
this.value = value;
|
|
233
166
|
this.ionChange.emit({ value });
|
|
234
167
|
}
|
|
235
|
-
isValueEqual(currentValue, newValue) {
|
|
236
|
-
if (this.multiple) {
|
|
237
|
-
const currentArr = Array.isArray(currentValue) ? currentValue : [];
|
|
238
|
-
const newArr = Array.isArray(newValue) ? newValue : [];
|
|
239
|
-
if (currentArr.length !== newArr.length) {
|
|
240
|
-
return false;
|
|
241
|
-
}
|
|
242
|
-
// Multiset compare: each new value must match a distinct current value.
|
|
243
|
-
// A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
|
|
244
|
-
// ['a','b'] when both 'a' and 'b' map to options whose values overlap.
|
|
245
|
-
const remaining = currentArr.slice();
|
|
246
|
-
return newArr.every((val) => {
|
|
247
|
-
const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
|
|
248
|
-
if (idx === -1) {
|
|
249
|
-
return false;
|
|
250
|
-
}
|
|
251
|
-
remaining.splice(idx, 1);
|
|
252
|
-
return true;
|
|
253
|
-
});
|
|
254
|
-
}
|
|
255
|
-
if (currentValue == null && newValue == null) {
|
|
256
|
-
return true;
|
|
257
|
-
}
|
|
258
|
-
if (currentValue == null || newValue == null) {
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
return compareOptions(currentValue, newValue, this.compareWith);
|
|
262
|
-
}
|
|
263
168
|
async connectedCallback() {
|
|
264
169
|
const { el } = this;
|
|
265
|
-
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
266
|
-
this.startContainerController?.calculateStartContainerWidth();
|
|
267
|
-
forceUpdate(this);
|
|
268
|
-
});
|
|
269
170
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
270
|
-
this.startContainerController = createStartContainerController(el, () => this.startContainerEl, () => {
|
|
271
|
-
return Build.isBrowser && getIonMode(this) === 'md' && this.fill === 'outline';
|
|
272
|
-
});
|
|
273
|
-
this.startContainerController.calculateStartContainerWidth();
|
|
274
171
|
this.updateOverlayOptions();
|
|
275
172
|
this.emitStyle();
|
|
276
173
|
this.mutationO = watchForOptions(this.el, 'ion-select-option', async () => {
|
|
@@ -342,18 +239,10 @@ export class Select {
|
|
|
342
239
|
this.mutationO.disconnect();
|
|
343
240
|
this.mutationO = undefined;
|
|
344
241
|
}
|
|
345
|
-
if (this.slotMutationController) {
|
|
346
|
-
this.slotMutationController.destroy();
|
|
347
|
-
this.slotMutationController = undefined;
|
|
348
|
-
}
|
|
349
242
|
if (this.notchController) {
|
|
350
243
|
this.notchController.destroy();
|
|
351
244
|
this.notchController = undefined;
|
|
352
245
|
}
|
|
353
|
-
if (this.startContainerController) {
|
|
354
|
-
this.startContainerController.destroy();
|
|
355
|
-
this.startContainerController = undefined;
|
|
356
|
-
}
|
|
357
246
|
// Clean up validation observer to prevent memory leaks.
|
|
358
247
|
if (this.validationObserver) {
|
|
359
248
|
this.validationObserver.disconnect();
|
|
@@ -510,11 +399,10 @@ export class Select {
|
|
|
510
399
|
.join(' ');
|
|
511
400
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
512
401
|
const isSelected = isOptionSelected(selectValue, value, this.compareWith);
|
|
513
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
514
402
|
return {
|
|
515
|
-
|
|
403
|
+
role: isSelected ? 'selected' : '',
|
|
404
|
+
text: option.textContent,
|
|
516
405
|
cssClass: optClass,
|
|
517
|
-
disabled: option.disabled,
|
|
518
406
|
handler: () => {
|
|
519
407
|
this.setValue(value);
|
|
520
408
|
},
|
|
@@ -522,9 +410,6 @@ export class Select {
|
|
|
522
410
|
'aria-checked': isSelected ? 'true' : 'false',
|
|
523
411
|
role: 'radio',
|
|
524
412
|
},
|
|
525
|
-
startContent,
|
|
526
|
-
endContent,
|
|
527
|
-
description: option.description,
|
|
528
413
|
};
|
|
529
414
|
});
|
|
530
415
|
// Add "cancel" button
|
|
@@ -545,19 +430,13 @@ export class Select {
|
|
|
545
430
|
.filter((cls) => cls !== 'hydrated')
|
|
546
431
|
.join(' ');
|
|
547
432
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
548
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
549
433
|
return {
|
|
550
434
|
type: inputType,
|
|
551
435
|
cssClass: optClass,
|
|
552
|
-
label:
|
|
436
|
+
label: option.textContent || '',
|
|
553
437
|
value,
|
|
554
438
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
555
439
|
disabled: option.disabled,
|
|
556
|
-
startContent,
|
|
557
|
-
endContent,
|
|
558
|
-
description: option.description,
|
|
559
|
-
labelPlacement: option.labelPlacement,
|
|
560
|
-
justify: option.justify,
|
|
561
440
|
};
|
|
562
441
|
});
|
|
563
442
|
return alertInputs;
|
|
@@ -570,9 +449,8 @@ export class Select {
|
|
|
570
449
|
.filter((cls) => cls !== 'hydrated')
|
|
571
450
|
.join(' ');
|
|
572
451
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
573
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
574
452
|
return {
|
|
575
|
-
text:
|
|
453
|
+
text: option.textContent || '',
|
|
576
454
|
cssClass: optClass,
|
|
577
455
|
value,
|
|
578
456
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
@@ -583,11 +461,6 @@ export class Select {
|
|
|
583
461
|
this.close();
|
|
584
462
|
}
|
|
585
463
|
},
|
|
586
|
-
startContent,
|
|
587
|
-
endContent,
|
|
588
|
-
description: option.description,
|
|
589
|
-
labelPlacement: option.labelPlacement,
|
|
590
|
-
justify: option.justify,
|
|
591
464
|
};
|
|
592
465
|
});
|
|
593
466
|
return popoverOptions;
|
|
@@ -616,43 +489,28 @@ export class Select {
|
|
|
616
489
|
*/
|
|
617
490
|
}
|
|
618
491
|
else {
|
|
619
|
-
event = {
|
|
620
|
-
...ev,
|
|
621
|
-
detail: {
|
|
492
|
+
event = Object.assign(Object.assign({}, ev), { detail: {
|
|
622
493
|
ionShadowTarget: this.nativeWrapperEl,
|
|
623
|
-
}
|
|
624
|
-
};
|
|
494
|
+
} });
|
|
625
495
|
}
|
|
626
|
-
const
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
mode,
|
|
630
|
-
event,
|
|
631
|
-
alignment: 'center',
|
|
632
|
-
size,
|
|
633
|
-
showBackdrop,
|
|
634
|
-
...interfaceOptions,
|
|
635
|
-
component: 'ion-select-popover',
|
|
636
|
-
cssClass: [
|
|
637
|
-
'select-popover',
|
|
638
|
-
hasRichContent ? 'select-popover-rich-content' : undefined,
|
|
639
|
-
interfaceOptions.cssClass,
|
|
640
|
-
],
|
|
641
|
-
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: {
|
|
642
499
|
header: interfaceOptions.header,
|
|
643
500
|
subHeader: interfaceOptions.subHeader,
|
|
644
501
|
message: interfaceOptions.message,
|
|
645
502
|
multiple,
|
|
646
503
|
value,
|
|
647
|
-
options,
|
|
648
|
-
}
|
|
649
|
-
};
|
|
504
|
+
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
505
|
+
} });
|
|
650
506
|
/**
|
|
651
507
|
* Workaround for Stencil to autodefine
|
|
652
508
|
* ion-select-popover and ion-popover when
|
|
653
509
|
* using Custom Elements build.
|
|
654
510
|
*/
|
|
511
|
+
// eslint-disable-next-line
|
|
655
512
|
if (false) {
|
|
513
|
+
// eslint-disable-next-line
|
|
656
514
|
// @ts-ignore
|
|
657
515
|
document.createElement('ion-select-popover');
|
|
658
516
|
document.createElement('ion-popover');
|
|
@@ -662,18 +520,15 @@ export class Select {
|
|
|
662
520
|
async openActionSheet() {
|
|
663
521
|
const mode = getIonMode(this);
|
|
664
522
|
const interfaceOptions = this.interfaceOptions;
|
|
665
|
-
const actionSheetOpts = {
|
|
666
|
-
mode,
|
|
667
|
-
...interfaceOptions,
|
|
668
|
-
buttons: this.createActionSheetButtons(this.childOpts, this.value),
|
|
669
|
-
cssClass: ['select-action-sheet', interfaceOptions.cssClass],
|
|
670
|
-
};
|
|
523
|
+
const actionSheetOpts = Object.assign(Object.assign({ mode }, interfaceOptions), { buttons: this.createActionSheetButtons(this.childOpts, this.value), cssClass: ['select-action-sheet', interfaceOptions.cssClass] });
|
|
671
524
|
/**
|
|
672
525
|
* Workaround for Stencil to autodefine
|
|
673
526
|
* ion-action-sheet when
|
|
674
527
|
* using Custom Elements build.
|
|
675
528
|
*/
|
|
529
|
+
// eslint-disable-next-line
|
|
676
530
|
if (false) {
|
|
531
|
+
// eslint-disable-next-line
|
|
677
532
|
// @ts-ignore
|
|
678
533
|
document.createElement('ion-action-sheet');
|
|
679
534
|
}
|
|
@@ -683,12 +538,7 @@ export class Select {
|
|
|
683
538
|
const interfaceOptions = this.interfaceOptions;
|
|
684
539
|
const inputType = this.multiple ? 'checkbox' : 'radio';
|
|
685
540
|
const mode = getIonMode(this);
|
|
686
|
-
const alertOpts = {
|
|
687
|
-
mode,
|
|
688
|
-
...interfaceOptions,
|
|
689
|
-
header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
|
|
690
|
-
inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
|
|
691
|
-
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: [
|
|
692
542
|
{
|
|
693
543
|
text: this.cancelText,
|
|
694
544
|
role: 'cancel',
|
|
@@ -702,19 +552,19 @@ export class Select {
|
|
|
702
552
|
this.setValue(selectedValues);
|
|
703
553
|
},
|
|
704
554
|
},
|
|
705
|
-
],
|
|
706
|
-
cssClass: [
|
|
555
|
+
], cssClass: [
|
|
707
556
|
'select-alert',
|
|
708
557
|
interfaceOptions.cssClass,
|
|
709
558
|
this.multiple ? 'multiple-select-alert' : 'single-select-alert',
|
|
710
|
-
]
|
|
711
|
-
};
|
|
559
|
+
] });
|
|
712
560
|
/**
|
|
713
561
|
* Workaround for Stencil to autodefine
|
|
714
562
|
* ion-alert when
|
|
715
563
|
* using Custom Elements build.
|
|
716
564
|
*/
|
|
565
|
+
// eslint-disable-next-line
|
|
717
566
|
if (false) {
|
|
567
|
+
// eslint-disable-next-line
|
|
718
568
|
// @ts-ignore
|
|
719
569
|
document.createElement('ion-alert');
|
|
720
570
|
}
|
|
@@ -723,25 +573,21 @@ export class Select {
|
|
|
723
573
|
openModal() {
|
|
724
574
|
const { multiple, value, interfaceOptions } = this;
|
|
725
575
|
const mode = getIonMode(this);
|
|
726
|
-
const modalOpts = {
|
|
727
|
-
...interfaceOptions,
|
|
728
|
-
mode,
|
|
729
|
-
cssClass: ['select-modal', interfaceOptions.cssClass],
|
|
730
|
-
component: 'ion-select-modal',
|
|
731
|
-
componentProps: {
|
|
576
|
+
const modalOpts = Object.assign(Object.assign({}, interfaceOptions), { mode, cssClass: ['select-modal', interfaceOptions.cssClass], component: 'ion-select-modal', componentProps: {
|
|
732
577
|
header: interfaceOptions.header,
|
|
733
578
|
cancelText: this.cancelText,
|
|
734
579
|
multiple,
|
|
735
580
|
value,
|
|
736
581
|
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
737
|
-
}
|
|
738
|
-
};
|
|
582
|
+
} });
|
|
739
583
|
/**
|
|
740
584
|
* Workaround for Stencil to autodefine
|
|
741
585
|
* ion-select-modal and ion-modal when
|
|
742
586
|
* using Custom Elements build.
|
|
743
587
|
*/
|
|
588
|
+
// eslint-disable-next-line
|
|
744
589
|
if (false) {
|
|
590
|
+
// eslint-disable-next-line
|
|
745
591
|
// @ts-ignore
|
|
746
592
|
document.createElement('ion-select-modal');
|
|
747
593
|
document.createElement('ion-modal');
|
|
@@ -782,18 +628,12 @@ export class Select {
|
|
|
782
628
|
}
|
|
783
629
|
return;
|
|
784
630
|
}
|
|
785
|
-
|
|
786
|
-
* Returns the text to display in the select based on the selected value.
|
|
787
|
-
*
|
|
788
|
-
* @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`.
|
|
789
|
-
* @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
|
|
790
|
-
*/
|
|
791
|
-
getText(useHTML = false) {
|
|
631
|
+
getText() {
|
|
792
632
|
const selectedText = this.selectedText;
|
|
793
633
|
if (selectedText != null && selectedText !== '') {
|
|
794
634
|
return selectedText;
|
|
795
635
|
}
|
|
796
|
-
return generateText(this.childOpts, this.value, this.compareWith
|
|
636
|
+
return generateText(this.childOpts, this.value, this.compareWith);
|
|
797
637
|
}
|
|
798
638
|
setFocus() {
|
|
799
639
|
if (this.focusEl) {
|
|
@@ -807,51 +647,6 @@ export class Select {
|
|
|
807
647
|
};
|
|
808
648
|
this.ionStyle.emit(style);
|
|
809
649
|
}
|
|
810
|
-
onClick = (ev) => {
|
|
811
|
-
const target = ev.target;
|
|
812
|
-
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
813
|
-
if (target === this.el || closestSlot === null) {
|
|
814
|
-
this.setFocus();
|
|
815
|
-
this.open(ev);
|
|
816
|
-
}
|
|
817
|
-
else {
|
|
818
|
-
/**
|
|
819
|
-
* Prevent clicks to the start/end slots from opening the select.
|
|
820
|
-
* We ensure the target isn't this element in case the select is slotted
|
|
821
|
-
* in, for example, an item. This would prevent the select from ever
|
|
822
|
-
* being opened since the element itself has slot="start"/"end".
|
|
823
|
-
*
|
|
824
|
-
* Clicking a slotted element also causes a click
|
|
825
|
-
* on the <label> element (since it wraps the slots).
|
|
826
|
-
* Clicking <label> dispatches another click event on
|
|
827
|
-
* the native form control that then bubbles up to this
|
|
828
|
-
* listener. This additional event targets the host
|
|
829
|
-
* element, so the select overlay is opened.
|
|
830
|
-
*
|
|
831
|
-
* When the slotted elements are clicked (and therefore
|
|
832
|
-
* the ancestor <label> element) we want to prevent the label
|
|
833
|
-
* from dispatching another click event.
|
|
834
|
-
*
|
|
835
|
-
* Do not call stopPropagation() because this will cause
|
|
836
|
-
* click handlers on the slotted elements to never fire in React.
|
|
837
|
-
* When developers do onClick in React a native "click" listener
|
|
838
|
-
* is added on the root element, not the slotted element. When that
|
|
839
|
-
* native click listener fires, React then dispatches the synthetic
|
|
840
|
-
* click event on the slotted element. However, if stopPropagation
|
|
841
|
-
* is called then the native click event will never bubble up
|
|
842
|
-
* to the root element.
|
|
843
|
-
*/
|
|
844
|
-
ev.preventDefault();
|
|
845
|
-
}
|
|
846
|
-
};
|
|
847
|
-
onFocus = () => {
|
|
848
|
-
this.hasFocus = true;
|
|
849
|
-
this.ionFocus.emit();
|
|
850
|
-
};
|
|
851
|
-
onBlur = () => {
|
|
852
|
-
this.hasFocus = false;
|
|
853
|
-
this.ionBlur.emit();
|
|
854
|
-
};
|
|
855
650
|
renderLabel() {
|
|
856
651
|
const { label } = this;
|
|
857
652
|
return (h("div", { class: {
|
|
@@ -860,8 +655,8 @@ export class Select {
|
|
|
860
655
|
}, part: "label" }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
861
656
|
}
|
|
862
657
|
componentDidRender() {
|
|
863
|
-
|
|
864
|
-
this.
|
|
658
|
+
var _a;
|
|
659
|
+
(_a = this.notchController) === null || _a === void 0 ? void 0 : _a.calculateNotchWidth();
|
|
865
660
|
}
|
|
866
661
|
/**
|
|
867
662
|
* Gets any content passed into the `label` slot,
|
|
@@ -880,64 +675,33 @@ export class Select {
|
|
|
880
675
|
return this.label !== undefined || this.labelSlot !== null;
|
|
881
676
|
}
|
|
882
677
|
/**
|
|
883
|
-
*
|
|
884
|
-
*
|
|
885
|
-
* or mouse) and slotted content clicks to propagate so event delegation
|
|
886
|
-
* works for parent handlers.
|
|
678
|
+
* Renders the border container
|
|
679
|
+
* when fill="outline".
|
|
887
680
|
*/
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
* behavior.
|
|
907
|
-
*
|
|
908
|
-
* Only wraps when the string contains HTML elements
|
|
909
|
-
* alongside text.
|
|
910
|
-
*/
|
|
911
|
-
wrapSelectTextNodes(html) {
|
|
912
|
-
const temp = document.createElement('div');
|
|
913
|
-
temp.innerHTML = html;
|
|
914
|
-
const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
|
|
915
|
-
// Return the plain text
|
|
916
|
-
if (!hasElements) {
|
|
917
|
-
return html;
|
|
681
|
+
renderLabelContainer() {
|
|
682
|
+
const mode = getIonMode(this);
|
|
683
|
+
const hasOutlineFill = mode === 'md' && this.fill === 'outline';
|
|
684
|
+
if (hasOutlineFill) {
|
|
685
|
+
/**
|
|
686
|
+
* The outline fill has a special outline
|
|
687
|
+
* that appears around the select and the label.
|
|
688
|
+
* Certain stacked and floating label placements cause the
|
|
689
|
+
* label to translate up and create a "cut out"
|
|
690
|
+
* inside of that border by using the notch-spacer element.
|
|
691
|
+
*/
|
|
692
|
+
return [
|
|
693
|
+
h("div", { class: "select-outline-container" }, h("div", { class: "select-outline-start" }), h("div", { class: {
|
|
694
|
+
'select-outline-notch': true,
|
|
695
|
+
'select-outline-notch-hidden': !this.hasLabel,
|
|
696
|
+
} }, h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), h("div", { class: "select-outline-end" })),
|
|
697
|
+
this.renderLabel(),
|
|
698
|
+
];
|
|
918
699
|
}
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
* e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
|
|
925
|
-
*/
|
|
926
|
-
const commaMatch = text.match(/^(,\s*)(.*)/);
|
|
927
|
-
if (commaMatch) {
|
|
928
|
-
const commaNode = document.createTextNode(commaMatch[1]);
|
|
929
|
-
const wrapper = document.createElement('span');
|
|
930
|
-
wrapper.textContent = commaMatch[2];
|
|
931
|
-
node.parentNode?.replaceChild(wrapper, node);
|
|
932
|
-
wrapper.parentNode?.insertBefore(commaNode, wrapper);
|
|
933
|
-
return;
|
|
934
|
-
}
|
|
935
|
-
const wrapper = document.createElement('span');
|
|
936
|
-
node.parentNode?.replaceChild(wrapper, node);
|
|
937
|
-
wrapper.appendChild(node);
|
|
938
|
-
}
|
|
939
|
-
});
|
|
940
|
-
return temp.innerHTML;
|
|
700
|
+
/**
|
|
701
|
+
* If not using the outline style,
|
|
702
|
+
* we can render just the label.
|
|
703
|
+
*/
|
|
704
|
+
return this.renderLabel();
|
|
941
705
|
}
|
|
942
706
|
/**
|
|
943
707
|
* Renders either the placeholder
|
|
@@ -946,7 +710,7 @@ export class Select {
|
|
|
946
710
|
*/
|
|
947
711
|
renderSelectText() {
|
|
948
712
|
const { placeholder } = this;
|
|
949
|
-
const displayValue = this.getText(
|
|
713
|
+
const displayValue = this.getText();
|
|
950
714
|
let addPlaceholderClass = false;
|
|
951
715
|
let selectText = displayValue;
|
|
952
716
|
if (selectText === '' && placeholder !== undefined) {
|
|
@@ -958,10 +722,6 @@ export class Select {
|
|
|
958
722
|
'select-placeholder': addPlaceholderClass,
|
|
959
723
|
};
|
|
960
724
|
const textPart = addPlaceholderClass ? 'placeholder' : 'text';
|
|
961
|
-
if (this.customHTMLEnabled) {
|
|
962
|
-
const wrapped = this.wrapSelectTextNodes(selectText);
|
|
963
|
-
return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
|
|
964
|
-
}
|
|
965
725
|
return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
|
|
966
726
|
}
|
|
967
727
|
/**
|
|
@@ -977,16 +737,16 @@ export class Select {
|
|
|
977
737
|
}
|
|
978
738
|
else {
|
|
979
739
|
const defaultIcon = mode === 'ios' ? chevronExpand : caretDownSharp;
|
|
980
|
-
icon = toggleIcon
|
|
740
|
+
icon = toggleIcon !== null && toggleIcon !== void 0 ? toggleIcon : defaultIcon;
|
|
981
741
|
}
|
|
982
742
|
return h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
|
|
983
743
|
}
|
|
984
744
|
get ariaLabel() {
|
|
745
|
+
var _a;
|
|
985
746
|
const { placeholder, inheritedAttributes } = this;
|
|
986
|
-
// Get the plain text from the selected text
|
|
987
747
|
const displayValue = this.getText();
|
|
988
748
|
// The aria label should be preferred over visible text if both are specified
|
|
989
|
-
const definedLabel = inheritedAttributes['aria-label']
|
|
749
|
+
const definedLabel = (_a = inheritedAttributes['aria-label']) !== null && _a !== void 0 ? _a : this.labelText;
|
|
990
750
|
/**
|
|
991
751
|
* If developer has specified a placeholder
|
|
992
752
|
* and there is nothing selected, the selectText
|
|
@@ -1057,10 +817,28 @@ export class Select {
|
|
|
1057
817
|
const inItem = hostContext('ion-item', this.el);
|
|
1058
818
|
const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
|
|
1059
819
|
const hasValue = this.hasValue();
|
|
1060
|
-
const
|
|
820
|
+
const hasStartEndSlots = el.querySelector('[slot="start"], [slot="end"]') !== null;
|
|
1061
821
|
renderHiddenInput(true, el, name, parseValue(value), disabled);
|
|
1062
|
-
|
|
1063
|
-
|
|
822
|
+
/**
|
|
823
|
+
* If the label is stacked, it should always sit above the select.
|
|
824
|
+
* For floating labels, the label should move above the select if
|
|
825
|
+
* the select has a value, is open, or has anything in either
|
|
826
|
+
* the start or end slot.
|
|
827
|
+
*
|
|
828
|
+
* If there is content in the start slot, the label would overlap
|
|
829
|
+
* it if not forced to float. This is also applied to the end slot
|
|
830
|
+
* because with the default or solid fills, the select is not
|
|
831
|
+
* vertically centered in the container, but the label is. This
|
|
832
|
+
* causes the slots and label to appear vertically offset from each
|
|
833
|
+
* other when the label isn't floating above the input. This doesn't
|
|
834
|
+
* apply to the outline fill, but this was not accounted for to keep
|
|
835
|
+
* things consistent.
|
|
836
|
+
*
|
|
837
|
+
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
838
|
+
*/
|
|
839
|
+
const labelShouldFloat = labelPlacement === 'stacked' ||
|
|
840
|
+
(labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded || hasStartEndSlots));
|
|
841
|
+
return (h(Host, { key: 'f16327d6866ffee76e1618fcd3281590ca0fd56d', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
1064
842
|
[mode]: true,
|
|
1065
843
|
'in-item': inItem,
|
|
1066
844
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -1078,7 +856,7 @@ export class Select {
|
|
|
1078
856
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
1079
857
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
1080
858
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
1081
|
-
}) }, 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()));
|
|
1082
860
|
}
|
|
1083
861
|
static get is() { return "ion-select"; }
|
|
1084
862
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1738,219 +1516,25 @@ const parseValue = (value) => {
|
|
|
1738
1516
|
}
|
|
1739
1517
|
return value.toString();
|
|
1740
1518
|
};
|
|
1741
|
-
const generateText = (opts, value, compareWith
|
|
1519
|
+
const generateText = (opts, value, compareWith) => {
|
|
1742
1520
|
if (value === undefined) {
|
|
1743
1521
|
return '';
|
|
1744
1522
|
}
|
|
1745
1523
|
if (Array.isArray(value)) {
|
|
1746
1524
|
return value
|
|
1747
|
-
.map((v) => textForValue(opts, v, compareWith
|
|
1525
|
+
.map((v) => textForValue(opts, v, compareWith))
|
|
1748
1526
|
.filter((opt) => opt !== null)
|
|
1749
1527
|
.join(', ');
|
|
1750
1528
|
}
|
|
1751
1529
|
else {
|
|
1752
|
-
return textForValue(opts, value, compareWith
|
|
1530
|
+
return textForValue(opts, value, compareWith) || '';
|
|
1753
1531
|
}
|
|
1754
1532
|
};
|
|
1755
|
-
|
|
1756
|
-
* Returns the display text for a given value from the list of options.
|
|
1757
|
-
* When `useHTML` is true, returns sanitized HTML for the select text.
|
|
1758
|
-
* When `useHTML` is false, returns plain text for aria-label and other
|
|
1759
|
-
* text-only contexts.
|
|
1760
|
-
*
|
|
1761
|
-
* @param opts - The list of ion-select-option elements.
|
|
1762
|
-
* @param value - The value to find the matching option for.
|
|
1763
|
-
* @param compareWith - Custom comparison function or property name.
|
|
1764
|
-
* @param useHTML - If true, returns HTML string. If false, returns plain text.
|
|
1765
|
-
*/
|
|
1766
|
-
const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
1533
|
+
const textForValue = (opts, value, compareWith) => {
|
|
1767
1534
|
const selectOpt = opts.find((opt) => {
|
|
1768
1535
|
return compareOptions(value, getOptionValue(opt), compareWith);
|
|
1769
1536
|
});
|
|
1770
|
-
|
|
1771
|
-
if (!selectOpt) {
|
|
1772
|
-
return null;
|
|
1773
|
-
}
|
|
1774
|
-
// Return sanitized HTML for the select text
|
|
1775
|
-
if (customHTMLEnabled && useHTML) {
|
|
1776
|
-
return getOptionContent(selectOpt, undefined, true);
|
|
1777
|
-
}
|
|
1778
|
-
/**
|
|
1779
|
-
* When custom HTML is enabled, extract only the default slot content.
|
|
1780
|
-
* This ensures aria-label and other text-only contexts read only
|
|
1781
|
-
* the relevant option text.
|
|
1782
|
-
*/
|
|
1783
|
-
if (customHTMLEnabled) {
|
|
1784
|
-
const content = getOptionContent(selectOpt);
|
|
1785
|
-
if (typeof content === 'string') {
|
|
1786
|
-
return content;
|
|
1787
|
-
}
|
|
1788
|
-
/**
|
|
1789
|
-
* Elements were found in the default slot, extract and concatenate
|
|
1790
|
-
* their text content while trimming whitespace.
|
|
1791
|
-
*/
|
|
1792
|
-
if (content) {
|
|
1793
|
-
const texts = Array.from(content.childNodes)
|
|
1794
|
-
.map((n) => n.textContent?.trim())
|
|
1795
|
-
.filter((t) => t);
|
|
1796
|
-
return texts.join(' ') || null;
|
|
1797
|
-
}
|
|
1798
|
-
// Empty option
|
|
1799
|
-
return null;
|
|
1800
|
-
}
|
|
1801
|
-
return getDefaultSlotPlainText(selectOpt);
|
|
1802
|
-
};
|
|
1803
|
-
/**
|
|
1804
|
-
* Trims whitespace from all text nodes within a DOM tree.
|
|
1805
|
-
* This prevents invisible layout shifts and unwanted gaps between
|
|
1806
|
-
* elements when HTML content is injected via innerHTML or cloneNode,
|
|
1807
|
-
* as browsers preserve whitespace (tabs, newlines, spaces) from
|
|
1808
|
-
* the original source markup.
|
|
1809
|
-
*
|
|
1810
|
-
* @param node The root node to start trimming text nodes from.
|
|
1811
|
-
*/
|
|
1812
|
-
const trimTextNodes = (node) => {
|
|
1813
|
-
node.childNodes.forEach((child) => {
|
|
1814
|
-
if (child.nodeType === Node.TEXT_NODE) {
|
|
1815
|
-
child.textContent = child.textContent?.trim() || '';
|
|
1816
|
-
}
|
|
1817
|
-
else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
1818
|
-
trimTextNodes(child);
|
|
1819
|
-
}
|
|
1820
|
-
});
|
|
1821
|
-
};
|
|
1822
|
-
/**
|
|
1823
|
-
* Extracts and clones content from an `ion-select-option` element
|
|
1824
|
-
* for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
|
|
1825
|
-
*
|
|
1826
|
-
* @param option - The `ion-select-option` element to extract content from.
|
|
1827
|
-
* @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
|
|
1828
|
-
* @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.
|
|
1829
|
-
* @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
|
|
1830
|
-
* div element containing cloned child nodes. Returns `null` if no matching
|
|
1831
|
-
* content is found.
|
|
1832
|
-
*/
|
|
1833
|
-
const getOptionContent = (option, slotName, useHTML = false) => {
|
|
1834
|
-
let nodes;
|
|
1835
|
-
if (slotName) {
|
|
1836
|
-
// Named slot: get elements with matching slot attribute
|
|
1837
|
-
nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
|
|
1838
|
-
}
|
|
1839
|
-
else {
|
|
1840
|
-
// Default slot: get nodes without a slot attribute
|
|
1841
|
-
const defaultSlot = getOptionDefaultSlot(option) || [];
|
|
1842
|
-
nodes = defaultSlot.filter((node) => {
|
|
1843
|
-
/**
|
|
1844
|
-
* Exclude whitespace-only text nodes (newline noise between
|
|
1845
|
-
* markup elements). Element nodes are always kept, even when
|
|
1846
|
-
* their textContent is empty (e.g. <svg>, <img>).
|
|
1847
|
-
*/
|
|
1848
|
-
if (node.nodeType === Node.TEXT_NODE) {
|
|
1849
|
-
return node.textContent?.trim().length !== 0;
|
|
1850
|
-
}
|
|
1851
|
-
return true;
|
|
1852
|
-
});
|
|
1853
|
-
}
|
|
1854
|
-
if (nodes.length === 0) {
|
|
1855
|
-
return null;
|
|
1856
|
-
}
|
|
1857
|
-
// Return plain text if no elements are found
|
|
1858
|
-
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1859
|
-
return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
|
|
1860
|
-
}
|
|
1861
|
-
/**
|
|
1862
|
-
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
1863
|
-
* onto attributes before cloning. Frameworks like Vue set these as
|
|
1864
|
-
* DOM properties, which `cloneNode` doesn't copy, so without this
|
|
1865
|
-
* step the cloned overlay copy renders without the prop's value.
|
|
1866
|
-
*/
|
|
1867
|
-
nodes.forEach((n) => {
|
|
1868
|
-
if (n.nodeType === Node.ELEMENT_NODE) {
|
|
1869
|
-
reflectPropertiesToAttributes(n);
|
|
1870
|
-
}
|
|
1871
|
-
});
|
|
1872
|
-
// Clone each node into a temporary container
|
|
1873
|
-
const container = document.createElement('div');
|
|
1874
|
-
nodes.forEach((n) => {
|
|
1875
|
-
const clone = n.cloneNode(true);
|
|
1876
|
-
if (clone.nodeType === Node.TEXT_NODE) {
|
|
1877
|
-
clone.textContent = clone.textContent?.trim() || '';
|
|
1878
|
-
}
|
|
1879
|
-
else {
|
|
1880
|
-
trimTextNodes(clone);
|
|
1881
|
-
}
|
|
1882
|
-
container.appendChild(clone);
|
|
1883
|
-
});
|
|
1884
|
-
/**
|
|
1885
|
-
* Sanitize the cloned DOM in place. Trusted attributes (size, color,
|
|
1886
|
-
* shape, etc.) are preserved; event handlers, javascript: URLs, and
|
|
1887
|
-
* blocked tags are stripped.
|
|
1888
|
-
*/
|
|
1889
|
-
sanitizeDOMTree(container);
|
|
1890
|
-
if (useHTML) {
|
|
1891
|
-
return container.innerHTML.trim() || null;
|
|
1892
|
-
}
|
|
1893
|
-
return container;
|
|
1894
|
-
};
|
|
1895
|
-
/**
|
|
1896
|
-
* Returns the child nodes that belong to the default slot of an
|
|
1897
|
-
* option element, excluding any nodes that are assigned to named
|
|
1898
|
-
* slots.
|
|
1899
|
-
*
|
|
1900
|
-
* @param option - The `ion-select-option` element to extract default-slot nodes from.
|
|
1901
|
-
* @returns An array of default slot nodes, or `null` if none are found.
|
|
1902
|
-
*/
|
|
1903
|
-
const getOptionDefaultSlot = (option) => {
|
|
1904
|
-
const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
|
|
1905
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1906
|
-
return !node.hasAttribute('slot');
|
|
1907
|
-
}
|
|
1908
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1909
|
-
});
|
|
1910
|
-
if (defaultSlotNodes.length === 0) {
|
|
1911
|
-
return null;
|
|
1912
|
-
}
|
|
1913
|
-
return defaultSlotNodes;
|
|
1914
|
-
};
|
|
1915
|
-
/**
|
|
1916
|
-
* Extracts plain text from only the default slot of an option,
|
|
1917
|
-
* excluding content assigned to named slots (start/end).
|
|
1918
|
-
*/
|
|
1919
|
-
const getDefaultSlotPlainText = (option) => {
|
|
1920
|
-
const texts = Array.from(option.childNodes)
|
|
1921
|
-
.filter((node) => {
|
|
1922
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1923
|
-
return !node.hasAttribute('slot');
|
|
1924
|
-
}
|
|
1925
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1926
|
-
})
|
|
1927
|
-
.filter((node) => node.nodeType === Node.TEXT_NODE)
|
|
1928
|
-
.map((n) => n.textContent?.trim())
|
|
1929
|
-
.filter((t) => t);
|
|
1930
|
-
return texts.join(' ');
|
|
1931
|
-
};
|
|
1932
|
-
/**
|
|
1933
|
-
* Extracts the rich content from an `ion-select-option`.
|
|
1934
|
-
* When `customHTMLEnabled` is `false`, only the plain text from the
|
|
1935
|
-
* default slot is read and the start and end slots are skipped.
|
|
1936
|
-
*
|
|
1937
|
-
* @param option - The `ion-select-option` element to extract content from.
|
|
1938
|
-
* @param customHTMLEnabled - Whether custom HTML rendering is enabled
|
|
1939
|
-
* via the `innerHTMLTemplatesEnabled` config.
|
|
1940
|
-
*/
|
|
1941
|
-
const extractOptionContent = (option, customHTMLEnabled) => {
|
|
1942
|
-
if (!customHTMLEnabled) {
|
|
1943
|
-
return {
|
|
1944
|
-
content: getDefaultSlotPlainText(option),
|
|
1945
|
-
startContent: undefined,
|
|
1946
|
-
endContent: undefined,
|
|
1947
|
-
};
|
|
1948
|
-
}
|
|
1949
|
-
return {
|
|
1950
|
-
content: getOptionContent(option),
|
|
1951
|
-
startContent: getOptionContent(option, 'start') ?? undefined,
|
|
1952
|
-
endContent: getOptionContent(option, 'end') ?? undefined,
|
|
1953
|
-
};
|
|
1537
|
+
return selectOpt ? selectOpt.textContent : null;
|
|
1954
1538
|
};
|
|
1955
1539
|
let selectIds = 0;
|
|
1956
1540
|
const OPTION_CLASS = 'select-interface-option';
|