Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
172 commits
Select commit Hold shift + click to select a range
36dcd51
docs: clarify webpack process.env requires variables to be set
nitzan-treg Apr 16, 2026
006e099
fix: replace smart quotes with ASCII quotes in JSX attributes
nitzan-treg Apr 16, 2026
3f271ff
Docs: Document parameters.jsx.sortProps for preserving prop order in …
yatishgoel Jun 17, 2026
d0fc5a6
Initial plan
Copilot Jun 20, 2026
9cd0639
docs: add security warning for --host=0.0.0.0 in CLI options
Copilot Jun 20, 2026
6f4806f
Docs: Update documentation for prop sorting in dynamic snippets for R…
yatishgoel Jun 20, 2026
bfe3fb0
Merge branch 'next' into docs/23208-document-jsx-sortprops
yatishgoel Jun 20, 2026
32793d3
Update docs/api/cli-options.mdx
ghengeveld Jun 22, 2026
0c084f6
docs: normalize markdown table formatting in cli-options.mdx
Copilot Jun 22, 2026
8c36aab
Merge branch 'next' into docs/23208-document-jsx-sortprops
jonniebigodes Jun 22, 2026
ed1932f
Merge branch 'next' into docs/23208-document-jsx-sortprops
jonniebigodes Jun 23, 2026
31a30c3
Merge branch 'next' into copilot/documentation-fix-host-flag-security
jonniebigodes Jun 23, 2026
b8e0ace
Fix Vue docgen unicode default values
stellar003 May 26, 2026
e6876b6
Attempt to fix fixture type violations
Sidnioulz May 28, 2026
95db394
Add Vue unicode docgen regression test
stellar003 May 29, 2026
59ce3b5
Use unique label to locate input in e2e test
Sidnioulz Jun 1, 2026
cecbee8
Skip test that's waiting on another PR
Sidnioulz Jun 23, 2026
28f1481
Format code
Sidnioulz Jun 23, 2026
7f380b6
Move review toolbar and collection picker into components/
ghengeveld Jun 24, 2026
5df8b20
Make enterReviewMode a no-op when already in review mode
ghengeveld Jun 24, 2026
6eb3380
Rename pending review banner action from Switch to Update
ghengeveld Jun 24, 2026
5809d83
Add session keys and helpers for review arrival notifications
ghengeveld Jun 24, 2026
0baf723
Add pure helpers for review arrival notification policy
ghengeveld Jun 24, 2026
b905b80
Extend review store for notification sync without exposing pending state
ghengeveld Jun 24, 2026
76c3721
Extract review story info derivation into a pure module
ghengeveld Jun 24, 2026
cdab47c
Move ReviewProvider into components and wire notification cleanup
ghengeveld Jun 24, 2026
c76c789
Add sidebar notification for unseen review arrivals
ghengeveld Jun 24, 2026
1b49440
Move ReviewSummaryPortal into screens
ghengeveld Jun 24, 2026
0bd89da
Move ReviewPersistentLayer and mount arrival notifications
ghengeveld Jun 24, 2026
213a6fd
Update review component imports after folder reorganization
ghengeveld Jun 24, 2026
bc32342
Read review title from the store and keep it stable during deferred u…
ghengeveld Jun 24, 2026
4ee7ba8
Add story coverage for review arrival notifications
ghengeveld Jun 24, 2026
432f389
Formatting
ghengeveld Jun 24, 2026
44e2d35
Merge branch 'yann/agentic-review-mcp-integration' into review/review…
ghengeveld Jun 24, 2026
9502b16
Fix review arrival story tests and merge base branch
ghengeveld Jun 24, 2026
9bb1920
Fix ShowsNotificationForUnseenReview story to render the sidebar toast
ghengeveld Jun 24, 2026
cfe278c
Fix review page redirecting away from /review/
ghengeveld Jun 25, 2026
23d1932
Add embed-mode content resize broadcast in preview
ghengeveld Jun 25, 2026
ba821d0
Add embed option to getStoryHrefs for thumbnail previews
ghengeveld Jun 25, 2026
9279784
Size review thumbnails from iframe.resize content dimensions
ghengeveld Jun 25, 2026
36c0691
Enable embed mode for review summary preview iframes
ghengeveld Jun 25, 2026
f7059a2
Formatting
ghengeveld Jun 25, 2026
c1d1d18
Improve embed resize measurement and CSS-driven review thumbnails.
ghengeveld Jun 25, 2026
8d70918
Performance enhancements
ghengeveld Jun 25, 2026
c2e79c9
addon-vitest: subscribe for run completion before sending TRIGGER_RUN
Jun 26, 2026
a6e6068
Merge branch 'next' into fix-vue-docgen-default-values
Sidnioulz Jun 26, 2026
028c837
Dedupe deps
Sidnioulz Jun 26, 2026
6035fb7
UI: Hide onboarding menu with feature flag
Sidnioulz Jun 26, 2026
bb9bcac
Grow review thumbnail rows when iframe content is tall.
ghengeveld Jun 26, 2026
a08be02
Apply suggestion from @Sidnioulz
Sidnioulz Jun 26, 2026
1e51b9a
Merge pull request #34909 from Arunsiva003/fix-vue-docgen-default-values
Sidnioulz Jun 26, 2026
ac39c7d
Refactor review thumbnail grid per code review feedback.
ghengeveld Jun 26, 2026
bf34cdb
Merge pull request #35191 from yatishgoel/docs/23208-document-jsx-sor…
Sidnioulz Jun 26, 2026
164ae97
Merge branch 'next' into ghengeveld/review-thumbnail-content-resize
ghengeveld Jun 26, 2026
5a4fd2b
Enhance next/link mock tests and functionality
yatishgoel Jun 27, 2026
8bc4ba7
Docs: Clarify TanStack Query client tradeoffs
nightt5879 Jun 29, 2026
41e952c
Keep review thumbnails at 3/2 and scale to content only.
ghengeveld Jun 29, 2026
6653f2d
"Claude PR Assistant workflow"
Sidnioulz Jun 29, 2026
48ba258
"Claude Code Review workflow"
Sidnioulz Jun 29, 2026
d689974
Merge pull request #35291 from tsushanth/fix/addon-vitest-subscribe-b…
Sidnioulz Jun 29, 2026
de7413a
Merge pull request #35314 from nightt5879/nightt5879/clarify-tanstack…
Sidnioulz Jun 29, 2026
126c158
Remove purple color on notification icon
ghengeveld Jun 29, 2026
0888c06
CI: Customise Claude action config
Sidnioulz Jun 29, 2026
63d16f3
Avoid hardcoded timestamp in stories and tests
ghengeveld Jun 29, 2026
4a94fe9
Limit claude reviews to a label
Sidnioulz Jun 29, 2026
a3c80e2
Handle isRequired and isHovered in ArgControl
Sidnioulz Jun 22, 2026
8b81858
Rework required for checkbox and radio
Sidnioulz Jun 24, 2026
630bdcf
Refactor emotion component selectors
Sidnioulz Jun 26, 2026
219225e
VSCode: Do not reference removed config files
Sidnioulz Jun 29, 2026
dee640f
UI: Use sr-only to hide ArgRow cells
Sidnioulz Jun 29, 2026
bfaee1c
Merge pull request #35319 from storybookjs/sidnioulz/fix-vscode-vites…
Sidnioulz Jun 29, 2026
d0ef37e
Merge pull request #35299 from storybookjs/sidnioulz/menu-onboarding-…
Sidnioulz Jun 29, 2026
147bc0a
Rework trigger conditions
Sidnioulz Jun 29, 2026
aa14123
Fix(ci): prevent merges to next/main from cancelling each other's Cir…
Sidnioulz Jun 29, 2026
ba9a2ff
Merge branch 'next' into review/review-arrival
ghengeveld Jun 29, 2026
5e02302
Merge pull request #35306 from storybookjs/sidnioulz/argstable-requir…
Sidnioulz Jun 29, 2026
5adf450
Fix CollectionGrid story waiting on stale neighbor heights.
ghengeveld Jun 29, 2026
f216ac1
Refresh review thumbnail iframes when preview href changes.
ghengeveld Jun 29, 2026
2216572
Invoke onFrozen only once after the first story freeze.
ghengeveld Jun 29, 2026
fc16acc
Keep embed and freeze out of generic story href query params.
ghengeveld Jun 29, 2026
7dd67a4
Reject invalid iframe resize payload dimensions.
ghengeveld Jun 29, 2026
78526c4
Use Vitest global stubs in embed resize broadcast tests.
ghengeveld Jun 29, 2026
305e508
Limit @claude mentions to us
Sidnioulz Jun 29, 2026
fb02de5
Give Claude more permissions to edit code and run commands
Sidnioulz Jun 29, 2026
00c1056
Remove stale hasActiveFilters import after next merge
ghengeveld Jun 29, 2026
433d54d
Add next/link action logging and corresponding tests
yatishgoel Jun 29, 2026
b88a038
Fix arrival notification re-firing after accepting a pending review u…
ghengeveld Jun 29, 2026
4ef593a
Skip sidebar arrival toast for in-review pending updates.
ghengeveld Jun 29, 2026
a997fc5
Preview: compose core annotations before running beforeAll
JReinhold Jun 29, 2026
98de385
Merge pull request #35276 from storybookjs/review/review-arrival
ghengeveld Jun 29, 2026
6d7f372
feat(docgen): run docgen extraction in a worker thread
JReinhold Jun 29, 2026
f83ce37
feat(react): provide docgen via a worker-target module
JReinhold Jun 29, 2026
0613dea
perf(docgen): defer Controls docgen to a render-lifecycle gate
JReinhold Jun 29, 2026
78a904d
chore(addon-docs): remove debug docgen provider
JReinhold Jun 29, 2026
20d54da
Merge branch 'next' into ghengeveld/review-thumbnail-content-resize
ghengeveld Jun 29, 2026
b0c5ddf
Fix review-story-info imports after next merge
ghengeveld Jun 29, 2026
98b2b1d
Core: Pass TRenderer generic to composeProjectAnnotationsWithCore
JReinhold Jun 29, 2026
ff2a9a8
Merge branch 'next' into fix/preview-core-annotations
JReinhold Jun 29, 2026
2335034
Merge branch 'next' into fix/35213-nextjs-link-mock-onclick-order
yatishgoel Jun 29, 2026
2cd8598
Merge pull request #35311 from yatishgoel/fix/35213-nextjs-link-mock-…
Sidnioulz Jun 29, 2026
484b98e
Fix review thumbnail scale for tall stories that fit frame width.
ghengeveld Jun 29, 2026
d71aa77
Merge origin/next into docgen/worker-threading
JReinhold Jun 29, 2026
fd722b8
Document experimentalDocgenServer feature flag
JReinhold Jun 29, 2026
95f54f8
Merge branch 'next' into ghengeveld/review-thumbnail-content-resize
ghengeveld Jun 29, 2026
beb76d4
Docs: Update MCP agent links
shilman Jun 30, 2026
17b62a5
Docgen: address review feedback on worker gate and client
JReinhold Jun 30, 2026
520c701
UI: Add docs.lang and htmlLang parameters
mehm8128 Apr 8, 2026
656cfbe
Stop review mode from mutating sidebar/panel chrome visibility.
ghengeveld Jun 30, 2026
2b0e26c
Hide sidebar on the review summary page.
ghengeveld Jun 30, 2026
17826d9
Hide sidebar and show review header only on collection stories.
ghengeveld Jun 30, 2026
dd37865
Fix review summary portal left inset when sidebar is suppressed.
ghengeveld Jun 30, 2026
383d590
Merge branch 'next' into sidnioulz/fix-html-lang-refreshed
Sidnioulz Jun 30, 2026
a94b92a
Dismiss review notification when visiting a review route.
ghengeveld Jun 30, 2026
ec096ee
Guard isReviewManagerRoute against an undefined path.
ghengeveld Jun 30, 2026
d64659d
Apply suggestion from @Sidnioulz
Sidnioulz Jun 30, 2026
73fb3c6
Merge pull request #35316 from storybookjs/add-claude-github-actions-…
Sidnioulz Jun 30, 2026
0beac7b
Merge pull request #35324 from storybookjs/docgen/worker-threading
JReinhold Jun 30, 2026
91b9c34
Merge pull request #35321 from storybookjs/sidnioulz/fix-html-lang-re…
Sidnioulz Jun 30, 2026
e4903ff
wip
ndelangen Jun 26, 2026
52f2e4e
Skip play functions in embedded review thumbnail previews.
ghengeveld Jun 30, 2026
3e27933
Merge branch 'next' into shilman/update-mcp-agents
jonniebigodes Jun 30, 2026
9cfc62a
Merge pull request #35328 from storybookjs/shilman/update-mcp-agents
jonniebigodes Jun 30, 2026
e29c00c
Merge branch 'next' into fix/32322-documentation-docs-unclear-about-p…
jonniebigodes Jun 30, 2026
703c783
Merge pull request #34558 from nitzan-treg/fix/32322-documentation-do…
jonniebigodes Jun 30, 2026
7ba9c11
Merge pull request #35320 from storybookjs/sidnioulz/fix-trigger-circ…
Sidnioulz Jun 30, 2026
b75bda9
Merge branch 'next' into copilot/documentation-fix-host-flag-security
jonniebigodes Jun 30, 2026
2734397
Merge pull request #35241 from storybookjs/copilot/documentation-fix-…
jonniebigodes Jun 30, 2026
0945d47
Merge branch 'next' into review-sidebar-layout
ghengeveld Jun 30, 2026
576e76e
Fix sidebar-related shortcuts handling
ghengeveld Jun 30, 2026
19e1e8e
Defer review-mode flag until filter setters succeed
ghengeveld Jun 30, 2026
614d8d4
Preserve nav visibility when deriving showSidebar
ghengeveld Jun 30, 2026
5b8a745
Reset mobile menu state when showMenu turns false
ghengeveld Jun 30, 2026
4b0cb28
Clean up review notification sessionStorage in story test
ghengeveld Jun 30, 2026
b4b68df
Fix review exit remounts, false notifications, and re-entry loop.
ghengeveld Jun 30, 2026
0104a63
Hide fullscreen in review mode and clear Reviewing filter on exit.
ghengeveld Jun 30, 2026
5b870b0
Tweaks
kylegach Jun 30, 2026
c4a2c05
Replace placeholder RFC link
JReinhold Jun 30, 2026
14060ac
Merge branch 'next' into docs/experimental-docgen-server-feature-flag
kylegach Jun 30, 2026
5c7180d
Merge pull request #35326 from storybookjs/docs/experimental-docgen-s…
kylegach Jun 30, 2026
cb63c84
Fix review exit visit marking and MobileReview story route mock.
ghengeveld Jun 30, 2026
34d3be7
Fix MobileReview story by avoiding nested LocationProvider.
ghengeveld Jun 30, 2026
ed0d856
Docgen: address review feedback on memory gate scripts and tests
ndelangen Jul 1, 2026
a6a245b
Merge branch 'next' into norbert/oom-docgen-fix
ndelangen Jul 1, 2026
d90e72e
Docgen: trim transcript-style comments in memory gate tooling
ndelangen Jul 1, 2026
0ffd502
make comments less verbose
ndelangen Jul 1, 2026
4cac956
Merge pull request #35282 from storybookjs/ghengeveld/review-thumbnai…
ghengeveld Jul 1, 2026
7f96a9b
Improve review thumbnail scaling and loading UX.
ghengeveld Jul 1, 2026
74e0d51
Docgen: warn once to raise memory limit when recycling under heap pre…
ndelangen Jul 1, 2026
8f2806b
Refactor: Remove ReactDocgenServerMemoryLimitError and update warning…
ndelangen Jul 1, 2026
994214b
Merge branch 'next' into norbert/oom-docgen-fix
ndelangen Jul 1, 2026
4aa28d0
Gate embed remeasure requests until the story has frozen.
ghengeveld Jul 1, 2026
9efd8af
Merge pull request #35323 from storybookjs/fix/preview-core-annotations
ndelangen Jul 1, 2026
9dcabb9
Unify preview thumbnail loading into a load-generation settle model.
ghengeveld Jul 1, 2026
ab43286
Gate embed UI style injection on freeze=finished thumbnails.
ghengeveld Jul 1, 2026
de84ebc
Remove duplicate JS thumbnail scale logic; CSS owns scaling.
ghengeveld Jul 1, 2026
709ad5d
Add CollectionGrid story tests for preview loading lifecycle.
ghengeveld Jul 1, 2026
776a6f9
Drop unused live-observer path from embed resize broadcast.
ghengeveld Jul 1, 2026
ac47eaf
Extract embed query helpers from resize broadcast module.
ghengeveld Jul 1, 2026
bb463c1
Merge remote-tracking branch 'origin/next' into ghengeveld/review-thu…
ghengeveld Jul 1, 2026
5fe3f7b
Merge pull request #35305 from storybookjs/norbert/oom-docgen-fix
ndelangen Jul 1, 2026
20aaf27
Formatting
ghengeveld Jul 1, 2026
0e60b6f
Restore auto-resize for non-freeze embed previews.
ghengeveld Jul 1, 2026
806b17f
Use default Loader status role for review thumbnails.
ghengeveld Jul 1, 2026
83f535a
Fix review thumbnail frame sizing inside grid cells.
ghengeveld Jul 1, 2026
cf9b1ce
Merge pull request #35322 from storybookjs/ghengeveld/review-fullscre…
ghengeveld Jul 1, 2026
c7aa8e4
Merge remote-tracking branch 'origin/next' into ghengeveld/review-thu…
ghengeveld Jul 1, 2026
8baa2cc
Address review feedback after merging next.
ghengeveld Jul 1, 2026
7c10439
Show review preview spinner while queued for a concurrency slot.
ghengeveld Jul 1, 2026
b1572af
Preserve review summary UI when another tab replays the cached review.
ghengeveld Jul 1, 2026
f9f37a4
Add viewport metadata to iframe.resize and scale review thumbnails by…
ghengeveld Jul 1, 2026
af10ec3
Merge pull request #35335 from storybookjs/ghengeveld/review-thumbnai…
ghengeveld Jul 1, 2026
107ce30
Write changelog for 10.5.0-alpha.10 [skip ci]
storybook-bot Jul 1, 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
35 changes: 35 additions & 0 deletions .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: Claude Code Review

on:
pull_request:
types: [opened, synchronize, ready_for_review, reopened]

jobs:
claude-review:
# Claude Code reviews are estimated to cost $15-25. use only when necessary and only internally.
if: |
(github.event.pull_request.author_association == 'MEMBER' || github.event.pull_request.author_association == 'OWNER') &&
contains(github.event.pull_request.labels.*.name, 'claude-review')
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write

steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
persist-credentials: false

- name: Run Claude Code Review
id: claude-review
uses: anthropics/claude-code-action@a92e7c70a4da9793dc164451d829089dc057a464 # v1.0.159
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
plugin_marketplaces: 'https://github.com/anthropics/claude-code.git'
plugins: 'code-review@claude-code-plugins'
prompt: '/code-review:code-review ${{ github.repository }}/pull/${{ github.event.pull_request.number }}'
68 changes: 68 additions & 0 deletions .github/workflows/claude.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Claude Code

on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
issues:
types: [opened, assigned]
pull_request_review:
types: [submitted]

jobs:
claude:
# Only org OWNERs and MEMBERs may trigger Claude. author_association is set by
# GitHub on the comment/review/issue payload; everything else (COLLABORATOR,
# CONTRIBUTOR, FIRST_TIME_CONTRIBUTOR, NONE) is rejected.
if: |
(github.event_name == 'issue_comment' &&
contains(github.event.comment.body, '@claude') &&
contains(fromJSON('["OWNER", "MEMBER"]'), github.event.comment.author_association)) ||
(github.event_name == 'pull_request_review_comment' &&
contains(github.event.comment.body, '@claude') &&
contains(fromJSON('["OWNER", "MEMBER"]'), github.event.comment.author_association)) ||
(github.event_name == 'pull_request_review' &&
contains(github.event.review.body, '@claude') &&
contains(fromJSON('["OWNER", "MEMBER"]'), github.event.review.author_association)) ||
(github.event_name == 'issues' && (
(github.event.action == 'opened' &&
contains(fromJSON('["OWNER", "MEMBER"]'), github.event.issue.author_association) &&
(contains(github.event.issue.body, '`@claude`') || contains(github.event.issue.title, '`@claude`'))) ||
(github.event.action == 'assigned' && github.event.assignee.login == 'claude')
))
runs-on: ubuntu-latest
permissions:
contents: read
pull-requests: read
issues: read
id-token: write
actions: read # Required for Claude to read CI results on PRs
steps:
- name: Checkout repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
persist-credentials: false

- name: Run Claude Code
id: claude
uses: anthropics/claude-code-action@a92e7c70a4da9793dc164451d829089dc057a464 # v1.0.159
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
assignee_trigger: 'claude'
base_branch: 'next'
prompt: 'Respect the PR description template and repository guidelines in AGENTS.md.'
# Allows Claude to read CI results on PRs
additional_permissions: |
actions: read
# Tool permissions Claude needs to follow AGENTS.md (install, compile,
# typecheck, lint, format, test). Bash is NOT allowed by default, so
# without this Claude cannot run any of the repo's build/test commands.
# See https://github.com/anthropics/claude-code-action/blob/main/docs/usage.md
# or https://code.claude.com/docs/en/cli-reference for available options
claude_args: |
--allowed-tools "Bash(yarn:*),Bash(cd:*),Bash(node:*),Bash(git status:*),Bash(git diff:*),Bash(git log:*),Bash(git show:*)"
--disallowed-tools "Bash(yarn start),Bash(yarn task dev)"
7 changes: 6 additions & 1 deletion .github/workflows/trigger-circle-ci-workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,13 @@ on:
- next
- main

# For PR events, group per-PR (github.ref is refs/pull/<n>/merge) so redundant
# re-triggers on the same PR cancel each other. For pushes to a shared branch
# (next/main), key on the commit SHA instead: otherwise two merges landing close
# together share the refs/heads/<branch> group and the earlier merge's trigger is
# cancelled before it can POST to CircleCI, silently skipping its `merged` workflow.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.sha || github.event.pull_request.number }}
cancel-in-progress: true

jobs:
Expand Down
2 changes: 0 additions & 2 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,6 @@
"typescript.preferences.quoteStyle": "single",
"typescript.preferGoToSourceDefinition": true,
"typescript.tsdk": "./node_modules/typescript/lib",
"vitest.workspaceConfig": "./code/vitest.workspace.ts",
"vitest.rootConfig": "./code/vitest.workspace.ts",
"oxc.fmt.configPath": ".oxfmtrc.json",
"oxc.enable.oxlint": false
}
16 changes: 16 additions & 0 deletions CHANGELOG.prerelease.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
## 10.5.0-alpha.10

- A11y: Handle lang attribute throughout preview - [#35321](https://github.com/storybookjs/storybook/pull/35321), thanks @Sidnioulz!
- A11y: Surface required args and keyboard-reachable Setup controls in ArgsTable - [#35306](https://github.com/storybookjs/storybook/pull/35306), thanks @Sidnioulz!
- Addon-Vitest: Subscribe for run completion before triggering it - [#35291](https://github.com/storybookjs/storybook/pull/35291), thanks @tsushanth!
- Core: Compose core annotations before preview beforeAll - [#35323](https://github.com/storybookjs/storybook/pull/35323), thanks @JReinhold!
- Docgen: Run experimentalDocgenServer extraction in a worker thread - [#35324](https://github.com/storybookjs/storybook/pull/35324), thanks @JReinhold!
- DocgenServer: Fix OOM by recycling the shared TS program - [#35305](https://github.com/storybookjs/storybook/pull/35305), thanks @ndelangen!
- Next: Call link onClick before preventing default - [#35311](https://github.com/storybookjs/storybook/pull/35311), thanks @yatishgoel!
- Review: Dynamic thumbnail scaling based on content dimensions - [#35282](https://github.com/storybookjs/storybook/pull/35282), thanks @ghengeveld!
- Review: Improve review thumbnail scaling and loading UX - [#35335](https://github.com/storybookjs/storybook/pull/35335), thanks @ghengeveld!
- Review: Notify on review arrival instead of auto-navigating - [#35276](https://github.com/storybookjs/storybook/pull/35276), thanks @ghengeveld!
- Review: Simplify layout handling - [#35322](https://github.com/storybookjs/storybook/pull/35322), thanks @ghengeveld!
- UI: Hide onboarding menu with feature flag - [#35299](https://github.com/storybookjs/storybook/pull/35299), thanks @Sidnioulz!
- Vue: Fix Unicode Default Values In Docs - [#34909](https://github.com/storybookjs/storybook/pull/34909), thanks @Arunsiva003!

## 10.5.0-alpha.9

- Addon Vitest: Avoid erroring out on benign Win process exits - [#35287](https://github.com/storybookjs/storybook/pull/35287), thanks @Sidnioulz!
Expand Down
4 changes: 4 additions & 0 deletions code/.storybook/preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,11 @@ const decorators = [
] satisfies Decorator[];

const parameters = {
// Redundant but useful for testing lang parameter propagation in stories.
htmlLang: 'en-CA',
docs: {
// Redundant but useful for testing lang parameter propagation in docs.
lang: 'en-US',
theme: themes.light,
codePanel: true,
source: {
Expand Down
8 changes: 6 additions & 2 deletions code/addons/docs/src/blocks/blocks/ArgTypes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -107,18 +107,20 @@ function renderArgTypesTables({
include,
exclude,
sort,
docsLang,
}: {
mainName?: string;
mainRows: StrictArgTypes;
subcomponentRows: Record<string, StrictArgTypes>;
include?: PropDescriptor;
exclude?: PropDescriptor;
sort?: SortType;
docsLang?: string;
}) {
const filteredMainRows = filterArgTypes(mainRows, include, exclude);

if (Object.keys(subcomponentRows).length === 0) {
return <PureArgsTable rows={filteredMainRows as any} sort={sort} />;
return <PureArgsTable rows={filteredMainRows as any} sort={sort} docsLang={docsLang} />;
}

const tabs = {
Expand All @@ -134,7 +136,7 @@ function renderArgTypesTables({
),
};

return <TabbedArgsTable tabs={tabs as any} sort={sort} />;
return <TabbedArgsTable tabs={tabs as any} sort={sort} docsLang={docsLang} />;
}

const LegacyArgTypes: FC<ArgTypesProps> = (props) => {
Expand All @@ -148,6 +150,7 @@ const LegacyArgTypes: FC<ArgTypesProps> = (props) => {
mainName: getComponentName(component),
mainRows: argTypes,
subcomponentRows: extractSubcomponentArgTypes(subcomponents, parameters),
docsLang: parameters?.docs?.lang,
...filterProps,
});
};
Expand Down Expand Up @@ -175,6 +178,7 @@ const DocgenServiceArgTypes: FC<ArgTypesProps> = (props) => {
mainName: getComponentName(component) ?? serviceRows.serviceComponentName,
mainRows: serviceRows.mainRows,
subcomponentRows: serviceRows.subcomponentRows,
docsLang: parameters?.docs?.lang,
...filterProps,
});
};
Expand Down
8 changes: 7 additions & 1 deletion code/addons/docs/src/blocks/blocks/Controls.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import { useId } from '@react-aria/utils';
import type { Args, Globals, Renderer, StrictArgTypes } from 'storybook/internal/csf';
import type { DocsContextProps, ModuleExports, PreparedStory } from 'storybook/internal/types';

import { filterArgTypes } from 'storybook/preview-api';
import type { PropDescriptor } from 'storybook/preview-api';
import { filterArgTypes } from 'storybook/preview-api';

import type { SortType } from '../components';
import { ArgsTable as PureArgsTable, TabbedArgsTable } from '../components';
Expand Down Expand Up @@ -50,6 +50,7 @@ type ControlsTablesProps = ControlsInteractiveState & {
exclude?: PropDescriptor;
sort?: SortType;
storyId: string;
docsLang?: string;
};

function getControlsFilterProps(story: PreparedStory, props: ControlsProps): ControlsParameters {
Expand Down Expand Up @@ -89,6 +90,7 @@ const ControlsTables: FC<ControlsTablesProps> = ({
globals,
updateArgs,
resetArgs,
docsLang,
}) => {
const filteredMainRows = filterArgTypes(mainRows, include, exclude);

Expand All @@ -107,6 +109,7 @@ const ControlsTables: FC<ControlsTablesProps> = ({
globals={globals}
updateArgs={updateArgs}
resetArgs={resetArgs}
docsLang={docsLang}
/>
);
}
Expand Down Expand Up @@ -134,6 +137,7 @@ const ControlsTables: FC<ControlsTablesProps> = ({
resetArgs={resetArgs}
storyId={storyId}
controlsId={controlsId}
docsLang={docsLang}
/>
);
};
Expand All @@ -155,6 +159,7 @@ const LegacyControls: FC<ControlsStoryProps> = ({ story, context, ...props }) =>
{...filterProps}
storyId={story.id}
{...interactiveState}
docsLang={parameters?.docs?.lang}
/>
);
};
Expand Down Expand Up @@ -187,6 +192,7 @@ const DocgenServiceControls: FC<ControlsStoryProps> = ({ story, context, ...prop
{...filterProps}
storyId={story.id}
{...interactiveState}
docsLang={parameters?.docs?.lang}
/>
);
};
Expand Down
40 changes: 30 additions & 10 deletions code/addons/docs/src/blocks/blocks/Description.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import { InvalidBlockOfPropError } from 'storybook/internal/preview-errors';

import { DocsContext } from './DocsContext';
import { Markdown } from './Markdown';
import type { Of } from './useOf';
import { useOf } from './useOf';
import { useServiceDocgen } from './use-service-docgen.ts';
import { useServiceStoryDoc } from './use-service-story-docs.ts';
import type { Of } from './useOf';
import { useOf } from './useOf';
import { withMdxComponentOverride } from './with-mdx-component-override';

export enum DescriptionType {
Expand Down Expand Up @@ -78,45 +78,58 @@ type ResolvedOf = ReturnType<typeof useOf>;
const DescriptionBody: FC<{
resolvedOf: ResolvedOf;
serviceComponentDescription?: string;
lang?: string;
storyDocsDescription?: string | null;
}> = ({ resolvedOf, serviceComponentDescription, storyDocsDescription }) => {
}> = ({ resolvedOf, serviceComponentDescription, lang, storyDocsDescription }) => {
const markdown = getDescriptionFromResolvedOf(
resolvedOf,
serviceComponentDescription,
storyDocsDescription
);

return markdown ? <Markdown>{markdown}</Markdown> : null;
return markdown ? <Markdown lang={lang}>{markdown}</Markdown> : null;
};

const DescriptionStoryWithServices: FC<{ resolvedOf: Extract<ResolvedOf, { type: 'story' }> }> = ({
resolvedOf,
}) => {
const DescriptionStoryWithServices: FC<{
resolvedOf: Extract<ResolvedOf, { type: 'story' }>;
}> = ({ resolvedOf }) => {
const storyDocsDescription = useServiceStoryDoc(resolvedOf.story.id).data?.description;
return <DescriptionBody resolvedOf={resolvedOf} storyDocsDescription={storyDocsDescription} />;
const lang = resolvedOf.story.parameters.docs?.lang || 'en';
return (
<DescriptionBody
resolvedOf={resolvedOf}
storyDocsDescription={storyDocsDescription}
lang={lang}
/>
);
};

const DescriptionComponentWithServices: FC<{
resolvedOf: Extract<ResolvedOf, { type: 'meta' | 'component' }>;
componentId: string;
}> = ({ resolvedOf, componentId }) => {
const serviceComponentDescription = useServiceDocgen(componentId).data?.description || undefined;
const lang =
resolvedOf.type === 'meta'
? resolvedOf.preparedMeta.parameters.docs?.lang || 'en'
: resolvedOf.projectAnnotations.parameters?.docs?.lang || 'en';
return (
<DescriptionBody
resolvedOf={resolvedOf}
serviceComponentDescription={serviceComponentDescription}
lang={lang}
/>
);
};

const DescriptionImpl: FC<DescriptionProps> = (props) => {
const { of } = props;
const context = useContext(DocsContext);

if ('of' in props && of === undefined) {
throw new InvalidBlockOfPropError();
}
const resolvedOf = useOf(of || 'meta');
const context = useContext(DocsContext);

// The docgen service contributes a fallback description, but its two sources need different hooks
// (story-docs by story id, docgen by component id), so each lives in its own child component to
Expand All @@ -137,7 +150,14 @@ const DescriptionImpl: FC<DescriptionProps> = (props) => {
}
}

return <DescriptionBody resolvedOf={resolvedOf} />;
const parameters =
resolvedOf.type === 'story'
? resolvedOf.story.parameters
: resolvedOf.type === 'meta'
? resolvedOf.preparedMeta.parameters
: resolvedOf.projectAnnotations.parameters;
const lang = parameters?.docs?.lang || 'en';
return <DescriptionBody resolvedOf={resolvedOf} lang={lang} />;
};

export const Description = withMdxComponentOverride('Description', DescriptionImpl);
10 changes: 8 additions & 2 deletions code/addons/docs/src/blocks/blocks/DocsContainer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import React, { useEffect, useMemo } from 'react';
import type { Renderer } from 'storybook/internal/types';

import type { ThemeVars } from 'storybook/theming';
import { ThemeProvider, ensure as ensureTheme } from 'storybook/theming';
import { ensure as ensureTheme, ThemeProvider } from 'storybook/theming';

import { DocsPageWrapper } from '../components';
import { TableOfContents } from '../components/TableOfContents';
Expand All @@ -28,13 +28,18 @@ export const DocsContainer: FC<PropsWithChildren<DocsContainerProps>> = ({
}) => {
const slugger = useMemo(() => createDocsSlugger(), []);
let toc;
// Language of docs prose (descriptions, ArgTypes description cells, free MDX prose).
let lang;

try {
const meta = context.resolveOf('meta', ['meta']);
toc = meta.preparedMeta.parameters?.docs?.toc;
const metaParameters = meta.preparedMeta.parameters;
toc = metaParameters?.docs?.toc;
lang = metaParameters?.docs?.lang || 'en';
} catch (err) {
// No meta, falling back to project annotations
toc = context?.projectAnnotations?.parameters?.docs?.toc;
lang = context?.projectAnnotations?.parameters?.docs?.lang || 'en';
}

useEffect(() => {
Expand All @@ -61,6 +66,7 @@ export const DocsContainer: FC<PropsWithChildren<DocsContainerProps>> = ({
<SourceContainer channel={context.channel}>
<ThemeProvider theme={ensureTheme(theme as ThemeVars)}>
<DocsPageWrapper
lang={lang}
toc={
toc ? (
<TableOfContents
Expand Down
Loading
Loading