diff --git a/core/src/components/datetime/datetime.tsx b/core/src/components/datetime/datetime.tsx
index 1ebf702c4e7..469b5d84cf2 100644
--- a/core/src/components/datetime/datetime.tsx
+++ b/core/src/components/datetime/datetime.tsx
@@ -1091,6 +1091,9 @@ export class Datetime implements ComponentInterface {
connectedCallback() {
this.clearFocusVisible = startFocusVisible(this.el).destroy;
+ this.loadTimeout = setTimeout(() => {
+ this.ensureReadyIfVisible();
+ }, 100);
}
disconnectedCallback() {
@@ -1098,9 +1101,7 @@ export class Datetime implements ComponentInterface {
this.clearFocusVisible();
this.clearFocusVisible = undefined;
}
- if (this.loadTimeout) {
- clearTimeout(this.loadTimeout);
- }
+ this.loadTimeoutCleanup();
}
/**
@@ -1151,6 +1152,13 @@ export class Datetime implements ComponentInterface {
});
};
+ private loadTimeoutCleanup = () => {
+ if (this.loadTimeout) {
+ clearTimeout(this.loadTimeout);
+ this.loadTimeout = undefined;
+ }
+ };
+
componentDidLoad() {
const { el, intersectionTrackerRef } = this;
@@ -1198,7 +1206,10 @@ export class Datetime implements ComponentInterface {
* we still initialize listeners and mark the component as ready.
*
* We schedule this after everything has had a chance to run.
+ *
+ * We also clean up the load timeout to ensure that we don't have multiple timeouts running.
*/
+ this.loadTimeoutCleanup();
this.loadTimeout = setTimeout(() => {
this.ensureReadyIfVisible();
}, 100);
diff --git a/core/src/components/datetime/test/basic/datetime.e2e.ts b/core/src/components/datetime/test/basic/datetime.e2e.ts
index 3514bc9cf2c..cdc07c504da 100644
--- a/core/src/components/datetime/test/basic/datetime.e2e.ts
+++ b/core/src/components/datetime/test/basic/datetime.e2e.ts
@@ -444,6 +444,43 @@ configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
/**
* This behavior does not differ across modes/directions.
*/
+
+configs({ modes: ['md'], directions: ['ltr'] }).forEach(({ title, config }) => {
+ test.describe(title('datetime: month picker selection'), () => {
+ test('datetime: month picker selection', async ({ page }) => {
+ await page.setContent(
+ `
+
+ `,
+ config
+ );
+
+ await page.locator('.datetime-ready').waitFor();
+
+ const nextMonthButton = page.locator('ion-datetime .calendar-next-prev ion-button').nth(1);
+ const monthYearButton = page.locator('ion-datetime .calendar-month-year');
+
+ await expect(monthYearButton).toHaveText(/May 2022/);
+
+ await nextMonthButton.click();
+ await expect(monthYearButton).toHaveText(/June 2022/);
+
+ await nextMonthButton.click();
+ await expect(monthYearButton).toHaveText(/July 2022/);
+
+ await monthYearButton.click();
+ await page.waitForChanges();
+
+ const selectedMonthOptions = page.locator('.month-column ion-picker-column-option.option-active');
+ await expect(selectedMonthOptions).toHaveCount(1);
+ });
+ });
+});
+
+/**
+ * This behavior does not differ across
+ * modes/directions.
+ */
configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, config }) => {
test.describe(title('datetime: visibility'), () => {
// TODO FW-6015 re-enable on webkit when bug is fixed
diff --git a/core/src/components/picker-column/picker-column.tsx b/core/src/components/picker-column/picker-column.tsx
index 6eb4241eac7..2411ef2d6cc 100644
--- a/core/src/components/picker-column/picker-column.tsx
+++ b/core/src/components/picker-column/picker-column.tsx
@@ -1,7 +1,7 @@
import type { ComponentInterface, EventEmitter } from '@stencil/core';
import { Component, Element, Event, Host, Method, Prop, State, Watch, h } from '@stencil/core';
import { doc } from '@utils/browser';
-import { getElementRoot, raf } from '@utils/helpers';
+import { raf } from '@utils/helpers';
import { hapticSelectionChanged, hapticSelectionEnd, hapticSelectionStart } from '@utils/native/haptic';
import { isPlatform } from '@utils/platform';
import { createColorClasses } from '@utils/theme';
@@ -123,9 +123,7 @@ export class PickerColumn implements ComponentInterface {
* Because this initial call to scrollActiveItemIntoView has to fire before
* the scroll listener is set up, we need to manage the active class manually.
*/
- const oldActive = getElementRoot(el).querySelector(
- `.${PICKER_ITEM_ACTIVE_CLASS}`
- );
+ const oldActive = el.querySelector(`.${PICKER_ITEM_ACTIVE_CLASS}`);
if (oldActive) {
this.setPickerItemActiveState(oldActive, false);
}
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts b/core/src/components/tab-button/test/states/tab-button.e2e.ts
index bd10cad844b..5af2a6f660b 100644
--- a/core/src/components/tab-button/test/states/tab-button.e2e.ts
+++ b/core/src/components/tab-button/test/states/tab-button.e2e.ts
@@ -80,3 +80,25 @@ configs({ modes: ['ios'], directions: ['ltr'] }).forEach(({ title, screenshot, c
});
});
});
+
+configs({ palettes: ['dark'], directions: ['ltr'] }).forEach(({ title, screenshot, config }) => {
+ test.describe(title('tab-button: states in dark palette'), () => {
+ test.describe('focus', () => {
+ test('should render correct focus state in dark palette', async ({ page }) => {
+ await page.setContent(
+ `
+
+
+ Favorites
+
+
+ `,
+ config
+ );
+
+ const tabBar = page.locator('ion-tab-bar');
+ await expect(tabBar).toHaveScreenshot(screenshot('tab-button-focus'));
+ });
+ });
+ });
+});
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Chrome-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Chrome-linux.png
new file mode 100644
index 00000000000..14d96bb1365
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Firefox-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Firefox-linux.png
new file mode 100644
index 00000000000..841928b47fa
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Safari-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Safari-linux.png
new file mode 100644
index 00000000000..86b46f9a31f
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-ios-ltr-dark-Mobile-Safari-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Chrome-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Chrome-linux.png
new file mode 100644
index 00000000000..e12f984796d
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Firefox-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Firefox-linux.png
new file mode 100644
index 00000000000..b0f8f6eb547
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Safari-linux.png b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Safari-linux.png
new file mode 100644
index 00000000000..db7b8937ec0
Binary files /dev/null and b/core/src/components/tab-button/test/states/tab-button.e2e.ts-snapshots/tab-button-focus-md-ltr-dark-Mobile-Safari-linux.png differ
diff --git a/core/src/css/palettes/dark.scss b/core/src/css/palettes/dark.scss
index 1d154358b00..cebeb7de1ca 100644
--- a/core/src/css/palettes/dark.scss
+++ b/core/src/css/palettes/dark.scss
@@ -135,6 +135,7 @@ $colors: (
--ion-text-color-step-900: #1a1a1a;
--ion-text-color-step-950: #0d0d0d;
--ion-item-background: #000000;
+ --ion-tab-bar-background-focused: #252525;
--ion-card-background: #1c1c1d;
}
@@ -192,6 +193,7 @@ $colors: (
--ion-item-background: #1e1e1e;
--ion-toolbar-background: #1f1f1f;
--ion-tab-bar-background: #1f1f1f;
+ --ion-tab-bar-background-focused: #353535;
--ion-card-background: #1e1e1e;
}
}
diff --git a/core/src/css/palettes/high-contrast-dark.scss b/core/src/css/palettes/high-contrast-dark.scss
index 2cfa3169550..ba5dc705b9d 100644
--- a/core/src/css/palettes/high-contrast-dark.scss
+++ b/core/src/css/palettes/high-contrast-dark.scss
@@ -127,6 +127,7 @@ $lightest-text-color: $text-color;
--ion-text-color-rgb: #{color-to-rgb-list($text-color)};
--ion-item-background: #000000;
--ion-card-background: #1c1c1d;
+ --ion-tab-bar-background-focused: #252525;
/// Only the item borders should increase in contrast
/// Borders for elements like toolbars should remain the same
@@ -193,6 +194,7 @@ $lightest-text-color: $text-color;
--ion-item-background: #1e1e1e;
--ion-toolbar-background: #1f1f1f;
--ion-tab-bar-background: #1f1f1f;
+ --ion-tab-bar-background-focused: #353535;
--ion-card-background: #1e1e1e;
/// Only the item borders should increase in contrast