@ionic/core 7.6.2-dev.11703182244.1165aeec → 7.6.2-dev.11704729332.13b412c8
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/action-sheet.js +1 -1
- package/components/alert.js +2 -2
- package/components/backdrop.js +0 -12
- package/components/button.js +2 -2
- package/components/checkbox.js +2 -2
- package/components/data.js +1 -1
- package/components/gesture-controller.js +1 -1
- package/components/ion-back-button.js +1 -1
- package/components/ion-badge.js +2 -2
- package/components/ion-content.js +3 -4
- package/components/ion-datetime.js +40 -64
- package/components/ion-fab-button.js +2 -2
- package/components/ion-input.js +2 -2
- package/components/ion-item-option.js +2 -2
- package/components/ion-loading.js +1 -1
- package/components/ion-menu-button.js +1 -1
- package/components/ion-picker-column-option.d.ts +11 -0
- package/components/ion-picker-column-option.js +9 -0
- package/components/ion-picker-column.js +2 -2
- package/components/ion-picker-legacy-column.d.ts +11 -0
- package/components/ion-picker-legacy-column.js +9 -0
- package/components/{ion-picker-internal.d.ts → ion-picker-legacy.d.ts} +4 -4
- package/components/ion-picker-legacy.js +309 -0
- package/components/ion-picker.js +1 -309
- package/components/ion-progress-bar.js +2 -2
- package/components/ion-range.js +2 -2
- package/components/ion-refresher-content.js +1 -1
- package/components/ion-refresher.js +1 -1
- package/components/ion-router-link.js +1 -1
- package/components/ion-searchbar.js +1 -1
- package/components/ion-segment-button.js +1 -1
- package/components/ion-select.js +2 -2
- package/components/ion-tab-bar.js +2 -2
- package/components/ion-textarea.js +2 -2
- package/components/ion-toast.js +2 -2
- package/components/ion-toggle.js +2 -2
- package/components/item.js +2 -2
- package/components/label.js +1 -1
- package/components/overlays.js +11 -4
- package/components/picker-column-option.js +122 -0
- package/components/picker-column.js +351 -322
- package/components/picker-column2.js +379 -0
- package/components/{picker-internal.js → picker.js} +29 -22
- package/components/radio-group.js +1 -9
- package/components/radio.js +2 -2
- package/components/select-popover.js +1 -1
- package/css/core.css +35 -34
- package/css/core.css.map +1 -1
- package/css/global.bundle.css +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/css/themes/dark.always.css +122 -0
- package/css/themes/dark.always.css.map +1 -0
- package/css/themes/dark.class.css +122 -0
- package/css/themes/dark.class.css.map +1 -0
- package/css/themes/dark.css +3 -0
- package/css/themes/dark.css.map +1 -0
- package/css/themes/dark.system.css +124 -0
- package/css/themes/dark.system.css.map +1 -0
- package/css/typography.css +1 -1
- package/dist/cjs/{button-active-962fe442.js → button-active-5bf1cac0.js} +1 -1
- package/dist/cjs/{data-a5109f09.js → data-e2bf21de.js} +1 -1
- package/dist/cjs/{gesture-controller-c40c045a.js → gesture-controller-9436f482.js} +1 -0
- package/dist/cjs/{index-d1b59ffa.js → index-ee07ed59.js} +1 -1
- package/dist/cjs/index.cjs.js +3 -3
- package/dist/cjs/ion-action-sheet.cjs.entry.js +5 -5
- package/dist/cjs/ion-alert.cjs.entry.js +6 -6
- package/dist/cjs/ion-app_8.cjs.entry.js +4 -5
- package/dist/cjs/ion-avatar_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-back-button.cjs.entry.js +1 -1
- package/dist/cjs/ion-backdrop.cjs.entry.js +0 -12
- package/dist/cjs/ion-button_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-checkbox.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime-button.cjs.entry.js +1 -1
- package/dist/cjs/ion-datetime_3.cjs.entry.js +37 -57
- package/dist/cjs/ion-fab_3.cjs.entry.js +2 -2
- package/dist/cjs/ion-input.cjs.entry.js +2 -2
- package/dist/cjs/ion-item-option_3.cjs.entry.js +3 -3
- package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
- package/dist/cjs/ion-loading.cjs.entry.js +3 -2
- package/dist/cjs/ion-menu_3.cjs.entry.js +4 -4
- package/dist/cjs/ion-modal.cjs.entry.js +3 -3
- package/dist/cjs/ion-nav_2.cjs.entry.js +1 -1
- package/dist/cjs/ion-picker-column-option.cjs.entry.js +104 -0
- package/dist/cjs/{ion-picker-column-internal.cjs.entry.js → ion-picker-column.cjs.entry.js} +104 -87
- package/dist/cjs/{ion-picker-internal.cjs.entry.js → ion-picker.cjs.entry.js} +26 -19
- package/dist/cjs/ion-popover.cjs.entry.js +2 -1
- package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
- package/dist/cjs/ion-radio_2.cjs.entry.js +3 -11
- package/dist/cjs/ion-range.cjs.entry.js +3 -3
- package/dist/cjs/ion-refresher_2.cjs.entry.js +5 -5
- package/dist/cjs/ion-reorder_2.cjs.entry.js +1 -1
- package/dist/cjs/ion-route_4.cjs.entry.js +1 -1
- package/dist/cjs/ion-searchbar.cjs.entry.js +1 -1
- package/dist/cjs/ion-segment_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-select_3.cjs.entry.js +5 -4
- package/dist/cjs/ion-tab-bar_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-textarea.cjs.entry.js +2 -2
- package/dist/cjs/ion-toast.cjs.entry.js +5 -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/{overlays-e77cc023.js → overlays-7773cbe1.js} +11 -4
- package/dist/cjs/{swipe-back-2a858bbd.js → swipe-back-b8f2330b.js} +2 -2
- package/dist/collection/collection-manifest.json +7 -6
- package/dist/collection/components/action-sheet/action-sheet.ios.css +3 -3
- package/dist/collection/components/action-sheet/test/a11y/action-sheet.e2e.js +23 -14
- package/dist/collection/components/alert/alert.ios.css +6 -6
- package/dist/collection/components/alert/alert.md.css +6 -6
- package/dist/collection/components/alert/test/a11y/alert.e2e.js +22 -9
- package/dist/collection/components/back-button/back-button.ios.css +1 -1
- package/dist/collection/components/back-button/test/a11y/back-button.e2e.js +21 -0
- package/dist/collection/components/backdrop/backdrop.js +0 -12
- package/dist/collection/components/badge/badge.ios.css +1 -1
- package/dist/collection/components/badge/badge.md.css +1 -1
- package/dist/collection/components/badge/test/a11y/badge.e2e.js +18 -0
- package/dist/collection/components/button/button.ios.css +11 -11
- package/dist/collection/components/button/button.md.css +9 -9
- package/dist/collection/components/button/test/a11y/button.e2e.js +48 -0
- package/dist/collection/components/button/test/wrap/button.e2e.js +12 -24
- package/dist/collection/components/checkbox/checkbox.ios.css +2 -2
- package/dist/collection/components/checkbox/checkbox.md.css +2 -2
- package/dist/collection/components/checkbox/test/a11y/checkbox.e2e.js +11 -2
- package/dist/collection/components/content/content.css +0 -4
- package/dist/collection/components/content/content.js +2 -3
- package/dist/collection/components/datetime/datetime.ios.css +91 -38
- package/dist/collection/components/datetime/datetime.js +24 -36
- package/dist/collection/components/datetime/datetime.md.css +96 -38
- package/dist/collection/components/datetime/test/a11y/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/a11y/datetime.spec.js +6 -9
- package/dist/collection/components/datetime/test/basic/datetime.e2e.js +10 -0
- package/dist/collection/components/datetime/test/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/disabled/datetime.spec.js +4 -4
- package/dist/collection/components/datetime/test/locale/datetime.e2e.js +2 -2
- package/dist/collection/components/datetime/test/minmax/datetime.e2e.js +6 -6
- package/dist/collection/components/datetime/test/month-year-picker/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/prefer-wheel/datetime.e2e.js +43 -41
- package/dist/collection/components/datetime/test/presentation/datetime.e2e.js +1 -1
- package/dist/collection/components/datetime/test/readonly/datetime.e2e.js +4 -4
- package/dist/collection/components/datetime/test/values/datetime.e2e.js +15 -12
- package/dist/collection/components/datetime/utils/data.js +1 -1
- package/dist/collection/components/fab-button/fab-button.ios.css +13 -13
- package/dist/collection/components/fab-button/fab-button.md.css +4 -4
- package/dist/collection/components/fab-button/test/a11y/fab-button.e2e.js +50 -0
- package/dist/collection/components/input/input.ios.css +3 -3
- package/dist/collection/components/input/input.md.css +3 -3
- package/dist/collection/components/input/test/a11y/input.e2e.js +41 -3
- package/dist/collection/components/item/item.ios.css +3 -3
- package/dist/collection/components/item/item.md.css +4 -4
- package/dist/collection/components/item-option/item-option.ios.css +2 -2
- package/dist/collection/components/item-option/item-option.md.css +1 -1
- package/dist/collection/components/item-sliding/test/a11y/item-sliding.e2e.js +28 -0
- package/dist/collection/components/label/label.md.css +1 -1
- package/dist/collection/components/label/test/a11y/label.e2e.js +20 -0
- package/dist/collection/components/loading/loading.md.css +1 -1
- package/dist/collection/components/loading/test/a11y/loading.e2e.js +21 -5
- package/dist/collection/components/menu-button/menu-button.ios.css +1 -1
- package/dist/collection/components/menu-button/test/a11y/menu-button.e2e.js +14 -0
- package/dist/collection/components/picker/picker.ios.css +112 -211
- package/dist/collection/components/picker/picker.js +472 -744
- package/dist/collection/components/picker/picker.md.css +108 -198
- package/dist/collection/components/{picker-internal/test/a11y/picker-internal.e2e.js → picker/test/a11y/picker.e2e.js} +2 -2
- package/dist/collection/components/picker/test/basic/picker.e2e.js +99 -13
- package/dist/collection/components/picker/test/custom/picker.e2e.js +85 -0
- package/dist/collection/components/{picker-internal/test/keyboard-entry/picker-internal.e2e.js → picker/test/keyboard-entry/picker.e2e.js} +63 -32
- package/dist/collection/components/{picker-column-internal/picker-column-internal.md.css → picker-column/picker-column.css} +96 -83
- package/dist/collection/components/picker-column/picker-column.js +497 -335
- package/dist/collection/components/{picker-column-internal/test/basic/picker-column-internal.e2e.js → picker-column/test/basic/picker-column.e2e.js} +8 -8
- package/dist/collection/components/picker-column/test/disabled/picker-column.e2e.js +91 -0
- package/dist/collection/components/picker-column/test/slots/picker-column.e2e.js +39 -0
- package/dist/collection/components/picker-column-option/picker-column-option.ios.css +87 -0
- package/dist/collection/components/picker-column-option/picker-column-option.js +173 -0
- package/dist/collection/components/{picker-column-internal/picker-column-internal.ios.css → picker-column-option/picker-column-option.md.css} +6 -53
- package/dist/collection/components/picker-column-option/test/a11y/picker-column-option.e2e.js +18 -0
- package/dist/collection/components/picker-column-option/test/basic/picker-column-option.e2e.js +37 -0
- package/dist/collection/components/picker-column-option/test/picker-column-option.spec.js +29 -0
- package/dist/collection/components/{picker-internal/picker-internal.md.css → picker-legacy/picker.ios.css} +207 -98
- package/dist/collection/components/picker-legacy/picker.js +817 -0
- package/dist/collection/components/{picker-internal/picker-internal.ios.css → picker-legacy/picker.md.css} +192 -100
- package/dist/collection/components/picker-legacy/test/basic/picker.e2e.js +25 -0
- package/dist/collection/components/{picker → picker-legacy}/test/is-open/picker.e2e.js +4 -4
- package/dist/collection/components/{picker → picker-legacy}/test/picker-id.spec.js +5 -5
- package/dist/collection/components/{picker → picker-legacy}/test/trigger/picker.e2e.js +1 -1
- package/dist/collection/components/picker-legacy-column/picker-column.js +419 -0
- package/dist/collection/components/{picker-column → picker-legacy-column}/picker-column.md.css +1 -1
- package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column-aria.spec.js +3 -3
- package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column-dynamic.spec.js +2 -2
- package/dist/collection/components/{picker-column → picker-legacy-column}/test/picker-column.spec.js +2 -2
- package/dist/collection/components/{picker-column → picker-legacy-column}/test/standalone/picker-column.e2e.js +3 -3
- package/dist/collection/components/progress-bar/progress-bar.ios.css +2 -2
- package/dist/collection/components/progress-bar/progress-bar.md.css +2 -2
- package/dist/collection/components/progress-bar/test/a11y/progress-bar.e2e.js +24 -0
- package/dist/collection/components/radio/radio.ios.css +2 -2
- package/dist/collection/components/radio/radio.md.css +2 -2
- package/dist/collection/components/radio/test/a11y/radio.e2e.js +101 -68
- package/dist/collection/components/radio-group/radio-group.js +1 -9
- package/dist/collection/components/range/range.ios.css +1 -1
- package/dist/collection/components/range/range.md.css +3 -3
- package/dist/collection/components/range/test/a11y/range.e2e.js +18 -8
- package/dist/collection/components/refresher/refresher.md.css +2 -2
- package/dist/collection/components/refresher/test/a11y/refresher.e2e.js +25 -0
- package/dist/collection/components/refresher-content/refresher-content.js +1 -1
- package/dist/collection/components/router-link/router-link.css +1 -1
- package/dist/collection/components/router-link/test/a11y/router-link.e2e.js +23 -0
- package/dist/collection/components/searchbar/searchbar.ios.css +1 -1
- package/dist/collection/components/segment/test/a11y/segment.e2e.js +23 -0
- package/dist/collection/components/segment-button/segment-button.md.css +2 -2
- package/dist/collection/components/select/select.ios.css +3 -3
- package/dist/collection/components/select/select.md.css +3 -3
- package/dist/collection/components/select/test/a11y/select.e2e.js +68 -4
- package/dist/collection/components/select-popover/select-popover.md.css +4 -4
- package/dist/collection/components/select-popover/test/a11y/select-popover.e2e.js +32 -0
- package/dist/collection/components/tab-bar/tab-bar.ios.css +1 -1
- package/dist/collection/components/tab-bar/tab-bar.md.css +1 -1
- package/dist/collection/components/textarea/test/a11y/textarea.e2e.js +41 -3
- package/dist/collection/components/textarea/textarea.ios.css +3 -3
- package/dist/collection/components/textarea/textarea.md.css +3 -3
- package/dist/collection/components/toast/test/a11y/toast.e2e.js +56 -24
- package/dist/collection/components/toast/toast.ios.css +1 -1
- package/dist/collection/components/toast/toast.md.css +2 -2
- package/dist/collection/components/toggle/test/a11y/toggle.e2e.js +8 -2
- package/dist/collection/components/toggle/toggle.ios.css +1 -1
- package/dist/collection/components/toggle/toggle.md.css +2 -2
- package/dist/collection/css/test/a11y/typography.e2e.js +18 -0
- package/dist/collection/themes/test/colors/theme.e2e.js +114 -0
- package/dist/collection/utils/gesture/gesture-controller.js +1 -1
- package/dist/collection/utils/overlays.js +11 -4
- package/dist/collection/utils/test/overlays/overlays-scroll-blocking.spec.js +65 -0
- package/dist/collection/utils/test/playwright/generator.js +1 -0
- package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
- package/dist/docs.json +478 -41
- package/dist/esm/{button-active-308d3edd.js → button-active-48379dd2.js} +1 -1
- package/dist/esm/{data-775093f5.js → data-6a31d701.js} +1 -1
- package/dist/esm/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
- package/dist/esm/{index-2cf77112.js → index-39782642.js} +2 -2
- package/dist/esm/index.js +3 -3
- package/dist/esm/ion-action-sheet.entry.js +5 -5
- package/dist/esm/ion-alert.entry.js +6 -6
- package/dist/esm/ion-app_8.entry.js +4 -5
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-back-button.entry.js +1 -1
- package/dist/esm/ion-backdrop.entry.js +0 -12
- package/dist/esm/ion-button_2.entry.js +2 -2
- package/dist/esm/ion-checkbox.entry.js +2 -2
- package/dist/esm/ion-datetime-button.entry.js +1 -1
- package/dist/esm/ion-datetime_3.entry.js +36 -56
- package/dist/esm/ion-fab_3.entry.js +2 -2
- package/dist/esm/ion-input.entry.js +2 -2
- package/dist/esm/ion-item-option_3.entry.js +3 -3
- package/dist/esm/ion-item_8.entry.js +3 -3
- package/dist/esm/ion-loading.entry.js +3 -2
- package/dist/esm/ion-menu_3.entry.js +4 -4
- package/dist/esm/ion-modal.entry.js +3 -3
- package/dist/esm/ion-nav_2.entry.js +1 -1
- package/dist/esm/ion-picker-column-option.entry.js +100 -0
- package/dist/esm/{ion-picker-column-internal.entry.js → ion-picker-column.entry.js} +104 -87
- package/dist/esm/{ion-picker-internal.entry.js → ion-picker.entry.js} +26 -19
- package/dist/esm/ion-popover.entry.js +2 -1
- package/dist/esm/ion-progress-bar.entry.js +2 -2
- package/dist/esm/ion-radio_2.entry.js +3 -11
- package/dist/esm/ion-range.entry.js +3 -3
- package/dist/esm/ion-refresher_2.entry.js +5 -5
- package/dist/esm/ion-reorder_2.entry.js +1 -1
- package/dist/esm/ion-route_4.entry.js +1 -1
- package/dist/esm/ion-searchbar.entry.js +1 -1
- package/dist/esm/ion-segment_2.entry.js +2 -2
- package/dist/esm/ion-select_3.entry.js +5 -4
- package/dist/esm/ion-tab-bar_2.entry.js +2 -2
- package/dist/esm/ion-textarea.entry.js +2 -2
- package/dist/esm/ion-toast.entry.js +5 -5
- package/dist/esm/ion-toggle.entry.js +3 -3
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/esm/{overlays-b33f6bca.js → overlays-94dac1cb.js} +11 -4
- package/dist/esm/{swipe-back-a6f386fc.js → swipe-back-a8ca7f93.js} +2 -2
- package/dist/esm-es5/{button-active-308d3edd.js → button-active-48379dd2.js} +1 -1
- package/dist/esm-es5/{gesture-controller-1bf57181.js → gesture-controller-314a54f6.js} +1 -1
- package/dist/esm-es5/{index-2cf77112.js → index-39782642.js} +1 -1
- package/dist/esm-es5/index.js +1 -1
- 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-avatar_3.entry.js +1 -1
- package/dist/esm-es5/ion-back-button.entry.js +1 -1
- package/dist/esm-es5/ion-backdrop.entry.js +1 -1
- package/dist/esm-es5/ion-button_2.entry.js +1 -1
- package/dist/esm-es5/ion-checkbox.entry.js +1 -1
- package/dist/esm-es5/ion-datetime-button.entry.js +1 -1
- package/dist/esm-es5/ion-datetime_3.entry.js +1 -1
- package/dist/esm-es5/ion-fab_3.entry.js +1 -1
- package/dist/esm-es5/ion-input.entry.js +1 -1
- package/dist/esm-es5/ion-item-option_3.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-option.entry.js +4 -0
- package/dist/esm-es5/ion-picker-column.entry.js +4 -0
- package/dist/esm-es5/ion-picker.entry.js +4 -0
- package/dist/esm-es5/ion-popover.entry.js +1 -1
- package/dist/esm-es5/ion-progress-bar.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-route_4.entry.js +1 -1
- package/dist/esm-es5/ion-searchbar.entry.js +1 -1
- package/dist/esm-es5/ion-segment_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/loader.js +1 -1
- package/dist/esm-es5/overlays-94dac1cb.js +4 -0
- package/dist/esm-es5/swipe-back-a8ca7f93.js +4 -0
- package/dist/html.html-data.json +152 -1
- package/dist/ionic/index.esm.js +1 -1
- package/dist/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-61e4d3ec.entry.js → p-068950da.entry.js} +1 -1
- package/dist/ionic/{p-c1701827.entry.js → p-0832dedf.entry.js} +1 -1
- package/dist/ionic/{p-f6e9c227.system.js → p-11c55ac8.system.js} +1 -1
- package/dist/ionic/{p-f2bfd3d7.entry.js → p-13d4dfe7.entry.js} +1 -1
- package/dist/ionic/p-19d9ceb8.system.js +1 -1
- package/dist/ionic/{p-afa9f205.system.js → p-1ab2642a.system.js} +1 -1
- package/dist/ionic/{p-11a3973f.entry.js → p-1b14f0f8.entry.js} +1 -1
- package/dist/ionic/{p-0235067a.js → p-1b60cc53.js} +1 -1
- package/dist/ionic/p-1c453add.system.entry.js +4 -0
- package/dist/ionic/{p-11bf2ad0.system.entry.js → p-1d5b03e3.system.entry.js} +1 -1
- package/dist/ionic/{p-c7c8429a.system.js → p-20d469d0.system.js} +1 -1
- package/dist/ionic/{p-6b0ce9b4.system.entry.js → p-25312768.system.entry.js} +1 -1
- package/dist/ionic/{p-f894e0ad.entry.js → p-2724403e.entry.js} +1 -1
- package/dist/ionic/p-283bc1a1.system.entry.js +4 -0
- package/dist/ionic/{p-2df97906.system.entry.js → p-308b6cf2.system.entry.js} +1 -1
- package/dist/ionic/{p-abd5d0d5.system.entry.js → p-354682e8.system.entry.js} +1 -1
- package/dist/ionic/p-3717e641.system.entry.js +4 -0
- package/dist/ionic/{p-19c379da.system.entry.js → p-3796194b.system.entry.js} +1 -1
- package/dist/ionic/{p-bdf71399.entry.js → p-385bb983.entry.js} +1 -1
- package/dist/ionic/{p-745e3339.system.entry.js → p-3af5faf8.system.entry.js} +1 -1
- package/dist/ionic/{p-31b2326e.system.js → p-3e1e14d9.system.js} +1 -1
- package/dist/ionic/{p-a42ef163.system.entry.js → p-456e19bb.system.entry.js} +1 -1
- package/dist/ionic/p-47e42aa3.system.entry.js +4 -0
- package/dist/ionic/{p-529b24fb.entry.js → p-4abb1251.entry.js} +1 -1
- package/dist/ionic/p-51abefb7.system.js +4 -0
- package/dist/ionic/{p-22827063.system.entry.js → p-530bb2af.system.entry.js} +1 -1
- package/dist/ionic/{p-96d4814f.system.entry.js → p-590447a5.system.entry.js} +1 -1
- package/dist/ionic/{p-1b27ac67.entry.js → p-5aec2208.entry.js} +1 -1
- package/dist/ionic/p-5cbfce20.entry.js +4 -0
- package/dist/ionic/{p-26c4bf85.entry.js → p-5f1b0512.entry.js} +1 -1
- package/dist/ionic/{p-10ec9af7.system.entry.js → p-5ff211d0.system.entry.js} +1 -1
- package/dist/ionic/{p-254ec7c0.system.entry.js → p-662a9a47.system.entry.js} +2 -2
- package/dist/ionic/{p-2894d5f6.entry.js → p-713af1fe.entry.js} +1 -1
- package/dist/ionic/p-7c0d778d.system.js +4 -0
- package/dist/ionic/{p-6e0539ea.system.entry.js → p-7dade589.system.entry.js} +1 -1
- package/dist/ionic/{p-a821750c.system.entry.js → p-8a25bf30.system.entry.js} +1 -1
- package/dist/ionic/p-8ad6d643.entry.js +4 -0
- package/dist/ionic/p-8b160fba.entry.js +4 -0
- package/dist/ionic/{p-799da666.entry.js → p-8e961825.entry.js} +1 -1
- package/dist/ionic/{p-f5d2dc9b.js → p-8ededb41.js} +1 -1
- package/dist/ionic/p-9164a09d.entry.js +4 -0
- package/dist/ionic/{p-b964aba3.entry.js → p-92bfb607.entry.js} +1 -1
- package/dist/ionic/p-97aaf697.system.entry.js +4 -0
- package/dist/ionic/{p-4685218a.system.entry.js → p-9a8bc8f3.system.entry.js} +1 -1
- package/dist/ionic/{p-bb3615f7.js → p-9b97df10.js} +1 -1
- package/dist/ionic/{p-3e8d5e53.entry.js → p-9c48f42f.entry.js} +1 -1
- package/dist/ionic/{p-9fda6824.system.entry.js → p-9f94e34a.system.entry.js} +1 -1
- package/dist/ionic/p-a17a9130.entry.js +4 -0
- package/dist/ionic/{p-7dcf795f.entry.js → p-a29db3a0.entry.js} +1 -1
- package/dist/ionic/p-a41eaff2.system.entry.js +4 -0
- package/dist/ionic/p-a60a1ce5.js +4 -0
- package/dist/ionic/{p-648ad047.system.entry.js → p-a6e5f54e.system.entry.js} +1 -1
- package/dist/ionic/{p-aee39e06.entry.js → p-aa8b021d.entry.js} +1 -1
- package/dist/ionic/{p-6855f26a.entry.js → p-aa975ff8.entry.js} +1 -1
- package/dist/ionic/{p-043aa6cc.system.entry.js → p-b59fe3bd.system.entry.js} +1 -1
- package/dist/ionic/p-b7e03ff0.system.entry.js +4 -0
- package/dist/ionic/{p-767f1a92.entry.js → p-bc01c384.entry.js} +1 -1
- package/dist/ionic/{p-a3ca2e64.entry.js → p-bec6ae40.entry.js} +1 -1
- package/dist/ionic/p-c001b24f.entry.js +4 -0
- package/dist/ionic/{p-06abe918.system.entry.js → p-c16fbc5f.system.entry.js} +1 -1
- package/dist/ionic/p-c19bf524.entry.js +4 -0
- package/dist/ionic/p-c6176849.system.entry.js +4 -0
- package/dist/ionic/{p-0cc80201.entry.js → p-c6e9ef77.entry.js} +1 -1
- package/dist/ionic/{p-ddd48faf.system.entry.js → p-cc700688.system.entry.js} +1 -1
- package/dist/ionic/p-cd3e1a06.entry.js +4 -0
- package/dist/ionic/p-cf350317.entry.js +4 -0
- package/dist/ionic/{p-da666998.system.entry.js → p-d01449a3.system.entry.js} +1 -1
- package/dist/ionic/{p-84b567a6.entry.js → p-d08e0136.entry.js} +1 -1
- package/dist/ionic/p-d1ad57d5.system.entry.js +4 -0
- package/dist/ionic/{p-28740823.system.entry.js → p-d2634efe.system.entry.js} +1 -1
- package/dist/ionic/{p-41208f54.system.entry.js → p-d88ed181.system.entry.js} +1 -1
- package/dist/ionic/p-dc63dccb.system.entry.js +4 -0
- package/dist/ionic/{p-11786dc7.entry.js → p-df6f50ef.entry.js} +1 -1
- package/dist/ionic/{p-c5acfeb1.entry.js → p-e403ff07.entry.js} +1 -1
- package/dist/ionic/{p-ae4b7df8.entry.js → p-e9431a58.entry.js} +1 -1
- package/dist/ionic/p-ec0a9b2c.system.entry.js +4 -0
- package/dist/ionic/{p-2a583966.entry.js → p-ee8b825e.entry.js} +1 -1
- package/dist/ionic/p-f0717d98.js +4 -0
- package/dist/ionic/{p-42925096.system.entry.js → p-f0dbd73e.system.entry.js} +1 -1
- package/dist/ionic/{p-806a9810.entry.js → p-f38c1f8d.entry.js} +1 -1
- package/dist/ionic/p-f60807dd.system.entry.js +4 -0
- package/dist/ionic/p-fc17f198.entry.js +4 -0
- package/dist/types/components/backdrop/backdrop.d.ts +0 -3
- package/dist/types/components/datetime/datetime.d.ts +0 -1
- package/dist/types/components/datetime/utils/data.d.ts +11 -7
- package/dist/types/components/menu/menu.d.ts +1 -1
- package/dist/types/components/picker/picker-interfaces.d.ts +8 -0
- package/dist/types/components/picker/picker.d.ts +75 -129
- package/dist/types/components/picker-column/picker-column-interfaces.d.ts +4 -0
- package/dist/types/components/picker-column/picker-column.d.ts +99 -39
- package/dist/types/components/picker-column-option/picker-column-option.d.ts +66 -0
- package/dist/types/components/picker-legacy/picker.d.ts +158 -0
- package/dist/types/components/picker-legacy-column/picker-column.d.ts +46 -0
- package/dist/types/components.d.ts +154 -122
- package/dist/types/interface.d.ts +1 -1
- package/dist/types/utils/config.d.ts +2 -2
- package/dist/types/utils/gesture/gesture-controller.d.ts +1 -0
- package/dist/types/utils/overlays.d.ts +5 -2
- package/hydrate/index.js +1540 -1448
- package/package.json +1 -1
- package/components/ion-picker-column-internal.d.ts +0 -11
- package/components/ion-picker-column-internal.js +0 -9
- package/components/ion-picker-internal.js +0 -9
- package/components/picker-column-internal.js +0 -390
- package/dist/collection/components/picker-column-internal/picker-column-internal.js +0 -565
- package/dist/collection/components/picker-column-internal/test/disabled/picker-column-internal.e2e.js +0 -162
- package/dist/collection/components/picker-internal/picker-internal.js +0 -544
- package/dist/collection/components/picker-internal/test/basic/picker-internal.e2e.js +0 -118
- package/dist/esm-es5/ion-picker-column-internal.entry.js +0 -4
- package/dist/esm-es5/ion-picker-internal.entry.js +0 -4
- package/dist/esm-es5/overlays-b33f6bca.js +0 -4
- package/dist/esm-es5/swipe-back-a6f386fc.js +0 -4
- package/dist/ionic/p-12a62500.entry.js +0 -4
- package/dist/ionic/p-1c249831.entry.js +0 -4
- package/dist/ionic/p-35ce400e.system.js +0 -4
- package/dist/ionic/p-3671f1b9.system.js +0 -4
- package/dist/ionic/p-47bb15a1.entry.js +0 -4
- package/dist/ionic/p-4981ea0a.system.entry.js +0 -4
- package/dist/ionic/p-4d145435.entry.js +0 -4
- package/dist/ionic/p-507ddbfe.system.entry.js +0 -4
- package/dist/ionic/p-6a6477b2.js +0 -4
- package/dist/ionic/p-6ab03751.js +0 -4
- package/dist/ionic/p-6c277fa2.system.entry.js +0 -4
- package/dist/ionic/p-6fba0ce1.system.entry.js +0 -4
- package/dist/ionic/p-7dc892f8.entry.js +0 -4
- package/dist/ionic/p-85f48531.entry.js +0 -4
- package/dist/ionic/p-8f301ac5.system.entry.js +0 -4
- package/dist/ionic/p-932f2259.system.entry.js +0 -4
- package/dist/ionic/p-a3013394.entry.js +0 -4
- package/dist/ionic/p-b1f29949.system.entry.js +0 -4
- package/dist/ionic/p-b7a2ffc9.system.entry.js +0 -4
- package/dist/ionic/p-beeed22c.system.entry.js +0 -4
- package/dist/ionic/p-cd1b920b.entry.js +0 -4
- package/dist/ionic/p-da5e2652.entry.js +0 -4
- package/dist/ionic/p-dc71e4ef.system.entry.js +0 -4
- package/dist/ionic/p-ec652bc0.system.entry.js +0 -4
- package/dist/types/components/picker-column-internal/picker-column-internal-interfaces.d.ts +0 -5
- package/dist/types/components/picker-column-internal/picker-column-internal.d.ts +0 -102
- package/dist/types/components/picker-internal/picker-internal-interfaces.d.ts +0 -8
- package/dist/types/components/picker-internal/picker-internal.d.ts +0 -102
- /package/dist/collection/components/{picker-internal/picker-internal-interfaces.js → picker/picker-interfaces.js} +0 -0
- /package/dist/collection/components/{picker-column-internal/picker-column-internal-interfaces.js → picker-column/picker-column-interfaces.js} +0 -0
- /package/dist/collection/components/{picker → picker-legacy}/animations/ios.enter.js +0 -0
- /package/dist/collection/components/{picker → picker-legacy}/animations/ios.leave.js +0 -0
- /package/dist/collection/components/{picker → picker-legacy}/picker-interface.js +0 -0
- /package/dist/collection/components/{picker-column → picker-legacy-column}/picker-column.ios.css +0 -0
- /package/dist/collection/components/{picker-column → picker-legacy-column}/test/test.utils.js +0 -0
- /package/dist/esm-es5/{data-775093f5.js → data-6a31d701.js} +0 -0
- /package/dist/ionic/{p-87bb3735.system.js → p-7ff4359e.system.js} +0 -0
- /package/dist/ionic/{p-18cae04f.js → p-a64accf5.js} +0 -0
- /package/dist/types/components/{picker → picker-legacy}/animations/ios.enter.d.ts +0 -0
- /package/dist/types/components/{picker → picker-legacy}/animations/ios.leave.d.ts +0 -0
- /package/dist/types/components/{picker → picker-legacy}/picker-interface.d.ts +0 -0
- /package/dist/types/components/{picker-column → picker-legacy-column}/test/test.utils.d.ts +0 -0
|
@@ -4,14 +4,52 @@
|
|
|
4
4
|
import AxeBuilder from "@axe-core/playwright";
|
|
5
5
|
import { expect } from "@playwright/test";
|
|
6
6
|
import { configs, test } from "../../../../utils/test/playwright/index";
|
|
7
|
-
configs({ directions: ['ltr'] }).forEach(({ title, config
|
|
7
|
+
configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
|
|
8
8
|
test.describe(title('textarea: a11y'), () => {
|
|
9
|
-
test('should not have accessibility violations', async ({ page }) => {
|
|
10
|
-
await page.
|
|
9
|
+
test('default layout should not have accessibility violations', async ({ page }) => {
|
|
10
|
+
await page.setContent(`
|
|
11
|
+
<main>
|
|
12
|
+
<ion-textarea label="Label" placeholder="Placeholder"></ion-textarea>
|
|
13
|
+
<ion-textarea placeholder="Placeholder">
|
|
14
|
+
<div slot="label">Label"></div>
|
|
15
|
+
</ion-textarea>
|
|
16
|
+
<ion-textarea label="Label" value="My Text"></ion-textarea>
|
|
17
|
+
<ion-textarea aria-label="Label"></ion-textarea>
|
|
18
|
+
<ion-textarea label="Email" label-placement="floating" fill="solid" value="hi@ionic.io">
|
|
19
|
+
<ion-icon slot="start" name="lock-closed" aria-hidden="true"></ion-icon>
|
|
20
|
+
<ion-button slot="end" aria-label="button">
|
|
21
|
+
<ion-icon slot="icon-only" name="lock-closed" aria-hidden="true"></ion-icon>
|
|
22
|
+
</ion-button>
|
|
23
|
+
</ion-textarea>
|
|
24
|
+
</main>
|
|
25
|
+
`, config);
|
|
26
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
27
|
+
expect(results.violations).toEqual([]);
|
|
28
|
+
});
|
|
29
|
+
test('focused state should not have accessibility violations', async ({ page }) => {
|
|
30
|
+
/**
|
|
31
|
+
* The primary color against the focus background
|
|
32
|
+
* when using fill="solid" does not meet AA
|
|
33
|
+
* contrast guidelines so it excluded from the test.
|
|
34
|
+
* The contrast here is a significant improvement
|
|
35
|
+
* over what Ionic has had in the past, so the team
|
|
36
|
+
* has decided that this tradeoff is acceptable since
|
|
37
|
+
* the scope of the problem is limited to the focus
|
|
38
|
+
* state with the primary color when fill="solid".
|
|
39
|
+
*/
|
|
40
|
+
await page.setContent(`
|
|
41
|
+
<main>
|
|
42
|
+
<ion-textarea class="has-focus" label="Label" value="My Text"></ion-textarea>
|
|
43
|
+
<ion-textarea class="has-focus" label-placement="floating" label="Label" value="My Text"></ion-textarea>
|
|
44
|
+
<ion-textarea class="has-focus" fill="outline" label-placement="floating" label="Label" value="My Text"></ion-textarea>
|
|
45
|
+
</main>
|
|
46
|
+
`, config);
|
|
11
47
|
const results = await new AxeBuilder({ page }).analyze();
|
|
12
48
|
expect(results.violations).toEqual([]);
|
|
13
49
|
});
|
|
14
50
|
});
|
|
51
|
+
});
|
|
52
|
+
configs({ directions: ['ltr'] }).forEach(({ title, config, screenshot }) => {
|
|
15
53
|
test.describe(title('textarea: font scaling'), () => {
|
|
16
54
|
test('should scale text on larger font sizes', async ({ page }) => {
|
|
17
55
|
await page.setContent(`
|
|
@@ -91,9 +91,9 @@
|
|
|
91
91
|
--padding-start: 0;
|
|
92
92
|
--border-radius: 0;
|
|
93
93
|
--border-style: solid;
|
|
94
|
-
--highlight-color-focused: var(--ion-color-primary, #
|
|
95
|
-
--highlight-color-valid: var(--ion-color-success, #
|
|
96
|
-
--highlight-color-invalid: var(--ion-color-danger, #
|
|
94
|
+
--highlight-color-focused: var(--ion-color-primary, #0054e9);
|
|
95
|
+
--highlight-color-valid: var(--ion-color-success, #2dd55b);
|
|
96
|
+
--highlight-color-invalid: var(--ion-color-danger, #c5000f);
|
|
97
97
|
/**
|
|
98
98
|
* This is a private API that is used to switch
|
|
99
99
|
* out the highlight color based on the state
|
|
@@ -91,9 +91,9 @@
|
|
|
91
91
|
--padding-start: 0;
|
|
92
92
|
--border-radius: 0;
|
|
93
93
|
--border-style: solid;
|
|
94
|
-
--highlight-color-focused: var(--ion-color-primary, #
|
|
95
|
-
--highlight-color-valid: var(--ion-color-success, #
|
|
96
|
-
--highlight-color-invalid: var(--ion-color-danger, #
|
|
94
|
+
--highlight-color-focused: var(--ion-color-primary, #0054e9);
|
|
95
|
+
--highlight-color-valid: var(--ion-color-success, #2dd55b);
|
|
96
|
+
--highlight-color-invalid: var(--ion-color-danger, #c5000f);
|
|
97
97
|
/**
|
|
98
98
|
* This is a private API that is used to switch
|
|
99
99
|
* out the highlight color based on the state
|
|
@@ -4,6 +4,62 @@
|
|
|
4
4
|
import AxeBuilder from "@axe-core/playwright";
|
|
5
5
|
import { expect } from "@playwright/test";
|
|
6
6
|
import { configs, test } from "../../../../utils/test/playwright/index";
|
|
7
|
+
configs({ directions: ['ltr'], themes: ['dark', 'light'] }).forEach(({ title, config }) => {
|
|
8
|
+
test.describe(title('toast: Axe testing'), () => {
|
|
9
|
+
test('should not have any axe violations with inline toasts', async ({ page }) => {
|
|
10
|
+
await page.setContent(`
|
|
11
|
+
<ion-toast></ion-toast>
|
|
12
|
+
|
|
13
|
+
<script>
|
|
14
|
+
const toast = document.querySelector('ion-toast');
|
|
15
|
+
toast.icon = 'person';
|
|
16
|
+
toast.header = 'Inline Toast Header';
|
|
17
|
+
toast.message = 'Inline Toast Message';
|
|
18
|
+
toast.buttons = ['OK'];
|
|
19
|
+
</script>
|
|
20
|
+
`, config);
|
|
21
|
+
const ionToastDidPresent = await page.spyOnEvent('ionToastDidPresent');
|
|
22
|
+
const toast = page.locator('ion-toast');
|
|
23
|
+
await toast.evaluate((el) => el.present());
|
|
24
|
+
await ionToastDidPresent.next();
|
|
25
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
26
|
+
expect(results.violations).toEqual([]);
|
|
27
|
+
});
|
|
28
|
+
test('should not have any axe violations with controller toasts', async ({ page }) => {
|
|
29
|
+
await page.setContent(`
|
|
30
|
+
<script type="module">
|
|
31
|
+
import { toastController } from '../../../../dist/ionic/index.esm.js';
|
|
32
|
+
window.toastController = toastController;
|
|
33
|
+
</script>
|
|
34
|
+
|
|
35
|
+
<ion-button onclick="presentToast()">Present</ion-button>
|
|
36
|
+
|
|
37
|
+
<script>
|
|
38
|
+
const presentToast = async () => {
|
|
39
|
+
// we only want to test color contrast on the toast itself
|
|
40
|
+
const button = document.querySelector('ion-button');
|
|
41
|
+
button.style.display = 'none';
|
|
42
|
+
|
|
43
|
+
const toast = await toastController.create({
|
|
44
|
+
icon: 'person',
|
|
45
|
+
header: 'Controller Toast Header',
|
|
46
|
+
message: 'Controller Toast Message',
|
|
47
|
+
buttons: ['OK']
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
await toast.present();
|
|
51
|
+
};
|
|
52
|
+
</script>
|
|
53
|
+
`, config);
|
|
54
|
+
const ionToastDidPresent = await page.spyOnEvent('ionToastDidPresent');
|
|
55
|
+
const button = page.locator('ion-button');
|
|
56
|
+
await button.click();
|
|
57
|
+
await ionToastDidPresent.next();
|
|
58
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
59
|
+
expect(results.violations).toEqual([]);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
});
|
|
7
63
|
/**
|
|
8
64
|
* This test does not check LTR vs RTL layouts
|
|
9
65
|
*/
|
|
@@ -12,30 +68,6 @@ configs({ directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
|
|
|
12
68
|
test.beforeEach(async ({ page }) => {
|
|
13
69
|
await page.goto(`/src/components/toast/test/a11y`, config);
|
|
14
70
|
});
|
|
15
|
-
test('should not have any axe violations with inline toasts', async ({ page }) => {
|
|
16
|
-
const didPresent = await page.spyOnEvent('ionToastDidPresent');
|
|
17
|
-
await page.click('#inline-toast-trigger');
|
|
18
|
-
await didPresent.next();
|
|
19
|
-
/**
|
|
20
|
-
* IonToast overlays the entire screen, so
|
|
21
|
-
* Axe will be unable to verify color contrast
|
|
22
|
-
* on elements under the toast.
|
|
23
|
-
*/
|
|
24
|
-
const results = await new AxeBuilder({ page }).disableRules('color-contrast').analyze();
|
|
25
|
-
expect(results.violations).toEqual([]);
|
|
26
|
-
});
|
|
27
|
-
test('should not have any axe violations with controller toasts', async ({ page }) => {
|
|
28
|
-
const didPresent = await page.spyOnEvent('ionToastDidPresent');
|
|
29
|
-
await page.click('#controller-toast-trigger');
|
|
30
|
-
await didPresent.next();
|
|
31
|
-
/**
|
|
32
|
-
* IonToast overlays the entire screen, so
|
|
33
|
-
* Axe will be unable to verify color contrast
|
|
34
|
-
* on elements under the toast.
|
|
35
|
-
*/
|
|
36
|
-
const results = await new AxeBuilder({ page }).disableRules('color-contrast').analyze();
|
|
37
|
-
expect(results.violations).toEqual([]);
|
|
38
|
-
});
|
|
39
71
|
test('should have aria-labelledby and aria-label added to the button when htmlAttributes is set', async ({ page, }) => {
|
|
40
72
|
const didPresent = await page.spyOnEvent('ionToastDidPresent');
|
|
41
73
|
await page.click('#aria-label-toast-trigger');
|
|
@@ -323,7 +323,7 @@
|
|
|
323
323
|
:host {
|
|
324
324
|
--background: var(--ion-color-step-50, #f2f2f2);
|
|
325
325
|
--border-radius: 14px;
|
|
326
|
-
--button-color: var(--ion-color-primary, #
|
|
326
|
+
--button-color: var(--ion-color-primary, #0054e9);
|
|
327
327
|
--color: var(--ion-color-step-850, #262626);
|
|
328
328
|
--max-width: 700px;
|
|
329
329
|
--max-height: 478px;
|
|
@@ -324,7 +324,7 @@
|
|
|
324
324
|
--background: var(--ion-color-step-800, #333333);
|
|
325
325
|
--border-radius: 4px;
|
|
326
326
|
--box-shadow: 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12);
|
|
327
|
-
--button-color: var(--ion-color-primary, #
|
|
327
|
+
--button-color: var(--ion-color-primary, #0054e9);
|
|
328
328
|
--color: var(--ion-color-step-50, #f2f2f2);
|
|
329
329
|
--max-width: 700px;
|
|
330
330
|
--start: 8px;
|
|
@@ -421,7 +421,7 @@
|
|
|
421
421
|
|
|
422
422
|
@media (any-hover: hover) {
|
|
423
423
|
.toast-button:hover {
|
|
424
|
-
background-color: rgba(var(--ion-color-primary-rgb,
|
|
424
|
+
background-color: rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.08);
|
|
425
425
|
}
|
|
426
426
|
.toast-button-cancel:hover {
|
|
427
427
|
background-color: rgba(var(--ion-background-color-rgb, 255, 255, 255), 0.08);
|
|
@@ -4,10 +4,16 @@
|
|
|
4
4
|
import AxeBuilder from "@axe-core/playwright";
|
|
5
5
|
import { expect } from "@playwright/test";
|
|
6
6
|
import { configs, test } from "../../../../utils/test/playwright/index";
|
|
7
|
-
configs({
|
|
7
|
+
configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
|
|
8
8
|
test.describe(title('toggle: a11y'), () => {
|
|
9
9
|
test('should not have accessibility violations', async ({ page }) => {
|
|
10
|
-
await page.
|
|
10
|
+
await page.setContent(`
|
|
11
|
+
<main>
|
|
12
|
+
<ion-toggle>my label</ion-toggle>
|
|
13
|
+
<ion-toggle aria-label="my aria label"></ion-toggle>
|
|
14
|
+
<ion-toggle checked="true">Checked</ion-toggle>
|
|
15
|
+
</main>
|
|
16
|
+
`, config);
|
|
11
17
|
const results = await new AxeBuilder({ page }).analyze();
|
|
12
18
|
expect(results.violations).toEqual([]);
|
|
13
19
|
});
|
|
@@ -532,7 +532,7 @@ input {
|
|
|
532
532
|
*/
|
|
533
533
|
:host {
|
|
534
534
|
--track-background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.088);
|
|
535
|
-
--track-background-checked: var(--ion-color-primary, #
|
|
535
|
+
--track-background-checked: var(--ion-color-primary, #0054e9);
|
|
536
536
|
--border-radius: 16px;
|
|
537
537
|
--handle-background: #ffffff;
|
|
538
538
|
--handle-background-checked: #ffffff;
|
|
@@ -532,10 +532,10 @@ input {
|
|
|
532
532
|
*/
|
|
533
533
|
:host {
|
|
534
534
|
--track-background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.39);
|
|
535
|
-
--track-background-checked: rgba(var(--ion-color-primary-rgb,
|
|
535
|
+
--track-background-checked: rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.5);
|
|
536
536
|
--border-radius: 14px;
|
|
537
537
|
--handle-background: #ffffff;
|
|
538
|
-
--handle-background-checked: var(--ion-color-primary, #
|
|
538
|
+
--handle-background-checked: var(--ion-color-primary, #0054e9);
|
|
539
539
|
--handle-border-radius: 50%;
|
|
540
540
|
--handle-box-shadow: 0 3px 1px -2px rgba(0, 0, 0, 0.2), 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12);
|
|
541
541
|
--handle-width: 20px;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
2
|
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
3
|
*/
|
|
4
|
+
import AxeBuilder from "@axe-core/playwright";
|
|
4
5
|
import { expect } from "@playwright/test";
|
|
5
6
|
import { configs, test } from "../../../utils/test/playwright/index";
|
|
6
7
|
configs({ directions: ['ltr'], modes: ['ios'] }).forEach(({ title, screenshot, config }) => {
|
|
@@ -30,3 +31,20 @@ configs({ directions: ['ltr'], modes: ['ios'] }).forEach(({ title, screenshot, c
|
|
|
30
31
|
});
|
|
31
32
|
});
|
|
32
33
|
});
|
|
34
|
+
configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ config, title }) => {
|
|
35
|
+
test.describe(title('typography: a11y'), () => {
|
|
36
|
+
test('should not have accessibility violations for anchor tags', async ({ page }) => {
|
|
37
|
+
/**
|
|
38
|
+
* All page content should be contained by landmarks (main, nav, etc.)
|
|
39
|
+
* By containing the badge in a main element, we can avoid this violation.
|
|
40
|
+
*/
|
|
41
|
+
await page.setContent(`
|
|
42
|
+
<main>
|
|
43
|
+
<a href="#">Link</a>
|
|
44
|
+
</main>
|
|
45
|
+
`, config);
|
|
46
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
47
|
+
expect(results.violations).toEqual([]);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import AxeBuilder from "@axe-core/playwright";
|
|
5
|
+
import { expect } from "@playwright/test";
|
|
6
|
+
import { configs, test } from "../../../utils/test/playwright/index";
|
|
7
|
+
const styleTestHelpers = `
|
|
8
|
+
<style>
|
|
9
|
+
main {
|
|
10
|
+
background: var(--ion-color-contrast);
|
|
11
|
+
}
|
|
12
|
+
.ion-background {
|
|
13
|
+
background: var(--ion-color-base);
|
|
14
|
+
}
|
|
15
|
+
.ion-background-shade {
|
|
16
|
+
background: var(--ion-color-shade);
|
|
17
|
+
}
|
|
18
|
+
.ion-background-tint {
|
|
19
|
+
background: var(--ion-color-tint);
|
|
20
|
+
}
|
|
21
|
+
.ion-background-opacity-08 {
|
|
22
|
+
background: rgba(var(--ion-color-base-rgb), 0.08);
|
|
23
|
+
}
|
|
24
|
+
.ion-background-opacity-12 {
|
|
25
|
+
background: rgba(var(--ion-color-base-rgb), 0.12);
|
|
26
|
+
}
|
|
27
|
+
.ion-background-opacity-16 {
|
|
28
|
+
background: rgba(var(--ion-color-base-rgb), 0.16);
|
|
29
|
+
}
|
|
30
|
+
.ion-color {
|
|
31
|
+
color: var(--ion-color-base);
|
|
32
|
+
}
|
|
33
|
+
.ion-color-contrast {
|
|
34
|
+
color: var(--ion-color-contrast);
|
|
35
|
+
}
|
|
36
|
+
</style>
|
|
37
|
+
`;
|
|
38
|
+
/**
|
|
39
|
+
* All colors should be tested in the following scenarios:
|
|
40
|
+
* 1) The base color as the text color against the contrast color as the background color
|
|
41
|
+
* 2) The contrast color as the text color against the base color as the background color
|
|
42
|
+
* 3) The contrast color as the text color against the shade color as the background color
|
|
43
|
+
* 4) The contrast color as the text color against the tint color as the background color
|
|
44
|
+
* 5) The base color as the text color against the base color at 0.08 opacity as the background color
|
|
45
|
+
* 6) The base color as the text color against the base color at 0.12 opacity as the background color
|
|
46
|
+
* 7) The base color as the text color against the base color at 0.16 opacity as the background color
|
|
47
|
+
*/
|
|
48
|
+
configs({ modes: ['md'], directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ config, title }) => {
|
|
49
|
+
const colors = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'light', 'medium', 'dark'];
|
|
50
|
+
test.describe(title('theme'), () => {
|
|
51
|
+
test.beforeEach(({ skip }) => {
|
|
52
|
+
skip.browser('firefox', 'Color contrast ratio is consistent across browsers');
|
|
53
|
+
skip.browser('webkit', 'Color contrast ratio is consistent across browsers');
|
|
54
|
+
});
|
|
55
|
+
for (const color of colors) {
|
|
56
|
+
test(`color "${color}" should pass AA guidelines`, async ({ page }) => {
|
|
57
|
+
await page.setContent(`${styleTestHelpers}
|
|
58
|
+
<main class="ion-color-${color}">
|
|
59
|
+
<p class="ion-color">Hello World</p>
|
|
60
|
+
</main>`, config);
|
|
61
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
62
|
+
expect(results.violations).toEqual([]);
|
|
63
|
+
});
|
|
64
|
+
test(`contrast color on "${color}" background should pass AA guidelines`, async ({ page }) => {
|
|
65
|
+
await page.setContent(`${styleTestHelpers}
|
|
66
|
+
<main class="ion-color-${color}">
|
|
67
|
+
<p class="ion-color-contrast ion-background">Hello World</p>
|
|
68
|
+
</main>`, config);
|
|
69
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
70
|
+
expect(results.violations).toEqual([]);
|
|
71
|
+
});
|
|
72
|
+
test(`contrast color on "${color}" background shade should pass AA guidelines`, async ({ page }) => {
|
|
73
|
+
await page.setContent(`${styleTestHelpers}
|
|
74
|
+
<main class="ion-color-${color}">
|
|
75
|
+
<p class="ion-color-contrast ion-background-shade">Hello World</p>
|
|
76
|
+
</main>`, config);
|
|
77
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
78
|
+
expect(results.violations).toEqual([]);
|
|
79
|
+
});
|
|
80
|
+
test(`contrast color on "${color}" background tint should pass AA guidelines`, async ({ page }) => {
|
|
81
|
+
await page.setContent(`${styleTestHelpers}
|
|
82
|
+
<main class="ion-color-${color}">
|
|
83
|
+
<p class="ion-color-contrast ion-background-tint">Hello World</p>
|
|
84
|
+
</main>`, config);
|
|
85
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
86
|
+
expect(results.violations).toEqual([]);
|
|
87
|
+
});
|
|
88
|
+
test(`color "${color}" on 0.08 opacity background should pass AA guidelines`, async ({ page }) => {
|
|
89
|
+
await page.setContent(`${styleTestHelpers}
|
|
90
|
+
<main class="ion-color-${color}">
|
|
91
|
+
<p class="ion-color ion-background-opacity-08">Hello World</p>
|
|
92
|
+
</main>`, config);
|
|
93
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
94
|
+
expect(results.violations).toEqual([]);
|
|
95
|
+
});
|
|
96
|
+
test(`color "${color}" on 0.12 opacity background should pass AA guidelines`, async ({ page }) => {
|
|
97
|
+
await page.setContent(`${styleTestHelpers}
|
|
98
|
+
<main class="ion-color-${color}">
|
|
99
|
+
<p class="ion-color ion-background-opacity-12">Hello World</p>
|
|
100
|
+
</main>`, config);
|
|
101
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
102
|
+
expect(results.violations).toEqual([]);
|
|
103
|
+
});
|
|
104
|
+
test(`color "${color}" on 0.16 opacity background should pass AA guidelines`, async ({ page }) => {
|
|
105
|
+
await page.setContent(`${styleTestHelpers}
|
|
106
|
+
<main class="ion-color-${color}">
|
|
107
|
+
<p class="ion-color ion-background-opacity-16">Hello World</p>
|
|
108
|
+
</main>`, config);
|
|
109
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
110
|
+
expect(results.violations).toEqual([]);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -5,6 +5,7 @@ import { doc } from "./browser/index";
|
|
|
5
5
|
import { config } from "../global/config";
|
|
6
6
|
import { getIonMode } from "../global/ionic-global";
|
|
7
7
|
import { CoreDelegate } from "./framework-delegate";
|
|
8
|
+
import { BACKDROP_NO_SCROLL } from "./gesture/gesture-controller";
|
|
8
9
|
import { OVERLAY_BACK_BUTTON_PRIORITY } from "./hardware-back-button";
|
|
9
10
|
import { addEventListener, componentOnReady, focusElement, getElementRoot, removeEventListener } from "./helpers";
|
|
10
11
|
import { printIonWarning } from "./logging";
|
|
@@ -28,7 +29,10 @@ export const alertController = /*@__PURE__*/ createController('ion-alert');
|
|
|
28
29
|
export const actionSheetController = /*@__PURE__*/ createController('ion-action-sheet');
|
|
29
30
|
export const loadingController = /*@__PURE__*/ createController('ion-loading');
|
|
30
31
|
export const modalController = /*@__PURE__*/ createController('ion-modal');
|
|
31
|
-
|
|
32
|
+
/**
|
|
33
|
+
* @deprecated Use the inline ion-picker component instead.
|
|
34
|
+
*/
|
|
35
|
+
export const pickerController = /*@__PURE__*/ createController('ion-picker-legacy');
|
|
32
36
|
export const popoverController = /*@__PURE__*/ createController('ion-popover');
|
|
33
37
|
export const toastController = /*@__PURE__*/ createController('ion-toast');
|
|
34
38
|
/**
|
|
@@ -138,7 +142,7 @@ const focusLastDescendant = (ref, overlay) => {
|
|
|
138
142
|
* Should NOT include: Toast
|
|
139
143
|
*/
|
|
140
144
|
const trapKeyboardFocus = (ev, doc) => {
|
|
141
|
-
const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover');
|
|
145
|
+
const lastOverlay = getPresentedOverlay(doc, 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover');
|
|
142
146
|
const target = ev.target;
|
|
143
147
|
/**
|
|
144
148
|
* If no active overlay, ignore this event.
|
|
@@ -323,7 +327,7 @@ export const dismissOverlay = (doc, data, role, overlayTag, id) => {
|
|
|
323
327
|
*/
|
|
324
328
|
export const getOverlays = (doc, selector) => {
|
|
325
329
|
if (selector === undefined) {
|
|
326
|
-
selector = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker,ion-popover,ion-toast';
|
|
330
|
+
selector = 'ion-alert,ion-action-sheet,ion-loading,ion-modal,ion-picker-legacy,ion-popover,ion-toast';
|
|
327
331
|
}
|
|
328
332
|
return Array.from(doc.querySelectorAll(selector)).filter((c) => c.overlayIndex > 0);
|
|
329
333
|
};
|
|
@@ -389,6 +393,7 @@ export const present = async (overlay, name, iosEnterAnimation, mdEnterAnimation
|
|
|
389
393
|
return;
|
|
390
394
|
}
|
|
391
395
|
setRootAriaHidden(true);
|
|
396
|
+
document.body.classList.add(BACKDROP_NO_SCROLL);
|
|
392
397
|
overlay.presented = true;
|
|
393
398
|
overlay.willPresent.emit();
|
|
394
399
|
(_a = overlay.willPresentShorthand) === null || _a === void 0 ? void 0 : _a.emit();
|
|
@@ -451,12 +456,14 @@ export const dismiss = async (overlay, data, role, name, iosLeaveAnimation, mdLe
|
|
|
451
456
|
if (!overlay.presented) {
|
|
452
457
|
return false;
|
|
453
458
|
}
|
|
459
|
+
const lastOverlay = doc !== undefined && getPresentedOverlays(doc).length === 1;
|
|
454
460
|
/**
|
|
455
461
|
* If this is the last visible overlay then
|
|
456
462
|
* we want to re-add the root to the accessibility tree.
|
|
457
463
|
*/
|
|
458
|
-
if (
|
|
464
|
+
if (lastOverlay) {
|
|
459
465
|
setRootAriaHidden(false);
|
|
466
|
+
document.body.classList.remove(BACKDROP_NO_SCROLL);
|
|
460
467
|
}
|
|
461
468
|
overlay.presented = false;
|
|
462
469
|
try {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import { newSpecPage } from "@stencil/core/testing";
|
|
5
|
+
import { Modal } from "../../../components/modal/modal";
|
|
6
|
+
describe('overlays: scroll blocking', () => {
|
|
7
|
+
it('should not block scroll when the overlay is created', async () => {
|
|
8
|
+
const page = await newSpecPage({
|
|
9
|
+
components: [Modal],
|
|
10
|
+
html: `
|
|
11
|
+
<ion-modal></ion-modal>
|
|
12
|
+
`,
|
|
13
|
+
});
|
|
14
|
+
const body = page.doc.querySelector('body');
|
|
15
|
+
expect(body).not.toHaveClass('backdrop-no-scroll');
|
|
16
|
+
});
|
|
17
|
+
it('should block scroll when the overlay is presented', async () => {
|
|
18
|
+
const page = await newSpecPage({
|
|
19
|
+
components: [Modal],
|
|
20
|
+
html: `
|
|
21
|
+
<ion-modal></ion-modal>
|
|
22
|
+
`,
|
|
23
|
+
});
|
|
24
|
+
const modal = page.body.querySelector('ion-modal');
|
|
25
|
+
const body = page.doc.querySelector('body');
|
|
26
|
+
await modal.present();
|
|
27
|
+
expect(body).toHaveClass('backdrop-no-scroll');
|
|
28
|
+
await modal.dismiss();
|
|
29
|
+
expect(body).not.toHaveClass('backdrop-no-scroll');
|
|
30
|
+
});
|
|
31
|
+
it('should not block scroll when the overlay is dismissed', async () => {
|
|
32
|
+
const page = await newSpecPage({
|
|
33
|
+
components: [Modal],
|
|
34
|
+
html: `
|
|
35
|
+
<ion-modal></ion-modal>
|
|
36
|
+
`,
|
|
37
|
+
});
|
|
38
|
+
const modal = page.body.querySelector('ion-modal');
|
|
39
|
+
const body = page.doc.querySelector('body');
|
|
40
|
+
await modal.present();
|
|
41
|
+
expect(body).toHaveClass('backdrop-no-scroll');
|
|
42
|
+
await modal.dismiss();
|
|
43
|
+
expect(body).not.toHaveClass('backdrop-no-scroll');
|
|
44
|
+
});
|
|
45
|
+
it('should not enable scroll until last overlay is dismissed', async () => {
|
|
46
|
+
const page = await newSpecPage({
|
|
47
|
+
components: [Modal],
|
|
48
|
+
html: `
|
|
49
|
+
<ion-modal id="one"></ion-modal>
|
|
50
|
+
<ion-modal id="two"></ion-modal>
|
|
51
|
+
`,
|
|
52
|
+
});
|
|
53
|
+
const modalOne = page.body.querySelector('#one');
|
|
54
|
+
const modalTwo = page.body.querySelector('#two');
|
|
55
|
+
const body = page.doc.querySelector('body');
|
|
56
|
+
await modalOne.present();
|
|
57
|
+
expect(body).toHaveClass('backdrop-no-scroll');
|
|
58
|
+
await modalTwo.present();
|
|
59
|
+
expect(body).toHaveClass('backdrop-no-scroll');
|
|
60
|
+
await modalOne.dismiss();
|
|
61
|
+
expect(body).toHaveClass('backdrop-no-scroll');
|
|
62
|
+
await modalTwo.dismiss();
|
|
63
|
+
expect(body).not.toHaveClass('backdrop-no-scroll');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
@@ -39,7 +39,7 @@ export const setContent = async (page, html, testInfo, options) => {
|
|
|
39
39
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0" />
|
|
40
40
|
<link href="${baseUrl}/css/ionic.bundle.css" rel="stylesheet" />
|
|
41
41
|
<link href="${baseUrl}/scripts/testing/styles.css" rel="stylesheet" />
|
|
42
|
-
${theme !== 'light' ? `<link href="${baseUrl}/
|
|
42
|
+
${theme !== 'light' ? `<link href="${baseUrl}/src/themes/test/${theme}.css" rel="stylesheet" />` : ''}
|
|
43
43
|
<script src="${baseUrl}/scripts/testing/scripts.js"></script>
|
|
44
44
|
<script type="module" src="${baseUrl}/dist/ionic/ionic.esm.js"></script>
|
|
45
45
|
<script>
|