@ionic/core 7.6.2-dev.11704390532.1202188d → 7.6.2-dev.11704834200.17f5bc99
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/button.js +2 -2
- package/components/checkbox.js +2 -2
- package/components/ion-back-button.js +1 -1
- package/components/ion-badge.js +2 -2
- package/components/ion-content.js +2 -3
- 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-menu.js +6 -13
- package/components/ion-picker-legacy.js +2 -2
- 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-split-pane.js +40 -12
- 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/picker-column2.js +1 -1
- 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/ion-action-sheet.cjs.entry.js +1 -1
- package/dist/cjs/ion-alert.cjs.entry.js +2 -2
- package/dist/cjs/ion-app_8.cjs.entry.js +2 -3
- 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-button_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-checkbox.cjs.entry.js +2 -2
- package/dist/cjs/ion-datetime_3.cjs.entry.js +3 -3
- 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 +2 -2
- package/dist/cjs/ion-item_8.cjs.entry.js +3 -3
- package/dist/cjs/ion-loading.cjs.entry.js +1 -1
- package/dist/cjs/ion-menu_3.cjs.entry.js +7 -14
- package/dist/cjs/ion-progress-bar.cjs.entry.js +2 -2
- package/dist/cjs/ion-radio_2.cjs.entry.js +2 -2
- package/dist/cjs/ion-range.cjs.entry.js +2 -2
- package/dist/cjs/ion-refresher_2.cjs.entry.js +2 -2
- 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 +1 -1
- package/dist/cjs/ion-select_3.cjs.entry.js +3 -3
- package/dist/cjs/ion-split-pane.cjs.entry.js +37 -10
- 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 +2 -2
- package/dist/cjs/ion-toggle.cjs.entry.js +2 -2
- package/dist/cjs/ionic.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- 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/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 +10 -10
- package/dist/collection/components/button/button.md.css +8 -8
- package/dist/collection/components/button/test/a11y/button.e2e.js +48 -0
- 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.js +2 -3
- 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/menu.ios.css +64 -3
- package/dist/collection/components/menu/menu.js +4 -11
- package/dist/collection/components/menu/menu.md.css +64 -3
- 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-legacy/picker.ios.css +1 -1
- package/dist/collection/components/picker-legacy/picker.md.css +1 -1
- package/dist/collection/components/picker-legacy-column/picker-column.md.css +1 -1
- 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/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/split-pane/split-pane.ios.css +1 -53
- package/dist/collection/components/split-pane/split-pane.js +75 -8
- package/dist/collection/components/split-pane/split-pane.md.css +1 -53
- package/dist/collection/components/split-pane/test/wrapped-menu/split-pane.e2e.js +19 -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/test/playwright/generator.js +1 -0
- package/dist/collection/utils/test/playwright/page/utils/set-content.js +1 -1
- package/dist/docs.json +8 -2
- package/dist/esm/ion-action-sheet.entry.js +1 -1
- package/dist/esm/ion-alert.entry.js +2 -2
- package/dist/esm/ion-app_8.entry.js +2 -3
- package/dist/esm/ion-avatar_3.entry.js +2 -2
- package/dist/esm/ion-back-button.entry.js +1 -1
- package/dist/esm/ion-button_2.entry.js +2 -2
- package/dist/esm/ion-checkbox.entry.js +2 -2
- package/dist/esm/ion-datetime_3.entry.js +3 -3
- 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 +2 -2
- package/dist/esm/ion-item_8.entry.js +3 -3
- package/dist/esm/ion-loading.entry.js +1 -1
- package/dist/esm/ion-menu_3.entry.js +7 -14
- package/dist/esm/ion-progress-bar.entry.js +2 -2
- package/dist/esm/ion-radio_2.entry.js +2 -2
- package/dist/esm/ion-range.entry.js +2 -2
- package/dist/esm/ion-refresher_2.entry.js +2 -2
- 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 +1 -1
- package/dist/esm/ion-select_3.entry.js +3 -3
- package/dist/esm/ion-split-pane.entry.js +37 -10
- 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 +2 -2
- package/dist/esm/ion-toggle.entry.js +2 -2
- package/dist/esm/ionic.js +1 -1
- package/dist/esm/loader.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-button_2.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-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-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-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-split-pane.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/ionic/ionic.esm.js +1 -1
- package/dist/ionic/{p-61e4d3ec.entry.js → p-068950da.entry.js} +1 -1
- package/dist/ionic/{p-80c6c078.entry.js → p-0832dedf.entry.js} +1 -1
- package/dist/ionic/p-19d9ceb8.system.js +1 -1
- package/dist/ionic/{p-a1bd098f.system.entry.js → p-1c453add.system.entry.js} +1 -1
- package/dist/ionic/{p-11bf2ad0.system.entry.js → p-1d5b03e3.system.entry.js} +1 -1
- package/dist/ionic/{p-92d35b6a.entry.js → p-2724403e.entry.js} +1 -1
- package/dist/ionic/p-283bc1a1.system.entry.js +4 -0
- package/dist/ionic/{p-abd5d0d5.system.entry.js → p-354682e8.system.entry.js} +1 -1
- package/dist/ionic/{p-19c379da.system.entry.js → p-3796194b.system.entry.js} +1 -1
- package/dist/ionic/{p-cf53213c.entry.js → p-385bb983.entry.js} +1 -1
- package/dist/ionic/{p-4793c14c.system.entry.js → p-456e19bb.system.entry.js} +1 -1
- package/dist/ionic/{p-77d78f68.system.entry.js → p-47e42aa3.system.entry.js} +1 -1
- package/dist/ionic/{p-529b24fb.entry.js → p-4abb1251.entry.js} +1 -1
- package/dist/ionic/{p-e2737fef.system.entry.js → p-530bb2af.system.entry.js} +1 -1
- package/dist/ionic/p-57f02351.entry.js +4 -0
- package/dist/ionic/{p-0e908476.system.entry.js → p-590447a5.system.entry.js} +1 -1
- package/dist/ionic/{p-642ac927.entry.js → p-5aec2208.entry.js} +1 -1
- package/dist/ionic/{p-26ff1180.entry.js → p-5cbfce20.entry.js} +1 -1
- package/dist/ionic/{p-26c4bf85.entry.js → p-5f1b0512.entry.js} +1 -1
- package/dist/ionic/{p-0dfa4ab4.system.entry.js → p-662a9a47.system.entry.js} +1 -1
- package/dist/ionic/{p-c01803db.entry.js → p-713af1fe.entry.js} +1 -1
- package/dist/ionic/{p-6e0539ea.system.entry.js → p-7dade589.system.entry.js} +1 -1
- package/dist/ionic/{p-6e4c7340.system.entry.js → p-8a25bf30.system.entry.js} +1 -1
- package/dist/ionic/{p-71483cbb.entry.js → p-8b160fba.entry.js} +1 -1
- package/dist/ionic/{p-799da666.entry.js → p-8e961825.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-bb3fd397.entry.js → p-9c48f42f.entry.js} +1 -1
- package/dist/ionic/{p-964dcdb2.system.entry.js → p-9f94e34a.system.entry.js} +1 -1
- package/dist/ionic/{p-75a3e35b.entry.js → p-a17a9130.entry.js} +1 -1
- package/dist/ionic/{p-7dcf795f.entry.js → p-a29db3a0.entry.js} +1 -1
- package/dist/ionic/{p-8ce4e506.system.entry.js → p-a6e5f54e.system.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-ba5d9e27.entry.js → p-bc01c384.entry.js} +1 -1
- package/dist/ionic/{p-7be412e8.system.entry.js → p-c16fbc5f.system.entry.js} +1 -1
- package/dist/ionic/p-c4f9e650.system.entry.js +4 -0
- package/dist/ionic/{p-0cc80201.entry.js → p-c6e9ef77.entry.js} +1 -1
- package/dist/ionic/{p-db05ecb6.system.entry.js → p-cc700688.system.entry.js} +1 -1
- package/dist/ionic/p-cd3e1a06.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-d757eb10.entry.js +4 -0
- package/dist/ionic/{p-41208f54.system.entry.js → p-d88ed181.system.entry.js} +1 -1
- package/dist/ionic/{p-10339dcc.entry.js → p-df6f50ef.entry.js} +1 -1
- package/dist/ionic/{p-20755eb0.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-ea6c3dd5.system.entry.js +4 -0
- package/dist/ionic/{p-f0dea903.system.entry.js → p-ec0a9b2c.system.entry.js} +1 -1
- package/dist/ionic/{p-b2b5d761.entry.js → p-ee8b825e.entry.js} +1 -1
- 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-fc17f198.entry.js +4 -0
- package/dist/types/components/menu/menu.d.ts +1 -1
- package/dist/types/components/split-pane/split-pane.d.ts +26 -2
- package/dist/types/components.d.ts +1 -0
- package/hydrate/index.js +107 -72
- package/package.json +1 -1
- package/dist/ionic/p-2f449cdf.system.entry.js +0 -4
- package/dist/ionic/p-38531958.system.entry.js +0 -4
- package/dist/ionic/p-3b434dee.system.entry.js +0 -4
- package/dist/ionic/p-4981ea0a.system.entry.js +0 -4
- package/dist/ionic/p-950c05ad.entry.js +0 -4
- package/dist/ionic/p-a3013394.entry.js +0 -4
- package/dist/ionic/p-beed2450.system.entry.js +0 -4
- package/dist/ionic/p-beeed22c.system.entry.js +0 -4
- package/dist/ionic/p-ed8402d6.entry.js +0 -4
- package/dist/ionic/p-f8c5008f.entry.js +0 -4
|
@@ -83,9 +83,9 @@
|
|
|
83
83
|
--placeholder-opacity: 0.6;
|
|
84
84
|
--background: transparent;
|
|
85
85
|
--border-style: solid;
|
|
86
|
-
--highlight-color-focused: var(--ion-color-primary, #
|
|
87
|
-
--highlight-color-valid: var(--ion-color-success, #
|
|
88
|
-
--highlight-color-invalid: var(--ion-color-danger, #
|
|
86
|
+
--highlight-color-focused: var(--ion-color-primary, #0054e9);
|
|
87
|
+
--highlight-color-valid: var(--ion-color-success, #2dd55b);
|
|
88
|
+
--highlight-color-invalid: var(--ion-color-danger, #c5000f);
|
|
89
89
|
/**
|
|
90
90
|
* This is a private API that is used to switch
|
|
91
91
|
* out the highlight color based on the state
|
|
@@ -4,10 +4,74 @@
|
|
|
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({
|
|
8
|
-
test.describe(title('
|
|
9
|
-
test('should not have accessibility violations', async ({ page }) => {
|
|
10
|
-
await page.
|
|
7
|
+
configs({ directions: ['ltr'], themes: ['light', 'dark'] }).forEach(({ title, config }) => {
|
|
8
|
+
test.describe(title('textarea: a11y'), () => {
|
|
9
|
+
test('default layout should not have accessibility violations', async ({ page }) => {
|
|
10
|
+
await page.setContent(`
|
|
11
|
+
<main>
|
|
12
|
+
<ion-select label="Label" placeholder="Placeholder"></ion-select>
|
|
13
|
+
<ion-select placeholder="Placeholder">
|
|
14
|
+
<div slot="label">Label</div>
|
|
15
|
+
</ion-select>
|
|
16
|
+
<ion-select label="Label" value="a">
|
|
17
|
+
<ion-select-option value="a">Apple</ion-select-option>
|
|
18
|
+
</ion-select>
|
|
19
|
+
<ion-select aria-label="Label"></ion-select>
|
|
20
|
+
<ion-item>
|
|
21
|
+
<ion-select label="My Label" value="apples">
|
|
22
|
+
<ion-select-option value="apples">Apples</ion-select-option>
|
|
23
|
+
<ion-select-option value="bananas">Bananas</ion-select-option>
|
|
24
|
+
<ion-select-option value="oranges">Oranges</ion-select-option>
|
|
25
|
+
</ion-select>
|
|
26
|
+
</ion-item>
|
|
27
|
+
<ion-select id="multiple" multiple="true" label="My Label">
|
|
28
|
+
<ion-select-option value="apples">Apples</ion-select-option>
|
|
29
|
+
<ion-select-option value="bananas">Bananas</ion-select-option>
|
|
30
|
+
<ion-select-option value="oranges">Oranges</ion-select-option>
|
|
31
|
+
</ion-select>
|
|
32
|
+
<ion-select label="My Label" label-placement="floating">
|
|
33
|
+
<ion-icon slot="start" name="pizza" aria-hidden="true"></ion-icon>
|
|
34
|
+
<ion-select-option value="apples">Apples</ion-select-option>
|
|
35
|
+
<ion-select-option value="bananas">Bananas</ion-select-option>
|
|
36
|
+
<ion-select-option value="oranges">Oranges</ion-select-option>
|
|
37
|
+
<ion-button slot="end" aria-label="button">
|
|
38
|
+
<ion-icon slot="icon-only" name="lock-closed" aria-hidden="true"></ion-icon>
|
|
39
|
+
</ion-button>
|
|
40
|
+
</ion-select>
|
|
41
|
+
|
|
42
|
+
<script>
|
|
43
|
+
const multiple = document.querySelector('#multiple');
|
|
44
|
+
multiple.value = ['apples', 'bananas'];
|
|
45
|
+
</script>
|
|
46
|
+
</main>
|
|
47
|
+
`, config);
|
|
48
|
+
const results = await new AxeBuilder({ page }).analyze();
|
|
49
|
+
expect(results.violations).toEqual([]);
|
|
50
|
+
});
|
|
51
|
+
test('focused state should not have accessibility violations', async ({ page }) => {
|
|
52
|
+
/**
|
|
53
|
+
* The primary color against the focus background
|
|
54
|
+
* when using fill="solid" does not meet AA
|
|
55
|
+
* contrast guidelines so it excluded from the test.
|
|
56
|
+
* The contrast here is a significant improvement
|
|
57
|
+
* over what Ionic has had in the past, so the team
|
|
58
|
+
* has decided that this tradeoff is acceptable since
|
|
59
|
+
* the scope of the problem is limited to the focus
|
|
60
|
+
* state with the primary color when fill="solid".
|
|
61
|
+
*/
|
|
62
|
+
await page.setContent(`
|
|
63
|
+
<main>
|
|
64
|
+
<ion-select class="has-focus" label="Label" value="a">
|
|
65
|
+
<ion-select-option value="a">Apple</ion-select-option>
|
|
66
|
+
</ion-select>
|
|
67
|
+
<ion-select class="has-focus" label-placement="floating" label="Label" value="a">
|
|
68
|
+
<ion-select-option value="a">Apple</ion-select-option>
|
|
69
|
+
</ion-select>
|
|
70
|
+
<ion-select class="has-focus" fill="outline" label-placement="floating" label="Label" value="a">
|
|
71
|
+
<ion-select-option value="a">Apple</ion-select-option>
|
|
72
|
+
</ion-select>
|
|
73
|
+
</main>
|
|
74
|
+
`, config);
|
|
11
75
|
const results = await new AxeBuilder({ page }).analyze();
|
|
12
76
|
expect(results.violations).toEqual([]);
|
|
13
77
|
});
|
|
@@ -187,10 +187,10 @@ ion-item {
|
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
.item-radio-checked {
|
|
190
|
-
--background: rgba(var(--ion-color-primary-rgb,
|
|
191
|
-
--background-focused: var(--ion-color-primary, #
|
|
190
|
+
--background: rgba(var(--ion-color-primary-rgb, 0, 84, 233), 0.08);
|
|
191
|
+
--background-focused: var(--ion-color-primary, #0054e9);
|
|
192
192
|
--background-focused-opacity: 0.2;
|
|
193
|
-
--background-hover: var(--ion-color-primary, #
|
|
193
|
+
--background-hover: var(--ion-color-primary, #0054e9);
|
|
194
194
|
--background-hover-opacity: 0.12;
|
|
195
195
|
}
|
|
196
196
|
|
|
@@ -198,5 +198,5 @@ ion-item {
|
|
|
198
198
|
--background-activated: var(--ion-item-color, var(--ion-text-color, #000));
|
|
199
199
|
--background-focused: var(--ion-item-color, var(--ion-text-color, #000));
|
|
200
200
|
--background-hover: var(--ion-item-color, var(--ion-text-color, #000));
|
|
201
|
-
--color: var(--ion-color-primary, #
|
|
201
|
+
--color: var(--ion-color-primary, #0054e9);
|
|
202
202
|
}
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
configs({ directions: ['ltr'], themes: ['dark', 'light'] }).forEach(({ config, title }) => {
|
|
8
|
+
test.describe(title('select-popover: a11y'), () => {
|
|
9
|
+
test('should not have accessibility violations when header is defined', async ({ page }) => {
|
|
10
|
+
await page.setContent(`
|
|
11
|
+
<ion-popover is-open="true">
|
|
12
|
+
<ion-select-popover multiple="false"></ion-select-popover>
|
|
13
|
+
</ion-popover>
|
|
14
|
+
|
|
15
|
+
<script>
|
|
16
|
+
const selectPopover = document.querySelector('ion-select-popover');
|
|
17
|
+
selectPopover.options = [
|
|
18
|
+
{ value: 'apple', text: 'Apple', disabled: false, checked: true },
|
|
19
|
+
{ value: 'banana', text: 'Banana', disabled: false, checked: false },
|
|
20
|
+
];
|
|
21
|
+
</script>
|
|
22
|
+
`, config);
|
|
23
|
+
const ionPopoverDidPresent = await page.spyOnEvent('ionPopoverDidPresent');
|
|
24
|
+
const popover = page.locator('ion-popover');
|
|
25
|
+
await popover.evaluate((el) => el.present());
|
|
26
|
+
await ionPopoverDidPresent.next();
|
|
27
|
+
// TODO(FW-5698): remove withRules() call and resolve Axe errors
|
|
28
|
+
const results = await new AxeBuilder({ page }).withRules('color-contrast').analyze();
|
|
29
|
+
expect(results.violations).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -127,51 +127,21 @@
|
|
|
127
127
|
contain: strict;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
/**
|
|
131
|
-
* Do not pass CSS Variables down on larger
|
|
132
|
-
* screens as we want them to affect the outer
|
|
133
|
-
* `ion-menu` rather than the inner content
|
|
134
|
-
*/
|
|
135
|
-
::slotted(ion-menu.menu-pane-visible) {
|
|
136
|
-
flex: 0 1 auto;
|
|
137
|
-
width: var(--side-width);
|
|
138
|
-
min-width: var(--side-min-width);
|
|
139
|
-
max-width: var(--side-max-width);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side),
|
|
143
130
|
:host(.split-pane-visible) ::slotted(.split-pane-main) {
|
|
144
131
|
left: 0;
|
|
145
132
|
right: 0;
|
|
146
133
|
top: 0;
|
|
147
134
|
bottom: 0;
|
|
148
135
|
position: relative;
|
|
136
|
+
flex: 1;
|
|
149
137
|
box-shadow: none;
|
|
150
138
|
z-index: 0;
|
|
151
139
|
}
|
|
152
140
|
|
|
153
|
-
:host(.split-pane-visible) ::slotted(.split-pane-main) {
|
|
154
|
-
flex: 1;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side:not(ion-menu)),
|
|
158
|
-
:host(.split-pane-visible) ::slotted(ion-menu.split-pane-side.menu-enabled) {
|
|
159
|
-
display: flex;
|
|
160
|
-
flex-shrink: 0;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
141
|
::slotted(.split-pane-side:not(ion-menu)) {
|
|
164
142
|
display: none;
|
|
165
143
|
}
|
|
166
144
|
|
|
167
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side) {
|
|
168
|
-
order: -1;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side[side=end]) {
|
|
172
|
-
order: 1;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
145
|
/**
|
|
176
146
|
* Convert a font size to a dynamic font size.
|
|
177
147
|
* Fonts that participate in Dynamic Type should use
|
|
@@ -231,26 +201,4 @@
|
|
|
231
201
|
--border: 0.55px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-250, #c8c7cc)));
|
|
232
202
|
--side-min-width: 270px;
|
|
233
203
|
--side-max-width: 28%;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side) {
|
|
237
|
-
-webkit-border-start: 0;
|
|
238
|
-
border-inline-start: 0;
|
|
239
|
-
-webkit-border-end: var(--border);
|
|
240
|
-
border-inline-end: var(--border);
|
|
241
|
-
border-top: 0;
|
|
242
|
-
border-bottom: 0;
|
|
243
|
-
min-width: var(--side-min-width);
|
|
244
|
-
max-width: var(--side-max-width);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side[side=end]) {
|
|
248
|
-
-webkit-border-start: var(--border);
|
|
249
|
-
border-inline-start: var(--border);
|
|
250
|
-
-webkit-border-end: 0;
|
|
251
|
-
border-inline-end: 0;
|
|
252
|
-
border-top: 0;
|
|
253
|
-
border-bottom: 0;
|
|
254
|
-
min-width: var(--side-min-width);
|
|
255
|
-
max-width: var(--side-max-width);
|
|
256
204
|
}
|
|
@@ -22,8 +22,21 @@ export class SplitPane {
|
|
|
22
22
|
this.when = QUERY['lg'];
|
|
23
23
|
}
|
|
24
24
|
visibleChanged(visible) {
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
this.ionSplitPaneVisible.emit({ visible });
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Listen for child menus to be
|
|
29
|
+
* loaded and set the appropriate
|
|
30
|
+
* pane class. Note that menus
|
|
31
|
+
* can be loaded at any time and
|
|
32
|
+
* they can be encapsulated in other
|
|
33
|
+
* components so we need to listen for
|
|
34
|
+
* the menu load event instead of
|
|
35
|
+
* querying the DOM when the split pane
|
|
36
|
+
* loads.
|
|
37
|
+
*/
|
|
38
|
+
onMenuLoad(ev) {
|
|
39
|
+
setPaneClass(ev.target, false);
|
|
27
40
|
}
|
|
28
41
|
async connectedCallback() {
|
|
29
42
|
// TODO: connectedCallback is fired in CE build
|
|
@@ -31,7 +44,7 @@ export class SplitPane {
|
|
|
31
44
|
if (typeof customElements !== 'undefined' && customElements != null) {
|
|
32
45
|
await customElements.whenDefined('ion-split-pane');
|
|
33
46
|
}
|
|
34
|
-
this.
|
|
47
|
+
this.styleMainElement();
|
|
35
48
|
this.updateState();
|
|
36
49
|
}
|
|
37
50
|
disconnectedCallback() {
|
|
@@ -77,13 +90,25 @@ export class SplitPane {
|
|
|
77
90
|
this.visible = mediaList.matches;
|
|
78
91
|
}
|
|
79
92
|
}
|
|
93
|
+
/**
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
80
96
|
isPane(element) {
|
|
81
97
|
if (!this.visible) {
|
|
82
|
-
return false;
|
|
98
|
+
return Promise.resolve(false);
|
|
83
99
|
}
|
|
84
|
-
return
|
|
100
|
+
return Promise.resolve(this.el.contains(element) && element.classList.contains(SPLIT_PANE_SIDE));
|
|
85
101
|
}
|
|
86
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Attempt to find the main content
|
|
104
|
+
* element inside of the split pane.
|
|
105
|
+
* If found, set it as the main node.
|
|
106
|
+
*
|
|
107
|
+
* We assume that the main node
|
|
108
|
+
* is available in the DOM on split
|
|
109
|
+
* pane load.
|
|
110
|
+
*/
|
|
111
|
+
styleMainElement() {
|
|
87
112
|
if (!Build.isBrowser) {
|
|
88
113
|
return;
|
|
89
114
|
}
|
|
@@ -99,9 +124,11 @@ export class SplitPane {
|
|
|
99
124
|
console.warn('split pane cannot have more than one main node');
|
|
100
125
|
return;
|
|
101
126
|
}
|
|
102
|
-
|
|
127
|
+
else {
|
|
128
|
+
setPaneClass(child, isMain);
|
|
129
|
+
foundMain = true;
|
|
130
|
+
}
|
|
103
131
|
}
|
|
104
|
-
setPaneClass(child, isMain);
|
|
105
132
|
}
|
|
106
133
|
if (!foundMain) {
|
|
107
134
|
console.warn('split pane does not have a specified main node');
|
|
@@ -210,6 +237,37 @@ export class SplitPane {
|
|
|
210
237
|
}
|
|
211
238
|
}];
|
|
212
239
|
}
|
|
240
|
+
static get methods() {
|
|
241
|
+
return {
|
|
242
|
+
"isPane": {
|
|
243
|
+
"complexType": {
|
|
244
|
+
"signature": "(element: HTMLElement) => Promise<boolean>",
|
|
245
|
+
"parameters": [{
|
|
246
|
+
"tags": [],
|
|
247
|
+
"text": ""
|
|
248
|
+
}],
|
|
249
|
+
"references": {
|
|
250
|
+
"Promise": {
|
|
251
|
+
"location": "global",
|
|
252
|
+
"id": "global::Promise"
|
|
253
|
+
},
|
|
254
|
+
"HTMLElement": {
|
|
255
|
+
"location": "global",
|
|
256
|
+
"id": "global::HTMLElement"
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
"return": "Promise<boolean>"
|
|
260
|
+
},
|
|
261
|
+
"docs": {
|
|
262
|
+
"text": "",
|
|
263
|
+
"tags": [{
|
|
264
|
+
"name": "internal",
|
|
265
|
+
"text": undefined
|
|
266
|
+
}]
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
};
|
|
270
|
+
}
|
|
213
271
|
static get elementRef() { return "el"; }
|
|
214
272
|
static get watchers() {
|
|
215
273
|
return [{
|
|
@@ -223,6 +281,15 @@ export class SplitPane {
|
|
|
223
281
|
"methodName": "updateState"
|
|
224
282
|
}];
|
|
225
283
|
}
|
|
284
|
+
static get listeners() {
|
|
285
|
+
return [{
|
|
286
|
+
"name": "ionMenuChange",
|
|
287
|
+
"method": "onMenuLoad",
|
|
288
|
+
"target": undefined,
|
|
289
|
+
"capture": false,
|
|
290
|
+
"passive": false
|
|
291
|
+
}];
|
|
292
|
+
}
|
|
226
293
|
}
|
|
227
294
|
const setPaneClass = (el, isMain) => {
|
|
228
295
|
let toAdd;
|
|
@@ -127,51 +127,21 @@
|
|
|
127
127
|
contain: strict;
|
|
128
128
|
}
|
|
129
129
|
|
|
130
|
-
/**
|
|
131
|
-
* Do not pass CSS Variables down on larger
|
|
132
|
-
* screens as we want them to affect the outer
|
|
133
|
-
* `ion-menu` rather than the inner content
|
|
134
|
-
*/
|
|
135
|
-
::slotted(ion-menu.menu-pane-visible) {
|
|
136
|
-
flex: 0 1 auto;
|
|
137
|
-
width: var(--side-width);
|
|
138
|
-
min-width: var(--side-min-width);
|
|
139
|
-
max-width: var(--side-max-width);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side),
|
|
143
130
|
:host(.split-pane-visible) ::slotted(.split-pane-main) {
|
|
144
131
|
left: 0;
|
|
145
132
|
right: 0;
|
|
146
133
|
top: 0;
|
|
147
134
|
bottom: 0;
|
|
148
135
|
position: relative;
|
|
136
|
+
flex: 1;
|
|
149
137
|
box-shadow: none;
|
|
150
138
|
z-index: 0;
|
|
151
139
|
}
|
|
152
140
|
|
|
153
|
-
:host(.split-pane-visible) ::slotted(.split-pane-main) {
|
|
154
|
-
flex: 1;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side:not(ion-menu)),
|
|
158
|
-
:host(.split-pane-visible) ::slotted(ion-menu.split-pane-side.menu-enabled) {
|
|
159
|
-
display: flex;
|
|
160
|
-
flex-shrink: 0;
|
|
161
|
-
}
|
|
162
|
-
|
|
163
141
|
::slotted(.split-pane-side:not(ion-menu)) {
|
|
164
142
|
display: none;
|
|
165
143
|
}
|
|
166
144
|
|
|
167
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side) {
|
|
168
|
-
order: -1;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side[side=end]) {
|
|
172
|
-
order: 1;
|
|
173
|
-
}
|
|
174
|
-
|
|
175
145
|
/**
|
|
176
146
|
* Convert a font size to a dynamic font size.
|
|
177
147
|
* Fonts that participate in Dynamic Type should use
|
|
@@ -231,26 +201,4 @@
|
|
|
231
201
|
--border: 1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13))));
|
|
232
202
|
--side-min-width: 270px;
|
|
233
203
|
--side-max-width: 28%;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side) {
|
|
237
|
-
-webkit-border-start: 0;
|
|
238
|
-
border-inline-start: 0;
|
|
239
|
-
-webkit-border-end: var(--border);
|
|
240
|
-
border-inline-end: var(--border);
|
|
241
|
-
border-top: 0;
|
|
242
|
-
border-bottom: 0;
|
|
243
|
-
min-width: var(--side-min-width);
|
|
244
|
-
max-width: var(--side-max-width);
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
:host(.split-pane-visible) ::slotted(.split-pane-side[side=end]) {
|
|
248
|
-
-webkit-border-start: var(--border);
|
|
249
|
-
border-inline-start: var(--border);
|
|
250
|
-
-webkit-border-end: 0;
|
|
251
|
-
border-inline-end: 0;
|
|
252
|
-
border-top: 0;
|
|
253
|
-
border-bottom: 0;
|
|
254
|
-
min-width: var(--side-min-width);
|
|
255
|
-
max-width: var(--side-max-width);
|
|
256
204
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* (C) Ionic http://ionicframework.com - MIT License
|
|
3
|
+
*/
|
|
4
|
+
import { expect } from "@playwright/test";
|
|
5
|
+
import { configs, test, Viewports } from "../../../../utils/test/playwright/index";
|
|
6
|
+
configs({ directions: ['ltr'], modes: ['ios'] }).forEach(({ title, config }) => {
|
|
7
|
+
test.describe(title('split-pane: functionality'), () => {
|
|
8
|
+
test('should be visible on larger viewports', async ({ page }) => {
|
|
9
|
+
test.info().annotations.push({
|
|
10
|
+
type: 'issue',
|
|
11
|
+
description: 'https://github.com/ionic-team/ionic-framework/issues/16304',
|
|
12
|
+
});
|
|
13
|
+
await page.setViewportSize(Viewports.large);
|
|
14
|
+
await page.goto(`/src/components/split-pane/test/wrapped-menu`, config);
|
|
15
|
+
const menu = page.locator('ion-menu');
|
|
16
|
+
await expect(menu).toBeVisible();
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -234,7 +234,7 @@
|
|
|
234
234
|
--background-focused: var(--ion-tab-bar-background-focused, #e0e0e0);
|
|
235
235
|
--border: 0.55px solid var(--ion-tab-bar-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.2))));
|
|
236
236
|
--color: var(--ion-tab-bar-color, var(--ion-color-step-600, #666666));
|
|
237
|
-
--color-selected: var(--ion-tab-bar-color-selected, var(--ion-color-primary, #
|
|
237
|
+
--color-selected: var(--ion-tab-bar-color-selected, var(--ion-color-primary, #0054e9));
|
|
238
238
|
height: 50px;
|
|
239
239
|
}
|
|
240
240
|
|
|
@@ -234,6 +234,6 @@
|
|
|
234
234
|
--background-focused: var(--ion-tab-bar-background-focused, #e0e0e0);
|
|
235
235
|
--border: 1px solid var(--ion-tab-bar-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.07))));
|
|
236
236
|
--color: var(--ion-tab-bar-color, var(--ion-color-step-650, #595959));
|
|
237
|
-
--color-selected: var(--ion-tab-bar-color-selected, var(--ion-color-primary, #
|
|
237
|
+
--color-selected: var(--ion-tab-bar-color-selected, var(--ion-color-primary, #0054e9));
|
|
238
238
|
height: 56px;
|
|
239
239
|
}
|
|
@@ -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;
|