Skip to content

Commit ad74adc

Browse files
committed
svelte: Add Storybook setup
1 parent 9b43875 commit ad74adc

File tree

11 files changed

+1093
-2
lines changed

11 files changed

+1093
-2
lines changed

pnpm-lock.yaml

Lines changed: 937 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

svelte/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,6 @@ Thumbs.db
2121
# Vite
2222
vite.config.js.timestamp-*
2323
vite.config.ts.timestamp-*
24+
25+
*storybook.log
26+
storybook-static

svelte/.storybook/main.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import type { StorybookConfig } from '@storybook/sveltekit';
2+
3+
const config: StorybookConfig = {
4+
core: {
5+
disableTelemetry: true,
6+
},
7+
framework: '@storybook/sveltekit',
8+
stories: ['../src/**/*.stories.@(js|ts|svelte)'],
9+
addons: [
10+
'@storybook/addon-svelte-csf',
11+
'@chromatic-com/storybook',
12+
'@storybook/addon-vitest',
13+
'@storybook/addon-a11y',
14+
'@storybook/addon-docs',
15+
],
16+
};
17+
export default config;

svelte/.storybook/preview.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import type { Preview } from '@storybook/sveltekit';
2+
3+
import '../src/lib/css/global.css';
4+
5+
const preview: Preview = {
6+
initialGlobals: {
7+
backgrounds: { value: 'content' },
8+
},
9+
parameters: {
10+
backgrounds: {
11+
options: {
12+
content: { name: 'Dynamic', value: 'var(--main-bg)' },
13+
header: { name: 'Header', value: 'var(--header-bg-color)' },
14+
},
15+
},
16+
controls: {
17+
matchers: {
18+
color: /(background|color)$/i,
19+
date: /Date$/i,
20+
},
21+
},
22+
},
23+
};
24+
25+
export default preview;

svelte/eslint.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { fileURLToPath } from 'node:url';
33
import { includeIgnoreFile } from '@eslint/compat';
44
import js from '@eslint/js';
55
import prettier from 'eslint-config-prettier';
6+
import storybook from 'eslint-plugin-storybook';
67
import svelte from 'eslint-plugin-svelte';
78
import { defineConfig } from 'eslint/config';
89
import globals from 'globals';
@@ -19,6 +20,7 @@ export default defineConfig(
1920
...svelte.configs.recommended,
2021
prettier,
2122
...svelte.configs.prettier,
23+
...storybook.configs['flat/recommended'],
2224
{
2325
languageOptions: { globals: { ...globals.browser, ...globals.node } },
2426

svelte/package.json

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,25 +13,36 @@
1313
"format": "prettier --write .",
1414
"lint": "prettier --check . && eslint .",
1515
"test:unit": "vitest",
16-
"test": "npm run test:unit -- --run"
16+
"test": "npm run test:unit -- --run",
17+
"storybook": "storybook dev -p 6006",
18+
"build-storybook": "storybook build"
1719
},
1820
"devDependencies": {
21+
"@chromatic-com/storybook": "^4.1.3",
1922
"@eslint/compat": "2.0.0",
2023
"@eslint/js": "9.39.2",
2124
"@ianvs/prettier-plugin-sort-imports": "4.7.0",
2225
"@poppanator/sveltekit-svg": "6.0.1",
26+
"@storybook/addon-a11y": "^10.1.10",
27+
"@storybook/addon-docs": "^10.1.10",
28+
"@storybook/addon-svelte-csf": "^5.0.10",
29+
"@storybook/addon-vitest": "^10.1.10",
30+
"@storybook/sveltekit": "^10.1.10",
2331
"@sveltejs/adapter-static": "3.0.10",
2432
"@sveltejs/kit": "2.49.2",
2533
"@sveltejs/vite-plugin-svelte": "6.2.1",
2634
"@types/node": "24.10.4",
2735
"@vitest/browser-playwright": "4.0.16",
36+
"@vitest/coverage-v8": "4.0.16",
2837
"eslint": "9.39.2",
2938
"eslint-config-prettier": "10.1.8",
39+
"eslint-plugin-storybook": "^10.1.10",
3040
"eslint-plugin-svelte": "3.13.1",
3141
"globals": "16.5.0",
3242
"playwright": "1.57.0",
3343
"prettier": "3.7.4",
3444
"prettier-plugin-svelte": "3.4.1",
45+
"storybook": "^10.1.10",
3546
"svelte": "5.46.0",
3647
"svelte-check": "4.3.4",
3748
"typescript": "5.9.3",
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script module lang="ts">
2+
import { defineMeta } from '@storybook/addon-svelte-csf';
3+
4+
import Footer from './Footer.svelte';
5+
6+
const { Story } = defineMeta({
7+
title: 'Footer',
8+
component: Footer,
9+
tags: ['autodocs'],
10+
});
11+
</script>
12+
13+
<Story name="Default" />
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<script module lang="ts">
2+
import { defineMeta } from '@storybook/addon-svelte-csf';
3+
4+
import Header from './Header.svelte';
5+
6+
const { Story } = defineMeta({
7+
title: 'Header',
8+
component: Header,
9+
tags: ['autodocs'],
10+
globals: {
11+
backgrounds: { value: 'header' },
12+
},
13+
});
14+
</script>
15+
16+
<Story name="Default" />
17+
18+
<Story name="Hero" args={{ hero: true }} />
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<script module lang="ts">
2+
import { defineMeta } from '@storybook/addon-svelte-csf';
3+
4+
import PageHeader from './PageHeader.svelte';
5+
6+
const { Story } = defineMeta({
7+
title: 'PageHeader',
8+
component: PageHeader,
9+
tags: ['autodocs'],
10+
});
11+
</script>
12+
13+
<Story name="Default" args={{ title: 'Usage Policy' }} />
14+
15+
<Story name="with suffix" args={{ title: 'All Crates', suffix: "for keyword 'web'" }} />
16+
17+
<Story name="with spinner" args={{ title: 'Search Results', suffix: "for 'web'", showSpinner: true }} />
18+
19+
<Story name="with custom content">custom content</Story>
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<script module lang="ts">
2+
import { defineMeta } from '@storybook/addon-svelte-csf';
3+
4+
import SearchForm from './SearchForm.svelte';
5+
6+
const { Story } = defineMeta({
7+
title: 'SearchForm',
8+
component: SearchForm,
9+
tags: ['autodocs'],
10+
globals: {
11+
backgrounds: { value: 'header' },
12+
},
13+
argTypes: {
14+
size: {
15+
control: 'inline-radio',
16+
options: [undefined, 'big'],
17+
},
18+
},
19+
});
20+
</script>
21+
22+
<Story name="Default" />
23+
24+
<Story name="Big" args={{ size: 'big' }} />
25+
26+
<Story name="with autofocus" args={{ autofocus: true }} />

0 commit comments

Comments
 (0)