@ionic/core 7.5.8-dev.11701791090.18ebbea8 → 7.5.8-dev.11701876182.1e71e7a0
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/animation.js +12 -11
- package/components/checkbox.js +5 -3
- package/components/index4.js +10 -12
- package/components/index5.js +0 -22
- package/components/input-shims.js +12 -7
- package/components/input.utils.js +3 -2
- package/components/ion-datetime.js +2 -2
- package/components/ion-infinite-scroll.js +11 -3
- package/components/ion-input.js +33 -29
- package/components/ion-modal.js +2 -2
- package/components/ion-range.js +5 -3
- package/components/ion-select.js +44 -29
- package/components/ion-skeleton-text.js +14 -1
- package/components/ion-textarea.js +32 -32
- package/components/ion-toast.js +419 -74
- package/components/ion-toggle.js +5 -3
- package/components/item.js +2 -2
- package/components/label.js +2 -2
- package/components/overlays.js +2 -1
- package/components/radio-group.js +2 -0
- package/components/radio.js +45 -5
- package/dist/cjs/{animation-cc40e39c.js → animation-9b401d39.js} +13 -12
- package/dist/cjs/{button-active-417ccdcb.js → button-active-a5185907.js} +1 -1
- package/dist/cjs/{capacitor-46980811.js → capacitor-c04564bf.js} +1 -1
- package/dist/cjs/compare-with-utils-df1001d7.js +44 -0
- package/dist/cjs/{haptic-216df36c.js → haptic-b882e0bb.js} +1 -1
- package/dist/cjs/{index-8c1e77d6.js → index-b4f986cd.js} +1 -1
- package/dist/cjs/index-c8d52405.js +10 -0
- package/dist/cjs/{index-5cbb20f9.js → index-ce101dc9.js} +11 -13
- package/dist/cjs/{index-d4c2e02c.js → index-f8f13389.js} +2 -2
- package/dist/cjs/index.cjs.js +8 -8
- package/dist/cjs/{input-shims-87102b6a.js → input-shims-a23bb0f4.js} +15 -10
- package/dist/cjs/{input.utils-2a11c1fe.js → input.utils-3d0166a2.js} +4 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +6 -6
- package/dist/cjs/ion-alert.cjs.entry.js +6 -6
- package/dist/cjs/ion-app_8.cjs.entry.js +8 -8
- package/dist/cjs/ion-checkbox.cjs.entry.js +5 -3
- package/dist/cjs/ion-datetime_3.cjs.entry.js +7 -7
- package/dist/cjs/ion-infinite-scroll_2.cjs.entry.js +11 -3
- package/dist/cjs/ion-input.cjs.entry.js +36 -32
- package/dist/cjs/ion-item_8.cjs.entry.js +17 -4
- package/dist/cjs/ion-loading.cjs.entry.js +3 -3
- package/dist/cjs/ion-menu_3.cjs.entry.js +5 -5
- package/dist/cjs/ion-modal.cjs.entry.js +8 -8
- package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
- package/dist/cjs/ion-picker-column-internal.cjs.entry.js +3 -3
- package/dist/cjs/ion-popover.cjs.entry.js +4 -4
- package/dist/cjs/ion-radio_2.cjs.entry.js +9 -4
- package/dist/cjs/ion-range.cjs.entry.js +5 -3
- package/dist/cjs/ion-refresher_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-reorder_2.cjs.entry.js +3 -3
- package/dist/cjs/ion-select_3.cjs.entry.js +51 -35
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +4 -4
- package/dist/cjs/ion-textarea.cjs.entry.js +35 -35
- package/dist/cjs/ion-toast.cjs.entry.js +434 -92
- package/dist/cjs/ion-toggle.cjs.entry.js +8 -6
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/{ios.transition-a4ffb5a2.js → ios.transition-6787b799.js} +3 -3
- package/dist/cjs/{keyboard-9390928c.js → keyboard-0272231f.js} +1 -1
- package/dist/cjs/{keyboard-7d621ee9.js → keyboard-af1bb365.js} +3 -3
- package/dist/cjs/{keyboard-controller-2158b478.js → keyboard-controller-c05e747a.js} +2 -2
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/cjs/{md.transition-292abe1c.js → md.transition-e033d20a.js} +3 -3
- package/dist/cjs/{notch-controller-1dce508a.js → notch-controller-9735e7ac.js} +1 -1
- package/dist/cjs/{overlays-5c379703.js → overlays-27a6fb16.js} +3 -1
- package/dist/collection/components/checkbox/checkbox.ios.css +0 -6
- package/dist/collection/components/checkbox/checkbox.js +4 -1
- package/dist/collection/components/checkbox/checkbox.md.css +0 -6
- package/dist/collection/components/checkbox/test/checkbox.spec.js +14 -0
- package/dist/collection/components/datetime/datetime.ios.css +1 -0
- package/dist/collection/components/datetime/datetime.md.css +1 -0
- package/dist/collection/components/infinite-scroll/infinite-scroll.js +11 -3
- package/dist/collection/components/infinite-scroll/test/small-dom-update/infinite-scroll.e2e.js +31 -0
- package/dist/collection/components/input/input.ios.css +10 -3
- package/dist/collection/components/input/input.js +33 -27
- package/dist/collection/components/input/input.md.css +13 -12
- package/dist/collection/components/input/test/clear-on-edit/input.e2e.js +9 -21
- package/dist/collection/components/input/test/slot/input.e2e.js +51 -0
- package/dist/collection/components/item/item.ios.css +41 -3
- package/dist/collection/components/item/item.md.css +41 -3
- package/dist/collection/components/item/test/basic/item.e2e.js +1 -1
- package/dist/collection/components/item/test/disabled/item.e2e.js +0 -1
- package/dist/collection/components/label/label.ios.css +14 -3
- package/dist/collection/components/label/label.md.css +14 -3
- package/dist/collection/components/modal/gestures/swipe-to-close.js +2 -1
- package/dist/collection/components/note/test/a11y/note.e2e.js +43 -0
- package/dist/collection/components/radio/radio.ios.css +0 -6
- package/dist/collection/components/radio/radio.js +7 -3
- package/dist/collection/components/radio/radio.md.css +0 -6
- package/dist/collection/components/radio/test/radio.spec.js +14 -0
- package/dist/collection/components/radio-group/radio-group.js +24 -0
- package/dist/collection/components/radio-group/test/radio-group.spec.js +69 -0
- package/dist/collection/components/range/range.ios.css +0 -6
- package/dist/collection/components/range/range.js +4 -1
- package/dist/collection/components/range/range.md.css +0 -6
- package/dist/collection/components/range/test/range.spec.js +16 -0
- package/dist/collection/components/select/select.ios.css +60 -7
- package/dist/collection/components/select/select.js +45 -28
- package/dist/collection/components/select/select.md.css +63 -19
- package/dist/collection/components/select/test/item/select.e2e.js +15 -0
- package/dist/collection/components/select/test/label/select.e2e.js +1 -1
- package/dist/collection/components/select/test/legacy/wrapping/select.e2e.js +1 -1
- package/dist/collection/components/select/test/slot/select.e2e.js +67 -0
- package/dist/collection/components/skeleton-text/skeleton-text.js +39 -0
- package/dist/collection/components/textarea/test/clear-on-edit/textarea.e2e.js +0 -28
- package/dist/collection/components/textarea/test/slot/textarea.e2e.js +51 -0
- package/dist/collection/components/textarea/textarea.ios.css +37 -5
- package/dist/collection/components/textarea/textarea.js +32 -30
- package/dist/collection/components/textarea/textarea.md.css +47 -14
- package/dist/collection/components/toast/animations/ios.enter.js +2 -1
- package/dist/collection/components/toast/animations/md.enter.js +4 -3
- package/dist/collection/components/toast/animations/utils.js +20 -14
- package/dist/collection/components/toast/gestures/swipe-to-dismiss.js +267 -0
- package/dist/collection/components/toast/test/swipe-gesture/toast.e2e.js +84 -0
- package/dist/collection/components/toast/test/toast-config.spec.js +25 -0
- package/dist/collection/components/toast/test/toast.spec.js +80 -0
- package/dist/collection/components/toast/toast.ios.css +10 -10
- package/dist/collection/components/toast/toast.js +104 -1
- package/dist/collection/components/toast/toast.md.css +10 -0
- package/dist/collection/components/toggle/test/toggle.spec.js +12 -0
- package/dist/collection/components/toggle/toggle.ios.css +0 -6
- package/dist/collection/components/toggle/toggle.js +4 -1
- package/dist/collection/components/toggle/toggle.md.css +0 -6
- package/dist/collection/utils/animation/animation.js +12 -11
- package/dist/collection/utils/animation/test/animation.spec.js +16 -0
- package/dist/collection/utils/browser/index.js +0 -22
- package/dist/collection/utils/forms/compare-with-utils.js +39 -0
- package/dist/collection/utils/forms/index.js +1 -0
- package/dist/collection/utils/input-shims/input-shims.js +12 -6
- package/dist/collection/utils/menu-controller/index.js +10 -12
- package/dist/collection/utils/overlays.js +1 -0
- package/dist/collection/utils/slot-mutation-controller.js +3 -2
- package/dist/docs.json +159 -2
- package/dist/esm/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +13 -12
- package/dist/esm/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
- package/dist/esm/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
- package/dist/esm/compare-with-utils-a96ff2ea.js +41 -0
- package/dist/esm/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
- package/dist/esm/{index-80492ed3.js → index-0c12c22b.js} +11 -13
- package/dist/esm/{index-d8817fb0.js → index-1932b201.js} +2 -2
- package/dist/esm/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
- package/dist/esm/index-a5d50daf.js +7 -0
- package/dist/esm/index.js +8 -8
- package/dist/esm/{input-shims-0a2e541d.js → input-shims-6539ce13.js} +14 -9
- package/dist/esm/{input.utils-2846d430.js → input.utils-a5a2d164.js} +4 -3
- package/dist/esm/ion-action-sheet.entry.js +6 -6
- package/dist/esm/ion-alert.entry.js +6 -6
- package/dist/esm/ion-app_8.entry.js +8 -8
- package/dist/esm/ion-checkbox.entry.js +5 -3
- package/dist/esm/ion-datetime_3.entry.js +7 -7
- package/dist/esm/ion-infinite-scroll_2.entry.js +11 -3
- package/dist/esm/ion-input.entry.js +36 -32
- package/dist/esm/ion-item_8.entry.js +17 -4
- package/dist/esm/ion-loading.entry.js +3 -3
- package/dist/esm/ion-menu_3.entry.js +5 -5
- package/dist/esm/ion-modal.entry.js +8 -8
- package/dist/esm/ion-nav_2.entry.js +1 -1
- package/dist/esm/ion-picker-column-internal.entry.js +3 -3
- package/dist/esm/ion-popover.entry.js +4 -4
- package/dist/esm/ion-radio_2.entry.js +9 -4
- package/dist/esm/ion-range.entry.js +5 -3
- package/dist/esm/ion-refresher_2.entry.js +4 -4
- package/dist/esm/ion-reorder_2.entry.js +3 -3
- package/dist/esm/ion-select_3.entry.js +47 -31
- package/dist/esm/ion-tab-bar_2.entry.js +4 -4
- package/dist/esm/ion-textarea.entry.js +35 -35
- package/dist/esm/ion-toast.entry.js +417 -75
- package/dist/esm/ion-toggle.entry.js +8 -6
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +3 -3
- package/dist/esm/{keyboard-c402e885.js → keyboard-52278bd7.js} +3 -3
- package/dist/esm/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
- package/dist/esm/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +2 -2
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{md.transition-94ac93e1.js → md.transition-43c2874d.js} +3 -3
- package/dist/esm/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
- package/dist/esm/{overlays-abf58489.js → overlays-32ef481d.js} +3 -2
- package/dist/esm-es5/{animation-fb0e0f6f.js → animation-dde8cc0d.js} +1 -1
- package/dist/esm-es5/{button-active-3fdf3e4f.js → button-active-c6ee4f50.js} +1 -1
- package/dist/esm-es5/{capacitor-b0e5fe83.js → capacitor-59395cbd.js} +1 -1
- package/dist/esm-es5/compare-with-utils-a96ff2ea.js +4 -0
- package/dist/esm-es5/{haptic-152c4172.js → haptic-554688a5.js} +1 -1
- package/dist/esm-es5/index-0c12c22b.js +4 -0
- package/dist/esm-es5/{index-d8817fb0.js → index-1932b201.js} +1 -1
- package/dist/esm-es5/{index-ba9976bb.js → index-82eeb47f.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- package/dist/esm-es5/input-shims-6539ce13.js +4 -0
- package/dist/esm-es5/input.utils-a5a2d164.js +4 -0
- package/dist/esm-es5/ion-action-sheet.entry.js +1 -1
- package/dist/esm-es5/ion-alert.entry.js +1 -1
- package/dist/esm-es5/ion-app_8.entry.js +1 -1
- package/dist/esm-es5/ion-checkbox.entry.js +1 -1
- package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
- package/dist/esm-es5/ion-infinite-scroll_2.entry.js +1 -1
- package/dist/esm-es5/ion-input.entry.js +1 -1
- package/dist/esm-es5/ion-item_8.entry.js +1 -1
- package/dist/esm-es5/ion-loading.entry.js +1 -1
- package/dist/esm-es5/ion-menu_3.entry.js +1 -1
- package/dist/esm-es5/ion-modal.entry.js +1 -1
- package/dist/esm-es5/ion-nav_2.entry.js +1 -1
- package/dist/esm-es5/ion-picker-column-internal.entry.js +1 -1
- package/dist/esm-es5/ion-popover.entry.js +1 -1
- package/dist/esm-es5/ion-radio_2.entry.js +1 -1
- package/dist/esm-es5/ion-range.entry.js +1 -1
- package/dist/esm-es5/ion-refresher_2.entry.js +1 -1
- package/dist/esm-es5/ion-reorder_2.entry.js +1 -1
- package/dist/esm-es5/ion-select_3.entry.js +1 -1
- package/dist/esm-es5/ion-tab-bar_2.entry.js +1 -1
- package/dist/esm-es5/ion-textarea.entry.js +1 -1
- package/dist/esm-es5/ion-toast.entry.js +1 -1
- package/dist/esm-es5/ion-toggle.entry.js +1 -1
- package/dist/esm-es5/ionic.js +1 -1
- package/dist/esm-es5/{ios.transition-fd16bec1.js → ios.transition-802a84a6.js} +1 -1
- package/dist/esm-es5/{keyboard-c402e885.js → keyboard-52278bd7.js} +1 -1
- package/dist/esm-es5/{keyboard-dbb05fb9.js → keyboard-73175e24.js} +1 -1
- package/dist/esm-es5/{keyboard-controller-5d90929a.js → keyboard-controller-ec5c2bfa.js} +1 -1
- package/dist/esm-es5/loader.js +1 -1
- package/dist/esm-es5/md.transition-43c2874d.js +4 -0
- package/dist/esm-es5/{notch-controller-d09b6aca.js → notch-controller-fea7f9c5.js} +1 -1
- package/dist/esm-es5/{overlays-abf58489.js → overlays-32ef481d.js} +1 -1
- package/dist/html.html-data.json +14 -1
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/p-01d14eba.system.entry.js +4 -0
- package/dist/ionic/{p-3de71759.entry.js → p-042e6f4b.entry.js} +1 -1
- package/dist/ionic/p-05d83227.system.entry.js +4 -0
- package/dist/ionic/{p-32e19bee.system.js → p-0bd51c34.system.js} +1 -1
- package/dist/ionic/{p-73637557.system.entry.js → p-16756e94.system.entry.js} +1 -1
- package/dist/ionic/p-1b19c04b.entry.js +4 -0
- package/dist/ionic/{p-95c26010.system.js → p-1cca10d6.system.js} +1 -1
- package/dist/ionic/p-1e4371bd.js +4 -0
- package/dist/ionic/{p-0519cd21.entry.js → p-251666e2.entry.js} +1 -1
- package/dist/ionic/{p-4e8e09e1.js → p-27281edd.js} +1 -1
- package/dist/ionic/p-28249b10.system.entry.js +4 -0
- package/dist/ionic/p-28a2c2a2.entry.js +4 -0
- package/dist/ionic/p-29d03b3a.js +4 -0
- package/dist/ionic/p-2b7827c7.js +4 -0
- package/dist/ionic/p-2d3b9fa3.system.entry.js +4 -0
- package/dist/ionic/p-2d539df1.entry.js +4 -0
- package/dist/ionic/{p-a0126dd5.system.entry.js → p-3137c025.system.entry.js} +1 -1
- package/dist/ionic/{p-30029cc2.system.js → p-31fcb233.system.js} +1 -1
- package/dist/ionic/{p-b0dc1cf9.system.js → p-33a37fad.system.js} +1 -1
- package/dist/ionic/p-36d187af.js +4 -0
- package/dist/ionic/p-376a6063.js +4 -0
- package/dist/ionic/p-38f2c6bb.system.js +4 -0
- package/dist/ionic/{p-2ba0657d.system.entry.js → p-39c31982.system.entry.js} +1 -1
- package/dist/ionic/{p-75445583.js → p-3a75d7fd.js} +1 -1
- package/dist/ionic/{p-d40a974a.entry.js → p-3dd98a73.entry.js} +1 -1
- package/dist/ionic/p-3e6b47e8.system.entry.js +4 -0
- package/dist/ionic/p-3f5179b5.entry.js +4 -0
- package/dist/ionic/p-40f68333.system.js +4 -0
- package/dist/ionic/{p-643a8fae.js → p-42f189f4.js} +1 -1
- package/dist/ionic/{p-9c3b6849.entry.js → p-438e1b8a.entry.js} +1 -1
- package/dist/ionic/{p-b752714f.system.entry.js → p-46d400b4.system.entry.js} +1 -1
- package/dist/ionic/{p-61d7d7fb.js → p-47b6ba5b.js} +1 -1
- package/dist/ionic/{p-b04e4d62.entry.js → p-4d67d27a.entry.js} +1 -1
- package/dist/ionic/{p-0b1bc636.entry.js → p-4f3ae45a.entry.js} +1 -1
- package/dist/ionic/{p-18b6bd23.system.entry.js → p-517a9885.system.entry.js} +1 -1
- package/dist/ionic/p-53ec4f1c.system.js +4 -0
- package/dist/ionic/p-5e4eec2e.entry.js +4 -0
- package/dist/ionic/{p-57477107.system.js → p-5e745192.system.js} +1 -1
- package/dist/ionic/{p-ad019ef0.entry.js → p-5eda1d7d.entry.js} +1 -1
- package/dist/ionic/{p-4890093d.js → p-6de472cb.js} +1 -1
- package/dist/ionic/{p-08f196ce.system.entry.js → p-6de62649.system.entry.js} +1 -1
- package/dist/ionic/p-72f6ff89.js +4 -0
- package/dist/ionic/p-765f4dde.entry.js +4 -0
- package/dist/ionic/{p-3f6270b3.entry.js → p-78aadecb.entry.js} +1 -1
- package/dist/ionic/p-7d92bf15.system.entry.js +4 -0
- package/dist/ionic/p-7ee0f3f2.entry.js +4 -0
- package/dist/ionic/p-8314281e.system.js +4 -0
- package/dist/ionic/p-88d5fbd3.js +4 -0
- package/dist/ionic/{p-0e4f2e17.system.js → p-8985cdb6.system.js} +1 -1
- package/dist/ionic/{p-d7be6b7e.system.entry.js → p-8acae6b0.system.entry.js} +1 -1
- package/dist/ionic/p-8d69a624.entry.js +4 -0
- package/dist/ionic/p-8de17614.system.entry.js +4 -0
- package/dist/ionic/p-91d33c4a.js +4 -0
- package/dist/ionic/p-979d4f5c.system.js +4 -0
- package/dist/ionic/p-9b7f0b0f.entry.js +4 -0
- package/dist/ionic/p-9e447eb1.system.js +4 -0
- package/dist/ionic/p-9f6ee2c0.system.entry.js +4 -0
- package/dist/ionic/{p-94389114.system.entry.js → p-a0bb7b92.system.entry.js} +1 -1
- package/dist/ionic/{p-f2c21dae.system.js → p-a0d7bb5e.system.js} +1 -1
- package/dist/ionic/{p-82045bc1.entry.js → p-a3277a67.entry.js} +1 -1
- package/dist/ionic/{p-50880712.entry.js → p-a9978d08.entry.js} +1 -1
- package/dist/ionic/{p-3b686a65.system.entry.js → p-ada96dd0.system.entry.js} +1 -1
- package/dist/ionic/p-afd6ca9d.entry.js +4 -0
- package/dist/ionic/p-b56d0866.system.entry.js +4 -0
- package/dist/ionic/{p-67da080d.entry.js → p-b6f9d32a.entry.js} +1 -1
- package/dist/ionic/p-c61cc894.js +4 -0
- package/dist/ionic/{p-304383f9.system.js → p-cabad15b.system.js} +1 -1
- package/dist/ionic/{p-31158892.js → p-cdbeaadc.js} +1 -1
- package/dist/ionic/p-d032f825.system.entry.js +4 -0
- package/dist/ionic/p-d51674c5.system.js +4 -0
- package/dist/ionic/{p-98d82c73.system.js → p-ddbb2d5b.system.js} +1 -1
- package/dist/ionic/p-de6f8b28.system.js +4 -0
- package/dist/ionic/p-de756e5c.js +4 -0
- package/dist/ionic/{p-73ea8f82.system.entry.js → p-dee7c1d0.system.entry.js} +1 -1
- package/dist/ionic/p-dfd9432a.entry.js +4 -0
- package/dist/ionic/{p-af5cfad2.system.js → p-e24ce1e5.system.js} +1 -1
- package/dist/ionic/p-e3584231.system.js +1 -1
- package/dist/ionic/p-f0445d82.system.entry.js +4 -0
- package/dist/ionic/p-f656e032.system.entry.js +4 -0
- package/dist/ionic/{p-17f893be.js → p-f70970cf.js} +1 -1
- package/dist/ionic/{p-e553006f.system.entry.js → p-fba0a6e7.system.entry.js} +1 -1
- package/dist/ionic/p-feae5133.entry.js +4 -0
- package/dist/types/components/checkbox/checkbox.d.ts +1 -0
- package/dist/types/components/infinite-scroll/infinite-scroll.d.ts +7 -0
- package/dist/types/components/input/input.d.ts +2 -0
- package/dist/types/components/radio/radio.d.ts +1 -0
- package/dist/types/components/radio-group/radio-group-interface.d.ts +1 -0
- package/dist/types/components/radio-group/radio-group.d.ts +8 -1
- package/dist/types/components/range/range.d.ts +1 -0
- package/dist/types/components/router/router.d.ts +2 -1
- package/dist/types/components/select/select.d.ts +6 -1
- package/dist/types/components/skeleton-text/skeleton-text.d.ts +9 -1
- package/dist/types/components/textarea/textarea.d.ts +2 -0
- package/dist/types/components/toast/animations/utils.d.ts +15 -4
- package/dist/types/components/toast/gestures/swipe-to-dismiss.d.ts +9 -0
- package/dist/types/components/toast/toast-interface.d.ts +2 -0
- package/dist/types/components/toast/toast.d.ts +28 -1
- package/dist/types/components/toggle/toggle.d.ts +1 -0
- package/dist/types/components.d.ts +37 -6
- package/dist/types/interface.d.ts +1 -5
- package/dist/types/jest.d.ts +5 -0
- package/dist/types/utils/animation/animation-interface.d.ts +4 -4
- package/dist/types/utils/browser/index.d.ts +11 -2
- package/dist/types/utils/forms/compare-with-utils.d.ts +18 -0
- package/dist/types/utils/forms/index.d.ts +1 -0
- package/dist/types/utils/hardware-back-button.d.ts +4 -0
- package/dist/types/utils/overlays.d.ts +1 -0
- package/dist/types/utils/slot-mutation-controller.d.ts +2 -2
- package/hydrate/index.js +647 -230
- package/package.json +1 -1
- package/dist/cjs/index-306a7476.js +0 -32
- package/dist/collection/components/item/test/text/item.e2e.js +0 -14
- package/dist/esm/index-7a14ecec.js +0 -29
- package/dist/esm-es5/index-80492ed3.js +0 -4
- package/dist/esm-es5/input-shims-0a2e541d.js +0 -4
- package/dist/esm-es5/input.utils-2846d430.js +0 -4
- package/dist/esm-es5/md.transition-94ac93e1.js +0 -4
- package/dist/ionic/p-1d17219f.entry.js +0 -4
- package/dist/ionic/p-25b32c3d.entry.js +0 -4
- package/dist/ionic/p-2ab4e925.system.entry.js +0 -4
- package/dist/ionic/p-2d5aeccc.js +0 -4
- package/dist/ionic/p-2d600c25.system.js +0 -4
- package/dist/ionic/p-308e1341.js +0 -4
- package/dist/ionic/p-34c39c48.entry.js +0 -4
- package/dist/ionic/p-3c58a71b.js +0 -4
- package/dist/ionic/p-3e960213.system.entry.js +0 -4
- package/dist/ionic/p-3fe96156.system.js +0 -4
- package/dist/ionic/p-4a31c99f.entry.js +0 -4
- package/dist/ionic/p-5a68960f.entry.js +0 -4
- package/dist/ionic/p-6470b136.entry.js +0 -4
- package/dist/ionic/p-667df818.system.entry.js +0 -4
- package/dist/ionic/p-6c37f051.js +0 -4
- package/dist/ionic/p-765a08a7.system.entry.js +0 -4
- package/dist/ionic/p-7b8d0af2.system.entry.js +0 -4
- package/dist/ionic/p-7faba551.system.entry.js +0 -4
- package/dist/ionic/p-83af3685.system.js +0 -4
- package/dist/ionic/p-856c430d.js +0 -4
- package/dist/ionic/p-864c4046.entry.js +0 -4
- package/dist/ionic/p-93000a81.system.entry.js +0 -4
- package/dist/ionic/p-98b14ece.entry.js +0 -4
- package/dist/ionic/p-990ffd0e.js +0 -4
- package/dist/ionic/p-a6f9dd7b.entry.js +0 -4
- package/dist/ionic/p-a98dc0c1.entry.js +0 -4
- package/dist/ionic/p-a9e3b5be.system.entry.js +0 -4
- package/dist/ionic/p-ab9456e9.system.entry.js +0 -4
- package/dist/ionic/p-b4bad293.system.entry.js +0 -4
- package/dist/ionic/p-c3289ef2.entry.js +0 -4
- package/dist/ionic/p-c3d09cf2.system.entry.js +0 -4
- package/dist/ionic/p-d1cb29a8.system.entry.js +0 -4
- package/dist/ionic/p-d43f1f3d.system.js +0 -4
- package/dist/ionic/p-d662d908.js +0 -4
- package/dist/ionic/p-d9695ad9.system.js +0 -4
- package/dist/ionic/p-e4d90573.js +0 -4
- package/dist/ionic/p-f51666d3.entry.js +0 -4
- package/dist/ionic/p-f54c72b0.system.js +0 -4
- package/dist/ionic/p-f7a36cd0.system.js +0 -4
- package/dist/ionic/p-f967631d.js +0 -4
- /package/dist/esm-es5/{index-7a14ecec.js → index-a5d50daf.js} +0 -0
- /package/dist/ionic/{p-0e94957a.system.js → p-792919fd.system.js} +0 -0
- /package/dist/ionic/{p-b347cfd1.js → p-7b30edcc.js} +0 -0
|
@@ -100,6 +100,14 @@
|
|
|
100
100
|
* @prop --highlight-color-valid: The color of the highlight on the item when valid. Only applies to inputs and textareas using the legacy form syntax. DEPRECATED: Highlights can be styled on `ion-input` or `ion-textarea` when using the modern form syntax.
|
|
101
101
|
* @prop --highlight-color-invalid: The color of the highlight on the item when invalid. Only applies to inputs and textareas using the legacy form syntax. DEPRECATED: Highlights can be styled on `ion-input` or `ion-textarea` when using the modern form syntax.
|
|
102
102
|
*/
|
|
103
|
+
/**
|
|
104
|
+
* We change the minimum width as the
|
|
105
|
+
* font size changes. Using a fixed minimum
|
|
106
|
+
* width means that fewer and fewer characters
|
|
107
|
+
* can be displayed in the same space as the
|
|
108
|
+
* text grows.
|
|
109
|
+
*/
|
|
110
|
+
--inner-min-width: 4rem;
|
|
103
111
|
--border-radius: 0px;
|
|
104
112
|
--border-width: 0px;
|
|
105
113
|
--border-style: solid;
|
|
@@ -230,6 +238,7 @@
|
|
|
230
238
|
/* stylelint-enable */
|
|
231
239
|
display: flex;
|
|
232
240
|
position: relative;
|
|
241
|
+
flex-wrap: wrap;
|
|
233
242
|
align-items: inherit;
|
|
234
243
|
justify-content: inherit;
|
|
235
244
|
width: 100%;
|
|
@@ -241,8 +250,8 @@
|
|
|
241
250
|
outline: none;
|
|
242
251
|
background: var(--background);
|
|
243
252
|
overflow: inherit;
|
|
244
|
-
box-sizing: border-box;
|
|
245
253
|
z-index: 1;
|
|
254
|
+
box-sizing: border-box;
|
|
246
255
|
}
|
|
247
256
|
:host-context([dir=rtl]) .item-native {
|
|
248
257
|
padding-right: calc(var(--padding-start) + var(--ion-safe-area-right, 0px));
|
|
@@ -261,6 +270,10 @@
|
|
|
261
270
|
}
|
|
262
271
|
}
|
|
263
272
|
|
|
273
|
+
:host(.item-legacy) .item-native {
|
|
274
|
+
flex-wrap: unset;
|
|
275
|
+
}
|
|
276
|
+
|
|
264
277
|
.item-native::-moz-focus-inner {
|
|
265
278
|
border: 0;
|
|
266
279
|
}
|
|
@@ -296,10 +309,20 @@ button, a {
|
|
|
296
309
|
/* stylelint-enable */
|
|
297
310
|
display: flex;
|
|
298
311
|
position: relative;
|
|
299
|
-
flex: 1;
|
|
312
|
+
flex: 1 0 0;
|
|
300
313
|
flex-direction: inherit;
|
|
314
|
+
flex-wrap: wrap;
|
|
301
315
|
align-items: inherit;
|
|
302
316
|
align-self: stretch;
|
|
317
|
+
/**
|
|
318
|
+
* The min-width defines when the
|
|
319
|
+
* content in the default slot should
|
|
320
|
+
* stop wrapping/truncating within its own
|
|
321
|
+
* container. At this point the entire
|
|
322
|
+
* container will wrap to the next line.
|
|
323
|
+
*/
|
|
324
|
+
min-width: var(--inner-min-width);
|
|
325
|
+
max-width: 100%;
|
|
303
326
|
min-height: inherit;
|
|
304
327
|
border-width: var(--inner-border-width);
|
|
305
328
|
border-style: var(--border-style);
|
|
@@ -325,6 +348,12 @@ button, a {
|
|
|
325
348
|
}
|
|
326
349
|
}
|
|
327
350
|
|
|
351
|
+
:host(.item-legacy) .item-inner {
|
|
352
|
+
flex: 1;
|
|
353
|
+
flex-wrap: unset;
|
|
354
|
+
max-width: unset;
|
|
355
|
+
}
|
|
356
|
+
|
|
328
357
|
.item-bottom {
|
|
329
358
|
margin-left: 0;
|
|
330
359
|
margin-right: 0;
|
|
@@ -388,6 +417,7 @@ button, a {
|
|
|
388
417
|
|
|
389
418
|
::slotted(ion-label:not([slot=end])) {
|
|
390
419
|
flex: 1;
|
|
420
|
+
width: min-content;
|
|
391
421
|
}
|
|
392
422
|
|
|
393
423
|
:host(.item-input) {
|
|
@@ -396,15 +426,23 @@ button, a {
|
|
|
396
426
|
|
|
397
427
|
.input-wrapper {
|
|
398
428
|
display: flex;
|
|
399
|
-
flex: 1;
|
|
429
|
+
flex: 1 0 auto;
|
|
400
430
|
flex-direction: inherit;
|
|
431
|
+
flex-wrap: wrap;
|
|
401
432
|
align-items: inherit;
|
|
402
433
|
align-self: stretch;
|
|
434
|
+
max-width: 100%;
|
|
403
435
|
text-overflow: ellipsis;
|
|
404
436
|
overflow: inherit;
|
|
405
437
|
box-sizing: border-box;
|
|
406
438
|
}
|
|
407
439
|
|
|
440
|
+
:host(.item-legacy) .input-wrapper {
|
|
441
|
+
flex: 1;
|
|
442
|
+
flex-wrap: unset;
|
|
443
|
+
max-width: unset;
|
|
444
|
+
}
|
|
445
|
+
|
|
408
446
|
:host(.item-label-stacked),
|
|
409
447
|
:host(.item-label-floating) {
|
|
410
448
|
align-items: start;
|
|
@@ -29,7 +29,7 @@ configs().forEach(({ title, screenshot, config }) => {
|
|
|
29
29
|
</ion-item>
|
|
30
30
|
|
|
31
31
|
<ion-item>
|
|
32
|
-
<ion-label> Single line text that should have ellipses when it doesn't all fit in the item</ion-label>
|
|
32
|
+
<ion-label class="ion-text-nowrap"> Single line text that should have ellipses when it doesn't all fit in the item</ion-label>
|
|
33
33
|
</ion-item>
|
|
34
34
|
</ion-list>
|
|
35
35
|
`, config);
|
|
@@ -11,7 +11,6 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
|
|
|
11
11
|
test('should not have visual regressions', async ({ page }) => {
|
|
12
12
|
await page.goto(`/src/components/item/test/disabled`, config);
|
|
13
13
|
await page.setIonViewport();
|
|
14
|
-
// TODO: FW-4037 - Fix label color inconsistency between disabled controls
|
|
15
14
|
await expect(page).toHaveScreenshot(screenshot(`item-disabled-diff`));
|
|
16
15
|
});
|
|
17
16
|
});
|
|
@@ -63,17 +63,24 @@
|
|
|
63
63
|
font-family: var(--ion-font-family, inherit);
|
|
64
64
|
font-size: inherit;
|
|
65
65
|
text-overflow: ellipsis;
|
|
66
|
+
box-sizing: border-box;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:host-context(.item-legacy) {
|
|
66
70
|
white-space: nowrap;
|
|
67
71
|
overflow: hidden;
|
|
68
|
-
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:host-context(.item:not(.item-input):not(.item-legacy)) {
|
|
75
|
+
flex-grow: 1;
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
:host(.ion-color) {
|
|
72
79
|
color: var(--ion-color-base);
|
|
73
80
|
}
|
|
74
81
|
|
|
75
|
-
:host(.ion-text-
|
|
76
|
-
|
|
82
|
+
:host(.ion-text-nowrap) {
|
|
83
|
+
overflow: hidden;
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
:host-context(.item-interactive-disabled:not(.item-multiple-inputs)) {
|
|
@@ -92,6 +99,10 @@
|
|
|
92
99
|
align-self: baseline;
|
|
93
100
|
}
|
|
94
101
|
|
|
102
|
+
:host-context(.item-skeleton-text) {
|
|
103
|
+
overflow: hidden;
|
|
104
|
+
}
|
|
105
|
+
|
|
95
106
|
:host(.label-fixed) {
|
|
96
107
|
flex: 0 0 100px;
|
|
97
108
|
width: 100px;
|
|
@@ -63,17 +63,24 @@
|
|
|
63
63
|
font-family: var(--ion-font-family, inherit);
|
|
64
64
|
font-size: inherit;
|
|
65
65
|
text-overflow: ellipsis;
|
|
66
|
+
box-sizing: border-box;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
:host-context(.item-legacy) {
|
|
66
70
|
white-space: nowrap;
|
|
67
71
|
overflow: hidden;
|
|
68
|
-
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
:host-context(.item:not(.item-input):not(.item-legacy)) {
|
|
75
|
+
flex-grow: 1;
|
|
69
76
|
}
|
|
70
77
|
|
|
71
78
|
:host(.ion-color) {
|
|
72
79
|
color: var(--ion-color-base);
|
|
73
80
|
}
|
|
74
81
|
|
|
75
|
-
:host(.ion-text-
|
|
76
|
-
|
|
82
|
+
:host(.ion-text-nowrap) {
|
|
83
|
+
overflow: hidden;
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
:host-context(.item-interactive-disabled:not(.item-multiple-inputs)) {
|
|
@@ -92,6 +99,10 @@
|
|
|
92
99
|
align-self: baseline;
|
|
93
100
|
}
|
|
94
101
|
|
|
102
|
+
:host-context(.item-skeleton-text) {
|
|
103
|
+
overflow: hidden;
|
|
104
|
+
}
|
|
105
|
+
|
|
95
106
|
:host(.label-fixed) {
|
|
96
107
|
flex: 0 0 100px;
|
|
97
108
|
width: 100px;
|
|
@@ -5,6 +5,7 @@ import { getTimeGivenProgression } from "../../../utils/animation/cubic-bezier";
|
|
|
5
5
|
import { isIonContent, findClosestIonContent, disableContentScrollY, resetContentScrollY } from "../../../utils/content/index";
|
|
6
6
|
import { createGesture } from "../../../utils/gesture/index";
|
|
7
7
|
import { clamp, getElementRoot } from "../../../utils/helpers";
|
|
8
|
+
import { OVERLAY_GESTURE_PRIORITY } from "../../../utils/overlays";
|
|
8
9
|
import { setCardStatusBarDark, setCardStatusBarDefault } from "../utils";
|
|
9
10
|
import { calculateSpringStep, handleCanDismiss } from "./utils";
|
|
10
11
|
// Defaults for the card swipe animation
|
|
@@ -250,7 +251,7 @@ export const createSwipeToCloseGesture = (el, animation, statusBarStyle, onDismi
|
|
|
250
251
|
const gesture = createGesture({
|
|
251
252
|
el,
|
|
252
253
|
gestureName: 'modalSwipeToClose',
|
|
253
|
-
gesturePriority:
|
|
254
|
+
gesturePriority: OVERLAY_GESTURE_PRIORITY,
|
|
254
255
|
direction: 'y',
|
|
255
256
|
threshold: 10,
|
|
256
257
|
canStart,
|
|
@@ -48,5 +48,48 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
|
|
|
48
48
|
const note = page.locator('ion-note');
|
|
49
49
|
await expect(note).toHaveScreenshot(screenshot(`note-item-divider-scale`));
|
|
50
50
|
});
|
|
51
|
+
test('should wrap label to the next line without truncating', async ({ page }) => {
|
|
52
|
+
await page.setContent(`
|
|
53
|
+
<style>
|
|
54
|
+
html {
|
|
55
|
+
font-size: 310%;
|
|
56
|
+
}
|
|
57
|
+
</style>
|
|
58
|
+
|
|
59
|
+
<ion-list>
|
|
60
|
+
<ion-item>
|
|
61
|
+
<ion-note slot="start">Really really long note</ion-note>
|
|
62
|
+
<ion-label>Label</ion-label>
|
|
63
|
+
</ion-item>
|
|
64
|
+
|
|
65
|
+
<ion-item>
|
|
66
|
+
<ion-label>Label</ion-label>
|
|
67
|
+
<ion-note slot="end">Really really long note</ion-note>
|
|
68
|
+
</ion-item>
|
|
69
|
+
|
|
70
|
+
<ion-item>
|
|
71
|
+
<ion-note slot="start">Note</ion-note>
|
|
72
|
+
<ion-label>Really really long label</ion-label>
|
|
73
|
+
</ion-item>
|
|
74
|
+
|
|
75
|
+
<ion-item>
|
|
76
|
+
<ion-label>Really really long label</ion-label>
|
|
77
|
+
<ion-note slot="end">Note</ion-note>
|
|
78
|
+
</ion-item>
|
|
79
|
+
|
|
80
|
+
<ion-item>
|
|
81
|
+
<ion-note slot="start">Really really long note</ion-note>
|
|
82
|
+
<ion-label>Really really long label</ion-label>
|
|
83
|
+
</ion-item>
|
|
84
|
+
|
|
85
|
+
<ion-item>
|
|
86
|
+
<ion-label>Really really long label</ion-label>
|
|
87
|
+
<ion-note slot="end">Really really long note</ion-note>
|
|
88
|
+
</ion-item>
|
|
89
|
+
</ion-list>
|
|
90
|
+
`, config);
|
|
91
|
+
const list = page.locator('ion-list');
|
|
92
|
+
await expect(list).toHaveScreenshot(screenshot(`note-wrapping-label-scale`));
|
|
93
|
+
});
|
|
51
94
|
});
|
|
52
95
|
});
|
|
@@ -186,12 +186,6 @@ input {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
.label-text-wrapper {
|
|
189
|
-
/**
|
|
190
|
-
* This ensures that double tapping this text
|
|
191
|
-
* clicks the <label> and focuses the radio
|
|
192
|
-
* when a screen reader is enabled.
|
|
193
|
-
*/
|
|
194
|
-
pointer-events: none;
|
|
195
189
|
text-overflow: ellipsis;
|
|
196
190
|
white-space: nowrap;
|
|
197
191
|
overflow: hidden;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
4
|
import { Host, h } from "@stencil/core";
|
|
5
|
-
import { createLegacyFormController } from "../../utils/forms/index";
|
|
5
|
+
import { createLegacyFormController, isOptionSelected } from "../../utils/forms/index";
|
|
6
6
|
import { addEventListener, getAriaLabel, removeEventListener } from "../../utils/helpers";
|
|
7
7
|
import { printIonWarning } from "../../utils/logging/index";
|
|
8
8
|
import { createColorClasses, hostContext } from "../../utils/theme";
|
|
@@ -13,6 +13,7 @@ import { getIonMode } from "../../global/ionic-global";
|
|
|
13
13
|
* @slot - The label text to associate with the radio. Use the "labelPlacement" property to control where the label is placed relative to the radio.
|
|
14
14
|
*
|
|
15
15
|
* @part container - The container for the radio mark.
|
|
16
|
+
* @part label - The label text describing the radio.
|
|
16
17
|
* @part mark - The checkmark or dot used to indicate the checked state.
|
|
17
18
|
*/
|
|
18
19
|
export class Radio {
|
|
@@ -23,7 +24,8 @@ export class Radio {
|
|
|
23
24
|
this.hasLoggedDeprecationWarning = false;
|
|
24
25
|
this.updateState = () => {
|
|
25
26
|
if (this.radioGroup) {
|
|
26
|
-
|
|
27
|
+
const { compareWith, value: radioGroupValue } = this.radioGroup;
|
|
28
|
+
this.checked = isOptionSelected(radioGroupValue, this.value, compareWith);
|
|
27
29
|
}
|
|
28
30
|
};
|
|
29
31
|
this.onClick = () => {
|
|
@@ -120,6 +122,8 @@ export class Radio {
|
|
|
120
122
|
emitStyle() {
|
|
121
123
|
const style = {
|
|
122
124
|
'interactive-disabled': this.disabled,
|
|
125
|
+
// TODO(FW-3125): remove this
|
|
126
|
+
legacy: !!this.legacy,
|
|
123
127
|
};
|
|
124
128
|
if (this.legacyFormController.hasLegacyControl()) {
|
|
125
129
|
style['radio-checked'] = this.checked;
|
|
@@ -154,7 +158,7 @@ export class Radio {
|
|
|
154
158
|
}), role: "radio", "aria-checked": checked ? 'true' : 'false', "aria-disabled": disabled ? 'true' : null, tabindex: buttonTabindex }, h("label", { class: "radio-wrapper" }, h("div", { class: {
|
|
155
159
|
'label-text-wrapper': true,
|
|
156
160
|
'label-text-wrapper-hidden': !hasLabel,
|
|
157
|
-
} }, h("slot", null)), h("div", { class: "native-wrapper" }, this.renderRadioControl()))));
|
|
161
|
+
}, part: "label" }, h("slot", null)), h("div", { class: "native-wrapper" }, this.renderRadioControl()))));
|
|
158
162
|
}
|
|
159
163
|
renderLegacyRadio() {
|
|
160
164
|
if (!this.hasLoggedDeprecationWarning) {
|
|
@@ -186,12 +186,6 @@ input {
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
.label-text-wrapper {
|
|
189
|
-
/**
|
|
190
|
-
* This ensures that double tapping this text
|
|
191
|
-
* clicks the <label> and focuses the radio
|
|
192
|
-
* when a screen reader is enabled.
|
|
193
|
-
*/
|
|
194
|
-
pointer-events: none;
|
|
195
189
|
text-overflow: ellipsis;
|
|
196
190
|
white-space: nowrap;
|
|
197
191
|
overflow: hidden;
|
|
@@ -25,6 +25,20 @@ describe('ion-radio', () => {
|
|
|
25
25
|
await page.waitForChanges();
|
|
26
26
|
expect(radio.classList.contains('radio-checked')).toBe(true);
|
|
27
27
|
});
|
|
28
|
+
it('should render the radio with shadow parts', async () => {
|
|
29
|
+
const page = await newSpecPage({
|
|
30
|
+
components: [Radio, RadioGroup],
|
|
31
|
+
html: `
|
|
32
|
+
<ion-radio-group>
|
|
33
|
+
<ion-radio value="value"></ion-radio>
|
|
34
|
+
</ion-radio-group>
|
|
35
|
+
`,
|
|
36
|
+
});
|
|
37
|
+
const radio = page.body.querySelector('ion-radio');
|
|
38
|
+
expect(radio).toHaveShadowPart('container');
|
|
39
|
+
expect(radio).toHaveShadowPart('label');
|
|
40
|
+
expect(radio).toHaveShadowPart('mark');
|
|
41
|
+
});
|
|
28
42
|
});
|
|
29
43
|
describe('ion-radio: disabled', () => {
|
|
30
44
|
it('clicking disabled radio should not set checked state', async () => {
|
|
@@ -47,6 +47,7 @@ export class RadioGroup {
|
|
|
47
47
|
}
|
|
48
48
|
};
|
|
49
49
|
this.allowEmptySelection = false;
|
|
50
|
+
this.compareWith = undefined;
|
|
50
51
|
this.name = this.inputId;
|
|
51
52
|
this.value = undefined;
|
|
52
53
|
}
|
|
@@ -167,6 +168,29 @@ export class RadioGroup {
|
|
|
167
168
|
"reflect": false,
|
|
168
169
|
"defaultValue": "false"
|
|
169
170
|
},
|
|
171
|
+
"compareWith": {
|
|
172
|
+
"type": "string",
|
|
173
|
+
"mutable": false,
|
|
174
|
+
"complexType": {
|
|
175
|
+
"original": "string | RadioGroupCompareFn | null",
|
|
176
|
+
"resolved": "((currentValue: any, compareValue: any) => boolean) | null | string | undefined",
|
|
177
|
+
"references": {
|
|
178
|
+
"RadioGroupCompareFn": {
|
|
179
|
+
"location": "import",
|
|
180
|
+
"path": "./radio-group-interface",
|
|
181
|
+
"id": "src/components/radio-group/radio-group-interface.ts::RadioGroupCompareFn"
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"required": false,
|
|
186
|
+
"optional": true,
|
|
187
|
+
"docs": {
|
|
188
|
+
"tags": [],
|
|
189
|
+
"text": "This property allows developers to specify a custom function or property\nname for comparing objects when determining the selected option in the\nion-radio-group. When not specified, the default behavior will use strict\nequality (===) for comparison."
|
|
190
|
+
},
|
|
191
|
+
"attribute": "compare-with",
|
|
192
|
+
"reflect": false
|
|
193
|
+
},
|
|
170
194
|
"name": {
|
|
171
195
|
"type": "string",
|
|
172
196
|
"mutable": false,
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import { h } from "@stencil/core";
|
|
5
|
+
import { newSpecPage } from "@stencil/core/testing";
|
|
6
|
+
import { Radio } from "../../radio/radio";
|
|
7
|
+
import { RadioGroup } from "../radio-group";
|
|
8
|
+
describe('ion-radio-group', () => {
|
|
9
|
+
it('should correctly set value when using compareWith string', async () => {
|
|
10
|
+
const page = await newSpecPage({
|
|
11
|
+
components: [Radio, RadioGroup],
|
|
12
|
+
template: () => (h("ion-radio-group", { compareWith: "value", value: { label: 'Blue', value: 'blue' } }, h("ion-radio", { value: { label: 'Red', value: 'red' } }, "Red"), h("ion-radio", { value: { label: 'Blue', value: 'blue' } }, "Blue"), h("ion-radio", { value: { label: 'Green', value: 'green' } }, "Green"))),
|
|
13
|
+
});
|
|
14
|
+
const radioGroup = page.body.querySelector('ion-radio-group');
|
|
15
|
+
const radios = document.querySelectorAll('ion-radio');
|
|
16
|
+
await radios[2].click();
|
|
17
|
+
await page.waitForChanges();
|
|
18
|
+
expect(radios[2].getAttribute('aria-checked')).toBe('true');
|
|
19
|
+
expect(radioGroup.value).toEqual({
|
|
20
|
+
label: 'Green',
|
|
21
|
+
value: 'green',
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it('should correctly set value when using compareWith function', async () => {
|
|
25
|
+
const page = await newSpecPage({
|
|
26
|
+
components: [Radio, RadioGroup],
|
|
27
|
+
template: () => (h("ion-radio-group", { value: { label: 'Blue', value: 'blue' } }, h("ion-radio", { value: { label: 'Red', value: 'red' } }, "Red"), h("ion-radio", { value: { label: 'Blue', value: 'blue' } }, "Blue"), h("ion-radio", { value: { label: 'Green', value: 'green' } }, "Green"))),
|
|
28
|
+
});
|
|
29
|
+
const radioGroup = page.body.querySelector('ion-radio-group');
|
|
30
|
+
const radios = document.querySelectorAll('ion-radio');
|
|
31
|
+
radioGroup.compareWith = (a, b) => a.value === b.value;
|
|
32
|
+
await radios[2].click();
|
|
33
|
+
await page.waitForChanges();
|
|
34
|
+
expect(radios[2].getAttribute('aria-checked')).toBe('true');
|
|
35
|
+
expect(radioGroup.value).toEqual({
|
|
36
|
+
label: 'Green',
|
|
37
|
+
value: 'green',
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
it('should correctly set value when using compareWith null', async () => {
|
|
41
|
+
const page = await newSpecPage({
|
|
42
|
+
components: [RadioGroup, Radio],
|
|
43
|
+
template: () => (h("ion-radio-group", { compareWith: null, value: "blue" }, h("ion-radio", { value: "red" }, "Red"), h("br", null), h("ion-radio", { value: "blue" }, "Blue"), h("br", null), h("ion-radio", { value: "green" }, "Green"))),
|
|
44
|
+
});
|
|
45
|
+
const radioGroup = page.body.querySelector('ion-radio-group');
|
|
46
|
+
const radios = document.querySelectorAll('ion-radio');
|
|
47
|
+
await radios[2].click();
|
|
48
|
+
await page.waitForChanges();
|
|
49
|
+
expect(radios[2].getAttribute('aria-checked')).toBe('true');
|
|
50
|
+
expect(radioGroup.value).toEqual('green');
|
|
51
|
+
});
|
|
52
|
+
it('should work with different parameter types', async () => {
|
|
53
|
+
const page = await newSpecPage({
|
|
54
|
+
components: [Radio, RadioGroup],
|
|
55
|
+
template: () => (h("ion-radio-group", { value: 2 }, h("ion-radio", { value: 1 }, "Option #1"), h("ion-radio", { value: 2 }, "Option #2"), h("ion-radio", { value: 3 }, "Option #3"))),
|
|
56
|
+
});
|
|
57
|
+
const radioGroup = page.body.querySelector('ion-radio-group');
|
|
58
|
+
radioGroup.compareWith = (val1, val2) => {
|
|
59
|
+
// convert val1 to a number
|
|
60
|
+
return +val1 === val2;
|
|
61
|
+
};
|
|
62
|
+
const radios = document.querySelectorAll('ion-radio');
|
|
63
|
+
await expect(radios[1].getAttribute('aria-checked')).toBe('true');
|
|
64
|
+
await radios[2].click();
|
|
65
|
+
await page.waitForChanges();
|
|
66
|
+
expect(radios[2].getAttribute('aria-checked')).toBe('true');
|
|
67
|
+
expect(radioGroup.value).toEqual(3);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
@@ -325,12 +325,6 @@
|
|
|
325
325
|
* would not be able to see the range.
|
|
326
326
|
*/
|
|
327
327
|
max-width: 200px;
|
|
328
|
-
/**
|
|
329
|
-
* This ensures that double tapping this text
|
|
330
|
-
* clicks the <label> and focuses the range
|
|
331
|
-
* when a screen reader is enabled.
|
|
332
|
-
*/
|
|
333
|
-
pointer-events: none;
|
|
334
328
|
text-overflow: ellipsis;
|
|
335
329
|
white-space: nowrap;
|
|
336
330
|
overflow: hidden;
|
|
@@ -24,6 +24,7 @@ import { roundToMaxDecimalPlaces } from "../../utils/floating-point";
|
|
|
24
24
|
* @part knob - The handle that is used to drag the range.
|
|
25
25
|
* @part bar - The inactive part of the bar.
|
|
26
26
|
* @part bar-active - The active part of the bar.
|
|
27
|
+
* @part label - The label text describing the range.
|
|
27
28
|
*/
|
|
28
29
|
export class Range {
|
|
29
30
|
constructor() {
|
|
@@ -226,6 +227,8 @@ export class Range {
|
|
|
226
227
|
this.ionStyle.emit({
|
|
227
228
|
interactive: true,
|
|
228
229
|
'interactive-disabled': this.disabled,
|
|
230
|
+
// TODO(FW-2997): remove this
|
|
231
|
+
legacy: !!this.legacy,
|
|
229
232
|
});
|
|
230
233
|
}
|
|
231
234
|
}
|
|
@@ -414,7 +417,7 @@ Developers can dismiss this warning by removing their usage of the "legacy" prop
|
|
|
414
417
|
}) }, h("label", { class: "range-wrapper", id: "range-label" }, h("div", { class: {
|
|
415
418
|
'label-text-wrapper': true,
|
|
416
419
|
'label-text-wrapper-hidden': !hasLabel,
|
|
417
|
-
} }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { class: "native-wrapper" }, h("slot", { name: "start" }), this.renderRangeSlider(), h("slot", { name: "end" })))));
|
|
420
|
+
}, part: "label" }, label !== undefined ? h("div", { class: "label-text" }, label) : h("slot", { name: "label" })), h("div", { class: "native-wrapper" }, h("slot", { name: "start" }), this.renderRangeSlider(), h("slot", { name: "end" })))));
|
|
418
421
|
}
|
|
419
422
|
get hasLabel() {
|
|
420
423
|
return this.label !== undefined || this.el.querySelector('[slot="label"]') !== null;
|
|
@@ -325,12 +325,6 @@
|
|
|
325
325
|
* would not be able to see the range.
|
|
326
326
|
*/
|
|
327
327
|
max-width: 200px;
|
|
328
|
-
/**
|
|
329
|
-
* This ensures that double tapping this text
|
|
330
|
-
* clicks the <label> and focuses the range
|
|
331
|
-
* when a screen reader is enabled.
|
|
332
|
-
*/
|
|
333
|
-
pointer-events: none;
|
|
334
328
|
text-overflow: ellipsis;
|
|
335
329
|
white-space: nowrap;
|
|
336
330
|
overflow: hidden;
|
|
@@ -202,4 +202,20 @@ describe('range: item adjustments', () => {
|
|
|
202
202
|
expect(range.classList.contains('range-item-start-adjustment')).toBe(false);
|
|
203
203
|
expect(range.classList.contains('range-item-end-adjustment')).toBe(false);
|
|
204
204
|
});
|
|
205
|
+
describe('shadow parts', () => {
|
|
206
|
+
it('should have shadow parts', async () => {
|
|
207
|
+
const page = await newSpecPage({
|
|
208
|
+
components: [Range],
|
|
209
|
+
html: `<ion-range pin="true" snaps="true" value="50" label="Label"></ion-range>`,
|
|
210
|
+
});
|
|
211
|
+
const range = page.body.querySelector('ion-range');
|
|
212
|
+
expect(range).toHaveShadowPart('label');
|
|
213
|
+
expect(range).toHaveShadowPart('pin');
|
|
214
|
+
expect(range).toHaveShadowPart('knob');
|
|
215
|
+
expect(range).toHaveShadowPart('bar');
|
|
216
|
+
expect(range).toHaveShadowPart('bar-active');
|
|
217
|
+
expect(range).toHaveShadowPart('tick');
|
|
218
|
+
expect(range).toHaveShadowPart('tick-active');
|
|
219
|
+
});
|
|
220
|
+
});
|
|
205
221
|
});
|
|
@@ -132,6 +132,10 @@
|
|
|
132
132
|
overflow: hidden;
|
|
133
133
|
}
|
|
134
134
|
|
|
135
|
+
:host(.in-item:not(.legacy-select)) {
|
|
136
|
+
flex: 1 1 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
135
139
|
:host(.in-item.legacy-select) {
|
|
136
140
|
position: static;
|
|
137
141
|
max-width: 45%;
|
|
@@ -232,6 +236,12 @@ button {
|
|
|
232
236
|
margin-top: 0;
|
|
233
237
|
margin-bottom: 0;
|
|
234
238
|
position: relative;
|
|
239
|
+
/**
|
|
240
|
+
* Prevent the icon from shrinking when the label and/or
|
|
241
|
+
* selected item text is long enough to fill the rest of
|
|
242
|
+
* the container.
|
|
243
|
+
*/
|
|
244
|
+
flex-shrink: 0;
|
|
235
245
|
}
|
|
236
246
|
|
|
237
247
|
/**
|
|
@@ -315,6 +325,23 @@ button {
|
|
|
315
325
|
transition: opacity 150ms cubic-bezier(0.4, 0, 0.2, 1);
|
|
316
326
|
}
|
|
317
327
|
|
|
328
|
+
.select-wrapper-inner {
|
|
329
|
+
display: flex;
|
|
330
|
+
align-items: center;
|
|
331
|
+
overflow: hidden;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
:host(.select-label-placement-stacked) .select-wrapper-inner,
|
|
335
|
+
:host(.select-label-placement-floating) .select-wrapper-inner {
|
|
336
|
+
/**
|
|
337
|
+
* When using a stacked/floating label, the inner wrapper is
|
|
338
|
+
* stacked vertically under the label container. This line
|
|
339
|
+
* ensures that the inner wrapper fills all the remaining height
|
|
340
|
+
* of the component.
|
|
341
|
+
*/
|
|
342
|
+
flex-grow: 1;
|
|
343
|
+
}
|
|
344
|
+
|
|
318
345
|
:host(.ion-touched.ion-invalid) {
|
|
319
346
|
--highlight-color: var(--highlight-color-invalid);
|
|
320
347
|
}
|
|
@@ -555,11 +582,23 @@ button {
|
|
|
555
582
|
* The placeholder should be hidden when the label
|
|
556
583
|
* is on top of the select. This prevents the label
|
|
557
584
|
* from overlapping any placeholder value.
|
|
585
|
+
*
|
|
586
|
+
* TODO(FW-5592): Remove :not(.label-floating) piece
|
|
558
587
|
*/
|
|
559
|
-
:host(.select-label-placement-floating) .native-wrapper .select-placeholder {
|
|
588
|
+
:host(.select-label-placement-floating:not(.label-floating)) .native-wrapper .select-placeholder {
|
|
560
589
|
opacity: 0;
|
|
561
590
|
}
|
|
562
591
|
|
|
592
|
+
/**
|
|
593
|
+
* We don't use .label-floating here because that would
|
|
594
|
+
* also include the case where the label is floating due
|
|
595
|
+
* to content in the start/end slot. We want the opacity
|
|
596
|
+
* to remain at the default in this case, since the select
|
|
597
|
+
* isn't being actively interacted with.
|
|
598
|
+
*
|
|
599
|
+
* TODO(FW-5592): Change entire selector to:
|
|
600
|
+
* :host(.label-floating.select-label-placement-floating) .native-wrapper .select-placeholder
|
|
601
|
+
*/
|
|
563
602
|
:host(.select-expanded.select-label-placement-floating) .native-wrapper .select-placeholder,
|
|
564
603
|
:host(.ion-focused.select-label-placement-floating) .native-wrapper .select-placeholder,
|
|
565
604
|
:host(.has-value.select-label-placement-floating) .native-wrapper .select-placeholder {
|
|
@@ -569,10 +608,7 @@ button {
|
|
|
569
608
|
/**
|
|
570
609
|
* This makes the label sit above the input.
|
|
571
610
|
*/
|
|
572
|
-
:host(.
|
|
573
|
-
:host(.select-expanded.select-label-placement-floating) .label-text-wrapper,
|
|
574
|
-
:host(.ion-focused.select-label-placement-floating) .label-text-wrapper,
|
|
575
|
-
:host(.has-value.select-label-placement-floating) .label-text-wrapper {
|
|
611
|
+
:host(.label-floating) .label-text-wrapper {
|
|
576
612
|
transform: translateY(50%) scale(0.75);
|
|
577
613
|
/**
|
|
578
614
|
* Label text should not extend
|
|
@@ -581,6 +617,23 @@ button {
|
|
|
581
617
|
max-width: calc(100% / 0.75);
|
|
582
618
|
}
|
|
583
619
|
|
|
620
|
+
::slotted([slot=start]), ::slotted([slot=end]) {
|
|
621
|
+
/**
|
|
622
|
+
* Prevent the slots from shrinking when the label and/or
|
|
623
|
+
* selected item text is long enough to fill the rest of
|
|
624
|
+
* the container.
|
|
625
|
+
*/
|
|
626
|
+
flex-shrink: 0;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
::slotted([slot=start]) {
|
|
630
|
+
margin-inline-end: 16px;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
::slotted([slot=end]) {
|
|
634
|
+
margin-inline-start: 16px;
|
|
635
|
+
}
|
|
636
|
+
|
|
584
637
|
/**
|
|
585
638
|
* Convert a font size to a dynamic font size.
|
|
586
639
|
* Fonts that participate in Dynamic Type should use
|
|
@@ -704,8 +757,8 @@ button {
|
|
|
704
757
|
color: var(--ion-color-step-650, #595959);
|
|
705
758
|
}
|
|
706
759
|
|
|
707
|
-
:host(.select-label-placement-stacked) .
|
|
708
|
-
:host(.select-label-placement-floating) .
|
|
760
|
+
:host(.select-label-placement-stacked) .select-wrapper-inner,
|
|
761
|
+
:host(.select-label-placement-floating) .select-wrapper-inner {
|
|
709
762
|
width: calc(100% - 1.125rem - 4px);
|
|
710
763
|
}
|
|
711
764
|
|