voyager-ionic-core 8.8.12 → 9.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/index.js +1 -1
- package/components/ion-accordion-group.js +1 -1
- package/components/ion-accordion.js +1 -1
- package/components/ion-action-sheet.js +1 -1
- package/components/ion-alert.js +1 -1
- package/components/ion-app.js +1 -1
- package/components/ion-avatar.js +1 -1
- package/components/ion-back-button.js +1 -1
- package/components/ion-backdrop.js +1 -1
- package/components/ion-badge.js +1 -1
- package/components/ion-breadcrumb.js +1 -1
- package/components/ion-breadcrumbs.js +1 -1
- package/components/ion-button.js +1 -1
- package/components/ion-buttons.js +1 -1
- package/components/ion-card-content.js +1 -1
- package/components/ion-card-header.js +1 -1
- package/components/ion-card-subtitle.js +1 -1
- package/components/ion-card-title.js +1 -1
- package/components/ion-card.js +1 -1
- package/components/ion-checkbox.js +1 -1
- package/components/ion-chip.js +1 -1
- package/components/ion-col.js +1 -1
- package/components/ion-content.js +1 -1
- package/components/ion-datetime-button.js +1 -1
- package/components/ion-datetime.js +1 -1
- package/components/ion-fab-button.js +1 -1
- package/components/ion-fab-list.js +1 -1
- package/components/ion-fab.js +1 -1
- package/components/ion-footer.js +1 -1
- package/components/ion-grid.js +1 -1
- package/components/ion-header.js +1 -1
- package/components/ion-icon.js +1 -1
- package/components/ion-img.js +1 -1
- package/components/ion-infinite-scroll-content.js +1 -1
- package/components/ion-infinite-scroll.js +1 -1
- package/components/ion-input-otp.js +1 -1
- package/components/ion-input-password-toggle.js +1 -1
- package/components/ion-input.js +1 -1
- package/components/ion-item-divider.js +1 -1
- package/components/ion-item-group.js +1 -1
- package/components/ion-item-option.js +1 -1
- package/components/ion-item-options.js +1 -1
- package/components/ion-item-sliding.js +1 -1
- package/components/ion-item.js +1 -1
- package/components/ion-label.js +1 -1
- package/components/ion-list-header.js +1 -1
- package/components/ion-list.js +1 -1
- package/components/ion-loading.js +1 -1
- package/components/ion-menu-button.js +1 -1
- package/components/ion-menu-toggle.js +1 -1
- package/components/ion-menu.js +1 -1
- package/components/ion-modal.js +1 -1
- package/components/ion-nav-link.js +1 -1
- package/components/ion-nav.js +1 -1
- package/components/ion-note.js +1 -1
- package/components/ion-picker-column-option.js +1 -1
- package/components/ion-picker-column.js +1 -1
- package/components/ion-picker.js +1 -1
- package/components/ion-popover.js +1 -1
- package/components/ion-progress-bar.js +1 -1
- package/components/ion-radio-group.js +1 -1
- package/components/ion-radio.js +1 -1
- package/components/ion-range.js +1 -1
- package/components/ion-refresher-content.js +1 -1
- package/components/ion-refresher.js +1 -1
- package/components/ion-reorder-group.js +1 -1
- package/components/ion-reorder.js +1 -1
- package/components/ion-ripple-effect.js +1 -1
- package/components/ion-route-redirect.js +1 -1
- package/components/ion-route.js +1 -1
- package/components/ion-router-link.js +1 -1
- package/components/ion-router-outlet.js +1 -1
- package/components/ion-router.js +1 -1
- package/components/ion-row.js +1 -1
- package/components/ion-searchbar.js +1 -1
- package/components/ion-segment-button.js +1 -1
- package/components/ion-segment-content.js +1 -1
- package/components/ion-segment-view.js +1 -1
- package/components/ion-segment.js +1 -1
- package/components/ion-select-modal.js +1 -1
- package/components/ion-select-option.js +1 -1
- package/components/ion-select-popover.js +1 -1
- package/components/ion-select.js +1 -1
- package/components/ion-skeleton-text.js +1 -1
- package/components/ion-spinner.js +1 -1
- package/components/ion-split-pane.js +1 -1
- package/components/ion-tab-bar.js +1 -1
- package/components/ion-tab-button.js +1 -1
- package/components/ion-tab.js +1 -1
- package/components/ion-tabs.js +1 -1
- package/components/ion-text.js +1 -1
- package/components/ion-textarea.js +1 -1
- package/components/ion-thumbnail.js +1 -1
- package/components/ion-title.js +1 -1
- package/components/ion-toast.js +1 -1
- package/components/ion-toggle.js +1 -1
- package/components/ion-toolbar.js +1 -1
- package/components/p-1sJ0ZDPe.js +4 -0
- package/components/p-5ldEpNdG.js +4 -0
- package/components/p-6ZLn6K5e.js +4 -0
- package/components/p-B4lxwJ8N.js +4 -0
- package/components/{p-rCa2eL0j.js → p-BF48Oc0v.js} +1 -1
- package/components/p-BJr2B5hZ.js +4 -0
- package/components/p-BMPN55of.js +4 -0
- package/components/p-BNBnVi_1.js +4 -0
- package/components/{p-C4t5ymfq.js → p-BQyuFxYc.js} +1 -1
- package/components/p-BSQPZ79H.js +4 -0
- package/components/p-BT9-hMMz.js +4 -0
- package/components/p-BWoa-cki.js +4 -0
- package/components/p-BYJRZKHa.js +4 -0
- package/components/p-B_gJaBk0.js +4 -0
- package/components/p-BgkOsq-d.js +4 -0
- package/components/p-BhamHSw3.js +4 -0
- package/components/p-Bi-it1EH.js +4 -0
- package/components/p-C-NbvXu4.js +4 -0
- package/components/p-C0493tbX.js +4 -0
- package/components/p-C09TXohi.js +4 -0
- package/components/p-C4VpVfrJ.js +4 -0
- package/components/p-CEW4RXZO.js +4 -0
- package/components/p-CG_zZq_I.js +4 -0
- package/components/{p-B9jFTlwE.js → p-CJgnoKcN.js} +1 -1
- package/components/p-CMRYD_yR.js +4 -0
- package/components/{p-lE_JGpHD.js → p-CNLioZ3B.js} +1 -1
- package/components/{p--JUspHvy.js → p-COO0eJOA.js} +1 -1
- package/components/p-CWAks_S_.js +4 -0
- package/{dist/ionic/p-KjNvRoEp.js → components/p-Cd1WaN-0.js} +1 -1
- package/components/p-CqbGBmqb.js +4 -0
- package/components/p-CrAKlX71.js +4 -0
- package/components/p-Cw6WocLJ.js +4 -0
- package/components/p-D0YpjgON.js +4 -0
- package/components/{p-BirPFsRD.js → p-D5w_FlVa.js} +1 -1
- package/components/p-D7-vHX0A.js +4 -0
- package/components/p-D7wDJdFn.js +4 -0
- package/components/p-DFLJvuRK.js +4 -0
- package/components/p-DGPjJNOU.js +4 -0
- package/components/p-DJR0R0e1.js +4 -0
- package/components/p-DL13ieTa.js +4 -0
- package/components/{p-DqLB8yFQ.js → p-DM1gJSMP.js} +1 -1
- package/components/p-DMBiAyOR.js +4 -0
- package/components/p-DWCzVL3Y.js +4 -0
- package/components/p-DZRZic9C.js +4 -0
- package/components/{p-DNQI6d-L.js → p-DhNuxvJH.js} +1 -1
- package/components/p-DiuOa1vw.js +4 -0
- package/components/p-Dj40C8gm.js +4 -0
- package/components/p-Djmz-ssp.js +4 -0
- package/components/p-DnBNYc7u.js +4 -0
- package/components/p-DngGb-NV.js +4 -0
- package/components/p-Dojwmvde.js +4 -0
- package/components/p-DwSXbQSz.js +4 -0
- package/components/p-DxhHlJln.js +4 -0
- package/components/{p-DqZAXv2t.js → p-GGbIHyEF.js} +1 -1
- package/components/{p-j5IxBIan.js → p-Hp8t4RMX.js} +1 -1
- package/components/p-M34T2gyX.js +4 -0
- package/components/p-TWw4e4sO.js +4 -0
- package/components/{p-Cfx4M1Bn.js → p-YjMkHuvH.js} +1 -1
- package/components/p-byZM6qHV.js +4 -0
- package/components/p-cEN43Ahr.js +4 -0
- package/components/p-qAXsfUff.js +4 -0
- package/dist/cjs/{animation-BJq0kcy2.js → animation-Kd1N7WTN.js} +4 -4
- package/dist/cjs/{app-globals-BlqrqKTN.js → app-globals-b1G4t26O.js} +1 -1
- package/dist/cjs/{button-active-0mPOKmV2.js → button-active-CQCFubJJ.js} +3 -3
- package/dist/cjs/config-CjUbvdPW.js +36 -0
- package/dist/cjs/dir-zwDPRE5K.js +30 -0
- package/dist/cjs/{data-DLTUw-KF.js → format-bHU8N1g5.js} +48 -562
- package/dist/cjs/{framework-delegate-BtICZDHr.js → framework-delegate-d-fWfeI6.js} +5 -7
- package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-CeJslptU.js} +1 -2
- package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
- package/dist/cjs/{hardware-back-button-iUuF_76h.js → hardware-back-button-Bu4Dzw8l.js} +4 -4
- package/dist/cjs/{helpers-Cv23MFHM.js → helpers-7wzdhdeg.js} +15 -11
- package/dist/cjs/index-BbqUBe2T.js +429 -0
- package/dist/cjs/{index-D81eLYUM.js → index-C74Q3t6a.js} +3 -2
- package/dist/cjs/{index-BERfRao3.js → index-CQfEIyLK.js} +5 -5
- package/dist/cjs/{index-aC4x3Fk3.js → index-DFNrCX7M.js} +6 -7
- package/dist/cjs/{index-CAvQ7Tka.js → index-DRPqwSvU.js} +13 -30
- package/dist/cjs/{index-Ct7gcRif.js → index-DXoo08JC.js} +321 -26
- package/dist/cjs/{index-CIrkNXqJ.js → index-DtvKGwdh.js} +34 -2
- package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
- package/dist/cjs/index.cjs.js +19 -18
- package/dist/cjs/{input-shims-CFLg7uzj.js → input-shims-VJIiKBKv.js} +10 -11
- package/dist/cjs/input.utils-EHVE2RK_.js +35 -0
- package/dist/cjs/ion-accordion_2.cjs.entry.js +12 -12
- package/dist/cjs/ion-action-sheet.cjs.entry.js +92 -44
- package/dist/cjs/ion-alert.cjs.entry.js +144 -65
- package/dist/cjs/ion-app_8.cjs.entry.js +112 -40
- package/dist/cjs/ion-avatar_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-back-button.cjs.entry.js +6 -5
- package/dist/cjs/ion-backdrop.cjs.entry.js +2 -2
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +8 -7
- package/dist/cjs/ion-button_2.cjs.entry.js +18 -10
- package/dist/cjs/ion-card_5.cjs.entry.js +6 -5
- package/dist/cjs/ion-checkbox.cjs.entry.js +25 -12
- package/dist/cjs/ion-chip.cjs.entry.js +3 -3
- package/dist/cjs/ion-col_3.cjs.entry.js +10 -6
- package/dist/cjs/ion-datetime-button.cjs.entry.js +29 -30
- package/dist/cjs/{ion-datetime_3.cjs.entry.js → ion-datetime.cjs.entry.js} +773 -796
- package/dist/cjs/ion-fab_3.cjs.entry.js +93 -14
- package/dist/cjs/ion-img.cjs.entry.js +7 -4
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +8 -6
- package/dist/cjs/ion-input-otp.cjs.entry.js +20 -29
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +9 -10
- package/dist/cjs/ion-input.cjs.entry.js +58 -70
- package/dist/cjs/ion-item-option_3.cjs.entry.js +21 -24
- package/dist/cjs/ion-item_8.cjs.entry.js +117 -33
- package/dist/cjs/ion-loading.cjs.entry.js +29 -15
- package/dist/cjs/ion-menu_3.cjs.entry.js +23 -24
- package/dist/cjs/ion-modal.cjs.entry.js +307 -159
- package/dist/cjs/ion-nav_2.cjs.entry.js +30 -138
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +8 -13
- package/dist/cjs/ion-picker-column.cjs.entry.js +218 -62
- package/dist/cjs/ion-picker.cjs.entry.js +4 -4
- package/dist/cjs/ion-popover.cjs.entry.js +50 -30
- package/dist/cjs/ion-progress-bar.cjs.entry.js +6 -5
- package/dist/cjs/ion-radio_2.cjs.entry.js +24 -14
- package/dist/cjs/ion-range.cjs.entry.js +30 -25
- package/dist/cjs/ion-refresher_2.cjs.entry.js +61 -26
- package/dist/cjs/ion-reorder_2.cjs.entry.js +10 -9
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +3 -3
- package/dist/cjs/ion-route_4.cjs.entry.js +36 -30
- package/dist/cjs/ion-searchbar.cjs.entry.js +27 -22
- package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment-view.cjs.entry.js +5 -6
- package/dist/cjs/ion-segment_2.cjs.entry.js +30 -26
- package/dist/cjs/ion-select-modal.cjs.entry.js +93 -38
- package/dist/cjs/ion-select_3.cjs.entry.js +495 -125
- package/dist/cjs/ion-spinner.cjs.entry.js +5 -6
- package/dist/cjs/ion-split-pane.cjs.entry.js +4 -4
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +15 -12
- package/dist/cjs/ion-tab_2.cjs.entry.js +26 -19
- package/dist/cjs/ion-text.cjs.entry.js +5 -5
- package/dist/cjs/ion-textarea.cjs.entry.js +56 -65
- package/dist/cjs/ion-toast.cjs.entry.js +26 -21
- package/dist/cjs/ion-toggle.cjs.entry.js +36 -15
- package/dist/cjs/{ionic-global-B-cA6LkY.js → ionic-global-CYJNT-2P.js} +13 -8
- package/dist/cjs/ionic.cjs.js +5 -5
- package/dist/cjs/{ios.transition-BOSWOaiK.js → ios.transition-DYGiD6gM.js} +14 -17
- package/dist/cjs/item-multiple-inputs-Dv6qrMhm.js +38 -0
- package/dist/cjs/{keyboard-hHzlEQpk.js → keyboard-Cix5TVkD.js} +2 -2
- package/dist/cjs/{keyboard-UuAS4D_9.js → keyboard-cHxZlTyz.js} +2 -2
- package/dist/cjs/{keyboard-controller-GXBiBRKS.js → keyboard-controller-PtZoN2GS.js} +6 -6
- package/dist/cjs/loader.cjs.js +4 -4
- package/dist/cjs/{md.transition-B8-wBZqt.js → md.transition-CrSkaoz6.js} +8 -8
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
- package/dist/cjs/{overlays-TbKsuC-K.js → overlays-BR21NUIG.js} +120 -57
- package/dist/cjs/select-option-render-CrbLc-1j.js +123 -0
- package/dist/cjs/slot-mutation-controller-D6IjSEIh.js +397 -0
- package/dist/cjs/{status-tap-BXX8H8_Y.js → status-tap-CNP5eD1R.js} +4 -3
- package/dist/cjs/{swipe-back-CCMaNiP2.js → swipe-back-CSIJQfu5.js} +5 -5
- package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
- package/dist/collection/collection-manifest.json +7 -11
- package/dist/collection/components/accordion/accordion.js +5 -6
- package/dist/collection/components/accordion-group/accordion-group.js +2 -2
- package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
- package/dist/collection/components/action-sheet/action-sheet.js +77 -31
- package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
- package/dist/collection/components/alert/alert.ios.css +279 -10
- package/dist/collection/components/alert/alert.js +127 -50
- package/dist/collection/components/alert/alert.md.css +268 -20
- package/dist/collection/components/breadcrumb/breadcrumb.js +1 -1
- package/dist/collection/components/breadcrumbs/breadcrumbs.js +1 -1
- package/dist/collection/components/button/button.js +11 -4
- package/dist/collection/components/card/card.js +1 -1
- package/dist/collection/components/checkbox/checkbox.ios.css +18 -0
- package/dist/collection/components/checkbox/checkbox.js +19 -8
- package/dist/collection/components/checkbox/checkbox.md.css +18 -0
- package/dist/collection/components/col/col.js +7 -3
- package/dist/collection/components/content/content.js +56 -6
- package/dist/collection/components/datetime/datetime.ios.css +42 -2
- package/dist/collection/components/datetime/datetime.js +193 -79
- package/dist/collection/components/datetime/datetime.md.css +42 -1
- package/dist/collection/components/datetime/utils/data.js +13 -14
- package/dist/collection/components/datetime/utils/format.js +21 -11
- 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 +8 -2
- package/dist/collection/components/datetime/utils/validate.js +4 -5
- package/dist/collection/components/datetime-button/datetime-button.ios.css +5 -0
- package/dist/collection/components/datetime-button/datetime-button.js +21 -25
- package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
- package/dist/collection/components/fab-button/fab-button.js +114 -10
- package/dist/collection/components/footer/footer.js +1 -1
- package/dist/collection/components/header/header.js +2 -2
- package/dist/collection/components/img/img.js +6 -1
- package/dist/collection/components/input/input.ios.css +57 -26
- package/dist/collection/components/input/input.js +51 -64
- package/dist/collection/components/input/input.md.css +79 -43
- package/dist/collection/components/input-otp/input-otp.js +15 -24
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +5 -6
- package/dist/collection/components/item/item.ios.css +11 -0
- package/dist/collection/components/item/item.js +99 -15
- package/dist/collection/components/item/item.md.css +11 -0
- package/dist/collection/components/item-divider/item-divider.js +2 -2
- package/dist/collection/components/item-group/item-group.js +1 -1
- package/dist/collection/components/item-option/item-option.js +2 -2
- package/dist/collection/components/item-options/item-options.js +1 -1
- package/dist/collection/components/item-sliding/item-sliding.js +12 -16
- package/dist/collection/components/label/label.js +2 -2
- package/dist/collection/components/list/list.js +2 -2
- package/dist/collection/components/list-header/list-header.js +2 -2
- package/dist/collection/components/loading/loading.js +17 -5
- package/dist/collection/components/menu/menu.js +6 -8
- package/dist/collection/components/menu-button/menu-button.js +2 -2
- package/dist/collection/components/menu-toggle/menu-toggle.js +2 -2
- 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 +47 -32
- package/dist/collection/components/modal/gestures/swipe-to-close.js +23 -33
- package/dist/collection/components/modal/gestures/utils.js +17 -0
- package/dist/collection/components/modal/modal.ios.css +8 -0
- package/dist/collection/components/modal/modal.js +158 -65
- package/dist/collection/components/modal/modal.md.css +8 -0
- package/dist/collection/components/modal/safe-area-utils.js +39 -5
- package/dist/collection/components/nav/nav.js +24 -235
- package/dist/collection/components/nav-link/nav-link.js +1 -1
- package/dist/collection/components/note/note.js +2 -2
- package/dist/collection/components/picker/picker.js +1 -2
- package/dist/collection/components/picker-column/picker-column.css +3 -0
- package/dist/collection/components/picker-column/picker-column.js +212 -58
- package/dist/collection/components/picker-column-option/picker-column-option.js +3 -10
- package/dist/collection/components/picker-column-option/picker-column-option.md.css +6 -1
- package/dist/collection/components/popover/animations/ios.enter.js +1 -2
- package/dist/collection/components/popover/animations/md.enter.js +1 -2
- package/dist/collection/components/popover/popover.ios.css +15 -0
- package/dist/collection/components/popover/popover.js +32 -9
- package/dist/collection/components/popover/popover.md.css +15 -0
- package/dist/collection/components/popover/utils.js +4 -6
- package/dist/collection/components/progress-bar/progress-bar.js +1 -1
- package/dist/collection/components/radio/radio.ios.css +11 -15
- package/dist/collection/components/radio/radio.js +17 -9
- package/dist/collection/components/radio/radio.md.css +11 -11
- package/dist/collection/components/radio-group/radio-group.js +2 -2
- package/dist/collection/components/range/range.js +24 -19
- package/dist/collection/components/refresher/refresher.js +49 -16
- package/dist/collection/components/refresher-content/refresher-content.js +1 -1
- package/dist/collection/components/reorder/reorder.js +1 -1
- package/dist/collection/components/reorder-group/reorder-group.js +1 -1
- package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
- package/dist/collection/components/route/route.js +1 -1
- package/dist/collection/components/router/router.js +2 -6
- package/dist/collection/components/router/utils/dom.js +25 -7
- package/dist/collection/components/router/utils/matching.js +6 -9
- package/dist/collection/components/router/utils/parser.js +1 -1
- package/dist/collection/components/router/utils/path.js +0 -1
- package/dist/collection/components/router-link/router-link.js +2 -2
- package/dist/collection/components/router-outlet/router-outlet.js +49 -10
- package/dist/collection/components/row/row.js +1 -1
- package/dist/collection/components/searchbar/searchbar.js +25 -20
- package/dist/collection/components/segment/segment.js +9 -11
- package/dist/collection/components/segment-button/segment-button.js +15 -9
- package/dist/collection/components/segment-content/segment-content.js +1 -1
- package/dist/collection/components/segment-view/segment-view.js +3 -4
- package/dist/collection/components/select/select.ios.css +96 -69
- package/dist/collection/components/select/select.js +405 -91
- package/dist/collection/components/select/select.md.css +118 -85
- package/dist/collection/components/select-modal/select-modal.ios.css +218 -0
- package/dist/collection/components/select-modal/select-modal.js +80 -27
- package/dist/collection/components/select-modal/select-modal.md.css +164 -0
- package/dist/collection/components/select-option/select-option.js +67 -3
- package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
- package/dist/collection/components/select-popover/select-popover.js +78 -26
- package/dist/collection/components/select-popover/select-popover.md.css +164 -0
- package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
- package/dist/collection/components/spinner/spinner.js +2 -3
- package/dist/collection/components/split-pane/split-pane.js +2 -2
- package/dist/collection/components/tab/tab.js +20 -13
- package/dist/collection/components/tab-bar/tab-bar.js +2 -2
- package/dist/collection/components/tab-button/tab-button.js +6 -4
- package/dist/collection/components/tabs/tabs.js +2 -3
- package/dist/collection/components/text/text.js +2 -2
- package/dist/collection/components/textarea/textarea.ios.css +94 -62
- package/dist/collection/components/textarea/textarea.js +47 -57
- package/dist/collection/components/textarea/textarea.md.css +103 -77
- package/dist/collection/components/thumbnail/thumbnail.js +1 -1
- package/dist/collection/components/title/title.js +2 -2
- package/dist/collection/components/toast/toast.js +12 -9
- package/dist/collection/components/toggle/toggle.ios.css +12 -4
- package/dist/collection/components/toggle/toggle.js +27 -7
- package/dist/collection/components/toggle/toggle.md.css +42 -5
- package/dist/collection/components/toolbar/toolbar.js +7 -4
- package/dist/collection/global/config.js +3 -3
- package/dist/collection/global/ionic-global.js +8 -2
- package/dist/collection/index.js +1 -1
- package/dist/collection/utils/animation/animation.js +3 -3
- package/dist/collection/utils/config.js +5 -4
- 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/forms/index.js +2 -0
- package/dist/collection/utils/forms/item-multiple-inputs.js +33 -0
- package/dist/collection/utils/forms/start-container-controller.js +132 -0
- package/dist/collection/utils/framework-delegate.js +4 -6
- package/dist/collection/utils/gesture/gesture-controller.js +1 -2
- package/dist/collection/utils/gesture/index.js +10 -2
- 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 +4 -5
- package/dist/collection/utils/input-shims/hacks/scroll-data.js +1 -2
- 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 +23 -4
- package/dist/collection/utils/menu-controller/index.js +1 -2
- package/dist/collection/utils/native/haptic.js +2 -3
- package/dist/collection/utils/native/keyboard.js +2 -2
- package/dist/collection/utils/native/status-bar.js +1 -1
- package/dist/collection/utils/overlay-control-label.js +45 -0
- package/dist/collection/utils/overlays.js +109 -47
- package/dist/collection/utils/platform.js +4 -5
- package/dist/collection/utils/rtl/dir.js +17 -7
- package/dist/collection/utils/sanitization/index.js +275 -20
- package/dist/collection/utils/select-option-render.js +118 -0
- package/dist/collection/utils/slot-mutation-controller.js +1 -2
- package/dist/collection/utils/test/late-props/late-props.js +69 -0
- package/dist/collection/utils/test/playwright/apply-keyboard-focus.js +25 -0
- package/dist/collection/utils/test/playwright/detach-reattach.js +23 -0
- package/dist/collection/utils/test/playwright/drag-element.js +14 -0
- package/dist/collection/utils/test/playwright/generator.js +3 -4
- package/dist/collection/utils/test/playwright/index.js +2 -0
- package/dist/collection/utils/test/playwright/page/event-spy.js +2 -4
- package/dist/collection/utils/test/playwright/page/utils/goto.js +4 -5
- 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 +2 -3
- package/dist/collection/utils/test/press-keys.js +6 -16
- package/dist/collection/utils/theme.js +6 -1
- package/dist/collection/utils/transition/ios.transition.js +9 -13
- package/dist/collection/utils/transition/md.transition.js +3 -4
- package/dist/docs.json +972 -1402
- package/dist/esm/{animation-DLJpuoEz.js → animation-BFNVlYum.js} +4 -4
- package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-BgX0BGL1.js} +1 -1
- package/dist/esm/{button-active-BSpTQmS9.js → button-active-BfOvDr3b.js} +3 -3
- package/dist/esm/config-DWCzVL3Y.js +32 -0
- package/dist/esm/dir-Dojwmvde.js +28 -0
- package/dist/esm/{data-DZI70dKr.js → format-DDFE9jM5.js} +41 -554
- package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate-BwNhx9NR.js} +5 -7
- package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-B_gJaBk0.js} +1 -2
- package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
- package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-DmkiRgOT.js} +4 -4
- package/dist/esm/{helpers-HEqiOzXb.js → helpers-BSmc0nst.js} +15 -11
- package/dist/esm/{index-CfgBF1SE.js → index-BmLuEdV7.js} +13 -30
- package/dist/esm/{index-Q6UPU0Ay.js → index-BuPaALjU.js} +6 -7
- package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
- package/dist/esm/{index-MEDq2S8l.js → index-C1b9CLFg.js} +33 -3
- package/dist/esm/{index-tcQvqkiX.js → index-C23AVPx9.js} +303 -26
- package/dist/esm/{index-BRHzoo00.js → index-CJln0gS3.js} +3 -2
- package/dist/esm/index-CqoUoxgG.js +423 -0
- package/dist/esm/{index-B_dQk_WE.js → index-DnA_7Bnx.js} +5 -5
- package/dist/esm/index.js +17 -15
- package/dist/esm/{input-shims-D10mwcw1.js → input-shims-Dqk-Ou25.js} +10 -11
- package/dist/esm/input.utils-rqoH22pW.js +33 -0
- package/dist/esm/ion-accordion_2.entry.js +12 -12
- package/dist/esm/ion-action-sheet.entry.js +92 -44
- package/dist/esm/ion-alert.entry.js +143 -64
- package/dist/esm/ion-app_8.entry.js +112 -40
- package/dist/esm/ion-avatar_3.entry.js +4 -4
- package/dist/esm/ion-back-button.entry.js +6 -5
- package/dist/esm/ion-backdrop.entry.js +2 -2
- package/dist/esm/ion-breadcrumb_2.entry.js +8 -7
- package/dist/esm/ion-button_2.entry.js +18 -10
- package/dist/esm/ion-card_5.entry.js +6 -5
- package/dist/esm/ion-checkbox.entry.js +25 -12
- package/dist/esm/ion-chip.entry.js +3 -3
- package/dist/esm/ion-col_3.entry.js +10 -6
- package/dist/esm/ion-datetime-button.entry.js +28 -29
- package/dist/esm/{ion-datetime_3.entry.js → ion-datetime.entry.js} +712 -733
- package/dist/esm/ion-fab_3.entry.js +93 -14
- package/dist/esm/ion-img.entry.js +7 -4
- package/dist/esm/ion-infinite-scroll_2.entry.js +7 -5
- package/dist/esm/ion-input-otp.entry.js +20 -29
- package/dist/esm/ion-input-password-toggle.entry.js +9 -10
- package/dist/esm/ion-input.entry.js +56 -68
- package/dist/esm/ion-item-option_3.entry.js +21 -24
- package/dist/esm/ion-item_8.entry.js +117 -33
- package/dist/esm/ion-loading.entry.js +28 -14
- package/dist/esm/ion-menu_3.entry.js +23 -24
- package/dist/esm/ion-modal.entry.js +295 -147
- package/dist/esm/ion-nav_2.entry.js +30 -138
- package/dist/esm/ion-picker-column-option.entry.js +8 -13
- package/dist/esm/ion-picker-column.entry.js +218 -62
- package/dist/esm/ion-picker.entry.js +4 -4
- package/dist/esm/ion-popover.entry.js +50 -30
- package/dist/esm/ion-progress-bar.entry.js +6 -5
- package/dist/esm/ion-radio_2.entry.js +24 -14
- package/dist/esm/ion-range.entry.js +30 -25
- package/dist/esm/ion-refresher_2.entry.js +59 -24
- package/dist/esm/ion-reorder_2.entry.js +10 -9
- package/dist/esm/ion-ripple-effect.entry.js +3 -3
- package/dist/esm/ion-route_4.entry.js +36 -30
- package/dist/esm/ion-searchbar.entry.js +27 -22
- package/dist/esm/ion-segment-content.entry.js +2 -2
- package/dist/esm/ion-segment-view.entry.js +5 -6
- package/dist/esm/ion-segment_2.entry.js +30 -26
- package/dist/esm/ion-select-modal.entry.js +93 -38
- package/dist/esm/ion-select_3.entry.js +495 -125
- package/dist/esm/ion-spinner.entry.js +5 -6
- package/dist/esm/ion-split-pane.entry.js +4 -4
- package/dist/esm/ion-tab-bar_2.entry.js +15 -12
- package/dist/esm/ion-tab_2.entry.js +26 -19
- package/dist/esm/ion-text.entry.js +5 -5
- package/dist/esm/ion-textarea.entry.js +55 -64
- package/dist/esm/ion-toast.entry.js +25 -20
- package/dist/esm/ion-toggle.entry.js +36 -15
- package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-ZXjCXKH0.js} +13 -8
- package/dist/esm/ionic.js +6 -6
- package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-CWAgfQ1r.js} +14 -17
- package/dist/esm/item-multiple-inputs-DZnIiOO_.js +36 -0
- package/dist/esm/{keyboard-ywgs5efA.js → keyboard-Cj8mLJeq.js} +2 -2
- package/dist/esm/{keyboard-CUw4ekVy.js → keyboard-DAF8GNJ9.js} +2 -2
- package/dist/esm/{keyboard-controller-BaaVITYt.js → keyboard-controller-DEwoa1ev.js} +6 -6
- package/dist/esm/loader.js +5 -5
- package/dist/esm/{md.transition-D0msQmzI.js → md.transition-ZuqDDdDW.js} +8 -8
- package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
- package/dist/esm/{overlays-TbiM4mdr.js → overlays-DKE0DgvE.js} +119 -57
- package/dist/esm/select-option-render-1W6W9pbC.js +121 -0
- package/dist/esm/slot-mutation-controller-B5NpUZ-N.js +393 -0
- package/dist/esm/{status-tap-Kan2W7sh.js → status-tap-Cv9gb3ja.js} +4 -3
- package/dist/esm/{swipe-back-ZUWwA-KF.js → swipe-back-De5HlmeM.js} +5 -5
- package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
- package/dist/html.html-data.json +58 -82
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-06c6b540.entry.js +4 -0
- package/dist/ionic/p-099b7f9f.entry.js +4 -0
- package/dist/ionic/p-0dcb7bb6.entry.js +4 -0
- package/dist/ionic/p-1347880c.entry.js +4 -0
- package/dist/ionic/p-191a651e.entry.js +4 -0
- package/dist/ionic/p-1f24cb24.entry.js +4 -0
- package/dist/ionic/p-271c3640.entry.js +4 -0
- package/dist/ionic/p-2c52fe3e.entry.js +4 -0
- package/dist/ionic/p-2ea4bb36.entry.js +4 -0
- package/dist/ionic/p-338a02e0.entry.js +4 -0
- package/dist/ionic/p-38b9375b.entry.js +4 -0
- package/dist/ionic/p-3bba83ee.entry.js +4 -0
- package/dist/ionic/p-4712a8a9.entry.js +4 -0
- package/dist/ionic/p-4c3e50f8.entry.js +4 -0
- package/dist/ionic/p-4e2fef42.entry.js +4 -0
- package/dist/ionic/p-54cbb0a7.entry.js +4 -0
- package/dist/ionic/{p-2bb2cb18.entry.js → p-561af487.entry.js} +1 -1
- package/dist/ionic/p-5906ea6f.entry.js +4 -0
- package/dist/ionic/p-5cc09b40.entry.js +4 -0
- package/dist/ionic/p-5d9094ac.entry.js +4 -0
- package/dist/ionic/p-612ea3b1.entry.js +4 -0
- package/dist/ionic/p-66f150ec.entry.js +4 -0
- package/dist/ionic/p-68cc89a6.entry.js +4 -0
- package/dist/ionic/{p-dfa8d673.entry.js → p-6e386853.entry.js} +1 -1
- package/dist/ionic/p-77c96e08.entry.js +4 -0
- package/dist/ionic/p-7bfeccb3.entry.js +4 -0
- package/dist/ionic/p-7e394cc3.entry.js +4 -0
- package/dist/ionic/{p-0fa9c382.entry.js → p-7fbb3319.entry.js} +1 -1
- package/dist/ionic/p-837db1b9.entry.js +4 -0
- package/dist/ionic/p-85599fe3.entry.js +4 -0
- package/dist/ionic/p-8b80d9f9.entry.js +4 -0
- package/dist/ionic/p-90f50a65.entry.js +4 -0
- package/dist/ionic/p-9595e305.entry.js +4 -0
- package/dist/ionic/p-9c5f2691.entry.js +4 -0
- package/dist/ionic/p-BMPN55of.js +4 -0
- package/dist/ionic/p-BSQPZ79H.js +4 -0
- package/dist/ionic/p-BY6BzzPF.js +4 -0
- package/dist/ionic/p-B_gJaBk0.js +4 -0
- package/dist/ionic/p-BaeKWZ-a.js +4 -0
- package/dist/ionic/p-Bd72UYI2.js +4 -0
- package/dist/ionic/p-BgOvhHy_.js +4 -0
- package/dist/ionic/p-BhamHSw3.js +4 -0
- package/dist/ionic/p-BijjLYjT.js +4 -0
- package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
- package/dist/ionic/p-C23AVPx9.js +6 -0
- package/dist/ionic/p-C8XilMh0.js +4 -0
- package/dist/ionic/p-CER8qW8Y.js +4 -0
- package/dist/ionic/p-CFuOr1Tu.js +4 -0
- package/dist/ionic/p-CM5OBjTW.js +4 -0
- package/dist/ionic/p-CMZYmFb4.js +4 -0
- package/dist/ionic/p-CkxVYPtX.js +4 -0
- package/dist/ionic/p-CmXuiRT6.js +4 -0
- package/dist/ionic/p-D0YpjgON.js +4 -0
- package/dist/ionic/p-D4OrdtJf.js +4 -0
- package/dist/ionic/p-D5t_-oMk.js +4 -0
- package/dist/ionic/p-D6rHcCvc.js +4 -0
- package/dist/ionic/p-DLM95R4x.js +4 -0
- package/dist/ionic/p-DTxBioUO.js +4 -0
- package/dist/ionic/p-DWCzVL3Y.js +4 -0
- package/dist/ionic/p-DYUjHcuH.js +4 -0
- package/dist/ionic/p-DZ6Hmc-8.js +4 -0
- package/dist/ionic/p-D_gb-kdd.js +4 -0
- package/dist/ionic/p-DajLgJ4d.js +4 -0
- package/dist/ionic/p-Do3zTvCA.js +4 -0
- package/dist/ionic/p-Dojwmvde.js +4 -0
- package/dist/ionic/p-T71k3C35.js +4 -0
- package/dist/ionic/p-a1cc2861.entry.js +4 -0
- package/dist/ionic/p-a20a2ebe.entry.js +4 -0
- package/dist/ionic/p-a8ff2489.entry.js +4 -0
- package/dist/ionic/p-b3532b8d.entry.js +4 -0
- package/dist/ionic/p-b80c86c4.entry.js +4 -0
- package/dist/ionic/p-b9b4e85d.entry.js +4 -0
- package/dist/ionic/p-byZM6qHV.js +4 -0
- package/dist/ionic/p-c57fc396.entry.js +4 -0
- package/dist/ionic/{p-c6e49f3f.entry.js → p-ca1b8865.entry.js} +1 -1
- package/dist/ionic/p-cc4320d3.entry.js +4 -0
- package/dist/ionic/p-d6755739.entry.js +4 -0
- package/dist/ionic/p-d8c138d9.entry.js +4 -0
- package/dist/ionic/p-db449915.entry.js +4 -0
- package/dist/ionic/p-dd01be0a.entry.js +4 -0
- package/dist/ionic/p-ec00fd0d.entry.js +4 -0
- package/dist/ionic/p-ee09ac9d.entry.js +4 -0
- package/dist/ionic/{p-37e720da.entry.js → p-efc0cf82.entry.js} +1 -1
- package/dist/ionic/p-f0fb23c1.entry.js +4 -0
- package/dist/ionic/p-f83b3e0c.entry.js +4 -0
- package/dist/ionic/p-fU3rOYad.js +4 -0
- package/dist/ionic/p-zWf7R2xV.js +4 -0
- package/dist/types/components/action-sheet/action-sheet.d.ts +10 -0
- package/dist/types/components/alert/alert.d.ts +7 -0
- package/dist/types/components/checkbox/checkbox.d.ts +1 -0
- package/dist/types/components/content/content.d.ts +12 -0
- package/dist/types/components/datetime/datetime.d.ts +13 -1
- package/dist/types/components/fab-button/fab-button.d.ts +15 -0
- package/dist/types/components/img/img.d.ts +2 -0
- package/dist/types/components/input/input.d.ts +12 -6
- package/dist/types/components/item/item.d.ts +19 -0
- package/dist/types/components/modal/gestures/sheet.d.ts +1 -0
- package/dist/types/components/modal/gestures/utils.d.ts +11 -0
- package/dist/types/components/modal/modal-interface.d.ts +9 -0
- package/dist/types/components/modal/modal.d.ts +25 -7
- package/dist/types/components/modal/safe-area-utils.d.ts +6 -0
- package/dist/types/components/nav/nav-interface.d.ts +0 -1
- package/dist/types/components/nav/nav.d.ts +2 -22
- package/dist/types/components/picker-column/picker-column.d.ts +42 -0
- package/dist/types/components/radio/radio.d.ts +1 -0
- package/dist/types/components/range/range.d.ts +4 -1
- package/dist/types/components/refresher/refresher.d.ts +7 -0
- package/dist/types/components/route/route.d.ts +1 -1
- package/dist/types/components/router-outlet/router-outlet.d.ts +7 -0
- package/dist/types/components/searchbar/searchbar.d.ts +1 -1
- package/dist/types/components/select/select-interface.d.ts +31 -0
- package/dist/types/components/select/select.d.ts +30 -6
- package/dist/types/components/select-option/select-option.d.ts +42 -1
- package/dist/types/components/tab/tab.d.ts +1 -1
- package/dist/types/components/textarea/textarea.d.ts +12 -5
- package/dist/types/components/toggle/toggle.d.ts +1 -0
- package/dist/types/components.d.ts +94 -318
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interface.d.ts +0 -1
- package/dist/types/stencil-public-runtime.d.ts +12 -0
- package/dist/types/utils/config.d.ts +1 -8
- package/dist/types/utils/content/index.d.ts +12 -0
- package/dist/types/utils/forms/index.d.ts +2 -0
- package/dist/types/utils/forms/item-multiple-inputs.d.ts +13 -0
- package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
- package/dist/types/utils/helpers.d.ts +8 -5
- package/dist/types/utils/logging/index.d.ts +2 -1
- package/dist/types/utils/overlay-control-label.d.ts +32 -0
- package/dist/types/utils/overlays.d.ts +20 -9
- package/dist/types/utils/rtl/dir.d.ts +10 -4
- package/dist/types/utils/sanitization/index.d.ts +58 -2
- package/dist/types/utils/select-option-render.d.ts +53 -0
- package/dist/types/utils/test/playwright/apply-keyboard-focus.d.ts +16 -0
- package/dist/types/utils/test/playwright/detach-reattach.d.ts +13 -0
- package/dist/types/utils/test/playwright/index.d.ts +2 -0
- 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 +3341 -2197
- package/hydrate/index.mjs +3341 -2197
- package/loader/index.d.ts +1 -1
- package/package.json +61 -17
- package/components/ion-picker-legacy-column.d.ts +0 -11
- package/components/ion-picker-legacy-column.js +0 -4
- package/components/ion-picker-legacy.d.ts +0 -11
- package/components/ion-picker-legacy.js +0 -4
- package/components/p-0NRupjzW.js +0 -4
- package/components/p-5bE_Wz4Y.js +0 -4
- package/components/p-B60hm8Qv.js +0 -4
- package/components/p-BAYYcg3o.js +0 -4
- package/components/p-BLmJ0zRm.js +0 -4
- package/components/p-BSEgsdFI.js +0 -4
- package/components/p-BTEOs1at.js +0 -4
- package/components/p-BTPfOxsU.js +0 -4
- package/components/p-BT_5jSqG.js +0 -4
- package/components/p-Baq1XyAy.js +0 -4
- package/components/p-BjfgFSSR.js +0 -4
- package/components/p-BjoEPDW5.js +0 -4
- package/components/p-BnqQlm7c.js +0 -4
- package/components/p-BsPelv04.js +0 -4
- package/components/p-Bth-EzJ0.js +0 -4
- package/components/p-Bz0dSlXZ.js +0 -4
- package/components/p-C1aScSTo.js +0 -4
- package/components/p-C2lKgrXx.js +0 -4
- package/components/p-C53feagD.js +0 -4
- package/components/p-CHqRYvYm.js +0 -4
- package/components/p-CI3ncNZm.js +0 -4
- package/components/p-CSZf8_j0.js +0 -4
- package/components/p-CU5rbWAW.js +0 -4
- package/components/p-C_xFdyXe.js +0 -4
- package/components/p-Ciz1-FuE.js +0 -4
- package/components/p-Cl0B-RWe.js +0 -4
- package/components/p-CmR5uXej.js +0 -4
- package/components/p-CtWGkNnJ.js +0 -4
- package/components/p-CtukzcyX.js +0 -4
- package/components/p-D13Eaw-8.js +0 -4
- package/components/p-D5Ubpm7D.js +0 -4
- package/components/p-D6Ynv7Xh.js +0 -4
- package/components/p-D7bSXQD3.js +0 -4
- package/components/p-DDWp95gH.js +0 -4
- package/components/p-DIE4pXMl.js +0 -4
- package/components/p-DOFCbuQR.js +0 -4
- package/components/p-DiVJyqlX.js +0 -4
- package/components/p-DnL1c9_X.js +0 -4
- package/components/p-W5nO8mX_.js +0 -4
- package/components/p-W9CZ2mWX.js +0 -4
- package/components/p-XlSIJDJ-.js +0 -4
- package/components/p-cyNmxje6.js +0 -4
- package/components/p-dhLYXa7A.js +0 -4
- package/components/p-ijF0iCrA.js +0 -4
- package/components/p-k_E4tX5Z.js +0 -4
- package/components/p-nQi4oKcG.js +0 -4
- package/components/p-ryqmO0B-.js +0 -4
- package/dist/cjs/config-xninhj0J.js +0 -201
- package/dist/cjs/dir-Cn0z1rJH.js +0 -20
- package/dist/cjs/input.utils-DetjmtH2.js +0 -150
- package/dist/cjs/notch-controller-18PzRGXd.js +0 -155
- package/dist/collection/components/picker-legacy/animations/ios.enter.js +0 -27
- package/dist/collection/components/picker-legacy/animations/ios.leave.js +0 -23
- package/dist/collection/components/picker-legacy/picker-interface.js +0 -1
- package/dist/collection/components/picker-legacy/picker.ios.css +0 -300
- package/dist/collection/components/picker-legacy/picker.js +0 -890
- package/dist/collection/components/picker-legacy/picker.md.css +0 -287
- package/dist/collection/components/picker-legacy-column/picker-column.ios.css +0 -231
- package/dist/collection/components/picker-legacy-column/picker-column.js +0 -422
- package/dist/collection/components/picker-legacy-column/picker-column.md.css +0 -222
- package/dist/collection/components/picker-legacy-column/test/test.utils.js +0 -43
- package/dist/esm/config-DQCONYYp.js +0 -195
- package/dist/esm/dir-C53feagD.js +0 -18
- package/dist/esm/input.utils-Y6NgW8bw.js +0 -147
- package/dist/esm/notch-controller-DKDjU_O7.js +0 -153
- package/dist/ionic/p-00dbb17e.entry.js +0 -4
- package/dist/ionic/p-01f81ea5.entry.js +0 -4
- package/dist/ionic/p-06c232a4.entry.js +0 -4
- package/dist/ionic/p-0d005398.entry.js +0 -4
- package/dist/ionic/p-1ae21e4c.entry.js +0 -4
- package/dist/ionic/p-20b1a044.entry.js +0 -4
- package/dist/ionic/p-21eb76d5.entry.js +0 -4
- package/dist/ionic/p-2394a9a6.entry.js +0 -4
- package/dist/ionic/p-27d30585.entry.js +0 -4
- package/dist/ionic/p-2f55dc1a.entry.js +0 -4
- package/dist/ionic/p-30bf9737.entry.js +0 -4
- package/dist/ionic/p-3353c229.entry.js +0 -4
- package/dist/ionic/p-33704f20.entry.js +0 -4
- package/dist/ionic/p-390ca786.entry.js +0 -4
- package/dist/ionic/p-3a126bca.entry.js +0 -4
- package/dist/ionic/p-3a541154.entry.js +0 -4
- package/dist/ionic/p-3a7d1e91.entry.js +0 -4
- package/dist/ionic/p-3ae5f277.entry.js +0 -4
- package/dist/ionic/p-4745f534.entry.js +0 -4
- package/dist/ionic/p-4858af1f.entry.js +0 -4
- package/dist/ionic/p-4baa5b82.entry.js +0 -4
- package/dist/ionic/p-4dc1c33c.entry.js +0 -4
- package/dist/ionic/p-4e92a11f.entry.js +0 -4
- package/dist/ionic/p-50e1194a.entry.js +0 -4
- package/dist/ionic/p-5d1da0a2.entry.js +0 -4
- package/dist/ionic/p-75dc25ba.entry.js +0 -4
- package/dist/ionic/p-81ea5652.entry.js +0 -4
- package/dist/ionic/p-84d5ce05.entry.js +0 -4
- package/dist/ionic/p-874b4bd8.entry.js +0 -4
- package/dist/ionic/p-8c8eee7d.entry.js +0 -4
- package/dist/ionic/p-8eb8ee76.entry.js +0 -4
- package/dist/ionic/p-8fce95d5.entry.js +0 -4
- package/dist/ionic/p-94f2a736.entry.js +0 -4
- package/dist/ionic/p-9a65ac7f.entry.js +0 -4
- package/dist/ionic/p-9eeaBrnk.js +0 -4
- package/dist/ionic/p-9f1103ce.entry.js +0 -4
- package/dist/ionic/p-BGqMS-oh.js +0 -4
- package/dist/ionic/p-BTEOs1at.js +0 -4
- package/dist/ionic/p-BUFIpxKM.js +0 -4
- package/dist/ionic/p-C53feagD.js +0 -4
- package/dist/ionic/p-CFlfIb2g.js +0 -4
- package/dist/ionic/p-CKvCXMs9.js +0 -4
- package/dist/ionic/p-Cl0B-RWe.js +0 -4
- package/dist/ionic/p-CtWGkNnJ.js +0 -4
- package/dist/ionic/p-CwdymDLH.js +0 -4
- package/dist/ionic/p-Cx3IXROA.js +0 -4
- package/dist/ionic/p-D13Eaw-8.js +0 -4
- package/dist/ionic/p-DAAFkPFT.js +0 -4
- package/dist/ionic/p-DC3RagnA.js +0 -4
- package/dist/ionic/p-DIuEbVLu.js +0 -4
- package/dist/ionic/p-DSG2s2Eb.js +0 -4
- package/dist/ionic/p-Dfbt-q2k.js +0 -4
- package/dist/ionic/p-DiVJyqlX.js +0 -4
- package/dist/ionic/p-DoJvtrbw.js +0 -4
- package/dist/ionic/p-DzWaWHGc.js +0 -4
- package/dist/ionic/p-Nqf6uvGh.js +0 -4
- package/dist/ionic/p-SNAkTDfm.js +0 -4
- package/dist/ionic/p-VAemlbDS.js +0 -4
- package/dist/ionic/p-Wk5HzclC.js +0 -4
- package/dist/ionic/p-a21add2f.entry.js +0 -4
- package/dist/ionic/p-a3bdcae6.entry.js +0 -4
- package/dist/ionic/p-aa5d6b8f.entry.js +0 -4
- package/dist/ionic/p-c0fb8edd.entry.js +0 -4
- package/dist/ionic/p-c4d8641b.entry.js +0 -4
- package/dist/ionic/p-e0be05c5.entry.js +0 -4
- package/dist/ionic/p-e847a888.entry.js +0 -4
- package/dist/ionic/p-ec090e0a.entry.js +0 -4
- package/dist/ionic/p-ef4c3bee.entry.js +0 -4
- package/dist/ionic/p-fabcce6c.entry.js +0 -4
- package/dist/ionic/p-facfde02.entry.js +0 -4
- package/dist/ionic/p-fd7eebc4.entry.js +0 -4
- package/dist/ionic/p-mjKAFv89.js +0 -4
- package/dist/ionic/p-tcQvqkiX.js +0 -5
- package/dist/ionic/p-viFHDgRs.js +0 -4
- package/dist/ionic/p-xOfi7-Zn.js +0 -4
- package/dist/ionic/p-xWb6fgfq.js +0 -4
- package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
- package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
- package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
- package/dist/types/components/picker-legacy/picker.d.ts +0 -158
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
- package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
- /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
|
@@ -2,14 +2,18 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { Build, Host, h, forceUpdate } from "@stencil/core";
|
|
5
|
-
import {
|
|
5
|
+
import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
|
|
6
|
+
import { compareOptions, createNotchController, createStartContainerController, isOptionSelected, checkInvalidState, } from "../../utils/forms/index";
|
|
6
7
|
import { focusVisibleElement, renderHiddenInput, inheritAttributes } from "../../utils/helpers";
|
|
7
8
|
import { printIonWarning } from "../../utils/logging/index";
|
|
8
9
|
import { actionSheetController, alertController, popoverController, modalController } from "../../utils/overlays";
|
|
9
10
|
import { isRTL } from "../../utils/rtl/index";
|
|
11
|
+
import { blockedTags, reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
|
|
12
|
+
import { createSlotMutationController } from "../../utils/slot-mutation-controller";
|
|
10
13
|
import { createColorClasses, hostContext } from "../../utils/theme";
|
|
11
14
|
import { watchForOptions } from "../../utils/watch-options";
|
|
12
15
|
import { caretDownSharp, chevronExpand } from "ionicons/icons";
|
|
16
|
+
import { config } from "../../global/config";
|
|
13
17
|
import { getIonMode } from "../../global/ionic-global";
|
|
14
18
|
// TODO(FW-2832): types
|
|
15
19
|
/**
|
|
@@ -29,7 +33,9 @@ import { getIonMode } from "../../global/ionic-global";
|
|
|
29
33
|
* @part error-text - Supporting text displayed beneath the select when the select is invalid and touched.
|
|
30
34
|
* @part bottom - The container element for helper text, error text, and counter.
|
|
31
35
|
* @part wrapper - The clickable label element that wraps the entire form field (label text, slots, selected values or placeholder, and toggle icons).
|
|
32
|
-
* @part
|
|
36
|
+
* @part start - The wrapper element for the content in the start slot.
|
|
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.
|
|
33
39
|
*/
|
|
34
40
|
export class Select {
|
|
35
41
|
constructor() {
|
|
@@ -37,6 +43,7 @@ export class Select {
|
|
|
37
43
|
this.helperTextId = `${this.inputId}-helper-text`;
|
|
38
44
|
this.errorTextId = `${this.inputId}-error-text`;
|
|
39
45
|
this.inheritedAttributes = {};
|
|
46
|
+
this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
|
|
40
47
|
this.isExpanded = false;
|
|
41
48
|
/**
|
|
42
49
|
* The `hasFocus` state ensures the focus class is
|
|
@@ -147,13 +154,13 @@ export class Select {
|
|
|
147
154
|
this.ionBlur.emit();
|
|
148
155
|
};
|
|
149
156
|
/**
|
|
150
|
-
* Stops propagation when
|
|
151
|
-
*
|
|
157
|
+
* Stops propagation for re-dispatched clicks (when already expanded) to
|
|
158
|
+
* prevent double-click events. Allows initial button clicks (from keyboard
|
|
159
|
+
* or mouse) and slotted content clicks to propagate so event delegation
|
|
160
|
+
* works for parent handlers.
|
|
152
161
|
*/
|
|
153
162
|
this.onLabelClick = (ev) => {
|
|
154
|
-
|
|
155
|
-
// and not on the input or other child elements
|
|
156
|
-
if (ev.target === ev.currentTarget) {
|
|
163
|
+
if (ev.target === this.focusEl && this.isExpanded) {
|
|
157
164
|
ev.stopPropagation();
|
|
158
165
|
}
|
|
159
166
|
};
|
|
@@ -162,12 +169,51 @@ export class Select {
|
|
|
162
169
|
this.emitStyle();
|
|
163
170
|
}
|
|
164
171
|
setValue(value) {
|
|
172
|
+
if (this.isValueEqual(this.value, value)) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
165
175
|
this.value = value;
|
|
166
176
|
this.ionChange.emit({ value });
|
|
167
177
|
}
|
|
178
|
+
isValueEqual(currentValue, newValue) {
|
|
179
|
+
if (this.multiple) {
|
|
180
|
+
const currentArr = Array.isArray(currentValue) ? currentValue : [];
|
|
181
|
+
const newArr = Array.isArray(newValue) ? newValue : [];
|
|
182
|
+
if (currentArr.length !== newArr.length) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
// Multiset compare: each new value must match a distinct current value.
|
|
186
|
+
// A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
|
|
187
|
+
// ['a','b'] when both 'a' and 'b' map to options whose values overlap.
|
|
188
|
+
const remaining = currentArr.slice();
|
|
189
|
+
return newArr.every((val) => {
|
|
190
|
+
const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
|
|
191
|
+
if (idx === -1) {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
remaining.splice(idx, 1);
|
|
195
|
+
return true;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (currentValue == null && newValue == null) {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
if (currentValue == null || newValue == null) {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
return compareOptions(currentValue, newValue, this.compareWith);
|
|
205
|
+
}
|
|
168
206
|
async connectedCallback() {
|
|
169
207
|
const { el } = this;
|
|
208
|
+
this.slotMutationController = createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
209
|
+
this.startContainerController?.calculateStartContainerWidth();
|
|
210
|
+
forceUpdate(this);
|
|
211
|
+
});
|
|
170
212
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
213
|
+
this.startContainerController = createStartContainerController(el, () => this.startContainerEl, () => {
|
|
214
|
+
return Build.isBrowser && getIonMode(this) === 'md' && this.fill === 'outline';
|
|
215
|
+
});
|
|
216
|
+
this.startContainerController.calculateStartContainerWidth();
|
|
171
217
|
this.updateOverlayOptions();
|
|
172
218
|
this.emitStyle();
|
|
173
219
|
this.mutationO = watchForOptions(this.el, 'ion-select-option', async () => {
|
|
@@ -239,10 +285,18 @@ export class Select {
|
|
|
239
285
|
this.mutationO.disconnect();
|
|
240
286
|
this.mutationO = undefined;
|
|
241
287
|
}
|
|
288
|
+
if (this.slotMutationController) {
|
|
289
|
+
this.slotMutationController.destroy();
|
|
290
|
+
this.slotMutationController = undefined;
|
|
291
|
+
}
|
|
242
292
|
if (this.notchController) {
|
|
243
293
|
this.notchController.destroy();
|
|
244
294
|
this.notchController = undefined;
|
|
245
295
|
}
|
|
296
|
+
if (this.startContainerController) {
|
|
297
|
+
this.startContainerController.destroy();
|
|
298
|
+
this.startContainerController = undefined;
|
|
299
|
+
}
|
|
246
300
|
// Clean up validation observer to prevent memory leaks.
|
|
247
301
|
if (this.validationObserver) {
|
|
248
302
|
this.validationObserver.disconnect();
|
|
@@ -399,10 +453,11 @@ export class Select {
|
|
|
399
453
|
.join(' ');
|
|
400
454
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
401
455
|
const isSelected = isOptionSelected(selectValue, value, this.compareWith);
|
|
456
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
402
457
|
return {
|
|
403
|
-
|
|
404
|
-
text: option.textContent,
|
|
458
|
+
text: content ?? '',
|
|
405
459
|
cssClass: optClass,
|
|
460
|
+
disabled: option.disabled,
|
|
406
461
|
handler: () => {
|
|
407
462
|
this.setValue(value);
|
|
408
463
|
},
|
|
@@ -410,6 +465,9 @@ export class Select {
|
|
|
410
465
|
'aria-checked': isSelected ? 'true' : 'false',
|
|
411
466
|
role: 'radio',
|
|
412
467
|
},
|
|
468
|
+
startContent,
|
|
469
|
+
endContent,
|
|
470
|
+
description: option.description,
|
|
413
471
|
};
|
|
414
472
|
});
|
|
415
473
|
// Add "cancel" button
|
|
@@ -430,13 +488,19 @@ export class Select {
|
|
|
430
488
|
.filter((cls) => cls !== 'hydrated')
|
|
431
489
|
.join(' ');
|
|
432
490
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
491
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
433
492
|
return {
|
|
434
493
|
type: inputType,
|
|
435
494
|
cssClass: optClass,
|
|
436
|
-
label:
|
|
495
|
+
label: content ?? '',
|
|
437
496
|
value,
|
|
438
497
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
439
498
|
disabled: option.disabled,
|
|
499
|
+
startContent,
|
|
500
|
+
endContent,
|
|
501
|
+
description: option.description,
|
|
502
|
+
labelPlacement: option.labelPlacement,
|
|
503
|
+
justify: option.justify,
|
|
440
504
|
};
|
|
441
505
|
});
|
|
442
506
|
return alertInputs;
|
|
@@ -449,8 +513,9 @@ export class Select {
|
|
|
449
513
|
.filter((cls) => cls !== 'hydrated')
|
|
450
514
|
.join(' ');
|
|
451
515
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
516
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
452
517
|
return {
|
|
453
|
-
text:
|
|
518
|
+
text: content ?? '',
|
|
454
519
|
cssClass: optClass,
|
|
455
520
|
value,
|
|
456
521
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
@@ -461,6 +526,11 @@ export class Select {
|
|
|
461
526
|
this.close();
|
|
462
527
|
}
|
|
463
528
|
},
|
|
529
|
+
startContent,
|
|
530
|
+
endContent,
|
|
531
|
+
description: option.description,
|
|
532
|
+
labelPlacement: option.labelPlacement,
|
|
533
|
+
justify: option.justify,
|
|
464
534
|
};
|
|
465
535
|
});
|
|
466
536
|
return popoverOptions;
|
|
@@ -489,28 +559,43 @@ export class Select {
|
|
|
489
559
|
*/
|
|
490
560
|
}
|
|
491
561
|
else {
|
|
492
|
-
event =
|
|
562
|
+
event = {
|
|
563
|
+
...ev,
|
|
564
|
+
detail: {
|
|
493
565
|
ionShadowTarget: this.nativeWrapperEl,
|
|
494
|
-
}
|
|
566
|
+
},
|
|
567
|
+
};
|
|
495
568
|
}
|
|
496
|
-
const
|
|
497
|
-
|
|
498
|
-
|
|
569
|
+
const options = this.createOverlaySelectOptions(this.childOpts, value);
|
|
570
|
+
const hasRichContent = options.some((opt) => Boolean(opt.startContent) || Boolean(opt.endContent) || Boolean(opt.description));
|
|
571
|
+
const popoverOpts = {
|
|
572
|
+
mode,
|
|
573
|
+
event,
|
|
574
|
+
alignment: 'center',
|
|
575
|
+
size,
|
|
576
|
+
showBackdrop,
|
|
577
|
+
...interfaceOptions,
|
|
578
|
+
component: 'ion-select-popover',
|
|
579
|
+
cssClass: [
|
|
580
|
+
'select-popover',
|
|
581
|
+
hasRichContent ? 'select-popover-rich-content' : undefined,
|
|
582
|
+
interfaceOptions.cssClass,
|
|
583
|
+
],
|
|
584
|
+
componentProps: {
|
|
499
585
|
header: interfaceOptions.header,
|
|
500
586
|
subHeader: interfaceOptions.subHeader,
|
|
501
587
|
message: interfaceOptions.message,
|
|
502
588
|
multiple,
|
|
503
589
|
value,
|
|
504
|
-
options
|
|
505
|
-
}
|
|
590
|
+
options,
|
|
591
|
+
},
|
|
592
|
+
};
|
|
506
593
|
/**
|
|
507
594
|
* Workaround for Stencil to autodefine
|
|
508
595
|
* ion-select-popover and ion-popover when
|
|
509
596
|
* using Custom Elements build.
|
|
510
597
|
*/
|
|
511
|
-
// eslint-disable-next-line
|
|
512
598
|
if (false) {
|
|
513
|
-
// eslint-disable-next-line
|
|
514
599
|
// @ts-ignore
|
|
515
600
|
document.createElement('ion-select-popover');
|
|
516
601
|
document.createElement('ion-popover');
|
|
@@ -520,15 +605,18 @@ export class Select {
|
|
|
520
605
|
async openActionSheet() {
|
|
521
606
|
const mode = getIonMode(this);
|
|
522
607
|
const interfaceOptions = this.interfaceOptions;
|
|
523
|
-
const actionSheetOpts =
|
|
608
|
+
const actionSheetOpts = {
|
|
609
|
+
mode,
|
|
610
|
+
...interfaceOptions,
|
|
611
|
+
buttons: this.createActionSheetButtons(this.childOpts, this.value),
|
|
612
|
+
cssClass: ['select-action-sheet', interfaceOptions.cssClass],
|
|
613
|
+
};
|
|
524
614
|
/**
|
|
525
615
|
* Workaround for Stencil to autodefine
|
|
526
616
|
* ion-action-sheet when
|
|
527
617
|
* using Custom Elements build.
|
|
528
618
|
*/
|
|
529
|
-
// eslint-disable-next-line
|
|
530
619
|
if (false) {
|
|
531
|
-
// eslint-disable-next-line
|
|
532
620
|
// @ts-ignore
|
|
533
621
|
document.createElement('ion-action-sheet');
|
|
534
622
|
}
|
|
@@ -538,7 +626,12 @@ export class Select {
|
|
|
538
626
|
const interfaceOptions = this.interfaceOptions;
|
|
539
627
|
const inputType = this.multiple ? 'checkbox' : 'radio';
|
|
540
628
|
const mode = getIonMode(this);
|
|
541
|
-
const alertOpts =
|
|
629
|
+
const alertOpts = {
|
|
630
|
+
mode,
|
|
631
|
+
...interfaceOptions,
|
|
632
|
+
header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
|
|
633
|
+
inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
|
|
634
|
+
buttons: [
|
|
542
635
|
{
|
|
543
636
|
text: this.cancelText,
|
|
544
637
|
role: 'cancel',
|
|
@@ -552,19 +645,19 @@ export class Select {
|
|
|
552
645
|
this.setValue(selectedValues);
|
|
553
646
|
},
|
|
554
647
|
},
|
|
555
|
-
],
|
|
648
|
+
],
|
|
649
|
+
cssClass: [
|
|
556
650
|
'select-alert',
|
|
557
651
|
interfaceOptions.cssClass,
|
|
558
652
|
this.multiple ? 'multiple-select-alert' : 'single-select-alert',
|
|
559
|
-
]
|
|
653
|
+
],
|
|
654
|
+
};
|
|
560
655
|
/**
|
|
561
656
|
* Workaround for Stencil to autodefine
|
|
562
657
|
* ion-alert when
|
|
563
658
|
* using Custom Elements build.
|
|
564
659
|
*/
|
|
565
|
-
// eslint-disable-next-line
|
|
566
660
|
if (false) {
|
|
567
|
-
// eslint-disable-next-line
|
|
568
661
|
// @ts-ignore
|
|
569
662
|
document.createElement('ion-alert');
|
|
570
663
|
}
|
|
@@ -573,21 +666,25 @@ export class Select {
|
|
|
573
666
|
openModal() {
|
|
574
667
|
const { multiple, value, interfaceOptions } = this;
|
|
575
668
|
const mode = getIonMode(this);
|
|
576
|
-
const modalOpts =
|
|
669
|
+
const modalOpts = {
|
|
670
|
+
...interfaceOptions,
|
|
671
|
+
mode,
|
|
672
|
+
cssClass: ['select-modal', interfaceOptions.cssClass],
|
|
673
|
+
component: 'ion-select-modal',
|
|
674
|
+
componentProps: {
|
|
577
675
|
header: interfaceOptions.header,
|
|
578
676
|
cancelText: this.cancelText,
|
|
579
677
|
multiple,
|
|
580
678
|
value,
|
|
581
679
|
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
582
|
-
}
|
|
680
|
+
},
|
|
681
|
+
};
|
|
583
682
|
/**
|
|
584
683
|
* Workaround for Stencil to autodefine
|
|
585
684
|
* ion-select-modal and ion-modal when
|
|
586
685
|
* using Custom Elements build.
|
|
587
686
|
*/
|
|
588
|
-
// eslint-disable-next-line
|
|
589
687
|
if (false) {
|
|
590
|
-
// eslint-disable-next-line
|
|
591
688
|
// @ts-ignore
|
|
592
689
|
document.createElement('ion-select-modal');
|
|
593
690
|
document.createElement('ion-modal');
|
|
@@ -628,12 +725,18 @@ export class Select {
|
|
|
628
725
|
}
|
|
629
726
|
return;
|
|
630
727
|
}
|
|
631
|
-
|
|
728
|
+
/**
|
|
729
|
+
* Returns the text to display in the select based on the selected value.
|
|
730
|
+
*
|
|
731
|
+
* @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`.
|
|
732
|
+
* @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
|
|
733
|
+
*/
|
|
734
|
+
getText(useHTML = false) {
|
|
632
735
|
const selectedText = this.selectedText;
|
|
633
736
|
if (selectedText != null && selectedText !== '') {
|
|
634
737
|
return selectedText;
|
|
635
738
|
}
|
|
636
|
-
return generateText(this.childOpts, this.value, this.compareWith);
|
|
739
|
+
return generateText(this.childOpts, this.value, this.compareWith, useHTML);
|
|
637
740
|
}
|
|
638
741
|
setFocus() {
|
|
639
742
|
if (this.focusEl) {
|
|
@@ -655,8 +758,8 @@ export class Select {
|
|
|
655
758
|
}, part: "label" }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
656
759
|
}
|
|
657
760
|
componentDidRender() {
|
|
658
|
-
|
|
659
|
-
|
|
761
|
+
this.notchController?.calculateNotchWidth();
|
|
762
|
+
this.startContainerController?.calculateStartContainerWidth();
|
|
660
763
|
}
|
|
661
764
|
/**
|
|
662
765
|
* Gets any content passed into the `label` slot,
|
|
@@ -675,33 +778,53 @@ export class Select {
|
|
|
675
778
|
return this.label !== undefined || this.labelSlot !== null;
|
|
676
779
|
}
|
|
677
780
|
/**
|
|
678
|
-
* Renders the border
|
|
679
|
-
* when fill="outline".
|
|
781
|
+
* Renders the outline border with a notch for the label.
|
|
680
782
|
*/
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
783
|
+
renderOutlineContainer() {
|
|
784
|
+
return (h("div", { class: "select-outline-container" }, h("div", { class: "select-outline-start" }), h("div", { class: {
|
|
785
|
+
'select-outline-notch': true,
|
|
786
|
+
'select-outline-notch-hidden': !this.hasLabel,
|
|
787
|
+
} }, h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), h("div", { class: "select-outline-end" })));
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Wraps text nodes in the select text with span elements
|
|
791
|
+
* so spacing can be added between elements without
|
|
792
|
+
* changing the display to prevent losing the ellipses
|
|
793
|
+
* behavior.
|
|
794
|
+
*
|
|
795
|
+
* Only wraps when the string contains HTML elements
|
|
796
|
+
* alongside text.
|
|
797
|
+
*/
|
|
798
|
+
wrapSelectTextNodes(html) {
|
|
799
|
+
const temp = document.createElement('div');
|
|
800
|
+
temp.innerHTML = html;
|
|
801
|
+
const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
|
|
802
|
+
// Return the plain text
|
|
803
|
+
if (!hasElements) {
|
|
804
|
+
return html;
|
|
699
805
|
}
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
806
|
+
Array.from(temp.childNodes).forEach((node) => {
|
|
807
|
+
if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
|
|
808
|
+
const text = node.textContent;
|
|
809
|
+
/**
|
|
810
|
+
* Split comma separator from the text content
|
|
811
|
+
* e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
|
|
812
|
+
*/
|
|
813
|
+
const commaMatch = text.match(/^(,\s*)(.*)/);
|
|
814
|
+
if (commaMatch) {
|
|
815
|
+
const commaNode = document.createTextNode(commaMatch[1]);
|
|
816
|
+
const wrapper = document.createElement('span');
|
|
817
|
+
wrapper.textContent = commaMatch[2];
|
|
818
|
+
node.parentNode?.replaceChild(wrapper, node);
|
|
819
|
+
wrapper.parentNode?.insertBefore(commaNode, wrapper);
|
|
820
|
+
return;
|
|
821
|
+
}
|
|
822
|
+
const wrapper = document.createElement('span');
|
|
823
|
+
node.parentNode?.replaceChild(wrapper, node);
|
|
824
|
+
wrapper.appendChild(node);
|
|
825
|
+
}
|
|
826
|
+
});
|
|
827
|
+
return temp.innerHTML;
|
|
705
828
|
}
|
|
706
829
|
/**
|
|
707
830
|
* Renders either the placeholder
|
|
@@ -710,7 +833,7 @@ export class Select {
|
|
|
710
833
|
*/
|
|
711
834
|
renderSelectText() {
|
|
712
835
|
const { placeholder } = this;
|
|
713
|
-
const displayValue = this.getText();
|
|
836
|
+
const displayValue = this.getText(true);
|
|
714
837
|
let addPlaceholderClass = false;
|
|
715
838
|
let selectText = displayValue;
|
|
716
839
|
if (selectText === '' && placeholder !== undefined) {
|
|
@@ -722,6 +845,10 @@ export class Select {
|
|
|
722
845
|
'select-placeholder': addPlaceholderClass,
|
|
723
846
|
};
|
|
724
847
|
const textPart = addPlaceholderClass ? 'placeholder' : 'text';
|
|
848
|
+
if (this.customHTMLEnabled) {
|
|
849
|
+
const wrapped = this.wrapSelectTextNodes(selectText);
|
|
850
|
+
return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
|
|
851
|
+
}
|
|
725
852
|
return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
|
|
726
853
|
}
|
|
727
854
|
/**
|
|
@@ -737,16 +864,16 @@ export class Select {
|
|
|
737
864
|
}
|
|
738
865
|
else {
|
|
739
866
|
const defaultIcon = mode === 'ios' ? chevronExpand : caretDownSharp;
|
|
740
|
-
icon = toggleIcon
|
|
867
|
+
icon = toggleIcon ?? defaultIcon;
|
|
741
868
|
}
|
|
742
869
|
return h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
|
|
743
870
|
}
|
|
744
871
|
get ariaLabel() {
|
|
745
|
-
var _a;
|
|
746
872
|
const { placeholder, inheritedAttributes } = this;
|
|
873
|
+
// Get the plain text from the selected text
|
|
747
874
|
const displayValue = this.getText();
|
|
748
875
|
// The aria label should be preferred over visible text if both are specified
|
|
749
|
-
const definedLabel =
|
|
876
|
+
const definedLabel = inheritedAttributes['aria-label'] ?? this.labelText;
|
|
750
877
|
/**
|
|
751
878
|
* If developer has specified a placeholder
|
|
752
879
|
* and there is nothing selected, the selectText
|
|
@@ -817,27 +944,10 @@ export class Select {
|
|
|
817
944
|
const inItem = hostContext('ion-item', this.el);
|
|
818
945
|
const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
|
|
819
946
|
const hasValue = this.hasValue();
|
|
820
|
-
const
|
|
947
|
+
const hasOutlineFill = mode === 'md' && fill === 'outline';
|
|
821
948
|
renderHiddenInput(true, el, name, parseValue(value), disabled);
|
|
822
|
-
|
|
823
|
-
|
|
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' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
|
|
840
|
-
return (h(Host, { key: '5f4ee901b65554eacc9fa52230d06b1a5ff1247c', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
949
|
+
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
|
|
950
|
+
return (h(Host, { key: 'b2f161e3706e139e61440cd13e162714b1b75d72', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
841
951
|
[mode]: true,
|
|
842
952
|
'in-item': inItem,
|
|
843
953
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -855,7 +965,7 @@ export class Select {
|
|
|
855
965
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
856
966
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
857
967
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
858
|
-
}) }, h("label", { key: '
|
|
968
|
+
}) }, h("label", { key: '944a2eb468154a21260d181fdaf67828a71eb902', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), h("div", { key: '927200c53548b1bb4f52d6a167605b724a7b7d0d', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, h("slot", { key: '6e14b95e9b95c116b16744d630600e90977782bc', name: "start" })), h("div", { key: '8451ed4300ac005963075be36a04ea8763bc0fdd', class: "select-control", part: "control" }, this.renderLabel(), h("div", { key: '207e7b63f3224a4870579365ac992da6784fb31f', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), h("div", { key: '5c17367d488db4d570f31b25e33560efa9011500', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), h("slot", { key: '21fd8c0d9bee8cffef9ef6984cacd31e8f38211c', name: "end" })), shouldRenderHighlight && h("div", { key: '1fff767db9a1ec07b274ef65ff7ae8fb976e6ad2', class: "select-highlight" })), this.renderBottomContent()));
|
|
859
969
|
}
|
|
860
970
|
static get is() { return "ion-select"; }
|
|
861
971
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1515,25 +1625,229 @@ const parseValue = (value) => {
|
|
|
1515
1625
|
}
|
|
1516
1626
|
return value.toString();
|
|
1517
1627
|
};
|
|
1518
|
-
const generateText = (opts, value, compareWith) => {
|
|
1628
|
+
const generateText = (opts, value, compareWith, useHTML = false) => {
|
|
1519
1629
|
if (value === undefined) {
|
|
1520
1630
|
return '';
|
|
1521
1631
|
}
|
|
1522
1632
|
if (Array.isArray(value)) {
|
|
1523
1633
|
return value
|
|
1524
|
-
.map((v) => textForValue(opts, v, compareWith))
|
|
1634
|
+
.map((v) => textForValue(opts, v, compareWith, useHTML))
|
|
1525
1635
|
.filter((opt) => opt !== null)
|
|
1526
1636
|
.join(', ');
|
|
1527
1637
|
}
|
|
1528
1638
|
else {
|
|
1529
|
-
return textForValue(opts, value, compareWith) || '';
|
|
1639
|
+
return textForValue(opts, value, compareWith, useHTML) || '';
|
|
1530
1640
|
}
|
|
1531
1641
|
};
|
|
1532
|
-
|
|
1642
|
+
/**
|
|
1643
|
+
* Returns the display text for a given value from the list of options.
|
|
1644
|
+
* When `useHTML` is true, returns sanitized HTML for the select text.
|
|
1645
|
+
* When `useHTML` is false, returns plain text for aria-label and other
|
|
1646
|
+
* text-only contexts.
|
|
1647
|
+
*
|
|
1648
|
+
* @param opts - The list of ion-select-option elements.
|
|
1649
|
+
* @param value - The value to find the matching option for.
|
|
1650
|
+
* @param compareWith - Custom comparison function or property name.
|
|
1651
|
+
* @param useHTML - If true, returns HTML string. If false, returns plain text.
|
|
1652
|
+
*/
|
|
1653
|
+
const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
1533
1654
|
const selectOpt = opts.find((opt) => {
|
|
1534
1655
|
return compareOptions(value, getOptionValue(opt), compareWith);
|
|
1535
1656
|
});
|
|
1536
|
-
|
|
1657
|
+
const customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
|
|
1658
|
+
if (!selectOpt) {
|
|
1659
|
+
return null;
|
|
1660
|
+
}
|
|
1661
|
+
// Return sanitized HTML for the select text
|
|
1662
|
+
if (customHTMLEnabled && useHTML) {
|
|
1663
|
+
return getOptionContent(selectOpt, undefined, true);
|
|
1664
|
+
}
|
|
1665
|
+
/**
|
|
1666
|
+
* Every text-only context reads only the default slot, so the start
|
|
1667
|
+
* and end slots stay out of the `aria-label` and the overlay labels.
|
|
1668
|
+
* Both config paths derive that text through the same helper, so they
|
|
1669
|
+
* cannot disagree about what an option's text is. `null` marks an
|
|
1670
|
+
* option with no text, which is dropped from the joined text of a
|
|
1671
|
+
* `multiple` select rather than joined in as an empty entry.
|
|
1672
|
+
*/
|
|
1673
|
+
return getDefaultSlotPlainText(selectOpt) || null;
|
|
1674
|
+
};
|
|
1675
|
+
/**
|
|
1676
|
+
* Trims whitespace from all text nodes within a DOM tree.
|
|
1677
|
+
* This prevents invisible layout shifts and unwanted gaps between
|
|
1678
|
+
* elements when HTML content is injected via innerHTML or cloneNode,
|
|
1679
|
+
* as browsers preserve whitespace (tabs, newlines, spaces) from
|
|
1680
|
+
* the original source markup.
|
|
1681
|
+
*
|
|
1682
|
+
* @param node The root node to start trimming text nodes from.
|
|
1683
|
+
*/
|
|
1684
|
+
const trimTextNodes = (node) => {
|
|
1685
|
+
node.childNodes.forEach((child) => {
|
|
1686
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
1687
|
+
child.textContent = child.textContent?.trim() || '';
|
|
1688
|
+
}
|
|
1689
|
+
else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
1690
|
+
trimTextNodes(child);
|
|
1691
|
+
}
|
|
1692
|
+
});
|
|
1693
|
+
};
|
|
1694
|
+
/**
|
|
1695
|
+
* Extracts and clones content from an `ion-select-option` element
|
|
1696
|
+
* for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
|
|
1697
|
+
*
|
|
1698
|
+
* @param option - The `ion-select-option` element to extract content from.
|
|
1699
|
+
* @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
|
|
1700
|
+
* @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.
|
|
1701
|
+
* @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
|
|
1702
|
+
* div element containing cloned child nodes. Returns `null` if no matching
|
|
1703
|
+
* content is found.
|
|
1704
|
+
*/
|
|
1705
|
+
const getOptionContent = (option, slotName, useHTML = false) => {
|
|
1706
|
+
let nodes;
|
|
1707
|
+
if (slotName) {
|
|
1708
|
+
// Named slot: get elements with matching slot attribute
|
|
1709
|
+
nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
|
|
1710
|
+
}
|
|
1711
|
+
else {
|
|
1712
|
+
// Default slot: get nodes without a slot attribute
|
|
1713
|
+
const defaultSlot = getOptionDefaultSlot(option) || [];
|
|
1714
|
+
nodes = defaultSlot.filter((node) => {
|
|
1715
|
+
/**
|
|
1716
|
+
* Exclude whitespace-only text nodes (newline noise between
|
|
1717
|
+
* markup elements). Element nodes are always kept, even when
|
|
1718
|
+
* their textContent is empty (e.g. <svg>, <img>).
|
|
1719
|
+
*/
|
|
1720
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
1721
|
+
return node.textContent?.trim().length !== 0;
|
|
1722
|
+
}
|
|
1723
|
+
return true;
|
|
1724
|
+
});
|
|
1725
|
+
}
|
|
1726
|
+
if (nodes.length === 0) {
|
|
1727
|
+
return null;
|
|
1728
|
+
}
|
|
1729
|
+
/**
|
|
1730
|
+
* Return plain text if no elements are found. This reads the option the
|
|
1731
|
+
* same way the non-custom-HTML path does, so the two do not disagree
|
|
1732
|
+
* about what an option's text is.
|
|
1733
|
+
*/
|
|
1734
|
+
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1735
|
+
return getDefaultSlotPlainText(option) || null;
|
|
1736
|
+
}
|
|
1737
|
+
/**
|
|
1738
|
+
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
1739
|
+
* onto attributes before cloning. Frameworks like Vue set these as
|
|
1740
|
+
* DOM properties, which `cloneNode` doesn't copy, so without this
|
|
1741
|
+
* step the cloned overlay copy renders without the prop's value.
|
|
1742
|
+
*/
|
|
1743
|
+
nodes.forEach((n) => {
|
|
1744
|
+
if (n.nodeType === Node.ELEMENT_NODE) {
|
|
1745
|
+
reflectPropertiesToAttributes(n);
|
|
1746
|
+
}
|
|
1747
|
+
});
|
|
1748
|
+
// Clone each node into a temporary container
|
|
1749
|
+
const container = document.createElement('div');
|
|
1750
|
+
nodes.forEach((n) => {
|
|
1751
|
+
const clone = n.cloneNode(true);
|
|
1752
|
+
if (clone.nodeType === Node.TEXT_NODE) {
|
|
1753
|
+
clone.textContent = clone.textContent?.trim() || '';
|
|
1754
|
+
}
|
|
1755
|
+
else {
|
|
1756
|
+
trimTextNodes(clone);
|
|
1757
|
+
}
|
|
1758
|
+
container.appendChild(clone);
|
|
1759
|
+
});
|
|
1760
|
+
/**
|
|
1761
|
+
* Sanitize the cloned DOM in place. Trusted attributes (size, color,
|
|
1762
|
+
* shape, etc.) are preserved; event handlers, javascript: URLs, and
|
|
1763
|
+
* blocked tags are stripped.
|
|
1764
|
+
*/
|
|
1765
|
+
sanitizeDOMTree(container);
|
|
1766
|
+
if (useHTML) {
|
|
1767
|
+
return container.innerHTML.trim() || null;
|
|
1768
|
+
}
|
|
1769
|
+
return container;
|
|
1770
|
+
};
|
|
1771
|
+
/**
|
|
1772
|
+
* Returns the child nodes that belong to the default slot of an
|
|
1773
|
+
* option element, excluding any nodes that are assigned to named
|
|
1774
|
+
* slots.
|
|
1775
|
+
*
|
|
1776
|
+
* @param option - The `ion-select-option` element to extract default-slot nodes from.
|
|
1777
|
+
* @returns An array of default slot nodes, or `null` if none are found.
|
|
1778
|
+
*/
|
|
1779
|
+
const getOptionDefaultSlot = (option) => {
|
|
1780
|
+
const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
|
|
1781
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1782
|
+
return !node.hasAttribute('slot');
|
|
1783
|
+
}
|
|
1784
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
1785
|
+
});
|
|
1786
|
+
if (defaultSlotNodes.length === 0) {
|
|
1787
|
+
return null;
|
|
1788
|
+
}
|
|
1789
|
+
return defaultSlotNodes;
|
|
1790
|
+
};
|
|
1791
|
+
/**
|
|
1792
|
+
* Concatenates the text a node renders, skipping the subtrees of tags
|
|
1793
|
+
* whose contents the browser never paints (`script`, `style`, and the
|
|
1794
|
+
* rest of `blockedTags`). `textContent` includes those, so reading it
|
|
1795
|
+
* directly would put stylesheet or script source into the select text
|
|
1796
|
+
* and the `aria-label`.
|
|
1797
|
+
*
|
|
1798
|
+
* @param node - The node to read text from.
|
|
1799
|
+
* @returns The node's rendered text.
|
|
1800
|
+
*/
|
|
1801
|
+
const getRenderedTextContent = (node) => {
|
|
1802
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
1803
|
+
return node.textContent ?? '';
|
|
1804
|
+
}
|
|
1805
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
1806
|
+
return '';
|
|
1807
|
+
}
|
|
1808
|
+
if (blockedTags.includes(node.tagName.toLowerCase())) {
|
|
1809
|
+
return '';
|
|
1810
|
+
}
|
|
1811
|
+
return Array.from(node.childNodes)
|
|
1812
|
+
.map((child) => getRenderedTextContent(child))
|
|
1813
|
+
.join('');
|
|
1814
|
+
};
|
|
1815
|
+
/**
|
|
1816
|
+
* Extracts plain text from only the default slot of an option,
|
|
1817
|
+
* excluding content assigned to named slots (start/end). Text is
|
|
1818
|
+
* concatenated with no separator and collapsible whitespace is
|
|
1819
|
+
* collapsed, approximating how the browser renders the option.
|
|
1820
|
+
* NBSP is not collapsible, so it is preserved.
|
|
1821
|
+
*
|
|
1822
|
+
* @param option - The `ion-select-option` element to read text from.
|
|
1823
|
+
* @returns The option's default slot text.
|
|
1824
|
+
*/
|
|
1825
|
+
const getDefaultSlotPlainText = (option) => {
|
|
1826
|
+
const text = (getOptionDefaultSlot(option) ?? []).map((node) => getRenderedTextContent(node)).join('');
|
|
1827
|
+
return text.replace(/[ \t\n\r\f]+/g, ' ').replace(/^[ \t\n\r\f]+|[ \t\n\r\f]+$/g, '');
|
|
1828
|
+
};
|
|
1829
|
+
/**
|
|
1830
|
+
* Extracts the rich content from an `ion-select-option`.
|
|
1831
|
+
* When `customHTMLEnabled` is `false`, only the plain text from the
|
|
1832
|
+
* default slot is read and the start and end slots are skipped.
|
|
1833
|
+
*
|
|
1834
|
+
* @param option - The `ion-select-option` element to extract content from.
|
|
1835
|
+
* @param customHTMLEnabled - Whether custom HTML rendering is enabled
|
|
1836
|
+
* via the `innerHTMLTemplatesEnabled` config.
|
|
1837
|
+
*/
|
|
1838
|
+
const extractOptionContent = (option, customHTMLEnabled) => {
|
|
1839
|
+
if (!customHTMLEnabled) {
|
|
1840
|
+
return {
|
|
1841
|
+
content: getDefaultSlotPlainText(option),
|
|
1842
|
+
startContent: undefined,
|
|
1843
|
+
endContent: undefined,
|
|
1844
|
+
};
|
|
1845
|
+
}
|
|
1846
|
+
return {
|
|
1847
|
+
content: getOptionContent(option),
|
|
1848
|
+
startContent: getOptionContent(option, 'start') ?? undefined,
|
|
1849
|
+
endContent: getOptionContent(option, 'end') ?? undefined,
|
|
1850
|
+
};
|
|
1537
1851
|
};
|
|
1538
1852
|
let selectIds = 0;
|
|
1539
1853
|
const OPTION_CLASS = 'select-interface-option';
|