@ionic/core 8.8.19 → 8.8.20-dev.11787158518.168a2fea
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--m5cCjbK.js +4 -0
- package/components/p-1jI5oW-W.js +4 -0
- package/components/{p-6J0vc7Z8.js → p-63OhffQv.js} +1 -1
- package/components/p-8FN7p701.js +4 -0
- package/components/p-B4uHHhPK.js +4 -0
- package/components/p-BMPN55of.js +4 -0
- package/components/p-BNJOu1Q2.js +4 -0
- package/components/p-BOvLNVKq.js +4 -0
- package/components/p-BSQPZ79H.js +4 -0
- package/components/p-BeamQXHF.js +4 -0
- package/components/p-BhamHSw3.js +4 -0
- package/components/p-Bjig0DJK.js +4 -0
- package/components/p-BjluhQMI.js +4 -0
- package/components/p-BlsIikdZ.js +4 -0
- package/components/p-BqPNzJf6.js +4 -0
- package/components/p-BrD9Xv62.js +4 -0
- package/components/p-BvJqoZ5R.js +4 -0
- package/components/p-Bz6z3Asd.js +4 -0
- package/components/p-C5KYjZWD.js +4 -0
- package/components/p-C6HnVvHO.js +4 -0
- package/components/p-C7jvh5Wy.js +4 -0
- package/components/p-C9BGR5fy.js +4 -0
- package/components/p-CB-y1CdP.js +4 -0
- package/components/p-CEW4RXZO.js +4 -0
- package/components/p-CHH3loEE.js +4 -0
- package/components/p-CJKUWjmg.js +4 -0
- package/components/{p-qMmFisyx.js → p-CMLAwl_N.js} +1 -1
- package/components/{p-C7II1iDj.js → p-C_phlPMC.js} +1 -1
- package/components/p-CbhUdtjf.js +4 -0
- package/components/p-CejmQs3h.js +4 -0
- package/components/p-CtZqa4HM.js +4 -0
- package/components/p-D7-vHX0A.js +4 -0
- package/components/p-D9qIVSWm.js +4 -0
- package/components/p-DD5fQ4EQ.js +4 -0
- package/components/p-DE-3iMNW.js +4 -0
- package/components/p-DFvZn99E.js +4 -0
- package/components/p-DHFt2rdc.js +4 -0
- package/components/p-DM-PrAoh.js +4 -0
- package/components/p-DSzSbVP2.js +4 -0
- package/components/{p--JUspHvy.js → p-DV85C0e0.js} +1 -1
- package/components/p-DWCzVL3Y.js +4 -0
- package/components/p-D_RCyzwu.js +4 -0
- package/components/p-D_tD8r3L.js +4 -0
- package/components/p-DaA_8eqt.js +4 -0
- package/components/p-DjCtLZbF.js +4 -0
- package/components/p-Dmd2xqCe.js +4 -0
- package/components/p-Dojwmvde.js +4 -0
- package/components/{p-BkKAANMJ.js → p-DwpKZ6rl.js} +1 -1
- package/components/p-DzRT60Tw.js +4 -0
- package/components/p-G0TxqHfe.js +4 -0
- package/components/p-G6JR-cr_.js +4 -0
- package/components/p-GG5GhznE.js +4 -0
- package/components/p-TXPDHL13.js +4 -0
- package/components/p-UIBJkZf8.js +4 -0
- package/components/p-_IKFD3ID.js +4 -0
- package/components/p-byZM6qHV.js +4 -0
- package/components/p-dKq2jIum.js +4 -0
- package/components/p-fruGqVHh.js +4 -0
- package/components/p-iYhH60Tc.js +4 -0
- package/components/p-ia3IDdJS.js +4 -0
- package/components/{p-DqLB8yFQ.js → p-ryyf_ItD.js} +1 -1
- package/dist/cjs/{animation-Ch16T-Nb.js → animation-C0mOHzej.js} +4 -4
- package/dist/cjs/{app-globals-Dd89e0MR.js → app-globals-BREG4twP.js} +1 -1
- package/dist/cjs/{button-active-AWp_ygDP.js → button-active-CVMevT9a.js} +3 -3
- package/dist/cjs/config-CjUbvdPW.js +36 -0
- package/dist/cjs/{dir-DD0jPVH3.js → dir-zwDPRE5K.js} +2 -3
- package/dist/cjs/{format-BUFWn4Bn.js → format-pp0Du3K-.js} +40 -30
- package/dist/cjs/{framework-delegate-CEzl4MEA.js → framework-delegate-Dfo5XsGv.js} +5 -7
- package/dist/cjs/{gesture-controller-dtqlP_q4.js → gesture-controller-BDUH7687.js} +15 -8
- package/dist/cjs/{haptic-ClPPQ_PS.js → haptic-Ch-X4gRx.js} +2 -3
- package/dist/cjs/{hardware-back-button-CXmUnTJC.js → hardware-back-button-fqpYh-kd.js} +4 -4
- package/dist/cjs/{helpers-DdZyl6WL.js → helpers-YPQybDph.js} +4 -4
- package/dist/cjs/index-B7zJsYWS.js +429 -0
- package/dist/cjs/{index-CukZnH1U.js → index-BLdJCcJY.js} +5 -5
- package/dist/cjs/{index-MWAIyVLl.js → index-DDg31ZF5.js} +3 -3
- package/dist/cjs/{index-DOiZqxWZ.js → index-DXsPSne6.js} +6 -7
- package/dist/cjs/{index-BJ2-LydH.js → index-DwlRtFZe.js} +9 -3
- package/dist/cjs/{index-BfaXsATC.js → index-uvry__L4.js} +31 -14
- package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
- package/dist/cjs/{index-CD92bI7B.js → index-zVCah4Uz.js} +2 -2
- package/dist/cjs/index.cjs.js +19 -19
- package/dist/cjs/{input-shims-CPKgrIe3.js → input-shims-Cbu1fcye.js} +10 -12
- package/dist/cjs/input.utils-BZdMWVrt.js +35 -0
- package/dist/cjs/ion-accordion_2.cjs.entry.js +369 -341
- package/dist/cjs/ion-action-sheet.cjs.entry.js +188 -77
- package/dist/cjs/ion-alert.cjs.entry.js +274 -112
- package/dist/cjs/ion-app_8.cjs.entry.js +307 -190
- package/dist/cjs/ion-avatar_3.cjs.entry.js +10 -4
- package/dist/cjs/ion-back-button.cjs.entry.js +48 -24
- package/dist/cjs/ion-backdrop.cjs.entry.js +18 -14
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +200 -122
- package/dist/cjs/ion-button_2.cjs.entry.js +139 -67
- package/dist/cjs/ion-card_5.cjs.entry.js +83 -31
- package/dist/cjs/ion-checkbox.cjs.entry.js +153 -102
- package/dist/cjs/ion-chip.cjs.entry.js +17 -11
- package/dist/cjs/ion-col_3.cjs.entry.js +134 -10
- package/dist/cjs/ion-datetime-button.cjs.entry.js +254 -242
- package/dist/cjs/ion-datetime.cjs.entry.js +2770 -0
- package/dist/cjs/ion-fab_3.cjs.entry.js +140 -82
- package/dist/cjs/ion-img.cjs.entry.js +35 -13
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +101 -73
- package/dist/cjs/ion-input-otp.cjs.entry.js +435 -372
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +36 -22
- package/dist/cjs/ion-input.cjs.entry.js +343 -212
- package/dist/cjs/ion-item-option_3.cjs.entry.js +95 -55
- package/dist/cjs/ion-item_8.cjs.entry.js +192 -93
- package/dist/cjs/ion-loading.cjs.entry.js +147 -61
- package/dist/cjs/ion-menu_3.cjs.entry.js +169 -107
- package/dist/cjs/ion-modal.cjs.entry.js +456 -262
- package/dist/cjs/ion-nav_2.cjs.entry.js +102 -159
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +38 -34
- package/dist/cjs/ion-picker-column.cjs.entry.js +418 -406
- package/dist/cjs/ion-picker.cjs.entry.js +402 -393
- package/dist/cjs/ion-popover.cjs.entry.js +320 -206
- package/dist/cjs/ion-progress-bar.cjs.entry.js +32 -26
- package/dist/cjs/ion-radio_2.cjs.entry.js +208 -135
- package/dist/cjs/ion-range.cjs.entry.js +304 -239
- package/dist/cjs/ion-refresher_2.cjs.entry.js +166 -94
- package/dist/cjs/ion-reorder_2.cjs.entry.js +54 -24
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +14 -14
- package/dist/cjs/ion-route_4.cjs.entry.js +176 -72
- package/dist/cjs/ion-searchbar.cjs.entry.js +291 -200
- package/dist/cjs/ion-segment-content.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment-view.cjs.entry.js +28 -17
- package/dist/cjs/ion-segment_2.cjs.entry.js +169 -126
- package/dist/cjs/ion-select-modal.cjs.entry.js +105 -49
- package/dist/cjs/ion-select_3.cjs.entry.js +787 -260
- package/dist/cjs/ion-spinner.cjs.entry.js +24 -10
- package/dist/cjs/ion-split-pane.cjs.entry.js +29 -16
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +101 -42
- package/dist/cjs/ion-tab_2.cjs.entry.js +54 -28
- package/dist/cjs/ion-text.cjs.entry.js +11 -5
- package/dist/cjs/ion-textarea.cjs.entry.js +296 -189
- package/dist/cjs/ion-toast.cjs.entry.js +237 -118
- package/dist/cjs/ion-toggle.cjs.entry.js +175 -122
- package/dist/cjs/{ionic-global-BerQGEpE.js → ionic-global-k6hOWWpn.js} +13 -8
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-CTiTDh3m.js → ios.transition-zTmJz8T-.js} +14 -18
- package/dist/cjs/{item-multiple-inputs-jOJZE_I0.js → item-multiple-inputs-BdYSbfKN.js} +1 -1
- 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-BpiTAaqF.js → md.transition-nb_4pUXu.js} +8 -9
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
- package/dist/cjs/{overlays-CQ_c1fko.js → overlays-KaNVDNqC.js} +48 -33
- package/dist/cjs/select-option-render-pULCGldr.js +123 -0
- package/dist/cjs/slot-mutation-controller-DPHmqXdV.js +397 -0
- package/dist/cjs/{status-tap-7FzRlXNr.js → status-tap-o9IIymsP.js} +4 -4
- package/dist/cjs/{swipe-back-DwTZiAc9.js → swipe-back-B7X9VOlH.js} +5 -5
- package/dist/cjs/{theme-CeDs6Hcv.js → theme-Bw0rpaNN.js} +6 -1
- package/dist/collection/collection-manifest.json +6 -10
- package/dist/collection/components/accordion/accordion.js +315 -312
- package/dist/collection/components/accordion-group/accordion-group.js +48 -25
- package/dist/collection/components/action-sheet/action-sheet.ios.css +228 -2
- package/dist/collection/components/action-sheet/action-sheet.js +173 -64
- package/dist/collection/components/action-sheet/action-sheet.md.css +174 -2
- package/dist/collection/components/action-sheet/test/basic/fixture.js +3 -0
- package/dist/collection/components/alert/alert.ios.css +279 -10
- package/dist/collection/components/alert/alert.js +257 -97
- package/dist/collection/components/alert/alert.md.css +268 -20
- package/dist/collection/components/app/app.js +3 -0
- package/dist/collection/components/back-button/back-button.js +42 -19
- package/dist/collection/components/backdrop/backdrop.js +16 -14
- package/dist/collection/components/badge/badge.js +6 -0
- package/dist/collection/components/breadcrumb/breadcrumb.js +91 -30
- package/dist/collection/components/breadcrumbs/breadcrumbs.js +103 -88
- package/dist/collection/components/button/button.js +132 -61
- package/dist/collection/components/buttons/buttons.js +13 -15
- package/dist/collection/components/card/card.js +54 -21
- package/dist/collection/components/card-header/card-header.js +12 -8
- package/dist/collection/components/card-subtitle/card-subtitle.js +6 -0
- package/dist/collection/components/card-title/card-title.js +6 -0
- package/dist/collection/components/checkbox/checkbox.js +147 -97
- package/dist/collection/components/chip/chip.js +14 -10
- package/dist/collection/components/col/col.js +127 -3
- package/dist/collection/components/content/content.js +93 -64
- package/dist/collection/components/datetime/datetime.ios.css +42 -2
- package/dist/collection/components/datetime/datetime.js +1042 -807
- 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 +247 -237
- package/dist/collection/components/datetime-button/datetime-button.md.css +5 -0
- package/dist/collection/components/fab/fab.js +20 -13
- package/dist/collection/components/fab-button/fab-button.js +104 -55
- package/dist/collection/components/fab-list/fab-list.js +10 -11
- package/dist/collection/components/footer/footer.js +50 -44
- package/dist/collection/components/grid/grid.js +4 -6
- package/dist/collection/components/header/header.js +35 -25
- package/dist/collection/components/img/img.js +34 -10
- package/dist/collection/components/infinite-scroll/infinite-scroll.js +73 -66
- package/dist/collection/components/infinite-scroll-content/infinite-scroll-content.js +20 -3
- package/dist/collection/components/input/input.ios.css +57 -26
- package/dist/collection/components/input/input.js +336 -206
- package/dist/collection/components/input/input.md.css +79 -43
- package/dist/collection/components/input-otp/input-otp.js +430 -368
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +32 -19
- package/dist/collection/components/item/item.js +99 -53
- package/dist/collection/components/item-divider/item-divider.js +17 -12
- package/dist/collection/components/item-group/item-group.js +1 -1
- package/dist/collection/components/item-option/item-option.js +50 -22
- package/dist/collection/components/item-options/item-options.js +11 -8
- package/dist/collection/components/item-sliding/item-sliding.js +27 -21
- package/dist/collection/components/label/label.js +26 -6
- package/dist/collection/components/list/list.js +11 -8
- package/dist/collection/components/list-header/list-header.js +12 -2
- package/dist/collection/components/loading/loading.js +135 -51
- package/dist/collection/components/menu/menu.js +103 -61
- package/dist/collection/components/menu-button/menu-button.js +30 -21
- package/dist/collection/components/menu-toggle/menu-toggle.js +22 -15
- 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 +22 -10
- package/dist/collection/components/modal/gestures/swipe-to-close.js +15 -3
- package/dist/collection/components/modal/modal.js +398 -228
- package/dist/collection/components/modal/safe-area-utils.js +6 -7
- package/dist/collection/components/modal/test/fixtures.js +3 -0
- package/dist/collection/components/nav/nav.js +69 -247
- package/dist/collection/components/nav/view-controller.js +7 -1
- package/dist/collection/components/nav-link/nav-link.js +21 -10
- package/dist/collection/components/note/note.js +8 -2
- package/dist/collection/components/picker/picker.js +398 -390
- package/dist/collection/components/picker-column/picker-column.css +3 -0
- package/dist/collection/components/picker-column/picker-column.js +414 -404
- package/dist/collection/components/picker-column-option/picker-column-option.js +33 -31
- 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 +302 -185
- package/dist/collection/components/popover/popover.md.css +15 -0
- package/dist/collection/components/popover/test/fixture.js +1 -0
- package/dist/collection/components/popover/utils.js +4 -6
- package/dist/collection/components/progress-bar/progress-bar.js +27 -23
- package/dist/collection/components/radio/radio.js +102 -66
- package/dist/collection/components/radio-group/radio-group.js +101 -66
- package/dist/collection/components/radio-group/test/fixtures.js +2 -0
- package/dist/collection/components/range/range.js +298 -234
- package/dist/collection/components/refresher/refresher.js +110 -78
- package/dist/collection/components/refresher-content/refresher-content.js +41 -4
- package/dist/collection/components/reorder/reorder.js +2 -1
- package/dist/collection/components/reorder-group/reorder-group.js +44 -15
- package/dist/collection/components/ripple-effect/ripple-effect.js +12 -13
- package/dist/collection/components/route/route.js +39 -10
- package/dist/collection/components/route-redirect/route-redirect.js +31 -0
- package/dist/collection/components/router/router.js +37 -33
- package/dist/collection/components/router/utils/dom.js +25 -7
- package/dist/collection/components/router/utils/matching.js +7 -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 +37 -12
- package/dist/collection/components/router-outlet/router-outlet.js +82 -21
- package/dist/collection/components/row/row.js +1 -1
- package/dist/collection/components/searchbar/searchbar.js +289 -199
- package/dist/collection/components/segment/segment.js +120 -85
- package/dist/collection/components/segment-button/segment-button.js +43 -37
- package/dist/collection/components/segment-content/segment-content.js +1 -1
- package/dist/collection/components/segment-view/segment-view.js +26 -16
- package/dist/collection/components/select/select.ios.css +96 -69
- package/dist/collection/components/select/select.js +629 -213
- 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 +92 -38
- package/dist/collection/components/select-modal/select-modal.md.css +164 -0
- package/dist/collection/components/select-modal/test/fixtures.js +8 -1
- package/dist/collection/components/select-option/select-option.js +110 -9
- package/dist/collection/components/select-popover/select-popover.ios.css +218 -0
- package/dist/collection/components/select-popover/select-popover.js +103 -36
- package/dist/collection/components/select-popover/select-popover.md.css +164 -0
- package/dist/collection/components/select-popover/test/fixtures.js +8 -1
- package/dist/collection/components/skeleton-text/skeleton-text.js +12 -8
- package/dist/collection/components/spinner/spinner.js +21 -9
- package/dist/collection/components/split-pane/split-pane.js +27 -15
- package/dist/collection/components/tab/tab.js +17 -6
- package/dist/collection/components/tab-bar/tab-bar.js +32 -14
- package/dist/collection/components/tab-button/tab-button.js +62 -23
- package/dist/collection/components/tabs/tabs.js +33 -20
- package/dist/collection/components/text/text.js +8 -2
- package/dist/collection/components/textarea/textarea.ios.css +94 -62
- package/dist/collection/components/textarea/textarea.js +287 -181
- 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 +18 -2
- package/dist/collection/components/toast/toast.js +223 -106
- package/dist/collection/components/toggle/toggle.js +167 -115
- package/dist/collection/components/toolbar/toolbar.js +15 -7
- package/dist/collection/global/config.js +4 -6
- 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/focus-controller/index.js +1 -1
- package/dist/collection/utils/focus-trap.js +3 -3
- package/dist/collection/utils/forms/index.js +1 -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 +15 -8
- package/dist/collection/utils/gesture/index.js +10 -2
- package/dist/collection/utils/hardware-back-button.js +3 -3
- package/dist/collection/utils/helpers.js +2 -2
- package/dist/collection/utils/input-shims/hacks/scroll-assist.js +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 +38 -23
- package/dist/collection/utils/platform.js +4 -5
- package/dist/collection/utils/rtl/dir.js +2 -3
- package/dist/collection/utils/sanitization/index.js +276 -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/playwright/apply-keyboard-focus.js +1 -1
- package/dist/collection/utils/test/playwright/drag-element.js +2 -3
- package/dist/collection/utils/test/playwright/generator.js +3 -4
- package/dist/collection/utils/test/playwright/page/event-spy.js +11 -12
- 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 +10 -17
- 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 +557 -1257
- package/dist/esm/{animation-DLJpuoEz.js → animation-CGFdmGk9.js} +4 -4
- package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-CYmMeGdU.js} +1 -1
- package/dist/esm/{button-active-CXXy0FIE.js → button-active-BDOsVAiZ.js} +3 -3
- package/dist/esm/config-DWCzVL3Y.js +32 -0
- package/dist/esm/{dir-o8OKV5aD.js → dir-Dojwmvde.js} +2 -3
- package/dist/esm/{format-CAmvpAez.js → format-Dcwga61t.js} +41 -31
- package/dist/esm/{framework-delegate-B9yvYzqV.js → framework-delegate-BHTU2Ip9.js} +5 -7
- package/dist/esm/{gesture-controller-BTEOs1at.js → gesture-controller-TXPDHL13.js} +15 -8
- package/dist/esm/{haptic-DzAMWJuk.js → haptic-Cq4UAeka.js} +2 -3
- package/dist/esm/{hardware-back-button-B93Gru0Y.js → hardware-back-button-gLJHMX_F.js} +4 -4
- package/dist/esm/{helpers-DkCLSLI9.js → helpers-CAGf8Wgp.js} +4 -4
- package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
- package/dist/esm/index-CKM1DdGm.js +424 -0
- package/dist/esm/{index-tcQvqkiX.js → index-ChhhtsGZ.js} +32 -15
- package/dist/esm/{index-DwNKJodj.js → index-Clc-28O1.js} +3 -3
- package/dist/esm/{index-DdeElWma.js → index-CqneaaGd.js} +6 -7
- package/dist/esm/{index-Bck1OwMs.js → index-DcPaH5uL.js} +9 -3
- package/dist/esm/{index-B_8X7INq.js → index-T0JxBI8V.js} +2 -2
- package/dist/esm/{index-Dsz7OTeL.js → index-WlteAIqz.js} +5 -5
- package/dist/esm/index.js +17 -16
- package/dist/esm/{input-shims-d-hDv86G.js → input-shims-B8sfni1e.js} +10 -12
- package/dist/esm/input.utils-B1ValN_N.js +33 -0
- package/dist/esm/ion-accordion_2.entry.js +369 -341
- package/dist/esm/ion-action-sheet.entry.js +188 -77
- package/dist/esm/ion-alert.entry.js +273 -111
- package/dist/esm/ion-app_8.entry.js +307 -190
- package/dist/esm/ion-avatar_3.entry.js +10 -4
- package/dist/esm/ion-back-button.entry.js +48 -24
- package/dist/esm/ion-backdrop.entry.js +18 -14
- package/dist/esm/ion-breadcrumb_2.entry.js +200 -122
- package/dist/esm/ion-button_2.entry.js +139 -67
- package/dist/esm/ion-card_5.entry.js +83 -31
- package/dist/esm/ion-checkbox.entry.js +153 -102
- package/dist/esm/ion-chip.entry.js +17 -11
- package/dist/esm/ion-col_3.entry.js +134 -10
- package/dist/esm/ion-datetime-button.entry.js +254 -242
- package/dist/esm/ion-datetime.entry.js +2768 -0
- package/dist/esm/ion-fab_3.entry.js +140 -82
- package/dist/esm/ion-img.entry.js +35 -13
- package/dist/esm/ion-infinite-scroll_2.entry.js +100 -72
- package/dist/esm/ion-input-otp.entry.js +435 -372
- package/dist/esm/ion-input-password-toggle.entry.js +36 -22
- package/dist/esm/ion-input.entry.js +341 -210
- package/dist/esm/ion-item-option_3.entry.js +95 -55
- package/dist/esm/ion-item_8.entry.js +192 -93
- package/dist/esm/ion-loading.entry.js +146 -60
- package/dist/esm/ion-menu_3.entry.js +169 -107
- package/dist/esm/ion-modal.entry.js +456 -262
- package/dist/esm/ion-nav_2.entry.js +102 -159
- package/dist/esm/ion-picker-column-option.entry.js +38 -34
- package/dist/esm/ion-picker-column.entry.js +418 -406
- package/dist/esm/ion-picker.entry.js +402 -393
- package/dist/esm/ion-popover.entry.js +320 -206
- package/dist/esm/ion-progress-bar.entry.js +32 -26
- package/dist/esm/ion-radio_2.entry.js +208 -135
- package/dist/esm/ion-range.entry.js +304 -239
- package/dist/esm/ion-refresher_2.entry.js +164 -92
- package/dist/esm/ion-reorder_2.entry.js +54 -24
- package/dist/esm/ion-ripple-effect.entry.js +14 -14
- package/dist/esm/ion-route_4.entry.js +176 -72
- package/dist/esm/ion-searchbar.entry.js +291 -200
- package/dist/esm/ion-segment-content.entry.js +2 -2
- package/dist/esm/ion-segment-view.entry.js +28 -17
- package/dist/esm/ion-segment_2.entry.js +169 -126
- package/dist/esm/ion-select-modal.entry.js +105 -49
- package/dist/esm/ion-select_3.entry.js +787 -260
- package/dist/esm/ion-spinner.entry.js +24 -10
- package/dist/esm/ion-split-pane.entry.js +29 -16
- package/dist/esm/ion-tab-bar_2.entry.js +101 -42
- package/dist/esm/ion-tab_2.entry.js +54 -28
- package/dist/esm/ion-text.entry.js +11 -5
- package/dist/esm/ion-textarea.entry.js +295 -188
- package/dist/esm/ion-toast.entry.js +236 -117
- package/dist/esm/ion-toggle.entry.js +175 -122
- package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-BVB7BrLT.js} +13 -8
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-CxNhMt4a.js → ios.transition-DXRCmcbC.js} +14 -18
- package/dist/esm/{item-multiple-inputs-DlNuqNJm.js → item-multiple-inputs-rU8VaNNg.js} +1 -1
- 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-IE4mC3kp.js → md.transition-BMngO4i_.js} +8 -9
- package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
- package/dist/esm/{overlays-COCl_nm9.js → overlays-CPmIs9Ls.js} +48 -33
- package/dist/esm/select-option-render-C4m76VGH.js +121 -0
- package/dist/esm/slot-mutation-controller-DiE_C9un.js +393 -0
- package/dist/esm/{status-tap-HhO5eQI9.js → status-tap-CHB7KwIb.js} +4 -4
- package/dist/esm/{swipe-back-DK6afpuO.js → swipe-back-C9HW1bug.js} +5 -5
- package/dist/esm/{theme-DiVJyqlX.js → theme-byZM6qHV.js} +6 -1
- package/dist/html.html-data.json +52 -80
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-06ec7136.entry.js +4 -0
- package/dist/ionic/p-09fe4fa3.entry.js +4 -0
- package/dist/ionic/p-10d45a07.entry.js +4 -0
- package/dist/ionic/p-208c8a07.entry.js +4 -0
- package/dist/ionic/p-212474fa.entry.js +4 -0
- package/dist/ionic/p-2eef1396.entry.js +4 -0
- package/dist/ionic/p-347e005d.entry.js +4 -0
- package/dist/ionic/p-3a0b3f1d.entry.js +4 -0
- package/dist/ionic/p-3b071259.entry.js +4 -0
- package/dist/ionic/{p-c6e49f3f.entry.js → p-40424a88.entry.js} +1 -1
- package/dist/ionic/p-4204184c.entry.js +4 -0
- package/dist/ionic/p-47464391.entry.js +4 -0
- package/dist/ionic/p-4eOQC00Z.js +4 -0
- package/dist/ionic/p-4f9c9126.entry.js +4 -0
- package/dist/ionic/p-5JsKPLJD.js +4 -0
- package/dist/ionic/p-5bc485c6.entry.js +4 -0
- package/dist/ionic/p-603a61e6.entry.js +4 -0
- package/dist/ionic/p-60576951.entry.js +4 -0
- package/dist/ionic/p-67a81d33.entry.js +4 -0
- package/dist/ionic/p-6affb775.entry.js +4 -0
- package/dist/ionic/p-6f120c25.entry.js +4 -0
- package/dist/ionic/p-71c82b60.entry.js +4 -0
- package/dist/ionic/p-79325ffe.entry.js +4 -0
- package/dist/ionic/{p-DZaO33Mw.js → p-7CBuOvEo.js} +1 -1
- package/dist/ionic/p-7e4d51fa.entry.js +4 -0
- package/dist/ionic/p-7f5d4664.entry.js +4 -0
- package/dist/ionic/p-80ee82fc.entry.js +4 -0
- package/dist/ionic/p-84af7dbc.entry.js +4 -0
- package/dist/ionic/p-89ca830a.entry.js +4 -0
- package/dist/ionic/p-93b8ec8f.entry.js +4 -0
- package/dist/ionic/p-946f65c2.entry.js +4 -0
- package/dist/ionic/p-9c4b39fb.entry.js +4 -0
- package/dist/ionic/p-B1NEZUzQ.js +4 -0
- package/dist/ionic/p-B1ck5iy-.js +4 -0
- package/dist/ionic/{p-Cd4H8ft-.js → p-B4FrqdW0.js} +1 -1
- package/dist/ionic/p-BB0LlG4y.js +4 -0
- package/dist/ionic/p-BMPN55of.js +4 -0
- package/dist/ionic/p-BSQPZ79H.js +4 -0
- package/dist/ionic/p-BYEAtHr-.js +4 -0
- package/dist/ionic/p-BhamHSw3.js +4 -0
- package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
- package/dist/ionic/p-C-94tAim.js +4 -0
- package/dist/ionic/{p-DipZFfzN.js → p-C-eHZMYE.js} +1 -1
- package/dist/ionic/p-CBR_W98Z.js +4 -0
- package/dist/ionic/{p-ClM02LPk.js → p-CBWAXjA5.js} +1 -1
- package/dist/ionic/p-CMRtMbJc.js +4 -0
- package/dist/ionic/p-CPcPmkGv.js +4 -0
- package/dist/ionic/p-CaRuIadB.js +4 -0
- package/dist/ionic/p-Cdjxf_yg.js +4 -0
- package/dist/ionic/p-ChhhtsGZ.js +5 -0
- package/dist/ionic/p-CzS1qWve.js +4 -0
- package/dist/ionic/p-D5t_-oMk.js +4 -0
- package/dist/ionic/p-D94_RztK.js +4 -0
- package/dist/ionic/p-DWCzVL3Y.js +4 -0
- package/dist/ionic/p-DjjfauRM.js +4 -0
- package/dist/ionic/p-DkUB-ROc.js +4 -0
- package/dist/ionic/p-Dn0mqQ_R.js +4 -0
- package/dist/ionic/p-Dojwmvde.js +4 -0
- package/dist/ionic/p-DplOqGUv.js +4 -0
- package/dist/ionic/p-Dst_XmZh.js +4 -0
- package/dist/ionic/p-T71k3C35.js +4 -0
- package/dist/ionic/p-TXPDHL13.js +4 -0
- package/dist/ionic/p-UIBJkZf8.js +4 -0
- package/dist/ionic/p-a438b193.entry.js +4 -0
- package/dist/ionic/p-babaaaa7.entry.js +4 -0
- package/dist/ionic/p-be08d500.entry.js +4 -0
- package/dist/ionic/p-be9a4f51.entry.js +4 -0
- package/dist/ionic/p-byZM6qHV.js +4 -0
- package/dist/ionic/p-c00d3092.entry.js +4 -0
- package/dist/ionic/p-c36dc8f5.entry.js +4 -0
- package/dist/ionic/p-c72a7e17.entry.js +4 -0
- package/dist/ionic/p-c8edd88c.entry.js +4 -0
- package/dist/ionic/p-ce0e380b.entry.js +4 -0
- package/dist/ionic/p-ce32912b.entry.js +4 -0
- package/dist/ionic/p-d07cf130.entry.js +4 -0
- package/dist/ionic/p-d27edeb3.entry.js +4 -0
- package/dist/ionic/p-d5d2c506.entry.js +4 -0
- package/dist/ionic/p-d5e31ca9.entry.js +4 -0
- package/dist/ionic/p-de91444f.entry.js +4 -0
- package/dist/ionic/p-ded69ceb.entry.js +4 -0
- package/dist/ionic/p-df72866d.entry.js +4 -0
- package/dist/ionic/p-e47e3151.entry.js +4 -0
- package/dist/ionic/p-e621e5e8.entry.js +4 -0
- package/dist/ionic/p-eea9cf93.entry.js +4 -0
- package/dist/ionic/p-f402f5a4.entry.js +4 -0
- package/dist/ionic/p-fe1bfbcf.entry.js +4 -0
- package/{components/p-9GFIh9p1.js → dist/ionic/p-ffb90460.entry.js} +1 -1
- package/dist/types/components/img/img.d.ts +2 -0
- package/dist/types/components/input/input.d.ts +12 -6
- package/dist/types/components/modal/modal-interface.d.ts +9 -0
- package/dist/types/components/modal/modal.d.ts +11 -4
- 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/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/textarea/textarea.d.ts +12 -5
- package/dist/types/components.d.ts +74 -311
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interface.d.ts +0 -1
- package/dist/types/utils/config.d.ts +1 -8
- package/dist/types/utils/forms/index.d.ts +1 -0
- package/dist/types/utils/forms/start-container-controller.d.ts +34 -0
- 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 +11 -9
- 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/playwright-page.d.ts +1 -1
- package/dist/types/utils/test/playwright/testExpect.d.ts +1 -1
- package/hydrate/index.js +10660 -7305
- package/hydrate/index.mjs +10660 -7305
- package/package.json +55 -12
- 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-0LM2oPMC.js +0 -4
- package/components/p-B21528L5.js +0 -4
- package/components/p-B2nSfLHH.js +0 -4
- package/components/p-B3qf4bEn.js +0 -4
- package/components/p-B9jFTlwE.js +0 -4
- package/components/p-BDd9Zrb9.js +0 -4
- package/components/p-BLmJ0zRm.js +0 -4
- package/components/p-BMYNBJgf.js +0 -4
- package/components/p-BRYd8D-I.js +0 -4
- package/components/p-BSEgsdFI.js +0 -4
- package/components/p-BTEOs1at.js +0 -4
- package/components/p-BTJrYwxN.js +0 -4
- package/components/p-BV-zKay-.js +0 -4
- package/components/p-BYRVyMu9.js +0 -4
- package/components/p-Bmq8qlkW.js +0 -4
- package/components/p-BuxQcfHK.js +0 -4
- package/components/p-Bz0dSlXZ.js +0 -4
- package/components/p-CHqRYvYm.js +0 -4
- package/components/p-CSZf8_j0.js +0 -4
- package/components/p-CTdRooFV.js +0 -4
- package/components/p-Cf2jSDS8.js +0 -4
- package/components/p-Cfx4M1Bn.js +0 -4
- package/components/p-CgkrslTX.js +0 -4
- package/components/p-CiCzYG2V.js +0 -4
- package/components/p-Ck0lEczL.js +0 -4
- package/components/p-CmR5uXej.js +0 -4
- package/components/p-CniZht3v.js +0 -4
- package/components/p-CsaojgEs.js +0 -4
- package/components/p-CtWGkNnJ.js +0 -4
- package/components/p-D13Eaw-8.js +0 -4
- package/components/p-D4FYu-4R.js +0 -4
- package/components/p-D6Ynv7Xh.js +0 -4
- package/components/p-DARjq3GM.js +0 -4
- package/components/p-DEZ2myA3.js +0 -4
- package/components/p-DOFCbuQR.js +0 -4
- package/components/p-DVe41iHI.js +0 -4
- package/components/p-DX5m9g56.js +0 -4
- package/components/p-DboHi2CL.js +0 -4
- package/components/p-DiVJyqlX.js +0 -4
- package/components/p-DmzFY5IC.js +0 -4
- package/components/p-DqZAXv2t.js +0 -4
- package/components/p-Dv8w0kqz.js +0 -4
- package/components/p-Dw7GNDKq.js +0 -4
- package/components/p-Dww01PNs.js +0 -4
- package/components/p-Gy276IJk.js +0 -4
- package/components/p-ZzLXTvyt.js +0 -4
- package/components/p-cyNmxje6.js +0 -4
- package/components/p-j5IxBIan.js +0 -4
- package/components/p-k_E4tX5Z.js +0 -4
- package/components/p-lVAbdiAu.js +0 -4
- package/components/p-o8OKV5aD.js +0 -4
- package/components/p-rCa2eL0j.js +0 -4
- package/dist/cjs/config-D6C-KlA9.js +0 -201
- package/dist/cjs/input.utils-DQaUGGed.js +0 -150
- package/dist/cjs/ion-datetime_3.cjs.entry.js +0 -3167
- package/dist/cjs/notch-controller-aiy8aQb-.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/input.utils-Cd23Gdd1.js +0 -147
- package/dist/esm/ion-datetime_3.entry.js +0 -3163
- package/dist/esm/notch-controller-Doqis1td.js +0 -153
- package/dist/ionic/p-01f81ea5.entry.js +0 -4
- package/dist/ionic/p-0283ea73.entry.js +0 -4
- package/dist/ionic/p-02ecae65.entry.js +0 -4
- package/dist/ionic/p-0672f677.entry.js +0 -4
- package/dist/ionic/p-0c06fe60.entry.js +0 -4
- package/dist/ionic/p-0fa9c382.entry.js +0 -4
- package/dist/ionic/p-1af4d74c.entry.js +0 -4
- package/dist/ionic/p-1d7ef0d2.entry.js +0 -4
- package/dist/ionic/p-26f05d3a.entry.js +0 -4
- package/dist/ionic/p-27d30585.entry.js +0 -4
- package/dist/ionic/p-2bb2cb18.entry.js +0 -4
- package/dist/ionic/p-31e7bd05.entry.js +0 -4
- package/dist/ionic/p-32f53010.entry.js +0 -4
- package/dist/ionic/p-35eb8b5c.entry.js +0 -4
- package/dist/ionic/p-37e720da.entry.js +0 -4
- package/dist/ionic/p-3efa137b.entry.js +0 -4
- package/dist/ionic/p-432bd72c.entry.js +0 -4
- package/dist/ionic/p-47214c72.entry.js +0 -4
- package/dist/ionic/p-4e172429.entry.js +0 -4
- package/dist/ionic/p-5c3da84e.entry.js +0 -4
- package/dist/ionic/p-5d1da0a2.entry.js +0 -4
- package/dist/ionic/p-5d8082fe.entry.js +0 -4
- package/dist/ionic/p-613d3c43.entry.js +0 -4
- package/dist/ionic/p-616e4d4f.entry.js +0 -4
- package/dist/ionic/p-65d611b2.entry.js +0 -4
- package/dist/ionic/p-67806e3f.entry.js +0 -4
- package/dist/ionic/p-68cbb2fc.entry.js +0 -4
- package/dist/ionic/p-737ae9eb.entry.js +0 -4
- package/dist/ionic/p-7b0d6248.entry.js +0 -4
- package/dist/ionic/p-7e71e470.entry.js +0 -4
- package/dist/ionic/p-84d5ce05.entry.js +0 -4
- package/dist/ionic/p-85d49987.entry.js +0 -4
- package/dist/ionic/p-8945088b.entry.js +0 -4
- package/dist/ionic/p-8b155568.entry.js +0 -4
- package/dist/ionic/p-90267c4b.entry.js +0 -4
- package/dist/ionic/p-92ad8a67.entry.js +0 -4
- package/dist/ionic/p-9a97d4e0.entry.js +0 -4
- package/dist/ionic/p-9e4b0894.entry.js +0 -4
- package/dist/ionic/p-9eeaBrnk.js +0 -4
- package/dist/ionic/p-B2kaj8sx.js +0 -4
- package/dist/ionic/p-B4y7nxsg.js +0 -4
- package/dist/ionic/p-B8t9Ro6f.js +0 -4
- package/dist/ionic/p-BEOxsxBw.js +0 -4
- package/dist/ionic/p-BJ2NxSHp.js +0 -4
- package/dist/ionic/p-BLiL8g0v.js +0 -4
- package/dist/ionic/p-BTEOs1at.js +0 -4
- package/dist/ionic/p-BUFIpxKM.js +0 -4
- package/dist/ionic/p-BYRVyMu9.js +0 -4
- package/dist/ionic/p-C0eMdTCW.js +0 -4
- package/dist/ionic/p-CKvCXMs9.js +0 -4
- package/dist/ionic/p-CPTv7G9B.js +0 -4
- package/dist/ionic/p-CtWGkNnJ.js +0 -4
- package/dist/ionic/p-CxMyXUtt.js +0 -4
- package/dist/ionic/p-D13Eaw-8.js +0 -4
- package/dist/ionic/p-DCoy2elM.js +0 -4
- package/dist/ionic/p-DiVJyqlX.js +0 -4
- package/dist/ionic/p-DqN5EA2O.js +0 -4
- package/dist/ionic/p-Dr9fTCb1.js +0 -4
- package/dist/ionic/p-DzWaWHGc.js +0 -4
- package/dist/ionic/p-EkpneKVM.js +0 -4
- package/dist/ionic/p-Nqf6uvGh.js +0 -4
- package/dist/ionic/p-SNAkTDfm.js +0 -4
- package/dist/ionic/p-ab00b0d8.entry.js +0 -4
- package/dist/ionic/p-c2175309.entry.js +0 -4
- package/dist/ionic/p-c4b69d9b.entry.js +0 -4
- package/dist/ionic/p-c4d8641b.entry.js +0 -4
- package/dist/ionic/p-ce637936.entry.js +0 -4
- package/dist/ionic/p-da85e958.entry.js +0 -4
- package/dist/ionic/p-dfa8d673.entry.js +0 -4
- package/dist/ionic/p-e139357c.entry.js +0 -4
- package/dist/ionic/p-e7b7a7b1.entry.js +0 -4
- package/dist/ionic/p-f37ca594.entry.js +0 -4
- package/dist/ionic/p-f8dd336e.entry.js +0 -4
- package/dist/ionic/p-f9de757b.entry.js +0 -4
- package/dist/ionic/p-fe11cf51.entry.js +0 -4
- package/dist/ionic/p-mjKAFv89.js +0 -4
- package/dist/ionic/p-o8OKV5aD.js +0 -4
- package/dist/ionic/p-tcQvqkiX.js +0 -5
- 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
|
@@ -3,25 +3,29 @@
|
|
|
3
3
|
*/
|
|
4
4
|
'use strict';
|
|
5
5
|
|
|
6
|
-
var index = require('./index-
|
|
7
|
-
var
|
|
6
|
+
var index = require('./index-uvry__L4.js');
|
|
7
|
+
var config = require('./config-CjUbvdPW.js');
|
|
8
|
+
var slotMutationController = require('./slot-mutation-controller-DPHmqXdV.js');
|
|
8
9
|
var compareWithUtils = require('./compare-with-utils-DSicavqM.js');
|
|
9
10
|
var validity = require('./validity-BpS37YFM.js');
|
|
10
|
-
var helpers = require('./helpers-
|
|
11
|
-
var overlays = require('./overlays-
|
|
12
|
-
var dir = require('./dir-
|
|
13
|
-
var
|
|
11
|
+
var helpers = require('./helpers-YPQybDph.js');
|
|
12
|
+
var overlays = require('./overlays-KaNVDNqC.js');
|
|
13
|
+
var dir = require('./dir-zwDPRE5K.js');
|
|
14
|
+
var index$2 = require('./index-B7zJsYWS.js');
|
|
15
|
+
var theme = require('./theme-Bw0rpaNN.js');
|
|
14
16
|
var watchOptions = require('./watch-options-CviOsrTS.js');
|
|
15
|
-
var index$1 = require('./index-
|
|
16
|
-
var ionicGlobal = require('./ionic-global-
|
|
17
|
+
var index$1 = require('./index-wOmugbdg.js');
|
|
18
|
+
var ionicGlobal = require('./ionic-global-k6hOWWpn.js');
|
|
19
|
+
var overlayControlLabel = require('./overlay-control-label-D2sdL2O8.js');
|
|
20
|
+
var selectOptionRender = require('./select-option-render-pULCGldr.js');
|
|
17
21
|
require('./index-DkNv4J_i.js');
|
|
18
|
-
require('./hardware-back-button-
|
|
19
|
-
require('./framework-delegate-
|
|
20
|
-
require('./gesture-controller-
|
|
22
|
+
require('./hardware-back-button-fqpYh-kd.js');
|
|
23
|
+
require('./framework-delegate-Dfo5XsGv.js');
|
|
24
|
+
require('./gesture-controller-BDUH7687.js');
|
|
21
25
|
|
|
22
|
-
const selectIosCss = () => `:host{--padding-top:0px;--padding-end:0px;--padding-bottom:0px;--padding-start:0px;--placeholder-color:currentColor;--placeholder-opacity:var(--ion-placeholder-opacity, 0.6);--background:transparent;--border-style:solid;--highlight-color-focused:var(--ion-color-primary, #0054e9);--highlight-color-valid:var(--ion-color-success, #2dd55b);--highlight-color-invalid:var(--ion-color-danger, #c5000f);--highlight-color:var(--highlight-color-focused);display:block;position:relative;width:100%;min-height:44px;font-family:var(--ion-font-family, inherit);white-space:nowrap;cursor:pointer;z-index:2}:host(.select-label-placement-floating),:host(.select-label-placement-stacked){min-height:56px}:host(.ion-color){--highlight-color-focused:var(--ion-color-base)}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0}:host(.select-disabled){pointer-events:none}:host(.has-focus) button{border:2px solid #5e9ed6}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}.select-placeholder{color:var(--placeholder-color);opacity:var(--placeholder-opacity)}button{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;margin:0;padding:0;border:0;outline:0;clip:rect(0 0 0 0);opacity:0;overflow:hidden;-webkit-appearance:none;-moz-appearance:none}.select-icon{-webkit-margin-start:4px;margin-inline-start:4px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0;position:relative;-ms-flex-negative:0;flex-shrink:0}:host(.in-item-color) .select-icon{color:inherit}
|
|
26
|
+
const selectIosCss = () => `:host{--padding-top:0px;--padding-end:0px;--padding-bottom:0px;--padding-start:0px;--placeholder-color:currentColor;--placeholder-opacity:var(--ion-placeholder-opacity, 0.6);--background:transparent;--border-style:solid;--highlight-color-focused:var(--ion-color-primary, #0054e9);--highlight-color-valid:var(--ion-color-success, #2dd55b);--highlight-color-invalid:var(--ion-color-danger, #c5000f);--select-text-media-height:1.5em;--select-text-media-width:1.5em;--select-text-gap:12px;--highlight-color:var(--highlight-color-focused);display:block;position:relative;width:100%;min-height:44px;font-family:var(--ion-font-family, inherit);white-space:nowrap;cursor:pointer;z-index:2}:host(.select-label-placement-floating),:host(.select-label-placement-stacked){min-height:56px}:host(.ion-color){--highlight-color-focused:var(--ion-color-base)}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0}:host(.select-disabled){pointer-events:none}:host(.has-focus) button{border:2px solid #5e9ed6}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}.select-placeholder{color:var(--placeholder-color);opacity:var(--placeholder-opacity)}button{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;margin:0;padding:0;border:0;outline:0;clip:rect(0 0 0 0);opacity:0;overflow:hidden;-webkit-appearance:none;-moz-appearance:none}.select-icon{-webkit-margin-start:4px;margin-inline-start:4px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0;position:relative;-ms-flex-negative:0;flex-shrink:0}:host(.in-item-color) .select-icon{color:inherit}.select-text{-ms-flex:1;flex:1;min-width:16px;font-size:inherit;text-overflow:ellipsis;white-space:inherit;overflow:hidden}.select-text>*+*{-webkit-margin-start:var(--select-text-gap);margin-inline-start:var(--select-text-gap)}.select-text img,.select-text ion-img,.select-text ion-icon,.select-text ion-thumbnail,.select-text ion-avatar{border-radius:var(--select-text-media-border-radius);width:var(--select-text-media-width);height:var(--select-text-media-height);border-width:var(--select-text-media-border-width);border-style:var(--select-text-media-border-style);border-color:var(--select-text-media-border-color)}.select-wrapper{-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);border-radius:var(--border-radius);display:-ms-flexbox;display:flex;position:relative;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;height:inherit;min-height:inherit;-webkit-transition:background-color 15ms linear;transition:background-color 15ms linear;background:var(--background);line-height:normal;cursor:inherit;-webkit-box-sizing:border-box;box-sizing:border-box}.select-wrapper .select-placeholder{-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.select-control{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:inherit;flex-direction:inherit;-ms-flex-align:center;align-items:center;-ms-flex-pack:inherit;justify-content:inherit;min-width:0}:host(.ion-touched.ion-invalid){--highlight-color:var(--highlight-color-invalid)}:host(.ion-valid){--highlight-color:var(--highlight-color-valid)}.select-bottom{-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:5px;padding-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;border-top:var(--border-width) var(--border-style) var(--border-color);font-size:0.75rem;white-space:normal}:host(.has-focus.ion-valid),:host(.select-expanded.ion-valid),:host(.ion-touched.ion-invalid),:host(.select-expanded.ion-touched.ion-invalid){--border-color:var(--highlight-color)}.select-bottom .error-text{display:none;color:var(--highlight-color-invalid)}.select-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .select-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .select-bottom .helper-text{display:none}.label-text-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-width:0;max-width:200px;-webkit-transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);pointer-events:none}:host(.skip-label-transition) .label-text-wrapper{-webkit-transition:none;transition:none}.label-text,::slotted([slot=label]){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.label-text-wrapper-hidden,.select-outline-notch-hidden{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-negative:100000;flex-shrink:100000;-ms-flex-align:center;align-items:center;-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);overflow:hidden}:host(.select-justify-space-between) .select-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.select-justify-start) .select-wrapper{-ms-flex-pack:start;justify-content:start}:host(.select-justify-end) .select-wrapper{-ms-flex-pack:end;justify-content:end}:host(.select-label-placement-start) .select-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.select-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px;margin-top:0;margin-bottom:0}:host(.select-label-placement-end) .select-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse}:host(.select-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0}:host(.select-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px;margin-top:0;margin-bottom:0}:host(.select-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.select-label-placement-stacked) .select-control,:host(.select-label-placement-floating) .select-control{-ms-flex-direction:column;flex-direction:column;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:start;align-items:start}:host(.select-label-placement-stacked) .label-text-wrapper,:host(.select-label-placement-floating) .label-text-wrapper{max-width:100%}:host(.select-ltr.select-label-placement-stacked) .label-text-wrapper,:host(.select-ltr.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host(.select-rtl.select-label-placement-stacked) .label-text-wrapper,:host(.select-rtl.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}:host(.select-label-placement-stacked) .native-wrapper,:host(.select-label-placement-floating) .native-wrapper{-ms-flex-positive:1;flex-grow:1;width:100%}:host(.select-label-placement-floating) .label-text-wrapper{-webkit-transform:translateY(100%) scale(1);transform:translateY(100%) scale(1)}:host(.select-label-placement-floating) .native-wrapper .select-placeholder{opacity:0}:host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder{opacity:var(--placeholder-opacity)}:host(.label-floating) .label-text-wrapper{-webkit-transform:translateY(50%) scale(0.75);transform:translateY(50%) scale(0.75);max-width:calc(100% / 0.75)}.select-start,.select-end{display:-ms-flexbox;display:flex;position:relative;-ms-flex-negative:0;flex-shrink:0;-ms-flex-align:center;align-items:center}::slotted([slot=start]),::slotted([slot=end]){-ms-flex-negative:0;flex-shrink:0}::slotted([slot=start]:last-of-type){-webkit-margin-end:16px;margin-inline-end:16px;-webkit-margin-start:0;margin-inline-start:0}::slotted([slot=end]:first-of-type){-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host{--border-width:0.55px;--border-color:var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-250, var(--ion-background-color-step-250, #c8c7cc))));--highlight-height:0px}.select-icon{width:1.125rem;height:1.125rem;color:var(--ion-color-step-650, var(--ion-text-color-step-350, #595959))}:host(.select-disabled){opacity:0.3}::slotted(ion-button[slot=start].button-has-icon-only),::slotted(ion-button[slot=end].button-has-icon-only){--border-radius:50%;--padding-start:0;--padding-end:0;--padding-top:0;--padding-bottom:0;aspect-ratio:1}`;
|
|
23
27
|
|
|
24
|
-
const selectMdCss = () => `:host{--padding-top:0px;--padding-end:0px;--padding-bottom:0px;--padding-start:0px;--placeholder-color:currentColor;--placeholder-opacity:var(--ion-placeholder-opacity, 0.6);--background:transparent;--border-style:solid;--highlight-color-focused:var(--ion-color-primary, #0054e9);--highlight-color-valid:var(--ion-color-success, #2dd55b);--highlight-color-invalid:var(--ion-color-danger, #c5000f);--highlight-color:var(--highlight-color-focused);display:block;position:relative;width:100%;min-height:44px;font-family:var(--ion-font-family, inherit);white-space:nowrap;cursor:pointer;z-index:2}:host(.select-label-placement-floating),:host(.select-label-placement-stacked){min-height:56px}:host(.ion-color){--highlight-color-focused:var(--ion-color-base)}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0}:host(.select-disabled){pointer-events:none}:host(.has-focus) button{border:2px solid #5e9ed6}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}.select-placeholder{color:var(--placeholder-color);opacity:var(--placeholder-opacity)}button{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;margin:0;padding:0;border:0;outline:0;clip:rect(0 0 0 0);opacity:0;overflow:hidden;-webkit-appearance:none;-moz-appearance:none}.select-icon{-webkit-margin-start:4px;margin-inline-start:4px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0;position:relative;-ms-flex-negative:0;flex-shrink:0}:host(.in-item-color) .select-icon{color:inherit}:host(.select-label-placement-stacked) .select-icon,:host(.select-label-placement-floating) .select-icon{position:absolute;height:100%}:host(.select-ltr.select-label-placement-stacked) .select-icon,:host(.select-ltr.select-label-placement-floating) .select-icon{right:var(--padding-end, 0)}:host(.select-rtl.select-label-placement-stacked) .select-icon,:host(.select-rtl.select-label-placement-floating) .select-icon{left:var(--padding-start, 0)}.select-text{-ms-flex:1;flex:1;min-width:16px;font-size:inherit;text-overflow:ellipsis;white-space:inherit;overflow:hidden}.select-wrapper{-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);border-radius:var(--border-radius);display:-ms-flexbox;display:flex;position:relative;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;height:inherit;min-height:inherit;-webkit-transition:background-color 15ms linear;transition:background-color 15ms linear;background:var(--background);line-height:normal;cursor:inherit;-webkit-box-sizing:border-box;box-sizing:border-box}.select-wrapper .select-placeholder{-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.select-wrapper-inner{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;overflow:hidden}:host(.select-label-placement-stacked) .select-wrapper-inner,:host(.select-label-placement-floating) .select-wrapper-inner{-ms-flex-positive:1;flex-grow:1}:host(.ion-touched.ion-invalid){--highlight-color:var(--highlight-color-invalid)}:host(.ion-valid){--highlight-color:var(--highlight-color-valid)}.select-bottom{-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:5px;padding-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;border-top:var(--border-width) var(--border-style) var(--border-color);font-size:0.75rem;white-space:normal}:host(.has-focus.ion-valid),:host(.select-expanded.ion-valid),:host(.ion-touched.ion-invalid),:host(.select-expanded.ion-touched.ion-invalid){--border-color:var(--highlight-color)}.select-bottom .error-text{display:none;color:var(--highlight-color-invalid)}.select-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .select-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .select-bottom .helper-text{display:none}.label-text-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;max-width:200px;-webkit-transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);pointer-events:none}.label-text,::slotted([slot=label]){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.label-text-wrapper-hidden,.select-outline-notch-hidden{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);overflow:hidden}:host(.select-justify-space-between) .select-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.select-justify-start) .select-wrapper{-ms-flex-pack:start;justify-content:start}:host(.select-justify-end) .select-wrapper{-ms-flex-pack:end;justify-content:end}:host(.select-label-placement-start) .select-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.select-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px;margin-top:0;margin-bottom:0}:host(.select-label-placement-end) .select-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse}:host(.select-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0}:host(.select-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px;margin-top:0;margin-bottom:0}:host(.select-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.select-label-placement-stacked) .select-wrapper,:host(.select-label-placement-floating) .select-wrapper{-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:start}:host(.select-label-placement-stacked) .label-text-wrapper,:host(.select-label-placement-floating) .label-text-wrapper{max-width:100%}:host(.select-ltr.select-label-placement-stacked) .label-text-wrapper,:host(.select-ltr.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host(.select-rtl.select-label-placement-stacked) .label-text-wrapper,:host(.select-rtl.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}:host(.select-label-placement-stacked) .native-wrapper,:host(.select-label-placement-floating) .native-wrapper{margin-left:0;margin-right:0;margin-top:1px;margin-bottom:0;-ms-flex-positive:1;flex-grow:1;width:100%}:host(.select-label-placement-floating) .label-text-wrapper{-webkit-transform:translateY(100%) scale(1);transform:translateY(100%) scale(1)}:host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder{opacity:0}:host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,:host(.has-focus.select-label-placement-floating) .native-wrapper .select-placeholder,:host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder{opacity:1}:host(.label-floating) .label-text-wrapper{-webkit-transform:translateY(50%) scale(0.75);transform:translateY(50%) scale(0.75);max-width:calc(100% / 0.75)}::slotted([slot=start]),::slotted([slot=end]){-ms-flex-negative:0;flex-shrink:0}::slotted([slot=start]:last-of-type){-webkit-margin-end:16px;margin-inline-end:16px;-webkit-margin-start:0;margin-inline-start:0}::slotted([slot=end]:first-of-type){-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.select-fill-solid){--background:var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));--border-color:var(--ion-color-step-500, var(--ion-background-color-step-500, gray));--border-radius:4px;--padding-start:16px;--padding-end:16px;min-height:56px}:host(.select-fill-solid) .select-wrapper{border-bottom:var(--border-width) var(--border-style) var(--border-color)}:host(.select-expanded.select-fill-solid.ion-valid),:host(.has-focus.select-fill-solid.ion-valid),:host(.select-fill-solid.ion-touched.ion-invalid){--border-color:var(--highlight-color)}:host(.select-fill-solid) .select-bottom{border-top:none}@media (any-hover: hover){:host(.select-fill-solid:hover){--background:var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));--border-color:var(--ion-color-step-750, var(--ion-background-color-step-750, #404040))}}:host(.select-fill-solid.select-expanded),:host(.select-fill-solid.has-focus){--background:var(--ion-color-step-150, var(--ion-background-color-step-150, #d9d9d9));--border-color:var(--highlight-color)}:host(.select-fill-solid) .select-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0px;border-end-start-radius:0px}:host(.label-floating.select-fill-solid) .label-text-wrapper{max-width:calc(100% / 0.75)}:host(.in-item.select-expanded.select-fill-solid) .select-wrapper .select-icon,:host(.in-item.has-focus.select-fill-solid) .select-wrapper .select-icon,:host(.in-item.has-focus.ion-valid.select-fill-solid) .select-wrapper .select-icon,:host(.in-item.ion-touched.ion-invalid.select-fill-solid) .select-wrapper .select-icon{color:var(--highlight-color)}:host(.select-fill-outline){--border-color:var(--ion-color-step-300, var(--ion-background-color-step-300, #b3b3b3));--border-radius:4px;--padding-start:16px;--padding-end:16px;min-height:56px}:host(.select-fill-outline.select-shape-round){--border-radius:28px;--padding-start:32px;--padding-end:32px}:host(.has-focus.select-fill-outline.ion-valid),:host(.select-fill-outline.ion-touched.ion-invalid){--border-color:var(--highlight-color)}@media (any-hover: hover){:host(.select-fill-outline:hover){--border-color:var(--ion-color-step-750, var(--ion-background-color-step-750, #404040))}}:host(.select-fill-outline.select-expanded),:host(.select-fill-outline.has-focus){--border-width:var(--highlight-height);--border-color:var(--highlight-color)}:host(.select-fill-outline) .select-bottom{border-top:none}:host(.select-fill-outline) .select-wrapper{border-bottom:none}:host(.select-ltr.select-fill-outline.select-label-placement-stacked) .label-text-wrapper,:host(.select-ltr.select-fill-outline.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host(.select-rtl.select-fill-outline.select-label-placement-stacked) .label-text-wrapper,:host(.select-rtl.select-fill-outline.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}:host(.select-fill-outline.select-label-placement-stacked) .label-text-wrapper,:host(.select-fill-outline.select-label-placement-floating) .label-text-wrapper{position:absolute;max-width:calc(100% - var(--padding-start) - var(--padding-end))}:host(.select-fill-outline) .label-text-wrapper{position:relative;z-index:1}:host(.label-floating.select-fill-outline) .label-text-wrapper{-webkit-transform:translateY(-32%) scale(0.75);transform:translateY(-32%) scale(0.75);margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;max-width:calc((100% - var(--padding-start) - var(--padding-end) - 8px) / 0.75)}:host(.select-fill-outline.select-label-placement-stacked) select,:host(.select-fill-outline.select-label-placement-floating) select{margin-left:0;margin-right:0;margin-top:6px;margin-bottom:6px}:host(.select-fill-outline) .select-outline-container{left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;width:100%;height:100%}:host(.select-fill-outline) .select-outline-start,:host(.select-fill-outline) .select-outline-end{pointer-events:none}:host(.select-fill-outline) .select-outline-start,:host(.select-fill-outline) .select-outline-notch,:host(.select-fill-outline) .select-outline-end{border-top:var(--border-width) var(--border-style) var(--border-color);border-bottom:var(--border-width) var(--border-style) var(--border-color);-webkit-box-sizing:border-box;box-sizing:border-box}:host(.select-fill-outline) .select-outline-notch{max-width:calc(100% - var(--padding-start) - var(--padding-end))}:host(.select-fill-outline) .notch-spacer{-webkit-padding-end:8px;padding-inline-end:8px;font-size:calc(1em * 0.75);opacity:0;pointer-events:none}:host(.select-fill-outline) .select-outline-start{-webkit-border-start:var(--border-width) var(--border-style) var(--border-color);border-inline-start:var(--border-width) var(--border-style) var(--border-color)}:host(.select-fill-outline) .select-outline-start{border-start-start-radius:var(--border-radius);border-start-end-radius:0px;border-end-end-radius:0px;border-end-start-radius:var(--border-radius)}:host(.select-fill-outline) .select-outline-start{width:calc(var(--padding-start) - 4px)}:host(.select-fill-outline) .select-outline-end{-webkit-border-end:var(--border-width) var(--border-style) var(--border-color);border-inline-end:var(--border-width) var(--border-style) var(--border-color)}:host(.select-fill-outline) .select-outline-end{border-start-start-radius:0px;border-start-end-radius:var(--border-radius);border-end-end-radius:var(--border-radius);border-end-start-radius:0px}:host(.select-fill-outline) .select-outline-end{-ms-flex-positive:1;flex-grow:1}:host(.label-floating.select-fill-outline) .select-outline-notch{border-top:none}:host(.in-item.select-expanded.select-fill-outline) .select-wrapper .select-icon,:host(.in-item.has-focus.select-fill-outline) .select-wrapper .select-icon,:host(.in-item.has-focus.ion-valid.select-fill-outline) .select-wrapper .select-icon,:host(.in-item.ion-touched.ion-invalid.select-fill-outline) .select-wrapper .select-icon{color:var(--highlight-color)}:host{--border-width:1px;--border-color:var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, var(--ion-background-color-step-150, rgba(0, 0, 0, 0.13)))));--highlight-height:2px}:host(.select-label-placement-floating.select-expanded) .label-text-wrapper,:host(.select-label-placement-floating.has-focus) .label-text-wrapper,:host(.select-label-placement-stacked.select-expanded) .label-text-wrapper,:host(.select-label-placement-stacked.has-focus) .label-text-wrapper{color:var(--highlight-color)}:host(.has-focus.select-label-placement-floating.ion-valid) .label-text-wrapper,:host(.select-label-placement-floating.ion-touched.ion-invalid) .label-text-wrapper,:host(.has-focus.select-label-placement-stacked.ion-valid) .label-text-wrapper,:host(.select-label-placement-stacked.ion-touched.ion-invalid) .label-text-wrapper{color:var(--highlight-color)}.select-highlight{bottom:-1px;position:absolute;width:100%;height:var(--highlight-height);-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform 200ms;transition:-webkit-transform 200ms;transition:transform 200ms;transition:transform 200ms, -webkit-transform 200ms;background:var(--highlight-color)}.select-highlight{inset-inline-start:0}:host(.select-expanded) .select-highlight,:host(.has-focus) .select-highlight{-webkit-transform:scale(1);transform:scale(1)}:host(.in-item) .select-highlight{bottom:0}:host(.in-item) .select-highlight{inset-inline-start:0}.select-icon{width:0.8125rem;-webkit-transition:-webkit-transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);transition:-webkit-transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);transition:transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);transition:transform 0.15s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);color:var(--ion-color-step-500, var(--ion-text-color-step-500, gray))}:host(.select-expanded:not(.has-expanded-icon)) .select-icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}:host(.in-item.select-expanded) .select-wrapper .select-icon,:host(.in-item.has-focus) .select-wrapper .select-icon,:host(.in-item.has-focus.ion-valid) .select-wrapper .select-icon,:host(.in-item.ion-touched.ion-invalid) .select-wrapper .select-icon{color:var(--ion-color-step-500, var(--ion-text-color-step-500, gray))}:host(.select-expanded) .select-wrapper .select-icon,:host(.has-focus.ion-valid) .select-wrapper .select-icon,:host(.ion-touched.ion-invalid) .select-wrapper .select-icon,:host(.has-focus) .select-wrapper .select-icon{color:var(--highlight-color)}:host(.select-shape-round){--border-radius:16px}:host(.select-label-placement-stacked) .select-wrapper-inner,:host(.select-label-placement-floating) .select-wrapper-inner{width:calc(100% - 0.8125rem - 4px)}:host(.select-disabled){opacity:0.38}::slotted(ion-button[slot=start].button-has-icon-only),::slotted(ion-button[slot=end].button-has-icon-only){--border-radius:50%;--padding-start:8px;--padding-end:8px;--padding-top:8px;--padding-bottom:8px;aspect-ratio:1;min-height:40px}`;
|
|
28
|
+
const selectMdCss = () => `:host{--padding-top:0px;--padding-end:0px;--padding-bottom:0px;--padding-start:0px;--placeholder-color:currentColor;--placeholder-opacity:var(--ion-placeholder-opacity, 0.6);--background:transparent;--border-style:solid;--highlight-color-focused:var(--ion-color-primary, #0054e9);--highlight-color-valid:var(--ion-color-success, #2dd55b);--highlight-color-invalid:var(--ion-color-danger, #c5000f);--select-text-media-height:1.5em;--select-text-media-width:1.5em;--select-text-gap:12px;--highlight-color:var(--highlight-color-focused);display:block;position:relative;width:100%;min-height:44px;font-family:var(--ion-font-family, inherit);white-space:nowrap;cursor:pointer;z-index:2}:host(.select-label-placement-floating),:host(.select-label-placement-stacked){min-height:56px}:host(.ion-color){--highlight-color-focused:var(--ion-color-base)}:host(.in-item){-ms-flex:1 1 0px;flex:1 1 0}:host(.select-disabled){pointer-events:none}:host(.has-focus) button{border:2px solid #5e9ed6}:host([slot=start]),:host([slot=end]){-ms-flex:initial;flex:initial;width:auto}.select-placeholder{color:var(--placeholder-color);opacity:var(--placeholder-opacity)}button{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;margin:0;padding:0;border:0;outline:0;clip:rect(0 0 0 0);opacity:0;overflow:hidden;-webkit-appearance:none;-moz-appearance:none}.select-icon{-webkit-margin-start:4px;margin-inline-start:4px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0;position:relative;-ms-flex-negative:0;flex-shrink:0}:host(.in-item-color) .select-icon{color:inherit}.select-text{-ms-flex:1;flex:1;min-width:16px;font-size:inherit;text-overflow:ellipsis;white-space:inherit;overflow:hidden}.select-text>*+*{-webkit-margin-start:var(--select-text-gap);margin-inline-start:var(--select-text-gap)}.select-text img,.select-text ion-img,.select-text ion-icon,.select-text ion-thumbnail,.select-text ion-avatar{border-radius:var(--select-text-media-border-radius);width:var(--select-text-media-width);height:var(--select-text-media-height);border-width:var(--select-text-media-border-width);border-style:var(--select-text-media-border-style);border-color:var(--select-text-media-border-color)}.select-wrapper{-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:var(--padding-top);padding-bottom:var(--padding-bottom);border-radius:var(--border-radius);display:-ms-flexbox;display:flex;position:relative;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:stretch;align-items:stretch;-ms-flex-pack:justify;justify-content:space-between;height:inherit;min-height:inherit;-webkit-transition:background-color 15ms linear;transition:background-color 15ms linear;background:var(--background);line-height:normal;cursor:inherit;-webkit-box-sizing:border-box;box-sizing:border-box}.select-wrapper .select-placeholder{-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1)}.select-control{display:-ms-flexbox;display:flex;-ms-flex:1;flex:1;-ms-flex-direction:inherit;flex-direction:inherit;-ms-flex-align:center;align-items:center;-ms-flex-pack:inherit;justify-content:inherit;min-width:0}:host(.ion-touched.ion-invalid){--highlight-color:var(--highlight-color-invalid)}:host(.ion-valid){--highlight-color:var(--highlight-color-valid)}.select-bottom{-webkit-padding-start:var(--padding-start);padding-inline-start:var(--padding-start);-webkit-padding-end:var(--padding-end);padding-inline-end:var(--padding-end);padding-top:5px;padding-bottom:0;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;border-top:var(--border-width) var(--border-style) var(--border-color);font-size:0.75rem;white-space:normal}:host(.has-focus.ion-valid),:host(.select-expanded.ion-valid),:host(.ion-touched.ion-invalid),:host(.select-expanded.ion-touched.ion-invalid){--border-color:var(--highlight-color)}.select-bottom .error-text{display:none;color:var(--highlight-color-invalid)}.select-bottom .helper-text{display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d))}:host(.ion-touched.ion-invalid) .select-bottom .error-text{display:block}:host(.ion-touched.ion-invalid) .select-bottom .helper-text{display:none}.label-text-wrapper{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;min-width:0;max-width:200px;-webkit-transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:color 150ms cubic-bezier(0.4, 0, 0.2, 1), transform 150ms cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 150ms cubic-bezier(0.4, 0, 0.2, 1);pointer-events:none}:host(.skip-label-transition) .label-text-wrapper{-webkit-transition:none;transition:none}.label-text,::slotted([slot=label]){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.label-text-wrapper-hidden,.select-outline-notch-hidden{display:none}.native-wrapper{display:-ms-flexbox;display:flex;-ms-flex-negative:100000;flex-shrink:100000;-ms-flex-align:center;align-items:center;-webkit-transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);transition:opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);overflow:hidden}:host(.select-justify-space-between) .select-wrapper{-ms-flex-pack:justify;justify-content:space-between}:host(.select-justify-start) .select-wrapper{-ms-flex-pack:start;justify-content:start}:host(.select-justify-end) .select-wrapper{-ms-flex-pack:end;justify-content:end}:host(.select-label-placement-start) .select-wrapper{-ms-flex-direction:row;flex-direction:row}:host(.select-label-placement-start) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px;margin-top:0;margin-bottom:0}:host(.select-label-placement-end) .select-wrapper{-ms-flex-direction:row-reverse;flex-direction:row-reverse}:host(.select-label-placement-end) .label-text-wrapper{-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0;margin-top:0;margin-bottom:0}:host(.select-label-placement-fixed) .label-text-wrapper{-webkit-margin-start:0;margin-inline-start:0;-webkit-margin-end:16px;margin-inline-end:16px;margin-top:0;margin-bottom:0}:host(.select-label-placement-fixed) .label-text-wrapper{-ms-flex:0 0 100px;flex:0 0 100px;width:100px;min-width:100px;max-width:200px}:host(.select-label-placement-stacked) .select-control,:host(.select-label-placement-floating) .select-control{-ms-flex-direction:column;flex-direction:column;-ms-flex-positive:1;flex-grow:1;-ms-flex-align:start;align-items:start}:host(.select-label-placement-stacked) .label-text-wrapper,:host(.select-label-placement-floating) .label-text-wrapper{max-width:100%}:host(.select-ltr.select-label-placement-stacked) .label-text-wrapper,:host(.select-ltr.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host(.select-rtl.select-label-placement-stacked) .label-text-wrapper,:host(.select-rtl.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}:host(.select-label-placement-stacked) .native-wrapper,:host(.select-label-placement-floating) .native-wrapper{-ms-flex-positive:1;flex-grow:1;width:100%}:host(.select-label-placement-floating) .label-text-wrapper{-webkit-transform:translateY(100%) scale(1);transform:translateY(100%) scale(1)}:host(.select-label-placement-floating) .native-wrapper .select-placeholder{opacity:0}:host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder{opacity:var(--placeholder-opacity)}:host(.label-floating) .label-text-wrapper{-webkit-transform:translateY(50%) scale(0.75);transform:translateY(50%) scale(0.75);max-width:calc(100% / 0.75)}.select-start,.select-end{display:-ms-flexbox;display:flex;position:relative;-ms-flex-negative:0;flex-shrink:0;-ms-flex-align:center;align-items:center}::slotted([slot=start]),::slotted([slot=end]){-ms-flex-negative:0;flex-shrink:0}::slotted([slot=start]:last-of-type){-webkit-margin-end:16px;margin-inline-end:16px;-webkit-margin-start:0;margin-inline-start:0}::slotted([slot=end]:first-of-type){-webkit-margin-start:16px;margin-inline-start:16px;-webkit-margin-end:0;margin-inline-end:0}:host(.select-fill-solid){--background:var(--ion-color-step-50, var(--ion-background-color-step-50, #f2f2f2));--border-color:var(--ion-color-step-500, var(--ion-background-color-step-500, gray));--border-radius:4px;--padding-start:16px;--padding-end:16px;min-height:56px}:host(.select-fill-solid) .select-wrapper{border-bottom:var(--border-width) var(--border-style) var(--border-color)}:host(.select-expanded.select-fill-solid.ion-valid),:host(.has-focus.select-fill-solid.ion-valid),:host(.select-fill-solid.ion-touched.ion-invalid){--border-color:var(--highlight-color)}:host(.select-fill-solid) .select-bottom{border-top:none}@media (any-hover: hover){:host(.select-fill-solid:hover){--background:var(--ion-color-step-100, var(--ion-background-color-step-100, #e6e6e6));--border-color:var(--ion-color-step-750, var(--ion-background-color-step-750, #404040))}}:host(.select-fill-solid.select-expanded),:host(.select-fill-solid.has-focus){--background:var(--ion-color-step-150, var(--ion-background-color-step-150, #d9d9d9));--border-color:var(--highlight-color)}:host(.select-fill-solid) .select-wrapper{border-start-start-radius:var(--border-radius);border-start-end-radius:var(--border-radius);border-end-end-radius:0px;border-end-start-radius:0px}:host(.label-floating.select-fill-solid) .label-text-wrapper{max-width:calc(100% / 0.75)}:host(.in-item.select-expanded.select-fill-solid) .select-wrapper .select-icon,:host(.in-item.has-focus.select-fill-solid) .select-wrapper .select-icon,:host(.in-item.has-focus.ion-valid.select-fill-solid) .select-wrapper .select-icon,:host(.in-item.ion-touched.ion-invalid.select-fill-solid) .select-wrapper .select-icon{color:var(--highlight-color)}:host(.select-fill-outline){--border-color:var(--ion-color-step-300, var(--ion-background-color-step-300, #b3b3b3));--border-radius:4px;--padding-start:16px;--padding-end:16px;--internal-start-container-adjustment:0px;min-height:56px}:host(.select-fill-outline.select-shape-round){--border-radius:28px;--padding-start:32px;--padding-end:32px}:host(.has-focus.select-fill-outline.ion-valid),:host(.select-fill-outline.ion-touched.ion-invalid){--border-color:var(--highlight-color)}@media (any-hover: hover){:host(.select-fill-outline:hover){--border-color:var(--ion-color-step-750, var(--ion-background-color-step-750, #404040))}}:host(.select-fill-outline.select-expanded),:host(.select-fill-outline.has-focus){--border-width:var(--highlight-height);--border-color:var(--highlight-color)}:host(.select-fill-outline) .select-bottom{border-top:none}:host(.select-fill-outline) .select-wrapper{border-bottom:none}:host(.select-ltr.select-fill-outline.select-label-placement-stacked) .label-text-wrapper,:host(.select-ltr.select-fill-outline.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:left top;transform-origin:left top}:host(.select-rtl.select-fill-outline.select-label-placement-stacked) .label-text-wrapper,:host(.select-rtl.select-fill-outline.select-label-placement-floating) .label-text-wrapper{-webkit-transform-origin:right top;transform-origin:right top}:host(.select-fill-outline.select-label-placement-stacked) .label-text-wrapper,:host(.select-fill-outline.select-label-placement-floating) .label-text-wrapper{position:absolute;max-width:100%}:host(.select-fill-outline) .label-text-wrapper{position:relative;z-index:1}:host(.select-fill-outline:not(.label-floating)) .select-control{position:relative}:host(.label-floating.select-fill-outline) .label-text-wrapper{-webkit-transform:translate(var(--internal-start-container-adjustment, 0px), -32%) scale(0.75);transform:translate(var(--internal-start-container-adjustment, 0px), -32%) scale(0.75);margin-left:0;margin-right:0;margin-top:0;margin-bottom:0;max-width:calc((100% - var(--padding-start) - var(--padding-end) - 8px) / 0.75)}:host(.select-fill-outline.select-label-placement-stacked) select,:host(.select-fill-outline.select-label-placement-floating) select{margin-left:0;margin-right:0;margin-top:6px;margin-bottom:6px}:host(.select-fill-outline) .select-outline-container{left:0;right:0;top:0;bottom:0;display:-ms-flexbox;display:flex;position:absolute;width:100%;height:100%}:host(.select-fill-outline) .select-outline-start,:host(.select-fill-outline) .select-outline-end{pointer-events:none}:host(.select-fill-outline) .select-outline-start,:host(.select-fill-outline) .select-outline-notch,:host(.select-fill-outline) .select-outline-end{border-top:var(--border-width) var(--border-style) var(--border-color);border-bottom:var(--border-width) var(--border-style) var(--border-color);-webkit-box-sizing:border-box;box-sizing:border-box}:host(.select-fill-outline) .select-outline-notch{max-width:calc(100% - var(--padding-start) - var(--padding-end))}:host(.select-fill-outline) .notch-spacer{-webkit-padding-end:8px;padding-inline-end:8px;font-size:calc(1em * 0.75);opacity:0;pointer-events:none}:host(.select-fill-outline) .select-outline-start{-webkit-border-start:var(--border-width) var(--border-style) var(--border-color);border-inline-start:var(--border-width) var(--border-style) var(--border-color);border-start-start-radius:var(--border-radius);border-start-end-radius:0px;border-end-end-radius:0px;border-end-start-radius:var(--border-radius);width:calc(var(--padding-start) - 4px)}:host(.select-fill-outline) .select-outline-end{-webkit-border-end:var(--border-width) var(--border-style) var(--border-color);border-inline-end:var(--border-width) var(--border-style) var(--border-color);border-start-start-radius:0px;border-start-end-radius:var(--border-radius);border-end-end-radius:var(--border-radius);border-end-start-radius:0px;-ms-flex-positive:1;flex-grow:1}:host(.label-floating.select-fill-outline) .select-outline-notch{border-top:none}:host(.in-item.select-expanded.select-fill-outline) .select-wrapper .select-icon,:host(.in-item.has-focus.select-fill-outline) .select-wrapper .select-icon,:host(.in-item.has-focus.ion-valid.select-fill-outline) .select-wrapper .select-icon,:host(.in-item.ion-touched.ion-invalid.select-fill-outline) .select-wrapper .select-icon{color:var(--highlight-color)}:host{--border-width:1px;--border-color:var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, var(--ion-background-color-step-150, rgba(0, 0, 0, 0.13)))));--highlight-height:2px}:host(.select-label-placement-floating.select-expanded) .label-text-wrapper,:host(.select-label-placement-floating.has-focus) .label-text-wrapper,:host(.select-label-placement-stacked.select-expanded) .label-text-wrapper,:host(.select-label-placement-stacked.has-focus) .label-text-wrapper{color:var(--highlight-color)}:host(.has-focus.select-label-placement-floating.ion-valid) .label-text-wrapper,:host(.select-label-placement-floating.ion-touched.ion-invalid) .label-text-wrapper,:host(.has-focus.select-label-placement-stacked.ion-valid) .label-text-wrapper,:host(.select-label-placement-stacked.ion-touched.ion-invalid) .label-text-wrapper{color:var(--highlight-color)}.select-highlight{bottom:-1px;position:absolute;width:100%;height:var(--highlight-height);-webkit-transform:scale(0);transform:scale(0);-webkit-transition:-webkit-transform 200ms;transition:-webkit-transform 200ms;transition:transform 200ms;transition:transform 200ms, -webkit-transform 200ms;background:var(--highlight-color)}.select-highlight{inset-inline-start:0}:host(.select-expanded) .select-highlight,:host(.has-focus) .select-highlight{-webkit-transform:scale(1);transform:scale(1)}:host(.in-item) .select-highlight{bottom:0}:host(.in-item) .select-highlight{inset-inline-start:0}.select-icon{width:0.8125rem;-webkit-transition:-webkit-transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);transition:-webkit-transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);transition:transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);transition:transform 0.15s cubic-bezier(0.4, 0, 0.2, 1), -webkit-transform 0.15s cubic-bezier(0.4, 0, 0.2, 1);color:var(--ion-color-step-500, var(--ion-text-color-step-500, gray))}:host(.select-expanded:not(.has-expanded-icon)) .select-icon{-webkit-transform:rotate(180deg);transform:rotate(180deg)}:host(.in-item.select-expanded) .select-wrapper .select-icon,:host(.in-item.has-focus) .select-wrapper .select-icon,:host(.in-item.has-focus.ion-valid) .select-wrapper .select-icon,:host(.in-item.ion-touched.ion-invalid) .select-wrapper .select-icon{color:var(--ion-color-step-500, var(--ion-text-color-step-500, gray))}:host(.select-expanded) .select-wrapper .select-icon,:host(.has-focus.ion-valid) .select-wrapper .select-icon,:host(.ion-touched.ion-invalid) .select-wrapper .select-icon,:host(.has-focus) .select-wrapper .select-icon{color:var(--highlight-color)}:host(.select-shape-round){--border-radius:16px}:host(.select-disabled){opacity:0.38}::slotted(ion-button[slot=start].button-has-icon-only),::slotted(ion-button[slot=end].button-has-icon-only){--border-radius:50%;--padding-start:8px;--padding-end:8px;--padding-top:8px;--padding-bottom:8px;aspect-ratio:1;min-height:40px}`;
|
|
25
29
|
|
|
26
30
|
const Select = class {
|
|
27
31
|
constructor(hostRef) {
|
|
@@ -32,141 +36,240 @@ const Select = class {
|
|
|
32
36
|
this.ionFocus = index.createEvent(this, "ionFocus", 7);
|
|
33
37
|
this.ionBlur = index.createEvent(this, "ionBlur", 7);
|
|
34
38
|
this.ionStyle = index.createEvent(this, "ionStyle", 7);
|
|
35
|
-
this.inputId = `ion-sel-${selectIds++}`;
|
|
36
|
-
this.helperTextId = `${this.inputId}-helper-text`;
|
|
37
|
-
this.errorTextId = `${this.inputId}-error-text`;
|
|
38
|
-
this.inheritedAttributes = {};
|
|
39
|
-
this.isExpanded = false;
|
|
40
|
-
/**
|
|
41
|
-
* The `hasFocus` state ensures the focus class is
|
|
42
|
-
* added regardless of how the element is focused.
|
|
43
|
-
* The `ion-focused` class only applies when focused
|
|
44
|
-
* via tabbing, not by clicking.
|
|
45
|
-
* The `has-focus` logic was added to ensure the class
|
|
46
|
-
* is applied in both cases.
|
|
47
|
-
*/
|
|
48
|
-
this.hasFocus = false;
|
|
49
|
-
/**
|
|
50
|
-
* Track validation state for proper aria-live announcements.
|
|
51
|
-
*/
|
|
52
|
-
this.isInvalid = false;
|
|
53
|
-
/**
|
|
54
|
-
* The text to display on the cancel button.
|
|
55
|
-
*/
|
|
56
|
-
this.cancelText = 'Cancel';
|
|
57
|
-
/**
|
|
58
|
-
* If `true`, the user cannot interact with the select.
|
|
59
|
-
*/
|
|
60
|
-
this.disabled = false;
|
|
61
|
-
/**
|
|
62
|
-
* The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
|
|
63
|
-
*/
|
|
64
|
-
this.interface = 'alert';
|
|
65
|
-
/**
|
|
66
|
-
* Any additional options that the `alert`, `action-sheet` or `popover` interface
|
|
67
|
-
* can take. See the [ion-alert docs](./alert), the
|
|
68
|
-
* [ion-action-sheet docs](./action-sheet), the
|
|
69
|
-
* [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
|
|
70
|
-
* create options for each interface.
|
|
71
|
-
*
|
|
72
|
-
* Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
|
|
73
|
-
*/
|
|
74
|
-
this.interfaceOptions = {};
|
|
75
|
-
/**
|
|
76
|
-
* Where to place the label relative to the select.
|
|
77
|
-
* `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
|
|
78
|
-
* `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
|
|
79
|
-
* `"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.
|
|
80
|
-
* `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
|
|
81
|
-
* `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
|
|
82
|
-
* When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
|
|
83
|
-
*/
|
|
84
|
-
this.labelPlacement = 'start';
|
|
85
|
-
/**
|
|
86
|
-
* If `true`, the select can accept multiple values.
|
|
87
|
-
*/
|
|
88
|
-
this.multiple = false;
|
|
89
|
-
/**
|
|
90
|
-
* The name of the control, which is submitted with the form data.
|
|
91
|
-
*/
|
|
92
|
-
this.name = this.inputId;
|
|
93
|
-
/**
|
|
94
|
-
* The text to display on the ok button.
|
|
95
|
-
*/
|
|
96
|
-
this.okText = 'OK';
|
|
97
|
-
/**
|
|
98
|
-
* If true, screen readers will announce it as a required field. This property
|
|
99
|
-
* works only for accessibility purposes, it will not prevent the form from
|
|
100
|
-
* submitting if the value is invalid.
|
|
101
|
-
*/
|
|
102
|
-
this.required = false;
|
|
103
|
-
this.onClick = (ev) => {
|
|
104
|
-
const target = ev.target;
|
|
105
|
-
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
106
|
-
if (target === this.el || closestSlot === null) {
|
|
107
|
-
this.setFocus();
|
|
108
|
-
this.open(ev);
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
/**
|
|
112
|
-
* Prevent clicks to the start/end slots from opening the select.
|
|
113
|
-
* We ensure the target isn't this element in case the select is slotted
|
|
114
|
-
* in, for example, an item. This would prevent the select from ever
|
|
115
|
-
* being opened since the element itself has slot="start"/"end".
|
|
116
|
-
*
|
|
117
|
-
* Clicking a slotted element also causes a click
|
|
118
|
-
* on the <label> element (since it wraps the slots).
|
|
119
|
-
* Clicking <label> dispatches another click event on
|
|
120
|
-
* the native form control that then bubbles up to this
|
|
121
|
-
* listener. This additional event targets the host
|
|
122
|
-
* element, so the select overlay is opened.
|
|
123
|
-
*
|
|
124
|
-
* When the slotted elements are clicked (and therefore
|
|
125
|
-
* the ancestor <label> element) we want to prevent the label
|
|
126
|
-
* from dispatching another click event.
|
|
127
|
-
*
|
|
128
|
-
* Do not call stopPropagation() because this will cause
|
|
129
|
-
* click handlers on the slotted elements to never fire in React.
|
|
130
|
-
* When developers do onClick in React a native "click" listener
|
|
131
|
-
* is added on the root element, not the slotted element. When that
|
|
132
|
-
* native click listener fires, React then dispatches the synthetic
|
|
133
|
-
* click event on the slotted element. However, if stopPropagation
|
|
134
|
-
* is called then the native click event will never bubble up
|
|
135
|
-
* to the root element.
|
|
136
|
-
*/
|
|
137
|
-
ev.preventDefault();
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
this.onFocus = () => {
|
|
141
|
-
this.hasFocus = true;
|
|
142
|
-
this.ionFocus.emit();
|
|
143
|
-
};
|
|
144
|
-
this.onBlur = () => {
|
|
145
|
-
this.hasFocus = false;
|
|
146
|
-
this.ionBlur.emit();
|
|
147
|
-
};
|
|
148
|
-
/**
|
|
149
|
-
* Stops propagation when the label is clicked,
|
|
150
|
-
* otherwise, two clicks will be triggered.
|
|
151
|
-
*/
|
|
152
|
-
this.onLabelClick = (ev) => {
|
|
153
|
-
// Only stop propagation if the click was directly on the label
|
|
154
|
-
// and not on the input or other child elements
|
|
155
|
-
if (ev.target === ev.currentTarget) {
|
|
156
|
-
ev.stopPropagation();
|
|
157
|
-
}
|
|
158
|
-
};
|
|
159
39
|
}
|
|
40
|
+
inputId = `ion-sel-${selectIds++}`;
|
|
41
|
+
helperTextId = `${this.inputId}-helper-text`;
|
|
42
|
+
errorTextId = `${this.inputId}-error-text`;
|
|
43
|
+
overlay;
|
|
44
|
+
focusEl;
|
|
45
|
+
mutationO;
|
|
46
|
+
inheritedAttributes = {};
|
|
47
|
+
slotMutationController;
|
|
48
|
+
nativeWrapperEl;
|
|
49
|
+
notchSpacerEl;
|
|
50
|
+
validationObserver;
|
|
51
|
+
notchController;
|
|
52
|
+
startContainerController;
|
|
53
|
+
startContainerEl;
|
|
54
|
+
customHTMLEnabled = index.config.get('innerHTMLTemplatesEnabled', config.ENABLE_HTML_CONTENT_DEFAULT);
|
|
55
|
+
get el() { return index.getElement(this); }
|
|
56
|
+
isExpanded = false;
|
|
57
|
+
/**
|
|
58
|
+
* The `hasFocus` state ensures the focus class is
|
|
59
|
+
* added regardless of how the element is focused.
|
|
60
|
+
* The `ion-focused` class only applies when focused
|
|
61
|
+
* via tabbing, not by clicking.
|
|
62
|
+
* The `has-focus` logic was added to ensure the class
|
|
63
|
+
* is applied in both cases.
|
|
64
|
+
*/
|
|
65
|
+
hasFocus = false;
|
|
66
|
+
/**
|
|
67
|
+
* Track validation state for proper aria-live announcements.
|
|
68
|
+
*/
|
|
69
|
+
isInvalid = false;
|
|
70
|
+
hintTextId;
|
|
71
|
+
/**
|
|
72
|
+
* The text to display on the cancel button.
|
|
73
|
+
*/
|
|
74
|
+
cancelText = 'Cancel';
|
|
75
|
+
/**
|
|
76
|
+
* The color to use from your application's color palette.
|
|
77
|
+
* Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
|
|
78
|
+
* For more information on colors, see [theming](/docs/theming/basics).
|
|
79
|
+
*
|
|
80
|
+
* This property is only available when using the modern select syntax.
|
|
81
|
+
*/
|
|
82
|
+
color;
|
|
83
|
+
/**
|
|
84
|
+
* This property allows developers to specify a custom function or property
|
|
85
|
+
* name for comparing objects when determining the selected option in the
|
|
86
|
+
* ion-select. When not specified, the default behavior will use strict
|
|
87
|
+
* equality (===) for comparison.
|
|
88
|
+
*/
|
|
89
|
+
compareWith;
|
|
90
|
+
/**
|
|
91
|
+
* If `true`, the user cannot interact with the select.
|
|
92
|
+
*/
|
|
93
|
+
disabled = false;
|
|
94
|
+
/**
|
|
95
|
+
* The fill for the item. If `"solid"` the item will have a background. If
|
|
96
|
+
* `"outline"` the item will be transparent with a border. Only available in `md` mode.
|
|
97
|
+
*/
|
|
98
|
+
fill;
|
|
99
|
+
/**
|
|
100
|
+
* Text that is placed under the select and displayed when an error is detected.
|
|
101
|
+
*/
|
|
102
|
+
errorText;
|
|
103
|
+
/**
|
|
104
|
+
* Text that is placed under the select and displayed when no error is detected.
|
|
105
|
+
*/
|
|
106
|
+
helperText;
|
|
107
|
+
/**
|
|
108
|
+
* The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
|
|
109
|
+
*/
|
|
110
|
+
interface = 'alert';
|
|
111
|
+
/**
|
|
112
|
+
* Any additional options that the `alert`, `action-sheet` or `popover` interface
|
|
113
|
+
* can take. See the [ion-alert docs](./alert), the
|
|
114
|
+
* [ion-action-sheet docs](./action-sheet), the
|
|
115
|
+
* [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
|
|
116
|
+
* create options for each interface.
|
|
117
|
+
*
|
|
118
|
+
* Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
|
|
119
|
+
*/
|
|
120
|
+
interfaceOptions = {};
|
|
121
|
+
/**
|
|
122
|
+
* How to pack the label and select within a line.
|
|
123
|
+
* `justify` does not apply when the label and select
|
|
124
|
+
* are on different lines when `labelPlacement` is set to
|
|
125
|
+
* `"floating"` or `"stacked"`.
|
|
126
|
+
* `"start"`: The label and select will appear on the left in LTR and
|
|
127
|
+
* on the right in RTL.
|
|
128
|
+
* `"end"`: The label and select will appear on the right in LTR and
|
|
129
|
+
* on the left in RTL.
|
|
130
|
+
* `"space-between"`: The label and select will appear on opposite
|
|
131
|
+
* ends of the line with space between the two elements.
|
|
132
|
+
*/
|
|
133
|
+
justify;
|
|
134
|
+
/**
|
|
135
|
+
* The visible label associated with the select.
|
|
136
|
+
*
|
|
137
|
+
* Use this if you need to render a plaintext label.
|
|
138
|
+
*
|
|
139
|
+
* The `label` property will take priority over the `label` slot if both are used.
|
|
140
|
+
*/
|
|
141
|
+
label;
|
|
142
|
+
/**
|
|
143
|
+
* Where to place the label relative to the select.
|
|
144
|
+
* `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
|
|
145
|
+
* `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
|
|
146
|
+
* `"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.
|
|
147
|
+
* `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
|
|
148
|
+
* `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
|
|
149
|
+
* When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
|
|
150
|
+
*/
|
|
151
|
+
labelPlacement = 'start';
|
|
152
|
+
/**
|
|
153
|
+
* If `true`, the select can accept multiple values.
|
|
154
|
+
*/
|
|
155
|
+
multiple = false;
|
|
156
|
+
/**
|
|
157
|
+
* The name of the control, which is submitted with the form data.
|
|
158
|
+
*/
|
|
159
|
+
name = this.inputId;
|
|
160
|
+
/**
|
|
161
|
+
* The text to display on the ok button.
|
|
162
|
+
*/
|
|
163
|
+
okText = 'OK';
|
|
164
|
+
/**
|
|
165
|
+
* The text to display when the select is empty.
|
|
166
|
+
*/
|
|
167
|
+
placeholder;
|
|
168
|
+
/**
|
|
169
|
+
* The text to display instead of the selected option's value.
|
|
170
|
+
*/
|
|
171
|
+
selectedText;
|
|
172
|
+
/**
|
|
173
|
+
* The toggle icon to use. Defaults to `chevronExpand` for `ios` mode,
|
|
174
|
+
* or `caretDownSharp` for `md` mode.
|
|
175
|
+
*/
|
|
176
|
+
toggleIcon;
|
|
177
|
+
/**
|
|
178
|
+
* The toggle icon to show when the select is open. If defined, the icon
|
|
179
|
+
* rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon`
|
|
180
|
+
* will be used for when the select is both open and closed.
|
|
181
|
+
*/
|
|
182
|
+
expandedIcon;
|
|
183
|
+
/**
|
|
184
|
+
* The shape of the select. If "round" it will have an increased border radius.
|
|
185
|
+
*/
|
|
186
|
+
shape;
|
|
187
|
+
/**
|
|
188
|
+
* The value of the select.
|
|
189
|
+
*/
|
|
190
|
+
value;
|
|
191
|
+
/**
|
|
192
|
+
* If true, screen readers will announce it as a required field. This property
|
|
193
|
+
* works only for accessibility purposes, it will not prevent the form from
|
|
194
|
+
* submitting if the value is invalid.
|
|
195
|
+
*/
|
|
196
|
+
required = false;
|
|
197
|
+
/**
|
|
198
|
+
* Emitted when the value has changed.
|
|
199
|
+
*
|
|
200
|
+
* This event will not emit when programmatically setting the `value` property.
|
|
201
|
+
*/
|
|
202
|
+
ionChange;
|
|
203
|
+
/**
|
|
204
|
+
* Emitted when the selection is cancelled.
|
|
205
|
+
*/
|
|
206
|
+
ionCancel;
|
|
207
|
+
/**
|
|
208
|
+
* Emitted when the overlay is dismissed.
|
|
209
|
+
*/
|
|
210
|
+
ionDismiss;
|
|
211
|
+
/**
|
|
212
|
+
* Emitted when the select has focus.
|
|
213
|
+
*/
|
|
214
|
+
ionFocus;
|
|
215
|
+
/**
|
|
216
|
+
* Emitted when the select loses focus.
|
|
217
|
+
*/
|
|
218
|
+
ionBlur;
|
|
219
|
+
/**
|
|
220
|
+
* Emitted when the styles change.
|
|
221
|
+
* @internal
|
|
222
|
+
*/
|
|
223
|
+
ionStyle;
|
|
160
224
|
styleChanged() {
|
|
161
225
|
this.emitStyle();
|
|
162
226
|
}
|
|
163
227
|
setValue(value) {
|
|
228
|
+
if (this.isValueEqual(this.value, value)) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
164
231
|
this.value = value;
|
|
165
232
|
this.ionChange.emit({ value });
|
|
166
233
|
}
|
|
234
|
+
isValueEqual(currentValue, newValue) {
|
|
235
|
+
if (this.multiple) {
|
|
236
|
+
const currentArr = Array.isArray(currentValue) ? currentValue : [];
|
|
237
|
+
const newArr = Array.isArray(newValue) ? newValue : [];
|
|
238
|
+
if (currentArr.length !== newArr.length) {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
// Multiset compare: each new value must match a distinct current value.
|
|
242
|
+
// A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
|
|
243
|
+
// ['a','b'] when both 'a' and 'b' map to options whose values overlap.
|
|
244
|
+
const remaining = currentArr.slice();
|
|
245
|
+
return newArr.every((val) => {
|
|
246
|
+
const idx = remaining.findIndex((c) => compareWithUtils.compareOptions(c, val, this.compareWith));
|
|
247
|
+
if (idx === -1) {
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
remaining.splice(idx, 1);
|
|
251
|
+
return true;
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
if (currentValue == null && newValue == null) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
if (currentValue == null || newValue == null) {
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
return compareWithUtils.compareOptions(currentValue, newValue, this.compareWith);
|
|
261
|
+
}
|
|
167
262
|
async connectedCallback() {
|
|
168
263
|
const { el } = this;
|
|
169
|
-
this.
|
|
264
|
+
this.slotMutationController = slotMutationController.createSlotMutationController(el, ['label', 'start', 'end'], () => {
|
|
265
|
+
this.startContainerController?.calculateStartContainerWidth();
|
|
266
|
+
index.forceUpdate(this);
|
|
267
|
+
});
|
|
268
|
+
this.notchController = slotMutationController.createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
269
|
+
this.startContainerController = slotMutationController.createStartContainerController(el, () => this.startContainerEl, () => {
|
|
270
|
+
return ionicGlobal.getIonMode(this) === 'md' && this.fill === 'outline';
|
|
271
|
+
});
|
|
272
|
+
this.startContainerController.calculateStartContainerWidth();
|
|
170
273
|
this.updateOverlayOptions();
|
|
171
274
|
this.emitStyle();
|
|
172
275
|
this.mutationO = watchOptions.watchForOptions(this.el, 'ion-select-option', async () => {
|
|
@@ -238,10 +341,18 @@ const Select = class {
|
|
|
238
341
|
this.mutationO.disconnect();
|
|
239
342
|
this.mutationO = undefined;
|
|
240
343
|
}
|
|
344
|
+
if (this.slotMutationController) {
|
|
345
|
+
this.slotMutationController.destroy();
|
|
346
|
+
this.slotMutationController = undefined;
|
|
347
|
+
}
|
|
241
348
|
if (this.notchController) {
|
|
242
349
|
this.notchController.destroy();
|
|
243
350
|
this.notchController = undefined;
|
|
244
351
|
}
|
|
352
|
+
if (this.startContainerController) {
|
|
353
|
+
this.startContainerController.destroy();
|
|
354
|
+
this.startContainerController = undefined;
|
|
355
|
+
}
|
|
245
356
|
// Clean up validation observer to prevent memory leaks.
|
|
246
357
|
if (this.validationObserver) {
|
|
247
358
|
this.validationObserver.disconnect();
|
|
@@ -398,10 +509,11 @@ const Select = class {
|
|
|
398
509
|
.join(' ');
|
|
399
510
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
400
511
|
const isSelected = compareWithUtils.isOptionSelected(selectValue, value, this.compareWith);
|
|
512
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
401
513
|
return {
|
|
402
|
-
|
|
403
|
-
text: option.textContent,
|
|
514
|
+
text: content ?? '',
|
|
404
515
|
cssClass: optClass,
|
|
516
|
+
disabled: option.disabled,
|
|
405
517
|
handler: () => {
|
|
406
518
|
this.setValue(value);
|
|
407
519
|
},
|
|
@@ -409,6 +521,9 @@ const Select = class {
|
|
|
409
521
|
'aria-checked': isSelected ? 'true' : 'false',
|
|
410
522
|
role: 'radio',
|
|
411
523
|
},
|
|
524
|
+
startContent,
|
|
525
|
+
endContent,
|
|
526
|
+
description: option.description,
|
|
412
527
|
};
|
|
413
528
|
});
|
|
414
529
|
// Add "cancel" button
|
|
@@ -429,13 +544,19 @@ const Select = class {
|
|
|
429
544
|
.filter((cls) => cls !== 'hydrated')
|
|
430
545
|
.join(' ');
|
|
431
546
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
547
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
432
548
|
return {
|
|
433
549
|
type: inputType,
|
|
434
550
|
cssClass: optClass,
|
|
435
|
-
label:
|
|
551
|
+
label: content ?? '',
|
|
436
552
|
value,
|
|
437
553
|
checked: compareWithUtils.isOptionSelected(selectValue, value, this.compareWith),
|
|
438
554
|
disabled: option.disabled,
|
|
555
|
+
startContent,
|
|
556
|
+
endContent,
|
|
557
|
+
description: option.description,
|
|
558
|
+
labelPlacement: option.labelPlacement,
|
|
559
|
+
justify: option.justify,
|
|
439
560
|
};
|
|
440
561
|
});
|
|
441
562
|
return alertInputs;
|
|
@@ -448,8 +569,9 @@ const Select = class {
|
|
|
448
569
|
.filter((cls) => cls !== 'hydrated')
|
|
449
570
|
.join(' ');
|
|
450
571
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
572
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
451
573
|
return {
|
|
452
|
-
text:
|
|
574
|
+
text: content ?? '',
|
|
453
575
|
cssClass: optClass,
|
|
454
576
|
value,
|
|
455
577
|
checked: compareWithUtils.isOptionSelected(selectValue, value, this.compareWith),
|
|
@@ -460,6 +582,11 @@ const Select = class {
|
|
|
460
582
|
this.close();
|
|
461
583
|
}
|
|
462
584
|
},
|
|
585
|
+
startContent,
|
|
586
|
+
endContent,
|
|
587
|
+
description: option.description,
|
|
588
|
+
labelPlacement: option.labelPlacement,
|
|
589
|
+
justify: option.justify,
|
|
463
590
|
};
|
|
464
591
|
});
|
|
465
592
|
return popoverOptions;
|
|
@@ -488,33 +615,60 @@ const Select = class {
|
|
|
488
615
|
*/
|
|
489
616
|
}
|
|
490
617
|
else {
|
|
491
|
-
event =
|
|
618
|
+
event = {
|
|
619
|
+
...ev,
|
|
620
|
+
detail: {
|
|
492
621
|
ionShadowTarget: this.nativeWrapperEl,
|
|
493
|
-
}
|
|
622
|
+
},
|
|
623
|
+
};
|
|
494
624
|
}
|
|
495
|
-
const
|
|
496
|
-
|
|
497
|
-
|
|
625
|
+
const options = this.createOverlaySelectOptions(this.childOpts, value);
|
|
626
|
+
const hasRichContent = options.some((opt) => Boolean(opt.startContent) || Boolean(opt.endContent) || Boolean(opt.description));
|
|
627
|
+
const popoverOpts = {
|
|
628
|
+
mode,
|
|
629
|
+
event,
|
|
630
|
+
alignment: 'center',
|
|
631
|
+
size,
|
|
632
|
+
showBackdrop,
|
|
633
|
+
...interfaceOptions,
|
|
634
|
+
component: 'ion-select-popover',
|
|
635
|
+
cssClass: [
|
|
636
|
+
'select-popover',
|
|
637
|
+
hasRichContent ? 'select-popover-rich-content' : undefined,
|
|
638
|
+
interfaceOptions.cssClass,
|
|
639
|
+
],
|
|
640
|
+
componentProps: {
|
|
498
641
|
header: interfaceOptions.header,
|
|
499
642
|
subHeader: interfaceOptions.subHeader,
|
|
500
643
|
message: interfaceOptions.message,
|
|
501
644
|
multiple,
|
|
502
645
|
value,
|
|
503
|
-
options
|
|
504
|
-
}
|
|
646
|
+
options,
|
|
647
|
+
},
|
|
648
|
+
};
|
|
505
649
|
return overlays.popoverController.create(popoverOpts);
|
|
506
650
|
}
|
|
507
651
|
async openActionSheet() {
|
|
508
652
|
const mode = ionicGlobal.getIonMode(this);
|
|
509
653
|
const interfaceOptions = this.interfaceOptions;
|
|
510
|
-
const actionSheetOpts =
|
|
654
|
+
const actionSheetOpts = {
|
|
655
|
+
mode,
|
|
656
|
+
...interfaceOptions,
|
|
657
|
+
buttons: this.createActionSheetButtons(this.childOpts, this.value),
|
|
658
|
+
cssClass: ['select-action-sheet', interfaceOptions.cssClass],
|
|
659
|
+
};
|
|
511
660
|
return overlays.actionSheetController.create(actionSheetOpts);
|
|
512
661
|
}
|
|
513
662
|
async openAlert() {
|
|
514
663
|
const interfaceOptions = this.interfaceOptions;
|
|
515
664
|
const inputType = this.multiple ? 'checkbox' : 'radio';
|
|
516
665
|
const mode = ionicGlobal.getIonMode(this);
|
|
517
|
-
const alertOpts =
|
|
666
|
+
const alertOpts = {
|
|
667
|
+
mode,
|
|
668
|
+
...interfaceOptions,
|
|
669
|
+
header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
|
|
670
|
+
inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
|
|
671
|
+
buttons: [
|
|
518
672
|
{
|
|
519
673
|
text: this.cancelText,
|
|
520
674
|
role: 'cancel',
|
|
@@ -528,23 +682,31 @@ const Select = class {
|
|
|
528
682
|
this.setValue(selectedValues);
|
|
529
683
|
},
|
|
530
684
|
},
|
|
531
|
-
],
|
|
685
|
+
],
|
|
686
|
+
cssClass: [
|
|
532
687
|
'select-alert',
|
|
533
688
|
interfaceOptions.cssClass,
|
|
534
689
|
this.multiple ? 'multiple-select-alert' : 'single-select-alert',
|
|
535
|
-
]
|
|
690
|
+
],
|
|
691
|
+
};
|
|
536
692
|
return overlays.alertController.create(alertOpts);
|
|
537
693
|
}
|
|
538
694
|
openModal() {
|
|
539
695
|
const { multiple, value, interfaceOptions } = this;
|
|
540
696
|
const mode = ionicGlobal.getIonMode(this);
|
|
541
|
-
const modalOpts =
|
|
697
|
+
const modalOpts = {
|
|
698
|
+
...interfaceOptions,
|
|
699
|
+
mode,
|
|
700
|
+
cssClass: ['select-modal', interfaceOptions.cssClass],
|
|
701
|
+
component: 'ion-select-modal',
|
|
702
|
+
componentProps: {
|
|
542
703
|
header: interfaceOptions.header,
|
|
543
704
|
cancelText: this.cancelText,
|
|
544
705
|
multiple,
|
|
545
706
|
value,
|
|
546
707
|
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
547
|
-
}
|
|
708
|
+
},
|
|
709
|
+
};
|
|
548
710
|
return overlays.modalController.create(modalOpts);
|
|
549
711
|
}
|
|
550
712
|
/**
|
|
@@ -581,12 +743,18 @@ const Select = class {
|
|
|
581
743
|
}
|
|
582
744
|
return;
|
|
583
745
|
}
|
|
584
|
-
|
|
746
|
+
/**
|
|
747
|
+
* Returns the text to display in the select based on the selected value.
|
|
748
|
+
*
|
|
749
|
+
* @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`.
|
|
750
|
+
* @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
|
|
751
|
+
*/
|
|
752
|
+
getText(useHTML = false) {
|
|
585
753
|
const selectedText = this.selectedText;
|
|
586
754
|
if (selectedText != null && selectedText !== '') {
|
|
587
755
|
return selectedText;
|
|
588
756
|
}
|
|
589
|
-
return generateText(this.childOpts, this.value, this.compareWith);
|
|
757
|
+
return generateText(this.childOpts, this.value, this.compareWith, useHTML);
|
|
590
758
|
}
|
|
591
759
|
setFocus() {
|
|
592
760
|
if (this.focusEl) {
|
|
@@ -600,6 +768,51 @@ const Select = class {
|
|
|
600
768
|
};
|
|
601
769
|
this.ionStyle.emit(style);
|
|
602
770
|
}
|
|
771
|
+
onClick = (ev) => {
|
|
772
|
+
const target = ev.target;
|
|
773
|
+
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
774
|
+
if (target === this.el || closestSlot === null) {
|
|
775
|
+
this.setFocus();
|
|
776
|
+
this.open(ev);
|
|
777
|
+
}
|
|
778
|
+
else {
|
|
779
|
+
/**
|
|
780
|
+
* Prevent clicks to the start/end slots from opening the select.
|
|
781
|
+
* We ensure the target isn't this element in case the select is slotted
|
|
782
|
+
* in, for example, an item. This would prevent the select from ever
|
|
783
|
+
* being opened since the element itself has slot="start"/"end".
|
|
784
|
+
*
|
|
785
|
+
* Clicking a slotted element also causes a click
|
|
786
|
+
* on the <label> element (since it wraps the slots).
|
|
787
|
+
* Clicking <label> dispatches another click event on
|
|
788
|
+
* the native form control that then bubbles up to this
|
|
789
|
+
* listener. This additional event targets the host
|
|
790
|
+
* element, so the select overlay is opened.
|
|
791
|
+
*
|
|
792
|
+
* When the slotted elements are clicked (and therefore
|
|
793
|
+
* the ancestor <label> element) we want to prevent the label
|
|
794
|
+
* from dispatching another click event.
|
|
795
|
+
*
|
|
796
|
+
* Do not call stopPropagation() because this will cause
|
|
797
|
+
* click handlers on the slotted elements to never fire in React.
|
|
798
|
+
* When developers do onClick in React a native "click" listener
|
|
799
|
+
* is added on the root element, not the slotted element. When that
|
|
800
|
+
* native click listener fires, React then dispatches the synthetic
|
|
801
|
+
* click event on the slotted element. However, if stopPropagation
|
|
802
|
+
* is called then the native click event will never bubble up
|
|
803
|
+
* to the root element.
|
|
804
|
+
*/
|
|
805
|
+
ev.preventDefault();
|
|
806
|
+
}
|
|
807
|
+
};
|
|
808
|
+
onFocus = () => {
|
|
809
|
+
this.hasFocus = true;
|
|
810
|
+
this.ionFocus.emit();
|
|
811
|
+
};
|
|
812
|
+
onBlur = () => {
|
|
813
|
+
this.hasFocus = false;
|
|
814
|
+
this.ionBlur.emit();
|
|
815
|
+
};
|
|
603
816
|
renderLabel() {
|
|
604
817
|
const { label } = this;
|
|
605
818
|
return (index.h("div", { class: {
|
|
@@ -608,8 +821,8 @@ const Select = class {
|
|
|
608
821
|
}, part: "label" }, label === undefined ? index.h("slot", { name: "label" }) : index.h("div", { class: "label-text" }, label)));
|
|
609
822
|
}
|
|
610
823
|
componentDidRender() {
|
|
611
|
-
|
|
612
|
-
|
|
824
|
+
this.notchController?.calculateNotchWidth();
|
|
825
|
+
this.startContainerController?.calculateStartContainerWidth();
|
|
613
826
|
}
|
|
614
827
|
/**
|
|
615
828
|
* Gets any content passed into the `label` slot,
|
|
@@ -628,33 +841,64 @@ const Select = class {
|
|
|
628
841
|
return this.label !== undefined || this.labelSlot !== null;
|
|
629
842
|
}
|
|
630
843
|
/**
|
|
631
|
-
*
|
|
632
|
-
*
|
|
844
|
+
* Stops propagation for re-dispatched clicks (when already expanded) to
|
|
845
|
+
* prevent double-click events. Allows initial button clicks (from keyboard
|
|
846
|
+
* or mouse) and slotted content clicks to propagate so event delegation
|
|
847
|
+
* works for parent handlers.
|
|
633
848
|
*/
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if (hasOutlineFill) {
|
|
638
|
-
/**
|
|
639
|
-
* The outline fill has a special outline
|
|
640
|
-
* that appears around the select and the label.
|
|
641
|
-
* Certain stacked and floating label placements cause the
|
|
642
|
-
* label to translate up and create a "cut out"
|
|
643
|
-
* inside of that border by using the notch-spacer element.
|
|
644
|
-
*/
|
|
645
|
-
return [
|
|
646
|
-
index.h("div", { class: "select-outline-container" }, index.h("div", { class: "select-outline-start" }), index.h("div", { class: {
|
|
647
|
-
'select-outline-notch': true,
|
|
648
|
-
'select-outline-notch-hidden': !this.hasLabel,
|
|
649
|
-
} }, index.h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), index.h("div", { class: "select-outline-end" })),
|
|
650
|
-
this.renderLabel(),
|
|
651
|
-
];
|
|
849
|
+
onLabelClick = (ev) => {
|
|
850
|
+
if (ev.target === this.focusEl && this.isExpanded) {
|
|
851
|
+
ev.stopPropagation();
|
|
652
852
|
}
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
853
|
+
};
|
|
854
|
+
/**
|
|
855
|
+
* Renders the outline border with a notch for the label.
|
|
856
|
+
*/
|
|
857
|
+
renderOutlineContainer() {
|
|
858
|
+
return (index.h("div", { class: "select-outline-container" }, index.h("div", { class: "select-outline-start" }), index.h("div", { class: {
|
|
859
|
+
'select-outline-notch': true,
|
|
860
|
+
'select-outline-notch-hidden': !this.hasLabel,
|
|
861
|
+
} }, index.h("div", { class: "notch-spacer", "aria-hidden": "true", ref: (el) => (this.notchSpacerEl = el) }, this.label)), index.h("div", { class: "select-outline-end" })));
|
|
862
|
+
}
|
|
863
|
+
/**
|
|
864
|
+
* Wraps text nodes in the select text with span elements
|
|
865
|
+
* so spacing can be added between elements without
|
|
866
|
+
* changing the display to prevent losing the ellipses
|
|
867
|
+
* behavior.
|
|
868
|
+
*
|
|
869
|
+
* Only wraps when the string contains HTML elements
|
|
870
|
+
* alongside text.
|
|
871
|
+
*/
|
|
872
|
+
wrapSelectTextNodes(html) {
|
|
873
|
+
const temp = document.createElement('div');
|
|
874
|
+
temp.innerHTML = html;
|
|
875
|
+
const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
|
|
876
|
+
// Return the plain text
|
|
877
|
+
if (!hasElements) {
|
|
878
|
+
return html;
|
|
879
|
+
}
|
|
880
|
+
Array.from(temp.childNodes).forEach((node) => {
|
|
881
|
+
if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
|
|
882
|
+
const text = node.textContent;
|
|
883
|
+
/**
|
|
884
|
+
* Split comma separator from the text content
|
|
885
|
+
* e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
|
|
886
|
+
*/
|
|
887
|
+
const commaMatch = text.match(/^(,\s*)(.*)/);
|
|
888
|
+
if (commaMatch) {
|
|
889
|
+
const commaNode = document.createTextNode(commaMatch[1]);
|
|
890
|
+
const wrapper = document.createElement('span');
|
|
891
|
+
wrapper.textContent = commaMatch[2];
|
|
892
|
+
node.parentNode?.replaceChild(wrapper, node);
|
|
893
|
+
wrapper.parentNode?.insertBefore(commaNode, wrapper);
|
|
894
|
+
return;
|
|
895
|
+
}
|
|
896
|
+
const wrapper = document.createElement('span');
|
|
897
|
+
node.parentNode?.replaceChild(wrapper, node);
|
|
898
|
+
wrapper.appendChild(node);
|
|
899
|
+
}
|
|
900
|
+
});
|
|
901
|
+
return temp.innerHTML;
|
|
658
902
|
}
|
|
659
903
|
/**
|
|
660
904
|
* Renders either the placeholder
|
|
@@ -663,7 +907,7 @@ const Select = class {
|
|
|
663
907
|
*/
|
|
664
908
|
renderSelectText() {
|
|
665
909
|
const { placeholder } = this;
|
|
666
|
-
const displayValue = this.getText();
|
|
910
|
+
const displayValue = this.getText(true);
|
|
667
911
|
let addPlaceholderClass = false;
|
|
668
912
|
let selectText = displayValue;
|
|
669
913
|
if (selectText === '' && placeholder !== undefined) {
|
|
@@ -675,6 +919,10 @@ const Select = class {
|
|
|
675
919
|
'select-placeholder': addPlaceholderClass,
|
|
676
920
|
};
|
|
677
921
|
const textPart = addPlaceholderClass ? 'placeholder' : 'text';
|
|
922
|
+
if (this.customHTMLEnabled) {
|
|
923
|
+
const wrapped = this.wrapSelectTextNodes(selectText);
|
|
924
|
+
return index.h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
|
|
925
|
+
}
|
|
678
926
|
return (index.h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
|
|
679
927
|
}
|
|
680
928
|
/**
|
|
@@ -690,16 +938,16 @@ const Select = class {
|
|
|
690
938
|
}
|
|
691
939
|
else {
|
|
692
940
|
const defaultIcon = mode === 'ios' ? index$1.chevronExpand : index$1.caretDownSharp;
|
|
693
|
-
icon = toggleIcon
|
|
941
|
+
icon = toggleIcon ?? defaultIcon;
|
|
694
942
|
}
|
|
695
943
|
return index.h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
|
|
696
944
|
}
|
|
697
945
|
get ariaLabel() {
|
|
698
|
-
var _a;
|
|
699
946
|
const { placeholder, inheritedAttributes } = this;
|
|
947
|
+
// Get the plain text from the selected text
|
|
700
948
|
const displayValue = this.getText();
|
|
701
949
|
// The aria label should be preferred over visible text if both are specified
|
|
702
|
-
const definedLabel =
|
|
950
|
+
const definedLabel = inheritedAttributes['aria-label'] ?? this.labelText;
|
|
703
951
|
/**
|
|
704
952
|
* If developer has specified a placeholder
|
|
705
953
|
* and there is nothing selected, the selectText
|
|
@@ -770,28 +1018,10 @@ const Select = class {
|
|
|
770
1018
|
const inItem = theme.hostContext('ion-item', this.el);
|
|
771
1019
|
const shouldRenderHighlight = mode === 'md' && fill !== 'outline' && !inItem;
|
|
772
1020
|
const hasValue = this.hasValue();
|
|
773
|
-
const
|
|
1021
|
+
const hasOutlineFill = mode === 'md' && fill === 'outline';
|
|
774
1022
|
helpers.renderHiddenInput(true, el, name, parseValue(value), disabled);
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
* For floating labels, the label should move above the select if
|
|
778
|
-
* the select has a value, is open, or has anything in either
|
|
779
|
-
* the start or end slot.
|
|
780
|
-
*
|
|
781
|
-
* If there is content in the start slot, the label would overlap
|
|
782
|
-
* it if not forced to float. This is also applied to the end slot
|
|
783
|
-
* because with the default or solid fills, the select is not
|
|
784
|
-
* vertically centered in the container, but the label is. This
|
|
785
|
-
* causes the slots and label to appear vertically offset from each
|
|
786
|
-
* other when the label isn't floating above the input. This doesn't
|
|
787
|
-
* apply to the outline fill, but this was not accounted for to keep
|
|
788
|
-
* things consistent.
|
|
789
|
-
*
|
|
790
|
-
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
791
|
-
*/
|
|
792
|
-
const labelShouldFloat = labelPlacement === 'stacked' ||
|
|
793
|
-
(labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded || hasStartEndSlots));
|
|
794
|
-
return (index.h(index.Host, { key: 'f16327d6866ffee76e1618fcd3281590ca0fd56d', onClick: this.onClick, class: theme.createColorClasses(this.color, {
|
|
1023
|
+
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded));
|
|
1024
|
+
return (index.h(index.Host, { key: '5d1e5bf46d0f204efdcb55cc42cfde52e6db304b', onClick: this.onClick, class: theme.createColorClasses(this.color, {
|
|
795
1025
|
[mode]: true,
|
|
796
1026
|
'in-item': inItem,
|
|
797
1027
|
'in-item-color': theme.hostContext('ion-item.ion-color', el),
|
|
@@ -809,9 +1039,8 @@ const Select = class {
|
|
|
809
1039
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
810
1040
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
811
1041
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
812
|
-
}) }, index.h("label", { key: '
|
|
1042
|
+
}) }, index.h("label", { key: '15fd1f8e06510ae8472c621cf8cf90e51172e0be', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, hasOutlineFill && this.renderOutlineContainer(), index.h("div", { key: '7964e3d9351671899793b117896acdda25ec24c4', class: "select-start", part: "start", ref: (el) => (this.startContainerEl = el) }, index.h("slot", { key: 'aa309ef155c4025acfd7ed5739b5221c85097b36', name: "start" })), index.h("div", { key: '23d5a9dfea64a9d81b0b36d9426b15bed98901b9', class: "select-control", part: "control" }, this.renderLabel(), index.h("div", { key: '810da9fbfa8771e09b5fb768d64e5f04858b5833', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox(), !hasFloatingOrStackedLabel && this.renderSelectIcon())), index.h("div", { key: 'bf1c04704326ecfa14cf2e49bb76d3fb45beb08d', class: "select-end", part: "end" }, hasFloatingOrStackedLabel && this.renderSelectIcon(), index.h("slot", { key: '76a8bcaeefdcaa908aebd820d93171b08165cee3', name: "end" })), shouldRenderHighlight && index.h("div", { key: '55a9c417a82323a44e16328fd62a634d9d7c558b', class: "select-highlight" })), this.renderBottomContent()));
|
|
813
1043
|
}
|
|
814
|
-
get el() { return index.getElement(this); }
|
|
815
1044
|
static get watchers() { return {
|
|
816
1045
|
"disabled": [{
|
|
817
1046
|
"styleChanged": 0
|
|
@@ -840,25 +1069,219 @@ const parseValue = (value) => {
|
|
|
840
1069
|
}
|
|
841
1070
|
return value.toString();
|
|
842
1071
|
};
|
|
843
|
-
const generateText = (opts, value, compareWith) => {
|
|
1072
|
+
const generateText = (opts, value, compareWith, useHTML = false) => {
|
|
844
1073
|
if (value === undefined) {
|
|
845
1074
|
return '';
|
|
846
1075
|
}
|
|
847
1076
|
if (Array.isArray(value)) {
|
|
848
1077
|
return value
|
|
849
|
-
.map((v) => textForValue(opts, v, compareWith))
|
|
1078
|
+
.map((v) => textForValue(opts, v, compareWith, useHTML))
|
|
850
1079
|
.filter((opt) => opt !== null)
|
|
851
1080
|
.join(', ');
|
|
852
1081
|
}
|
|
853
1082
|
else {
|
|
854
|
-
return textForValue(opts, value, compareWith) || '';
|
|
1083
|
+
return textForValue(opts, value, compareWith, useHTML) || '';
|
|
855
1084
|
}
|
|
856
1085
|
};
|
|
857
|
-
|
|
1086
|
+
/**
|
|
1087
|
+
* Returns the display text for a given value from the list of options.
|
|
1088
|
+
* When `useHTML` is true, returns sanitized HTML for the select text.
|
|
1089
|
+
* When `useHTML` is false, returns plain text for aria-label and other
|
|
1090
|
+
* text-only contexts.
|
|
1091
|
+
*
|
|
1092
|
+
* @param opts - The list of ion-select-option elements.
|
|
1093
|
+
* @param value - The value to find the matching option for.
|
|
1094
|
+
* @param compareWith - Custom comparison function or property name.
|
|
1095
|
+
* @param useHTML - If true, returns HTML string. If false, returns plain text.
|
|
1096
|
+
*/
|
|
1097
|
+
const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
858
1098
|
const selectOpt = opts.find((opt) => {
|
|
859
1099
|
return compareWithUtils.compareOptions(value, getOptionValue(opt), compareWith);
|
|
860
1100
|
});
|
|
861
|
-
|
|
1101
|
+
const customHTMLEnabled = index.config.get('innerHTMLTemplatesEnabled', config.ENABLE_HTML_CONTENT_DEFAULT);
|
|
1102
|
+
if (!selectOpt) {
|
|
1103
|
+
return null;
|
|
1104
|
+
}
|
|
1105
|
+
// Return sanitized HTML for the select text
|
|
1106
|
+
if (customHTMLEnabled && useHTML) {
|
|
1107
|
+
return getOptionContent(selectOpt, undefined, true);
|
|
1108
|
+
}
|
|
1109
|
+
/**
|
|
1110
|
+
* When custom HTML is enabled, extract only the default slot content.
|
|
1111
|
+
* This ensures aria-label and other text-only contexts read only
|
|
1112
|
+
* the relevant option text.
|
|
1113
|
+
*/
|
|
1114
|
+
if (customHTMLEnabled) {
|
|
1115
|
+
const content = getOptionContent(selectOpt);
|
|
1116
|
+
if (typeof content === 'string') {
|
|
1117
|
+
return content;
|
|
1118
|
+
}
|
|
1119
|
+
/**
|
|
1120
|
+
* Elements were found in the default slot, extract and concatenate
|
|
1121
|
+
* their text content while trimming whitespace.
|
|
1122
|
+
*/
|
|
1123
|
+
if (content) {
|
|
1124
|
+
const texts = Array.from(content.childNodes)
|
|
1125
|
+
.map((n) => n.textContent?.trim())
|
|
1126
|
+
.filter((t) => t);
|
|
1127
|
+
return texts.join(' ') || null;
|
|
1128
|
+
}
|
|
1129
|
+
// Empty option
|
|
1130
|
+
return null;
|
|
1131
|
+
}
|
|
1132
|
+
return getDefaultSlotPlainText(selectOpt);
|
|
1133
|
+
};
|
|
1134
|
+
/**
|
|
1135
|
+
* Trims whitespace from all text nodes within a DOM tree.
|
|
1136
|
+
* This prevents invisible layout shifts and unwanted gaps between
|
|
1137
|
+
* elements when HTML content is injected via innerHTML or cloneNode,
|
|
1138
|
+
* as browsers preserve whitespace (tabs, newlines, spaces) from
|
|
1139
|
+
* the original source markup.
|
|
1140
|
+
*
|
|
1141
|
+
* @param node The root node to start trimming text nodes from.
|
|
1142
|
+
*/
|
|
1143
|
+
const trimTextNodes = (node) => {
|
|
1144
|
+
node.childNodes.forEach((child) => {
|
|
1145
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
1146
|
+
child.textContent = child.textContent?.trim() || '';
|
|
1147
|
+
}
|
|
1148
|
+
else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
1149
|
+
trimTextNodes(child);
|
|
1150
|
+
}
|
|
1151
|
+
});
|
|
1152
|
+
};
|
|
1153
|
+
/**
|
|
1154
|
+
* Extracts and clones content from an `ion-select-option` element
|
|
1155
|
+
* for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
|
|
1156
|
+
*
|
|
1157
|
+
* @param option - The `ion-select-option` element to extract content from.
|
|
1158
|
+
* @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
|
|
1159
|
+
* @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.
|
|
1160
|
+
* @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
|
|
1161
|
+
* div element containing cloned child nodes. Returns `null` if no matching
|
|
1162
|
+
* content is found.
|
|
1163
|
+
*/
|
|
1164
|
+
const getOptionContent = (option, slotName, useHTML = false) => {
|
|
1165
|
+
let nodes;
|
|
1166
|
+
if (slotName) {
|
|
1167
|
+
// Named slot: get elements with matching slot attribute
|
|
1168
|
+
nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
|
|
1169
|
+
}
|
|
1170
|
+
else {
|
|
1171
|
+
// Default slot: get nodes without a slot attribute
|
|
1172
|
+
const defaultSlot = getOptionDefaultSlot(option) || [];
|
|
1173
|
+
nodes = defaultSlot.filter((node) => {
|
|
1174
|
+
/**
|
|
1175
|
+
* Exclude whitespace-only text nodes (newline noise between
|
|
1176
|
+
* markup elements). Element nodes are always kept, even when
|
|
1177
|
+
* their textContent is empty (e.g. <svg>, <img>).
|
|
1178
|
+
*/
|
|
1179
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
1180
|
+
return node.textContent?.trim().length !== 0;
|
|
1181
|
+
}
|
|
1182
|
+
return true;
|
|
1183
|
+
});
|
|
1184
|
+
}
|
|
1185
|
+
if (nodes.length === 0) {
|
|
1186
|
+
return null;
|
|
1187
|
+
}
|
|
1188
|
+
// Return plain text if no elements are found
|
|
1189
|
+
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1190
|
+
return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
|
|
1191
|
+
}
|
|
1192
|
+
/**
|
|
1193
|
+
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
1194
|
+
* onto attributes before cloning. Frameworks like Vue set these as
|
|
1195
|
+
* DOM properties, which `cloneNode` doesn't copy, so without this
|
|
1196
|
+
* step the cloned overlay copy renders without the prop's value.
|
|
1197
|
+
*/
|
|
1198
|
+
nodes.forEach((n) => {
|
|
1199
|
+
if (n.nodeType === Node.ELEMENT_NODE) {
|
|
1200
|
+
index$2.reflectPropertiesToAttributes(n);
|
|
1201
|
+
}
|
|
1202
|
+
});
|
|
1203
|
+
// Clone each node into a temporary container
|
|
1204
|
+
const container = document.createElement('div');
|
|
1205
|
+
nodes.forEach((n) => {
|
|
1206
|
+
const clone = n.cloneNode(true);
|
|
1207
|
+
if (clone.nodeType === Node.TEXT_NODE) {
|
|
1208
|
+
clone.textContent = clone.textContent?.trim() || '';
|
|
1209
|
+
}
|
|
1210
|
+
else {
|
|
1211
|
+
trimTextNodes(clone);
|
|
1212
|
+
}
|
|
1213
|
+
container.appendChild(clone);
|
|
1214
|
+
});
|
|
1215
|
+
/**
|
|
1216
|
+
* Sanitize the cloned DOM in place. Trusted attributes (size, color,
|
|
1217
|
+
* shape, etc.) are preserved; event handlers, javascript: URLs, and
|
|
1218
|
+
* blocked tags are stripped.
|
|
1219
|
+
*/
|
|
1220
|
+
index$2.sanitizeDOMTree(container);
|
|
1221
|
+
if (useHTML) {
|
|
1222
|
+
return container.innerHTML.trim() || null;
|
|
1223
|
+
}
|
|
1224
|
+
return container;
|
|
1225
|
+
};
|
|
1226
|
+
/**
|
|
1227
|
+
* Returns the child nodes that belong to the default slot of an
|
|
1228
|
+
* option element, excluding any nodes that are assigned to named
|
|
1229
|
+
* slots.
|
|
1230
|
+
*
|
|
1231
|
+
* @param option - The `ion-select-option` element to extract default-slot nodes from.
|
|
1232
|
+
* @returns An array of default slot nodes, or `null` if none are found.
|
|
1233
|
+
*/
|
|
1234
|
+
const getOptionDefaultSlot = (option) => {
|
|
1235
|
+
const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
|
|
1236
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1237
|
+
return !node.hasAttribute('slot');
|
|
1238
|
+
}
|
|
1239
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
1240
|
+
});
|
|
1241
|
+
if (defaultSlotNodes.length === 0) {
|
|
1242
|
+
return null;
|
|
1243
|
+
}
|
|
1244
|
+
return defaultSlotNodes;
|
|
1245
|
+
};
|
|
1246
|
+
/**
|
|
1247
|
+
* Extracts plain text from only the default slot of an option,
|
|
1248
|
+
* excluding content assigned to named slots (start/end).
|
|
1249
|
+
*/
|
|
1250
|
+
const getDefaultSlotPlainText = (option) => {
|
|
1251
|
+
const texts = Array.from(option.childNodes)
|
|
1252
|
+
.filter((node) => {
|
|
1253
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1254
|
+
return !node.hasAttribute('slot');
|
|
1255
|
+
}
|
|
1256
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
1257
|
+
})
|
|
1258
|
+
.filter((node) => node.nodeType === Node.TEXT_NODE)
|
|
1259
|
+
.map((n) => n.textContent?.trim())
|
|
1260
|
+
.filter((t) => t);
|
|
1261
|
+
return texts.join(' ');
|
|
1262
|
+
};
|
|
1263
|
+
/**
|
|
1264
|
+
* Extracts the rich content from an `ion-select-option`.
|
|
1265
|
+
* When `customHTMLEnabled` is `false`, only the plain text from the
|
|
1266
|
+
* default slot is read and the start and end slots are skipped.
|
|
1267
|
+
*
|
|
1268
|
+
* @param option - The `ion-select-option` element to extract content from.
|
|
1269
|
+
* @param customHTMLEnabled - Whether custom HTML rendering is enabled
|
|
1270
|
+
* via the `innerHTMLTemplatesEnabled` config.
|
|
1271
|
+
*/
|
|
1272
|
+
const extractOptionContent = (option, customHTMLEnabled) => {
|
|
1273
|
+
if (!customHTMLEnabled) {
|
|
1274
|
+
return {
|
|
1275
|
+
content: getDefaultSlotPlainText(option),
|
|
1276
|
+
startContent: undefined,
|
|
1277
|
+
endContent: undefined,
|
|
1278
|
+
};
|
|
1279
|
+
}
|
|
1280
|
+
return {
|
|
1281
|
+
content: getOptionContent(option),
|
|
1282
|
+
startContent: getOptionContent(option, 'start') ?? undefined,
|
|
1283
|
+
endContent: getOptionContent(option, 'end') ?? undefined,
|
|
1284
|
+
};
|
|
862
1285
|
};
|
|
863
1286
|
let selectIds = 0;
|
|
864
1287
|
const OPTION_CLASS = 'select-interface-option';
|
|
@@ -872,36 +1295,91 @@ const selectOptionCss = () => `:host{display:none}`;
|
|
|
872
1295
|
const SelectOption = class {
|
|
873
1296
|
constructor(hostRef) {
|
|
874
1297
|
index.registerInstance(this, hostRef);
|
|
875
|
-
this.inputId = `ion-selopt-${selectOptionIds++}`;
|
|
876
|
-
/**
|
|
877
|
-
* If `true`, the user cannot interact with the select option. This property does not apply when `interface="action-sheet"` as `ion-action-sheet` does not allow for disabled buttons.
|
|
878
|
-
*/
|
|
879
|
-
this.disabled = false;
|
|
880
1298
|
}
|
|
1299
|
+
inputId = `ion-selopt-${selectOptionIds++}`;
|
|
1300
|
+
get el() { return index.getElement(this); }
|
|
1301
|
+
/**
|
|
1302
|
+
* If `true`, the user cannot interact with the select option.
|
|
1303
|
+
*/
|
|
1304
|
+
disabled = false;
|
|
1305
|
+
/**
|
|
1306
|
+
* The text value of the option.
|
|
1307
|
+
*/
|
|
1308
|
+
value;
|
|
1309
|
+
/**
|
|
1310
|
+
* Text that is placed underneath the option text to provide additional details about the option.
|
|
1311
|
+
*/
|
|
1312
|
+
description;
|
|
1313
|
+
/**
|
|
1314
|
+
* Where the label is placed relative to the option's selection control
|
|
1315
|
+
* (radio circle or checkbox box) when the option is rendered in an
|
|
1316
|
+
* `alert`, `popover`, or `modal` interface.
|
|
1317
|
+
* `"start"`: The label will appear to the left of the radio in LTR and to the right in RTL.
|
|
1318
|
+
* `"end"`: The label will appear to the right of the radio in LTR and to the left in RTL.
|
|
1319
|
+
*
|
|
1320
|
+
* Applies to the `alert`, `popover`, and `modal` interfaces, but has no
|
|
1321
|
+
* visible effect on radio options in `popover` or `modal` on `md` (the radio control is hidden there).
|
|
1322
|
+
*
|
|
1323
|
+
* When unset, the interface picks a default based on mode and control
|
|
1324
|
+
* type.
|
|
1325
|
+
*/
|
|
1326
|
+
labelPlacement;
|
|
1327
|
+
/**
|
|
1328
|
+
* How to pack the label and the option's selection control within a line.
|
|
1329
|
+
* `"start"`: The label and radio will appear on the left in LTR and
|
|
1330
|
+
* on the right in RTL.
|
|
1331
|
+
* `"end"`: The label and radio will appear on the right in LTR and
|
|
1332
|
+
* on the left in RTL.
|
|
1333
|
+
* `"space-between"`: The label and radio will appear on opposite
|
|
1334
|
+
* ends of the line with space between the two elements.
|
|
1335
|
+
*
|
|
1336
|
+
* Applies to the `alert`, `popover`, and `modal` interfaces, but has no
|
|
1337
|
+
* visible effect on radio options in `popover` or `modal` on `md` (the radio control is hidden there).
|
|
1338
|
+
*
|
|
1339
|
+
* When unset, the interface picks a default based on mode and control
|
|
1340
|
+
* type.
|
|
1341
|
+
*/
|
|
1342
|
+
justify;
|
|
881
1343
|
render() {
|
|
882
|
-
return index.h(index.Host, { key: '
|
|
1344
|
+
return index.h(index.Host, { key: '01275b5a613c4b065b24e0d939f611f6ed1fc9ee', role: "option", id: this.inputId, class: ionicGlobal.getIonMode(this) });
|
|
883
1345
|
}
|
|
884
|
-
get el() { return index.getElement(this); }
|
|
885
1346
|
};
|
|
886
1347
|
let selectOptionIds = 0;
|
|
887
1348
|
SelectOption.style = selectOptionCss();
|
|
888
1349
|
|
|
889
|
-
const selectPopoverIosCss = () => `.sc-ion-select-popover-ios-h ion-list.sc-ion-select-popover-ios{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}ion-list-header.sc-ion-select-popover-ios,ion-label.sc-ion-select-popover-ios{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-select-popover-ios-h{overflow-y:auto}`;
|
|
1350
|
+
const selectPopoverIosCss = () => `.action-sheet-button-label-has-rich-content.sc-ion-select-popover-ios,.alert-radio-label-has-rich-content.sc-ion-select-popover-ios,.alert-checkbox-label-has-rich-content.sc-ion-select-popover-ios,.select-option-label-has-rich-content.sc-ion-select-popover-ios{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;gap:16px}.action-sheet-button-label-has-rich-content.sc-ion-select-popover-ios,.alert-radio-label-has-rich-content.sc-ion-select-popover-ios,.alert-checkbox-label-has-rich-content.sc-ion-select-popover-ios,.select-option-content.sc-ion-select-popover-ios{-ms-flex:1;flex:1}.action-sheet-button-label-text.sc-ion-select-popover-ios,.alert-checkbox-label-text.sc-ion-select-popover-ios,.alert-radio-label-text.sc-ion-select-popover-ios,.select-option-label-text.sc-ion-select-popover-ios{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;gap:12px}.select-option-start.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;gap:8px}.select-option-description.sc-ion-select-popover-ios{padding-left:0;padding-right:0;padding-top:5px;padding-bottom:0;display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));font-size:0.75rem}.select-option-label.sc-ion-select-popover-ios:not(.select-option-label-has-rich-content){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.select-option-label-has-rich-content.sc-ion-select-popover-ios{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}ion-radio.select-option-has-rich-content.sc-ion-select-popover-ios::part(label),ion-radio.select-option-has-rich-content.sc-ion-select-popover-ios [part~="label"],ion-checkbox.select-option-has-rich-content.sc-ion-select-popover-ios::part(label),ion-checkbox.select-option-has-rich-content.sc-ion-select-popover-ios [part~="label"],.select-option-content.sc-ion-select-popover-ios{-ms-flex:1;flex:1;white-space:normal}.select-option-start.sc-ion-select-popover-ios>ion-avatar.sc-ion-select-popover-ios,.select-option-start.sc-ion-select-popover-ios>ion-img.sc-ion-select-popover-ios,.select-option-start.sc-ion-select-popover-ios>ion-thumbnail.sc-ion-select-popover-ios,.select-option-start.sc-ion-select-popover-ios>img.sc-ion-select-popover-ios,.select-option-start.sc-ion-select-popover-ios>svg.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios>ion-avatar.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios>ion-img.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios>ion-thumbnail.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios>img.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios>svg.sc-ion-select-popover-ios{width:44px;height:44px}.select-option-start.sc-ion-select-popover-ios>ion-icon.sc-ion-select-popover-ios,.select-option-end.sc-ion-select-popover-ios>ion-icon.sc-ion-select-popover-ios{font-size:28px}.action-sheet-button-label-text.sc-ion-select-popover-ios{-ms-flex-pack:center;justify-content:center}.select-option-has-rich-content.sc-ion-select-popover-ios{-webkit-padding-end:16px;padding-inline-end:16px}.sc-ion-select-popover-ios-h ion-list.sc-ion-select-popover-ios{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}ion-list-header.sc-ion-select-popover-ios,ion-label.sc-ion-select-popover-ios{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-select-popover-ios-h{overflow-y:auto}`;
|
|
890
1351
|
|
|
891
|
-
const selectPopoverMdCss = () => `.sc-ion-select-popover-md-h ion-list.sc-ion-select-popover-md{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}ion-list-header.sc-ion-select-popover-md,ion-label.sc-ion-select-popover-md{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-select-popover-md-h{overflow-y:auto}ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md::part(container),ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md [part~="container"]{display:none}ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md::part(label),ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md [part~="label"]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}ion-item.sc-ion-select-popover-md{--inner-border-width:0}.item-radio-checked.sc-ion-select-popover-md{--background:rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.08);--background-focused:var(--ion-color-primary, #0054e9);--background-focused-opacity:0.2;--background-hover:var(--ion-color-primary, #0054e9);--background-hover-opacity:0.12}.item-checkbox-checked.sc-ion-select-popover-md{--background-activated:var(--ion-item-color, var(--ion-text-color, #000));--background-focused:var(--ion-item-color, var(--ion-text-color, #000));--background-hover:var(--ion-item-color, var(--ion-text-color, #000));--color:var(--ion-color-primary, #0054e9)}`;
|
|
1352
|
+
const selectPopoverMdCss = () => `.action-sheet-button-label-has-rich-content.sc-ion-select-popover-md,.alert-radio-label-has-rich-content.sc-ion-select-popover-md,.alert-checkbox-label-has-rich-content.sc-ion-select-popover-md,.select-option-label-has-rich-content.sc-ion-select-popover-md{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;gap:16px}.action-sheet-button-label-has-rich-content.sc-ion-select-popover-md,.alert-radio-label-has-rich-content.sc-ion-select-popover-md,.alert-checkbox-label-has-rich-content.sc-ion-select-popover-md,.select-option-content.sc-ion-select-popover-md{-ms-flex:1;flex:1}.action-sheet-button-label-text.sc-ion-select-popover-md,.alert-checkbox-label-text.sc-ion-select-popover-md,.alert-radio-label-text.sc-ion-select-popover-md,.select-option-label-text.sc-ion-select-popover-md{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;gap:12px}.select-option-start.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;gap:8px}.select-option-description.sc-ion-select-popover-md{padding-left:0;padding-right:0;padding-top:5px;padding-bottom:0;display:block;color:var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));font-size:0.75rem}.select-option-label.sc-ion-select-popover-md:not(.select-option-label-has-rich-content){text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.select-option-label-has-rich-content.sc-ion-select-popover-md{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}ion-radio.select-option-has-rich-content.sc-ion-select-popover-md::part(label),ion-radio.select-option-has-rich-content.sc-ion-select-popover-md [part~="label"],ion-checkbox.select-option-has-rich-content.sc-ion-select-popover-md::part(label),ion-checkbox.select-option-has-rich-content.sc-ion-select-popover-md [part~="label"],.select-option-content.sc-ion-select-popover-md{-ms-flex:1;flex:1;white-space:normal}.select-option-start.sc-ion-select-popover-md>ion-avatar.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>ion-avatar.sc-ion-select-popover-md{width:40px;height:40px}.select-option-start.sc-ion-select-popover-md>ion-icon.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>ion-icon.sc-ion-select-popover-md{font-size:24px}.select-option-start.sc-ion-select-popover-md>ion-img.sc-ion-select-popover-md,.select-option-start.sc-ion-select-popover-md>img.sc-ion-select-popover-md,.select-option-start.sc-ion-select-popover-md>svg.sc-ion-select-popover-md,.select-option-start.sc-ion-select-popover-md>ion-thumbnail.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>ion-img.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>img.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>svg.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>ion-thumbnail.sc-ion-select-popover-md{width:56px;height:56px}.select-option-start.sc-ion-select-popover-md>video.sc-ion-select-popover-md,.select-option-end.sc-ion-select-popover-md>video.sc-ion-select-popover-md{width:114px;height:56px}.sc-ion-select-popover-md-h ion-list.sc-ion-select-popover-md{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}ion-list-header.sc-ion-select-popover-md,ion-label.sc-ion-select-popover-md{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}.sc-ion-select-popover-md-h{overflow-y:auto}ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md::part(container),ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md [part~="container"]{display:none}ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md::part(label),ion-list.sc-ion-select-popover-md ion-radio.sc-ion-select-popover-md [part~="label"]{margin-left:0;margin-right:0;margin-top:0;margin-bottom:0}ion-item.sc-ion-select-popover-md{--inner-border-width:0}.item-radio-checked.sc-ion-select-popover-md{--background:rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.08);--background-focused:var(--ion-color-primary, #0054e9);--background-focused-opacity:0.2;--background-hover:var(--ion-color-primary, #0054e9);--background-hover-opacity:0.12}.item-checkbox-checked.sc-ion-select-popover-md{--background-activated:var(--ion-item-color, var(--ion-text-color, #000));--background-focused:var(--ion-item-color, var(--ion-text-color, #000));--background-hover:var(--ion-item-color, var(--ion-text-color, #000));--color:var(--ion-color-primary, #0054e9)}`;
|
|
892
1353
|
|
|
893
1354
|
const SelectPopover = class {
|
|
894
1355
|
constructor(hostRef) {
|
|
895
1356
|
index.registerInstance(this, hostRef);
|
|
896
|
-
// Tracks the option that received Enter-keydown so keyup only
|
|
897
|
-
// dismisses when the press started on the same option. Prevents
|
|
898
|
-
// Enter on the triggering ion-select from auto-dismissing.
|
|
899
|
-
this.pendingEnterTarget = null;
|
|
900
|
-
/**
|
|
901
|
-
* An array of options for the popover
|
|
902
|
-
*/
|
|
903
|
-
this.options = [];
|
|
904
1357
|
}
|
|
1358
|
+
get el() { return index.getElement(this); }
|
|
1359
|
+
// Tracks the option that received Enter-keydown so keyup only
|
|
1360
|
+
// dismisses when the press started on the same option. Prevents
|
|
1361
|
+
// Enter on the triggering ion-select from auto-dismissing.
|
|
1362
|
+
pendingEnterTarget = null;
|
|
1363
|
+
/**
|
|
1364
|
+
* The header text of the popover
|
|
1365
|
+
*/
|
|
1366
|
+
header;
|
|
1367
|
+
/**
|
|
1368
|
+
* The subheader text of the popover
|
|
1369
|
+
*/
|
|
1370
|
+
subHeader;
|
|
1371
|
+
/**
|
|
1372
|
+
* The text content of the popover body
|
|
1373
|
+
*/
|
|
1374
|
+
message;
|
|
1375
|
+
/**
|
|
1376
|
+
* If true, the select accepts multiple values
|
|
1377
|
+
*/
|
|
1378
|
+
multiple;
|
|
1379
|
+
/**
|
|
1380
|
+
* An array of options for the popover
|
|
1381
|
+
*/
|
|
1382
|
+
options = [];
|
|
905
1383
|
findOptionFromEvent(ev) {
|
|
906
1384
|
const { options } = this;
|
|
907
1385
|
return options.find((o) => o.value === ev.target.value);
|
|
@@ -914,7 +1392,7 @@ const SelectPopover = class {
|
|
|
914
1392
|
callOptionHandler(ev) {
|
|
915
1393
|
const option = this.findOptionFromEvent(ev);
|
|
916
1394
|
const values = this.getValues(ev);
|
|
917
|
-
if (option
|
|
1395
|
+
if (option?.handler) {
|
|
918
1396
|
overlays.safeCall(option.handler, values);
|
|
919
1397
|
}
|
|
920
1398
|
}
|
|
@@ -959,45 +1437,94 @@ const SelectPopover = class {
|
|
|
959
1437
|
}
|
|
960
1438
|
}
|
|
961
1439
|
renderCheckboxOptions(options) {
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
1440
|
+
const mode = ionicGlobal.getIonMode(this);
|
|
1441
|
+
return options.map((option, index$1) => {
|
|
1442
|
+
/**
|
|
1443
|
+
* Cast to `SelectOverlayOption` to access rich content
|
|
1444
|
+
* fields (`startContent`, `endContent`, `description`)
|
|
1445
|
+
* that are passed through from `ion-select` but not
|
|
1446
|
+
* part of the public `SelectPopoverOption` interface.
|
|
1447
|
+
*/
|
|
1448
|
+
const richOption = option;
|
|
1449
|
+
const hasRichContent = !!richOption.startContent || !!richOption.endContent || !!richOption.description;
|
|
1450
|
+
const optionLabelOptions = {
|
|
1451
|
+
id: `popover-option-${index$1}`,
|
|
1452
|
+
label: richOption.text,
|
|
1453
|
+
startContent: richOption.startContent,
|
|
1454
|
+
endContent: richOption.endContent,
|
|
1455
|
+
description: richOption.description,
|
|
1456
|
+
};
|
|
1457
|
+
const defaultLabelPlacement = overlayControlLabel.getOverlayLabelPlacement(mode, 'checkbox');
|
|
1458
|
+
const defaultJustify = overlayControlLabel.getOverlayLabelJustify(mode, 'checkbox');
|
|
1459
|
+
return (index.h("ion-item", {
|
|
968
1460
|
// TODO FW-4784
|
|
969
|
-
|
|
970
|
-
|
|
1461
|
+
disabled: option.disabled, class: {
|
|
1462
|
+
// TODO FW-4784
|
|
1463
|
+
'item-checkbox-checked': option.checked,
|
|
1464
|
+
...theme.getClassMap(option.cssClass),
|
|
1465
|
+
}
|
|
1466
|
+
}, index.h("ion-checkbox", { class: {
|
|
1467
|
+
'select-option-has-rich-content': hasRichContent,
|
|
1468
|
+
}, value: option.value, disabled: option.disabled, checked: option.checked, justify: richOption.justify ?? defaultJustify, labelPlacement: richOption.labelPlacement ?? defaultLabelPlacement, onIonChange: (ev) => {
|
|
1469
|
+
this.setChecked(ev);
|
|
1470
|
+
this.callOptionHandler(ev);
|
|
1471
|
+
// TODO FW-4784
|
|
1472
|
+
index.forceUpdate(this);
|
|
1473
|
+
} }, selectOptionRender.renderOptionLabel(optionLabelOptions, 'select-option-label'))));
|
|
1474
|
+
});
|
|
971
1475
|
}
|
|
972
1476
|
renderRadioOptions(options) {
|
|
1477
|
+
const mode = ionicGlobal.getIonMode(this);
|
|
973
1478
|
const checked = options.filter((o) => o.checked).map((o) => o.value)[0];
|
|
974
|
-
return (index.h("ion-radio-group", { value: checked, onIonChange: (ev) => this.callOptionHandler(ev) }, options.map((option) =>
|
|
1479
|
+
return (index.h("ion-radio-group", { value: checked, onIonChange: (ev) => this.callOptionHandler(ev) }, options.map((option, index$1) => {
|
|
1480
|
+
/**
|
|
1481
|
+
* Cast to `SelectOverlayOption` to access rich content
|
|
1482
|
+
* fields (`startContent`, `endContent`, `description`)
|
|
1483
|
+
* that are passed through from `ion-select` but not
|
|
1484
|
+
* part of the public `SelectPopoverOption` interface.
|
|
1485
|
+
*/
|
|
1486
|
+
const richOption = option;
|
|
1487
|
+
const hasRichContent = !!richOption.startContent || !!richOption.endContent || !!richOption.description;
|
|
1488
|
+
const optionLabelOptions = {
|
|
1489
|
+
id: `popover-option-${index$1}`,
|
|
1490
|
+
label: richOption.text,
|
|
1491
|
+
startContent: richOption.startContent,
|
|
1492
|
+
endContent: richOption.endContent,
|
|
1493
|
+
description: richOption.description,
|
|
1494
|
+
};
|
|
1495
|
+
return (index.h("ion-item", {
|
|
975
1496
|
// TODO FW-4784
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
}
|
|
981
|
-
}, onKeyUp: (ev) => {
|
|
982
|
-
if (ev.key === ' ') {
|
|
983
|
-
// Space selects and dismisses in one press.
|
|
984
|
-
this.dismissParentPopover();
|
|
1497
|
+
disabled: option.disabled, class: {
|
|
1498
|
+
// TODO FW-4784
|
|
1499
|
+
'item-radio-checked': option.value === checked,
|
|
1500
|
+
...theme.getClassMap(option.cssClass),
|
|
985
1501
|
}
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
if (
|
|
1502
|
+
}, index.h("ion-radio", { class: {
|
|
1503
|
+
'select-option-has-rich-content': hasRichContent,
|
|
1504
|
+
}, value: option.value, disabled: option.disabled, justify: richOption.justify ?? overlayControlLabel.getOverlayLabelJustify(mode, 'radio'), labelPlacement: richOption.labelPlacement ?? overlayControlLabel.getOverlayLabelPlacement(mode, 'radio'), onClick: () => this.dismissParentPopover(), onKeyDown: (ev) => {
|
|
1505
|
+
if (ev.key === 'Enter' && !ev.repeat) {
|
|
1506
|
+
this.pendingEnterTarget = ev.currentTarget;
|
|
1507
|
+
}
|
|
1508
|
+
}, onKeyUp: (ev) => {
|
|
1509
|
+
if (ev.key === ' ') {
|
|
1510
|
+
// Space selects and dismisses in one press.
|
|
990
1511
|
this.dismissParentPopover();
|
|
991
1512
|
}
|
|
992
|
-
|
|
993
|
-
|
|
1513
|
+
else if (ev.key === 'Enter') {
|
|
1514
|
+
const shouldDismiss = this.pendingEnterTarget === ev.currentTarget;
|
|
1515
|
+
this.pendingEnterTarget = null;
|
|
1516
|
+
if (shouldDismiss) {
|
|
1517
|
+
this.dismissParentPopover();
|
|
1518
|
+
}
|
|
1519
|
+
}
|
|
1520
|
+
} }, selectOptionRender.renderOptionLabel(optionLabelOptions, 'select-option-label'))));
|
|
1521
|
+
})));
|
|
994
1522
|
}
|
|
995
1523
|
render() {
|
|
996
1524
|
const { header, message, options, subHeader } = this;
|
|
997
1525
|
const hasSubHeaderOrMessage = subHeader !== undefined || message !== undefined;
|
|
998
|
-
return (index.h(index.Host, { key: '
|
|
1526
|
+
return (index.h(index.Host, { key: '4b4ac4a4b6523147e7c1f5e29dd8043867f2baea', class: ionicGlobal.getIonMode(this) }, index.h("ion-list", { key: 'f700d3dc3ce68c20a4d981164b29262564097fb4' }, header !== undefined && index.h("ion-list-header", { key: '196bcd7963f13ef8bc46231545eee4cb8d526f5e' }, header), hasSubHeaderOrMessage && (index.h("ion-item", { key: 'bb108e0aa2409997df35f52cb67e58e55e0fd630' }, index.h("ion-label", { key: '59e8d9196ff976f3835766662654c0f085e58ec3', class: "ion-text-wrap" }, subHeader !== undefined && index.h("h3", { key: '532f75d7c129ffadca4e6cbb619a4427aaede65c' }, subHeader), message !== undefined && index.h("p", { key: 'fc42c91594b9001e983cb5e4176fc4c9bff0f708' }, message)))), this.renderOptions(options))));
|
|
999
1527
|
}
|
|
1000
|
-
get el() { return index.getElement(this); }
|
|
1001
1528
|
};
|
|
1002
1529
|
SelectPopover.style = {
|
|
1003
1530
|
ios: selectPopoverIosCss(),
|