@ionic/core 8.8.17 → 8.8.18-dev.11786108988.1fd94742
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-0tt0PTAe.js +4 -0
- package/components/p-3dKnMgX5.js +4 -0
- package/components/p-6e_5igwn.js +4 -0
- package/components/{p--JUspHvy.js → p-AqD_wmvU.js} +1 -1
- package/components/p-B-FxiyeI.js +4 -0
- package/components/p-B4COLbAV.js +4 -0
- package/components/p-B9zzUBwR.js +4 -0
- package/components/p-BFU7kgcj.js +4 -0
- package/components/p-BMPN55of.js +4 -0
- package/components/p-BPbRjpb2.js +4 -0
- package/components/p-BSQPZ79H.js +4 -0
- package/{dist/ionic/p-KjNvRoEp.js → components/p-BXQ7upSC.js} +1 -1
- package/components/p-BhamHSw3.js +4 -0
- package/components/p-BrXE0XUu.js +4 -0
- package/components/p-Bv7Rqz3Z.js +4 -0
- package/components/p-Bw7MMRH7.js +4 -0
- package/components/p-C-X5vb8f.js +4 -0
- package/components/p-C117Majq.js +4 -0
- package/components/{p-ChIZKXUu.js → p-C6JOi8wS.js} +1 -1
- package/components/p-CCVPk59A.js +4 -0
- package/components/p-CEW4RXZO.js +4 -0
- package/components/p-CKMc290p.js +4 -0
- package/components/{p-BkKAANMJ.js → p-CO5nI-BZ.js} +1 -1
- package/components/p-COQ_7Wwc.js +4 -0
- package/components/p-CQbh6Be_.js +4 -0
- package/components/p-CQtcj8t7.js +4 -0
- package/components/p-Cap9bvqr.js +4 -0
- package/components/p-CdP7ze2J.js +4 -0
- package/components/p-CfyJ_Ogc.js +4 -0
- package/components/p-ChWC4-vA.js +4 -0
- package/components/p-CmKf4pgI.js +4 -0
- package/components/p-CqYSqB9_.js +4 -0
- package/{dist/ionic/p-DC3RagnA.js → components/p-Cwsd9bue.js} +1 -1
- package/components/{p-D3xo7hqU.js → p-D0pL_HuH.js} +1 -1
- package/components/p-D0xd6h3Q.js +4 -0
- package/components/p-D28LaDuR.js +4 -0
- package/components/p-D7-vHX0A.js +4 -0
- package/components/p-D9KqizZs.js +4 -0
- package/components/p-DIZE3CVV.js +4 -0
- package/components/p-DL8rd5jo.js +4 -0
- package/components/p-DRcApg6F.js +4 -0
- package/components/p-DTTnwMiS.js +4 -0
- package/components/p-DWCzVL3Y.js +4 -0
- package/components/p-DYmrV1HT.js +4 -0
- package/components/{p-DqLB8yFQ.js → p-Dcu-SAJG.js} +1 -1
- package/components/p-DnINLmwC.js +4 -0
- package/components/{p-DRugphUN.js → p-DsNz6_gM.js} +1 -1
- package/components/p-DtiuiOTk.js +4 -0
- package/components/p-DunYzubP.js +4 -0
- package/components/p-DwcSJ9u1.js +4 -0
- package/components/p-QCPSB1bo.js +4 -0
- package/components/p-RvtofbHn.js +4 -0
- package/components/p-TXPDHL13.js +4 -0
- package/components/p-WOFp6fXj.js +4 -0
- package/components/p-byZM6qHV.js +4 -0
- package/components/{p-C_hpsif8.js → p-ltNYIRmI.js} +1 -1
- package/components/p-miSGCTAU.js +4 -0
- package/components/p-mpdX3emm.js +4 -0
- package/components/p-nvqVLrWC.js +4 -0
- package/components/p-qiWM96Sz.js +4 -0
- package/components/p-vlF0Bcfd.js +4 -0
- package/dist/cjs/{animation-BJq0kcy2.js → animation-D5WDBRvT.js} +4 -4
- package/dist/cjs/{app-globals-BlqrqKTN.js → app-globals-C2s3Cbal.js} +1 -1
- package/dist/cjs/{button-active-0mPOKmV2.js → button-active-CXI2TseG.js} +3 -3
- package/dist/cjs/config-CjUbvdPW.js +36 -0
- package/dist/cjs/{dir-Cn0z1rJH.js → dir-Brx7VkvP.js} +1 -1
- package/dist/cjs/{format-PxvGiOik.js → format-ZfKtcdit.js} +40 -30
- package/dist/cjs/{framework-delegate-BtICZDHr.js → framework-delegate-Bdvk3JQO.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-iUuF_76h.js → hardware-back-button-zr8zeYaH.js} +4 -4
- package/dist/cjs/{helpers-Cv23MFHM.js → helpers-DURh1XdY.js} +3 -3
- package/dist/cjs/{index-aC4x3Fk3.js → index-B7sCu6vN.js} +6 -7
- package/dist/cjs/{index-CIrkNXqJ.js → index-BnhnwL1o.js} +2 -2
- package/dist/cjs/{index-D81eLYUM.js → index-Btdix80K.js} +2 -2
- package/dist/cjs/{index-Ct7gcRif.js → index-CAThePqm.js} +4 -6
- package/dist/cjs/index-DhSx3VvD.js +429 -0
- package/dist/cjs/{index-BERfRao3.js → index-DsoHs7Ly.js} +5 -5
- package/dist/cjs/{index-CAvQ7Tka.js → index-P1nQxrpZ.js} +10 -4
- package/dist/cjs/{index-DqmRDbxg.js → index-wOmugbdg.js} +1 -1
- package/dist/cjs/index.cjs.js +18 -18
- package/dist/cjs/{input-shims-CFLg7uzj.js → input-shims-CPbWb84M.js} +9 -11
- package/dist/cjs/{input.utils-DetjmtH2.js → input.utils-CkASW3mE.js} +3 -4
- package/dist/cjs/ion-accordion_2.cjs.entry.js +368 -340
- package/dist/cjs/ion-action-sheet.cjs.entry.js +187 -76
- package/dist/cjs/ion-alert.cjs.entry.js +273 -111
- package/dist/cjs/ion-app_8.cjs.entry.js +306 -190
- package/dist/cjs/ion-avatar_3.cjs.entry.js +10 -4
- package/dist/cjs/ion-back-button.cjs.entry.js +47 -23
- package/dist/cjs/ion-backdrop.cjs.entry.js +18 -14
- package/dist/cjs/ion-breadcrumb_2.cjs.entry.js +199 -121
- package/dist/cjs/ion-button_2.cjs.entry.js +138 -66
- package/dist/cjs/ion-card_5.cjs.entry.js +82 -30
- package/dist/cjs/ion-checkbox.cjs.entry.js +152 -101
- 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 +253 -241
- package/dist/cjs/ion-datetime.cjs.entry.js +2767 -0
- package/dist/cjs/ion-fab_3.cjs.entry.js +139 -81
- package/dist/cjs/ion-img.cjs.entry.js +34 -12
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +100 -72
- package/dist/cjs/ion-input-otp.cjs.entry.js +433 -370
- package/dist/cjs/ion-input-password-toggle.cjs.entry.js +33 -19
- package/dist/cjs/ion-input.cjs.entry.js +314 -168
- package/dist/cjs/ion-item-option_3.cjs.entry.js +91 -51
- package/dist/cjs/ion-item_8.cjs.entry.js +181 -82
- package/dist/cjs/ion-loading.cjs.entry.js +146 -60
- package/dist/cjs/ion-menu_3.cjs.entry.js +163 -101
- package/dist/cjs/ion-modal.cjs.entry.js +418 -251
- package/dist/cjs/ion-nav_2.cjs.entry.js +100 -157
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +37 -33
- package/dist/cjs/ion-picker-column.cjs.entry.js +417 -405
- package/dist/cjs/ion-picker.cjs.entry.js +401 -392
- package/dist/cjs/ion-popover.cjs.entry.js +319 -205
- package/dist/cjs/ion-progress-bar.cjs.entry.js +31 -25
- package/dist/cjs/ion-radio_2.cjs.entry.js +206 -133
- package/dist/cjs/ion-range.cjs.entry.js +302 -237
- package/dist/cjs/ion-refresher_2.cjs.entry.js +165 -93
- package/dist/cjs/ion-reorder_2.cjs.entry.js +53 -23
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +14 -14
- package/dist/cjs/ion-route_4.cjs.entry.js +175 -71
- 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 +104 -48
- package/dist/cjs/ion-select_3.cjs.entry.js +759 -214
- 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 +100 -41
- package/dist/cjs/ion-tab_2.cjs.entry.js +53 -27
- package/dist/cjs/ion-text.cjs.entry.js +11 -5
- package/dist/cjs/ion-textarea.cjs.entry.js +263 -144
- package/dist/cjs/ion-toast.cjs.entry.js +236 -117
- package/dist/cjs/ion-toggle.cjs.entry.js +175 -122
- package/dist/cjs/{ionic-global-B-cA6LkY.js → ionic-global-dMut1Czp.js} +13 -8
- package/dist/cjs/ionic.cjs.js +4 -4
- package/dist/cjs/{ios.transition-BOSWOaiK.js → ios.transition-CeaFa0y2.js} +13 -17
- package/dist/cjs/{item-multiple-inputs-D-gyg57c.js → item-multiple-inputs-HQO5Iy9I.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-B8-wBZqt.js → md.transition-D4Q5jny7.js} +7 -8
- package/dist/cjs/{notch-controller-18PzRGXd.js → notch-controller-fMfidI-7.js} +1 -1
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +50 -0
- package/dist/cjs/{overlays-DdtIYQUH.js → overlays-C2qrqpHm.js} +48 -33
- package/dist/cjs/select-option-render-Dh16lTnA.js +123 -0
- package/dist/cjs/{status-tap-BXX8H8_Y.js → status-tap-CgjQ-6jq.js} +3 -3
- package/dist/cjs/{swipe-back-C0GCB18x.js → swipe-back-CmfRYdWQ.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 +92 -64
- package/dist/collection/components/datetime/datetime.ios.css +42 -2
- package/dist/collection/components/datetime/datetime.js +1038 -803
- 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 +1 -2
- package/dist/collection/components/input/input.js +309 -164
- package/dist/collection/components/input/input.md.css +1 -2
- package/dist/collection/components/input-otp/input-otp.js +428 -366
- package/dist/collection/components/input-password-toggle/input-password-toggle.js +29 -16
- package/dist/collection/components/item/item.js +99 -53
- package/dist/collection/components/item-divider/item-divider.js +15 -10
- package/dist/collection/components/item-option/item-option.js +49 -21
- package/dist/collection/components/item-options/item-options.js +10 -7
- package/dist/collection/components/item-sliding/item-sliding.js +26 -20
- package/dist/collection/components/label/label.js +24 -4
- package/dist/collection/components/list/list.js +10 -7
- package/dist/collection/components/list-header/list-header.js +10 -0
- package/dist/collection/components/loading/loading.js +135 -51
- package/dist/collection/components/menu/menu.js +101 -59
- package/dist/collection/components/menu-button/menu-button.js +29 -20
- package/dist/collection/components/menu-toggle/menu-toggle.js +20 -13
- 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 +6 -7
- package/dist/collection/components/modal/gestures/swipe-to-close.js +1 -2
- package/dist/collection/components/modal/modal.js +393 -224
- package/dist/collection/components/modal/safe-area-utils.js +4 -5
- 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 +20 -9
- package/dist/collection/components/note/note.js +6 -0
- 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 +100 -65
- package/dist/collection/components/radio-group/test/fixtures.js +2 -0
- package/dist/collection/components/range/range.js +296 -232
- 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 +33 -0
- package/dist/collection/components/select/select.js +597 -166
- package/dist/collection/components/select/select.md.css +33 -0
- 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.js +257 -139
- 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/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/gesture/listener.js +1 -1
- package/dist/collection/utils/hardware-back-button.js +3 -3
- package/dist/collection/utils/helpers.js +2 -2
- package/dist/collection/utils/input-shims/hacks/scroll-assist.js +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/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 +1 -1
- 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 +556 -1272
- package/dist/esm/{animation-DLJpuoEz.js → animation-CVK55yMY.js} +4 -4
- package/dist/esm/{app-globals-D0C5S4hU.js → app-globals-Bk1_t4sH.js} +1 -1
- package/dist/esm/{button-active-BSpTQmS9.js → button-active-CdCqmeT0.js} +3 -3
- package/dist/esm/config-DWCzVL3Y.js +32 -0
- package/dist/esm/{dir-C53feagD.js → dir-B-FxiyeI.js} +1 -1
- package/dist/esm/{format-CAmvpAez.js → format-sMi4BZ_l.js} +41 -31
- package/dist/esm/{framework-delegate-FnPGymXL.js → framework-delegate-BfAlKlW5.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-DcHMMB9j.js} +4 -4
- package/dist/esm/{helpers-HEqiOzXb.js → helpers-BPcITY5s.js} +3 -3
- package/dist/esm/{index-BRHzoo00.js → index-B9GsUd2c.js} +2 -2
- package/dist/esm/{index-DV3sJJW8.js → index-BvabGprD.js} +2 -2
- package/dist/esm/{index-tcQvqkiX.js → index-D1CQtpUN.js} +5 -7
- package/dist/esm/index-DDa8edAS.js +424 -0
- package/dist/esm/{index-MEDq2S8l.js → index-DcUt1pPn.js} +2 -2
- package/dist/esm/{index-CfgBF1SE.js → index-DppOcPFQ.js} +10 -4
- package/dist/esm/{index-B_dQk_WE.js → index-DqVqy_Cy.js} +5 -5
- package/dist/esm/{index-Q6UPU0Ay.js → index-ks-BjikL.js} +6 -7
- package/dist/esm/index.js +16 -15
- package/dist/esm/{input-shims-D10mwcw1.js → input-shims-C1dCKVMO.js} +9 -11
- package/dist/esm/{input.utils-Y6NgW8bw.js → input.utils-Dd5xwlP6.js} +3 -4
- package/dist/esm/ion-accordion_2.entry.js +368 -340
- package/dist/esm/ion-action-sheet.entry.js +187 -76
- package/dist/esm/ion-alert.entry.js +272 -110
- package/dist/esm/ion-app_8.entry.js +306 -190
- package/dist/esm/ion-avatar_3.entry.js +10 -4
- package/dist/esm/ion-back-button.entry.js +47 -23
- package/dist/esm/ion-backdrop.entry.js +18 -14
- package/dist/esm/ion-breadcrumb_2.entry.js +199 -121
- package/dist/esm/ion-button_2.entry.js +138 -66
- package/dist/esm/ion-card_5.entry.js +82 -30
- package/dist/esm/ion-checkbox.entry.js +152 -101
- 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 +253 -241
- package/dist/esm/ion-datetime.entry.js +2765 -0
- package/dist/esm/ion-fab_3.entry.js +139 -81
- package/dist/esm/ion-img.entry.js +34 -12
- package/dist/esm/ion-infinite-scroll_2.entry.js +99 -71
- package/dist/esm/ion-input-otp.entry.js +433 -370
- package/dist/esm/ion-input-password-toggle.entry.js +33 -19
- package/dist/esm/ion-input.entry.js +314 -168
- package/dist/esm/ion-item-option_3.entry.js +91 -51
- package/dist/esm/ion-item_8.entry.js +181 -82
- package/dist/esm/ion-loading.entry.js +145 -59
- package/dist/esm/ion-menu_3.entry.js +163 -101
- package/dist/esm/ion-modal.entry.js +418 -251
- package/dist/esm/ion-nav_2.entry.js +100 -157
- package/dist/esm/ion-picker-column-option.entry.js +37 -33
- package/dist/esm/ion-picker-column.entry.js +417 -405
- package/dist/esm/ion-picker.entry.js +401 -392
- package/dist/esm/ion-popover.entry.js +319 -205
- package/dist/esm/ion-progress-bar.entry.js +31 -25
- package/dist/esm/ion-radio_2.entry.js +206 -133
- package/dist/esm/ion-range.entry.js +302 -237
- package/dist/esm/ion-refresher_2.entry.js +163 -91
- package/dist/esm/ion-reorder_2.entry.js +53 -23
- package/dist/esm/ion-ripple-effect.entry.js +14 -14
- package/dist/esm/ion-route_4.entry.js +175 -71
- 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 +104 -48
- package/dist/esm/ion-select_3.entry.js +760 -215
- 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 +100 -41
- package/dist/esm/ion-tab_2.entry.js +53 -27
- package/dist/esm/ion-text.entry.js +11 -5
- package/dist/esm/ion-textarea.entry.js +263 -144
- package/dist/esm/ion-toast.entry.js +235 -116
- package/dist/esm/ion-toggle.entry.js +175 -122
- package/dist/esm/{ionic-global-Cp_eT4sZ.js → ionic-global-5bZ91kOL.js} +13 -8
- package/dist/esm/ionic.js +5 -5
- package/dist/esm/{ios.transition-ClFrsIrS.js → ios.transition-OcwIGkv9.js} +13 -17
- package/dist/esm/{item-multiple-inputs-DlNuqNJm.js → item-multiple-inputs-ifd3ZrqY.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-D0msQmzI.js → md.transition-BetdF0bc.js} +7 -8
- package/dist/esm/{notch-controller-DKDjU_O7.js → notch-controller-DBSn-Uat.js} +1 -1
- package/dist/esm/overlay-control-label-BSQPZ79H.js +47 -0
- package/dist/esm/{overlays-Dg0q2_tJ.js → overlays-DUzb9CQf.js} +48 -33
- package/dist/esm/select-option-render-DsW8svRr.js +121 -0
- package/dist/esm/{status-tap-Kan2W7sh.js → status-tap-C-wNhea0.js} +3 -3
- package/dist/esm/{swipe-back-DQ1q5MgD.js → swipe-back-D6YSgAn7.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-01eaee58.entry.js +4 -0
- package/dist/ionic/p-0c567140.entry.js +4 -0
- package/dist/ionic/p-105bb794.entry.js +4 -0
- package/dist/ionic/p-10d55bb6.entry.js +4 -0
- package/dist/ionic/p-173a87d8.entry.js +4 -0
- package/dist/ionic/p-178da672.entry.js +4 -0
- package/dist/ionic/p-1ead2857.entry.js +4 -0
- package/dist/ionic/p-224e2464.entry.js +4 -0
- package/dist/ionic/p-2268e718.entry.js +4 -0
- package/dist/ionic/p-2b5283f3.entry.js +4 -0
- package/dist/ionic/p-2b6decac.entry.js +4 -0
- package/dist/ionic/p-2da5d9c6.entry.js +4 -0
- package/dist/ionic/p-31890acd.entry.js +4 -0
- package/dist/ionic/p-34ef7425.entry.js +4 -0
- package/dist/ionic/p-34f7c1d8.entry.js +4 -0
- package/dist/ionic/p-3b1e6fa4.entry.js +4 -0
- package/dist/ionic/p-42fefd2c.entry.js +4 -0
- package/dist/ionic/p-440cd489.entry.js +4 -0
- package/dist/ionic/{p-aaeedb6b.entry.js → p-460da491.entry.js} +1 -1
- package/dist/ionic/p-53f680e8.entry.js +4 -0
- package/dist/ionic/p-57ba508f.entry.js +4 -0
- package/dist/ionic/p-599e5a75.entry.js +4 -0
- package/dist/ionic/p-5f670a9e.entry.js +4 -0
- package/dist/ionic/p-63502088.entry.js +4 -0
- package/dist/ionic/p-6e6bf45d.entry.js +4 -0
- package/dist/ionic/p-6f0b6a48.entry.js +4 -0
- package/dist/ionic/p-7438c462.entry.js +4 -0
- package/dist/ionic/p-747716e7.entry.js +4 -0
- package/dist/ionic/p-7759fcaf.entry.js +4 -0
- package/dist/ionic/p-7a8338e2.entry.js +4 -0
- package/dist/ionic/p-80f9f1dc.entry.js +4 -0
- package/dist/ionic/p-83ff4dcb.entry.js +4 -0
- package/dist/ionic/p-86f03895.entry.js +4 -0
- package/dist/ionic/p-87b8d70e.entry.js +4 -0
- package/dist/ionic/p-888236bf.entry.js +4 -0
- package/dist/ionic/p-8a92ca23.entry.js +4 -0
- package/dist/ionic/p-8c9af4ad.entry.js +4 -0
- package/dist/ionic/p-9669f546.entry.js +4 -0
- package/dist/ionic/p-9bcd8b74.entry.js +4 -0
- package/dist/ionic/p-B-FxiyeI.js +4 -0
- package/dist/ionic/p-B2trYd8K.js +4 -0
- package/dist/ionic/p-BMPN55of.js +4 -0
- package/dist/ionic/{p-DIuEbVLu.js → p-BNKr91bi.js} +1 -1
- package/dist/ionic/p-BSQPZ79H.js +4 -0
- package/dist/ionic/p-BSzG1VcX.js +4 -0
- package/dist/ionic/p-BVgBHS96.js +4 -0
- package/dist/ionic/p-BX2IOAqC.js +4 -0
- package/dist/ionic/p-BhamHSw3.js +4 -0
- package/dist/ionic/p-BufXJ_A8.js +4 -0
- package/dist/ionic/{p-DV3sJJW8.js → p-BvabGprD.js} +1 -1
- package/dist/ionic/p-C73UOs4m.js +4 -0
- package/{components/p-B-JJgYSG.js → dist/ionic/p-CHpEzg-o.js} +1 -1
- package/dist/ionic/p-CUSwMljM.js +4 -0
- package/dist/ionic/p-CeOSrSdu.js +4 -0
- package/dist/ionic/p-CfkB7_FV.js +4 -0
- package/dist/ionic/p-CmKf4pgI.js +4 -0
- package/dist/ionic/p-CnM-CMw7.js +4 -0
- package/dist/ionic/p-D1CQtpUN.js +5 -0
- package/dist/ionic/p-D5t_-oMk.js +4 -0
- package/dist/ionic/p-DVYb1IVZ.js +4 -0
- package/dist/ionic/p-DWCzVL3Y.js +4 -0
- package/dist/ionic/p-DfJ-SVJf.js +4 -0
- package/dist/ionic/p-DmXrLsoD.js +4 -0
- package/dist/ionic/p-DtLHAMFW.js +4 -0
- package/dist/ionic/p-Dtlob2JL.js +4 -0
- package/dist/ionic/p-F7ipfyOA.js +4 -0
- package/dist/ionic/{p-DoJvtrbw.js → p-I9ETXg5W.js} +1 -1
- package/dist/ionic/{p-Wk5HzclC.js → p-IaXd5VMv.js} +1 -1
- package/dist/ionic/p-T71k3C35.js +4 -0
- package/dist/ionic/p-TXPDHL13.js +4 -0
- package/dist/ionic/p-aL0G45tD.js +4 -0
- package/dist/ionic/p-acbb97c3.entry.js +4 -0
- package/dist/ionic/p-aeb85531.entry.js +4 -0
- package/dist/ionic/p-b157f80d.entry.js +4 -0
- package/dist/ionic/p-b158de5d.entry.js +4 -0
- package/dist/ionic/{p-c6e49f3f.entry.js → p-b40c9715.entry.js} +1 -1
- package/dist/ionic/p-b852101e.entry.js +4 -0
- package/dist/ionic/p-byZM6qHV.js +4 -0
- package/dist/ionic/p-c0d81bee.entry.js +4 -0
- package/dist/ionic/p-c8a327fb.entry.js +4 -0
- package/dist/ionic/p-d42ae99f.entry.js +4 -0
- package/dist/ionic/p-d47ff529.entry.js +4 -0
- package/dist/ionic/p-eHi73fGE.js +4 -0
- package/dist/ionic/p-eeabce92.entry.js +4 -0
- package/dist/ionic/p-efc66d77.entry.js +4 -0
- package/dist/ionic/p-f6d203dc.entry.js +4 -0
- package/dist/ionic/p-u2a770LZ.js +4 -0
- package/dist/types/components/img/img.d.ts +2 -0
- package/dist/types/components/input/input.d.ts +1 -1
- 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 +18 -0
- package/dist/types/components/select-option/select-option.d.ts +42 -1
- 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 +0 -8
- 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 +10278 -7052
- package/hydrate/index.mjs +10278 -7052
- package/package.json +54 -11
- 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-A3O24YmY.js +0 -4
- package/components/p-ABkNVeU9.js +0 -4
- package/components/p-B9jFTlwE.js +0 -4
- package/components/p-BLmJ0zRm.js +0 -4
- package/components/p-BMI53wYL.js +0 -4
- package/components/p-BSEgsdFI.js +0 -4
- package/components/p-BTEOs1at.js +0 -4
- package/components/p-BlIAuGv2.js +0 -4
- package/components/p-Bnsn6KaP.js +0 -4
- package/components/p-BsBCoGa-.js +0 -4
- package/components/p-Bz0dSlXZ.js +0 -4
- package/components/p-C53feagD.js +0 -4
- package/components/p-CHqRYvYm.js +0 -4
- package/components/p-CQGnMY3n.js +0 -4
- package/components/p-CSZf8_j0.js +0 -4
- package/components/p-C_xFdyXe.js +0 -4
- package/components/p-Cf2jSDS8.js +0 -4
- package/components/p-Cfx4M1Bn.js +0 -4
- package/components/p-CkMSOsFF.js +0 -4
- package/components/p-Cl0B-RWe.js +0 -4
- package/components/p-CmR5uXej.js +0 -4
- package/components/p-CsNJ1ULL.js +0 -4
- package/components/p-CtWGkNnJ.js +0 -4
- package/components/p-CzCbeKys.js +0 -4
- package/components/p-D-aHdMxW.js +0 -4
- package/components/p-D0d8qTwj.js +0 -4
- package/components/p-D13Eaw-8.js +0 -4
- package/components/p-D6Ynv7Xh.js +0 -4
- package/components/p-DCnGU1fF.js +0 -4
- package/components/p-DGvrK8dD.js +0 -4
- package/components/p-DHTSTb52.js +0 -4
- package/components/p-DJZp0KTQ.js +0 -4
- package/components/p-DOFCbuQR.js +0 -4
- package/components/p-DV5mPYQS.js +0 -4
- package/components/p-DWkAgceV.js +0 -4
- package/components/p-DiVJyqlX.js +0 -4
- package/components/p-DqZAXv2t.js +0 -4
- package/components/p-KEFO0w3i.js +0 -4
- package/components/p-Osve4qkc.js +0 -4
- package/components/p-SLS1rDZM.js +0 -4
- package/components/p-VWbRkLT7.js +0 -4
- package/components/p-aJ6PBUvj.js +0 -4
- package/components/p-cyNmxje6.js +0 -4
- package/components/p-gAg0kXZp.js +0 -4
- package/components/p-j5IxBIan.js +0 -4
- package/components/p-k_E4tX5Z.js +0 -4
- package/components/p-oD4kcBRX.js +0 -4
- package/components/p-rCa2eL0j.js +0 -4
- package/components/p-scxfI1Dd.js +0 -4
- package/components/p-sijaAIYG.js +0 -4
- package/components/p-yzCsOZE2.js +0 -4
- package/dist/cjs/config-xninhj0J.js +0 -201
- package/dist/cjs/ion-datetime_3.cjs.entry.js +0 -3164
- 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/ion-datetime_3.entry.js +0 -3160
- package/dist/ionic/p-01f81ea5.entry.js +0 -4
- package/dist/ionic/p-06c232a4.entry.js +0 -4
- package/dist/ionic/p-0dc33652.entry.js +0 -4
- package/dist/ionic/p-0fa9c382.entry.js +0 -4
- package/dist/ionic/p-10e833ef.entry.js +0 -4
- package/dist/ionic/p-20b1a044.entry.js +0 -4
- package/dist/ionic/p-21eb76d5.entry.js +0 -4
- package/dist/ionic/p-27d30585.entry.js +0 -4
- package/dist/ionic/p-2a05aa64.entry.js +0 -4
- package/dist/ionic/p-2b204c59.entry.js +0 -4
- package/dist/ionic/p-2bb2cb18.entry.js +0 -4
- package/dist/ionic/p-2fa58e80.entry.js +0 -4
- package/dist/ionic/p-3353c229.entry.js +0 -4
- package/dist/ionic/p-34586ead.entry.js +0 -4
- package/dist/ionic/p-37e720da.entry.js +0 -4
- package/dist/ionic/p-390ca786.entry.js +0 -4
- package/dist/ionic/p-3ae5f277.entry.js +0 -4
- package/dist/ionic/p-4654ae1c.entry.js +0 -4
- package/dist/ionic/p-4745f534.entry.js +0 -4
- package/dist/ionic/p-4858af1f.entry.js +0 -4
- package/dist/ionic/p-485fda23.entry.js +0 -4
- package/dist/ionic/p-4ac4f3d6.entry.js +0 -4
- package/dist/ionic/p-4baa5b82.entry.js +0 -4
- package/dist/ionic/p-4e92a11f.entry.js +0 -4
- package/dist/ionic/p-5018dfc8.entry.js +0 -4
- package/dist/ionic/p-50e1194a.entry.js +0 -4
- package/dist/ionic/p-5d1da0a2.entry.js +0 -4
- package/dist/ionic/p-5eb8e86d.entry.js +0 -4
- package/dist/ionic/p-65ebdf1b.entry.js +0 -4
- package/dist/ionic/p-75dc25ba.entry.js +0 -4
- package/dist/ionic/p-7c319341.entry.js +0 -4
- package/dist/ionic/p-829367ed.entry.js +0 -4
- package/dist/ionic/p-84d5ce05.entry.js +0 -4
- package/dist/ionic/p-874b4bd8.entry.js +0 -4
- package/dist/ionic/p-8eb8ee76.entry.js +0 -4
- package/dist/ionic/p-8fce95d5.entry.js +0 -4
- package/dist/ionic/p-9eeaBrnk.js +0 -4
- package/dist/ionic/p-9f1103ce.entry.js +0 -4
- package/dist/ionic/p-9f9db3a2.entry.js +0 -4
- package/dist/ionic/p-BGqMS-oh.js +0 -4
- package/dist/ionic/p-BTEOs1at.js +0 -4
- package/dist/ionic/p-BUFIpxKM.js +0 -4
- package/dist/ionic/p-C0eMdTCW.js +0 -4
- package/dist/ionic/p-C53feagD.js +0 -4
- package/dist/ionic/p-CFlfIb2g.js +0 -4
- package/dist/ionic/p-CKvCXMs9.js +0 -4
- package/dist/ionic/p-Cl0B-RWe.js +0 -4
- package/dist/ionic/p-CtWGkNnJ.js +0 -4
- package/dist/ionic/p-Cx3IXROA.js +0 -4
- package/dist/ionic/p-D-3ycHmd.js +0 -4
- package/dist/ionic/p-D13Eaw-8.js +0 -4
- package/dist/ionic/p-D4uTWt4-.js +0 -4
- package/dist/ionic/p-DSG2s2Eb.js +0 -4
- package/dist/ionic/p-Dfbt-q2k.js +0 -4
- package/dist/ionic/p-DiVJyqlX.js +0 -4
- package/dist/ionic/p-DqN5EA2O.js +0 -4
- package/dist/ionic/p-DzWaWHGc.js +0 -4
- package/dist/ionic/p-Nqf6uvGh.js +0 -4
- package/dist/ionic/p-SNAkTDfm.js +0 -4
- package/dist/ionic/p-VAemlbDS.js +0 -4
- package/dist/ionic/p-a3bdcae6.entry.js +0 -4
- package/dist/ionic/p-ad306193.entry.js +0 -4
- package/dist/ionic/p-b6a7397c.entry.js +0 -4
- package/dist/ionic/p-c0fb8edd.entry.js +0 -4
- package/dist/ionic/p-c38b648e.entry.js +0 -4
- package/dist/ionic/p-c4d8641b.entry.js +0 -4
- package/dist/ionic/p-ca2ab74d.entry.js +0 -4
- package/dist/ionic/p-d889ff6d.entry.js +0 -4
- package/dist/ionic/p-dfa8d673.entry.js +0 -4
- package/dist/ionic/p-e0be05c5.entry.js +0 -4
- package/dist/ionic/p-ef4c3bee.entry.js +0 -4
- package/dist/ionic/p-f386f6ae.entry.js +0 -4
- package/dist/ionic/p-mjKAFv89.js +0 -4
- package/dist/ionic/p-tcQvqkiX.js +0 -5
- package/dist/ionic/p-viFHDgRs.js +0 -4
- package/dist/ionic/p-xWb6fgfq.js +0 -4
- package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +0 -5
- package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +0 -5
- package/dist/types/components/picker-legacy/picker-interface.d.ts +0 -52
- package/dist/types/components/picker-legacy/picker.d.ts +0 -158
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +0 -46
- package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +0 -9
- /package/components/{p-CO7fmmxt.js → p-LpMHEu3v.js} +0 -0
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
-
import { r as registerInstance, c as createEvent, f as printIonWarning, h, d as Host,
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { r as registerInstance, c as createEvent, e as config, g as getElement, f as printIonWarning, h, d as Host, i as forceUpdate } from './index-D1CQtpUN.js';
|
|
5
|
+
import { E as ENABLE_HTML_CONTENT_DEFAULT } from './config-DWCzVL3Y.js';
|
|
6
|
+
import { c as createNotchController } from './notch-controller-DBSn-Uat.js';
|
|
7
|
+
import { c as compareOptions, i as isOptionSelected } from './compare-with-utils-sObYyvOy.js';
|
|
7
8
|
import { c as checkInvalidState } from './validity-DJztqcrH.js';
|
|
8
|
-
import { b as inheritAttributes, a as renderHiddenInput, n as focusVisibleElement } from './helpers-
|
|
9
|
-
import {
|
|
10
|
-
import { i as isRTL } from './dir-
|
|
11
|
-
import {
|
|
9
|
+
import { b as inheritAttributes, a as renderHiddenInput, n as focusVisibleElement } from './helpers-BPcITY5s.js';
|
|
10
|
+
import { p as popoverController, b as actionSheetController, a as alertController, m as modalController, s as safeCall } from './overlays-DUzb9CQf.js';
|
|
11
|
+
import { i as isRTL } from './dir-B-FxiyeI.js';
|
|
12
|
+
import { r as reflectPropertiesToAttributes, a as sanitizeDOMTree } from './index-DDa8edAS.js';
|
|
13
|
+
import { h as hostContext, c as createColorClasses, g as getClassMap } from './theme-byZM6qHV.js';
|
|
12
14
|
import { w as watchForOptions } from './watch-options-Dtdm8lKC.js';
|
|
13
|
-
import { w as chevronExpand,
|
|
14
|
-
import { b as getIonMode } from './ionic-global-
|
|
15
|
+
import { w as chevronExpand, f as caretDownSharp } from './index-BvabGprD.js';
|
|
16
|
+
import { b as getIonMode } from './ionic-global-5bZ91kOL.js';
|
|
17
|
+
import { a as getOverlayLabelPlacement, g as getOverlayLabelJustify } from './overlay-control-label-BSQPZ79H.js';
|
|
18
|
+
import { r as renderOptionLabel } from './select-option-render-DsW8svRr.js';
|
|
15
19
|
import './index-ZjP4CjeZ.js';
|
|
16
|
-
import './hardware-back-button-
|
|
17
|
-
import './framework-delegate-
|
|
18
|
-
import './gesture-controller-
|
|
20
|
+
import './hardware-back-button-DcHMMB9j.js';
|
|
21
|
+
import './framework-delegate-BfAlKlW5.js';
|
|
22
|
+
import './gesture-controller-TXPDHL13.js';
|
|
19
23
|
|
|
20
|
-
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}: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{--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-label-placement-stacked) .select-wrapper-inner,:host(.select-label-placement-floating) .select-wrapper-inner{width:calc(100% - 1.125rem - 4px)}: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}`;
|
|
24
|
+
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}: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-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: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{--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-label-placement-stacked) .select-wrapper-inner,:host(.select-label-placement-floating) .select-wrapper-inner{width:calc(100% - 1.125rem - 4px)}: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}`;
|
|
21
25
|
|
|
22
|
-
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}`;
|
|
26
|
+
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}: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-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: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}`;
|
|
23
27
|
|
|
24
28
|
const Select = class {
|
|
25
29
|
constructor(hostRef) {
|
|
@@ -30,138 +34,226 @@ const Select = class {
|
|
|
30
34
|
this.ionFocus = createEvent(this, "ionFocus", 7);
|
|
31
35
|
this.ionBlur = createEvent(this, "ionBlur", 7);
|
|
32
36
|
this.ionStyle = createEvent(this, "ionStyle", 7);
|
|
33
|
-
this.inputId = `ion-sel-${selectIds++}`;
|
|
34
|
-
this.helperTextId = `${this.inputId}-helper-text`;
|
|
35
|
-
this.errorTextId = `${this.inputId}-error-text`;
|
|
36
|
-
this.inheritedAttributes = {};
|
|
37
|
-
this.isExpanded = false;
|
|
38
|
-
/**
|
|
39
|
-
* The `hasFocus` state ensures the focus class is
|
|
40
|
-
* added regardless of how the element is focused.
|
|
41
|
-
* The `ion-focused` class only applies when focused
|
|
42
|
-
* via tabbing, not by clicking.
|
|
43
|
-
* The `has-focus` logic was added to ensure the class
|
|
44
|
-
* is applied in both cases.
|
|
45
|
-
*/
|
|
46
|
-
this.hasFocus = false;
|
|
47
|
-
/**
|
|
48
|
-
* Track validation state for proper aria-live announcements.
|
|
49
|
-
*/
|
|
50
|
-
this.isInvalid = false;
|
|
51
|
-
/**
|
|
52
|
-
* The text to display on the cancel button.
|
|
53
|
-
*/
|
|
54
|
-
this.cancelText = 'Cancel';
|
|
55
|
-
/**
|
|
56
|
-
* If `true`, the user cannot interact with the select.
|
|
57
|
-
*/
|
|
58
|
-
this.disabled = false;
|
|
59
|
-
/**
|
|
60
|
-
* The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
|
|
61
|
-
*/
|
|
62
|
-
this.interface = 'alert';
|
|
63
|
-
/**
|
|
64
|
-
* Any additional options that the `alert`, `action-sheet` or `popover` interface
|
|
65
|
-
* can take. See the [ion-alert docs](./alert), the
|
|
66
|
-
* [ion-action-sheet docs](./action-sheet), the
|
|
67
|
-
* [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
|
|
68
|
-
* create options for each interface.
|
|
69
|
-
*
|
|
70
|
-
* Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
|
|
71
|
-
*/
|
|
72
|
-
this.interfaceOptions = {};
|
|
73
|
-
/**
|
|
74
|
-
* Where to place the label relative to the select.
|
|
75
|
-
* `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
|
|
76
|
-
* `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
|
|
77
|
-
* `"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.
|
|
78
|
-
* `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
|
|
79
|
-
* `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
|
|
80
|
-
* When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
|
|
81
|
-
*/
|
|
82
|
-
this.labelPlacement = 'start';
|
|
83
|
-
/**
|
|
84
|
-
* If `true`, the select can accept multiple values.
|
|
85
|
-
*/
|
|
86
|
-
this.multiple = false;
|
|
87
|
-
/**
|
|
88
|
-
* The name of the control, which is submitted with the form data.
|
|
89
|
-
*/
|
|
90
|
-
this.name = this.inputId;
|
|
91
|
-
/**
|
|
92
|
-
* The text to display on the ok button.
|
|
93
|
-
*/
|
|
94
|
-
this.okText = 'OK';
|
|
95
|
-
/**
|
|
96
|
-
* If true, screen readers will announce it as a required field. This property
|
|
97
|
-
* works only for accessibility purposes, it will not prevent the form from
|
|
98
|
-
* submitting if the value is invalid.
|
|
99
|
-
*/
|
|
100
|
-
this.required = false;
|
|
101
|
-
this.onClick = (ev) => {
|
|
102
|
-
const target = ev.target;
|
|
103
|
-
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
104
|
-
if (target === this.el || closestSlot === null) {
|
|
105
|
-
this.setFocus();
|
|
106
|
-
this.open(ev);
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
/**
|
|
110
|
-
* Prevent clicks to the start/end slots from opening the select.
|
|
111
|
-
* We ensure the target isn't this element in case the select is slotted
|
|
112
|
-
* in, for example, an item. This would prevent the select from ever
|
|
113
|
-
* being opened since the element itself has slot="start"/"end".
|
|
114
|
-
*
|
|
115
|
-
* Clicking a slotted element also causes a click
|
|
116
|
-
* on the <label> element (since it wraps the slots).
|
|
117
|
-
* Clicking <label> dispatches another click event on
|
|
118
|
-
* the native form control that then bubbles up to this
|
|
119
|
-
* listener. This additional event targets the host
|
|
120
|
-
* element, so the select overlay is opened.
|
|
121
|
-
*
|
|
122
|
-
* When the slotted elements are clicked (and therefore
|
|
123
|
-
* the ancestor <label> element) we want to prevent the label
|
|
124
|
-
* from dispatching another click event.
|
|
125
|
-
*
|
|
126
|
-
* Do not call stopPropagation() because this will cause
|
|
127
|
-
* click handlers on the slotted elements to never fire in React.
|
|
128
|
-
* When developers do onClick in React a native "click" listener
|
|
129
|
-
* is added on the root element, not the slotted element. When that
|
|
130
|
-
* native click listener fires, React then dispatches the synthetic
|
|
131
|
-
* click event on the slotted element. However, if stopPropagation
|
|
132
|
-
* is called then the native click event will never bubble up
|
|
133
|
-
* to the root element.
|
|
134
|
-
*/
|
|
135
|
-
ev.preventDefault();
|
|
136
|
-
}
|
|
137
|
-
};
|
|
138
|
-
this.onFocus = () => {
|
|
139
|
-
this.hasFocus = true;
|
|
140
|
-
this.ionFocus.emit();
|
|
141
|
-
};
|
|
142
|
-
this.onBlur = () => {
|
|
143
|
-
this.hasFocus = false;
|
|
144
|
-
this.ionBlur.emit();
|
|
145
|
-
};
|
|
146
|
-
/**
|
|
147
|
-
* Stops propagation when the label is clicked,
|
|
148
|
-
* otherwise, two clicks will be triggered.
|
|
149
|
-
*/
|
|
150
|
-
this.onLabelClick = (ev) => {
|
|
151
|
-
// Only stop propagation if the click was directly on the label
|
|
152
|
-
// and not on the input or other child elements
|
|
153
|
-
if (ev.target === ev.currentTarget) {
|
|
154
|
-
ev.stopPropagation();
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
37
|
}
|
|
38
|
+
inputId = `ion-sel-${selectIds++}`;
|
|
39
|
+
helperTextId = `${this.inputId}-helper-text`;
|
|
40
|
+
errorTextId = `${this.inputId}-error-text`;
|
|
41
|
+
overlay;
|
|
42
|
+
focusEl;
|
|
43
|
+
mutationO;
|
|
44
|
+
inheritedAttributes = {};
|
|
45
|
+
nativeWrapperEl;
|
|
46
|
+
notchSpacerEl;
|
|
47
|
+
validationObserver;
|
|
48
|
+
notchController;
|
|
49
|
+
customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
|
|
50
|
+
get el() { return getElement(this); }
|
|
51
|
+
isExpanded = false;
|
|
52
|
+
/**
|
|
53
|
+
* The `hasFocus` state ensures the focus class is
|
|
54
|
+
* added regardless of how the element is focused.
|
|
55
|
+
* The `ion-focused` class only applies when focused
|
|
56
|
+
* via tabbing, not by clicking.
|
|
57
|
+
* The `has-focus` logic was added to ensure the class
|
|
58
|
+
* is applied in both cases.
|
|
59
|
+
*/
|
|
60
|
+
hasFocus = false;
|
|
61
|
+
/**
|
|
62
|
+
* Track validation state for proper aria-live announcements.
|
|
63
|
+
*/
|
|
64
|
+
isInvalid = false;
|
|
65
|
+
hintTextId;
|
|
66
|
+
/**
|
|
67
|
+
* The text to display on the cancel button.
|
|
68
|
+
*/
|
|
69
|
+
cancelText = 'Cancel';
|
|
70
|
+
/**
|
|
71
|
+
* The color to use from your application's color palette.
|
|
72
|
+
* Default options are: `"primary"`, `"secondary"`, `"tertiary"`, `"success"`, `"warning"`, `"danger"`, `"light"`, `"medium"`, and `"dark"`.
|
|
73
|
+
* For more information on colors, see [theming](/docs/theming/basics).
|
|
74
|
+
*
|
|
75
|
+
* This property is only available when using the modern select syntax.
|
|
76
|
+
*/
|
|
77
|
+
color;
|
|
78
|
+
/**
|
|
79
|
+
* This property allows developers to specify a custom function or property
|
|
80
|
+
* name for comparing objects when determining the selected option in the
|
|
81
|
+
* ion-select. When not specified, the default behavior will use strict
|
|
82
|
+
* equality (===) for comparison.
|
|
83
|
+
*/
|
|
84
|
+
compareWith;
|
|
85
|
+
/**
|
|
86
|
+
* If `true`, the user cannot interact with the select.
|
|
87
|
+
*/
|
|
88
|
+
disabled = false;
|
|
89
|
+
/**
|
|
90
|
+
* The fill for the item. If `"solid"` the item will have a background. If
|
|
91
|
+
* `"outline"` the item will be transparent with a border. Only available in `md` mode.
|
|
92
|
+
*/
|
|
93
|
+
fill;
|
|
94
|
+
/**
|
|
95
|
+
* Text that is placed under the select and displayed when an error is detected.
|
|
96
|
+
*/
|
|
97
|
+
errorText;
|
|
98
|
+
/**
|
|
99
|
+
* Text that is placed under the select and displayed when no error is detected.
|
|
100
|
+
*/
|
|
101
|
+
helperText;
|
|
102
|
+
/**
|
|
103
|
+
* The interface the select should use: `action-sheet`, `popover`, `alert`, or `modal`.
|
|
104
|
+
*/
|
|
105
|
+
interface = 'alert';
|
|
106
|
+
/**
|
|
107
|
+
* Any additional options that the `alert`, `action-sheet` or `popover` interface
|
|
108
|
+
* can take. See the [ion-alert docs](./alert), the
|
|
109
|
+
* [ion-action-sheet docs](./action-sheet), the
|
|
110
|
+
* [ion-popover docs](./popover), and the [ion-modal docs](./modal) for the
|
|
111
|
+
* create options for each interface.
|
|
112
|
+
*
|
|
113
|
+
* Note: `interfaceOptions` will not override `inputs` or `buttons` with the `alert` interface.
|
|
114
|
+
*/
|
|
115
|
+
interfaceOptions = {};
|
|
116
|
+
/**
|
|
117
|
+
* How to pack the label and select within a line.
|
|
118
|
+
* `justify` does not apply when the label and select
|
|
119
|
+
* are on different lines when `labelPlacement` is set to
|
|
120
|
+
* `"floating"` or `"stacked"`.
|
|
121
|
+
* `"start"`: The label and select will appear on the left in LTR and
|
|
122
|
+
* on the right in RTL.
|
|
123
|
+
* `"end"`: The label and select will appear on the right in LTR and
|
|
124
|
+
* on the left in RTL.
|
|
125
|
+
* `"space-between"`: The label and select will appear on opposite
|
|
126
|
+
* ends of the line with space between the two elements.
|
|
127
|
+
*/
|
|
128
|
+
justify;
|
|
129
|
+
/**
|
|
130
|
+
* The visible label associated with the select.
|
|
131
|
+
*
|
|
132
|
+
* Use this if you need to render a plaintext label.
|
|
133
|
+
*
|
|
134
|
+
* The `label` property will take priority over the `label` slot if both are used.
|
|
135
|
+
*/
|
|
136
|
+
label;
|
|
137
|
+
/**
|
|
138
|
+
* Where to place the label relative to the select.
|
|
139
|
+
* `"start"`: The label will appear to the left of the select in LTR and to the right in RTL.
|
|
140
|
+
* `"end"`: The label will appear to the right of the select in LTR and to the left in RTL.
|
|
141
|
+
* `"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.
|
|
142
|
+
* `"stacked"`: The label will appear smaller and above the select regardless even when the select is blurred or has no value.
|
|
143
|
+
* `"fixed"`: The label has the same behavior as `"start"` except it also has a fixed width. Long text will be truncated with ellipses ("...").
|
|
144
|
+
* When using `"floating"` or `"stacked"` we recommend initializing the select with either a `value` or a `placeholder`.
|
|
145
|
+
*/
|
|
146
|
+
labelPlacement = 'start';
|
|
147
|
+
/**
|
|
148
|
+
* If `true`, the select can accept multiple values.
|
|
149
|
+
*/
|
|
150
|
+
multiple = false;
|
|
151
|
+
/**
|
|
152
|
+
* The name of the control, which is submitted with the form data.
|
|
153
|
+
*/
|
|
154
|
+
name = this.inputId;
|
|
155
|
+
/**
|
|
156
|
+
* The text to display on the ok button.
|
|
157
|
+
*/
|
|
158
|
+
okText = 'OK';
|
|
159
|
+
/**
|
|
160
|
+
* The text to display when the select is empty.
|
|
161
|
+
*/
|
|
162
|
+
placeholder;
|
|
163
|
+
/**
|
|
164
|
+
* The text to display instead of the selected option's value.
|
|
165
|
+
*/
|
|
166
|
+
selectedText;
|
|
167
|
+
/**
|
|
168
|
+
* The toggle icon to use. Defaults to `chevronExpand` for `ios` mode,
|
|
169
|
+
* or `caretDownSharp` for `md` mode.
|
|
170
|
+
*/
|
|
171
|
+
toggleIcon;
|
|
172
|
+
/**
|
|
173
|
+
* The toggle icon to show when the select is open. If defined, the icon
|
|
174
|
+
* rotation behavior in `md` mode will be disabled. If undefined, `toggleIcon`
|
|
175
|
+
* will be used for when the select is both open and closed.
|
|
176
|
+
*/
|
|
177
|
+
expandedIcon;
|
|
178
|
+
/**
|
|
179
|
+
* The shape of the select. If "round" it will have an increased border radius.
|
|
180
|
+
*/
|
|
181
|
+
shape;
|
|
182
|
+
/**
|
|
183
|
+
* The value of the select.
|
|
184
|
+
*/
|
|
185
|
+
value;
|
|
186
|
+
/**
|
|
187
|
+
* If true, screen readers will announce it as a required field. This property
|
|
188
|
+
* works only for accessibility purposes, it will not prevent the form from
|
|
189
|
+
* submitting if the value is invalid.
|
|
190
|
+
*/
|
|
191
|
+
required = false;
|
|
192
|
+
/**
|
|
193
|
+
* Emitted when the value has changed.
|
|
194
|
+
*
|
|
195
|
+
* This event will not emit when programmatically setting the `value` property.
|
|
196
|
+
*/
|
|
197
|
+
ionChange;
|
|
198
|
+
/**
|
|
199
|
+
* Emitted when the selection is cancelled.
|
|
200
|
+
*/
|
|
201
|
+
ionCancel;
|
|
202
|
+
/**
|
|
203
|
+
* Emitted when the overlay is dismissed.
|
|
204
|
+
*/
|
|
205
|
+
ionDismiss;
|
|
206
|
+
/**
|
|
207
|
+
* Emitted when the select has focus.
|
|
208
|
+
*/
|
|
209
|
+
ionFocus;
|
|
210
|
+
/**
|
|
211
|
+
* Emitted when the select loses focus.
|
|
212
|
+
*/
|
|
213
|
+
ionBlur;
|
|
214
|
+
/**
|
|
215
|
+
* Emitted when the styles change.
|
|
216
|
+
* @internal
|
|
217
|
+
*/
|
|
218
|
+
ionStyle;
|
|
158
219
|
styleChanged() {
|
|
159
220
|
this.emitStyle();
|
|
160
221
|
}
|
|
161
222
|
setValue(value) {
|
|
223
|
+
if (this.isValueEqual(this.value, value)) {
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
162
226
|
this.value = value;
|
|
163
227
|
this.ionChange.emit({ value });
|
|
164
228
|
}
|
|
229
|
+
isValueEqual(currentValue, newValue) {
|
|
230
|
+
if (this.multiple) {
|
|
231
|
+
const currentArr = Array.isArray(currentValue) ? currentValue : [];
|
|
232
|
+
const newArr = Array.isArray(newValue) ? newValue : [];
|
|
233
|
+
if (currentArr.length !== newArr.length) {
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
// Multiset compare: each new value must match a distinct current value.
|
|
237
|
+
// A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
|
|
238
|
+
// ['a','b'] when both 'a' and 'b' map to options whose values overlap.
|
|
239
|
+
const remaining = currentArr.slice();
|
|
240
|
+
return newArr.every((val) => {
|
|
241
|
+
const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
|
|
242
|
+
if (idx === -1) {
|
|
243
|
+
return false;
|
|
244
|
+
}
|
|
245
|
+
remaining.splice(idx, 1);
|
|
246
|
+
return true;
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (currentValue == null && newValue == null) {
|
|
250
|
+
return true;
|
|
251
|
+
}
|
|
252
|
+
if (currentValue == null || newValue == null) {
|
|
253
|
+
return false;
|
|
254
|
+
}
|
|
255
|
+
return compareOptions(currentValue, newValue, this.compareWith);
|
|
256
|
+
}
|
|
165
257
|
async connectedCallback() {
|
|
166
258
|
const { el } = this;
|
|
167
259
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
@@ -396,10 +488,11 @@ const Select = class {
|
|
|
396
488
|
.join(' ');
|
|
397
489
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
398
490
|
const isSelected = isOptionSelected(selectValue, value, this.compareWith);
|
|
491
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
399
492
|
return {
|
|
400
|
-
|
|
401
|
-
text: option.textContent,
|
|
493
|
+
text: content ?? '',
|
|
402
494
|
cssClass: optClass,
|
|
495
|
+
disabled: option.disabled,
|
|
403
496
|
handler: () => {
|
|
404
497
|
this.setValue(value);
|
|
405
498
|
},
|
|
@@ -407,6 +500,9 @@ const Select = class {
|
|
|
407
500
|
'aria-checked': isSelected ? 'true' : 'false',
|
|
408
501
|
role: 'radio',
|
|
409
502
|
},
|
|
503
|
+
startContent,
|
|
504
|
+
endContent,
|
|
505
|
+
description: option.description,
|
|
410
506
|
};
|
|
411
507
|
});
|
|
412
508
|
// Add "cancel" button
|
|
@@ -427,13 +523,19 @@ const Select = class {
|
|
|
427
523
|
.filter((cls) => cls !== 'hydrated')
|
|
428
524
|
.join(' ');
|
|
429
525
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
526
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
430
527
|
return {
|
|
431
528
|
type: inputType,
|
|
432
529
|
cssClass: optClass,
|
|
433
|
-
label:
|
|
530
|
+
label: content ?? '',
|
|
434
531
|
value,
|
|
435
532
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
436
533
|
disabled: option.disabled,
|
|
534
|
+
startContent,
|
|
535
|
+
endContent,
|
|
536
|
+
description: option.description,
|
|
537
|
+
labelPlacement: option.labelPlacement,
|
|
538
|
+
justify: option.justify,
|
|
437
539
|
};
|
|
438
540
|
});
|
|
439
541
|
return alertInputs;
|
|
@@ -446,8 +548,9 @@ const Select = class {
|
|
|
446
548
|
.filter((cls) => cls !== 'hydrated')
|
|
447
549
|
.join(' ');
|
|
448
550
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
551
|
+
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
449
552
|
return {
|
|
450
|
-
text:
|
|
553
|
+
text: content ?? '',
|
|
451
554
|
cssClass: optClass,
|
|
452
555
|
value,
|
|
453
556
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
@@ -458,6 +561,11 @@ const Select = class {
|
|
|
458
561
|
this.close();
|
|
459
562
|
}
|
|
460
563
|
},
|
|
564
|
+
startContent,
|
|
565
|
+
endContent,
|
|
566
|
+
description: option.description,
|
|
567
|
+
labelPlacement: option.labelPlacement,
|
|
568
|
+
justify: option.justify,
|
|
461
569
|
};
|
|
462
570
|
});
|
|
463
571
|
return popoverOptions;
|
|
@@ -486,33 +594,60 @@ const Select = class {
|
|
|
486
594
|
*/
|
|
487
595
|
}
|
|
488
596
|
else {
|
|
489
|
-
event =
|
|
597
|
+
event = {
|
|
598
|
+
...ev,
|
|
599
|
+
detail: {
|
|
490
600
|
ionShadowTarget: this.nativeWrapperEl,
|
|
491
|
-
}
|
|
601
|
+
},
|
|
602
|
+
};
|
|
492
603
|
}
|
|
493
|
-
const
|
|
494
|
-
|
|
495
|
-
|
|
604
|
+
const options = this.createOverlaySelectOptions(this.childOpts, value);
|
|
605
|
+
const hasRichContent = options.some((opt) => Boolean(opt.startContent) || Boolean(opt.endContent) || Boolean(opt.description));
|
|
606
|
+
const popoverOpts = {
|
|
607
|
+
mode,
|
|
608
|
+
event,
|
|
609
|
+
alignment: 'center',
|
|
610
|
+
size,
|
|
611
|
+
showBackdrop,
|
|
612
|
+
...interfaceOptions,
|
|
613
|
+
component: 'ion-select-popover',
|
|
614
|
+
cssClass: [
|
|
615
|
+
'select-popover',
|
|
616
|
+
hasRichContent ? 'select-popover-rich-content' : undefined,
|
|
617
|
+
interfaceOptions.cssClass,
|
|
618
|
+
],
|
|
619
|
+
componentProps: {
|
|
496
620
|
header: interfaceOptions.header,
|
|
497
621
|
subHeader: interfaceOptions.subHeader,
|
|
498
622
|
message: interfaceOptions.message,
|
|
499
623
|
multiple,
|
|
500
624
|
value,
|
|
501
|
-
options
|
|
502
|
-
}
|
|
625
|
+
options,
|
|
626
|
+
},
|
|
627
|
+
};
|
|
503
628
|
return popoverController.create(popoverOpts);
|
|
504
629
|
}
|
|
505
630
|
async openActionSheet() {
|
|
506
631
|
const mode = getIonMode(this);
|
|
507
632
|
const interfaceOptions = this.interfaceOptions;
|
|
508
|
-
const actionSheetOpts =
|
|
633
|
+
const actionSheetOpts = {
|
|
634
|
+
mode,
|
|
635
|
+
...interfaceOptions,
|
|
636
|
+
buttons: this.createActionSheetButtons(this.childOpts, this.value),
|
|
637
|
+
cssClass: ['select-action-sheet', interfaceOptions.cssClass],
|
|
638
|
+
};
|
|
509
639
|
return actionSheetController.create(actionSheetOpts);
|
|
510
640
|
}
|
|
511
641
|
async openAlert() {
|
|
512
642
|
const interfaceOptions = this.interfaceOptions;
|
|
513
643
|
const inputType = this.multiple ? 'checkbox' : 'radio';
|
|
514
644
|
const mode = getIonMode(this);
|
|
515
|
-
const alertOpts =
|
|
645
|
+
const alertOpts = {
|
|
646
|
+
mode,
|
|
647
|
+
...interfaceOptions,
|
|
648
|
+
header: interfaceOptions.header ? interfaceOptions.header : this.labelText,
|
|
649
|
+
inputs: this.createAlertInputs(this.childOpts, inputType, this.value),
|
|
650
|
+
buttons: [
|
|
516
651
|
{
|
|
517
652
|
text: this.cancelText,
|
|
518
653
|
role: 'cancel',
|
|
@@ -526,23 +661,31 @@ const Select = class {
|
|
|
526
661
|
this.setValue(selectedValues);
|
|
527
662
|
},
|
|
528
663
|
},
|
|
529
|
-
],
|
|
664
|
+
],
|
|
665
|
+
cssClass: [
|
|
530
666
|
'select-alert',
|
|
531
667
|
interfaceOptions.cssClass,
|
|
532
668
|
this.multiple ? 'multiple-select-alert' : 'single-select-alert',
|
|
533
|
-
]
|
|
669
|
+
],
|
|
670
|
+
};
|
|
534
671
|
return alertController.create(alertOpts);
|
|
535
672
|
}
|
|
536
673
|
openModal() {
|
|
537
674
|
const { multiple, value, interfaceOptions } = this;
|
|
538
675
|
const mode = getIonMode(this);
|
|
539
|
-
const modalOpts =
|
|
676
|
+
const modalOpts = {
|
|
677
|
+
...interfaceOptions,
|
|
678
|
+
mode,
|
|
679
|
+
cssClass: ['select-modal', interfaceOptions.cssClass],
|
|
680
|
+
component: 'ion-select-modal',
|
|
681
|
+
componentProps: {
|
|
540
682
|
header: interfaceOptions.header,
|
|
541
683
|
cancelText: this.cancelText,
|
|
542
684
|
multiple,
|
|
543
685
|
value,
|
|
544
686
|
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
545
|
-
}
|
|
687
|
+
},
|
|
688
|
+
};
|
|
546
689
|
return modalController.create(modalOpts);
|
|
547
690
|
}
|
|
548
691
|
/**
|
|
@@ -579,12 +722,18 @@ const Select = class {
|
|
|
579
722
|
}
|
|
580
723
|
return;
|
|
581
724
|
}
|
|
582
|
-
|
|
725
|
+
/**
|
|
726
|
+
* Returns the text to display in the select based on the selected value.
|
|
727
|
+
*
|
|
728
|
+
* @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`.
|
|
729
|
+
* @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
|
|
730
|
+
*/
|
|
731
|
+
getText(useHTML = false) {
|
|
583
732
|
const selectedText = this.selectedText;
|
|
584
733
|
if (selectedText != null && selectedText !== '') {
|
|
585
734
|
return selectedText;
|
|
586
735
|
}
|
|
587
|
-
return generateText(this.childOpts, this.value, this.compareWith);
|
|
736
|
+
return generateText(this.childOpts, this.value, this.compareWith, useHTML);
|
|
588
737
|
}
|
|
589
738
|
setFocus() {
|
|
590
739
|
if (this.focusEl) {
|
|
@@ -598,6 +747,51 @@ const Select = class {
|
|
|
598
747
|
};
|
|
599
748
|
this.ionStyle.emit(style);
|
|
600
749
|
}
|
|
750
|
+
onClick = (ev) => {
|
|
751
|
+
const target = ev.target;
|
|
752
|
+
const closestSlot = target.closest('[slot="start"], [slot="end"]');
|
|
753
|
+
if (target === this.el || closestSlot === null) {
|
|
754
|
+
this.setFocus();
|
|
755
|
+
this.open(ev);
|
|
756
|
+
}
|
|
757
|
+
else {
|
|
758
|
+
/**
|
|
759
|
+
* Prevent clicks to the start/end slots from opening the select.
|
|
760
|
+
* We ensure the target isn't this element in case the select is slotted
|
|
761
|
+
* in, for example, an item. This would prevent the select from ever
|
|
762
|
+
* being opened since the element itself has slot="start"/"end".
|
|
763
|
+
*
|
|
764
|
+
* Clicking a slotted element also causes a click
|
|
765
|
+
* on the <label> element (since it wraps the slots).
|
|
766
|
+
* Clicking <label> dispatches another click event on
|
|
767
|
+
* the native form control that then bubbles up to this
|
|
768
|
+
* listener. This additional event targets the host
|
|
769
|
+
* element, so the select overlay is opened.
|
|
770
|
+
*
|
|
771
|
+
* When the slotted elements are clicked (and therefore
|
|
772
|
+
* the ancestor <label> element) we want to prevent the label
|
|
773
|
+
* from dispatching another click event.
|
|
774
|
+
*
|
|
775
|
+
* Do not call stopPropagation() because this will cause
|
|
776
|
+
* click handlers on the slotted elements to never fire in React.
|
|
777
|
+
* When developers do onClick in React a native "click" listener
|
|
778
|
+
* is added on the root element, not the slotted element. When that
|
|
779
|
+
* native click listener fires, React then dispatches the synthetic
|
|
780
|
+
* click event on the slotted element. However, if stopPropagation
|
|
781
|
+
* is called then the native click event will never bubble up
|
|
782
|
+
* to the root element.
|
|
783
|
+
*/
|
|
784
|
+
ev.preventDefault();
|
|
785
|
+
}
|
|
786
|
+
};
|
|
787
|
+
onFocus = () => {
|
|
788
|
+
this.hasFocus = true;
|
|
789
|
+
this.ionFocus.emit();
|
|
790
|
+
};
|
|
791
|
+
onBlur = () => {
|
|
792
|
+
this.hasFocus = false;
|
|
793
|
+
this.ionBlur.emit();
|
|
794
|
+
};
|
|
601
795
|
renderLabel() {
|
|
602
796
|
const { label } = this;
|
|
603
797
|
return (h("div", { class: {
|
|
@@ -606,8 +800,7 @@ const Select = class {
|
|
|
606
800
|
}, part: "label" }, label === undefined ? h("slot", { name: "label" }) : h("div", { class: "label-text" }, label)));
|
|
607
801
|
}
|
|
608
802
|
componentDidRender() {
|
|
609
|
-
|
|
610
|
-
(_a = this.notchController) === null || _a === void 0 ? void 0 : _a.calculateNotchWidth();
|
|
803
|
+
this.notchController?.calculateNotchWidth();
|
|
611
804
|
}
|
|
612
805
|
/**
|
|
613
806
|
* Gets any content passed into the `label` slot,
|
|
@@ -625,6 +818,17 @@ const Select = class {
|
|
|
625
818
|
get hasLabel() {
|
|
626
819
|
return this.label !== undefined || this.labelSlot !== null;
|
|
627
820
|
}
|
|
821
|
+
/**
|
|
822
|
+
* Stops propagation when the label is clicked,
|
|
823
|
+
* otherwise, two clicks will be triggered.
|
|
824
|
+
*/
|
|
825
|
+
onLabelClick = (ev) => {
|
|
826
|
+
// Only stop propagation if the click was directly on the label
|
|
827
|
+
// and not on the input or other child elements
|
|
828
|
+
if (ev.target === ev.currentTarget) {
|
|
829
|
+
ev.stopPropagation();
|
|
830
|
+
}
|
|
831
|
+
};
|
|
628
832
|
/**
|
|
629
833
|
* Renders the border container
|
|
630
834
|
* when fill="outline".
|
|
@@ -654,6 +858,46 @@ const Select = class {
|
|
|
654
858
|
*/
|
|
655
859
|
return this.renderLabel();
|
|
656
860
|
}
|
|
861
|
+
/**
|
|
862
|
+
* Wraps text nodes in the select text with span elements
|
|
863
|
+
* so spacing can be added between elements without
|
|
864
|
+
* changing the display to prevent losing the ellipses
|
|
865
|
+
* behavior.
|
|
866
|
+
*
|
|
867
|
+
* Only wraps when the string contains HTML elements
|
|
868
|
+
* alongside text.
|
|
869
|
+
*/
|
|
870
|
+
wrapSelectTextNodes(html) {
|
|
871
|
+
const temp = document.createElement('div');
|
|
872
|
+
temp.innerHTML = html;
|
|
873
|
+
const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
|
|
874
|
+
// Return the plain text
|
|
875
|
+
if (!hasElements) {
|
|
876
|
+
return html;
|
|
877
|
+
}
|
|
878
|
+
Array.from(temp.childNodes).forEach((node) => {
|
|
879
|
+
if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim()) {
|
|
880
|
+
const text = node.textContent;
|
|
881
|
+
/**
|
|
882
|
+
* Split comma separator from the text content
|
|
883
|
+
* e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
|
|
884
|
+
*/
|
|
885
|
+
const commaMatch = text.match(/^(,\s*)(.*)/);
|
|
886
|
+
if (commaMatch) {
|
|
887
|
+
const commaNode = document.createTextNode(commaMatch[1]);
|
|
888
|
+
const wrapper = document.createElement('span');
|
|
889
|
+
wrapper.textContent = commaMatch[2];
|
|
890
|
+
node.parentNode?.replaceChild(wrapper, node);
|
|
891
|
+
wrapper.parentNode?.insertBefore(commaNode, wrapper);
|
|
892
|
+
return;
|
|
893
|
+
}
|
|
894
|
+
const wrapper = document.createElement('span');
|
|
895
|
+
node.parentNode?.replaceChild(wrapper, node);
|
|
896
|
+
wrapper.appendChild(node);
|
|
897
|
+
}
|
|
898
|
+
});
|
|
899
|
+
return temp.innerHTML;
|
|
900
|
+
}
|
|
657
901
|
/**
|
|
658
902
|
* Renders either the placeholder
|
|
659
903
|
* or the selected values based on
|
|
@@ -661,7 +905,7 @@ const Select = class {
|
|
|
661
905
|
*/
|
|
662
906
|
renderSelectText() {
|
|
663
907
|
const { placeholder } = this;
|
|
664
|
-
const displayValue = this.getText();
|
|
908
|
+
const displayValue = this.getText(true);
|
|
665
909
|
let addPlaceholderClass = false;
|
|
666
910
|
let selectText = displayValue;
|
|
667
911
|
if (selectText === '' && placeholder !== undefined) {
|
|
@@ -673,6 +917,10 @@ const Select = class {
|
|
|
673
917
|
'select-placeholder': addPlaceholderClass,
|
|
674
918
|
};
|
|
675
919
|
const textPart = addPlaceholderClass ? 'placeholder' : 'text';
|
|
920
|
+
if (this.customHTMLEnabled) {
|
|
921
|
+
const wrapped = this.wrapSelectTextNodes(selectText);
|
|
922
|
+
return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
|
|
923
|
+
}
|
|
676
924
|
return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
|
|
677
925
|
}
|
|
678
926
|
/**
|
|
@@ -688,16 +936,16 @@ const Select = class {
|
|
|
688
936
|
}
|
|
689
937
|
else {
|
|
690
938
|
const defaultIcon = mode === 'ios' ? chevronExpand : caretDownSharp;
|
|
691
|
-
icon = toggleIcon
|
|
939
|
+
icon = toggleIcon ?? defaultIcon;
|
|
692
940
|
}
|
|
693
941
|
return h("ion-icon", { class: "select-icon", part: "icon", "aria-hidden": "true", icon: icon });
|
|
694
942
|
}
|
|
695
943
|
get ariaLabel() {
|
|
696
|
-
var _a;
|
|
697
944
|
const { placeholder, inheritedAttributes } = this;
|
|
945
|
+
// Get the plain text from the selected text
|
|
698
946
|
const displayValue = this.getText();
|
|
699
947
|
// The aria label should be preferred over visible text if both are specified
|
|
700
|
-
const definedLabel =
|
|
948
|
+
const definedLabel = inheritedAttributes['aria-label'] ?? this.labelText;
|
|
701
949
|
/**
|
|
702
950
|
* If developer has specified a placeholder
|
|
703
951
|
* and there is nothing selected, the selectText
|
|
@@ -789,7 +1037,7 @@ const Select = class {
|
|
|
789
1037
|
*/
|
|
790
1038
|
const labelShouldFloat = labelPlacement === 'stacked' ||
|
|
791
1039
|
(labelPlacement === 'floating' && (hasValue || hasFocus || isExpanded || hasStartEndSlots));
|
|
792
|
-
return (h(Host, { key: '
|
|
1040
|
+
return (h(Host, { key: 'e693afee7852c89be122b785230ed8fc9be5ba61', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
793
1041
|
[mode]: true,
|
|
794
1042
|
'in-item': inItem,
|
|
795
1043
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -807,9 +1055,8 @@ const Select = class {
|
|
|
807
1055
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
808
1056
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
809
1057
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
810
|
-
}) }, h("label", { key: '
|
|
1058
|
+
}) }, h("label", { key: 'd79647bd83cab506f01a4588f631b3982fa1c011', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, this.renderLabelContainer(), h("div", { key: 'fa8d78b9ea041dc9e897643f22f33f38e645ce69', class: "select-wrapper-inner", part: "inner" }, h("slot", { key: '45666226a6898a538849bd3d3b89510bf689656f', name: "start" }), h("div", { key: '59f1f08109c4cda699cb2a9f2a6bce00a7fc4301', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: '79b18fd4ca2af9528ff89c609ea20b3e727701e1', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: '0149f4ddb4ca1d1d2e2ca91b6cbec721d5c8aa9b', class: "select-highlight" })), this.renderBottomContent()));
|
|
811
1059
|
}
|
|
812
|
-
get el() { return getElement(this); }
|
|
813
1060
|
static get watchers() { return {
|
|
814
1061
|
"disabled": [{
|
|
815
1062
|
"styleChanged": 0
|
|
@@ -838,25 +1085,219 @@ const parseValue = (value) => {
|
|
|
838
1085
|
}
|
|
839
1086
|
return value.toString();
|
|
840
1087
|
};
|
|
841
|
-
const generateText = (opts, value, compareWith) => {
|
|
1088
|
+
const generateText = (opts, value, compareWith, useHTML = false) => {
|
|
842
1089
|
if (value === undefined) {
|
|
843
1090
|
return '';
|
|
844
1091
|
}
|
|
845
1092
|
if (Array.isArray(value)) {
|
|
846
1093
|
return value
|
|
847
|
-
.map((v) => textForValue(opts, v, compareWith))
|
|
1094
|
+
.map((v) => textForValue(opts, v, compareWith, useHTML))
|
|
848
1095
|
.filter((opt) => opt !== null)
|
|
849
1096
|
.join(', ');
|
|
850
1097
|
}
|
|
851
1098
|
else {
|
|
852
|
-
return textForValue(opts, value, compareWith) || '';
|
|
1099
|
+
return textForValue(opts, value, compareWith, useHTML) || '';
|
|
853
1100
|
}
|
|
854
1101
|
};
|
|
855
|
-
|
|
1102
|
+
/**
|
|
1103
|
+
* Returns the display text for a given value from the list of options.
|
|
1104
|
+
* When `useHTML` is true, returns sanitized HTML for the select text.
|
|
1105
|
+
* When `useHTML` is false, returns plain text for aria-label and other
|
|
1106
|
+
* text-only contexts.
|
|
1107
|
+
*
|
|
1108
|
+
* @param opts - The list of ion-select-option elements.
|
|
1109
|
+
* @param value - The value to find the matching option for.
|
|
1110
|
+
* @param compareWith - Custom comparison function or property name.
|
|
1111
|
+
* @param useHTML - If true, returns HTML string. If false, returns plain text.
|
|
1112
|
+
*/
|
|
1113
|
+
const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
856
1114
|
const selectOpt = opts.find((opt) => {
|
|
857
1115
|
return compareOptions(value, getOptionValue(opt), compareWith);
|
|
858
1116
|
});
|
|
859
|
-
|
|
1117
|
+
const customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
|
|
1118
|
+
if (!selectOpt) {
|
|
1119
|
+
return null;
|
|
1120
|
+
}
|
|
1121
|
+
// Return sanitized HTML for the select text
|
|
1122
|
+
if (customHTMLEnabled && useHTML) {
|
|
1123
|
+
return getOptionContent(selectOpt, undefined, true);
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* When custom HTML is enabled, extract only the default slot content.
|
|
1127
|
+
* This ensures aria-label and other text-only contexts read only
|
|
1128
|
+
* the relevant option text.
|
|
1129
|
+
*/
|
|
1130
|
+
if (customHTMLEnabled) {
|
|
1131
|
+
const content = getOptionContent(selectOpt);
|
|
1132
|
+
if (typeof content === 'string') {
|
|
1133
|
+
return content;
|
|
1134
|
+
}
|
|
1135
|
+
/**
|
|
1136
|
+
* Elements were found in the default slot, extract and concatenate
|
|
1137
|
+
* their text content while trimming whitespace.
|
|
1138
|
+
*/
|
|
1139
|
+
if (content) {
|
|
1140
|
+
const texts = Array.from(content.childNodes)
|
|
1141
|
+
.map((n) => n.textContent?.trim())
|
|
1142
|
+
.filter((t) => t);
|
|
1143
|
+
return texts.join(' ') || null;
|
|
1144
|
+
}
|
|
1145
|
+
// Empty option
|
|
1146
|
+
return null;
|
|
1147
|
+
}
|
|
1148
|
+
return getDefaultSlotPlainText(selectOpt);
|
|
1149
|
+
};
|
|
1150
|
+
/**
|
|
1151
|
+
* Trims whitespace from all text nodes within a DOM tree.
|
|
1152
|
+
* This prevents invisible layout shifts and unwanted gaps between
|
|
1153
|
+
* elements when HTML content is injected via innerHTML or cloneNode,
|
|
1154
|
+
* as browsers preserve whitespace (tabs, newlines, spaces) from
|
|
1155
|
+
* the original source markup.
|
|
1156
|
+
*
|
|
1157
|
+
* @param node The root node to start trimming text nodes from.
|
|
1158
|
+
*/
|
|
1159
|
+
const trimTextNodes = (node) => {
|
|
1160
|
+
node.childNodes.forEach((child) => {
|
|
1161
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
1162
|
+
child.textContent = child.textContent?.trim() || '';
|
|
1163
|
+
}
|
|
1164
|
+
else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
1165
|
+
trimTextNodes(child);
|
|
1166
|
+
}
|
|
1167
|
+
});
|
|
1168
|
+
};
|
|
1169
|
+
/**
|
|
1170
|
+
* Extracts and clones content from an `ion-select-option` element
|
|
1171
|
+
* for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
|
|
1172
|
+
*
|
|
1173
|
+
* @param option - The `ion-select-option` element to extract content from.
|
|
1174
|
+
* @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
|
|
1175
|
+
* @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.
|
|
1176
|
+
* @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
|
|
1177
|
+
* div element containing cloned child nodes. Returns `null` if no matching
|
|
1178
|
+
* content is found.
|
|
1179
|
+
*/
|
|
1180
|
+
const getOptionContent = (option, slotName, useHTML = false) => {
|
|
1181
|
+
let nodes;
|
|
1182
|
+
if (slotName) {
|
|
1183
|
+
// Named slot: get elements with matching slot attribute
|
|
1184
|
+
nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
|
|
1185
|
+
}
|
|
1186
|
+
else {
|
|
1187
|
+
// Default slot: get nodes without a slot attribute
|
|
1188
|
+
const defaultSlot = getOptionDefaultSlot(option) || [];
|
|
1189
|
+
nodes = defaultSlot.filter((node) => {
|
|
1190
|
+
/**
|
|
1191
|
+
* Exclude whitespace-only text nodes (newline noise between
|
|
1192
|
+
* markup elements). Element nodes are always kept, even when
|
|
1193
|
+
* their textContent is empty (e.g. <svg>, <img>).
|
|
1194
|
+
*/
|
|
1195
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
1196
|
+
return node.textContent?.trim().length !== 0;
|
|
1197
|
+
}
|
|
1198
|
+
return true;
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1201
|
+
if (nodes.length === 0) {
|
|
1202
|
+
return null;
|
|
1203
|
+
}
|
|
1204
|
+
// Return plain text if no elements are found
|
|
1205
|
+
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1206
|
+
return nodes.map((n) => n.textContent?.trim()).join(' ') || null;
|
|
1207
|
+
}
|
|
1208
|
+
/**
|
|
1209
|
+
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
1210
|
+
* onto attributes before cloning. Frameworks like Vue set these as
|
|
1211
|
+
* DOM properties, which `cloneNode` doesn't copy, so without this
|
|
1212
|
+
* step the cloned overlay copy renders without the prop's value.
|
|
1213
|
+
*/
|
|
1214
|
+
nodes.forEach((n) => {
|
|
1215
|
+
if (n.nodeType === Node.ELEMENT_NODE) {
|
|
1216
|
+
reflectPropertiesToAttributes(n);
|
|
1217
|
+
}
|
|
1218
|
+
});
|
|
1219
|
+
// Clone each node into a temporary container
|
|
1220
|
+
const container = document.createElement('div');
|
|
1221
|
+
nodes.forEach((n) => {
|
|
1222
|
+
const clone = n.cloneNode(true);
|
|
1223
|
+
if (clone.nodeType === Node.TEXT_NODE) {
|
|
1224
|
+
clone.textContent = clone.textContent?.trim() || '';
|
|
1225
|
+
}
|
|
1226
|
+
else {
|
|
1227
|
+
trimTextNodes(clone);
|
|
1228
|
+
}
|
|
1229
|
+
container.appendChild(clone);
|
|
1230
|
+
});
|
|
1231
|
+
/**
|
|
1232
|
+
* Sanitize the cloned DOM in place. Trusted attributes (size, color,
|
|
1233
|
+
* shape, etc.) are preserved; event handlers, javascript: URLs, and
|
|
1234
|
+
* blocked tags are stripped.
|
|
1235
|
+
*/
|
|
1236
|
+
sanitizeDOMTree(container);
|
|
1237
|
+
if (useHTML) {
|
|
1238
|
+
return container.innerHTML.trim() || null;
|
|
1239
|
+
}
|
|
1240
|
+
return container;
|
|
1241
|
+
};
|
|
1242
|
+
/**
|
|
1243
|
+
* Returns the child nodes that belong to the default slot of an
|
|
1244
|
+
* option element, excluding any nodes that are assigned to named
|
|
1245
|
+
* slots.
|
|
1246
|
+
*
|
|
1247
|
+
* @param option - The `ion-select-option` element to extract default-slot nodes from.
|
|
1248
|
+
* @returns An array of default slot nodes, or `null` if none are found.
|
|
1249
|
+
*/
|
|
1250
|
+
const getOptionDefaultSlot = (option) => {
|
|
1251
|
+
const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
|
|
1252
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1253
|
+
return !node.hasAttribute('slot');
|
|
1254
|
+
}
|
|
1255
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
1256
|
+
});
|
|
1257
|
+
if (defaultSlotNodes.length === 0) {
|
|
1258
|
+
return null;
|
|
1259
|
+
}
|
|
1260
|
+
return defaultSlotNodes;
|
|
1261
|
+
};
|
|
1262
|
+
/**
|
|
1263
|
+
* Extracts plain text from only the default slot of an option,
|
|
1264
|
+
* excluding content assigned to named slots (start/end).
|
|
1265
|
+
*/
|
|
1266
|
+
const getDefaultSlotPlainText = (option) => {
|
|
1267
|
+
const texts = Array.from(option.childNodes)
|
|
1268
|
+
.filter((node) => {
|
|
1269
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1270
|
+
return !node.hasAttribute('slot');
|
|
1271
|
+
}
|
|
1272
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
1273
|
+
})
|
|
1274
|
+
.filter((node) => node.nodeType === Node.TEXT_NODE)
|
|
1275
|
+
.map((n) => n.textContent?.trim())
|
|
1276
|
+
.filter((t) => t);
|
|
1277
|
+
return texts.join(' ');
|
|
1278
|
+
};
|
|
1279
|
+
/**
|
|
1280
|
+
* Extracts the rich content from an `ion-select-option`.
|
|
1281
|
+
* When `customHTMLEnabled` is `false`, only the plain text from the
|
|
1282
|
+
* default slot is read and the start and end slots are skipped.
|
|
1283
|
+
*
|
|
1284
|
+
* @param option - The `ion-select-option` element to extract content from.
|
|
1285
|
+
* @param customHTMLEnabled - Whether custom HTML rendering is enabled
|
|
1286
|
+
* via the `innerHTMLTemplatesEnabled` config.
|
|
1287
|
+
*/
|
|
1288
|
+
const extractOptionContent = (option, customHTMLEnabled) => {
|
|
1289
|
+
if (!customHTMLEnabled) {
|
|
1290
|
+
return {
|
|
1291
|
+
content: getDefaultSlotPlainText(option),
|
|
1292
|
+
startContent: undefined,
|
|
1293
|
+
endContent: undefined,
|
|
1294
|
+
};
|
|
1295
|
+
}
|
|
1296
|
+
return {
|
|
1297
|
+
content: getOptionContent(option),
|
|
1298
|
+
startContent: getOptionContent(option, 'start') ?? undefined,
|
|
1299
|
+
endContent: getOptionContent(option, 'end') ?? undefined,
|
|
1300
|
+
};
|
|
860
1301
|
};
|
|
861
1302
|
let selectIds = 0;
|
|
862
1303
|
const OPTION_CLASS = 'select-interface-option';
|
|
@@ -870,36 +1311,91 @@ const selectOptionCss = () => `:host{display:none}`;
|
|
|
870
1311
|
const SelectOption = class {
|
|
871
1312
|
constructor(hostRef) {
|
|
872
1313
|
registerInstance(this, hostRef);
|
|
873
|
-
this.inputId = `ion-selopt-${selectOptionIds++}`;
|
|
874
|
-
/**
|
|
875
|
-
* 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.
|
|
876
|
-
*/
|
|
877
|
-
this.disabled = false;
|
|
878
1314
|
}
|
|
1315
|
+
inputId = `ion-selopt-${selectOptionIds++}`;
|
|
1316
|
+
get el() { return getElement(this); }
|
|
1317
|
+
/**
|
|
1318
|
+
* If `true`, the user cannot interact with the select option.
|
|
1319
|
+
*/
|
|
1320
|
+
disabled = false;
|
|
1321
|
+
/**
|
|
1322
|
+
* The text value of the option.
|
|
1323
|
+
*/
|
|
1324
|
+
value;
|
|
1325
|
+
/**
|
|
1326
|
+
* Text that is placed underneath the option text to provide additional details about the option.
|
|
1327
|
+
*/
|
|
1328
|
+
description;
|
|
1329
|
+
/**
|
|
1330
|
+
* Where the label is placed relative to the option's selection control
|
|
1331
|
+
* (radio circle or checkbox box) when the option is rendered in an
|
|
1332
|
+
* `alert`, `popover`, or `modal` interface.
|
|
1333
|
+
* `"start"`: The label will appear to the left of the radio in LTR and to the right in RTL.
|
|
1334
|
+
* `"end"`: The label will appear to the right of the radio in LTR and to the left in RTL.
|
|
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
|
+
labelPlacement;
|
|
1343
|
+
/**
|
|
1344
|
+
* How to pack the label and the option's selection control within a line.
|
|
1345
|
+
* `"start"`: The label and radio will appear on the left in LTR and
|
|
1346
|
+
* on the right in RTL.
|
|
1347
|
+
* `"end"`: The label and radio will appear on the right in LTR and
|
|
1348
|
+
* on the left in RTL.
|
|
1349
|
+
* `"space-between"`: The label and radio will appear on opposite
|
|
1350
|
+
* ends of the line with space between the two elements.
|
|
1351
|
+
*
|
|
1352
|
+
* Applies to the `alert`, `popover`, and `modal` interfaces, but has no
|
|
1353
|
+
* visible effect on radio options in `popover` or `modal` on `md` (the radio control is hidden there).
|
|
1354
|
+
*
|
|
1355
|
+
* When unset, the interface picks a default based on mode and control
|
|
1356
|
+
* type.
|
|
1357
|
+
*/
|
|
1358
|
+
justify;
|
|
879
1359
|
render() {
|
|
880
|
-
return h(Host, { key: '
|
|
1360
|
+
return h(Host, { key: '8b8bef0f5a55f18048708c34d3ea3ff0ff2f1d47', role: "option", id: this.inputId, class: getIonMode(this) });
|
|
881
1361
|
}
|
|
882
|
-
get el() { return getElement(this); }
|
|
883
1362
|
};
|
|
884
1363
|
let selectOptionIds = 0;
|
|
885
1364
|
SelectOption.style = selectOptionCss();
|
|
886
1365
|
|
|
887
|
-
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}`;
|
|
1366
|
+
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}`;
|
|
888
1367
|
|
|
889
|
-
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)}`;
|
|
1368
|
+
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)}`;
|
|
890
1369
|
|
|
891
1370
|
const SelectPopover = class {
|
|
892
1371
|
constructor(hostRef) {
|
|
893
1372
|
registerInstance(this, hostRef);
|
|
894
|
-
// Tracks the option that received Enter-keydown so keyup only
|
|
895
|
-
// dismisses when the press started on the same option. Prevents
|
|
896
|
-
// Enter on the triggering ion-select from auto-dismissing.
|
|
897
|
-
this.pendingEnterTarget = null;
|
|
898
|
-
/**
|
|
899
|
-
* An array of options for the popover
|
|
900
|
-
*/
|
|
901
|
-
this.options = [];
|
|
902
1373
|
}
|
|
1374
|
+
get el() { return getElement(this); }
|
|
1375
|
+
// Tracks the option that received Enter-keydown so keyup only
|
|
1376
|
+
// dismisses when the press started on the same option. Prevents
|
|
1377
|
+
// Enter on the triggering ion-select from auto-dismissing.
|
|
1378
|
+
pendingEnterTarget = null;
|
|
1379
|
+
/**
|
|
1380
|
+
* The header text of the popover
|
|
1381
|
+
*/
|
|
1382
|
+
header;
|
|
1383
|
+
/**
|
|
1384
|
+
* The subheader text of the popover
|
|
1385
|
+
*/
|
|
1386
|
+
subHeader;
|
|
1387
|
+
/**
|
|
1388
|
+
* The text content of the popover body
|
|
1389
|
+
*/
|
|
1390
|
+
message;
|
|
1391
|
+
/**
|
|
1392
|
+
* If true, the select accepts multiple values
|
|
1393
|
+
*/
|
|
1394
|
+
multiple;
|
|
1395
|
+
/**
|
|
1396
|
+
* An array of options for the popover
|
|
1397
|
+
*/
|
|
1398
|
+
options = [];
|
|
903
1399
|
findOptionFromEvent(ev) {
|
|
904
1400
|
const { options } = this;
|
|
905
1401
|
return options.find((o) => o.value === ev.target.value);
|
|
@@ -912,7 +1408,7 @@ const SelectPopover = class {
|
|
|
912
1408
|
callOptionHandler(ev) {
|
|
913
1409
|
const option = this.findOptionFromEvent(ev);
|
|
914
1410
|
const values = this.getValues(ev);
|
|
915
|
-
if (option
|
|
1411
|
+
if (option?.handler) {
|
|
916
1412
|
safeCall(option.handler, values);
|
|
917
1413
|
}
|
|
918
1414
|
}
|
|
@@ -957,45 +1453,94 @@ const SelectPopover = class {
|
|
|
957
1453
|
}
|
|
958
1454
|
}
|
|
959
1455
|
renderCheckboxOptions(options) {
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
1456
|
+
const mode = getIonMode(this);
|
|
1457
|
+
return options.map((option, index) => {
|
|
1458
|
+
/**
|
|
1459
|
+
* Cast to `SelectOverlayOption` to access rich content
|
|
1460
|
+
* fields (`startContent`, `endContent`, `description`)
|
|
1461
|
+
* that are passed through from `ion-select` but not
|
|
1462
|
+
* part of the public `SelectPopoverOption` interface.
|
|
1463
|
+
*/
|
|
1464
|
+
const richOption = option;
|
|
1465
|
+
const hasRichContent = !!richOption.startContent || !!richOption.endContent || !!richOption.description;
|
|
1466
|
+
const optionLabelOptions = {
|
|
1467
|
+
id: `popover-option-${index}`,
|
|
1468
|
+
label: richOption.text,
|
|
1469
|
+
startContent: richOption.startContent,
|
|
1470
|
+
endContent: richOption.endContent,
|
|
1471
|
+
description: richOption.description,
|
|
1472
|
+
};
|
|
1473
|
+
const defaultLabelPlacement = getOverlayLabelPlacement(mode, 'checkbox');
|
|
1474
|
+
const defaultJustify = getOverlayLabelJustify(mode, 'checkbox');
|
|
1475
|
+
return (h("ion-item", {
|
|
966
1476
|
// TODO FW-4784
|
|
967
|
-
|
|
968
|
-
|
|
1477
|
+
disabled: option.disabled, class: {
|
|
1478
|
+
// TODO FW-4784
|
|
1479
|
+
'item-checkbox-checked': option.checked,
|
|
1480
|
+
...getClassMap(option.cssClass),
|
|
1481
|
+
}
|
|
1482
|
+
}, h("ion-checkbox", { class: {
|
|
1483
|
+
'select-option-has-rich-content': hasRichContent,
|
|
1484
|
+
}, value: option.value, disabled: option.disabled, checked: option.checked, justify: richOption.justify ?? defaultJustify, labelPlacement: richOption.labelPlacement ?? defaultLabelPlacement, onIonChange: (ev) => {
|
|
1485
|
+
this.setChecked(ev);
|
|
1486
|
+
this.callOptionHandler(ev);
|
|
1487
|
+
// TODO FW-4784
|
|
1488
|
+
forceUpdate(this);
|
|
1489
|
+
} }, renderOptionLabel(optionLabelOptions, 'select-option-label'))));
|
|
1490
|
+
});
|
|
969
1491
|
}
|
|
970
1492
|
renderRadioOptions(options) {
|
|
1493
|
+
const mode = getIonMode(this);
|
|
971
1494
|
const checked = options.filter((o) => o.checked).map((o) => o.value)[0];
|
|
972
|
-
return (h("ion-radio-group", { value: checked, onIonChange: (ev) => this.callOptionHandler(ev) }, options.map((option) =>
|
|
1495
|
+
return (h("ion-radio-group", { value: checked, onIonChange: (ev) => this.callOptionHandler(ev) }, options.map((option, index) => {
|
|
1496
|
+
/**
|
|
1497
|
+
* Cast to `SelectOverlayOption` to access rich content
|
|
1498
|
+
* fields (`startContent`, `endContent`, `description`)
|
|
1499
|
+
* that are passed through from `ion-select` but not
|
|
1500
|
+
* part of the public `SelectPopoverOption` interface.
|
|
1501
|
+
*/
|
|
1502
|
+
const richOption = option;
|
|
1503
|
+
const hasRichContent = !!richOption.startContent || !!richOption.endContent || !!richOption.description;
|
|
1504
|
+
const optionLabelOptions = {
|
|
1505
|
+
id: `popover-option-${index}`,
|
|
1506
|
+
label: richOption.text,
|
|
1507
|
+
startContent: richOption.startContent,
|
|
1508
|
+
endContent: richOption.endContent,
|
|
1509
|
+
description: richOption.description,
|
|
1510
|
+
};
|
|
1511
|
+
return (h("ion-item", {
|
|
973
1512
|
// TODO FW-4784
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
1513
|
+
disabled: option.disabled, class: {
|
|
1514
|
+
// TODO FW-4784
|
|
1515
|
+
'item-radio-checked': option.value === checked,
|
|
1516
|
+
...getClassMap(option.cssClass),
|
|
978
1517
|
}
|
|
979
|
-
},
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
1518
|
+
}, h("ion-radio", { class: {
|
|
1519
|
+
'select-option-has-rich-content': hasRichContent,
|
|
1520
|
+
}, value: option.value, disabled: option.disabled, justify: richOption.justify ?? getOverlayLabelJustify(mode, 'radio'), labelPlacement: richOption.labelPlacement ?? getOverlayLabelPlacement(mode, 'radio'), onClick: () => this.dismissParentPopover(), onKeyDown: (ev) => {
|
|
1521
|
+
if (ev.key === 'Enter' && !ev.repeat) {
|
|
1522
|
+
this.pendingEnterTarget = ev.currentTarget;
|
|
1523
|
+
}
|
|
1524
|
+
}, onKeyUp: (ev) => {
|
|
1525
|
+
if (ev.key === ' ') {
|
|
1526
|
+
// Space selects and dismisses in one press.
|
|
988
1527
|
this.dismissParentPopover();
|
|
989
1528
|
}
|
|
990
|
-
|
|
991
|
-
|
|
1529
|
+
else if (ev.key === 'Enter') {
|
|
1530
|
+
const shouldDismiss = this.pendingEnterTarget === ev.currentTarget;
|
|
1531
|
+
this.pendingEnterTarget = null;
|
|
1532
|
+
if (shouldDismiss) {
|
|
1533
|
+
this.dismissParentPopover();
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
} }, renderOptionLabel(optionLabelOptions, 'select-option-label'))));
|
|
1537
|
+
})));
|
|
992
1538
|
}
|
|
993
1539
|
render() {
|
|
994
1540
|
const { header, message, options, subHeader } = this;
|
|
995
1541
|
const hasSubHeaderOrMessage = subHeader !== undefined || message !== undefined;
|
|
996
|
-
return (h(Host, { key: '
|
|
1542
|
+
return (h(Host, { key: 'd0c107e0ca78955a3cfcd9f098a527fb35eff14d', class: getIonMode(this) }, h("ion-list", { key: '1e103312e22bf78d2201a0f88cc4fed789f62a2b' }, header !== undefined && h("ion-list-header", { key: '657439905dc480112ed8d7f8d4a01464724de2bd' }, header), hasSubHeaderOrMessage && (h("ion-item", { key: 'e0eaa0250bf233cf846adba5ddc141bf3430c2a8' }, h("ion-label", { key: 'ad1cff877f9d582fbc64f9049603146fd1a1a6f9', class: "ion-text-wrap" }, subHeader !== undefined && h("h3", { key: 'ead921d395b614a99c89a8ffe2a102a620f80767' }, subHeader), message !== undefined && h("p", { key: '3a47e7091528930f33324ccd04d6734217155244' }, message)))), this.renderOptions(options))));
|
|
997
1543
|
}
|
|
998
|
-
get el() { return getElement(this); }
|
|
999
1544
|
};
|
|
1000
1545
|
SelectPopover.style = {
|
|
1001
1546
|
ios: selectPopoverIosCss(),
|