Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
c29df73
Update ./docs/versions/next.json for v9.1.0-alpha.7
storybook-bot Jul 7, 2025
89129be
Merge pull request #31870 from storybookjs/various-fixes
ghengeveld Jun 30, 2025
be6d1ba
Merge pull request #28666 from elisezhg/fix/missing-color-scheme
valentinpalkovic Jul 1, 2025
a455f18
Merge pull request #31335 from adamscybot/fix-pass-functions-playwrig…
yannbf Jul 1, 2025
3d33b8d
Merge pull request #31906 from k35o/chore/update-vite-plugin-storyboo…
valentinpalkovic Jul 1, 2025
a664b1f
Merge pull request #31922 from storybookjs/export-storybook-bin-index…
ghengeveld Jul 1, 2025
94b26f5
Merge pull request #31930 from tijmenb/patch-1
jonniebigodes Jul 3, 2025
6284c98
Merge pull request #31921 from zenocross/test-navigation-fix
valentinpalkovic Jul 7, 2025
25f51ce
Merge pull request #31923 from mrginglymus/fail-on-failed-migrations
valentinpalkovic Jul 7, 2025
e29f66a
Merge pull request #31934 from storybookjs/disable-nuxt-sandbox
yannbf Jul 3, 2025
0d548ed
Merge pull request #31855 from terrymun/chore/upgrade-sass-loader-to-…
valentinpalkovic Jul 7, 2025
cb5b3ea
Merge pull request #31845 from storybookjs/fix-component-testing-e2e-…
ghengeveld Jul 7, 2025
f2a97a7
Merge pull request #31972 from storybookjs/fix-component-testing-e2e-…
ghengeveld Jul 7, 2025
3695227
Write changelog for 9.0.16 [skip ci]
storybook-bot Jul 7, 2025
c1ecb72
Merge pull request #31841 from takashi-kasajima/fix/json-nodes-keydown
ghengeveld Jun 30, 2025
dc1122a
Merge pull request #25893 from gossi/allow-ember-v5
valentinpalkovic Jul 1, 2025
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
24 changes: 12 additions & 12 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -880,23 +880,23 @@ workflows:
requires:
- unit-tests
- create-sandboxes:
parallelism: 14
parallelism: 13
requires:
- build
- chromatic-sandboxes:
parallelism: 11
parallelism: 10
requires:
- create-sandboxes
- e2e-production:
parallelism: 9
parallelism: 8
requires:
- create-sandboxes
- e2e-dev:
parallelism: 1
requires:
- create-sandboxes
- test-runner-production:
parallelism: 9
parallelism: 8
requires:
- create-sandboxes
- vitest-integration:
Expand Down Expand Up @@ -956,23 +956,23 @@ workflows:
requires:
- unit-tests
- create-sandboxes:
parallelism: 18
parallelism: 17
requires:
- build
- chromatic-sandboxes:
parallelism: 15
parallelism: 14
requires:
- create-sandboxes
- e2e-production:
parallelism: 13
parallelism: 12
requires:
- create-sandboxes
- e2e-dev:
parallelism: 1
requires:
- create-sandboxes
- test-runner-production:
parallelism: 13
parallelism: 12
requires:
- create-sandboxes
- vitest-integration:
Expand Down Expand Up @@ -1030,26 +1030,26 @@ workflows:
requires:
- build
- create-sandboxes:
parallelism: 31
parallelism: 30
requires:
- build
# - smoke-test-sandboxes: # disabled for now
# requires:
# - create-sandboxes
- chromatic-sandboxes:
parallelism: 28
parallelism: 27
requires:
- create-sandboxes
- e2e-production:
parallelism: 26
parallelism: 25
requires:
- create-sandboxes
- e2e-dev:
parallelism: 1
requires:
- create-sandboxes
- test-runner-production:
parallelism: 26
parallelism: 25
requires:
- create-sandboxes
- vitest-integration:
Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
## 9.0.16

- Automigration: Fail with non-zero exit code on migration failure - [#31923](https://github.com/storybookjs/storybook/pull/31923), thanks @mrginglymus!
- CLI: Fix `sb` CLI by explicitly exporting `bin/index.cjs` from `storybook` package - [#31922](https://github.com/storybookjs/storybook/pull/31922), thanks @ghengeveld!
- Core: Fix issue where collapsed test controls can be tabbed into - [#31921](https://github.com/storybookjs/storybook/pull/31921), thanks @zenocross!
- Core: Various fixes - [#31870](https://github.com/storybookjs/storybook/pull/31870), thanks @ghengeveld!
- Docs: Prevent JSON tree control from swallowing keyboard events when not in focus - [#31841](https://github.com/storybookjs/storybook/pull/31841), thanks @takashi-kasajima!
- Ember: Allow ember v5 as peer deps - [#25893](https://github.com/storybookjs/storybook/pull/25893), thanks @gossi!
- Next.js: upgrade sass-loader to 16.0.5 - [#31855](https://github.com/storybookjs/storybook/pull/31855), thanks @terrymun!
- NextJs-Vite: Enable next/font loading when using next-vite - [#31906](https://github.com/storybookjs/storybook/pull/31906), thanks @k35o!
- Portable stories: Fix playwright CT to allow functions to be passed as props - [#31335](https://github.com/storybookjs/storybook/pull/31335), thanks @adamscybot!
- UI: Set color scheme to sync scrollbar color with user-selected theme - [#28666](https://github.com/storybookjs/storybook/pull/28666), thanks @elisezhg!

## 9.0.15

- CLI: Do not fail incompatible package check in doctor if only core packages used - [#31886](https://github.com/storybookjs/storybook/pull/31886), thanks @mrginglymus!
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import React from 'react';

const meta = {
title: 'Controls/JsonNodes',
tags: ['autodocs'],
argTypes: {
value: { control: { type: 'object' } },
function: { control: { type: 'object' } },
},
args: {
value: { any: 'value' },
function: { value: () => {} },
},
parameters: {
// This story exists only to verify proper behavior on its docs page, the snapshot is irrelevant
chromatic: { disableSnapshot: true },
},
};

export default meta;

export const JsonNodes = {
render: () => (
<a href="https://www.google.com/" target="_blank" rel="noreferrer">
Confirm the link works by pressing enter key
</a>
),
};
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,21 @@ export class JsonAddValue extends Component<JsonAddValueProps, JsonAddValueState
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.repeat) {
return;
}
const { inputRefKey, inputRefValue } = this.state;
const { addButtonElement, handleCancel } = this.props;
const isFormFocused = [inputRefKey, inputRefValue, addButtonElement].some(
(elm) => elm === event.target
);
if (!isFormFocused) {
return;
}
if (event.code === 'Enter' || event.key === 'Enter') {
event.preventDefault();
this.onSubmit();
}
if (event.code === 'Escape' || event.key === 'Escape') {
event.preventDefault();
this.props.handleCancel();
handleCancel();
}
}

Expand Down Expand Up @@ -551,7 +559,15 @@ export class JsonFunctionValue extends Component<JsonFunctionValueProps, JsonFun
}

onKeydown(event: KeyboardEvent) {
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.repeat) {
const { inputRef } = this.state;
if (
event.altKey ||
event.ctrlKey ||
event.metaKey ||
event.shiftKey ||
event.repeat ||
inputRef !== event.target
) {
return;
}
if (event.code === 'Enter' || event.key === 'Enter') {
Expand Down Expand Up @@ -1463,7 +1479,15 @@ export class JsonValue extends Component<JsonValueProps, JsonValueState> {
}

onKeydown(event: KeyboardEvent) {
if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey || event.repeat) {
const { inputRef } = this.state;
if (
event.altKey ||
event.ctrlKey ||
event.metaKey ||
event.shiftKey ||
event.repeat ||
inputRef !== event.target
) {
return;
}
if (event.code === 'Enter' || event.key === 'Enter') {
Expand Down
1 change: 1 addition & 0 deletions code/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,7 @@
"./internal/manager/globals-runtime": {
"import": "./dist/manager/globals-runtime.js"
},
"./bin/index.cjs": "./bin/index.cjs",
"./package.json": "./package.json",
"./internal/package.json": "./package.json"
},
Expand Down
3 changes: 3 additions & 0 deletions code/core/scripts/helpers/generatePackageJsonFile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ export async function generatePackageJsonFile(entries: ReturnType<typeof getEntr
return acc;
}, {});

// Add CLI entry so `sb` can require it.
pkgJson.exports['./bin/index.cjs'] = './bin/index.cjs';

// Add the package.json file to the exports, so we can use it to `require.resolve` the package's root easily
pkgJson.exports['./package.json'] = './package.json';
pkgJson.exports['./internal/package.json'] = './package.json';
Expand Down
2 changes: 1 addition & 1 deletion code/core/src/components/components/Modal/Modal.styled.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export const Container = styled.div<{ width?: number; height?: number }>(

export const CloseButton = (props: React.ComponentProps<typeof IconButton>) => (
<Dialog.Close asChild>
<IconButton {...props}>
<IconButton aria-label="Close" {...props}>
<CrossIcon />
</IconButton>
</Dialog.Close>
Expand Down
1 change: 1 addition & 0 deletions code/core/src/components/components/tooltip/Tooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ const Wrapper = styled.div<WrapperProps>(
({ hidden }) => ({
display: hidden ? 'none' : 'inline-block',
zIndex: 2147483647,
colorScheme: 'light dark',
}),
({ theme, color, hasChrome }) =>
hasChrome
Expand Down
1 change: 1 addition & 0 deletions code/core/src/manager/components/layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ const LayoutContainer = styled.div<LayoutState & { showPanel: boolean }>(
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
colorScheme: 'light dark',

[MEDIA_DESKTOP_BREAKPOINT]: {
display: 'grid',
Expand Down
1 change: 1 addition & 0 deletions code/core/src/manager/components/sidebar/Sidebar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ export const Sidebar = React.memo(function Sidebar({
tooltip={<TooltipNoteWrapper note="Create a new story" />}
>
<CreateNewStoryButton
aria-label="Create a new story"
isMobile={isMobile}
onClick={() => {
setIsFileSearchModalOpen(true);
Expand Down
60 changes: 31 additions & 29 deletions code/core/src/manager/components/sidebar/TestingModule.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ const Card = styled.div(({ theme }) => ({
zIndex: 1,
borderRadius: theme.appBorderRadius,
backgroundColor: theme.background.content,
display: 'flex',
flexDirection: 'column-reverse',

'&:hover #testing-module-collapse-toggle': {
opacity: 1,
Expand All @@ -76,7 +78,6 @@ const Card = styled.div(({ theme }) => ({

const Collapsible = styled.div(({ theme }) => ({
overflow: 'hidden',

willChange: 'auto',
boxShadow: `inset 0 -1px 0 ${theme.appBorderColor}`,
}));
Expand Down Expand Up @@ -270,34 +271,6 @@ export const TestingModule = ({
data-updated={isUpdated}
>
<Card>
{hasTestProviders && (
<Collapsible
data-testid="collapse"
style={{
transition: isChangingCollapse ? 'max-height 250ms' : 'max-height 0ms',
display: hasTestProviders ? 'block' : 'none',
maxHeight: isCollapsed ? 0 : maxHeight,
}}
>
<Content ref={contentRef}>
{Object.values(registeredTestProviders).map((registeredTestProvider) => {
const { render: Render, id } = registeredTestProvider;
if (!Render) {
once.warn(
`No render function found for test provider with id '${id}', skipping...`
);
return null;
}
return (
<TestProvider key={id} data-module-id={id}>
<Render />
</TestProvider>
);
})}
</Content>
</Collapsible>
)}

<Bar {...(hasTestProviders ? { onClick: (e) => toggleCollapsed(e) } : {})}>
<Action>
{hasTestProviders && (
Expand Down Expand Up @@ -432,6 +405,35 @@ export const TestingModule = ({
)}
</Filters>
</Bar>

{hasTestProviders && (
<Collapsible
data-testid="collapse"
{...(isCollapsed && { inert: '' })}
style={{
transition: isChangingCollapse ? 'max-height 250ms' : 'max-height 0ms',
display: hasTestProviders ? 'block' : 'none',
maxHeight: isCollapsed ? 0 : maxHeight,
}}
>
<Content ref={contentRef}>
{Object.values(registeredTestProviders).map((registeredTestProvider) => {
const { render: Render, id } = registeredTestProvider;
if (!Render) {
once.warn(
`No render function found for test provider with id '${id}', skipping...`
);
return null;
}
return (
<TestProvider key={id} data-module-id={id}>
<Render />
</TestProvider>
);
})}
</Content>
</Collapsible>
)}
</Card>
</Outline>
);
Expand Down
6 changes: 4 additions & 2 deletions code/core/src/manager/utils/tree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,10 @@ export const getDescendantIds = memoize(1000)((
skipLeafs: boolean
): string[] => {
const entry = data[id];
const children = entry.type === 'story' || entry.type === 'docs' ? [] : entry.children;
return children.reduce((acc, childId) => {
if (!entry || entry.type === 'story' || entry.type === 'docs' || !entry.children) {
return [];
}
return entry.children.reduce((acc, childId) => {
const child = data[childId];

if (!child || (skipLeafs && (child.type === 'story' || child.type === 'docs'))) {
Expand Down
12 changes: 9 additions & 3 deletions code/core/src/preview-api/modules/store/csf/portable-stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,9 @@ export function composeStories<TModule extends Store_CSFExports>(
return composedStories;
}

type WrappedStoryRef = { __pw_type: 'jsx' | 'importRef' };
type WrappedStoryRef =
| { __pw_type: 'jsx'; props: Record<string, any> }
| { __pw_type: 'importRef' };
type UnwrappedJSXStoryRef = {
__pw_type: 'jsx';
type: UnwrappedImportStoryRef;
Expand Down Expand Up @@ -341,12 +343,16 @@ export function createPlaywrightTest<TFixture extends { extend: any }>(
`);
}

// Props are not necessarily serialisable and so can't be passed to browser via
// `page.evaluate`. Regardless they are not needed for storybook load/play steps.
const { props, ...storyRefWithoutProps } = storyRef;

await page.evaluate(async (wrappedStoryRef: WrappedStoryRef) => {
const unwrappedStoryRef = await globalThis.__pwUnwrapObject?.(wrappedStoryRef);
const story =
'__pw_type' in unwrappedStoryRef ? unwrappedStoryRef.type : unwrappedStoryRef;
return story?.load?.();
}, storyRef);
}, storyRefWithoutProps);

// mount the story
const mountResult = await mount(storyRef, ...restArgs);
Expand All @@ -358,7 +364,7 @@ export function createPlaywrightTest<TFixture extends { extend: any }>(
'__pw_type' in unwrappedStoryRef ? unwrappedStoryRef.type : unwrappedStoryRef;
const canvasElement = document.querySelector('#root');
return story?.play?.({ canvasElement });
}, storyRef);
}, storyRefWithoutProps);

return mountResult;
});
Expand Down
4 changes: 2 additions & 2 deletions code/frameworks/ember/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@storybook/ember",
"version": "9.0.15",
"description": "Storybook for Ember: Develop Ember Component in isolation with Hot Reloading.",
"description": "Storybook for Ember: Develop, document, and test Ember components in isolation",
"homepage": "https://github.com/storybookjs/storybook/tree/next/code/frameworks/ember",
"bugs": {
"url": "https://github.com/storybookjs/storybook/issues"
Expand Down Expand Up @@ -62,7 +62,7 @@
"@babel/core": "*",
"babel-plugin-ember-modules-api-polyfill": "^3.5.0",
"babel-plugin-htmlbars-inline-precompile": "^5.3.1",
"ember-source": "~3.28.1 || ^4.0.0",
"ember-source": "~3.28.1 || >=4.0.0",
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0",
"storybook": "workspace:^"
Expand Down
Loading