diff --git a/.storybook/main.ts b/.storybook/main.ts index 89968a2..3dd8a72 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,7 +1,7 @@ import type { StorybookConfig } from "@storybook/sveltekit"; const config: StorybookConfig = { - stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|ts|svelte)"], + stories: ["../src/**/*.stories.@(js|ts|svelte)"], addons: [ "@storybook/addon-svelte-csf", "@storybook/addon-a11y", diff --git a/src/lib/ui/components/Button.svelte b/src/lib/ui/components/Button.svelte index f35817a..fa26d5f 100644 --- a/src/lib/ui/components/Button.svelte +++ b/src/lib/ui/components/Button.svelte @@ -1,6 +1,16 @@ diff --git a/src/lib/ui/components/render.test.ts b/src/lib/ui/components/render.test.ts index dd26b81..bf1e98f 100644 --- a/src/lib/ui/components/render.test.ts +++ b/src/lib/ui/components/render.test.ts @@ -1,7 +1,9 @@ import { render } from "svelte/server"; import { describe, expect, test } from "vitest"; +import Button from "./Button.svelte"; import DashboardFrame from "./DashboardFrame.svelte"; import FooterCell from "./FooterCell.svelte"; +import IconButton from "./IconButton.svelte"; import ServiceRow from "./ServiceRow.svelte"; import TelemetryCard from "./TelemetryCard.svelte"; import { dashboardPreviewFixtures } from "../fixtures"; @@ -94,4 +96,31 @@ describe("dashboard UI components", () => { expect(withoutProgress.body).not.toContain("telemetry-card__bar"); expect(withProgress.body).toContain("--metric-progress: 42%"); }); + + test("base button controls forward native attributes", () => { + const button = render(Button, { + props: { + label: "Refresh", + id: "refresh-action", + class: "custom-action", + "aria-controls": "refresh-target", + }, + }); + const iconButton = render(IconButton, { + props: { + icon: "mdi:refresh", + label: "Refresh status", + id: "refresh-icon-action", + class: "custom-icon-action", + "aria-expanded": "false", + }, + }); + + expect(button.body).toContain("id=\"refresh-action\""); + expect(button.body).toContain("class=\"ui-button custom-action "); + expect(button.body).toContain("aria-controls=\"refresh-target\""); + expect(iconButton.body).toContain("id=\"refresh-icon-action\""); + expect(iconButton.body).toContain("class=\"icon-button custom-icon-action "); + expect(iconButton.body).toContain("aria-expanded=\"false\""); + }); }); diff --git a/src/lib/ui/stories/FocusPreview.svelte b/src/lib/ui/stories/FocusPreview.svelte new file mode 100644 index 0000000..514691f --- /dev/null +++ b/src/lib/ui/stories/FocusPreview.svelte @@ -0,0 +1,33 @@ + + +
+ {@render children?.()} +
+ + diff --git a/src/lib/ui/stories/IconButton.stories.svelte b/src/lib/ui/stories/IconButton.stories.svelte index a303642..faa05b6 100644 --- a/src/lib/ui/stories/IconButton.stories.svelte +++ b/src/lib/ui/stories/IconButton.stories.svelte @@ -1,6 +1,7 @@