diff --git a/core/scripts/testing/themes/dark.css b/core/scripts/testing/themes/dark.css
index e263803d56..2cbb666c3a 100644
--- a/core/scripts/testing/themes/dark.css
+++ b/core/scripts/testing/themes/dark.css
@@ -4,68 +4,68 @@
*/
:root {
- --ion-color-primary: #428cff;
- --ion-color-primary-rgb: 66, 140, 255;
- --ion-color-primary-contrast: #ffffff;
- --ion-color-primary-contrast-rgb: 255, 255, 255;
- --ion-color-primary-shade: #3a7be0;
- --ion-color-primary-tint: #5598ff;
+ --ion-color-primary: #4d8dff;
+ --ion-color-primary-rgb: 77, 141, 255;
+ --ion-color-primary-contrast: #000000;
+ --ion-color-primary-contrast-rgb: 0, 0, 0;
+ --ion-color-primary-shade: #447ce0;
+ --ion-color-primary-tint: #5f98ff;
- --ion-color-secondary: #50c8ff;
- --ion-color-secondary-rgb: 80, 200, 255;
- --ion-color-secondary-contrast: #ffffff;
- --ion-color-secondary-contrast-rgb: 255, 255, 255;
- --ion-color-secondary-shade: #46b0e0;
- --ion-color-secondary-tint: #62ceff;
+ --ion-color-secondary: #62bdff;
+ --ion-color-secondary-rgb: 98, 189, 255;
+ --ion-color-secondary-contrast: #000000;
+ --ion-color-secondary-contrast-rgb: 0, 0, 0;
+ --ion-color-secondary-shade: #56a6e0;
+ --ion-color-secondary-tint: #72c4ff;
- --ion-color-tertiary: #6a64ff;
- --ion-color-tertiary-rgb: 106, 100, 255;
- --ion-color-tertiary-contrast: #ffffff;
- --ion-color-tertiary-contrast-rgb: 255, 255, 255;
- --ion-color-tertiary-shade: #5d58e0;
- --ion-color-tertiary-tint: #7974ff;
+ --ion-color-tertiary: #8482fb;
+ --ion-color-tertiary-rgb: 132, 130, 251;
+ --ion-color-tertiary-contrast: #000000;
+ --ion-color-tertiary-contrast-rgb: 0, 0, 0;
+ --ion-color-tertiary-shade: #7472dd;
+ --ion-color-tertiary-tint: #908ffb;
- --ion-color-success: #2fdf75;
- --ion-color-success-rgb: 47, 223, 117;
+ --ion-color-success: #2dd55b;
+ --ion-color-success-rgb: 45, 213, 91;
--ion-color-success-contrast: #000000;
--ion-color-success-contrast-rgb: 0, 0, 0;
- --ion-color-success-shade: #29c467;
- --ion-color-success-tint: #44e283;
+ --ion-color-success-shade: #28bb50;
+ --ion-color-success-tint: #42d96b;
- --ion-color-warning: #ffd534;
- --ion-color-warning-rgb: 255, 213, 52;
+ --ion-color-warning: #ffce31;
+ --ion-color-warning-rgb: 255, 206, 49;
--ion-color-warning-contrast: #000000;
--ion-color-warning-contrast-rgb: 0, 0, 0;
- --ion-color-warning-shade: #e0bb2e;
- --ion-color-warning-tint: #ffd948;
+ --ion-color-warning-shade: #e0b52b;
+ --ion-color-warning-tint: #ffd346;
- --ion-color-danger: #ff4961;
- --ion-color-danger-rgb: 255, 73, 97;
- --ion-color-danger-contrast: #ffffff;
- --ion-color-danger-contrast-rgb: 255, 255, 255;
- --ion-color-danger-shade: #e04055;
- --ion-color-danger-tint: #ff5b71;
+ --ion-color-danger: #f56570;
+ --ion-color-danger-rgb: 245, 101, 112;
+ --ion-color-danger-contrast: #000000;
+ --ion-color-danger-contrast-rgb: 0, 0, 0;
+ --ion-color-danger-shade: #d85963;
+ --ion-color-danger-tint: #f6747e;
- --ion-color-dark: #f4f5f8;
- --ion-color-dark-rgb: 244, 245, 248;
+ --ion-color-dark: #f3f3f3;
+ --ion-color-dark-rgb: 243, 243, 243;
--ion-color-dark-contrast: #000000;
--ion-color-dark-contrast-rgb: 0, 0, 0;
- --ion-color-dark-shade: #d7d8da;
- --ion-color-dark-tint: #f5f6f9;
+ --ion-color-dark-shade: #d6d6d6;
+ --ion-color-dark-tint: #f4f4f4;
- --ion-color-medium: #989aa2;
- --ion-color-medium-rgb: 152, 154, 162;
+ --ion-color-medium: #959595;
+ --ion-color-medium-rgb: 149, 149, 149;
--ion-color-medium-contrast: #000000;
--ion-color-medium-contrast-rgb: 0, 0, 0;
- --ion-color-medium-shade: #86888f;
- --ion-color-medium-tint: #a2a4ab;
+ --ion-color-medium-shade: #838383;
+ --ion-color-medium-tint: #a0a0a0;
- --ion-color-light: #222428;
- --ion-color-light-rgb: 34, 36, 40;
+ --ion-color-light: #2f2f2f;
+ --ion-color-light-rgb: 47, 47, 47;
--ion-color-light-contrast: #ffffff;
--ion-color-light-contrast-rgb: 255, 255, 255;
- --ion-color-light-shade: #1e2023;
- --ion-color-light-tint: #383a3e;
+ --ion-color-light-shade: #292929;
+ --ion-color-light-tint: #444444;
}
/*
diff --git a/core/src/test/theme/dark/index.html b/core/src/test/theme/dark/index.html
new file mode 100644
index 0000000000..7ec864ad15
--- /dev/null
+++ b/core/src/test/theme/dark/index.html
@@ -0,0 +1,89 @@
+
+
+
+
+ Theme - Dark
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Theme - Dark
+
+
+
+
+
+ Default
+ Default.focused
+ Default.activated
+
+
+
+ Primary
+ Primary.focused
+ Primary.activated
+
+
+
+ Secondary
+ Secondary.focused
+ Secondary.activated
+
+
+
+ Tertiary
+ Tertiary.focused
+ Tertiary.activated
+
+
+
+ Success
+ Success.focused
+ Success.activated
+
+
+
+ Warning
+ Warning.focused
+ Warning.activated
+
+
+
+ Danger
+ Danger.focused
+ Danger.activated
+
+
+
+ Light
+ Light.focused
+ Light.activated
+
+
+
+ Medium
+ Medium.focused
+ Medium.activated
+
+
+
+ Dark
+ Dark.focused
+ Dark.activated
+
+
+
+
+
diff --git a/core/src/test/theme/theme.e2e.ts b/core/src/test/theme/theme.e2e.ts
new file mode 100644
index 0000000000..8561971bd0
--- /dev/null
+++ b/core/src/test/theme/theme.e2e.ts
@@ -0,0 +1,214 @@
+import AxeBuilder from '@axe-core/playwright';
+import { expect } from '@playwright/test';
+import { configs, test } from '@utils/test/playwright';
+
+const styleTestHelpers = `
+
+`;
+
+/**
+ * All colors besides `light` should be tested against a dark background on dark theme.
+ */
+configs({ modes: ['md', 'ios'], directions: ['ltr'], themes: ['dark'] }).forEach(({ config, title }) => {
+ const colors = ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'medium', 'dark'];
+
+ test.describe(title('theme'), () => {
+ test.beforeEach(({ skip }) => {
+ skip.browser('firefox', 'Color contrast ratio is consistent across browsers');
+ skip.browser('webkit', 'Color contrast ratio is consistent across browsers');
+ });
+
+ for (const color of colors) {
+ test(`color "${color}" should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`contrast color on "${color}" background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`color "${color}" on 0.08 opacity background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`color "${color}" on 0.12 opacity background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`color "${color}" on 0.16 opacity background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+ }
+ });
+});
+
+/**
+ * `light` color should be tested against a white background on dark theme. The mode doesn't matter here
+ * since we are testing against a consistent background color.
+ */
+configs({ modes: ['md'], directions: ['ltr'], themes: ['dark'] }).forEach(({ config, title }) => {
+ test.describe(title('theme'), () => {
+ test(`color light should pass AA guidelines on a white background`, async ({ page, skip }) => {
+ skip.browser('firefox', 'Color contrast ratio is consistent across browsers');
+ skip.browser('webkit', 'Color contrast ratio is consistent across browsers');
+
+ await page.setContent(
+ `${styleTestHelpers}
+
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`contrast color on "light" background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`color "light" on 0.08 opacity background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`color "light" on 0.12 opacity background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+
+ test(`color "light" on 0.16 opacity background should pass AA guidelines`, async ({ page }) => {
+ await page.setContent(
+ `${styleTestHelpers}
+
+
+ Hello World
+ `,
+ config
+ );
+
+ const results = await new AxeBuilder({ page }).analyze();
+ expect(results.violations).toEqual([]);
+ });
+ });
+});
diff --git a/core/src/utils/test/playwright/generator.ts b/core/src/utils/test/playwright/generator.ts
index 41b2abc183..5058be803e 100644
--- a/core/src/utils/test/playwright/generator.ts
+++ b/core/src/utils/test/playwright/generator.ts
@@ -111,4 +111,5 @@ const DEFAULT_THEMES: Theme[] = ['light'];
const DEFAULT_TEST_CONFIG_OPTION = {
modes: DEFAULT_MODES,
directions: DEFAULT_DIRECTIONS,
+ themes: DEFAULT_THEMES,
};