diff --git a/core/src/components/fab/test/basic/e2e.ts b/core/src/components/fab/test/basic/e2e.ts
deleted file mode 100644
index 520cf1fc4c..0000000000
--- a/core/src/components/fab/test/basic/e2e.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-import { testDisabledFab, testFab } from '../test.utils';
-
-test('fab: basic', async () => {
- await testFab('basic', '#fab1');
-});
-
-test('fab:rtl: basic', async () => {
- await testFab('basic', '#fab1', true);
-});
-
-test('fab: disabled', async () => {
- await testDisabledFab('basic', '#fab2');
-});
-
-test('fab:rtl: disabled', async () => {
- await testDisabledFab('basic', '#fab2', true);
-});
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts b/core/src/components/fab/test/basic/fab.e2e.ts
new file mode 100644
index 0000000000..2fe3836dbb
--- /dev/null
+++ b/core/src/components/fab/test/basic/fab.e2e.ts
@@ -0,0 +1,72 @@
+import { expect } from '@playwright/test';
+import { test } from '@utils/test/playwright';
+
+test.describe('fab: basic (visual checks)', () => {
+ test.beforeEach(async ({ page }) => {
+ await page.goto(`/src/components/fab/test/basic`);
+ });
+
+ test('should not have visual regressions', async ({ page }) => {
+ await page.setIonViewport();
+
+ expect(await page.screenshot()).toMatchSnapshot(`fab-basic-${page.getSnapshotSettings()}.png`);
+ });
+
+ test('should not have visual regressions when open', async ({ page }) => {
+ // this fab has multiple buttons on each side, so it covers all the bases
+ const fab = page.locator('#fab5');
+
+ await fab.click();
+ await page.waitForChanges();
+
+ /**
+ * fab.screenshot doesn't work since ion-fab's bounding box only covers the
+ * central button. This viewport size crops extra white space while also
+ * containing all the buttons in the open fab.
+ */
+ await page.setViewportSize({
+ width: 320,
+ height: 415,
+ });
+
+ expect(await page.screenshot()).toMatchSnapshot(`fab-open-${page.getSnapshotSettings()}.png`);
+ });
+});
+
+test.describe('fab: basic (functionality checks)', () => {
+ test.beforeEach(async ({ page, skip }) => {
+ skip.rtl();
+ skip.mode('ios');
+
+ await page.goto(`/src/components/fab/test/basic`);
+ });
+
+ test('should toggle active state when clicked', async ({ page }) => {
+ const fab = page.locator('#fab1');
+ const fabList = fab.locator('ion-fab-list');
+
+ expect(fabList).not.toHaveClass(/fab-list-active/);
+
+ // open fab
+ await fab.click();
+ await page.waitForChanges();
+ expect(fabList).toHaveClass(/fab-list-active/);
+
+ // close fab
+ await fab.click();
+ await page.waitForChanges();
+ expect(fabList).not.toHaveClass(/fab-list-active/);
+ });
+
+ test('should not open when disabled', async ({ page }) => {
+ const fab = page.locator('#fab2');
+ const fabList = fab.locator('ion-fab-list');
+
+ expect(fabList).not.toHaveClass(/fab-list-active/);
+
+ // attempt to open fab
+ await fab.click();
+ await page.waitForChanges();
+ expect(fabList).not.toHaveClass(/fab-list-active/);
+ });
+});
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..a17c5f719c
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..2eaa929c40
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..6765a30791
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..605357fdcb
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..a7ec1b6393
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..156cc0aec8
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-ios-rtl-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..1cb0d16630
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..32f03edcdc
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..cf149b71cf
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..a4b2dc12d1
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..1971d4f22c
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..1adf87b85d
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-basic-md-rtl-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..956bb4077b
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..8d4024a653
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..a87d140a85
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..f700c9027b
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..f5f39513f3
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..bb948a8734
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-ios-rtl-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..d67f22f8f3
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..5d91e45899
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..76f96dac2a
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-ltr-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Chrome-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Chrome-linux.png
new file mode 100644
index 0000000000..c4abb5511b
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Chrome-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Firefox-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Firefox-linux.png
new file mode 100644
index 0000000000..ff8f9822ac
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Firefox-linux.png differ
diff --git a/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Safari-linux.png b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Safari-linux.png
new file mode 100644
index 0000000000..bd09b95ed6
Binary files /dev/null and b/core/src/components/fab/test/basic/fab.e2e.ts-snapshots/fab-open-md-rtl-Mobile-Safari-linux.png differ
diff --git a/core/src/components/fab/test/basic/index.html b/core/src/components/fab/test/basic/index.html
index 1d7baa61c3..731164625c 100644
--- a/core/src/components/fab/test/basic/index.html
+++ b/core/src/components/fab/test/basic/index.html
@@ -26,117 +26,108 @@
log