@ionic/core 8.8.14-dev.11784216165.1ecbf364 → 8.8.14-dev.11784222473.142aed23
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-action-sheet.js +1 -1
- package/components/ion-alert.js +1 -1
- package/components/ion-back-button.js +1 -1
- package/components/ion-button.js +1 -1
- package/components/ion-card.js +1 -1
- package/components/ion-chip.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-img.js +1 -1
- package/components/ion-infinite-scroll-content.js +1 -1
- package/components/ion-input-password-toggle.js +1 -1
- package/components/ion-input.js +1 -1
- package/components/ion-item-option.js +1 -1
- package/components/ion-item.js +1 -1
- package/components/ion-loading.js +1 -1
- package/components/ion-menu-button.js +1 -1
- package/components/ion-menu.js +1 -1
- package/components/ion-modal.js +1 -1
- package/components/ion-nav.js +1 -1
- package/components/ion-picker-legacy-column.d.ts +11 -0
- package/components/ion-picker-legacy-column.js +4 -0
- package/components/ion-picker-legacy.d.ts +11 -0
- package/components/ion-picker-legacy.js +4 -0
- package/components/ion-popover.js +1 -1
- package/components/ion-progress-bar.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-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-3hGiN2uq.js +4 -0
- package/components/{p-DpV-p5Xs.js → p-5bE_Wz4Y.js} +1 -1
- package/components/{p-r0aq7dpt.js → p-B60hm8Qv.js} +1 -1
- package/components/{p-Buf_7zcy.js → p-BHrrc-3d.js} +1 -1
- package/components/p-BIPPbW0M.js +4 -0
- package/components/{p-XJWMAP8m.js → p-BLmJ0zRm.js} +1 -1
- package/components/{p-DhkITZ-y.js → p-BSEgsdFI.js} +1 -1
- package/components/p-BUYFy35a.js +4 -0
- package/components/p-BWEZufiK.js +4 -0
- package/components/p-BqpciLfi.js +4 -0
- package/components/p-BsQPAqo9.js +4 -0
- package/components/p-CU5rbWAW.js +4 -0
- package/components/{p-Dz74mwlk.js → p-Cfx4M1Bn.js} +1 -1
- package/components/p-k_E4tX5Z.js +4 -0
- package/components/p-nyXeHk23.js +4 -0
- package/components/{p-wk2QqrAo.js → p-rCa2eL0j.js} +1 -1
- package/dist/cjs/config-xninhj0J.js +201 -0
- package/dist/cjs/index.cjs.js +6 -6
- package/dist/cjs/ion-action-sheet.cjs.entry.js +7 -27
- package/dist/cjs/ion-alert.cjs.entry.js +25 -64
- package/dist/cjs/ion-app_8.cjs.entry.js +9 -23
- package/dist/cjs/ion-avatar_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-col_3.cjs.entry.js +1 -1
- package/dist/cjs/{ion-datetime.cjs.entry.js → ion-datetime_3.cjs.entry.js} +639 -1
- package/dist/cjs/ion-img.cjs.entry.js +1 -3
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +2 -3
- package/dist/cjs/ion-input.cjs.entry.js +4 -4
- package/dist/cjs/ion-item_8.cjs.entry.js +2 -2
- package/dist/cjs/ion-loading.cjs.entry.js +5 -10
- package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-modal.cjs.entry.js +18 -23
- package/dist/cjs/ion-nav_2.cjs.entry.js +115 -2
- package/dist/cjs/ion-popover.cjs.entry.js +5 -9
- package/dist/cjs/ion-progress-bar.cjs.entry.js +1 -1
- package/dist/cjs/ion-radio_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-range.cjs.entry.js +3 -3
- package/dist/cjs/ion-refresher_2.cjs.entry.js +5 -6
- package/dist/cjs/ion-reorder_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-ripple-effect.cjs.entry.js +1 -1
- package/dist/cjs/ion-route_4.cjs.entry.js +4 -18
- package/dist/cjs/ion-searchbar.cjs.entry.js +5 -5
- package/dist/cjs/ion-segment-content.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment-view.cjs.entry.js +2 -2
- package/dist/cjs/ion-segment_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-select-modal.cjs.entry.js +30 -84
- package/dist/cjs/ion-select_3.cjs.entry.js +49 -407
- package/dist/cjs/ion-spinner.cjs.entry.js +1 -1
- package/dist/cjs/ion-split-pane.cjs.entry.js +2 -2
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-tab_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-text.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
- package/dist/cjs/ion-toast.cjs.entry.js +5 -6
- package/dist/cjs/ion-toggle.cjs.entry.js +3 -3
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{overlays-DSmSrd_4.js → overlays-DdtIYQUH.js} +31 -27
- package/dist/collection/collection-manifest.json +10 -6
- package/dist/collection/components/action-sheet/action-sheet.ios.css +2 -229
- package/dist/collection/components/action-sheet/action-sheet.js +5 -24
- package/dist/collection/components/action-sheet/action-sheet.md.css +2 -175
- package/dist/collection/components/alert/alert.ios.css +10 -280
- package/dist/collection/components/alert/alert.js +21 -59
- package/dist/collection/components/alert/alert.md.css +20 -269
- package/dist/collection/components/img/img.js +1 -6
- package/dist/collection/components/input/input.js +8 -8
- package/dist/collection/components/loading/loading.js +3 -7
- package/dist/collection/components/modal/modal.ios.css +8 -0
- package/dist/collection/components/modal/modal.js +18 -23
- package/dist/collection/components/modal/modal.md.css +8 -0
- package/dist/collection/components/nav/nav.js +219 -4
- package/dist/collection/components/picker-legacy/animations/ios.enter.js +27 -0
- package/dist/collection/components/picker-legacy/animations/ios.leave.js +23 -0
- package/dist/collection/components/picker-legacy/picker-interface.js +1 -0
- package/dist/collection/components/picker-legacy/picker.ios.css +300 -0
- package/dist/collection/components/picker-legacy/picker.js +890 -0
- package/dist/collection/components/picker-legacy/picker.md.css +287 -0
- package/dist/collection/components/picker-legacy-column/picker-column.ios.css +231 -0
- package/dist/collection/components/picker-legacy-column/picker-column.js +422 -0
- package/dist/collection/components/picker-legacy-column/picker-column.md.css +222 -0
- package/dist/collection/components/picker-legacy-column/test/test.utils.js +43 -0
- package/dist/collection/components/popover/popover.ios.css +0 -15
- package/dist/collection/components/popover/popover.js +3 -7
- package/dist/collection/components/popover/popover.md.css +0 -15
- package/dist/collection/components/progress-bar/progress-bar.js +1 -1
- package/dist/collection/components/radio/radio.js +4 -4
- package/dist/collection/components/range/range.js +3 -3
- package/dist/collection/components/refresher/refresher.js +1 -1
- package/dist/collection/components/refresher-content/refresher-content.js +1 -1
- package/dist/collection/components/reorder/reorder.js +1 -1
- package/dist/collection/components/reorder-group/reorder-group.js +1 -1
- package/dist/collection/components/ripple-effect/ripple-effect.js +1 -1
- package/dist/collection/components/route/route.js +1 -1
- package/dist/collection/components/router/utils/dom.js +3 -22
- package/dist/collection/components/router-link/router-link.js +2 -2
- package/dist/collection/components/router-outlet/router-outlet.js +5 -38
- package/dist/collection/components/row/row.js +1 -1
- package/dist/collection/components/searchbar/searchbar.js +9 -9
- package/dist/collection/components/segment/segment.js +2 -2
- package/dist/collection/components/segment-button/segment-button.js +2 -2
- package/dist/collection/components/segment-content/segment-content.js +1 -1
- package/dist/collection/components/segment-view/segment-view.js +2 -2
- package/dist/collection/components/select/select.ios.css +0 -33
- package/dist/collection/components/select/select.js +16 -323
- package/dist/collection/components/select/select.md.css +0 -33
- package/dist/collection/components/select-modal/select-modal.ios.css +0 -219
- package/dist/collection/components/select-modal/select-modal.js +26 -79
- package/dist/collection/components/select-modal/select-modal.md.css +0 -165
- package/dist/collection/components/select-option/select-option.js +3 -67
- package/dist/collection/components/select-popover/select-popover.ios.css +0 -219
- package/dist/collection/components/select-popover/select-popover.js +26 -78
- package/dist/collection/components/select-popover/select-popover.md.css +0 -165
- package/dist/collection/components/skeleton-text/skeleton-text.js +2 -2
- package/dist/collection/components/spinner/spinner.js +1 -1
- package/dist/collection/components/split-pane/split-pane.js +2 -2
- package/dist/collection/components/tab/tab.js +2 -2
- package/dist/collection/components/tab-bar/tab-bar.js +2 -2
- package/dist/collection/components/tab-button/tab-button.js +2 -2
- package/dist/collection/components/tabs/tabs.js +1 -1
- package/dist/collection/components/text/text.js +2 -2
- package/dist/collection/components/textarea/textarea.js +2 -2
- package/dist/collection/components/thumbnail/thumbnail.js +1 -1
- package/dist/collection/components/title/title.js +2 -2
- package/dist/collection/components/toast/toast.js +2 -2
- package/dist/collection/components/toggle/toggle.js +3 -3
- package/dist/collection/components/toolbar/toolbar.js +2 -2
- package/dist/collection/index.js +1 -1
- package/dist/collection/utils/overlays.js +30 -26
- package/dist/collection/utils/sanitization/index.js +18 -274
- package/dist/docs.json +1189 -497
- package/dist/esm/config-DQCONYYp.js +195 -0
- package/dist/esm/{index-AlrZKoWR.js → index-DV3sJJW8.js} +1 -1
- package/dist/esm/index.js +2 -3
- package/dist/esm/ion-accordion_2.entry.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +7 -27
- package/dist/esm/ion-alert.entry.js +24 -63
- package/dist/esm/ion-app_8.entry.js +9 -23
- package/dist/esm/ion-avatar_3.entry.js +1 -1
- package/dist/esm/ion-back-button.entry.js +1 -1
- package/dist/esm/ion-breadcrumb_2.entry.js +1 -1
- package/dist/esm/ion-col_3.entry.js +1 -1
- package/dist/esm/{ion-datetime.entry.js → ion-datetime_3.entry.js} +641 -5
- package/dist/esm/ion-fab_3.entry.js +1 -1
- package/dist/esm/ion-img.entry.js +2 -4
- package/dist/esm/ion-infinite-scroll_2.entry.js +1 -2
- package/dist/esm/ion-input-password-toggle.entry.js +1 -1
- package/dist/esm/ion-input.entry.js +5 -5
- package/dist/esm/ion-item_8.entry.js +3 -3
- package/dist/esm/ion-loading.entry.js +4 -9
- package/dist/esm/ion-menu_3.entry.js +2 -2
- package/dist/esm/ion-modal.entry.js +18 -23
- package/dist/esm/ion-nav_2.entry.js +116 -3
- package/dist/esm/ion-popover.entry.js +5 -9
- package/dist/esm/ion-progress-bar.entry.js +1 -1
- package/dist/esm/ion-radio_2.entry.js +3 -3
- package/dist/esm/ion-range.entry.js +3 -3
- package/dist/esm/ion-refresher_2.entry.js +4 -5
- package/dist/esm/ion-reorder_2.entry.js +3 -3
- package/dist/esm/ion-ripple-effect.entry.js +1 -1
- package/dist/esm/ion-route_4.entry.js +4 -18
- package/dist/esm/ion-searchbar.entry.js +6 -6
- package/dist/esm/ion-segment-content.entry.js +1 -1
- package/dist/esm/ion-segment-view.entry.js +2 -2
- package/dist/esm/ion-segment_2.entry.js +4 -4
- package/dist/esm/ion-select-modal.entry.js +30 -84
- package/dist/esm/ion-select_3.entry.js +52 -410
- package/dist/esm/ion-spinner.entry.js +1 -1
- package/dist/esm/ion-split-pane.entry.js +2 -2
- package/dist/esm/ion-tab-bar_2.entry.js +4 -4
- package/dist/esm/ion-tab_2.entry.js +3 -3
- package/dist/esm/ion-text.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +2 -2
- package/dist/esm/ion-toast.entry.js +4 -5
- package/dist/esm/ion-toggle.entry.js +4 -4
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{overlays-DLNOHWNc.js → overlays-Dg0q2_tJ.js} +32 -28
- package/dist/html.html-data.json +80 -52
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-01f81ea5.entry.js +4 -0
- package/dist/ionic/p-0cc11f99.entry.js +4 -0
- package/dist/ionic/p-0dc33652.entry.js +4 -0
- package/dist/ionic/{p-fe4aa1db.entry.js → p-0fa9c382.entry.js} +1 -1
- package/dist/ionic/p-20b1a044.entry.js +4 -0
- package/dist/ionic/p-21eb76d5.entry.js +4 -0
- package/dist/ionic/p-27d30585.entry.js +4 -0
- package/dist/ionic/p-2a05aa64.entry.js +4 -0
- package/dist/ionic/p-2bb2cb18.entry.js +4 -0
- package/dist/ionic/{p-80b44b3c.entry.js → p-3353c229.entry.js} +1 -1
- package/dist/ionic/{p-c93553d2.entry.js → p-34586ead.entry.js} +1 -1
- package/dist/ionic/{p-a7628bc7.entry.js → p-37e720da.entry.js} +1 -1
- package/dist/ionic/{p-9177f4ac.entry.js → p-390ca786.entry.js} +1 -1
- package/dist/ionic/{p-259d0d98.entry.js → p-3a126bca.entry.js} +1 -1
- package/dist/ionic/{p-4502a274.entry.js → p-3a7d1e91.entry.js} +1 -1
- package/dist/ionic/{p-627fabd9.entry.js → p-3ae5f277.entry.js} +1 -1
- package/dist/ionic/{p-a5213260.entry.js → p-4858af1f.entry.js} +1 -1
- package/dist/ionic/p-485fda23.entry.js +4 -0
- package/dist/ionic/p-4baa5b82.entry.js +4 -0
- package/dist/ionic/p-5018dfc8.entry.js +4 -0
- package/dist/ionic/p-50e1194a.entry.js +4 -0
- package/dist/ionic/{p-76e92a84.entry.js → p-5d1da0a2.entry.js} +1 -1
- package/dist/ionic/p-5eb8e86d.entry.js +4 -0
- package/dist/ionic/p-65ebdf1b.entry.js +4 -0
- package/dist/ionic/p-6ebdbebe.entry.js +4 -0
- package/dist/ionic/{p-d2c7f046.entry.js → p-75dc25ba.entry.js} +1 -1
- package/dist/ionic/{p-b9ac1fe0.entry.js → p-84d5ce05.entry.js} +1 -1
- package/dist/ionic/{p-51cd1643.entry.js → p-874b4bd8.entry.js} +1 -1
- package/dist/ionic/{p-ef93ca92.entry.js → p-8eb8ee76.entry.js} +1 -1
- package/dist/ionic/p-8fce95d5.entry.js +4 -0
- package/dist/ionic/{p-db1b6738.entry.js → p-9a65ac7f.entry.js} +1 -1
- package/dist/ionic/{p-7a37b3ce.entry.js → p-9f1103ce.entry.js} +1 -1
- package/dist/ionic/p-9f9db3a2.entry.js +4 -0
- package/dist/ionic/p-D-3ycHmd.js +4 -0
- package/dist/ionic/{p-AlrZKoWR.js → p-DV3sJJW8.js} +1 -1
- package/dist/ionic/p-DzWaWHGc.js +4 -0
- package/dist/ionic/p-a21add2f.entry.js +4 -0
- package/dist/ionic/{p-d8387b99.entry.js → p-c4d8641b.entry.js} +1 -1
- package/dist/ionic/p-ca2ab74d.entry.js +4 -0
- package/dist/ionic/{p-629e4703.entry.js → p-e0be05c5.entry.js} +1 -1
- package/dist/ionic/p-ec090e0a.entry.js +4 -0
- package/dist/ionic/{p-b1599fca.entry.js → p-ef4c3bee.entry.js} +1 -1
- package/dist/ionic/p-f386f6ae.entry.js +4 -0
- package/dist/ionic/{p-341032b3.entry.js → p-fabcce6c.entry.js} +1 -1
- package/dist/types/components/img/img.d.ts +0 -2
- package/dist/types/components/input/input.d.ts +1 -1
- package/dist/types/components/modal/modal.d.ts +4 -11
- package/dist/types/components/nav/nav-interface.d.ts +1 -0
- package/dist/types/components/nav/nav.d.ts +22 -2
- package/dist/types/components/picker-legacy/animations/ios.enter.d.ts +5 -0
- package/dist/types/components/picker-legacy/animations/ios.leave.d.ts +5 -0
- package/dist/types/components/picker-legacy/picker-interface.d.ts +52 -0
- package/dist/types/components/picker-legacy/picker.d.ts +158 -0
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +46 -0
- package/dist/types/components/picker-legacy-column/test/test.utils.d.ts +9 -0
- package/dist/types/components/route/route.d.ts +1 -1
- package/dist/types/components/router-outlet/router-outlet.d.ts +0 -7
- package/dist/types/components/searchbar/searchbar.d.ts +1 -1
- package/dist/types/components/select/select-interface.d.ts +0 -31
- package/dist/types/components/select/select.d.ts +0 -18
- package/dist/types/components/select-option/select-option.d.ts +1 -42
- package/dist/types/components.d.ts +303 -74
- package/dist/types/index.d.ts +1 -1
- package/dist/types/interface.d.ts +1 -0
- package/dist/types/utils/config.d.ts +8 -0
- package/dist/types/utils/overlays.d.ts +9 -11
- package/dist/types/utils/sanitization/index.d.ts +2 -58
- package/hydrate/index.js +1268 -1400
- package/hydrate/index.mjs +1268 -1400
- package/package.json +5 -37
- package/components/p-279dFMvg.js +0 -4
- package/components/p-BSQPZ79H.js +0 -4
- package/components/p-BwKpO3Is.js +0 -4
- package/components/p-C-Rx1zny.js +0 -4
- package/components/p-CHzfYZbv.js +0 -4
- package/components/p-D4h1H_hh.js +0 -4
- package/components/p-LMGfIvTf.js +0 -4
- package/components/p-_lHSumhG.js +0 -4
- package/components/p-j9Da6cYO.js +0 -4
- package/components/p-jOtMJMv8.js +0 -4
- package/components/p-uTR_dEqg.js +0 -4
- package/dist/cjs/config-DWdFbSNK.js +0 -35
- package/dist/cjs/index-Cueg3U4w.js +0 -429
- package/dist/cjs/overlay-control-label-D2sdL2O8.js +0 -50
- package/dist/cjs/select-option-render-DTF50t5r.js +0 -124
- package/dist/collection/utils/overlay-control-label.js +0 -45
- package/dist/collection/utils/select-option-render.js +0 -119
- package/dist/esm/config-BwKpO3Is.js +0 -31
- package/dist/esm/index-DQSkZyOJ.js +0 -424
- package/dist/esm/overlay-control-label-BSQPZ79H.js +0 -47
- package/dist/esm/select-option-render-B8nWZRnd.js +0 -122
- package/dist/ionic/p-038eb991.entry.js +0 -4
- package/dist/ionic/p-4621c387.entry.js +0 -4
- package/dist/ionic/p-4ace7762.entry.js +0 -4
- package/dist/ionic/p-4bb3eb60.entry.js +0 -4
- package/dist/ionic/p-4e9ec5c5.entry.js +0 -4
- package/dist/ionic/p-5c3ec490.entry.js +0 -4
- package/dist/ionic/p-5d1ac2c7.entry.js +0 -4
- package/dist/ionic/p-700795f6.entry.js +0 -4
- package/dist/ionic/p-79a36078.entry.js +0 -4
- package/dist/ionic/p-913b218a.entry.js +0 -4
- package/dist/ionic/p-BDtODLZ4.js +0 -4
- package/dist/ionic/p-BSQPZ79H.js +0 -4
- package/dist/ionic/p-BwKpO3Is.js +0 -4
- package/dist/ionic/p-Cg5-OQYy.js +0 -4
- package/dist/ionic/p-DCOvXkOm.js +0 -4
- package/dist/ionic/p-a18dcb3c.entry.js +0 -4
- package/dist/ionic/p-a9a33367.entry.js +0 -4
- package/dist/ionic/p-ad728198.entry.js +0 -4
- package/dist/ionic/p-bfc8c629.entry.js +0 -4
- package/dist/ionic/p-c08e666a.entry.js +0 -4
- package/dist/ionic/p-c474f471.entry.js +0 -4
- package/dist/ionic/p-ce7992c4.entry.js +0 -4
- package/dist/ionic/p-ed797c72.entry.js +0 -4
- package/dist/ionic/p-f09f9642.entry.js +0 -4
- package/dist/ionic/p-f1c06f82.entry.js +0 -4
- package/dist/ionic/p-f718fccb.entry.js +0 -4
- package/dist/types/utils/overlay-control-label.d.ts +0 -32
- package/dist/types/utils/select-option-render.d.ts +0 -53
|
@@ -2,17 +2,14 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { Build, Host, h, forceUpdate } from "@stencil/core";
|
|
5
|
-
import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
|
|
6
5
|
import { compareOptions, createNotchController, isOptionSelected, checkInvalidState } from "../../utils/forms/index";
|
|
7
6
|
import { focusVisibleElement, renderHiddenInput, inheritAttributes } from "../../utils/helpers";
|
|
8
7
|
import { printIonWarning } from "../../utils/logging/index";
|
|
9
8
|
import { actionSheetController, alertController, popoverController, modalController } from "../../utils/overlays";
|
|
10
9
|
import { isRTL } from "../../utils/rtl/index";
|
|
11
|
-
import { reflectPropertiesToAttributes, sanitizeDOMTree } from "../../utils/sanitization/index";
|
|
12
10
|
import { createColorClasses, hostContext } from "../../utils/theme";
|
|
13
11
|
import { watchForOptions } from "../../utils/watch-options";
|
|
14
12
|
import { caretDownSharp, chevronExpand } from "ionicons/icons";
|
|
15
|
-
import { config } from "../../global/config";
|
|
16
13
|
import { getIonMode } from "../../global/ionic-global";
|
|
17
14
|
// TODO(FW-2832): types
|
|
18
15
|
/**
|
|
@@ -40,7 +37,6 @@ export class Select {
|
|
|
40
37
|
this.helperTextId = `${this.inputId}-helper-text`;
|
|
41
38
|
this.errorTextId = `${this.inputId}-error-text`;
|
|
42
39
|
this.inheritedAttributes = {};
|
|
43
|
-
this.customHTMLEnabled = config.get('innerHTMLTemplatesEnabled', ENABLE_HTML_CONTENT_DEFAULT);
|
|
44
40
|
this.isExpanded = false;
|
|
45
41
|
/**
|
|
46
42
|
* The `hasFocus` state ensures the focus class is
|
|
@@ -166,40 +162,9 @@ export class Select {
|
|
|
166
162
|
this.emitStyle();
|
|
167
163
|
}
|
|
168
164
|
setValue(value) {
|
|
169
|
-
if (this.isValueEqual(this.value, value)) {
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
165
|
this.value = value;
|
|
173
166
|
this.ionChange.emit({ value });
|
|
174
167
|
}
|
|
175
|
-
isValueEqual(currentValue, newValue) {
|
|
176
|
-
if (this.multiple) {
|
|
177
|
-
const currentArr = Array.isArray(currentValue) ? currentValue : [];
|
|
178
|
-
const newArr = Array.isArray(newValue) ? newValue : [];
|
|
179
|
-
if (currentArr.length !== newArr.length) {
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
// Multiset compare: each new value must match a distinct current value.
|
|
183
|
-
// A plain `every(isOptionSelected)` would accept ['a','a'] as equal to
|
|
184
|
-
// ['a','b'] when both 'a' and 'b' map to options whose values overlap.
|
|
185
|
-
const remaining = currentArr.slice();
|
|
186
|
-
return newArr.every((val) => {
|
|
187
|
-
const idx = remaining.findIndex((c) => compareOptions(c, val, this.compareWith));
|
|
188
|
-
if (idx === -1) {
|
|
189
|
-
return false;
|
|
190
|
-
}
|
|
191
|
-
remaining.splice(idx, 1);
|
|
192
|
-
return true;
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
if (currentValue == null && newValue == null) {
|
|
196
|
-
return true;
|
|
197
|
-
}
|
|
198
|
-
if (currentValue == null || newValue == null) {
|
|
199
|
-
return false;
|
|
200
|
-
}
|
|
201
|
-
return compareOptions(currentValue, newValue, this.compareWith);
|
|
202
|
-
}
|
|
203
168
|
async connectedCallback() {
|
|
204
169
|
const { el } = this;
|
|
205
170
|
this.notchController = createNotchController(el, () => this.notchSpacerEl, () => this.labelSlot);
|
|
@@ -434,11 +399,10 @@ export class Select {
|
|
|
434
399
|
.join(' ');
|
|
435
400
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
436
401
|
const isSelected = isOptionSelected(selectValue, value, this.compareWith);
|
|
437
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
438
402
|
return {
|
|
439
|
-
|
|
403
|
+
role: isSelected ? 'selected' : '',
|
|
404
|
+
text: option.textContent,
|
|
440
405
|
cssClass: optClass,
|
|
441
|
-
disabled: option.disabled,
|
|
442
406
|
handler: () => {
|
|
443
407
|
this.setValue(value);
|
|
444
408
|
},
|
|
@@ -446,9 +410,6 @@ export class Select {
|
|
|
446
410
|
'aria-checked': isSelected ? 'true' : 'false',
|
|
447
411
|
role: 'radio',
|
|
448
412
|
},
|
|
449
|
-
startContent,
|
|
450
|
-
endContent,
|
|
451
|
-
description: option.description,
|
|
452
413
|
};
|
|
453
414
|
});
|
|
454
415
|
// Add "cancel" button
|
|
@@ -469,19 +430,13 @@ export class Select {
|
|
|
469
430
|
.filter((cls) => cls !== 'hydrated')
|
|
470
431
|
.join(' ');
|
|
471
432
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
472
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
473
433
|
return {
|
|
474
434
|
type: inputType,
|
|
475
435
|
cssClass: optClass,
|
|
476
|
-
label:
|
|
436
|
+
label: option.textContent || '',
|
|
477
437
|
value,
|
|
478
438
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
479
439
|
disabled: option.disabled,
|
|
480
|
-
startContent,
|
|
481
|
-
endContent,
|
|
482
|
-
description: option.description,
|
|
483
|
-
labelPlacement: option.labelPlacement,
|
|
484
|
-
justify: option.justify,
|
|
485
440
|
};
|
|
486
441
|
});
|
|
487
442
|
return alertInputs;
|
|
@@ -494,9 +449,8 @@ export class Select {
|
|
|
494
449
|
.filter((cls) => cls !== 'hydrated')
|
|
495
450
|
.join(' ');
|
|
496
451
|
const optClass = `${OPTION_CLASS} ${copyClasses}`;
|
|
497
|
-
const { content, startContent, endContent } = extractOptionContent(option, this.customHTMLEnabled);
|
|
498
452
|
return {
|
|
499
|
-
text:
|
|
453
|
+
text: option.textContent || '',
|
|
500
454
|
cssClass: optClass,
|
|
501
455
|
value,
|
|
502
456
|
checked: isOptionSelected(selectValue, value, this.compareWith),
|
|
@@ -507,11 +461,6 @@ export class Select {
|
|
|
507
461
|
this.close();
|
|
508
462
|
}
|
|
509
463
|
},
|
|
510
|
-
startContent,
|
|
511
|
-
endContent,
|
|
512
|
-
description: option.description,
|
|
513
|
-
labelPlacement: option.labelPlacement,
|
|
514
|
-
justify: option.justify,
|
|
515
464
|
};
|
|
516
465
|
});
|
|
517
466
|
return popoverOptions;
|
|
@@ -544,21 +493,15 @@ export class Select {
|
|
|
544
493
|
ionShadowTarget: this.nativeWrapperEl,
|
|
545
494
|
} });
|
|
546
495
|
}
|
|
547
|
-
const options = this.createOverlaySelectOptions(this.childOpts, value);
|
|
548
|
-
const hasRichContent = options.some((opt) => opt.startContent || opt.endContent || opt.description);
|
|
549
496
|
const popoverOpts = Object.assign(Object.assign({ mode,
|
|
550
497
|
event, alignment: 'center', size,
|
|
551
|
-
showBackdrop }, interfaceOptions), { component: 'ion-select-popover', cssClass: [
|
|
552
|
-
'select-popover',
|
|
553
|
-
hasRichContent ? 'select-popover-rich-content' : undefined,
|
|
554
|
-
interfaceOptions.cssClass,
|
|
555
|
-
], componentProps: {
|
|
498
|
+
showBackdrop }, interfaceOptions), { component: 'ion-select-popover', cssClass: ['select-popover', interfaceOptions.cssClass], componentProps: {
|
|
556
499
|
header: interfaceOptions.header,
|
|
557
500
|
subHeader: interfaceOptions.subHeader,
|
|
558
501
|
message: interfaceOptions.message,
|
|
559
502
|
multiple,
|
|
560
503
|
value,
|
|
561
|
-
options,
|
|
504
|
+
options: this.createOverlaySelectOptions(this.childOpts, value),
|
|
562
505
|
} });
|
|
563
506
|
/**
|
|
564
507
|
* Workaround for Stencil to autodefine
|
|
@@ -685,18 +628,12 @@ export class Select {
|
|
|
685
628
|
}
|
|
686
629
|
return;
|
|
687
630
|
}
|
|
688
|
-
|
|
689
|
-
* Returns the text to display in the select based on the selected value.
|
|
690
|
-
*
|
|
691
|
-
* @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`.
|
|
692
|
-
* @returns The text to display in the select, either with or without HTML based on the `useHTML` parameter.
|
|
693
|
-
*/
|
|
694
|
-
getText(useHTML = false) {
|
|
631
|
+
getText() {
|
|
695
632
|
const selectedText = this.selectedText;
|
|
696
633
|
if (selectedText != null && selectedText !== '') {
|
|
697
634
|
return selectedText;
|
|
698
635
|
}
|
|
699
|
-
return generateText(this.childOpts, this.value, this.compareWith
|
|
636
|
+
return generateText(this.childOpts, this.value, this.compareWith);
|
|
700
637
|
}
|
|
701
638
|
setFocus() {
|
|
702
639
|
if (this.focusEl) {
|
|
@@ -766,47 +703,6 @@ export class Select {
|
|
|
766
703
|
*/
|
|
767
704
|
return this.renderLabel();
|
|
768
705
|
}
|
|
769
|
-
/**
|
|
770
|
-
* Wraps text nodes in the select text with span elements
|
|
771
|
-
* so spacing can be added between elements without
|
|
772
|
-
* changing the display to prevent losing the ellipses
|
|
773
|
-
* behavior.
|
|
774
|
-
*
|
|
775
|
-
* Only wraps when the string contains HTML elements
|
|
776
|
-
* alongside text.
|
|
777
|
-
*/
|
|
778
|
-
wrapSelectTextNodes(html) {
|
|
779
|
-
const temp = document.createElement('div');
|
|
780
|
-
temp.innerHTML = html;
|
|
781
|
-
const hasElements = Array.from(temp.childNodes).some((n) => n.nodeType === Node.ELEMENT_NODE);
|
|
782
|
-
// Return the plain text
|
|
783
|
-
if (!hasElements) {
|
|
784
|
-
return html;
|
|
785
|
-
}
|
|
786
|
-
Array.from(temp.childNodes).forEach((node) => {
|
|
787
|
-
var _a, _b, _c, _d;
|
|
788
|
-
if (node.nodeType === Node.TEXT_NODE && ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.trim())) {
|
|
789
|
-
const text = node.textContent;
|
|
790
|
-
/**
|
|
791
|
-
* Split comma separator from the text content
|
|
792
|
-
* e.g., ", Bacon" becomes ", " text node + <span>Bacon</span>.
|
|
793
|
-
*/
|
|
794
|
-
const commaMatch = text.match(/^(,\s*)(.*)/);
|
|
795
|
-
if (commaMatch) {
|
|
796
|
-
const commaNode = document.createTextNode(commaMatch[1]);
|
|
797
|
-
const wrapper = document.createElement('span');
|
|
798
|
-
wrapper.textContent = commaMatch[2];
|
|
799
|
-
(_b = node.parentNode) === null || _b === void 0 ? void 0 : _b.replaceChild(wrapper, node);
|
|
800
|
-
(_c = wrapper.parentNode) === null || _c === void 0 ? void 0 : _c.insertBefore(commaNode, wrapper);
|
|
801
|
-
return;
|
|
802
|
-
}
|
|
803
|
-
const wrapper = document.createElement('span');
|
|
804
|
-
(_d = node.parentNode) === null || _d === void 0 ? void 0 : _d.replaceChild(wrapper, node);
|
|
805
|
-
wrapper.appendChild(node);
|
|
806
|
-
}
|
|
807
|
-
});
|
|
808
|
-
return temp.innerHTML;
|
|
809
|
-
}
|
|
810
706
|
/**
|
|
811
707
|
* Renders either the placeholder
|
|
812
708
|
* or the selected values based on
|
|
@@ -814,7 +710,7 @@ export class Select {
|
|
|
814
710
|
*/
|
|
815
711
|
renderSelectText() {
|
|
816
712
|
const { placeholder } = this;
|
|
817
|
-
const displayValue = this.getText(
|
|
713
|
+
const displayValue = this.getText();
|
|
818
714
|
let addPlaceholderClass = false;
|
|
819
715
|
let selectText = displayValue;
|
|
820
716
|
if (selectText === '' && placeholder !== undefined) {
|
|
@@ -826,10 +722,6 @@ export class Select {
|
|
|
826
722
|
'select-placeholder': addPlaceholderClass,
|
|
827
723
|
};
|
|
828
724
|
const textPart = addPlaceholderClass ? 'placeholder' : 'text';
|
|
829
|
-
if (this.customHTMLEnabled) {
|
|
830
|
-
const wrapped = this.wrapSelectTextNodes(selectText);
|
|
831
|
-
return h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart, innerHTML: wrapped });
|
|
832
|
-
}
|
|
833
725
|
return (h("div", { "aria-hidden": "true", class: selectTextClasses, part: textPart }, selectText));
|
|
834
726
|
}
|
|
835
727
|
/**
|
|
@@ -852,7 +744,6 @@ export class Select {
|
|
|
852
744
|
get ariaLabel() {
|
|
853
745
|
var _a;
|
|
854
746
|
const { placeholder, inheritedAttributes } = this;
|
|
855
|
-
// Get the plain text from the selected text
|
|
856
747
|
const displayValue = this.getText();
|
|
857
748
|
// The aria label should be preferred over visible text if both are specified
|
|
858
749
|
const definedLabel = (_a = inheritedAttributes['aria-label']) !== null && _a !== void 0 ? _a : this.labelText;
|
|
@@ -946,7 +837,7 @@ export class Select {
|
|
|
946
837
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
947
838
|
*/
|
|
948
839
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || isExpanded || hasStartEndSlots));
|
|
949
|
-
return (h(Host, { key: '
|
|
840
|
+
return (h(Host, { key: '5f4ee901b65554eacc9fa52230d06b1a5ff1247c', onClick: this.onClick, class: createColorClasses(this.color, {
|
|
950
841
|
[mode]: true,
|
|
951
842
|
'in-item': inItem,
|
|
952
843
|
'in-item-color': hostContext('ion-item.ion-color', el),
|
|
@@ -964,7 +855,7 @@ export class Select {
|
|
|
964
855
|
[`select-justify-${justify}`]: justifyEnabled,
|
|
965
856
|
[`select-shape-${shape}`]: shape !== undefined,
|
|
966
857
|
[`select-label-placement-${labelPlacement}`]: true,
|
|
967
|
-
}) }, h("label", { key: '
|
|
858
|
+
}) }, h("label", { key: 'd56d89b5b58da2b5eaebada9d1be58ca45c67806', class: "select-wrapper", id: "select-label", onClick: this.onLabelClick, part: "wrapper" }, this.renderLabelContainer(), h("div", { key: 'bc8bf089c693781ad5b3a5db76a12223867d748e', class: "select-wrapper-inner", part: "inner" }, h("slot", { key: 'e1c12b96f1573eb192608c458ed1f3463174cd89', name: "start" }), h("div", { key: '6ee5e3900d8e462f175649b502ac6faa2f2b9909', class: "native-wrapper", ref: (el) => (this.nativeWrapperEl = el), part: "container" }, this.renderSelectText(), this.renderListbox()), h("slot", { key: 'faeaea34aad412e1458beab95d4b1b9ca7b87c41', name: "end" }), !hasFloatingOrStackedLabel && this.renderSelectIcon()), hasFloatingOrStackedLabel && this.renderSelectIcon(), shouldRenderHighlight && h("div", { key: 'aeff51e51c990844869eff9940575ce6b2223135', class: "select-highlight" })), this.renderBottomContent()));
|
|
968
859
|
}
|
|
969
860
|
static get is() { return "ion-select"; }
|
|
970
861
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1624,223 +1515,25 @@ const parseValue = (value) => {
|
|
|
1624
1515
|
}
|
|
1625
1516
|
return value.toString();
|
|
1626
1517
|
};
|
|
1627
|
-
const generateText = (opts, value, compareWith
|
|
1518
|
+
const generateText = (opts, value, compareWith) => {
|
|
1628
1519
|
if (value === undefined) {
|
|
1629
1520
|
return '';
|
|
1630
1521
|
}
|
|
1631
1522
|
if (Array.isArray(value)) {
|
|
1632
1523
|
return value
|
|
1633
|
-
.map((v) => textForValue(opts, v, compareWith
|
|
1524
|
+
.map((v) => textForValue(opts, v, compareWith))
|
|
1634
1525
|
.filter((opt) => opt !== null)
|
|
1635
1526
|
.join(', ');
|
|
1636
1527
|
}
|
|
1637
1528
|
else {
|
|
1638
|
-
return textForValue(opts, value, compareWith
|
|
1529
|
+
return textForValue(opts, value, compareWith) || '';
|
|
1639
1530
|
}
|
|
1640
1531
|
};
|
|
1641
|
-
|
|
1642
|
-
* Returns the display text for a given value from the list of options.
|
|
1643
|
-
* When `useHTML` is true, returns sanitized HTML for the select text.
|
|
1644
|
-
* When `useHTML` is false, returns plain text for aria-label and other
|
|
1645
|
-
* text-only contexts.
|
|
1646
|
-
*
|
|
1647
|
-
* @param opts - The list of ion-select-option elements.
|
|
1648
|
-
* @param value - The value to find the matching option for.
|
|
1649
|
-
* @param compareWith - Custom comparison function or property name.
|
|
1650
|
-
* @param useHTML - If true, returns HTML string. If false, returns plain text.
|
|
1651
|
-
*/
|
|
1652
|
-
const textForValue = (opts, value, compareWith, useHTML = false) => {
|
|
1532
|
+
const textForValue = (opts, value, compareWith) => {
|
|
1653
1533
|
const selectOpt = opts.find((opt) => {
|
|
1654
1534
|
return compareOptions(value, getOptionValue(opt), compareWith);
|
|
1655
1535
|
});
|
|
1656
|
-
|
|
1657
|
-
if (!selectOpt) {
|
|
1658
|
-
return null;
|
|
1659
|
-
}
|
|
1660
|
-
// Return sanitized HTML for the select text
|
|
1661
|
-
if (customHTMLEnabled && useHTML) {
|
|
1662
|
-
return getOptionContent(selectOpt, undefined, true);
|
|
1663
|
-
}
|
|
1664
|
-
/**
|
|
1665
|
-
* When custom HTML is enabled, extract only the default slot content.
|
|
1666
|
-
* This ensures aria-label and other text-only contexts read only
|
|
1667
|
-
* the relevant option text.
|
|
1668
|
-
*/
|
|
1669
|
-
if (customHTMLEnabled) {
|
|
1670
|
-
const content = getOptionContent(selectOpt);
|
|
1671
|
-
if (typeof content === 'string') {
|
|
1672
|
-
return content;
|
|
1673
|
-
}
|
|
1674
|
-
/**
|
|
1675
|
-
* Elements were found in the default slot, extract and concatenate
|
|
1676
|
-
* their text content while trimming whitespace.
|
|
1677
|
-
*/
|
|
1678
|
-
if (content) {
|
|
1679
|
-
const texts = Array.from(content.childNodes)
|
|
1680
|
-
.map((n) => { var _a; return (_a = n.textContent) === null || _a === void 0 ? void 0 : _a.trim(); })
|
|
1681
|
-
.filter((t) => t);
|
|
1682
|
-
return texts.join(' ') || null;
|
|
1683
|
-
}
|
|
1684
|
-
// Empty option
|
|
1685
|
-
return null;
|
|
1686
|
-
}
|
|
1687
|
-
return getDefaultSlotPlainText(selectOpt);
|
|
1688
|
-
};
|
|
1689
|
-
/**
|
|
1690
|
-
* Trims whitespace from all text nodes within a DOM tree.
|
|
1691
|
-
* This prevents invisible layout shifts and unwanted gaps between
|
|
1692
|
-
* elements when HTML content is injected via innerHTML or cloneNode,
|
|
1693
|
-
* as browsers preserve whitespace (tabs, newlines, spaces) from
|
|
1694
|
-
* the original source markup.
|
|
1695
|
-
*
|
|
1696
|
-
* @param node The root node to start trimming text nodes from.
|
|
1697
|
-
*/
|
|
1698
|
-
const trimTextNodes = (node) => {
|
|
1699
|
-
node.childNodes.forEach((child) => {
|
|
1700
|
-
var _a;
|
|
1701
|
-
if (child.nodeType === Node.TEXT_NODE) {
|
|
1702
|
-
child.textContent = ((_a = child.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || '';
|
|
1703
|
-
}
|
|
1704
|
-
else if (child.nodeType === Node.ELEMENT_NODE) {
|
|
1705
|
-
trimTextNodes(child);
|
|
1706
|
-
}
|
|
1707
|
-
});
|
|
1708
|
-
};
|
|
1709
|
-
/**
|
|
1710
|
-
* Extracts and clones content from an `ion-select-option` element
|
|
1711
|
-
* for rendering within overlay interfaces or the select text when `customHTMLEnabled` is `true`.
|
|
1712
|
-
*
|
|
1713
|
-
* @param option - The `ion-select-option` element to extract content from.
|
|
1714
|
-
* @param slotName - Optional slot name to extract. If omitted, extracts the default slot content.
|
|
1715
|
-
* @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.
|
|
1716
|
-
* @returns When `useHTML` is `true`, a sanitized HTML string. When `false`, a
|
|
1717
|
-
* div element containing cloned child nodes. Returns `null` if no matching
|
|
1718
|
-
* content is found.
|
|
1719
|
-
*/
|
|
1720
|
-
const getOptionContent = (option, slotName, useHTML = false) => {
|
|
1721
|
-
let nodes;
|
|
1722
|
-
if (slotName) {
|
|
1723
|
-
// Named slot: get elements with matching slot attribute
|
|
1724
|
-
nodes = Array.from(option.children).filter((el) => el.getAttribute('slot') === slotName);
|
|
1725
|
-
}
|
|
1726
|
-
else {
|
|
1727
|
-
// Default slot: get nodes without a slot attribute
|
|
1728
|
-
const defaultSlot = getOptionDefaultSlot(option) || [];
|
|
1729
|
-
nodes = defaultSlot.filter((node) => {
|
|
1730
|
-
var _a;
|
|
1731
|
-
/**
|
|
1732
|
-
* Exclude whitespace-only text nodes (newline noise between
|
|
1733
|
-
* markup elements). Element nodes are always kept, even when
|
|
1734
|
-
* their textContent is empty (e.g. <svg>, <img>).
|
|
1735
|
-
*/
|
|
1736
|
-
if (node.nodeType === Node.TEXT_NODE) {
|
|
1737
|
-
return ((_a = node.textContent) === null || _a === void 0 ? void 0 : _a.trim().length) !== 0;
|
|
1738
|
-
}
|
|
1739
|
-
return true;
|
|
1740
|
-
});
|
|
1741
|
-
}
|
|
1742
|
-
if (nodes.length === 0) {
|
|
1743
|
-
return null;
|
|
1744
|
-
}
|
|
1745
|
-
// Return plain text if no elements are found
|
|
1746
|
-
if (!slotName && nodes.every((n) => n.nodeType === Node.TEXT_NODE)) {
|
|
1747
|
-
return nodes.map((n) => { var _a; return (_a = n.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }).join(' ') || null;
|
|
1748
|
-
}
|
|
1749
|
-
/**
|
|
1750
|
-
* Mirror known custom-element properties (e.g. ion-icon's `icon`)
|
|
1751
|
-
* onto attributes before cloning. Frameworks like Vue set these as
|
|
1752
|
-
* DOM properties, which `cloneNode` doesn't copy, so without this
|
|
1753
|
-
* step the cloned overlay copy renders without the prop's value.
|
|
1754
|
-
*/
|
|
1755
|
-
nodes.forEach((n) => {
|
|
1756
|
-
if (n.nodeType === Node.ELEMENT_NODE) {
|
|
1757
|
-
reflectPropertiesToAttributes(n);
|
|
1758
|
-
}
|
|
1759
|
-
});
|
|
1760
|
-
// Clone each node into a temporary container
|
|
1761
|
-
const container = document.createElement('div');
|
|
1762
|
-
nodes.forEach((n) => {
|
|
1763
|
-
var _a;
|
|
1764
|
-
const clone = n.cloneNode(true);
|
|
1765
|
-
if (clone.nodeType === Node.TEXT_NODE) {
|
|
1766
|
-
clone.textContent = ((_a = clone.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || '';
|
|
1767
|
-
}
|
|
1768
|
-
else {
|
|
1769
|
-
trimTextNodes(clone);
|
|
1770
|
-
}
|
|
1771
|
-
container.appendChild(clone);
|
|
1772
|
-
});
|
|
1773
|
-
/**
|
|
1774
|
-
* Sanitize the cloned DOM in place. Trusted attributes (size, color,
|
|
1775
|
-
* shape, etc.) are preserved; event handlers, javascript: URLs, and
|
|
1776
|
-
* blocked tags are stripped.
|
|
1777
|
-
*/
|
|
1778
|
-
sanitizeDOMTree(container);
|
|
1779
|
-
if (useHTML) {
|
|
1780
|
-
return container.innerHTML.trim() || null;
|
|
1781
|
-
}
|
|
1782
|
-
return container;
|
|
1783
|
-
};
|
|
1784
|
-
/**
|
|
1785
|
-
* Returns the child nodes that belong to the default slot of an
|
|
1786
|
-
* option element, excluding any nodes that are assigned to named
|
|
1787
|
-
* slots.
|
|
1788
|
-
*
|
|
1789
|
-
* @param option - The `ion-select-option` element to extract default-slot nodes from.
|
|
1790
|
-
* @returns An array of default slot nodes, or `null` if none are found.
|
|
1791
|
-
*/
|
|
1792
|
-
const getOptionDefaultSlot = (option) => {
|
|
1793
|
-
const defaultSlotNodes = Array.from(option.childNodes).filter((node) => {
|
|
1794
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1795
|
-
return !node.hasAttribute('slot');
|
|
1796
|
-
}
|
|
1797
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1798
|
-
});
|
|
1799
|
-
if (defaultSlotNodes.length === 0) {
|
|
1800
|
-
return null;
|
|
1801
|
-
}
|
|
1802
|
-
return defaultSlotNodes;
|
|
1803
|
-
};
|
|
1804
|
-
/**
|
|
1805
|
-
* Extracts plain text from only the default slot of an option,
|
|
1806
|
-
* excluding content assigned to named slots (start/end).
|
|
1807
|
-
*/
|
|
1808
|
-
const getDefaultSlotPlainText = (option) => {
|
|
1809
|
-
const texts = Array.from(option.childNodes)
|
|
1810
|
-
.filter((node) => {
|
|
1811
|
-
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
1812
|
-
return !node.hasAttribute('slot');
|
|
1813
|
-
}
|
|
1814
|
-
return node.nodeType === Node.TEXT_NODE;
|
|
1815
|
-
})
|
|
1816
|
-
.filter((node) => node.nodeType === Node.TEXT_NODE)
|
|
1817
|
-
.map((n) => { var _a; return (_a = n.textContent) === null || _a === void 0 ? void 0 : _a.trim(); })
|
|
1818
|
-
.filter((t) => t);
|
|
1819
|
-
return texts.join(' ');
|
|
1820
|
-
};
|
|
1821
|
-
/**
|
|
1822
|
-
* Extracts the rich content from an `ion-select-option`.
|
|
1823
|
-
* When `customHTMLEnabled` is `false`, only the plain text from the
|
|
1824
|
-
* default slot is read and the start and end slots are skipped.
|
|
1825
|
-
*
|
|
1826
|
-
* @param option - The `ion-select-option` element to extract content from.
|
|
1827
|
-
* @param customHTMLEnabled - Whether custom HTML rendering is enabled
|
|
1828
|
-
* via the `innerHTMLTemplatesEnabled` config.
|
|
1829
|
-
*/
|
|
1830
|
-
const extractOptionContent = (option, customHTMLEnabled) => {
|
|
1831
|
-
var _a, _b;
|
|
1832
|
-
if (!customHTMLEnabled) {
|
|
1833
|
-
return {
|
|
1834
|
-
content: getDefaultSlotPlainText(option),
|
|
1835
|
-
startContent: undefined,
|
|
1836
|
-
endContent: undefined,
|
|
1837
|
-
};
|
|
1838
|
-
}
|
|
1839
|
-
return {
|
|
1840
|
-
content: getOptionContent(option),
|
|
1841
|
-
startContent: (_a = getOptionContent(option, 'start')) !== null && _a !== void 0 ? _a : undefined,
|
|
1842
|
-
endContent: (_b = getOptionContent(option, 'end')) !== null && _b !== void 0 ? _b : undefined,
|
|
1843
|
-
};
|
|
1536
|
+
return selectOpt ? selectOpt.textContent : null;
|
|
1844
1537
|
};
|
|
1845
1538
|
let selectIds = 0;
|
|
1846
1539
|
const OPTION_CLASS = 'select-interface-option';
|
|
@@ -75,14 +75,6 @@
|
|
|
75
75
|
* @prop --border-width: Width of the select border
|
|
76
76
|
*
|
|
77
77
|
* @prop --ripple-color: The color of the ripple effect on MD mode.
|
|
78
|
-
*
|
|
79
|
-
* @prop --select-text-media-width: The width of media (icons/images) in the select text.
|
|
80
|
-
* @prop --select-text-media-height: The height of media (icons/images) in the select text.
|
|
81
|
-
* @prop --select-text-media-border-width: The border width of media (icons/images) in the select text.
|
|
82
|
-
* @prop --select-text-media-border-color: The border color of media (icons/images) in the select text.
|
|
83
|
-
* @prop --select-text-media-border-radius: The border radius of media (icons/images) in the select text.
|
|
84
|
-
* @prop --select-text-media-border-style: The border style of media (icons/images) in the select text.
|
|
85
|
-
* @prop --select-text-gap: The gap between elements in the select text.
|
|
86
78
|
*/
|
|
87
79
|
--padding-top: 0px;
|
|
88
80
|
--padding-end: 0px;
|
|
@@ -95,9 +87,6 @@
|
|
|
95
87
|
--highlight-color-focused: var(--ion-color-primary, #0054e9);
|
|
96
88
|
--highlight-color-valid: var(--ion-color-success, #2dd55b);
|
|
97
89
|
--highlight-color-invalid: var(--ion-color-danger, #c5000f);
|
|
98
|
-
--select-text-media-height: 1.5em;
|
|
99
|
-
--select-text-media-width: 1.5em;
|
|
100
|
-
--select-text-gap: 12px;
|
|
101
90
|
/**
|
|
102
91
|
* This is a private API that is used to switch
|
|
103
92
|
* out the highlight color based on the state
|
|
@@ -238,28 +227,6 @@ button {
|
|
|
238
227
|
overflow: hidden;
|
|
239
228
|
}
|
|
240
229
|
|
|
241
|
-
/**
|
|
242
|
-
* If the select text contains rich content, we want to add some
|
|
243
|
-
* spacing between the elements without changing the display to
|
|
244
|
-
* prevent losing the ellipses behavior.
|
|
245
|
-
*/
|
|
246
|
-
.select-text > * + * {
|
|
247
|
-
margin-inline-start: var(--select-text-gap);
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
.select-text img,
|
|
251
|
-
.select-text ion-img,
|
|
252
|
-
.select-text ion-icon,
|
|
253
|
-
.select-text ion-thumbnail,
|
|
254
|
-
.select-text ion-avatar {
|
|
255
|
-
border-radius: var(--select-text-media-border-radius);
|
|
256
|
-
width: var(--select-text-media-width);
|
|
257
|
-
height: var(--select-text-media-height);
|
|
258
|
-
border-width: var(--select-text-media-border-width);
|
|
259
|
-
border-style: var(--select-text-media-border-style);
|
|
260
|
-
border-color: var(--select-text-media-border-color);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
230
|
.select-wrapper {
|
|
264
231
|
-webkit-padding-start: var(--padding-start);
|
|
265
232
|
padding-inline-start: var(--padding-start);
|