@ionic/core 8.8.14-dev.11784222473.142aed23 → 8.8.14-dev.11784243422.11f0110c
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-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-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-279dFMvg.js +4 -0
- package/components/p-BSQPZ79H.js +4 -0
- package/components/{p-BHrrc-3d.js → p-Buf_7zcy.js} +1 -1
- package/components/p-BwKpO3Is.js +4 -0
- package/components/p-C-Rx1zny.js +4 -0
- package/components/p-CHzfYZbv.js +4 -0
- package/components/p-D4h1H_hh.js +4 -0
- package/components/{p-BSEgsdFI.js → p-DhkITZ-y.js} +1 -1
- package/components/{p-5bE_Wz4Y.js → p-DpV-p5Xs.js} +1 -1
- package/components/{p-Cfx4M1Bn.js → p-Dz74mwlk.js} +1 -1
- package/components/p-LMGfIvTf.js +4 -0
- package/components/{p-BLmJ0zRm.js → p-XJWMAP8m.js} +1 -1
- package/components/p-_lHSumhG.js +4 -0
- package/components/p-j9Da6cYO.js +4 -0
- package/components/p-jOtMJMv8.js +4 -0
- package/components/{p-B60hm8Qv.js → p-r0aq7dpt.js} +1 -1
- package/components/p-uTR_dEqg.js +4 -0
- package/components/{p-rCa2eL0j.js → p-wk2QqrAo.js} +1 -1
- package/dist/cjs/config-DWdFbSNK.js +35 -0
- package/dist/cjs/index-Cueg3U4w.js +429 -0
- package/dist/cjs/index.cjs.js +6 -6
- package/dist/cjs/ion-action-sheet.cjs.entry.js +27 -7
- package/dist/cjs/ion-alert.cjs.entry.js +64 -25
- package/dist/cjs/ion-app_8.cjs.entry.js +23 -9
- 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_3.cjs.entry.js → ion-datetime.cjs.entry.js} +1 -639
- package/dist/cjs/ion-img.cjs.entry.js +3 -1
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +3 -2
- 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 +10 -5
- package/dist/cjs/ion-menu_3.cjs.entry.js +1 -1
- package/dist/cjs/ion-modal.cjs.entry.js +23 -18
- package/dist/cjs/ion-popover.cjs.entry.js +9 -5
- 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 +6 -5
- 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 +2 -2
- 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 +84 -30
- package/dist/cjs/ion-select_3.cjs.entry.js +407 -49
- 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 +6 -5
- 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/overlay-control-label-D2sdL2O8.js +50 -0
- package/dist/cjs/{overlays-DdtIYQUH.js → overlays-DSmSrd_4.js} +27 -31
- package/dist/cjs/select-option-render-DTF50t5r.js +124 -0
- package/dist/collection/collection-manifest.json +6 -10
- package/dist/collection/components/action-sheet/action-sheet.ios.css +229 -2
- package/dist/collection/components/action-sheet/action-sheet.js +24 -5
- package/dist/collection/components/action-sheet/action-sheet.md.css +175 -2
- package/dist/collection/components/alert/alert.ios.css +280 -10
- package/dist/collection/components/alert/alert.js +59 -21
- package/dist/collection/components/alert/alert.md.css +269 -20
- package/dist/collection/components/img/img.js +6 -1
- package/dist/collection/components/input/input.js +8 -8
- package/dist/collection/components/loading/loading.js +7 -3
- package/dist/collection/components/modal/modal.ios.css +0 -8
- package/dist/collection/components/modal/modal.js +23 -18
- package/dist/collection/components/modal/modal.md.css +0 -8
- package/dist/collection/components/popover/popover.ios.css +15 -0
- package/dist/collection/components/popover/popover.js +7 -3
- package/dist/collection/components/popover/popover.md.css +15 -0
- 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/router-link/router-link.js +2 -2
- package/dist/collection/components/router-outlet/router-outlet.js +38 -5
- 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 +33 -0
- package/dist/collection/components/select/select.js +323 -16
- package/dist/collection/components/select/select.md.css +33 -0
- package/dist/collection/components/select-modal/select-modal.ios.css +219 -0
- package/dist/collection/components/select-modal/select-modal.js +79 -26
- package/dist/collection/components/select-modal/select-modal.md.css +165 -0
- package/dist/collection/components/select-option/select-option.js +67 -3
- package/dist/collection/components/select-popover/select-popover.ios.css +219 -0
- package/dist/collection/components/select-popover/select-popover.js +78 -26
- package/dist/collection/components/select-popover/select-popover.md.css +165 -0
- 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/overlay-control-label.js +45 -0
- package/dist/collection/utils/overlays.js +26 -30
- package/dist/collection/utils/sanitization/index.js +274 -18
- package/dist/collection/utils/select-option-render.js +119 -0
- package/dist/docs.json +485 -1177
- package/dist/esm/config-BwKpO3Is.js +31 -0
- package/dist/esm/{index-DV3sJJW8.js → index-AlrZKoWR.js} +1 -1
- package/dist/esm/index-DQSkZyOJ.js +424 -0
- package/dist/esm/index.js +3 -2
- package/dist/esm/ion-accordion_2.entry.js +1 -1
- package/dist/esm/ion-action-sheet.entry.js +27 -7
- package/dist/esm/ion-alert.entry.js +63 -24
- package/dist/esm/ion-app_8.entry.js +23 -9
- 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_3.entry.js → ion-datetime.entry.js} +5 -641
- package/dist/esm/ion-fab_3.entry.js +1 -1
- package/dist/esm/ion-img.entry.js +4 -2
- package/dist/esm/ion-infinite-scroll_2.entry.js +2 -1
- 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 +9 -4
- package/dist/esm/ion-menu_3.entry.js +2 -2
- package/dist/esm/ion-modal.entry.js +23 -18
- package/dist/esm/ion-popover.entry.js +9 -5
- 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 +5 -4
- 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 +2 -2
- 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 +84 -30
- package/dist/esm/ion-select_3.entry.js +410 -52
- 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 +5 -4
- 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/overlay-control-label-BSQPZ79H.js +47 -0
- package/dist/esm/{overlays-Dg0q2_tJ.js → overlays-DLNOHWNc.js} +28 -32
- package/dist/esm/select-option-render-B8nWZRnd.js +122 -0
- package/dist/html.html-data.json +51 -79
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-038eb991.entry.js +4 -0
- package/dist/ionic/{p-8fce95d5.entry.js → p-14095ba5.entry.js} +1 -1
- package/dist/ionic/{p-3a126bca.entry.js → p-259d0d98.entry.js} +1 -1
- package/dist/ionic/{p-fabcce6c.entry.js → p-341032b3.entry.js} +1 -1
- package/dist/ionic/{p-3a7d1e91.entry.js → p-4502a274.entry.js} +1 -1
- package/dist/ionic/p-4621c387.entry.js +4 -0
- package/dist/ionic/p-4ace7762.entry.js +4 -0
- package/dist/ionic/p-4bb3eb60.entry.js +4 -0
- package/dist/ionic/p-4e9ec5c5.entry.js +4 -0
- package/dist/ionic/{p-874b4bd8.entry.js → p-51cd1643.entry.js} +1 -1
- package/dist/ionic/p-5c3ec490.entry.js +4 -0
- package/dist/ionic/p-5d1ac2c7.entry.js +4 -0
- package/dist/ionic/{p-3ae5f277.entry.js → p-627fabd9.entry.js} +1 -1
- package/dist/ionic/{p-e0be05c5.entry.js → p-629e4703.entry.js} +1 -1
- package/dist/ionic/p-700795f6.entry.js +4 -0
- package/dist/ionic/{p-5d1da0a2.entry.js → p-76e92a84.entry.js} +1 -1
- package/dist/ionic/p-79a36078.entry.js +4 -0
- package/dist/ionic/{p-9f1103ce.entry.js → p-7a37b3ce.entry.js} +1 -1
- package/dist/ionic/{p-3353c229.entry.js → p-80b44b3c.entry.js} +1 -1
- package/dist/ionic/p-913b218a.entry.js +4 -0
- package/dist/ionic/{p-390ca786.entry.js → p-9177f4ac.entry.js} +1 -1
- package/dist/ionic/{p-DV3sJJW8.js → p-AlrZKoWR.js} +1 -1
- package/dist/ionic/p-BDtODLZ4.js +4 -0
- package/dist/ionic/p-BSQPZ79H.js +4 -0
- package/dist/ionic/p-BwKpO3Is.js +4 -0
- package/dist/ionic/p-Cg5-OQYy.js +4 -0
- package/dist/ionic/p-DCOvXkOm.js +4 -0
- package/dist/ionic/{p-4858af1f.entry.js → p-a5213260.entry.js} +1 -1
- package/dist/ionic/{p-37e720da.entry.js → p-a7628bc7.entry.js} +1 -1
- package/dist/ionic/p-a9a33367.entry.js +4 -0
- package/dist/ionic/p-ad728198.entry.js +4 -0
- package/dist/ionic/{p-ef4c3bee.entry.js → p-b1599fca.entry.js} +1 -1
- package/dist/ionic/{p-84d5ce05.entry.js → p-b9ac1fe0.entry.js} +1 -1
- package/dist/ionic/p-bfc8c629.entry.js +4 -0
- package/dist/ionic/p-c08e666a.entry.js +4 -0
- package/dist/ionic/{p-34586ead.entry.js → p-c93553d2.entry.js} +1 -1
- package/dist/ionic/p-ce7992c4.entry.js +4 -0
- package/dist/ionic/{p-75dc25ba.entry.js → p-d2c7f046.entry.js} +1 -1
- package/dist/ionic/{p-c4d8641b.entry.js → p-d8387b99.entry.js} +1 -1
- package/dist/ionic/{p-9a65ac7f.entry.js → p-db1b6738.entry.js} +1 -1
- package/dist/ionic/p-ed797c72.entry.js +4 -0
- package/dist/ionic/{p-8eb8ee76.entry.js → p-ef93ca92.entry.js} +1 -1
- package/dist/ionic/p-f09f9642.entry.js +4 -0
- package/dist/ionic/p-f1c06f82.entry.js +4 -0
- package/dist/ionic/p-f718fccb.entry.js +4 -0
- package/dist/ionic/{p-0fa9c382.entry.js → p-fe4aa1db.entry.js} +1 -1
- 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/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 +72 -288
- 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/hydrate/index.js +1408 -1175
- package/hydrate/index.mjs +1408 -1175
- package/package.json +37 -5
- 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-3hGiN2uq.js +0 -4
- package/components/p-BIPPbW0M.js +0 -4
- package/components/p-BUYFy35a.js +0 -4
- package/components/p-BWEZufiK.js +0 -4
- package/components/p-BqpciLfi.js +0 -4
- package/components/p-BsQPAqo9.js +0 -4
- package/components/p-CU5rbWAW.js +0 -4
- package/components/p-k_E4tX5Z.js +0 -4
- package/components/p-nyXeHk23.js +0 -4
- package/dist/cjs/config-xninhj0J.js +0 -201
- 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/ionic/p-01f81ea5.entry.js +0 -4
- package/dist/ionic/p-0cc11f99.entry.js +0 -4
- package/dist/ionic/p-0dc33652.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-2bb2cb18.entry.js +0 -4
- package/dist/ionic/p-485fda23.entry.js +0 -4
- package/dist/ionic/p-4baa5b82.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-5eb8e86d.entry.js +0 -4
- package/dist/ionic/p-65ebdf1b.entry.js +0 -4
- package/dist/ionic/p-6ebdbebe.entry.js +0 -4
- package/dist/ionic/p-9f9db3a2.entry.js +0 -4
- package/dist/ionic/p-D-3ycHmd.js +0 -4
- package/dist/ionic/p-DzWaWHGc.js +0 -4
- package/dist/ionic/p-a21add2f.entry.js +0 -4
- package/dist/ionic/p-ca2ab74d.entry.js +0 -4
- package/dist/ionic/p-ec090e0a.entry.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
|
@@ -1,3 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A heuristic that applies CSS to tablet
|
|
3
|
+
* viewports.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* @include tablet-viewport() {
|
|
7
|
+
* :host {
|
|
8
|
+
* background-color: green;
|
|
9
|
+
* }
|
|
10
|
+
* }
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* A heuristic that applies CSS to mobile
|
|
14
|
+
* viewports (i.e. phones, not tablets).
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* @include mobile-viewport() {
|
|
18
|
+
* :host {
|
|
19
|
+
* background-color: blue;
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Convert a font size to a dynamic font size.
|
|
25
|
+
* Fonts that participate in Dynamic Type should use
|
|
26
|
+
* dynamic font sizes.
|
|
27
|
+
* @param size - The initial font size including the unit (i.e. px or pt)
|
|
28
|
+
* @param unit (optional) - The unit to convert to. Use this if you want to
|
|
29
|
+
* convert to a unit other than $baselineUnit.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* Convert a font size to a dynamic font size but impose
|
|
33
|
+
* a maximum font size.
|
|
34
|
+
* @param size - The initial font size including the unit (i.e. px or pt)
|
|
35
|
+
* @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
36
|
+
* @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
37
|
+
* convert to a unit other than $baselineUnit.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* Convert a font size to a dynamic font size but impose
|
|
41
|
+
* a minimum font size.
|
|
42
|
+
* @param size - The initial font size including the unit (i.e. px or pt)
|
|
43
|
+
* @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
44
|
+
* @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
45
|
+
* convert to a unit other than $baselineUnit.
|
|
46
|
+
*/
|
|
47
|
+
/**
|
|
48
|
+
* Convert a font size to a dynamic font size but impose
|
|
49
|
+
* maximum and minimum font sizes.
|
|
50
|
+
* @param size - The initial font size including the unit (i.e. px or pt)
|
|
51
|
+
* @param minScale - The minimum scale of the font (i.e. 0.8 for a minimum 80% scale).
|
|
52
|
+
* @param maxScale - The maximum scale of the font (i.e. 2.5 for a maximum 250% scale).
|
|
53
|
+
* @param unit (optional) - The unit to convert the initial font size to. Use this if you want to
|
|
54
|
+
* convert to a unit other than $baselineUnit.
|
|
55
|
+
*/
|
|
56
|
+
.action-sheet-button-label-has-rich-content,
|
|
57
|
+
.alert-radio-label-has-rich-content,
|
|
58
|
+
.alert-checkbox-label-has-rich-content,
|
|
59
|
+
.select-option-label-has-rich-content {
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
gap: 16px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Outer label container has rich content
|
|
67
|
+
* (start, content, description, end) that needs the
|
|
68
|
+
* label to span the available row width.
|
|
69
|
+
*/
|
|
70
|
+
.action-sheet-button-label-has-rich-content,
|
|
71
|
+
.alert-radio-label-has-rich-content,
|
|
72
|
+
.alert-checkbox-label-has-rich-content,
|
|
73
|
+
.select-option-content {
|
|
74
|
+
flex: 1;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.action-sheet-button-label-text,
|
|
78
|
+
.alert-checkbox-label-text,
|
|
79
|
+
.alert-radio-label-text,
|
|
80
|
+
.select-option-label-text {
|
|
81
|
+
display: flex;
|
|
82
|
+
align-items: center;
|
|
83
|
+
gap: 12px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.select-option-start,
|
|
87
|
+
.select-option-end {
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
gap: 8px;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.select-option-description {
|
|
94
|
+
padding-left: 0;
|
|
95
|
+
padding-right: 0;
|
|
96
|
+
padding-top: 5px;
|
|
97
|
+
padding-bottom: 0;
|
|
98
|
+
display: block;
|
|
99
|
+
color: var(--ion-color-step-700, var(--ion-text-color-step-300, #4d4d4d));
|
|
100
|
+
font-size: 0.75rem;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Non-rich labels are plain text and should ellipsize when they
|
|
105
|
+
* overflow the row. Rich-content labels switch to flex so the
|
|
106
|
+
* start / content / end pieces can lay out side-by-side and wrap.
|
|
107
|
+
*/
|
|
108
|
+
.select-option-label:not(.select-option-label-has-rich-content) {
|
|
109
|
+
text-overflow: ellipsis;
|
|
110
|
+
white-space: nowrap;
|
|
111
|
+
overflow: hidden;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.select-option-label-has-rich-content {
|
|
115
|
+
display: flex;
|
|
116
|
+
align-items: center;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
ion-radio.select-option-has-rich-content::part(label),
|
|
120
|
+
ion-checkbox.select-option-has-rich-content::part(label),
|
|
121
|
+
.select-option-content {
|
|
122
|
+
flex: 1;
|
|
123
|
+
/**
|
|
124
|
+
* Let rich content wrap instead of inheriting the label part's
|
|
125
|
+
* single-line truncation, so arbitrary slotted elements render
|
|
126
|
+
* without clipping.
|
|
127
|
+
*/
|
|
128
|
+
white-space: normal;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Cap slotted children so they can't stretch the option
|
|
133
|
+
* row out of proportion, keeping rows visually uniform
|
|
134
|
+
* regardless of the content.
|
|
135
|
+
*/
|
|
136
|
+
.select-option-start > ion-avatar,
|
|
137
|
+
.select-option-end > ion-avatar {
|
|
138
|
+
width: 40px;
|
|
139
|
+
height: 40px;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
.select-option-start > ion-icon,
|
|
143
|
+
.select-option-end > ion-icon {
|
|
144
|
+
width: 24px;
|
|
145
|
+
height: 24px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.select-option-start > ion-img,
|
|
149
|
+
.select-option-start > img,
|
|
150
|
+
.select-option-start > svg,
|
|
151
|
+
.select-option-start > ion-thumbnail,
|
|
152
|
+
.select-option-end > ion-img,
|
|
153
|
+
.select-option-end > img,
|
|
154
|
+
.select-option-end > svg,
|
|
155
|
+
.select-option-end > ion-thumbnail {
|
|
156
|
+
width: 56px;
|
|
157
|
+
height: 56px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.select-option-start > video,
|
|
161
|
+
.select-option-end > video {
|
|
162
|
+
width: 114px;
|
|
163
|
+
height: 56px;
|
|
164
|
+
}
|
|
165
|
+
|
|
1
166
|
/**
|
|
2
167
|
* Convert a font size to a dynamic font size.
|
|
3
168
|
* Fonts that participate in Dynamic Type should use
|
|
@@ -242,6 +407,39 @@
|
|
|
242
407
|
min-height: inherit;
|
|
243
408
|
}
|
|
244
409
|
|
|
410
|
+
/**
|
|
411
|
+
* Label is on the right of the radio in LTR and
|
|
412
|
+
* on the left in RTL.
|
|
413
|
+
*/
|
|
414
|
+
.radio-label-placement-start,
|
|
415
|
+
.checkbox-label-placement-start {
|
|
416
|
+
flex-direction: row-reverse;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Label is on the left of the radio in LTR and
|
|
421
|
+
* on the right in RTL.
|
|
422
|
+
*/
|
|
423
|
+
.radio-label-placement-end,
|
|
424
|
+
.checkbox-label-placement-end {
|
|
425
|
+
flex-direction: row;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
.radio-justify-start,
|
|
429
|
+
.checkbox-justify-start {
|
|
430
|
+
justify-content: start;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
.radio-justify-end,
|
|
434
|
+
.checkbox-justify-end {
|
|
435
|
+
justify-content: end;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
.radio-justify-space-between,
|
|
439
|
+
.checkbox-justify-space-between {
|
|
440
|
+
justify-content: space-between;
|
|
441
|
+
}
|
|
442
|
+
|
|
245
443
|
.alert-input-disabled,
|
|
246
444
|
.alert-checkbox-button-disabled .alert-button-inner,
|
|
247
445
|
.alert-radio-button-disabled .alert-button-inner {
|
|
@@ -419,10 +617,10 @@ textarea.alert-input {
|
|
|
419
617
|
}
|
|
420
618
|
|
|
421
619
|
.alert-head {
|
|
422
|
-
-webkit-padding-start:
|
|
423
|
-
padding-inline-start:
|
|
424
|
-
-webkit-padding-end:
|
|
425
|
-
padding-inline-end:
|
|
620
|
+
-webkit-padding-start: 24px;
|
|
621
|
+
padding-inline-start: 24px;
|
|
622
|
+
-webkit-padding-end: 24px;
|
|
623
|
+
padding-inline-end: 24px;
|
|
426
624
|
padding-top: 20px;
|
|
427
625
|
padding-bottom: 15px;
|
|
428
626
|
text-align: start;
|
|
@@ -522,30 +720,56 @@ textarea.alert-input {
|
|
|
522
720
|
}
|
|
523
721
|
|
|
524
722
|
.alert-radio-label {
|
|
525
|
-
-webkit-padding-start: 52px;
|
|
526
|
-
padding-inline-start: 52px;
|
|
527
|
-
-webkit-padding-end: 26px;
|
|
528
|
-
padding-inline-end: 26px;
|
|
529
723
|
padding-top: 13px;
|
|
530
724
|
padding-bottom: 13px;
|
|
531
|
-
|
|
725
|
+
max-width: calc(100% - 20px);
|
|
532
726
|
color: var(--ion-color-step-850, var(--ion-text-color-step-150, #262626));
|
|
533
727
|
font-size: 1rem;
|
|
534
728
|
}
|
|
535
729
|
|
|
730
|
+
.radio-label-placement-end .alert-radio-label {
|
|
731
|
+
/**
|
|
732
|
+
* The label's inline padding clears space for the icon on the icon's side.
|
|
733
|
+
* When the label is placed at the end, the icon is at the start, so the
|
|
734
|
+
* larger padding clears it on the start side.
|
|
735
|
+
*/
|
|
736
|
+
-webkit-padding-start: 56px;
|
|
737
|
+
padding-inline-start: 56px;
|
|
738
|
+
-webkit-padding-end: 24px;
|
|
739
|
+
padding-inline-end: 24px;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
.radio-label-placement-start .alert-radio-label {
|
|
743
|
+
/**
|
|
744
|
+
* The label's inline padding clears space for the icon on the icon's side.
|
|
745
|
+
* When the label is placed at the start, the icon is at the end, so the
|
|
746
|
+
* larger padding clears it on the end side.
|
|
747
|
+
*/
|
|
748
|
+
-webkit-padding-start: 24px;
|
|
749
|
+
padding-inline-start: 24px;
|
|
750
|
+
-webkit-padding-end: 56px;
|
|
751
|
+
padding-inline-end: 56px;
|
|
752
|
+
}
|
|
753
|
+
|
|
536
754
|
.alert-radio-icon {
|
|
537
755
|
top: 0;
|
|
538
756
|
border-radius: 50%;
|
|
539
757
|
display: block;
|
|
540
758
|
position: relative;
|
|
759
|
+
flex-shrink: 0;
|
|
541
760
|
width: 20px;
|
|
542
761
|
height: 20px;
|
|
543
762
|
border-width: 2px;
|
|
544
763
|
border-style: solid;
|
|
545
764
|
border-color: var(--ion-color-step-550, var(--ion-background-color-step-550, #737373));
|
|
546
765
|
}
|
|
547
|
-
|
|
548
|
-
|
|
766
|
+
|
|
767
|
+
.radio-label-placement-end .alert-radio-icon {
|
|
768
|
+
inset-inline-start: 24px;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
.radio-label-placement-start .alert-radio-icon {
|
|
772
|
+
inset-inline-end: 24px;
|
|
549
773
|
}
|
|
550
774
|
|
|
551
775
|
.alert-radio-inner {
|
|
@@ -575,22 +799,42 @@ textarea.alert-input {
|
|
|
575
799
|
}
|
|
576
800
|
|
|
577
801
|
.alert-checkbox-label {
|
|
578
|
-
-webkit-padding-start: 53px;
|
|
579
|
-
padding-inline-start: 53px;
|
|
580
|
-
-webkit-padding-end: 26px;
|
|
581
|
-
padding-inline-end: 26px;
|
|
582
802
|
padding-top: 13px;
|
|
583
803
|
padding-bottom: 13px;
|
|
584
|
-
|
|
585
|
-
width: calc(100% - 53px);
|
|
804
|
+
max-width: calc(100% - 16px);
|
|
586
805
|
color: var(--ion-color-step-850, var(--ion-text-color-step-150, #262626));
|
|
587
806
|
font-size: 1rem;
|
|
588
807
|
}
|
|
589
808
|
|
|
809
|
+
.checkbox-label-placement-end .alert-checkbox-label {
|
|
810
|
+
/**
|
|
811
|
+
* The label's inline padding clears space for the icon on the icon's side.
|
|
812
|
+
* When the label is placed at the end, the icon is at the start, so the
|
|
813
|
+
* larger padding clears it on the start side.
|
|
814
|
+
*/
|
|
815
|
+
-webkit-padding-start: 56px;
|
|
816
|
+
padding-inline-start: 56px;
|
|
817
|
+
-webkit-padding-end: 24px;
|
|
818
|
+
padding-inline-end: 24px;
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
.checkbox-label-placement-start .alert-checkbox-label {
|
|
822
|
+
/**
|
|
823
|
+
* The label's inline padding clears space for the icon on the icon's side.
|
|
824
|
+
* When the label is placed at the start, the icon is at the end, so the
|
|
825
|
+
* larger padding clears it on the end side.
|
|
826
|
+
*/
|
|
827
|
+
-webkit-padding-start: 24px;
|
|
828
|
+
padding-inline-start: 24px;
|
|
829
|
+
-webkit-padding-end: 56px;
|
|
830
|
+
padding-inline-end: 56px;
|
|
831
|
+
}
|
|
832
|
+
|
|
590
833
|
.alert-checkbox-icon {
|
|
591
834
|
top: 0;
|
|
592
835
|
border-radius: 2px;
|
|
593
836
|
position: relative;
|
|
837
|
+
flex-shrink: 0;
|
|
594
838
|
width: 16px;
|
|
595
839
|
height: 16px;
|
|
596
840
|
border-width: 2px;
|
|
@@ -598,8 +842,13 @@ textarea.alert-input {
|
|
|
598
842
|
border-color: var(--ion-color-step-550, var(--ion-background-color-step-550, #737373));
|
|
599
843
|
contain: strict;
|
|
600
844
|
}
|
|
601
|
-
|
|
602
|
-
|
|
845
|
+
|
|
846
|
+
.checkbox-label-placement-end .alert-checkbox-icon {
|
|
847
|
+
inset-inline-start: 24px;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
.checkbox-label-placement-start .alert-checkbox-icon {
|
|
851
|
+
inset-inline-end: 24px;
|
|
603
852
|
}
|
|
604
853
|
|
|
605
854
|
[aria-checked=true] .alert-checkbox-icon {
|
|
@@ -658,7 +907,7 @@ textarea.alert-input {
|
|
|
658
907
|
overflow: hidden;
|
|
659
908
|
}
|
|
660
909
|
|
|
661
|
-
.alert-button-inner {
|
|
910
|
+
.alert-button-group .alert-button-inner {
|
|
662
911
|
justify-content: flex-end;
|
|
663
912
|
}
|
|
664
913
|
|
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { Host, h } from "@stencil/core";
|
|
5
5
|
import { inheritAttributes } from "../../utils/helpers";
|
|
6
|
+
import { printIonWarning } from "../../utils/logging/index";
|
|
6
7
|
import { getIonMode } from "../../global/ionic-global";
|
|
7
8
|
/**
|
|
9
|
+
* @deprecated
|
|
10
|
+
*
|
|
8
11
|
* @part image - The inner `img` element.
|
|
9
12
|
*/
|
|
10
13
|
export class Img {
|
|
@@ -24,6 +27,8 @@ export class Img {
|
|
|
24
27
|
this.inheritedAttributes = inheritAttributes(this.el, ['draggable']);
|
|
25
28
|
}
|
|
26
29
|
componentDidLoad() {
|
|
30
|
+
printIonWarning('[ion-img] - This component is deprecated and will be removed in Ionic v10. ' +
|
|
31
|
+
'Use a native <img> with the loading="lazy" attribute instead.', this.el);
|
|
27
32
|
this.addIO();
|
|
28
33
|
}
|
|
29
34
|
disconnectedCallback() {
|
|
@@ -76,7 +81,7 @@ export class Img {
|
|
|
76
81
|
render() {
|
|
77
82
|
const { loadSrc, alt, onLoad, loadError, inheritedAttributes } = this;
|
|
78
83
|
const { draggable } = inheritedAttributes;
|
|
79
|
-
return (h(Host, { key: '
|
|
84
|
+
return (h(Host, { key: '57bfb44d9850381fe7b6fcf0c9019b03f7ef86ec', class: getIonMode(this) }, h("img", { key: '888ec06a266fa2751fc0147ede6a567f4e2b29a6', decoding: "async", src: loadSrc, alt: alt, onLoad: onLoad, onError: loadError, part: "image", draggable: isDraggable(draggable) })));
|
|
80
85
|
}
|
|
81
86
|
static get is() { return "ion-img"; }
|
|
82
87
|
static get encapsulation() { return "shadow"; }
|
|
@@ -56,7 +56,7 @@ export class Input {
|
|
|
56
56
|
/**
|
|
57
57
|
* Whether auto correction should be enabled when the user is entering/editing the text value.
|
|
58
58
|
*/
|
|
59
|
-
this.autocorrect =
|
|
59
|
+
this.autocorrect = false;
|
|
60
60
|
/**
|
|
61
61
|
* Sets the [`autofocus` attribute](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus) on the native input element.
|
|
62
62
|
*
|
|
@@ -540,7 +540,7 @@ export class Input {
|
|
|
540
540
|
* TODO(FW-5592): Remove hasStartEndSlots condition
|
|
541
541
|
*/
|
|
542
542
|
const labelShouldFloat = labelPlacement === 'stacked' || (labelPlacement === 'floating' && (hasValue || hasFocus || hasStartEndSlots));
|
|
543
|
-
return (h(Host, { key: '
|
|
543
|
+
return (h(Host, { key: '6a05f61339d8045285d5820c2508296cc842c210', class: createColorClasses(this.color, {
|
|
544
544
|
[mode]: true,
|
|
545
545
|
'has-value': hasValue,
|
|
546
546
|
'has-focus': hasFocus,
|
|
@@ -551,14 +551,14 @@ export class Input {
|
|
|
551
551
|
'in-item': inItem,
|
|
552
552
|
'in-item-color': hostContext('ion-item.ion-color', this.el),
|
|
553
553
|
'input-disabled': disabled,
|
|
554
|
-
}) }, h("label", { key: '
|
|
554
|
+
}) }, h("label", { key: 'b546d66f53ea25082494e3a4cb0ce7532ee649d7', class: "input-wrapper", htmlFor: inputId, onClick: this.onLabelClick }, this.renderLabelContainer(), h("div", { key: '6af832f2b25fadee7a49adb999166dbc97565e2d', class: "native-wrapper", onClick: this.onLabelClick }, h("slot", { key: 'e7a8895038a8d2503f646acfda20c6c1a99c2839', name: "start" }), h("input", Object.assign({ key: 'ce85703e0434a6322bb4275a924e3cd91c79fa20', class: "native-input", ref: (input) => (this.nativeInput = input), id: inputId, disabled: disabled, autoCapitalize: this.autocapitalize, autoComplete: this.autocomplete, autoCorrect: this.autocorrect ? 'on' : 'off', autoFocus: this.autofocus, enterKeyHint: this.enterkeyhint, inputMode: this.inputmode, min: this.min, max: this.max, minLength: this.minlength, maxLength: this.maxlength, multiple: this.multiple, name: this.name, pattern: this.pattern, placeholder: this.placeholder || '', readOnly: readonly, required: this.required, spellcheck: this.spellcheck, step: this.step, type: this.type, value: value, onInput: this.onInput, onChange: this.onChange, onBlur: this.onBlur, onFocus: this.onFocus, onKeyDown: this.onKeydown, onCompositionstart: this.onCompositionStart, onCompositionend: this.onCompositionEnd, "aria-describedby": this.getHintTextID(), "aria-invalid": this.isInvalid ? 'true' : undefined, "aria-labelledby": this.getLabelledById() }, this.inheritedAttributes)), this.clearInput && !readonly && !disabled && (h("button", { key: '1e59589fc89a37d7830dc915b4c19d26a8f568c7', "aria-label": "reset", type: "button", class: "input-clear-icon", onPointerDown: (ev) => {
|
|
555
555
|
/**
|
|
556
556
|
* This prevents mobile browsers from
|
|
557
557
|
* blurring the input when the clear
|
|
558
558
|
* button is activated.
|
|
559
559
|
*/
|
|
560
560
|
ev.preventDefault();
|
|
561
|
-
}, onClick: this.clearTextInput }, h("ion-icon", { key: '
|
|
561
|
+
}, onClick: this.clearTextInput }, h("ion-icon", { key: '7d443c5061bf6436d3b77a2444676c679b3e62e4', "aria-hidden": "true", icon: clearIconData }))), h("slot", { key: '5516f88d46886348217570ec1fadda0b79b63c01', name: "end" })), shouldRenderHighlight && h("div", { key: '2a1fdb7e7c974654dfbb3afb4fbfd9204e9d9092', class: "input-highlight" })), this.renderBottomContent()));
|
|
562
562
|
}
|
|
563
563
|
static get is() { return "ion-input"; }
|
|
564
564
|
static get encapsulation() { return "scoped"; }
|
|
@@ -650,11 +650,11 @@ export class Input {
|
|
|
650
650
|
"defaultValue": "'off'"
|
|
651
651
|
},
|
|
652
652
|
"autocorrect": {
|
|
653
|
-
"type": "
|
|
653
|
+
"type": "boolean",
|
|
654
654
|
"mutable": false,
|
|
655
655
|
"complexType": {
|
|
656
|
-
"original": "
|
|
657
|
-
"resolved": "
|
|
656
|
+
"original": "boolean",
|
|
657
|
+
"resolved": "boolean",
|
|
658
658
|
"references": {}
|
|
659
659
|
},
|
|
660
660
|
"required": false,
|
|
@@ -667,7 +667,7 @@ export class Input {
|
|
|
667
667
|
"setter": false,
|
|
668
668
|
"reflect": false,
|
|
669
669
|
"attribute": "autocorrect",
|
|
670
|
-
"defaultValue": "
|
|
670
|
+
"defaultValue": "false"
|
|
671
671
|
},
|
|
672
672
|
"autofocus": {
|
|
673
673
|
"type": "boolean",
|
|
@@ -5,7 +5,7 @@ import { Host, h } from "@stencil/core";
|
|
|
5
5
|
import { ENABLE_HTML_CONTENT_DEFAULT } from "../../utils/config";
|
|
6
6
|
import { raf } from "../../utils/helpers";
|
|
7
7
|
import { createLockController } from "../../utils/lock-controller";
|
|
8
|
-
import { BACKDROP, dismiss, eventMethod, prepareOverlay, present,
|
|
8
|
+
import { BACKDROP, cleanupRootFocusTrapAccessibility, createDelegateController, createTriggerController, dismiss, eventMethod, prepareOverlay, present, setOverlayId, } from "../../utils/overlays";
|
|
9
9
|
import { sanitizeDOMString } from "../../utils/sanitization/index";
|
|
10
10
|
import { getClassMap } from "../../utils/theme";
|
|
11
11
|
import { config } from "../../global/config";
|
|
@@ -114,6 +114,10 @@ export class Loading {
|
|
|
114
114
|
}
|
|
115
115
|
disconnectedCallback() {
|
|
116
116
|
this.triggerController.removeClickListener();
|
|
117
|
+
// Clean up aria-hidden if removed without dismiss() being called
|
|
118
|
+
if (this.presented) {
|
|
119
|
+
cleanupRootFocusTrapAccessibility();
|
|
120
|
+
}
|
|
117
121
|
}
|
|
118
122
|
/**
|
|
119
123
|
* Present the loading overlay after it has been created.
|
|
@@ -179,9 +183,9 @@ export class Loading {
|
|
|
179
183
|
* Otherwise, don't set aria-labelledby.
|
|
180
184
|
*/
|
|
181
185
|
const ariaLabelledBy = message !== undefined ? msgId : null;
|
|
182
|
-
return (h(Host, Object.assign({ key: '
|
|
186
|
+
return (h(Host, Object.assign({ key: 'ab48bfcee8f7e3e33847a2f262fdc08b9ea804ca', role: "dialog", "aria-modal": "true", "aria-labelledby": ariaLabelledBy, tabindex: "-1" }, htmlAttributes, { style: {
|
|
183
187
|
zIndex: `${40000 + this.overlayIndex}`,
|
|
184
|
-
}, onIonBackdropTap: this.onBackdropTap, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'overlay-hidden': true, 'loading-translucent': this.translucent }) }), h("ion-backdrop", { key: '
|
|
188
|
+
}, onIonBackdropTap: this.onBackdropTap, class: Object.assign(Object.assign({}, getClassMap(this.cssClass)), { [mode]: true, 'overlay-hidden': true, 'loading-translucent': this.translucent }) }), h("ion-backdrop", { key: '41baccc7fb6474389a3a3431c208e829ef738b75', visible: this.showBackdrop, tappable: this.backdropDismiss }), h("div", { key: '7b7290974abbe8db8739b19835aca9f8b5c271c2', tabindex: "0", "aria-hidden": "true" }), h("div", { key: 'e32466abfcc92aaad47ea03b1dcb49f66abe4b63', class: "loading-wrapper ion-overlay-wrapper" }, spinner && (h("div", { key: 'c5e6e6f9e3f39dba0225d08d7dd2c1b96a1d83c7', class: "loading-spinner" }, h("ion-spinner", { key: 'f428038959d879404ea898011363aac0b807ad11', name: spinner, "aria-hidden": "true" }))), message !== undefined && this.renderLoadingMessage(msgId)), h("div", { key: '490e531367b86c319fa4260722dcff4dd631fa88', tabindex: "0", "aria-hidden": "true" })));
|
|
185
189
|
}
|
|
186
190
|
static get is() { return "ion-loading"; }
|
|
187
191
|
static get encapsulation() { return "scoped"; }
|
|
@@ -126,14 +126,6 @@ ion-backdrop {
|
|
|
126
126
|
z-index: 10;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
/**
|
|
130
|
-
* The wrapper receives programmatic focus for screen readers but should not
|
|
131
|
-
* show a visible focus ring, which is meant only for keyboard navigation.
|
|
132
|
-
*/
|
|
133
|
-
.modal-wrapper {
|
|
134
|
-
outline: none;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
129
|
.modal-shadow {
|
|
138
130
|
position: absolute;
|
|
139
131
|
background: transparent;
|
|
@@ -8,7 +8,7 @@ import { raf, inheritAttributes, hasLazyBuild, getElementRoot } from "../../util
|
|
|
8
8
|
import { createLockController } from "../../utils/lock-controller";
|
|
9
9
|
import { printIonWarning } from "../../utils/logging/index";
|
|
10
10
|
import { Style as StatusBarStyle, StatusBar } from "../../utils/native/status-bar";
|
|
11
|
-
import {
|
|
11
|
+
import { BACKDROP, cleanupRootFocusTrapAccessibility, createTriggerController, dismiss, eventMethod, FOCUS_TRAP_DISABLE_CLASS, GESTURE, prepareOverlay, present, setOverlayId, } from "../../utils/overlays";
|
|
12
12
|
import { getClassMap } from "../../utils/theme";
|
|
13
13
|
import { deepReady, waitForMount } from "../../utils/transition/index";
|
|
14
14
|
import { config } from "../../global/config";
|
|
@@ -77,13 +77,20 @@ export class Modal {
|
|
|
77
77
|
/**
|
|
78
78
|
* The interaction behavior for the sheet modal when the handle is pressed.
|
|
79
79
|
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
80
|
+
* Handle behavior is unavailable when the `handle` property is set to
|
|
81
|
+
* `false` or when the `breakpoints` property is not set (using a
|
|
82
|
+
* fullscreen or card modal).
|
|
82
83
|
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
84
|
+
* Set to `"cycle"` to make the handle focusable and let the sheet modal
|
|
85
|
+
* cycle between available breakpoints when pressed. This keeps the sheet
|
|
86
|
+
* operable with assistive technology.
|
|
87
|
+
*
|
|
88
|
+
* Set to `"none"` to make the handle purely decorative when pressed and
|
|
89
|
+
* removed from the tab order.
|
|
90
|
+
*
|
|
91
|
+
* Defaults to `"cycle"`.
|
|
85
92
|
*/
|
|
86
|
-
this.handleBehavior = '
|
|
93
|
+
this.handleBehavior = 'cycle';
|
|
87
94
|
/**
|
|
88
95
|
* If `true`, the modal will be dismissed when the backdrop is clicked.
|
|
89
96
|
*/
|
|
@@ -275,6 +282,10 @@ export class Modal {
|
|
|
275
282
|
// Also called in dismiss() — intentional dual cleanup covers both
|
|
276
283
|
// dismiss-then-remove and direct DOM removal without dismiss.
|
|
277
284
|
this.cleanupSafeAreaOverrides();
|
|
285
|
+
// Clean up aria-hidden if removed without dismiss() being called
|
|
286
|
+
if (this.presented) {
|
|
287
|
+
cleanupRootFocusTrapAccessibility();
|
|
288
|
+
}
|
|
278
289
|
}
|
|
279
290
|
componentWillLoad() {
|
|
280
291
|
var _a;
|
|
@@ -1162,26 +1173,20 @@ export class Modal {
|
|
|
1162
1173
|
const isCardModal = presentingElement !== undefined && mode === 'ios';
|
|
1163
1174
|
const isHandleCycle = handleBehavior === 'cycle';
|
|
1164
1175
|
const isSheetModalWithHandle = isSheetModal && showHandle;
|
|
1165
|
-
return (h(Host, Object.assign({ key: '
|
|
1176
|
+
return (h(Host, Object.assign({ key: '528f9e354f470e22563938e7531e3f23a97e4200', "no-router": true,
|
|
1166
1177
|
// Allow the modal to be navigable when the handle is focusable
|
|
1167
1178
|
tabIndex: isHandleCycle && isSheetModalWithHandle ? 0 : -1 }, htmlAttributes, { style: {
|
|
1168
1179
|
zIndex: `${20000 + this.overlayIndex}`,
|
|
1169
|
-
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '
|
|
1180
|
+
}, class: Object.assign({ [mode]: true, ['modal-default']: !isCardModal && !isSheetModal, [`modal-card`]: isCardModal, [`modal-sheet`]: isSheetModal, [`modal-no-expand-scroll`]: isSheetModal && !expandToScroll, 'overlay-hidden': true, [FOCUS_TRAP_DISABLE_CLASS]: focusTrap === false }, getClassMap(this.cssClass)), onIonBackdropTap: this.onBackdropTap, onIonModalDidPresent: this.onLifecycle, onIonModalWillPresent: this.onLifecycle, onIonModalWillDismiss: this.onLifecycle, onIonModalDidDismiss: this.onLifecycle, onFocus: this.onModalFocus }), h("ion-backdrop", { key: '53983c96bc6b30df89986c8d9c978a8e6f78fe80', ref: (el) => (this.backdropEl = el), visible: this.showBackdrop, tappable: this.backdropDismiss, part: "backdrop" }), mode === 'ios' && h("div", { key: '34288a7343b7c47fed00d3abc73957f45f06d2fd', class: "modal-shadow" }), h("div", Object.assign({ key: 'f9b37f547bd5c61037bbad1a71bfed80ba8c630b',
|
|
1170
1181
|
/*
|
|
1171
1182
|
role and aria-modal must be used on the
|
|
1172
1183
|
same element. They must also be set inside the
|
|
1173
1184
|
shadow DOM otherwise ion-button will not be highlighted
|
|
1174
1185
|
when using VoiceOver: https://bugs.webkit.org/show_bug.cgi?id=247134
|
|
1175
|
-
|
|
1176
|
-
tabIndex={-1} is required so present() can move focus to this
|
|
1177
|
-
element (which carries the dialog role) instead of the role-less
|
|
1178
|
-
host. role="dialog" alone does not make an element focusable, so
|
|
1179
|
-
without the tabindex focus() would be a no-op and screen readers
|
|
1180
|
-
may not properly announce the dialog and its content when it opens.
|
|
1181
1186
|
*/
|
|
1182
|
-
role: "dialog" }, inheritedAttributes, { "aria-modal": "true",
|
|
1187
|
+
role: "dialog" }, inheritedAttributes, { "aria-modal": "true", class: "modal-wrapper ion-overlay-wrapper", part: "content", ref: (el) => (this.wrapperEl = el) }), showHandle && (h("button", { key: 'b8741594108d3ea681ff41ff8f2241a4119578b1', class: "modal-handle",
|
|
1183
1188
|
// Prevents the handle from receiving keyboard focus when it does not cycle
|
|
1184
|
-
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: '
|
|
1189
|
+
tabIndex: !isHandleCycle ? -1 : 0, "aria-label": "Activate to adjust the size of the dialog overlaying the screen", onClick: isHandleCycle ? this.onHandleClick : undefined, part: "handle", ref: (el) => (this.dragHandleEl = el) })), h("slot", { key: 'bcc7960fae3fed09076c704d08c3afc46caa0738', onSlotchange: this.onSlotChange }))));
|
|
1185
1190
|
}
|
|
1186
1191
|
static get is() { return "ion-modal"; }
|
|
1187
1192
|
static get encapsulation() { return "shadow"; }
|
|
@@ -1453,13 +1458,13 @@ export class Modal {
|
|
|
1453
1458
|
"optional": true,
|
|
1454
1459
|
"docs": {
|
|
1455
1460
|
"tags": [],
|
|
1456
|
-
"text": "The interaction behavior for the sheet modal when the handle is pressed.\n\
|
|
1461
|
+
"text": "The interaction behavior for the sheet modal when the handle is pressed.\n\nHandle behavior is unavailable when the `handle` property is set to\n`false` or when the `breakpoints` property is not set (using a\nfullscreen or card modal).\n\nSet to `\"cycle\"` to make the handle focusable and let the sheet modal\ncycle between available breakpoints when pressed. This keeps the sheet\noperable with assistive technology.\n\nSet to `\"none\"` to make the handle purely decorative when pressed and\nremoved from the tab order.\n\nDefaults to `\"cycle\"`."
|
|
1457
1462
|
},
|
|
1458
1463
|
"getter": false,
|
|
1459
1464
|
"setter": false,
|
|
1460
1465
|
"reflect": false,
|
|
1461
1466
|
"attribute": "handle-behavior",
|
|
1462
|
-
"defaultValue": "'
|
|
1467
|
+
"defaultValue": "'cycle'"
|
|
1463
1468
|
},
|
|
1464
1469
|
"component": {
|
|
1465
1470
|
"type": "string",
|
|
@@ -126,14 +126,6 @@ ion-backdrop {
|
|
|
126
126
|
z-index: 10;
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
/**
|
|
130
|
-
* The wrapper receives programmatic focus for screen readers but should not
|
|
131
|
-
* show a visible focus ring, which is meant only for keyboard navigation.
|
|
132
|
-
*/
|
|
133
|
-
.modal-wrapper {
|
|
134
|
-
outline: none;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
129
|
.modal-shadow {
|
|
138
130
|
position: absolute;
|
|
139
131
|
background: transparent;
|
|
@@ -177,6 +177,21 @@
|
|
|
177
177
|
}
|
|
178
178
|
}
|
|
179
179
|
|
|
180
|
+
:host(.select-popover-rich-content) {
|
|
181
|
+
/**
|
|
182
|
+
* Rich content options (start/end slots, descriptions) need
|
|
183
|
+
* more horizontal space than the default fixed width provides,
|
|
184
|
+
* otherwise content gets cut off.
|
|
185
|
+
*
|
|
186
|
+
* A viewport-relative value is used instead of `auto` or
|
|
187
|
+
* `max-content` because the enter animation reads `--width`
|
|
188
|
+
* via getBoundingClientRect() before the first layout pass
|
|
189
|
+
* completes. Intrinsic values return 0 at that point and
|
|
190
|
+
* cause the popover to be positioned off-screen on first open.
|
|
191
|
+
*/
|
|
192
|
+
--width: clamp(250px, calc(100vw - 40px), 400px);
|
|
193
|
+
}
|
|
194
|
+
|
|
180
195
|
/**
|
|
181
196
|
* Convert a font size to a dynamic font size.
|
|
182
197
|
* Fonts that participate in Dynamic Type should use
|