Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
72eeb82
initial triggerTestRun function
JReinhold Aug 28, 2025
a6a01d6
add story statuses to trigger api, take screenshots
JReinhold Aug 29, 2025
4e6e97a
Merge branch 'next' of github.com:storybookjs/storybook into jeppe/ad…
JReinhold Nov 27, 2025
2fd88b7
fix type
JReinhold Nov 27, 2025
8575ab4
try to add statuses to currentRun data structure
JReinhold Nov 28, 2025
b1e48b8
UI: Fix Copy button overlapping code in portrait mode
Maelryn Dec 23, 2025
1da0801
Merge branch 'next' into fix/copy-button-overlap
Maelryn Dec 24, 2025
3dee3bd
Merge branch 'next' into fix/copy-button-overlap
Maelryn Dec 25, 2025
53d2933
Merge branch 'next' into fix/copy-button-overlap
Maelryn Dec 28, 2025
c81c117
Replace hardcoded padding with ACTION_BAR_CLEARANCE
Maelryn Dec 29, 2025
d9f44be
Merge branch 'next' into fix/copy-button-overlap
Maelryn Dec 29, 2025
b468bc9
Merge branch 'next' into fix/copy-button-overlap
Maelryn Dec 29, 2025
ef5a1d6
Update stories layout
Maelryn Dec 29, 2025
be7e872
Refactor: use flexbox layout per maintainer feedback
Maelryn Dec 29, 2025
5ee9e53
Restore line number logic accidentally removed
Maelryn Dec 29, 2025
cef88c8
Merge branch 'next' into fix/copy-button-overlap
Maelryn Dec 31, 2025
fd27cf2
Fix: Apply flex layout to Preview component
Maelryn Jan 9, 2026
3f9a1ab
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 9, 2026
1d17947
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 13, 2026
a88029c
Merge branch 'next' of github.com:storybookjs/storybook into jeppe/ad…
JReinhold Jan 15, 2026
d5ab7e7
migrate to channel based triggering
JReinhold Jan 15, 2026
70799da
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 16, 2026
8fdd057
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 16, 2026
6acb68d
Fix: Add maxWidth to fix horizontal scrolling and restore comments
Maelryn Jan 16, 2026
c754caa
Restore removed JS comments
Sidnioulz Jan 19, 2026
70f50d6
Restore more JS comments
Sidnioulz Jan 19, 2026
8d3c5f9
Restore existing stories
Sidnioulz Jan 19, 2026
ac20f33
More JSDoc fixes
Sidnioulz Jan 19, 2026
9b52433
Apply suggestion from @Sidnioulz
Sidnioulz Jan 19, 2026
5a93381
Apply suggestion from @Sidnioulz
Sidnioulz Jan 19, 2026
20134bf
Apply suggestion from @Sidnioulz
Sidnioulz Jan 19, 2026
ddc5f9e
Merge branch 'next' into fix/copy-button-overlap
Sidnioulz Jan 19, 2026
23da885
expose a11yReports on CurrentRun
JReinhold Jan 19, 2026
9d204e3
add Channel to all preset options
JReinhold Jan 19, 2026
cb395c7
update lock file
JReinhold Jan 19, 2026
facb26a
fix no channel in build
JReinhold Jan 19, 2026
ea030b0
fix missing channel on options everywhere
JReinhold Jan 20, 2026
0f593d8
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 20, 2026
8488a59
don't fetch index in vitest, just get it server-side
JReinhold Jan 20, 2026
58c2b80
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 25, 2026
f4c242a
Merge branch 'next' into fix/copy-button-overlap
Maelryn Jan 27, 2026
19ad460
Merge branch 'next' of github.com:storybookjs/storybook into jeppe/ad…
JReinhold Feb 5, 2026
aeeb5e9
Merge branch 'next' of github.com:storybookjs/storybook into jeppe/ad…
JReinhold Feb 5, 2026
4f96417
cleanup, don't crash on getIndex failing
JReinhold Feb 5, 2026
c172f78
add isAddonA11yEnabled preset property to addon-a11y
JReinhold Feb 6, 2026
06900f2
support optional config overrides in TRIGGER_TEST_RUN flow
JReinhold Feb 6, 2026
9827e96
Centralize Vite plugins for builder-vite and addon-vitest
valentinpalkovic Feb 10, 2026
d647cb8
Refactor builder-vite: streamline plugin imports and remove unused code
valentinpalkovic Feb 11, 2026
73e8886
Fix optimize deps
valentinpalkovic Feb 11, 2026
4e54860
Refactor storybookOptimizeDepsPlugin: simplify config resolution
valentinpalkovic Feb 11, 2026
ad0c63b
Improve config resolution
valentinpalkovic Feb 11, 2026
4f0fbef
Add optimizeDeps functionality to builder-vite
valentinpalkovic Feb 11, 2026
0e3667f
Cleanup
valentinpalkovic Feb 12, 2026
59342f0
Refactor static directory handling in Vitest plugin and core server
valentinpalkovic Feb 12, 2026
9915f3d
Fix types
valentinpalkovic Feb 12, 2026
5439fe1
Remove obsolete test cases
valentinpalkovic Feb 12, 2026
36df811
Revert "Fix types"
valentinpalkovic Feb 12, 2026
5298a63
Revert "Refactor static directory handling in Vitest plugin and core …
valentinpalkovic Feb 12, 2026
d4f2b6c
Refactor Vite plugin to streamline external globals handling
valentinpalkovic Feb 12, 2026
5826751
Merge branch 'next' into valentin/encapsulate-vite-plugins
valentinpalkovic Feb 12, 2026
afe0ea3
Update virtual file names and remove unused constant
valentinpalkovic Feb 12, 2026
e3546af
Update jsdocs
valentinpalkovic Feb 12, 2026
a81220a
Cleanup docs
valentinpalkovic Feb 12, 2026
895cb72
Cleanup comments
valentinpalkovic Feb 12, 2026
47420f1
Refactor imports and remove unused code in Vitest and Vite builders
valentinpalkovic Feb 12, 2026
91ab095
Remove obsole docgen plugin
valentinpalkovic Feb 12, 2026
606bdac
Refactor modern iframe script generation and enhance project annotati…
valentinpalkovic Feb 12, 2026
2d0adaa
Refactor project annotations handling in Vite builder
valentinpalkovic Feb 12, 2026
b500e3a
Cleanup
valentinpalkovic Feb 12, 2026
aa9a688
Enhance storybookOptimizeDepsPlugin to support additional entry points
valentinpalkovic Feb 13, 2026
f7c1359
Merge branch 'next' of github.com:storybookjs/storybook into jeppe/ad…
JReinhold Feb 17, 2026
8331c0c
remove unused preview entry from addon-vitest
JReinhold Feb 17, 2026
1947630
fix tests and type checks
JReinhold Feb 17, 2026
82421a9
fix channel type issues
JReinhold Feb 17, 2026
aaa7410
improve test filtering logic to support running focused tests accross…
JReinhold Feb 18, 2026
8a97a8e
Gate nx workflow to storybookjs/storybook to prevent runs on forks
kasperpeulen Feb 19, 2026
518c70c
Merge pull request #33871 from storybookjs/kasper/fix-schedule-on-forks
kasperpeulen Feb 19, 2026
8af7599
Add storybookExternalGlobalsPlugin and related tests; refactor runtim…
valentinpalkovic Feb 19, 2026
fa82d19
Enhance project annotations handling with HMR support and refactor ge…
valentinpalkovic Feb 19, 2026
8117c38
Cleanup
valentinpalkovic Feb 19, 2026
d955fd4
Replace Channel class with ChannelLike interface in type declarations
kasperpeulen Feb 19, 2026
0a258bf
Fix prettier formatting for ChannelLike changes
kasperpeulen Feb 19, 2026
f645c85
Fix import ordering in index-json.ts
kasperpeulen Feb 19, 2026
6918d49
Fix linting
valentinpalkovic Feb 19, 2026
554a951
Fix wrong path
valentinpalkovic Feb 19, 2026
d0296a1
Merge branch 'next' into fix/copy-button-overlap
Sidnioulz Feb 19, 2026
6481e73
feat: added aria-label to popver and aria-haspop to dialog
gayanMatch Jan 9, 2026
c460895
renamed aria labels
gayanMatch Jan 16, 2026
00043a5
fix MIGRATION.md
gayanMatch Jan 16, 2026
1aef5d8
fix CI
gayanMatch Jan 16, 2026
9e24753
Remove unused FocusableElement import
gayanMatch Jan 16, 2026
5d51ca0
fix style error
gayanMatch Jan 17, 2026
40177d0
Merge branch 'next' into valentin/encapsulate-vite-plugins
valentinpalkovic Feb 19, 2026
aeb63d3
Update Playwright trace configuration and persist Playwright results …
yannbf Feb 19, 2026
333bdce
REVERT THIS COMMIT - This is just to debug
yannbf Feb 19, 2026
c8e62b3
fix: Harmonize UI copy for onboarding checklist
Sidnioulz Feb 19, 2026
84571aa
remove usage of non-exported shouldLog
JReinhold Feb 19, 2026
0dd4756
Revert "REVERT THIS COMMIT - This is just to debug"
yannbf Feb 19, 2026
ecc7fa8
Merge pull request #33420 from Maelryn/fix/copy-button-overlap
Sidnioulz Feb 19, 2026
0372b09
Adjust version number in MIGRATION.MD
Sidnioulz Feb 19, 2026
c84a207
Merge pull request #33819 from storybookjs/valentin/encapsulate-vite-…
valentinpalkovic Feb 19, 2026
7f0b353
Merge pull request #33872 from storybookjs/yann/readd-traces-to-e2e
yannbf Feb 19, 2026
c01a360
Merge pull request #33500 from gayanMatch/fix/A11y-Ensure-all-popover…
Sidnioulz Feb 19, 2026
7f9770c
Merge branch 'next' of github.com:storybookjs/storybook into jeppe/ad…
JReinhold Feb 19, 2026
a3aad16
Move websocket token to a shared singleton to avoid circular dependen…
JReinhold Feb 19, 2026
6b05884
Merge pull request #33206 from storybookjs/jeppe/addon-vitest-trigger…
JReinhold Feb 19, 2026
48f3d08
Revert "Merge pull request #33420 from Maelryn/fix/copy-button-overlap"
Sidnioulz Feb 20, 2026
a083a04
Next.js: Fix failing postcss mutation
valentinpalkovic Feb 20, 2026
5833e6b
Fix manifest generation for stories without explicit title in meta
kasperpeulen Feb 20, 2026
839a253
Merge pull request #33877 from storybookjs/sidnioulz/revert-copy-butt…
Sidnioulz Feb 20, 2026
a5282fc
Merge pull request #33878 from storybookjs/kasper/fix-manifest-storie…
kasperpeulen Feb 20, 2026
512098b
Merge pull request #33879 from storybookjs/valentin/fix-nextjs-15
valentinpalkovic Feb 20, 2026
77a63dd
Write changelog for 10.3.0-alpha.8 [skip ci]
storybook-bot Feb 20, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions .github/workflows/nx.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,14 @@ env:
jobs:
nx:
if: >
(github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.full_name == github.repository &&
(contains(github.event.pull_request.labels.*.name, 'ci:normal') ||
contains(github.event.pull_request.labels.*.name, 'ci:merged') ||
contains(github.event.pull_request.labels.*.name, 'ci:daily'))
) || (github.event_name == 'push' && github.ref == 'refs/heads/next') ||
(github.event_name == 'schedule')
github.repository == 'storybookjs/storybook' &&
((github.event_name == 'pull_request' &&
github.event.pull_request.head.repo.full_name == github.repository &&
(contains(github.event.pull_request.labels.*.name, 'ci:normal') ||
contains(github.event.pull_request.labels.*.name, 'ci:merged') ||
contains(github.event.pull_request.labels.*.name, 'ci:daily'))
) || (github.event_name == 'push' && github.ref == 'refs/heads/next') ||
(github.event_name == 'schedule'))

runs-on: ubuntu-latest
env:
Expand Down
10 changes: 10 additions & 0 deletions CHANGELOG.prerelease.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 10.3.0-alpha.8

- A11y: Ensure popover dialogs have an ARIA label - [#33500](https://github.com/storybookjs/storybook/pull/33500), thanks @gayanMatch!
- Addon-Vitest: Add channel API to programmatically trigger test runs - [#33206](https://github.com/storybookjs/storybook/pull/33206), thanks @JReinhold!
- Builder-Vite: Centralize Vite plugins for builder-vite and addon-vitest - [#33819](https://github.com/storybookjs/storybook/pull/33819), thanks @valentinpalkovic!
- Core: Revert Pull Request #33420 from Maelryn/fix/copy-button-overlap - [#33877](https://github.com/storybookjs/storybook/pull/33877), thanks @Sidnioulz!
- Next.js-Vite: Fix failing postcss mutation - [#33879](https://github.com/storybookjs/storybook/pull/33879), thanks @valentinpalkovic!
- React: Fix manifest stories empty when meta has no explicit title - [#33878](https://github.com/storybookjs/storybook/pull/33878), thanks @kasperpeulen!
- UI: Fix Copy button overlapping code in portrait mode - [#33420](https://github.com/storybookjs/storybook/pull/33420), thanks @Maelryn!

## 10.3.0-alpha.7

- Core: Require token for websocket connections - [#33820](https://github.com/storybookjs/storybook/pull/33820), thanks @ghengeveld!
Expand Down
10 changes: 10 additions & 0 deletions MIGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -627,6 +627,16 @@ The PopoverProvider component acts as a counterpoint to WithTooltip. When you wa

PopoverProvider is based on react-aria. It must have a single child that acts as a trigger. This child must have a pressable role (can be clicked or pressed) and must be able to receive React refs. Wrap your trigger component in `forwardRef` if you notice placement issues for your popover.

##### Added: ariaLabel

The `ariaLabel` prop was added in Storybook 10.3 to provide an accessible label for the popover dialog. This label is announced by screen readers when the popover opens. `ariaLabel` will become mandatory in Storybook 11.

```tsx
<PopoverProvider ariaLabel="Share options" popover={<ShareMenu />}>
<Button ariaLabel="Share">Share</Button>
</PopoverProvider>
```

#### WithTooltip Component API Changes

The WithTooltip component has been reimplemented from the ground up, under the new name `TooltipProvider`. The new implementation will replace `WithTooltip` entirely in Storybook 11. Below is a summary of the changes between both APIs, which will take full effect in Storybook 11.
Expand Down
5 changes: 5 additions & 0 deletions code/addons/a11y/build-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ const config: BuildEntries = {
entryPoint: './src/postinstall.ts',
dts: false,
},
{
exportEntries: ['./preset'],
entryPoint: './src/preset.ts',
dts: false,
},
],
},
};
Expand Down
1 change: 1 addition & 0 deletions code/addons/a11y/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
"./manager": "./dist/manager.js",
"./package.json": "./package.json",
"./postinstall": "./dist/postinstall.js",
"./preset": "./dist/preset.js",
"./preview": {
"types": "./dist/preview.d.ts",
"code": "./src/preview.tsx",
Expand Down
1 change: 1 addition & 0 deletions code/addons/a11y/preset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './dist/preset.js';
4 changes: 2 additions & 2 deletions code/addons/a11y/src/components/A11yContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { convert, themes } from 'storybook/theming';
import { getFriendlySummaryForAxeResult, getTitleForAxeResult } from '../axeRuleMappingHelper';
import { ADDON_ID, EVENTS, STATUS_TYPE_ID_A11Y, STATUS_TYPE_ID_COMPONENT_TEST } from '../constants';
import type { A11yParameters } from '../params';
import type { A11YReport, EnhancedResult, EnhancedResults, Status } from '../types';
import type { A11yReport, EnhancedResult, EnhancedResults, Status } from '../types';
import { RuleType } from '../types';
import type { TestDiscrepancy } from './TestDiscrepancyMessage';

Expand Down Expand Up @@ -244,7 +244,7 @@ export const A11yContextProvider: FC<PropsWithChildren> = (props) => {

const handleReport = useCallback(
({ reporters }: StoryFinishedPayload) => {
const a11yReport = reporters.find((r) => r.type === 'a11y') as Report<A11YReport> | undefined;
const a11yReport = reporters.find((r) => r.type === 'a11y') as Report<A11yReport> | undefined;

if (a11yReport) {
if ('error' in a11yReport.result) {
Expand Down
2 changes: 1 addition & 1 deletion code/addons/a11y/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@ import type { A11yTypes } from './types';

export { PARAM_KEY } from './constants';
export * from './params';
export type { A11yGlobals, A11yTypes } from './types';
export type { A11yGlobals, A11yTypes, A11yReport } from './types';

export default () => definePreviewAddon<A11yTypes>(addonAnnotations);
3 changes: 3 additions & 0 deletions code/addons/a11y/src/preset.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
// enables other addons/presets to detect if a11y is enabled and adjust their behavior accordingly
// using await presets.apply('isAddonA11yEnabled', false);
export const isAddonA11yEnabled = true;
2 changes: 1 addition & 1 deletion code/addons/a11y/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { AxeResults, NodeResult, Result } from 'axe-core';

import type { A11yParameters as A11yParams } from './params';

export type A11YReport = EnhancedResults | { error: Error };
export type A11yReport = EnhancedResults | { error: Error };

export interface A11yParameters {
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ const ArgSummary: FC<ArgSummaryProps> = ({ value, initialExpandedArgs }) => {

return (
<PopoverProvider
ariaLabel="Arg value details"
placement="bottom"
visible={isOpen}
onVisibleChange={(isVisible) => {
Expand Down
1 change: 1 addition & 0 deletions code/addons/docs/src/blocks/controls/Color.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ export const ColorControl: FC<ColorControlProps> = ({
placeholder="Choose color..."
/>
<PopoverProvider
ariaLabel="Color picker"
defaultVisible={startOpen}
visible={readOnly ? false : undefined}
onVisibleChange={() => color && addPreset(color)}
Expand Down
4 changes: 4 additions & 0 deletions code/addons/vitest/build-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ const config: BuildEntries = {
},
],
node: [
{
exportEntries: ['./constants'],
entryPoint: './src/constants.ts',
},
{
exportEntries: ['./preset'],
entryPoint: './src/preset.ts',
Expand Down
6 changes: 6 additions & 0 deletions code/addons/vitest/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@
"code": "./src/index.ts",
"default": "./dist/index.js"
},
"./constants": {
"types": "./dist/constants.d.ts",
"code": "./src/constants.ts",
"default": "./dist/constants.js"
},
"./internal/coverage-reporter": "./dist/node/coverage-reporter.js",
"./internal/global-setup": "./dist/vitest-plugin/global-setup.js",
"./internal/setup-file": "./dist/vitest-plugin/setup-file.js",
Expand Down Expand Up @@ -74,6 +79,7 @@
"@storybook/icons": "^2.0.1"
},
"devDependencies": {
"@storybook/addon-a11y": "workspace:*",
"@types/istanbul-lib-report": "^3.0.3",
"@types/micromatch": "^4.0.0",
"@types/node": "^22.19.1",
Expand Down
30 changes: 28 additions & 2 deletions code/addons/vitest/src/constants.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { StoreOptions } from 'storybook/internal/types';

import type { RunTrigger, StoreState } from './types';
import type { CurrentRun, RunTrigger, StoreState } from './types';

export { PANEL_ID as COMPONENT_TESTING_PANEL_ID } from '../../../core/src/component-testing/constants';
export {
Expand Down Expand Up @@ -28,14 +28,17 @@ export const storeOptions = {
watching: false,
cancelling: false,
fatalError: undefined,
indexUrl: undefined,
index: { entries: {}, v: 5 },
previewAnnotations: [],
currentRun: {
triggeredBy: undefined,
config: {
coverage: false,
a11y: false,
},
componentTestStatuses: [],
a11yStatuses: [],
a11yReports: {},
componentTestCount: {
success: 0,
error: 0,
Expand Down Expand Up @@ -63,3 +66,26 @@ export const TEST_PROVIDER_STORE_CHANNEL_EVENT_NAME = 'UNIVERSAL_STORE:storybook

export const STATUS_TYPE_ID_COMPONENT_TEST = 'storybook/component-test';
export const STATUS_TYPE_ID_A11Y = 'storybook/a11y';

// Channel event names for programmatic test triggering
export const TRIGGER_TEST_RUN_REQUEST = `${ADDON_ID}/trigger-test-run-request`;
export const TRIGGER_TEST_RUN_RESPONSE = `${ADDON_ID}/trigger-test-run-response`;

export type TriggerTestRunRequestPayload = {
requestId: string;
actor: string;
storyIds?: string[];
config?: Partial<StoreState['config']>;
};

export type TestRunResult = CurrentRun;

export type TriggerTestRunResponsePayload = {
requestId: string;
status: 'completed' | 'error' | 'cancelled';
result?: TestRunResult;
error?: {
message: string;
error?: import('./types').ErrorLike;
};
};
10 changes: 2 additions & 8 deletions code/addons/vitest/src/manager.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,8 @@ addons.register(ADDON_ID, (api) => {
},
});
});
store.untilReady().then(() => {
store.setState((state) => ({
...state,
indexUrl: new URL('index.json', window.location.href).toString(),
}));
store.subscribe('TEST_RUN_COMPLETED', ({ payload }) => {
api.emit(STORYBOOK_ADDON_TEST_CHANNEL, { type: 'test-run-completed', payload });
});
store.subscribe('TEST_RUN_COMPLETED', ({ payload }) => {
api.emit(STORYBOOK_ADDON_TEST_CHANNEL, { type: 'test-run-completed', payload });
});

addons.add(TEST_PROVIDER_ID, {
Expand Down
Loading
Loading