Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); feat(swingset): add collapsible code footer to component examples by kylemac · Pull Request #8891 · clerk/javascript · GitHub
Skip to content

feat(swingset): add collapsible code footer to component examples - #8891

Merged
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer
Jun 17, 2026
Merged

feat(swingset): add collapsible code footer to component examples#8891
kylemac merged 1 commit into
mainfrom
kylemac/swingset-code-footer

Conversation

@kylemac

@kylemackylemac commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

TLDR

  • adds a collapsible "view code" footer to each code example in the components layer
CleanShot 2026-06-17 at 09 28 25@2x

Description

Adds a shadcn-style collapsible "code" footer to <Story> examples on the Components layer of the swingset docs app (Button, Input, Dialog, Heading, Tabs, Text). Each example is collapsed by default to a full-width "View code" toggle that expands with a height animation to reveal a clean usage snippet of that example. The snippet is derived by having each story module expose its own source via a ?raw self-import (wired through a webpack asset/source rule that also excludes ?raw from Next's SWC loader so the source isn't transpiled first); StoryEmbed then extracts the previewed story function and toUsageSnippet strips its knob-harness scaffolding ({...knobsAsProps(props)} and the function wrapper) down to the returned JSX. Shiki highlighting is shared with the existing CodeBlock via a new useShikiHtml hook, and the CLAUDE.md house-style guide is updated so the footer is added to every Components example going forward. To test: pnpm run dev:swingset and open /components/text (or any Components page) — each example shows a "View code" toggle that animates open.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

Summary by CodeRabbit

New Features

  • Story examples now display collapsible "View code" footers with syntax-highlighted source code
  • Added copy-to-clipboard button for easy code sharing

Documentation

  • Updated story authoring guidelines for component examples

Each `<Story>` example in the Components layer now renders a 'View code' footer that expands to show a clean usage snippet of the example. Story modules expose their own source via a `?raw` self-import; `StoryEmbed` extracts the previewed story function and strips its knob-harness scaffolding before display.
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 3071ac4

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Jun 17, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJun 17, 2026 1:26pm
swingsetReadyReadyPreview, CommentJun 17, 2026 1:26pm

Request Review

@coderabbitai

coderabbitaiBot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

📝 Walkthrough

Walkthrough

Adds an opt-in "View code" footer to Swingset story embeds. Story files self-export raw source via a ?raw webpack rule; a new toUsageSnippet utility normalises the source; a new CodeFooter component renders it with Shiki highlighting and copy-to-clipboard; StoryEmbed is refactored to wire these together.

Changes

Story code footer feature

Layer / File(s)Summary
StoryModule type contract and snippet extraction
packages/swingset/src/lib/types.ts, packages/swingset/src/lib/exampleSnippet.ts
StoryModule gains an optional __source?: string field and a broadened index signature. toUsageSnippet is added with unwrapReturn and dedent helpers to convert raw story function source into a clean JSX snippet.
Webpack ?raw loader configuration
packages/swingset/next.config.mjs
A recursive excludeRawQuery helper injects resourceQuery.not: /raw/ into all non-asset/source webpack rules, and an explicit asset/source rule is appended for ?raw requests so story files are served as untransformed bytes.
Shared Shiki hook and CodeFooter component
packages/swingset/src/components/CodeBlock.tsx, packages/swingset/src/components/CodeFooter.tsx
Shiki rendering is factored out of CodeBlock into an exported useShikiHtml(code, lang) hook. New CodeFooter uses this hook to render a collapsible panel with syntax-highlighted source, animated transitions, and a copy-to-clipboard button.
StoryEmbed refactor and CodeFooter wiring
packages/swingset/src/components/StoryEmbed.tsx
StoryEmbed is reworked to always render a single preview container, extract storyModule.__source into a usage snippet via extractStorySource/toUsageSnippet, conditionally render CodeFooter, and delegate composition collapsing to a new internal CompositionFooter component.
Story opt-ins, docs, and changeset
packages/swingset/src/stories/*.stories.tsx, packages/swingset/CLAUDE.md, .changeset/swingset-code-footer.md
Six story files each add export { default as __source } from './<file>?raw'. CLAUDE.md gains authoring instructions and a before-you-finish checklist for the __source requirement. The changeset entry is added.

Sequence Diagram(s)

sequenceDiagram
participant Browser
participant StoryEmbed
participant exampleSnippet as toUsageSnippet
participant CodeFooter
participant useShikiHtml
participant Shiki
Browser->>StoryEmbed: render <Story name="X" />
StoryEmbed->>exampleSnippet: extractStorySource(__source, name) → fnSource
exampleSnippet-->>StoryEmbed: toUsageSnippet(fnSource) → snippet
StoryEmbed->>CodeFooter: source=snippet
CodeFooter->>useShikiHtml: code, lang="tsx"
useShikiHtml->>Shiki: codeToHtml()
Shiki-->>useShikiHtml: highlighted HTML
useShikiHtml-->>CodeFooter: html state
CodeFooter-->>Browser: collapsible "View code" footer
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • clerk/javascript#8797: Touches StoryEmbed.tsx and CodeBlock.tsx in the same Swingset rendering pipeline that this PR extends with CodeFooter and __source wiring.

Suggested labels

ui

Suggested reviewers

  • prestonwebdev
  • alexcarpenter

🐇 A footer appears, collapsible and bright,
With code all highlighted, a developer's delight!
I hop through the stories—each snippet revealed,
?raw bytes delivered, Shiki-rendered, and healed.
Press "Copy" and hop on—the source is your guide! 🌿

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 45.45% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Title check✅ PassedThe title accurately summarizes the main feature: adding a collapsible code footer to component examples in swingset, which matches all the changes in the changeset.
Linked Issues check✅ PassedCheck skipped because no linked issues were found for this pull request.
Out of Scope Changes check✅ PassedCheck skipped because no linked issues were found for this pull request.
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands and usage tips.

@pkg-pr-new

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@8891

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@8891

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@8891

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@8891

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@8891

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@8891

@clerk/express

npm i https://pkg.pr.new/@clerk/express@8891

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@8891

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8891

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@8891

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@8891

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@8891

@clerk/react

npm i https://pkg.pr.new/@clerk/react@8891

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@8891

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@8891

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@8891

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@8891

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@8891

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@8891

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@8891

commit: 3071ac4

@kylemac
kylemac enabled auto-merge (squash) June 17, 2026 13:32
@kylemac
kylemac merged commit 34586f1 into mainJun 17, 2026
52 of 53 checks passed
@kylemac
kylemac deleted the kylemac/swingset-code-footer branch June 17, 2026 13:34
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@kylemac@alexcarpenter