From 6e99fc3add663b4d66bb47db7790bfc0859c2631 Mon Sep 17 00:00:00 2001 From: eunhee <6810779s@naver.com> Date: Tue, 10 Mar 2026 11:35:04 +0900 Subject: [PATCH 1/7] feat(addon-docs): add Reset story button to re-render stories in docs --- code/addons/docs/src/blocks/blocks/Canvas.tsx | 12 ++++++++++-- code/addons/docs/src/blocks/blocks/Story.tsx | 3 +++ .../docs/src/blocks/components/Preview.tsx | 16 ++++++++++++++-- code/addons/docs/src/blocks/components/Story.tsx | 5 +++-- 4 files changed, 30 insertions(+), 6 deletions(-) diff --git a/code/addons/docs/src/blocks/blocks/Canvas.tsx b/code/addons/docs/src/blocks/blocks/Canvas.tsx index ff4d131d63a0..29d30f2bde27 100644 --- a/code/addons/docs/src/blocks/blocks/Canvas.tsx +++ b/code/addons/docs/src/blocks/blocks/Canvas.tsx @@ -1,7 +1,8 @@ /* eslint-disable react/destructuring-assignment */ -import React, { useContext } from 'react'; +import React, { useCallback, useContext, useState } from 'react'; import type { FC } from 'react'; +import { RESET_STORY_ARGS } from 'storybook/internal/core-events'; import type { ModuleExport, ModuleExports } from 'storybook/internal/types'; import type { Layout, PreviewProps as PurePreviewProps } from '../components'; @@ -81,6 +82,12 @@ export const Canvas: FC = (props) => { // By default, stories will be iframed, but most frameworks support inline rendering and override that in a docs entry file const inline = props.story?.inline ?? story.parameters?.docs?.story?.inline ?? false; + const [resetKey, setResetKey] = useState(0); + const handleResetStory = useCallback(() => { + docsContext.channel.emit(RESET_STORY_ARGS, { storyId: story.id }); + setResetKey((prev) => prev + 1); + }, [docsContext.channel, story.id]); + return ( = (props) => { className={className} layout={layout} inline={inline} + onResetStory={inline ? handleResetStory : undefined} > - + ); }; diff --git a/code/addons/docs/src/blocks/blocks/Story.tsx b/code/addons/docs/src/blocks/blocks/Story.tsx index f9feca6d1311..b0d12d8b95fb 100644 --- a/code/addons/docs/src/blocks/blocks/Story.tsx +++ b/code/addons/docs/src/blocks/blocks/Story.tsx @@ -54,6 +54,8 @@ type StoryParameters = { __forceInitialArgs?: boolean; /** Internal prop if this story is the primary story */ __primary?: boolean; + /** Key to trigger story remount when changed */ + resetKey?: number; }; export type StoryProps = StoryRefProps & StoryParameters; @@ -100,6 +102,7 @@ export const getStoryProps = ( forceInitialArgs: !!props.__forceInitialArgs, primary: !!props.__primary, renderStoryToElement: context.renderStoryToElement as any, + resetKey: props.resetKey, }; } diff --git a/code/addons/docs/src/blocks/components/Preview.tsx b/code/addons/docs/src/blocks/components/Preview.tsx index ceb904044056..77c426aeeba5 100644 --- a/code/addons/docs/src/blocks/components/Preview.tsx +++ b/code/addons/docs/src/blocks/components/Preview.tsx @@ -5,7 +5,7 @@ import { logger } from 'storybook/internal/client-logger'; import { Bar, Button, ToggleButton, Zoom } from 'storybook/internal/components'; import type { ActionItem } from 'storybook/internal/components'; -import { CopyIcon, MarkupIcon } from '@storybook/icons'; +import { CopyIcon, MarkupIcon, UndoIcon } from '@storybook/icons'; import { useId } from '@react-aria/utils'; import { darken } from 'polished'; @@ -31,6 +31,7 @@ export type PreviewProps = PropsWithChildren<{ withToolbar?: boolean; className?: string; additionalActions?: ActionItem[]; + onResetStory?: () => void; }>; export type Layout = 'padded' | 'fullscreen' | 'centered'; @@ -150,6 +151,7 @@ export const Preview: FC = ({ className, layout = 'padded', inline = false, + onResetStory, ...props }) => { const [expanded, setExpanded] = useState(isExpanded); @@ -225,7 +227,7 @@ export const Preview: FC = ({ )} - {(withSource || additionalActionItems.length > 0) && ( + {(withSource || onResetStory || additionalActionItems.length > 0) && ( {hasSourceError && ( )} + {onResetStory && ( + + )} {additionalActionItems.map(({ title, className, onClick, disabled }, index: number) => ( )} - {onResetStory && ( + {onReloadStory && ( )} {additionalActionItems.map(({ title, className, onClick, disabled }, index: number) => ( From b26eb7603cafe6bfe90332100dd8b2ca6ec68f72 Mon Sep 17 00:00:00 2001 From: eunhee <6810779s@naver.com> Date: Wed, 11 Mar 2026 20:36:56 +0900 Subject: [PATCH 4/7] fix: address review - match remount.tsx button pattern --- code/addons/docs/src/blocks/components/Preview.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/addons/docs/src/blocks/components/Preview.tsx b/code/addons/docs/src/blocks/components/Preview.tsx index 598a9962bb94..0069145781c0 100644 --- a/code/addons/docs/src/blocks/components/Preview.tsx +++ b/code/addons/docs/src/blocks/components/Preview.tsx @@ -259,12 +259,13 @@ export const Preview: FC = ({ )} {onReloadStory && ( )} {additionalActionItems.map(({ title, className, onClick, disabled }, index: number) => ( From b82d98e800fb2774b87a1ea7ac5914e46e889dc1 Mon Sep 17 00:00:00 2001 From: eunhee <6810779s@naver.com> Date: Fri, 13 Mar 2026 23:22:45 +0900 Subject: [PATCH 5/7] fix: move reload button to canvas toolbar to match story mode position --- .../docs/src/blocks/components/Preview.tsx | 20 ++++--------- .../docs/src/blocks/components/Toolbar.tsx | 28 +++++++++++++++++-- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/code/addons/docs/src/blocks/components/Preview.tsx b/code/addons/docs/src/blocks/components/Preview.tsx index 0069145781c0..9e8b3afa755b 100644 --- a/code/addons/docs/src/blocks/components/Preview.tsx +++ b/code/addons/docs/src/blocks/components/Preview.tsx @@ -5,7 +5,7 @@ import { logger } from 'storybook/internal/client-logger'; import { Bar, Button, ToggleButton, Zoom } from 'storybook/internal/components'; import type { ActionItem } from 'storybook/internal/components'; -import { CopyIcon, MarkupIcon, SyncIcon } from '@storybook/icons'; +import { CopyIcon, MarkupIcon } from '@storybook/icons'; import { useId } from '@react-aria/utils'; import { darken } from 'polished'; @@ -191,17 +191,18 @@ export const Preview: FC = ({ return ( <> - {withToolbar && ( + {(withToolbar || onReloadStory) && ( setScale(scale * z)} resetZoom={() => setScale(1)} storyId={!isLoading && childProps ? getStoryId(childProps, context) : undefined} + onReloadStory={onReloadStory} /> )} @@ -227,7 +228,7 @@ export const Preview: FC = ({ )} - {(withSource || onReloadStory || additionalActionItems.length > 0) && ( + {(withSource || additionalActionItems.length > 0) && ( {hasSourceError && ( )} - {onReloadStory && ( - - )} {additionalActionItems.map(({ title, className, onClick, disabled }, index: number) => ( + )}