+ We recommend building UIs with a
+
+ component-driven
+
+ process starting with atomic components and ending with pages.
+
+
+ Render pages with mock data. This makes it easy to build and review page states without
+ needing to navigate to them in your app. Here are some handy patterns for managing page data
+ in Storybook:
+
+
+
+ Use a higher-level connected component. Storybook helps you compose such data from the
+ "args" of child component stories
+
+
+ Assemble data in the page component from your services. You can mock these services out
+ using Storybook.
+
+
+
+ Get a guided tutorial on component-driven development at
+
+ Storybook tutorials
+
+ . Read more in the
+ docs
+ .
+
+
+ Tip
+ Adjust the width of the canvas with the
+
+ Viewports addon in the toolbar
+
+ We recommend building UIs with a
+
+ component-driven
+
+ process starting with atomic components and ending with pages.
+
+
+ Render pages with mock data. This makes it easy to build and review page states without
+ needing to navigate to them in your app. Here are some handy patterns for managing page data
+ in Storybook:
+
+
+
+ Use a higher-level connected component. Storybook helps you compose such data from the
+ "args" of child component stories
+
+
+ Assemble data in the page component from your services. You can mock these services out
+ using Storybook.
+
+
+
+ Get a guided tutorial on component-driven development at
+
+ Storybook tutorials
+
+ . Read more in the
+ docs
+ .
+
+
+ Tip
+ Adjust the width of the canvas with the
+
+ Viewports addon in the toolbar
+
+ We recommend building UIs with a
+
+ component-driven
+
+ process starting with atomic components and ending with pages.
+
+
+ Render pages with mock data. This makes it easy to build and review page states without
+ needing to navigate to them in your app. Here are some handy patterns for managing page data
+ in Storybook:
+
+
+
+ Use a higher-level connected component. Storybook helps you compose such data from the
+ "args" of child component stories
+
+
+ Assemble data in the page component from your services. You can mock these services out
+ using Storybook.
+
+
+
+ Get a guided tutorial on component-driven development at
+
+ Storybook tutorials
+
+ . Read more in the
+ docs
+ .
+
+
+ Tip
+ Adjust the width of the canvas with the
+
+ Viewports addon in the toolbar
+
+
+
diff --git a/code/renderers/svelte/vitest.config.ts b/code/renderers/svelte/vitest.config.ts
index 58fc647e8f30..f80ba91df63f 100644
--- a/code/renderers/svelte/vitest.config.ts
+++ b/code/renderers/svelte/vitest.config.ts
@@ -5,9 +5,12 @@ import { vitestCommonConfig } from '../../vitest.workspace';
export default defineConfig(
mergeConfig(vitestCommonConfig, {
plugins: [
- import('@sveltejs/vite-plugin-svelte').then(({ svelte, vitePreprocess }) =>
- svelte({ preprocess: vitePreprocess() })
- ),
+ import('@sveltejs/vite-plugin-svelte').then(({ svelte }) => svelte()),
+ // @ts-expect-error -- types don't match our TS module resolution setting
+ import('@testing-library/svelte/vite').then(({ svelteTesting }) => svelteTesting()),
],
+ test: {
+ environment: 'happy-dom',
+ },
})
);
diff --git a/code/yarn.lock b/code/yarn.lock
index 875c0263c054..61e3e672ce05 100644
--- a/code/yarn.lock
+++ b/code/yarn.lock
@@ -6052,7 +6052,6 @@ __metadata:
browser-assert: "npm:^1.2.1"
browser-dtector: "npm:^3.4.0"
camelcase: "npm:^8.0.0"
- chai: "npm:^4.4.1"
cli-table3: "npm:^0.6.1"
commander: "npm:^12.1.0"
comment-parser: "npm:^1.4.1"
@@ -6345,7 +6344,6 @@ __metadata:
"@storybook/global": "npm:^5.0.0"
"@vitest/utils": "npm:^2.0.5"
typescript: "npm:^5.3.2"
- util: "npm:^0.12.4"
peerDependencies:
storybook: "workspace:^"
languageName: unknown
@@ -6910,7 +6908,7 @@ __metadata:
serve-static: "npm:^1.14.1"
slash: "npm:^5.0.0"
storybook: "workspace:^"
- svelte: "npm:^5.0.0-next.65"
+ svelte: "npm:^5.0.0-next.268"
ts-dedent: "npm:^2.0.0"
typescript: "npm:^5.4.3"
util: "npm:^0.12.4"
@@ -7000,7 +6998,7 @@ __metadata:
"@sveltejs/vite-plugin-svelte": "npm:^3.0.1"
"@types/node": "npm:^22.0.0"
magic-string: "npm:^0.30.0"
- svelte: "npm:^5.0.0-next.65"
+ svelte: "npm:^5.0.0-next.268"
svelte-preprocess: "npm:^5.1.1"
sveltedoc-parser: "npm:^4.2.1"
ts-dedent: "npm:^2.2.0"
@@ -7041,10 +7039,10 @@ __metadata:
"@storybook/preview-api": "workspace:^"
"@storybook/theming": "workspace:^"
"@sveltejs/vite-plugin-svelte": "npm:^3.0.2"
- "@testing-library/svelte": "patch:@testing-library/svelte@npm%3A4.1.0#~/.yarn/patches/@testing-library-svelte-npm-4.1.0-34b7037bc0.patch"
+ "@testing-library/svelte": "npm:^5.2.3"
expect-type: "npm:^0.15.0"
- svelte: "npm:^5.0.0-next.65"
- svelte-check: "npm:^3.6.4"
+ svelte: "npm:^5.0.0-next.268"
+ svelte-check: "npm:^4.0.5"
sveltedoc-parser: "npm:^4.2.1"
ts-dedent: "npm:^2.0.0"
type-fest: "npm:~2.19"
@@ -7098,7 +7096,6 @@ __metadata:
ts-dedent: "npm:^2.2.0"
type-fest: "npm:~2.19"
typescript: "npm:^5.3.2"
- util: "npm:^0.12.4"
peerDependencies:
storybook: "workspace:^"
languageName: unknown
@@ -7323,7 +7320,7 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/dom@npm:10.4.0, @testing-library/dom@npm:^10.4.0":
+"@testing-library/dom@npm:10.4.0, @testing-library/dom@npm:^10.0.0, @testing-library/dom@npm:^10.4.0":
version: 10.4.0
resolution: "@testing-library/dom@npm:10.4.0"
dependencies:
@@ -7339,7 +7336,7 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/dom@npm:^9.0.0, @testing-library/dom@npm:^9.3.1, @testing-library/dom@npm:^9.3.3":
+"@testing-library/dom@npm:^9.0.0, @testing-library/dom@npm:^9.3.3":
version: 9.3.4
resolution: "@testing-library/dom@npm:9.3.4"
dependencies:
@@ -7404,25 +7401,21 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/svelte@npm:4.1.0":
- version: 4.1.0
- resolution: "@testing-library/svelte@npm:4.1.0"
+"@testing-library/svelte@npm:^5.2.3":
+ version: 5.2.3
+ resolution: "@testing-library/svelte@npm:5.2.3"
dependencies:
- "@testing-library/dom": "npm:^9.3.1"
+ "@testing-library/dom": "npm:^10.0.0"
peerDependencies:
- svelte: ^3 || ^4
- checksum: 10c0/4335d8be01bd1e6475062be218577fa1d1b24e9dc97c33db523c5af6b044b97625f65a58bb5f73225064c5a2bf9ae9696948a2bcd2d82c1c25423014d635dce2
- languageName: node
- linkType: hard
-
-"@testing-library/svelte@patch:@testing-library/svelte@npm%3A4.1.0#~/.yarn/patches/@testing-library-svelte-npm-4.1.0-34b7037bc0.patch":
- version: 4.1.0
- resolution: "@testing-library/svelte@patch:@testing-library/svelte@npm%3A4.1.0#~/.yarn/patches/@testing-library-svelte-npm-4.1.0-34b7037bc0.patch::version=4.1.0&hash=490043"
- dependencies:
- "@testing-library/dom": "npm:^9.3.1"
- peerDependencies:
- svelte: ^3 || ^4
- checksum: 10c0/95586fa05bb536fb538d01731a705121d71797a77ab7a8e1f255909e50dfe4fa09f3a6678a60b8a075332dd45940c0fa37d002d2f6c201400295fa3840c88821
+ svelte: ^3 || ^4 || ^5 || ^5.0.0-next.0
+ vite: "*"
+ vitest: "*"
+ peerDependenciesMeta:
+ vite:
+ optional: true
+ vitest:
+ optional: true
+ checksum: 10c0/a83d662ee7a0ce901598bd985b8d6afde72c7aa37f22447078bd38c7ec9df6b3fb15464d3f171726479a65f0e562732526686b6a33d6b2c7fd34edb6e7b706a9
languageName: node
linkType: hard
@@ -9582,7 +9575,7 @@ __metadata:
languageName: node
linkType: hard
-"acorn@npm:^8.0.0, acorn@npm:^8.10.0, acorn@npm:^8.11.2, acorn@npm:^8.11.3, acorn@npm:^8.12.1, acorn@npm:^8.4.1, acorn@npm:^8.6.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0":
+"acorn@npm:^8.0.0, acorn@npm:^8.10.0, acorn@npm:^8.11.2, acorn@npm:^8.12.1, acorn@npm:^8.4.1, acorn@npm:^8.6.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0":
version: 8.12.1
resolution: "acorn@npm:8.12.1"
bin:
@@ -9911,6 +9904,13 @@ __metadata:
languageName: node
linkType: hard
+"aria-query@npm:^5.3.1":
+ version: 5.3.2
+ resolution: "aria-query@npm:5.3.2"
+ checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e
+ languageName: node
+ linkType: hard
+
"arr-diff@npm:^4.0.0":
version: 4.0.0
resolution: "arr-diff@npm:4.0.0"
@@ -10115,13 +10115,6 @@ __metadata:
languageName: node
linkType: hard
-"assertion-error@npm:^1.1.0":
- version: 1.1.0
- resolution: "assertion-error@npm:1.1.0"
- checksum: 10c0/25456b2aa333250f01143968e02e4884a34588a8538fbbf65c91a637f1dbfb8069249133cd2f4e530f10f624d206a664e7df30207830b659e9f5298b00a4099b
- languageName: node
- linkType: hard
-
"assertion-error@npm:^2.0.1":
version: 2.0.1
resolution: "assertion-error@npm:2.0.1"
@@ -10313,12 +10306,10 @@ __metadata:
languageName: node
linkType: hard
-"axobject-query@npm:^4.0.0":
- version: 4.0.0
- resolution: "axobject-query@npm:4.0.0"
- dependencies:
- dequal: "npm:^2.0.3"
- checksum: 10c0/4d756b5c2ff099f1c7f99e55a5de9b2066cb2a13a3170185ff34bfec2d7bcab81eb820a4e7340d35c251341b61ebee6e705b7ce64db78224df1df5a4d68448fe
+"axobject-query@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "axobject-query@npm:4.1.0"
+ checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775
languageName: node
linkType: hard
@@ -11422,21 +11413,6 @@ __metadata:
languageName: node
linkType: hard
-"chai@npm:^4.4.1":
- version: 4.5.0
- resolution: "chai@npm:4.5.0"
- dependencies:
- assertion-error: "npm:^1.1.0"
- check-error: "npm:^1.0.3"
- deep-eql: "npm:^4.1.3"
- get-func-name: "npm:^2.0.2"
- loupe: "npm:^2.3.6"
- pathval: "npm:^1.1.1"
- type-detect: "npm:^4.1.0"
- checksum: 10c0/b8cb596bd1aece1aec659e41a6e479290c7d9bee5b3ad63d2898ad230064e5b47889a3bc367b20100a0853b62e026e2dc514acf25a3c9385f936aa3614d4ab4d
- languageName: node
- linkType: hard
-
"chai@npm:^5.1.1":
version: 5.1.1
resolution: "chai@npm:5.1.1"
@@ -11553,15 +11529,6 @@ __metadata:
languageName: node
linkType: hard
-"check-error@npm:^1.0.3":
- version: 1.0.3
- resolution: "check-error@npm:1.0.3"
- dependencies:
- get-func-name: "npm:^2.0.2"
- checksum: 10c0/94aa37a7315c0e8a83d0112b5bfb5a8624f7f0f81057c73e4707729cdd8077166c6aefb3d8e2b92c63ee130d4a2ff94bad46d547e12f3238cc1d78342a973841
- languageName: node
- linkType: hard
-
"check-error@npm:^2.1.1":
version: 2.1.1
resolution: "check-error@npm:2.1.1"
@@ -11576,7 +11543,7 @@ __metadata:
languageName: node
linkType: hard
-"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.4.1, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3":
+"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.0.0, chokidar@npm:^3.5.1, chokidar@npm:^3.5.3":
version: 3.5.3
resolution: "chokidar@npm:3.5.3"
dependencies:
@@ -11595,6 +11562,15 @@ __metadata:
languageName: node
linkType: hard
+"chokidar@npm:^4.0.1":
+ version: 4.0.1
+ resolution: "chokidar@npm:4.0.1"
+ dependencies:
+ readdirp: "npm:^4.0.1"
+ checksum: 10c0/4bb7a3adc304059810bb6c420c43261a15bb44f610d77c35547addc84faa0374265c3adc67f25d06f363d9a4571962b02679268c40de07676d260de1986efea9
+ languageName: node
+ linkType: hard
+
"chownr@npm:^1.1.1":
version: 1.1.4
resolution: "chownr@npm:1.1.4"
@@ -12832,15 +12808,6 @@ __metadata:
languageName: node
linkType: hard
-"deep-eql@npm:^4.1.3":
- version: 4.1.3
- resolution: "deep-eql@npm:4.1.3"
- dependencies:
- type-detect: "npm:^4.0.0"
- checksum: 10c0/ff34e8605d8253e1bf9fe48056e02c6f347b81d9b5df1c6650a1b0f6f847b4a86453b16dc226b34f853ef14b626e85d04e081b022e20b00cd7d54f079ce9bbdd
- languageName: node
- linkType: hard
-
"deep-eql@npm:^5.0.1":
version: 5.0.2
resolution: "deep-eql@npm:5.0.2"
@@ -14702,13 +14669,13 @@ __metadata:
languageName: node
linkType: hard
-"esrap@npm:^1.2.1":
- version: 1.2.1
- resolution: "esrap@npm:1.2.1"
+"esrap@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "esrap@npm:1.2.2"
dependencies:
"@jridgewell/sourcemap-codec": "npm:^1.4.15"
"@types/estree": "npm:^1.0.1"
- checksum: 10c0/28d6e36adcf4342a844a938a736132269c33e9db6bbefc98c6af5ed06c14899afcc85391e7ce4824ce5066877fa10b0ed5c5007592cbc58012be95f13c66467f
+ checksum: 10c0/a3a0b665c034f604a162b910346309c64c42635c5d2e8704a27afcdf4e6d4c529e05475d1875d6b3e0d550f8470986116414097230ab3a7c565b85091ca5e177
languageName: node
linkType: hard
@@ -15104,7 +15071,7 @@ __metadata:
languageName: node
linkType: hard
-"fast-glob@npm:3.3.2, fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.7, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2":
+"fast-glob@npm:3.3.2, fast-glob@npm:^3.0.3, fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.2, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.1, fast-glob@npm:^3.3.2":
version: 3.3.2
resolution: "fast-glob@npm:3.3.2"
dependencies:
@@ -15212,6 +15179,18 @@ __metadata:
languageName: node
linkType: hard
+"fdir@npm:^6.2.0":
+ version: 6.4.2
+ resolution: "fdir@npm:6.4.2"
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+ checksum: 10c0/34829886f34a3ca4170eca7c7180ec4de51a3abb4d380344063c0ae2e289b11d2ba8b724afee974598c83027fea363ff598caf2b51bc4e6b1e0d8b80cc530573
+ languageName: node
+ linkType: hard
+
"fetch-retry@npm:^6.0.0":
version: 6.0.0
resolution: "fetch-retry@npm:6.0.0"
@@ -15988,7 +15967,7 @@ __metadata:
languageName: node
linkType: hard
-"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2":
+"get-func-name@npm:^2.0.1":
version: 2.0.2
resolution: "get-func-name@npm:2.0.2"
checksum: 10c0/89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df
@@ -19255,15 +19234,6 @@ __metadata:
languageName: node
linkType: hard
-"loupe@npm:^2.3.6":
- version: 2.3.7
- resolution: "loupe@npm:2.3.7"
- dependencies:
- get-func-name: "npm:^2.0.1"
- checksum: 10c0/71a781c8fc21527b99ed1062043f1f2bb30bdaf54fa4cf92463427e1718bc6567af2988300bc243c1f276e4f0876f29e3cbf7b58106fdc186915687456ce5bf4
- languageName: node
- linkType: hard
-
"loupe@npm:^3.1.0, loupe@npm:^3.1.1":
version: 3.1.1
resolution: "loupe@npm:3.1.1"
@@ -22519,13 +22489,6 @@ __metadata:
languageName: node
linkType: hard
-"pathval@npm:^1.1.1":
- version: 1.1.1
- resolution: "pathval@npm:1.1.1"
- checksum: 10c0/f63e1bc1b33593cdf094ed6ff5c49c1c0dc5dc20a646ca9725cc7fe7cd9995002d51d5685b9b2ec6814342935748b711bafa840f84c0bb04e38ff40a335c94dc
- languageName: node
- linkType: hard
-
"pathval@npm:^2.0.0":
version: 2.0.0
resolution: "pathval@npm:2.0.0"
@@ -24104,6 +24067,13 @@ __metadata:
languageName: node
linkType: hard
+"readdirp@npm:^4.0.1":
+ version: 4.0.2
+ resolution: "readdirp@npm:4.0.2"
+ checksum: 10c0/a16ecd8ef3286dcd90648c3b103e3826db2b766cdb4a988752c43a83f683d01c7059158d623cbcd8bdfb39e65d302d285be2d208e7d9f34d022d912b929217dd
+ languageName: node
+ linkType: hard
+
"readdirp@npm:~3.6.0":
version: 3.6.0
resolution: "readdirp@npm:3.6.0"
@@ -26612,23 +26582,21 @@ __metadata:
languageName: node
linkType: hard
-"svelte-check@npm:^3.6.4":
- version: 3.6.4
- resolution: "svelte-check@npm:3.6.4"
+"svelte-check@npm:^4.0.5":
+ version: 4.0.5
+ resolution: "svelte-check@npm:4.0.5"
dependencies:
- "@jridgewell/trace-mapping": "npm:^0.3.17"
- chokidar: "npm:^3.4.1"
- fast-glob: "npm:^3.2.7"
- import-fresh: "npm:^3.2.1"
+ "@jridgewell/trace-mapping": "npm:^0.3.25"
+ chokidar: "npm:^4.0.1"
+ fdir: "npm:^6.2.0"
picocolors: "npm:^1.0.0"
sade: "npm:^1.7.4"
- svelte-preprocess: "npm:^5.1.0"
- typescript: "npm:^5.0.3"
peerDependencies:
- svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ typescript: ">=5.0.0"
bin:
svelte-check: bin/svelte-check
- checksum: 10c0/acbcc04c8c6ab7baee7ccf36ca134dcabe49fae103aa92661e7f80e01216623363fb794fec9a3f794f7003d55629373567ff485925dc33272f48cea63e7b2452
+ checksum: 10c0/192ee83f83169408b5f0b819440349f53e256db868d59fdd2422e831ef581891f5f257632dd3e632b12518ca307e1f99ff97455f56c19c3d2a5ee7be6391a181
languageName: node
linkType: hard
@@ -26670,7 +26638,7 @@ __metadata:
languageName: node
linkType: hard
-"svelte-preprocess@npm:^5.1.0, svelte-preprocess@npm:^5.1.1":
+"svelte-preprocess@npm:^5.1.1":
version: 5.1.1
resolution: "svelte-preprocess@npm:5.1.1"
dependencies:
@@ -26737,24 +26705,24 @@ __metadata:
languageName: node
linkType: hard
-"svelte@npm:^5.0.0-next.65":
- version: 5.0.0-next.65
- resolution: "svelte@npm:5.0.0-next.65"
+"svelte@npm:^5.0.0-next.268":
+ version: 5.0.0-next.268
+ resolution: "svelte@npm:5.0.0-next.268"
dependencies:
- "@ampproject/remapping": "npm:^2.2.1"
- "@jridgewell/sourcemap-codec": "npm:^1.4.15"
+ "@ampproject/remapping": "npm:^2.3.0"
+ "@jridgewell/sourcemap-codec": "npm:^1.5.0"
"@types/estree": "npm:^1.0.5"
- acorn: "npm:^8.11.3"
+ acorn: "npm:^8.12.1"
acorn-typescript: "npm:^1.4.13"
- aria-query: "npm:^5.3.0"
- axobject-query: "npm:^4.0.0"
+ aria-query: "npm:^5.3.1"
+ axobject-query: "npm:^4.1.0"
esm-env: "npm:^1.0.0"
- esrap: "npm:^1.2.1"
+ esrap: "npm:^1.2.2"
is-reference: "npm:^3.0.2"
locate-character: "npm:^3.0.0"
- magic-string: "npm:^0.30.5"
+ magic-string: "npm:^0.30.11"
zimmerframe: "npm:^1.1.2"
- checksum: 10c0/6a686847f887d2871eabce4888916cba6aec5bae924a76fd01f4098db1c0053d4e5d6434070d0a048eac75eaddd4fd40e3fae625a0253464f7baa6b0f147f209
+ checksum: 10c0/74a954cffe2a70259a1d1d2a834e9615d3f393429ac8cc1e15bfdc66b8bbe5dc449a8289370631b29023bca51aa451d1906f570b3761de4c235ea731913ee1b2
languageName: node
linkType: hard
@@ -27442,13 +27410,6 @@ __metadata:
languageName: node
linkType: hard
-"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0":
- version: 4.1.0
- resolution: "type-detect@npm:4.1.0"
- checksum: 10c0/df8157ca3f5d311edc22885abc134e18ff8ffbc93d6a9848af5b682730ca6a5a44499259750197250479c5331a8a75b5537529df5ec410622041650a7f293e2a
- languageName: node
- linkType: hard
-
"type-fest@npm:~2.19":
version: 2.19.0
resolution: "type-fest@npm:2.19.0"
@@ -27542,7 +27503,7 @@ __metadata:
languageName: node
linkType: hard
-"typescript@npm:^5.0.3, typescript@npm:^5.3.2, typescript@npm:^5.4.3":
+"typescript@npm:^5.3.2, typescript@npm:^5.4.3":
version: 5.4.3
resolution: "typescript@npm:5.4.3"
bin:
@@ -27572,7 +27533,7 @@ __metadata:
languageName: node
linkType: hard
-"typescript@patch:typescript@npm%3A^5.0.3#optional!builtin, typescript@patch:typescript@npm%3A^5.3.2#optional!builtin, typescript@patch:typescript@npm%3A^5.4.3#optional!builtin":
+"typescript@patch:typescript@npm%3A^5.3.2#optional!builtin, typescript@patch:typescript@npm%3A^5.4.3#optional!builtin":
version: 5.4.3
resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c"
bin:
diff --git a/docs/_assets/writing-stories/custom-tag-filter.png b/docs/_assets/writing-stories/custom-tag-filter.png
new file mode 100644
index 000000000000..3579f994da12
Binary files /dev/null and b/docs/_assets/writing-stories/custom-tag-filter.png differ
diff --git a/docs/versions/next.json b/docs/versions/next.json
index b7cf99de3ecf..5419ab744ce7 100644
--- a/docs/versions/next.json
+++ b/docs/versions/next.json
@@ -1 +1 @@
-{"version":"8.4.0-alpha.7","info":{"plain":"- CLI: Install Svelte CSF v5 in Svelte5 projects - [#29323](https://github.com/storybookjs/storybook/pull/29323), thanks @shilman!\n- Manager: Add tags property to ComponentEntry objects - [#29343](https://github.com/storybookjs/storybook/pull/29343), thanks @Sidnioulz!"}}
+{"version":"8.4.0-alpha.8","info":{"plain":"- Addon-Test: Support for `@vitest/browser` v2.1.2 - [#29407](https://github.com/storybookjs/storybook/pull/29407), thanks @strozw!\n- ConfigFile: Fix `export { X }` parsing - [#29344](https://github.com/storybookjs/storybook/pull/29344), thanks @vctqs1!\n- Core: Fix building Storybook deleting project root files - [#29371](https://github.com/storybookjs/storybook/pull/29371), thanks @JReinhold!\n- Interactions: Escape xml of interactions errors - [#29414](https://github.com/storybookjs/storybook/pull/29414), thanks @kasperpeulen!\n- Svelte: Add v5 stories to CLI templates - [#29382](https://github.com/storybookjs/storybook/pull/29382), thanks @JReinhold!\n- Test: Remove unused `util` dependency - [#29310](https://github.com/storybookjs/storybook/pull/29310), thanks @JReinhold!\n- UI: Fix RefIndicator to use CheckIcon instead of string - [#29209](https://github.com/storybookjs/storybook/pull/29209), thanks @JSMike!\n- UI: Simple tag filtering - [#29333](https://github.com/storybookjs/storybook/pull/29333), thanks @shilman!"}}
diff --git a/docs/writing-stories/tags.mdx b/docs/writing-stories/tags.mdx
index 25459a84ba59..350e168c532d 100644
--- a/docs/writing-stories/tags.mdx
+++ b/docs/writing-stories/tags.mdx
@@ -51,6 +51,21 @@ To remove a tag from a story, prefix it with `!`. For example:
Tags can be removed for all stories in your project (in `.storybook/preview.js|ts`), all stories for a component (in the CSF file meta), or a single story (as above).
+## Filtering by custom tags
+
+Custom tags enable a flexible layer of categorization on top of Storybook's sidebar hierarchy. In the example above, we created an `experimental` tag to indicate that a story is not yet stable.
+
+You can create custom tags for any purpose. Sample uses might include:
+- Status, such as `experimental`, `new`, `stable`, or `deprecated`
+- User persona, such as `admin`, `user`, or `developer`
+- Component/code ownership
+
+Custom tags are useful because they show up as filters in Storybook's sidebar. Selecting a tag in the filter causes the sidebar to only show stories with that tag. Selecting multiple tags shows stories that contain any of those tags.
+
+![Filtering by custom tag](../_assets/writing-stories/custom-tag-filter.png)
+
+Filtering by tags is a powerful way to focus on a subset of stories, especially in large Storybook projects. You can also narrow your stories by tag and then search within that subset.
+
## Recipes
### Docs-only stories