Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
e33dc0d
Vite: Support Vite 8
valentinpalkovic Feb 6, 2026
c596c81
Update yarn.lock
valentinpalkovic Feb 6, 2026
c2aa006
Discard peer-dependency errors in sandboxes
valentinpalkovic Feb 6, 2026
bc4f354
enforce script execution order in rolldown
yannbf Feb 11, 2026
66427f2
temporarily disable vite 8 override
yannbf Feb 11, 2026
bd50eb0
Merge branch 'next' into valentin/support-vite-8
yannbf Feb 12, 2026
b1b3e50
bring back vite 8 override
yannbf Feb 12, 2026
a3c0db7
downgrade next 14 and 15 sandboxes to vite 7
yannbf Feb 18, 2026
2fca262
fixes
yannbf Feb 18, 2026
0c005c5
apply prettier
yannbf Feb 18, 2026
f87b11b
Merge branch 'next' into valentin/support-vite-8
yannbf Feb 18, 2026
94318a4
try rolldown canary
yannbf Feb 18, 2026
4ae2771
update to Vite 8 beta 15
yannbf Feb 19, 2026
4ad1248
Merge branch 'next' into valentin/support-vite-8
yannbf Feb 19, 2026
cf9912b
Add telemetry error reporting to ManagerErrorBoundary
ghengeveld Feb 24, 2026
b0d4b98
Add tests for error reporting
ghengeveld Feb 24, 2026
b2327e4
Merge branch 'next' into valentin/support-vite-8
yannbf Feb 25, 2026
764b312
Fix error boundary tests by restoring console error spy and updating …
ghengeveld Feb 25, 2026
b4bacca
Merge branch 'next' into manager-error-telemetry
ghengeveld Feb 25, 2026
a0acb25
Refactor error boundary story to use a stable wrapper for console err…
ghengeveld Feb 25, 2026
e8363da
Merge branch 'next' into valentin/support-vite-8
yannbf Feb 27, 2026
832afaf
update to vite beta 16 - fixes windows issue
yannbf Feb 27, 2026
0ac0fff
Merge branch 'next' into valentin/support-vite-8
yannbf Mar 5, 2026
c167bd9
fix(accessibility): Add underline styling to MDX links for WCAG compl…
NikhilChowdhury27 Nov 24, 2025
e09b934
test(accessibility): Add unit tests for underlined links in MDX/docs
NikhilChowdhury27 Nov 24, 2025
7dcec06
test(accessibility): Add unit tests for A component underlined links
NikhilChowdhury27 Nov 24, 2025
196a9a2
fix: Exclude anchor position markers from underline styling
NikhilChowdhury27 Nov 24, 2025
5de4197
fix: Add refined underline styling to all MDX and UI links for WCAG 2…
NikhilChowdhury27 Nov 25, 2025
79dcfcc
fix: Add textDecoration override to isButton variant in Link component
NikhilChowdhury27 Nov 25, 2025
5ddf417
Update code/addons/docs/src/blocks/components/DocsPage.tsx
NikhilChowdhury27 Dec 1, 2025
bb44dce
Update code/core/src/components/components/typography/elements/A.tsx
NikhilChowdhury27 Dec 1, 2025
b773fb7
Update code/addons/docs/src/blocks/components/DocsPage.tsx
NikhilChowdhury27 Dec 1, 2025
5aefb3e
Update code/core/src/components/components/Button/Button.tsx
NikhilChowdhury27 Dec 1, 2025
eec47dc
Update code/addons/docs/src/blocks/components/DocsPage.test.tsx
NikhilChowdhury27 Dec 1, 2025
66e76bb
Update code/core/src/components/components/typography/link/link.tsx
NikhilChowdhury27 Dec 1, 2025
095348e
Update code/core/src/components/components/typography/link/link.tsx
NikhilChowdhury27 Dec 1, 2025
3676017
Update code/core/src/components/components/typography/DocumentWrapper…
NikhilChowdhury27 Dec 1, 2025
312a9ed
Update code/core/src/components/components/typography/DocumentWrapper…
NikhilChowdhury27 Dec 1, 2025
2ac469c
Adjust anchor underline behavior and tests
NikhilChowdhury27 Dec 1, 2025
f671901
Update code/core/src/components/components/typography/DocumentWrapper…
NikhilChowdhury27 Dec 2, 2025
6b437ef
Update code/core/src/components/components/typography/elements/A.tsx
NikhilChowdhury27 Dec 2, 2025
74e4e20
Update code/core/src/components/components/typography/link/link.tsx
NikhilChowdhury27 Dec 2, 2025
c0fdc05
Update code/addons/docs/src/blocks/components/DocsPage.tsx
NikhilChowdhury27 Dec 2, 2025
fe3bfc1
UI: Adjust link decorations to design reqs
Sidnioulz Mar 6, 2026
cfa8f41
Angular: only load webpack dependencies on demand
sod Mar 6, 2026
fb5c625
Exclude Configure.mdx template from changes
Sidnioulz Mar 6, 2026
20ea036
Merge branch 'next' into fix-issue-33017-mdx-link-underlines
Sidnioulz Mar 6, 2026
d2e120d
test: update svelte portable stories snapshots
kasperpeulen Mar 8, 2026
fea6253
docs: fix supported versions typo
rohan436 Mar 8, 2026
b23850c
test: align layout collapsed panel story with behavior
kasperpeulen Mar 8, 2026
18e7d3a
Merge remote-tracking branch 'origin/next' into codex/fix-next-svelte…
kasperpeulen Mar 8, 2026
718167e
revert: drop unrelated layout story change
kasperpeulen Mar 8, 2026
fddafe6
Show multiple favicons warning as debug message:
remino Mar 8, 2026
8038439
Merge branch 'next' into valentin/support-vite-8
yannbf Mar 9, 2026
5f7f9b4
update vite resolution
yannbf Mar 9, 2026
de4c08c
undo workarounds that supposedly are not needed anymore
yannbf Mar 9, 2026
695c8f2
Revert "undo workarounds that supposedly are not needed anymore"
yannbf Mar 9, 2026
f9e8a14
undo nextjs workarounds
yannbf Mar 9, 2026
f700486
Merge pull request #33915 from storybookjs/manager-error-telemetry
ghengeveld Mar 9, 2026
4f47d56
Build: Bump node in .nvmrc file
valentinpalkovic Mar 9, 2026
d34f3fc
Merge branch 'next' into valentin/support-vite-8
yannbf Mar 9, 2026
8a09a9d
Merge pull request #34079 from storybookjs/valentin/bump-node-version…
valentinpalkovic Mar 9, 2026
ac2845f
Update docs/releases/index.mdx
jonniebigodes Mar 9, 2026
a8cba0d
Merge branch 'next' into remino-debug-multiple-favicons
Sidnioulz Mar 9, 2026
217a372
Merge branch 'next' into rohan/fix-supported-versions-receives-typo
jonniebigodes Mar 9, 2026
f159b96
Merge pull request #34068 from Rohan5commit/rohan/fix-supported-versi…
jonniebigodes Mar 9, 2026
849d393
Update CHANGELOG.md for v10.2.17 [skip ci]
storybook-bot Mar 9, 2026
8dff441
Merge branch 'next-release' into next
storybook-bot Mar 9, 2026
d62b362
Merge branch 'next' into fix-issue-33017-mdx-link-underlines
Sidnioulz Mar 9, 2026
e4e182d
Angular: Add noCheck: true to tsconfig.json
valentinpalkovic Mar 9, 2026
e6a45fc
Angular: Set moduleResolution to bundler
valentinpalkovic Mar 9, 2026
cb6645a
Merge pull request #33788 from storybookjs/valentin/support-vite-8
yannbf Mar 10, 2026
09ce99c
Merge pull request #34085 from storybookjs/valentin/angular-no-check
valentinpalkovic Mar 10, 2026
0eae98b
Merge pull request #34043 from sod/angular-no-webpack
valentinpalkovic Mar 10, 2026
0090045
Merge pull request #33139 from NikhilChowdhury27/fix-issue-33017-mdx-…
Sidnioulz Mar 10, 2026
282c049
Merge pull request #34069 from remino/remino-debug-multiple-favicons
Sidnioulz Mar 10, 2026
35ea138
Merge remote-tracking branch 'origin/next' into codex/fix-next-svelte…
kasperpeulen Mar 10, 2026
349a45d
Merge pull request #34067 from storybookjs/codex/fix-next-svelte-snap…
kasperpeulen Mar 10, 2026
e59b850
Write changelog for 10.3.0-alpha.16 [skip ci]
storybook-bot Mar 10, 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
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
22.21.1
22.22.1

4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 10.2.17

- Next.js: Add support for v16.2 - [#34046](https://github.com/storybookjs/storybook/pull/34046), thanks @valentinpalkovic!

## 10.2.16

- CSF-Factories: Fix ConfigFile parser false warning on `definePreview({...}).type<T>()` export default - [#33885](https://github.com/storybookjs/storybook/pull/33885), thanks @copilot-swe-agent!
Expand Down
9 changes: 9 additions & 0 deletions CHANGELOG.prerelease.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
## 10.3.0-alpha.16

- A11y: Underline MDX links for WCAG SC 1.4.1 compliance - [#33139](https://github.com/storybookjs/storybook/pull/33139), thanks @NikhilChowdhury27!
- Angular: Add moduleResolution: bundler to tsconfig - [#34085](https://github.com/storybookjs/storybook/pull/34085), thanks @valentinpalkovic!
- Angular: only load webpack dependencies on demand - [#34043](https://github.com/storybookjs/storybook/pull/34043), thanks @sod!
- CLI: Show multiple favicons warning as debug message - [#34069](https://github.com/storybookjs/storybook/pull/34069), thanks @remino!
- Core: Fix error reporting in ManagerErrorBoundary - [#33915](https://github.com/storybookjs/storybook/pull/33915), thanks @ghengeveld!
- Vite: Support Vite 8 - [#33788](https://github.com/storybookjs/storybook/pull/33788), thanks @valentinpalkovic!

## 10.3.0-alpha.15

- Actions: Add expandLevel parameter to configure tree depth - [#33977](https://github.com/storybookjs/storybook/pull/33977), thanks @mixelburg!
Expand Down
101 changes: 101 additions & 0 deletions code/addons/docs/src/blocks/components/DocsPage.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
// @vitest-environment happy-dom
import { cleanup, render } from '@testing-library/react';
import { afterEach, describe, expect, it } from 'vitest';

import React from 'react';

import { ThemeProvider, convert, themes } from 'storybook/theming';

import { DocsContent } from './DocsPage';

function ThemedDocsContent({ children }: { children: React.ReactNode }) {
return (
<ThemeProvider theme={convert(themes.light)}>
<DocsContent>{children}</DocsContent>
</ThemeProvider>
);
}

describe('DocsContent', () => {
afterEach(() => {
cleanup();
});

describe('accessibility', () => {
it('should render links with underline text decoration for accessibility', () => {
const { container } = render(
<ThemedDocsContent>
<p>
This is a paragraph with a <a href="https://example.com">link</a> inside.
</p>
</ThemedDocsContent>
);

const link = container.querySelector('a');
expect(link).toBeTruthy();

const styles = window.getComputedStyle(link!);
expect(styles.textDecoration).toContain('underline');
});

it('should render links with underline in dark theme', () => {
const { container } = render(
<ThemeProvider theme={convert(themes.dark)}>
<DocsContent>
<p>
This is a paragraph with a <a href="https://example.com">link</a> inside.
</p>
</DocsContent>
</ThemeProvider>
);

const link = container.querySelector('a');
expect(link).toBeTruthy();

const styles = window.getComputedStyle(link!);
expect(styles.textDecoration).toContain('underline');
});

it('should render multiple links with underlines in text blocks', () => {
const { container } = render(
<ThemedDocsContent>
<div>
<p>
Check out <a href="https://example.com">this link</a> and also{' '}
<a href="https://another.com">this other link</a>.
</p>
<p>
Here is <a href="https://third.com">a third link</a> in another paragraph.
</p>
</div>
</ThemedDocsContent>
);

const links = container.querySelectorAll('a');
expect(links).toHaveLength(3);

links.forEach((link) => {
const styles = window.getComputedStyle(link);
expect(styles.textDecoration).toContain('underline');
});
});

it('should not underline anchor position markers (a.anchor)', () => {
const { container } = render(
<ThemedDocsContent>
<h2>
<a className="anchor" href="#heading">
Heading
</a>
</h2>
</ThemedDocsContent>
);

const anchor = container.querySelector('a.anchor');
expect(anchor).toBeTruthy();

const styles = window.getComputedStyle(anchor!);
expect(styles.textDecoration).not.toContain('underline');
});
});
});
9 changes: 8 additions & 1 deletion code/addons/docs/src/blocks/components/DocsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,10 @@ export const DocsContent = styled.div(({ theme }) => {
lineHeight: '24px',

color: theme.color.secondary,
textDecoration: 'none',
// Ensure WCAG Level A compliance (SC 1.4.1), see https://www.w3.org/WAI/WCAG22/Techniques/failures/F73
textDecoration: 'underline',
textDecorationThickness: '0.03125rem',
textUnderlineOffset: '0.11em',
'&.absent': {
color: '#cc0000',
},
Expand All @@ -127,6 +130,10 @@ export const DocsContent = styled.div(({ theme }) => {
top: 0,
left: 0,
bottom: 0,
textDecoration: 'none',
},
'&.anchor:hover, &.anchor:focus': {
textDecoration: 'underline',
},
},
[toGlobalSelector('blockquote')]: {
Expand Down
2 changes: 1 addition & 1 deletion code/builders/builder-vite/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@
},
"peerDependencies": {
"storybook": "workspace:^",
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
"vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
},
"publishConfig": {
"access": "public"
Expand Down
5 changes: 4 additions & 1 deletion code/builders/builder-vite/src/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type { InlineConfig } from 'vite';
import { createViteLogger } from './logger';
import type { WebpackStatsPlugin } from './plugins';
import { hasVitePlugins } from './utils/has-vite-plugins';
import { bundlerOptionsKey } from './utils/vite-features';
import { withoutVitePlugins } from './utils/without-vite-plugins';
import { commonConfig } from './vite-config';

Expand All @@ -19,11 +20,13 @@ export async function build(options: Options) {
const { presets } = options;

const config = await commonConfig(options, 'build');

config.build = mergeConfig(config, {
build: {
outDir: options.outputDir,
emptyOutDir: false, // do not clean before running Vite build - Storybook has already added assets in there!
rollupOptions: {
// TODO: Remove bundlerOptionsKey and use 'rolldownOptions' directly once support for Vite < 8 is dropped
[bundlerOptionsKey]: {
external: [/\.\/sb-common-assets\/.*\.woff2/],
},
...(options.test
Expand Down
12 changes: 10 additions & 2 deletions code/builders/builder-vite/src/plugins/code-generator-plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { generateImportFnScriptCode } from '../codegen-importfn-script';
import { generateModernIframeScriptCode } from '../codegen-modern-iframe-script';
import { generateAddonSetupCode } from '../codegen-set-addon-channel';
import { transformIframeHtml } from '../transform-iframe-html';
import { bundlerOptionsKey, ensureRolldownOptions } from '../utils/vite-features';
import {
SB_VIRTUAL_FILES,
SB_VIRTUAL_FILE_IDS,
Expand Down Expand Up @@ -45,10 +46,17 @@ export function codeGeneratorPlugin(options: Options) {
if (!config.build) {
config.build = {};
}
config.build.rollupOptions = {
...config.build.rollupOptions,
// TODO: Remove bundlerOptionsKey and use 'rolldownOptions' directly once support for Vite < 8 is dropped
const build = config.build as Record<string, any>;

// shared options between rollup/rolldown
build[bundlerOptionsKey] = {
...build[bundlerOptionsKey],
input: iframePath,
};

// necessary rolldown specific overrides
ensureRolldownOptions(config);
}
},
configResolved(config) {
Expand Down
30 changes: 30 additions & 0 deletions code/builders/builder-vite/src/utils/vite-features.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import type { UserConfig } from 'vite';
import { version } from 'vite';

// TODO: Remove once support for Vite < 8 is dropped
const shouldUseRolldownOptions = () => {
try {
return Number(version.split('.')[0]) >= 8;
} catch {
return false;
}
};

/**
* Returns the correct bundler options key based on the installed Vite version. Vite 8 renamed
* `build.rollupOptions` to `build.rolldownOptions`.
*/
// TODO: Remove once support for Vite < 8 is dropped, and use 'rolldownOptions' directly
export const bundlerOptionsKey = shouldUseRolldownOptions() ? 'rolldownOptions' : 'rollupOptions';

export function ensureRolldownOptions(config: UserConfig) {
if (!shouldUseRolldownOptions()) {
return;
}

config.build ??= {};
// @ts-expect-error - rolldownOptions will only exist with Vite 8+
const rolldown = (config.build.rolldownOptions ??= {});
const output = (rolldown.output ??= {});
output.strictExecutionOrder = true;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
// @vitest-environment happy-dom
import { cleanup, render } from '@testing-library/react';
import { afterEach, describe, expect, it } from 'vitest';

import React from 'react';

import { ThemeProvider, convert, themes } from 'storybook/theming';

import { DocumentWrapper } from './DocumentWrapper';

function ThemedDocumentWrapper({ children }: { children: React.ReactNode }) {
return (
<ThemeProvider theme={convert(themes.light)}>
<DocumentWrapper>{children}</DocumentWrapper>
</ThemeProvider>
);
}

describe('DocumentWrapper', () => {
afterEach(() => {
cleanup();
});

describe('accessibility', () => {
it('should render links with underline text decoration for accessibility', () => {
const { container } = render(
<ThemedDocumentWrapper>
<p>
This is a paragraph with a <a href="https://example.com">link</a> inside.
</p>
</ThemedDocumentWrapper>
);

const link = container.querySelector('a');
expect(link).toBeTruthy();

const styles = window.getComputedStyle(link!);
expect(styles.textDecoration).toContain('underline');
});

it('should render links with underline in dark theme', () => {
const { container } = render(
<ThemeProvider theme={convert(themes.dark)}>
<DocumentWrapper>
<p>
This is a paragraph with a <a href="https://example.com">link</a> inside.
</p>
</DocumentWrapper>
</ThemeProvider>
);

const link = container.querySelector('a');
expect(link).toBeTruthy();

const styles = window.getComputedStyle(link!);
expect(styles.textDecoration).toContain('underline');
});

it('should render multiple links with underlines in text blocks', () => {
const { container } = render(
<ThemedDocumentWrapper>
<div>
<p>
Check out <a href="https://example.com">this link</a> and also{' '}
<a href="https://another.com">this other link</a>.
</p>
<p>
Here is <a href="https://third.com">a third link</a> in another paragraph.
</p>
</div>
</ThemedDocumentWrapper>
);

const links = container.querySelectorAll('a');
expect(links).toHaveLength(3);

links.forEach((link) => {
const styles = window.getComputedStyle(link);
expect(styles.textDecoration).toContain('underline');
});
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ export const DocumentWrapper = styled.div(({ theme }) => ({
},
a: {
color: theme.color.secondary,
textDecoration: 'none',
// Ensure WCAG Level A compliance (SC 1.4.1), see https://www.w3.org/WAI/WCAG22/Techniques/failures/F73
textDecoration: 'underline',
textDecorationThickness: '0.03125rem',
textUnderlineOffset: '0.11em',
},
'a.absent': {
color: '#cc0000',
Expand All @@ -78,6 +81,10 @@ export const DocumentWrapper = styled.div(({ theme }) => ({
top: 0,
left: 0,
bottom: 0,
textDecoration: 'none',
},
'&.anchor:hover, &.anchor:focus': {
textDecoration: 'underline',
},
'h1, h2, h3, h4, h5, h6': {
margin: '20px 0 10px',
Expand Down
Loading
Loading