From 64fd01fa320ca6c41076afd04d095686c39b448a Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Thu, 30 Oct 2025 20:32:13 +0000 Subject: [PATCH 1/9] Update ./docs/versions/next.json for v10.1.0-alpha.1 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index bbd723827814..7d2cb706553c 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.1.0-alpha.0","info":{"plain":""}} \ No newline at end of file +{"version":"10.1.0-alpha.1","info":{"plain":"- CLI: Fix glob string formatting in csf-factories codemod - [#32880](https://github.com/storybookjs/storybook/pull/32880), thanks @yannbf!\n- Core: Improve file path resolution on Windows - [#32893](https://github.com/storybookjs/storybook/pull/32893), thanks @yannbf!\n- Presets: Fix incorrect imports - [#32875](https://github.com/storybookjs/storybook/pull/32875), thanks @ndelangen!\n- Vite: Update `optimizeViteDeps` for addon-docs and addon-vitest - [#32881](https://github.com/storybookjs/storybook/pull/32881), thanks @ndelangen!"}} \ No newline at end of file From a916eb916d3eda677afe2e867f678642b1dcfb71 Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 31 Oct 2025 08:29:40 +0000 Subject: [PATCH 2/9] Update ./docs/versions/next.json for v10.1.0-alpha.2 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index 7d2cb706553c..55e36f03e63a 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.1.0-alpha.1","info":{"plain":"- CLI: Fix glob string formatting in csf-factories codemod - [#32880](https://github.com/storybookjs/storybook/pull/32880), thanks @yannbf!\n- Core: Improve file path resolution on Windows - [#32893](https://github.com/storybookjs/storybook/pull/32893), thanks @yannbf!\n- Presets: Fix incorrect imports - [#32875](https://github.com/storybookjs/storybook/pull/32875), thanks @ndelangen!\n- Vite: Update `optimizeViteDeps` for addon-docs and addon-vitest - [#32881](https://github.com/storybookjs/storybook/pull/32881), thanks @ndelangen!"}} \ No newline at end of file +{"version":"10.1.0-alpha.2","info":{"plain":"- Core: 10.1 features WIP - [#32810](https://github.com/storybookjs/storybook/pull/32810), thanks @JReinhold!"}} \ No newline at end of file From eb9fa3c6d566ca1fd100a600bcd58a2426b4d97f Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:08:13 +0000 Subject: [PATCH 3/9] Update ./docs/versions/next.json for v10.1.0-alpha.3 --- docs/versions/next.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/versions/next.json b/docs/versions/next.json index 55e36f03e63a..689ef2978a92 100644 --- a/docs/versions/next.json +++ b/docs/versions/next.json @@ -1 +1 @@ -{"version":"10.1.0-alpha.2","info":{"plain":"- Core: 10.1 features WIP - [#32810](https://github.com/storybookjs/storybook/pull/32810), thanks @JReinhold!"}} \ No newline at end of file +{"version":"10.1.0-alpha.3","info":{"plain":"- React: Add manifests/components.html page - [#32905](https://github.com/storybookjs/storybook/pull/32905), thanks @kasperpeulen!"}} \ No newline at end of file From b0042c341bb995061cb68c65e53087bafcd487e5 Mon Sep 17 00:00:00 2001 From: jonniebigodes Date: Thu, 30 Oct 2025 15:50:59 +0000 Subject: [PATCH 4/9] Merge pull request #32896 from storybookjs/valentin/fix-vitest-documentation Docs: Fix Vitest option instructions (cherry picked from commit b0790457a29f32d808a0e8544ea2470b8c56a064) --- docs/_snippets/vitest-plugin-vitest-config.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/_snippets/vitest-plugin-vitest-config.md b/docs/_snippets/vitest-plugin-vitest-config.md index 134dd068cb7c..7dfedbbb76c2 100644 --- a/docs/_snippets/vitest-plugin-vitest-config.md +++ b/docs/_snippets/vitest-plugin-vitest-config.md @@ -18,7 +18,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -66,7 +65,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -115,7 +113,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -163,7 +160,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -212,7 +208,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -260,7 +255,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -309,7 +303,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts @@ -357,7 +350,6 @@ export default mergeConfig( // Use `workspace` field in Vitest < 3.2 projects: [ defineProject({ - extends: true, plugins: [ storybookTest({ // The location of your Storybook config, main.js|ts From e1dbacf058c5a216c06535f1ae2cf21761467d1a Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Fri, 31 Oct 2025 05:02:55 -0700 Subject: [PATCH 5/9] Merge pull request #32909 from storybookjs/norbert/remove-reference-to-removed-framework ESlint: Update `@storybook/experimental-nextjs-vite` in `no-renderer-packages` rule (cherry picked from commit 07ec72d46e61605483fbd5e65bda23f691932622) --- code/lib/eslint-plugin/src/rules/no-renderer-packages.test.ts | 2 +- code/lib/eslint-plugin/src/rules/no-renderer-packages.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/lib/eslint-plugin/src/rules/no-renderer-packages.test.ts b/code/lib/eslint-plugin/src/rules/no-renderer-packages.test.ts index 1c2c0cd731ad..246e15494b93 100644 --- a/code/lib/eslint-plugin/src/rules/no-renderer-packages.test.ts +++ b/code/lib/eslint-plugin/src/rules/no-renderer-packages.test.ts @@ -65,7 +65,7 @@ ruleTester.run('no-renderer-packages', rule, { data: { rendererPackage: '@storybook/react', suggestions: - '@storybook/nextjs, @storybook/react-vite, @storybook/react-webpack5, @storybook/react-native-web-vite, @storybook/experimental-nextjs-vite', + '@storybook/nextjs, @storybook/react-vite, @storybook/nextjs-vite, @storybook/react-webpack5, @storybook/react-native-web-vite', }, type: AST_NODE_TYPES.ImportDeclaration, }, diff --git a/code/lib/eslint-plugin/src/rules/no-renderer-packages.ts b/code/lib/eslint-plugin/src/rules/no-renderer-packages.ts index 8bd1767a69ac..c9923de261cf 100644 --- a/code/lib/eslint-plugin/src/rules/no-renderer-packages.ts +++ b/code/lib/eslint-plugin/src/rules/no-renderer-packages.ts @@ -22,9 +22,9 @@ const rendererToFrameworks: Record = { '@storybook/react': [ '@storybook/nextjs', '@storybook/react-vite', + '@storybook/nextjs-vite', '@storybook/react-webpack5', '@storybook/react-native-web-vite', - '@storybook/experimental-nextjs-vite', ], '@storybook/server': ['@storybook/server-webpack5'], '@storybook/svelte': [ From 15990bdb458ae4a8eaa84c1ab585f5e04a594946 Mon Sep 17 00:00:00 2001 From: Yann Braga Date: Sat, 1 Nov 2025 10:33:50 +0100 Subject: [PATCH 6/9] Merge pull request #32891 from storybookjs/yann/config-file-type-syntax-support Core: Better handling for TypeScript satisfies/as syntaxes (cherry picked from commit 853c491abbf6c00fd63037ff3ffd18dbcb61aa39) --- code/core/src/csf-tools/ConfigFile.test.ts | 29 ++++++++ code/core/src/csf-tools/ConfigFile.ts | 72 ++++++++----------- .../helpers/config-to-csf-factory.test.ts | 30 ++++++++ .../codemod/helpers/config-to-csf-factory.ts | 7 +- 4 files changed, 94 insertions(+), 44 deletions(-) diff --git a/code/core/src/csf-tools/ConfigFile.test.ts b/code/core/src/csf-tools/ConfigFile.test.ts index 1576d7eb2b0f..f702579aeecd 100644 --- a/code/core/src/csf-tools/ConfigFile.test.ts +++ b/code/core/src/csf-tools/ConfigFile.test.ts @@ -99,6 +99,17 @@ describe('ConfigFile', () => { ) ).toEqual('webpack5'); }); + it('resolves values through various TS satisfies/as syntaxes', () => { + const syntaxes = [ + 'const coreVar = { builder: "webpack5" } as const; export const core = coreVar satisfies any;', + 'const coreVar = { builder: "webpack5" } as const; export const core = coreVar as any;', + 'const coreVar = { builder: "webpack5" } as const satisfies Record; export { coreVar as core };', + ]; + + for (const source of syntaxes) { + expect(getField(['core', 'builder'], source)).toEqual('webpack5'); + } + }); }); describe('module exports', () => { @@ -1877,5 +1888,23 @@ describe('ConfigFile', () => { expect(Object.keys(config._exportDecls)).toHaveLength(3); }); + + it('detects exports object on various TS satisfies/as export syntaxes', () => { + const syntaxes = [ + 'const config = { framework: "foo" }; export default config;', + 'const config = { framework: "foo" }; export default config satisfies StorybookConfig;', + 'const config = { framework: "foo" }; export default config as StorybookConfig;', + 'const config = { framework: "foo" }; export default config as unknown as StorybookConfig;', + 'export default { framework: "foo" };', + 'export default { framework: "foo" } satisfies StorybookConfig;', + 'export default { framework: "foo" } as StorybookConfig;', + 'export default { framework: "foo" } as unknown as StorybookConfig;', + ]; + for (const source of syntaxes) { + const config = loadConfig(source).parse(); + expect(config._exportsObject?.type).toBe('ObjectExpression'); + expect(config._exportsObject?.properties).toHaveLength(1); + } + }); }); }); diff --git a/code/core/src/csf-tools/ConfigFile.ts b/code/core/src/csf-tools/ConfigFile.ts index 70fc45d17f37..91e2e3d5c402 100644 --- a/code/core/src/csf-tools/ConfigFile.ts +++ b/code/core/src/csf-tools/ConfigFile.ts @@ -39,13 +39,6 @@ const propKey = (p: t.ObjectProperty) => { return null; }; -const unwrap = (node: t.Node | undefined | null): any => { - if (t.isTSAsExpression(node) || t.isTSSatisfiesExpression(node)) { - return unwrap(node.expression); - } - return node; -}; - const _getPath = (path: string[], node: t.Node): t.Node | undefined => { if (path.length === 0) { return node; @@ -175,15 +168,33 @@ export class ConfigFile { (exportsObject.properties as t.ObjectProperty[]).forEach((p) => { const exportName = propKey(p); if (exportName) { - let exportVal = p.value; - if (t.isIdentifier(exportVal)) { - exportVal = _findVarInitialization(exportVal.name, this._ast.program) as any; - } + const exportVal = this._resolveDeclaration(p.value as t.Node); this._exports[exportName] = exportVal as t.Expression; } }); } + /** Unwraps TS assertions/satisfies from a node, to get the underlying node. */ + _unwrap = (node: t.Node | undefined | null): any => { + if (t.isTSAsExpression(node) || t.isTSSatisfiesExpression(node)) { + return this._unwrap(node.expression); + } + return node; + }; + + /** + * Resolve a declaration node by unwrapping TS assertions/satisfies and following identifiers to + * resolve the correct node in case it's an identifier. + */ + _resolveDeclaration = (node: t.Node, parent: t.Node = this._ast.program) => { + const decl = this._unwrap(node); + if (t.isIdentifier(decl) && t.isProgram(parent)) { + const initialization = _findVarInitialization(decl.name, parent); + return initialization ? this._unwrap(initialization) : decl; + } + return decl; + }; + parse() { // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this; @@ -191,12 +202,7 @@ export class ConfigFile { ExportDefaultDeclaration: { enter({ node, parent }) { self.hasDefaultExport = true; - let decl = - t.isIdentifier(node.declaration) && t.isProgram(parent) - ? _findVarInitialization(node.declaration.name, parent) - : node.declaration; - - decl = unwrap(decl); + let decl = self._resolveDeclaration(node.declaration as t.Node, parent); // csf factory if (t.isCallExpression(decl) && t.isObjectExpression(decl.arguments[0])) { @@ -223,10 +229,7 @@ export class ConfigFile { node.declaration.declarations.forEach((decl) => { if (t.isVariableDeclarator(decl) && t.isIdentifier(decl.id)) { const { name: exportName } = decl.id; - let exportVal = decl.init as t.Expression; - if (t.isIdentifier(exportVal)) { - exportVal = _findVarInitialization(exportVal.name, parent as t.Program) as any; - } + const exportVal = self._resolveDeclaration(decl.init as t.Node, parent); self._exports[exportName] = exportVal; self._exportDecls[exportName] = decl; } @@ -252,7 +255,7 @@ export class ConfigFile { const decl = _findVarDeclarator(localName, parent as t.Program) as any; // decl can be empty in case X from `import { X } from ....` because it is not handled in _findVarDeclarator if (decl) { - self._exports[exportName] = decl.init; + self._exports[exportName] = self._resolveDeclaration(decl.init, parent); self._exportDecls[exportName] = decl; } } @@ -280,24 +283,14 @@ export class ConfigFile { left.property.name === 'exports' ) { let exportObject = right; - if (t.isIdentifier(right)) { - exportObject = _findVarInitialization(right.name, parent as t.Program) as any; - } - - exportObject = unwrap(exportObject); + exportObject = self._resolveDeclaration(exportObject as t.Node, parent); if (t.isObjectExpression(exportObject)) { self._exportsObject = exportObject; (exportObject.properties as t.ObjectProperty[]).forEach((p) => { const exportName = propKey(p); if (exportName) { - let exportVal = p.value as t.Expression; - if (t.isIdentifier(exportVal)) { - exportVal = _findVarInitialization( - exportVal.name, - parent as t.Program - ) as any; - } + const exportVal = self._resolveDeclaration(p.value as t.Node, parent); self._exports[exportName] = exportVal as t.Expression; } }); @@ -564,14 +557,9 @@ export class ConfigFile { } // default export if (t.isExportDefaultDeclaration(node)) { - let decl: t.Expression | undefined | null = node.declaration as t.Expression; - if (t.isIdentifier(decl)) { - decl = _findVarInitialization(decl.name, this._ast.program); - } - - decl = unwrap(decl); - if (t.isObjectExpression(decl)) { - const properties = decl.properties as t.ObjectProperty[]; + const resolved = this._resolveDeclaration(node.declaration as t.Node); + if (t.isObjectExpression(resolved)) { + const properties = resolved.properties as t.ObjectProperty[]; removeProperty(properties, path[0]); removedRootProperty = true; } diff --git a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts index d7aeba97d34b..48aa77ccff9b 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.test.ts @@ -58,6 +58,36 @@ describe('main/preview codemod: general parsing functionality', () => { }); `); }); + it('should wrap defineMain call from const declared default export with different type annotations', async () => { + const typedVariants = [ + 'export default config;', + 'export default config satisfies StorybookConfig;', + 'export default config as StorybookConfig;', + 'export default config as unknown as StorybookConfig;', + ]; + + for (const variant of typedVariants) { + await expect( + transform(dedent` + const config = { + stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-essentials'], + framework: '@storybook/react-vite', + }; + + ${variant} + `) + ).resolves.toMatchInlineSnapshot(` + import { defineMain } from '@storybook/react-vite/node'; + + export default defineMain({ + stories: ['../src/**/*.stories.@(js|jsx|ts|tsx)'], + addons: ['@storybook/addon-essentials'], + framework: '@storybook/react-vite', + }); + `); + } + }); it('should wrap defineMain call from const declared default export and default export mix', async () => { await expect( diff --git a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts index c49d802979cb..42b6c1787e51 100644 --- a/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts +++ b/code/lib/cli-storybook/src/codemod/helpers/config-to-csf-factory.ts @@ -119,8 +119,11 @@ export async function configToCsfFactory( programNode.body.forEach((node) => { // Detect Syntax 1 - if (t.isExportDefaultDeclaration(node) && t.isIdentifier(node.declaration)) { - const declarationName = node.declaration.name; + const declaration = + t.isExportDefaultDeclaration(node) && config._unwrap(node.declaration as t.Node); + + if (t.isExportDefaultDeclaration(node) && t.isIdentifier(declaration)) { + const declarationName = declaration.name; declarationNodeIndex = findDeclarationNodeIndex(declarationName); From 28a6b416c588919a02fd41414be7069a2bce5b00 Mon Sep 17 00:00:00 2001 From: Michael Shilman Date: Sun, 2 Nov 2025 09:15:47 +0800 Subject: [PATCH 7/9] Merge pull request #32919 from dannyhw/dannyhw/fix/rn-withstorybook-change React Native: Update withStorybook setup instructions (cherry picked from commit 03cae6b14feabbf02b3e2eea7052a91939ca619f) --- code/lib/create-storybook/src/initiate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/lib/create-storybook/src/initiate.ts b/code/lib/create-storybook/src/initiate.ts index 3e16e26845f9..eed6de8e1b7e 100644 --- a/code/lib/create-storybook/src/initiate.ts +++ b/code/lib/create-storybook/src/initiate.ts @@ -700,7 +700,7 @@ export async function doInitiate(options: CommandOptions): Promise< 2. Wrap your metro config with the withStorybook enhancer function like this: - ${picocolors.inverse(' ' + "const withStorybook = require('@storybook/react-native/metro/withStorybook');" + ' ')} + ${picocolors.inverse(' ' + "const { withStorybook } = require('@storybook/react-native/metro/withStorybook');" + ' ')} ${picocolors.inverse(' ' + 'module.exports = withStorybook(defaultConfig);' + ' ')} For more details go to: From 07936afe7dbba5430cde56405d5eccd5fcc23bfb Mon Sep 17 00:00:00 2001 From: Norbert de Langen Date: Mon, 3 Nov 2025 04:22:47 -0800 Subject: [PATCH 8/9] Merge pull request #32928 from storybookjs/yann/fix-pnp-issue Core: Fix wrong import to fix Yarn PnP support (cherry picked from commit aa416582066b9b56efd899fab86b03cad67dba5c) --- code/core/src/component-testing/components/StatusBadge.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/core/src/component-testing/components/StatusBadge.tsx b/code/core/src/component-testing/components/StatusBadge.tsx index 23a3b26d13a1..7206e7385cc3 100644 --- a/code/core/src/component-testing/components/StatusBadge.tsx +++ b/code/core/src/component-testing/components/StatusBadge.tsx @@ -1,8 +1,8 @@ import React from 'react'; -import { type Color, styled, typography } from 'storybook/theming'; +import { TooltipNote, WithTooltip } from 'storybook/internal/components'; -import { TooltipNote, WithTooltip } from '../../components'; +import { type Color, styled, typography } from 'storybook/theming'; export type PlayStatus = 'rendering' | 'playing' | 'completed' | 'errored' | 'aborted'; From f460470fc319dc7b0efebef9d90a4cbbe9c289ef Mon Sep 17 00:00:00 2001 From: storybook-bot <32066757+storybook-bot@users.noreply.github.com> Date: Mon, 3 Nov 2025 12:25:01 +0000 Subject: [PATCH 9/9] Write changelog for 10.0.3 [skip ci] --- CHANGELOG.md | 7 +++++++ code/package.json | 3 ++- docs/versions/latest.json | 7 +------ 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64305104bdab..aea0e6d2220d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 10.0.3 + +- Core: Better handling for TypeScript satisfies/as syntaxes - [#32891](https://github.com/storybookjs/storybook/pull/32891), thanks @yannbf! +- Core: Fix wrong import to fix Yarn PnP support - [#32928](https://github.com/storybookjs/storybook/pull/32928), thanks @yannbf! +- ESlint: Update `@storybook/experimental-nextjs-vite` in `no-renderer-packages` rule - [#32909](https://github.com/storybookjs/storybook/pull/32909), thanks @ndelangen! +- React Native: Update withStorybook setup instructions - [#32919](https://github.com/storybookjs/storybook/pull/32919), thanks @dannyhw! + ## 10.0.2 - CLI: Fix glob string formatting in csf-factories codemod - [#32880](https://github.com/storybookjs/storybook/pull/32880), thanks @yannbf! diff --git a/code/package.json b/code/package.json index 071ebd95d457..779625b8fa21 100644 --- a/code/package.json +++ b/code/package.json @@ -283,5 +283,6 @@ "Dependency Upgrades" ] ] - } + }, + "deferredNextVersion": "10.0.3" } diff --git a/docs/versions/latest.json b/docs/versions/latest.json index 9c6e2a4a683d..b073782869d2 100644 --- a/docs/versions/latest.json +++ b/docs/versions/latest.json @@ -1,6 +1 @@ -{ - "version": "10.0.2", - "info": { - "plain": "- CLI: Fix glob string formatting in csf-factories codemod - [#32880](https://github.com/storybookjs/storybook/pull/32880), thanks @yannbf!\n- Core: Improve file path resolution on Windows - [#32893](https://github.com/storybookjs/storybook/pull/32893), thanks @yannbf!\n- Vite: Update `optimizeViteDeps` for addon-docs and addon-vitest - [#32881](https://github.com/storybookjs/storybook/pull/32881), thanks @ndelangen!" - } -} +{"version":"10.0.3","info":{"plain":"- Core: Better handling for TypeScript satisfies/as syntaxes - [#32891](https://github.com/storybookjs/storybook/pull/32891), thanks @yannbf!\n- Core: Fix wrong import to fix Yarn PnP support - [#32928](https://github.com/storybookjs/storybook/pull/32928), thanks @yannbf!\n- ESlint: Update `@storybook/experimental-nextjs-vite` in `no-renderer-packages` rule - [#32909](https://github.com/storybookjs/storybook/pull/32909), thanks @ndelangen!\n- React Native: Update withStorybook setup instructions - [#32919](https://github.com/storybookjs/storybook/pull/32919), thanks @dannyhw!"}} \ No newline at end of file