From 7a4d6065da2d10bd1f7cb88392dfe55064c9c784 Mon Sep 17 00:00:00 2001 From: Helder Oliveira Date: Tue, 14 Apr 2026 11:24:30 +0100 Subject: [PATCH 1/4] =?UTF-8?q?chore:=20=F0=9F=A4=96=20extend=20stories=20?= =?UTF-8?q?with=20types,=20size=20variants,=20disabled=20states=20and=20in?= =?UTF-8?q?teractive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IconButton/IconButton.stories.tsx | 92 ++++++++++++++++++- 1 file changed, 89 insertions(+), 3 deletions(-) diff --git a/src/components/IconButton/IconButton.stories.tsx b/src/components/IconButton/IconButton.stories.tsx index 6778dff7f..8edcbdfea 100644 --- a/src/components/IconButton/IconButton.stories.tsx +++ b/src/components/IconButton/IconButton.stories.tsx @@ -14,28 +14,114 @@ type Story = StoryObj; export const Playground: Story = { args: { icon: 'user', + type: 'primary', size: 'default', disabled: false, }, }; -export const Disabled: Story = { +export const Primary: Story = { args: { - disabled: true, + type: 'primary', + icon: 'user', + }, +}; + +export const Secondary: Story = { + args: { + type: 'secondary', icon: 'user', }, }; -export const Empty: Story = { +export const Ghost: Story = { args: { type: 'ghost', icon: 'user', }, }; +export const Danger: Story = { + args: { + type: 'danger', + icon: 'user', + }, +}; + +export const Info: Story = { + args: { + type: 'info', + icon: 'user', + }, +}; + +export const DefaultSize: Story = { + args: { + type: 'primary', + size: 'default', + icon: 'user', + }, +}; + export const Small: Story = { args: { + type: 'primary', size: 'sm', icon: 'user', }, }; + +export const ExtraSmall: Story = { + args: { + type: 'primary', + size: 'xs', + icon: 'user', + }, +}; + +export const PrimaryDisabled: Story = { + args: { + type: 'primary', + icon: 'user', + disabled: true, + }, +}; + +export const SecondaryDisabled: Story = { + args: { + type: 'secondary', + icon: 'user', + disabled: true, + }, +}; + +export const GhostDisabled: Story = { + args: { + type: 'ghost', + icon: 'user', + disabled: true, + }, +}; + +export const DangerDisabled: Story = { + args: { + type: 'danger', + icon: 'user', + disabled: true, + }, +}; + +export const InfoDisabled: Story = { + args: { + type: 'info', + icon: 'user', + disabled: true, + }, +}; + +export const Interactive: Story = { + args: { + type: 'primary', + icon: 'user', + }, +}; From 79fbb5b3f8aa30ee366ee59f0eab01915f22348c Mon Sep 17 00:00:00 2001 From: Helder Oliveira Date: Tue, 14 Apr 2026 11:31:49 +0100 Subject: [PATCH 2/4] =?UTF-8?q?test(IconButton):=20=F0=9F=92=8D=20Created?= =?UTF-8?q?=20tests/buttons/iconbutton.spec.ts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/buttons/iconbutton.spec.ts | 445 +++++++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 tests/buttons/iconbutton.spec.ts diff --git a/tests/buttons/iconbutton.spec.ts b/tests/buttons/iconbutton.spec.ts new file mode 100644 index 000000000..2d0eab675 --- /dev/null +++ b/tests/buttons/iconbutton.spec.ts @@ -0,0 +1,445 @@ +import { test as it, expect } from '@playwright/test'; +import { getStoryUrl } from '../utils'; + +const { describe, use } = it; + +describe('IconButton Visual Regression', () => { + describe('Light Theme (Storybook Global)', () => { + describe('Button Types', () => { + it('primary button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-primary-light.png', { + maxDiffPixels: 100, + }); + }); + + it('secondary button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--secondary', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-secondary-light.png', { + maxDiffPixels: 100, + }); + }); + + it('ghost button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--ghost', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-ghost-light.png', { + maxDiffPixels: 100, + }); + }); + + it('danger button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--danger', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-danger-light.png', { + maxDiffPixels: 100, + }); + }); + + it('info button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--info', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-info-light.png', { + maxDiffPixels: 100, + }); + }); + }); + + describe('Size Variants', () => { + it('default size matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--default-size', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-default-size-light.png', { + maxDiffPixels: 100, + }); + }); + + it('small size matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--small', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-small-light.png', { + maxDiffPixels: 100, + }); + }); + + it('extra small size matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--extra-small', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-xs-light.png', { + maxDiffPixels: 100, + }); + }); + }); + + describe('Disabled States', () => { + it('primary disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary-disabled', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-primary-disabled-light.png', { + maxDiffPixels: 100, + }); + }); + + it('secondary disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--secondary-disabled', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-secondary-disabled-light.png', { + maxDiffPixels: 100, + }); + }); + + it('ghost disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--ghost-disabled', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-ghost-disabled-light.png', { + maxDiffPixels: 100, + }); + }); + + it('danger disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--danger-disabled', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-danger-disabled-light.png', { + maxDiffPixels: 100, + }); + }); + + it('info disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--info-disabled', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-info-disabled-light.png', { + maxDiffPixels: 100, + }); + }); + }); + + describe('Interactive States', () => { + it('hover state - primary', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await button.hover(); + await page.waitForTimeout(100); + await expect(button).toHaveScreenshot('iconbutton-primary-hover-light.png', { + maxDiffPixels: 100, + }); + }); + + it('focus state - primary', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await button.focus(); + await page.waitForTimeout(100); + await expect(button).toHaveScreenshot('iconbutton-primary-focus-light.png', { + maxDiffPixels: 100, + }); + }); + + it('active/pressed state - primary', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + const box = await button.boundingBox(); + if (!box) { + throw new Error('Button bounding box is null - element may not be in viewport'); + } + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); + await page.mouse.down(); + await page.waitForTimeout(100); + await expect(button).toHaveScreenshot('iconbutton-primary-active-light.png', { + maxDiffPixels: 100, + }); + await page.mouse.up(); + }); + }); + }); + + describe('Dark Theme (System prefers-color-scheme)', () => { + use({ colorScheme: 'dark' }); + + describe('Button Types', () => { + it('primary button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-primary-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('secondary button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--secondary'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-secondary-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('ghost button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--ghost'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-ghost-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('danger button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--danger'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-danger-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('info button matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--info'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-info-dark.png', { + maxDiffPixels: 100, + }); + }); + }); + + describe('Size Variants', () => { + it('default size matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--default-size'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-default-size-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('small size matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--small'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-small-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('extra small size matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--extra-small'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toHaveScreenshot('iconbutton-xs-dark.png', { + maxDiffPixels: 100, + }); + }); + }); + + describe('Disabled States', () => { + it('primary disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary-disabled'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-primary-disabled-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('secondary disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--secondary-disabled'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-secondary-disabled-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('ghost disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--ghost-disabled'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-ghost-disabled-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('danger disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--danger-disabled'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-danger-disabled-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('info disabled matches snapshot', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--info-disabled'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeDisabled(); + await expect(button).toHaveScreenshot('iconbutton-info-disabled-dark.png', { + maxDiffPixels: 100, + }); + }); + }); + + describe('Interactive States', () => { + it('hover state - primary', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await button.hover(); + await page.waitForTimeout(100); + await expect(button).toHaveScreenshot('iconbutton-primary-hover-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('focus state - primary', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await button.focus(); + await page.waitForTimeout(100); + await expect(button).toHaveScreenshot('iconbutton-primary-focus-dark.png', { + maxDiffPixels: 100, + }); + }); + + it('active/pressed state - primary', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + const box = await button.boundingBox(); + if (!box) { + throw new Error('Button bounding box is null - element may not be in viewport'); + } + await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); + await page.mouse.down(); + await page.waitForTimeout(100); + await expect(button).toHaveScreenshot('iconbutton-primary-active-dark.png', { + maxDiffPixels: 100, + }); + await page.mouse.up(); + }); + }); + }); + + describe('Events and Accessibility', () => { + it('click event fires correctly', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--interactive', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await expect(button).toBeEnabled(); + await button.click(); + }); + + it('disabled button prevents click', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--primary-disabled', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeDisabled(); + }); + + it('keyboard navigation works', async ({ page }) => { + await page.goto(getStoryUrl('buttons-iconbutton--interactive', 'light'), { + waitUntil: 'networkidle', + }); + const button = page.getByRole('button'); + await expect(button).toBeVisible({ timeout: 10000 }); + await page.keyboard.press('Tab'); + await expect(button).toBeFocused(); + await page.keyboard.press('Enter'); + }); + }); +}); From ba40ce4e4a5f2979c13bf3eaf7cea1b947e2e1a2 Mon Sep 17 00:00:00 2001 From: Helder Oliveira Date: Tue, 14 Apr 2026 11:48:28 +0100 Subject: [PATCH 3/4] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshots?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iconbutton-danger-dark-chromium-linux.png | Bin 0 -> 581 bytes ...button-danger-disabled-dark-chromium-linux.png | Bin 0 -> 509 bytes ...utton-danger-disabled-light-chromium-linux.png | Bin 0 -> 506 bytes .../iconbutton-danger-light-chromium-linux.png | Bin 0 -> 553 bytes ...conbutton-default-size-dark-chromium-linux.png | Bin 0 -> 432 bytes ...onbutton-default-size-light-chromium-linux.png | Bin 0 -> 428 bytes .../iconbutton-ghost-dark-chromium-linux.png | Bin 0 -> 464 bytes ...nbutton-ghost-disabled-dark-chromium-linux.png | Bin 0 -> 480 bytes ...button-ghost-disabled-light-chromium-linux.png | Bin 0 -> 436 bytes .../iconbutton-ghost-light-chromium-linux.png | Bin 0 -> 450 bytes .../iconbutton-info-dark-chromium-linux.png | Bin 0 -> 610 bytes ...onbutton-info-disabled-dark-chromium-linux.png | Bin 0 -> 506 bytes ...nbutton-info-disabled-light-chromium-linux.png | Bin 0 -> 511 bytes .../iconbutton-info-light-chromium-linux.png | Bin 0 -> 556 bytes ...nbutton-primary-active-dark-chromium-linux.png | Bin 0 -> 509 bytes ...button-primary-active-light-chromium-linux.png | Bin 0 -> 550 bytes .../iconbutton-primary-dark-chromium-linux.png | Bin 0 -> 432 bytes ...utton-primary-disabled-dark-chromium-linux.png | Bin 0 -> 480 bytes ...tton-primary-disabled-light-chromium-linux.png | Bin 0 -> 436 bytes ...onbutton-primary-focus-dark-chromium-linux.png | Bin 0 -> 678 bytes ...nbutton-primary-focus-light-chromium-linux.png | Bin 0 -> 730 bytes ...onbutton-primary-hover-dark-chromium-linux.png | Bin 0 -> 504 bytes ...nbutton-primary-hover-light-chromium-linux.png | Bin 0 -> 499 bytes .../iconbutton-primary-light-chromium-linux.png | Bin 0 -> 428 bytes .../iconbutton-secondary-dark-chromium-linux.png | Bin 0 -> 559 bytes ...ton-secondary-disabled-dark-chromium-linux.png | Bin 0 -> 480 bytes ...on-secondary-disabled-light-chromium-linux.png | Bin 0 -> 436 bytes .../iconbutton-secondary-light-chromium-linux.png | Bin 0 -> 532 bytes .../iconbutton-small-dark-chromium-linux.png | Bin 0 -> 416 bytes .../iconbutton-small-light-chromium-linux.png | Bin 0 -> 410 bytes .../iconbutton-xs-dark-chromium-linux.png | Bin 0 -> 403 bytes .../iconbutton-xs-light-chromium-linux.png | Bin 0 -> 398 bytes 32 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-disabled-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-disabled-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-default-size-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-default-size-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-ghost-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-ghost-disabled-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-ghost-disabled-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-ghost-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-disabled-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-disabled-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-active-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-active-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-disabled-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-disabled-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-focus-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-focus-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-hover-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-hover-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-secondary-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-secondary-disabled-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-secondary-disabled-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-secondary-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-small-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-small-light-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-xs-dark-chromium-linux.png create mode 100644 tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-xs-light-chromium-linux.png diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..622ebc6247e059d9fdd5fc605f53a2a3012bf7b3 GIT binary patch literal 581 zcmV-L0=oT)P)q$IVA%zy&q6M$LRD0;96rlwb6yqtP ze}QK~LGf3DN^~)542pYF69kieK5~#Cm>qN%6#OuU1No*H;jT?J5&_!Pj0 z2ySprbPSLrIsj00fcJF+Szi|dySqL-tEkZZ{@zF=Uns!_+jlnuBUbuy1#xY6ipYpc<9p(vL{+qQQznbFCqg+!vf+#$edXz1?j z{5uw1OeE}*jS9rDVf22C{QUQS!!&Om(Av^65FKBL$FI~mY<79s=Tlpon}3%LaJWTP zm6ZpUb=~YvCR6=fFKghm19NY8u)puRSt6RAnSrw0fm?J-9s(Q@+()7}KbdXWT$})C z?lq02uq~Sl?t%UMSQa~0a0!Ko4gJLi8@+DdF8}}l|Nn>{S1$kn00v1!K~w_(@HoK) T&+zN_00000NkvXXu0mjf*7pQt literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-disabled-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-disabled-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d32870e60414866332f7c78b43f5f9c5868be8f4 GIT binary patch literal 509 zcmV>$e8yLTCTg;Zlya#d1~A)MbV~|HllH@rB9(%nWry-X>wOVD2O{dfM6qCsW0U3tDW6LF=X`1JG z`zx;N>blNj%O&9Z{(-;caybYB9$PMf^?HqKyWK9O=ytov*lsZ&0bn#5QA!6XQ0?(} z%xTEmrco53w&eH77C`T}S}oL>?rpjVVzb%IW;5Hi&l0FqDo8zicN_<#-|G;o)oPti z2f0E=onXkQL9^KeJKWr7-$k&SXMAv)Awxh>6in8!x5$#Js^laxQiKT@4u{9yB98fd zPR86yP%v>+Etnr^B}gzXG{ozoFdWK3tQ z5y!8#LyJDXe*ypi|Nkh-J-+||00v1!K~w_(**4Gbu@5je00000NkvXXu0mjfR-xjk literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-disabled-light-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-disabled-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..888cf4720764ff58bb9bf06ee1b0550a1187c798 GIT binary patch literal 506 zcmV1RMc@gv6=;{|PxFHi05l95^%qu_YnF?t@+^Qo$@aRN|dt$1`s{ z^K6eMrSuky@h%U8k}oV2u8%>01_jF#$v{c;QtVWVK|vgT-U|7X_}2j zL(`OORgZ4B+vS{p93h10^?HhiN(2a;h+3^y@`!f39YxVL@kJA|LfWK?XG2nvM)ZuQ}C==;9sd4s_K8O!BzDz@}#S$osGx(+HDkHpE)7ZpU>3$8l`iMxBwR(|Hu8UauF6#fJ#y^Z95rf!p4ZoCMtf)m44 w_TW73_Wc_G0RR6CsY#{)000I_L_t&o06s9x4gw0aDF6Tf07*qoM6N<$g7W#`+yDRo literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-light-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-danger-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..a3747f4de8dd89c6092f9fcdcddeaf2c90699456 GIT binary patch literal 553 zcmV+^0@nSBP)@)Jd7N&4Bal(KbX52uv#%Vr*DT4Faua{ zRpr2Bj0OH)fVH!_)oS+q{K4(UC0<-8lEg@46?i^5Asn|E4&zcgo%HD`Baum<8jDe$ zU%9)pEiU3(_4&GzBqb6oTqc1=CNs6M(QldA-j-4+7A}*3V{NULO!iywchc=<;W7!# z?(Tx3h?kdgvG|_PXV1>4)jG4Y!@^}fWKSrhw%ZA>_vz>epOE!nkda8VbXtEIOhUPA z+-Q|Z)aZ~=ouZWRjHS%bWGL1<#>hQeS64v*(?Z*QQR zkon_d7>a*zi++i*fFbDD^a5r8!%~cnLu01{W&p$TJk{@LqcO_S8a{K!fEd>0B4&^8 r9{>OV|NrPVp$7l}00v1!K~w_(aHqRZ;5e&g00000NkvXXu0mjfNAvs} literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-default-size-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-default-size-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..f9101145c336ff5f2146223899b01dafebba240a GIT binary patch literal 432 zcmV;h0Z;ykP)g|i72=Rgd9LG7G&U`*clBCbKR$_|NsnY2@K)ldH z-jBx#f~ePOx78}bumnv5jhNLBj`;)>MKzm^(eU+cEPsbQ8tTbdY|GSca+5bBk=*G? zI-R+1w^ddB>C54usO=KN93*I-=jR6`lXNC~++x{(c^y`-Hwa=eNhb~s0VZ4I^?GGl zo>i43Y2EKfhBBGpx!-47ceARRrd298$WWO5ZLtA1zN;u{D!*b!(XGT4QLFEvDcgz^y?NkBz-4(Wh{Iu&v6qEeG45?tH5Nn~i6 zK0p&XiPYMOXrk>2Nw=Py>74VwzkBY@{lG2DLS7n-P!#nl%MdLHK$4^={hF^VOK~y|(SiV(O!~_-&zmhx(-cLi*Bdy#no6Z0TIeSC z@A|XZ$KLM#;lUBItlljP6b8J0aNIi>4ES6&7YT2K*24=Ahaz@R5Cm7bO9!LTORZL8 zm`*;Q$1rRWH%-$%5$#r+?XeWKvpk?&s+23GLZR?ymgBgG`^W2>D~AzWmPl1qf*}6O zMx(LG0WbcEP)hqV8&x-ZCNGZM#Sjt^={?VgJlwc%Jz`KbU!DMuKU3At5D!1eOR80U`h#AeBnT zC+sG|!p-mRZhhY4Qt1Q42m?M9i%ZKiMFj#E+OyNf2L36q6|7?KS6PL7JjcMv1o_z#CL502W#G~GQY zidKUR!_Zmk?9>|xlm7x33`U1z&U3IAiI6PIR^u=X6K0FkwXn0j^_+=YL&4w;PlY;Nr0i62H>*}QOVeE%4B}OtElQ_TE30d@vfQR! zUtL1HYJx5j0g%8F0gVTI0RRC1{{vDcx&QzG21!IgR09Cy4SU{72XVXr0000-EJF=1|^ncu;1@*+N-K6c1lVt z$zZeD;Mwc-Y6*kE03((b<|0fc6H2|CRkU0#vFVcn84bu`ZrRVtH$ba9oet(%5QIx1 zmh9nhSglr$<N0(p=YjM01|sobdJKq*r_+g* z2E;|jby;aZT&l^+m*?T?j_swW3pTc1-}m1?K5;000{{U3|J9BkhX4Qo21!IgR09AR WHnM<#-lanT0000O&w?Hn8!q%eB124=u-)ug%Sq`5bj zimIyOICfn(&-1b@*(>0jw_2^yXw>O+lrRiU(`0g(&*#GPJSGi@i!95SG$1aJ111fK z3nrPj!T&M9J=ZkNwrxC5r_%U!QgfVL*Mr)u_S|DuUC`9_WS)lC6;6`9*=S9&*yWJB&gVWm(t+@?7h?NX&A%oJ=N-3>?R~TrMb3 z2;p#k=3xe7BxASR)e5Y}gCrY<0d-v6TXlfpY&JtCuz)rBf;3HWvwnNq?RIf=tcd}N zeZSw|S+H0v*j@fW6}=6ZWO%K>Ukk)}yWM8efH)_1-RFR~BK!CK3jhHB|CK+=zW@LL e21!IgR09Ch|EIfw?g`!i00002}}PD4ri2os>#%%S-bRBMCW_$=*;D6$-K@ zV+$U0p+KebamVE#UJxLkFIcTi^@`or#c>Z1F9^Ue^!@jEIWEUo%n&aK;Ogy`BssDj z6NFcuFNPygQm1qD*dShLl5rJ9V~KP+gAnQQIHy>@!O#pbqWXV0m#NHt;`p)fTpbER zh&H!PjQc!p=f42i>)WlJcxZak?Q)RhSHdJo!c7;B>@F_M+HKaq15VGAGeNfhN0=Bk z=yi*tcy^Ig2Gppcm!e=Yw*Iz@d%N(&6N;*FgU$}i%Ib!~fsx@MLQxG+MH+xmSsI}J sfKLDb0RR7C(kVLt000I_L_t&o04`yB;yqO{9RL6T07*qoM6N<$f{;hU*Z=?k literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..b55288849750e0ddebf1574a883a96b7a675b69e GIT binary patch literal 610 zcmV-o0-gPdP)P;6Lzo)Ll^U!#r4K_V@klF0;%}2{%R*Z&33$ zBTa``15Utcg;lJ|LZ(_SDvB@U3AEAWd1C#6oB}7{5F@qD6Fk54@0+6ePtm3SoRlDN z4Dq16Vo}aTI6|tVS*8#HIr^VHrvDlV4k#6R5GPP2IAK#}T!uPu#1p>i_h7;XAy|hYaW`4@l z!qb-?kcF)6ePS2g?z|f}490jWIXOD=u2iyYt5koJtYB{lf&G7A7#FYKxY-zqV!ZJ^ z8DqcA{D=2rsZ_FdxsBk=+17hq4+r1AnVw3C(DiwQP~2$m?s@#`<%@Ls*WLwJI<5^5 zC8m;-+vbIA;>)X%)ilj;I09;7^9I@M+(2Szr&Z4R=T9F& zO%A{=+9yW>TM(y&OCLMCg0F=mMl8`s0v8amA{^K2b=t8eF1krhp|Co^YV)i4u;=*l w{48|4eP00p0RR6;wHo38000I_L_t&o0F+YO9qO`|P5=M^07*qoM6N<$f&l6t_y7O^ literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-disabled-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-info-disabled-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d09054d54f24de9188341c6b4c34036b6a9d004f GIT binary patch literal 506 zcmV!M5j}|Gmpa?36n->57Kj@|kRfKd`rS(BfQmdJy#|RTY`u#o<%4V}Nu~G(_ zrY#nW{T9)UuUnT+E|9WYV`^Z6XtdcB?uXf~Uu*tRhm1JLbu8DsYW znC)J#CmATaOkLN-+|thpH^ADjR4SNfWUy;Q61Hs{hB2K^Pcq2mawt82#Wo5>g`UfKI1# zs26#RMk6}K;5mR!;QYb)djmy?wfu?n3vp$&w0$*2F#uVJE3>gdmsh^3`_bhADWB_* wg*c1*_x%e10RR7K5!EID000I_L_t&o0JaCuv3oEiHUIzs07*qoM6N<$f@4qH5Zzf5wb7dTfgltLih|&&|Nkcly;xDv+Jf{TRjbl`XVa&>q=A}MQvR#EI&(3y*5<7As0!pYd5pW`qE9}C!3j7}d*L5e8$#S{G zbGck@G#ZK`70a0%dc7X!{BaKHC5lV`IT*s*o#_oac?N~MBMU;;a51-5NtXZ`h6(=?Qhog)CV zce~vK6Kb^@I|x~uo`xfAdNQs8vA``tBDhGCK?`!8&8WVRz1NNcXhF`aW!IPz_D}Lc8iz}`>J3Bqy7Dle(cB8YP;G=_qu6nPlrs#fLDRt+lbVfR^l8X2O3M6Pj zEK19Q02y0eq`go8EDpHg3-F+>P`SLSh%q?65{yBB6W@^+#Pbx*3uQ4<3UH>7oMJiP zQ)ixl0w8$_T2qKmfsZ3_YpdDyTp}s(yXg<_Z4F0)Mv0V|VRSyrC>iM~!zCmcTgVzF z8VPJ42#di$N4O$JaSe8cvyR$5^GtG$1ddYj_m6_ee?M8$M}ewx`h;%p+>3uR$~6kA ztKw3U$rbzRMxI^E@g5Z-KlDn+pL?rao0u@&s}4bEo}Z7nPmJ5f+O!Olmpve8ns5UvnG5K*x4@F5bD z+-C|AIg^3Qau$9N$nG-VH<_92jPmyW!5C8&MV7fFNz4z}wr!f0aX#Z+!K0~QmzjTn zqi`7B>c&}deD{<63ec*yeTfVc252aL#r;=YV#NgGCGh_O)EW(iLhW|@%R#Hv3IqZ~ zL#n`FFfdK?(}Ak0{eGWlND|0oGP)V~>a+ypf zDYhhm?RIm&@?uwryCJwcqa%tJ!S!CxLW2-Dotb)#`jc2kCX6bDqs+ zyWMWFSX`}EE(~%w9CkUb*XzArZ#tc#&ED=~c{m(Sr&B(kpG+n$3?4~F%^Z)%N2iEV zEEZ#~@Ceanvl)-ak52I&C@SWPC#a&A022&;SK$5vY)00000NkvXXu0mjfV literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-active-light-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-active-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..573ed279aa234bf640bca7bee6281ce168889fb8 GIT binary patch literal 550 zcmV+>0@?kEP)rK86l~+0w^K zO-$Ws13n-f?G{lIr8k>_0)NcnaOVEcpBc`*=Te12K@`QrqmW8vPynQWBuR#$RgLv1 zAac3fLo_Dl@<3`x3bv@5sCYt&4Mx8MJBJ-5yVI#^?2D+q5`ZEQ9`m{z6{dGnrzs zXgC};Zf}t!)!W;Lqb2--5YD=nE;>Hqc^*Q@aoobvvQnwU5#kzDO!<9ax7*LpPJ_W< zKL0T`2!haPG_!Ma95?bSgFBbYyuYj08wQ7l(foVQqjT8daO@b3=7U3)Wh*zZS*`0E zdTwO&Qy!V=bh>Qz>Dp#1ZBV9*BGHIi-Td8KO{+F^9|R>S^97w99W&EYB^FFfOoEd9 zfi9{V0GWZs+edOxamX-rKsFefhN{K}Na7C8AA!oMRQ1H$^*te^(vn`^X&O~W!7~5= o0RR6VJxLb;000I_L_t&o0G`&gR~KI!kN^Mx07*qoM6N<$f@h@oo&W#< literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..f9101145c336ff5f2146223899b01dafebba240a GIT binary patch literal 432 zcmV;h0Z;ykP)g|i72=Rgd9LG7G&U`*clBCbKR$_|NsnY2@K)ldH z-jBx#f~ePOx78}bumnv5jhNLBj`;)>MKzm^(eU+cEPsbQ8tTbdY|GSca+5bBk=*G? zI-R+1w^ddB>C54usO=KN93*I-=jR6`lXNC~++x{(c^y`-Hwa=eNhb~s0VZ4I^?GGl zo>i43Y2EKfhBBGpx!-47ceARRrd298$WWO5ZLtA1z-EJF=1|^ncu;1@*+N-K6c1lVt z$zZeD;Mwc-Y6*kE03((b<|0fc6H2|CRkU0#vFVcn84bu`ZrRVtH$ba9oet(%5QIx1 zmh9nhSglr$<N0(p=YjM01|sobdJKq*r_+g* z2E;|jby;aZT&l^+m*?T?j_swW3pTc1-}m1?K5;000{{U3|J9BkhX4Qo21!IgR09AR WHnM<#-lanT0000O&w?Hn8!q%eB124=u-)ug%Sq`5bj zimIyOICfn(&-1b@*(>0jw_2^yXw>O+lrRiU(`0g(&*#GPJSGi@i!95SG$1aJ111fK z3nrPj!T&M9J=ZkNwrxC5r_%U!QgfVL*Mr)u_S|DuUC`9_WS)lC6;6`9*=S9&*yWJB&gVWm(t+@?7h?NX&A%oJ=N-3>?R~TrMb3 z2;p#k=3xe7BxASR)e5Y}gCrY<0d-v6TXlfpY&JtCuz)rBf;3HWvwnNq?RIf=tcd}N zeZSw|S+H0v*j@fW6}=6ZWO%K>Ukk)}yWM8efH)_1-RFR~BK!CK3jhHB|CK+=zW@LL e21!IgR09Ch|EIfw?g`!i0000i&zBs$<-SeE>XduQ%&&Np}F%sIn(Jl?mroJ1n&bUN$xnqio) z$8mpuFBXfV(P$!(U^$L~Q;)|J3WW&YSglr@&Bo+%IgLhxiJzaJpPrs_97m30xm?cY z^YM6$si#sYuHWys+wIHC%d@jHmSxG&z{$zU37(MY^?Doxp#}l`1mO<|OePa}=2oi} z`WF`$gjXq*2QVG1gyi}{z-7n>GStu0J*is49>-9h8i*BRQps}SA zD3wY`f=Id#4-b!zkAXm7u~=ZYX>4gXS*z6|*QV3yWHN~~px5gu4Vjyp8@z6BZwcQZ zl@gkRrcfwMCe!ot^KPj?iflHUSgS&zu;2WEfK)1VyWMuXy;v-6^X?X8W4T-&3u@6%L2<`8>+g?ss%styZ_&Rjbw6Z1!DSq-%0;lMyqx416?- zReE}QB6~ToM73HilgWHEivK`Rk-hu_QFJ8#LBZLs{%(x(!q(y4-5o0s2+%_EBD{k7 zfu~3$VhsiZTDZVWr&H7{ax`#)E7xc=LfdFG{=WR8*!p}v!Z%K*(`+_#49hv44xISe zY=+1k3Q0b&KhbxBvhE M07*qoM6N<$f~!0{U;qFB literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-focus-light-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-primary-focus-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8a6a730ada1cc34cad0f35f7f7ed748507d4e3 GIT binary patch literal 730 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 KMNUMnLSTXwy0!lR literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-small-light-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-small-light-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..d67be67076d7cb19a120e4f8689031c3b21303a9 GIT binary patch literal 410 zcmV;L0cHM)P)6KD8w4j91gbgi&)^njj}60Mn1e(->G2X5H!s#%W_^| zqu$`!9ENRt7gs8lOXVU-lE6(o&);0%o?o1O9l2jt(=-G@fQRDo#BliRI&xnDsni;t z%>i#w6y=(S=6}UM#k~Un0RR6DHE<08000I_L_t&o0H&#UB05d^LI3~&07*qoM6N<$ Ef+ZlcGynhq literal 0 HcmV?d00001 diff --git a/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-xs-dark-chromium-linux.png b/tests/buttons/iconbutton.spec.ts-snapshots/iconbutton-xs-dark-chromium-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..ef4155ff90b253b66c2bec0f825ac08a053d5deb GIT binary patch literal 403 zcmV;E0c`$>P)mNJ2dsaaU(ADLIGlt{%`(VJZZ2wEi0sD|x3x-96bDQcMX%SJ$)phk35C}3Ty8kj8;u7C%+h`$0mCp~F5i|)00@#4H9G^k zyON1*1VL1*m0tJtt*?zr>vgSWJiawPXokcAsBsO&g+-&SX z2oFF~CTkIy(3Un>zI@9)Ilp_(%{>QlT^Cqh5D-ZbvDIM6vMi1}O(Ce~^Rt?5+yBA} zOaTHR=~?nTnS51FD&bh~r5B5>H~C8#-tyeKYK=y=qNpL*`(TjC?EH=3IR2(-AsB{X ziaK?-rl}}~hF~O_{dSy-THQ2FUDvBs4uaMQf(XGpb?!Uk@#p^D!O`I{;JWQQA(*og zZAzx9b-PkNmro`(;~NRziFncr%CbDaTEG9wvMkRxDT)F?(9duj$NRxXy&<#(9N(SA zO2u-iT%>7wZdalxK0Z9%++NQ%X&43!!@vR|NNPCz@Q=TvoKA0(*&MJ~48s7yw=JcJ si}M2j0RR6R?SX3m000I_L_t&o0J05u0stxO{r~^~07*qoM6N<$g6V0kaR2}S literal 0 HcmV?d00001 From d6d10fa8f7a47e8510d10c40a914d17b10ba8c89 Mon Sep 17 00:00:00 2001 From: Helder Oliveira Date: Tue, 14 Apr 2026 12:02:00 +0100 Subject: [PATCH 4/4] =?UTF-8?q?fix(IconButton):=20=F0=9F=90=9B=20Add=20Sto?= =?UTF-8?q?rybook=20actions=20and=20event=20assertions=20to=20Interactive?= =?UTF-8?q?=20story=20tests?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/IconButton/IconButton.stories.tsx | 1 + tests/buttons/iconbutton.spec.ts | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/src/components/IconButton/IconButton.stories.tsx b/src/components/IconButton/IconButton.stories.tsx index 8edcbdfea..3b95a6f29 100644 --- a/src/components/IconButton/IconButton.stories.tsx +++ b/src/components/IconButton/IconButton.stories.tsx @@ -123,5 +123,6 @@ export const Interactive: Story = { args: { type: 'primary', icon: 'user', + onClick: () => console.log('clicked'), }, }; diff --git a/tests/buttons/iconbutton.spec.ts b/tests/buttons/iconbutton.spec.ts index 2d0eab675..09ffa4ee2 100644 --- a/tests/buttons/iconbutton.spec.ts +++ b/tests/buttons/iconbutton.spec.ts @@ -414,13 +414,20 @@ describe('IconButton Visual Regression', () => { describe('Events and Accessibility', () => { it('click event fires correctly', async ({ page }) => { + const consoleMessages: string[] = []; + page.on('console', msg => consoleMessages.push(msg.text())); + await page.goto(getStoryUrl('buttons-iconbutton--interactive', 'light'), { waitUntil: 'networkidle', }); const button = page.getByRole('button'); await expect(button).toBeVisible({ timeout: 10000 }); await expect(button).toBeEnabled(); + await button.click(); + + // Verify console log was triggered + expect(consoleMessages.some(msg => msg.includes('clicked'))).toBe(true); }); it('disabled button prevents click', async ({ page }) => { @@ -432,14 +439,21 @@ describe('IconButton Visual Regression', () => { }); it('keyboard navigation works', async ({ page }) => { + const consoleMessages: string[] = []; + page.on('console', msg => consoleMessages.push(msg.text())); + await page.goto(getStoryUrl('buttons-iconbutton--interactive', 'light'), { waitUntil: 'networkidle', }); const button = page.getByRole('button'); await expect(button).toBeVisible({ timeout: 10000 }); + await page.keyboard.press('Tab'); await expect(button).toBeFocused(); await page.keyboard.press('Enter'); + + // Verify console log was triggered + expect(consoleMessages.some(msg => msg.includes('clicked'))).toBe(true); }); }); });