* feat(create): show a loading placeholder for the customizer and preview
* fix(create): render the placeholder as the suspense fallback so it prerenders
* feat(create): default design system config to base ui
* feat(www): default docs and init to base ui
* feat(www): default preview styles to base-nova
* feat(shadcn): default init and prompts to base ui
* docs: default to base ui in guides and examples
* docs: add changelog
* chore: changeset
* fix: address base ui default review findings
* fix: init handling
* feat: add migrate-radix-to-base skills
* fix: typo
* fix(create): prevent customizer reset when template query param is set
Use shallow nuqs updates and remove racing picker effects so selections
persist on /create?template=start. Sync preset to URL once across hook
instances and add regression tests for preset URL encoding.
Fixes#11060
* fix(create): apply undo/redo via shallow preset update
Undo/redo went through router.replace, which triggers a full server
navigation that resets the preset on prod (#11060). Route it through the
shared shallow search-params update instead, and keep the useSearchParams
reader so the transient values nuqs emits mid-update are not recorded as
phantom history entries.
* fix(create): satisfy typecheck and prettier in search-params test
Add the required `template` field to the first buildPresetUrlUpdate
fixture so it matches DesignSystemSearchParams, and apply prettier
formatting to search-params.ts and its test (both were failing
format:check).
---------
Co-authored-by: shadcn <m@shadcn.com>
* refactor(base-drawer): rewrite base drawer wrapper for @base-ui/react/drawer
Replace vaul with @base-ui/react/drawer as the primitive behind the
base drawer wrapper.
Keep the public API aligned with the radix drawer shape while
rewriting DrawerContent to compose Backdrop, Viewport, Popup, and
Content internally.
Keep the registry dependency change in the same commit so the wrapper
rewrite lands as one source-level migration step.
* refactor(drawer): move shared drawer direction rules from stylesheets to primitives
Shared drawer styles previously owned direction-specific layout in CSS.
With base and radix now exposing different direction attributes,
keeping that logic in shared tokens would duplicate primitive-specific
branching in the stylesheets.
Move direction-specific layout into the base/radix drawer wrappers and
leave shared CSS responsible only for visual surface styling.
Also move handle visibility and header alignment into TSX, and unify
the shared drawer token names to cn-drawer-*.
* fix(base-drawer): migrate examples, blocks, and app consumers to render and swipeDirection
Update in-repo base drawer consumers to the new wrapper API.
Replace asChild usage with render, switch direction to swipeDirection,
and align examples, blocks, app consumers, and docs with the new
base drawer usage pattern.
* chore: update registries
* fix(drawer): update base marker example usage
* fix(drawer): clean up base style selectors
* docs: add migration docs
* wip
* fix: nested
* feat: drawer
* fix
* fix
* fix
* fix: pointer events
* fix: clean up radix drawers
* fix: position
---------
Co-authored-by: shadcn <m@shadcn.com>
* feat(@shadcn/react): add message-scroller package
Add the @shadcn/react headless primitives package with MessageScroller
scroll anchoring, streaming follow, history prepend, and jump-to-message
behavior. Includes geometry helpers, use-render utility, and unit,
browser, and perf tests.
* feat(registry): add chat components
Add MessageScroller, Message, Bubble, Attachment, and Marker registry
sources for base and radix, style variants, preview-03 chat blocks,
and registry index wiring.
* feat(v4): integrate chat components into docs site
Wire chat components into the v4 app with docs routes, example preview
pages, message part renderers, markdown support, registry build updates,
and supporting lib utilities.
* feat(examples): add chat component demos
Add base and radix example demos for MessageScroller, Message, Bubble,
Attachment, Marker, scroll-fade, and shimmer.
* docs: add chat component documentation
Add component and utility docs for the chat component set, update docs
navigation, and add the June 2026 chat components changelog entry.
* chore: regenerate registry JSON output
Rebuild public registry artifacts for all style variants with the new
chat components.
* chore(release): add @shadcn/react publish and CI pipeline
Add Changesets prerelease workflow, browser test job, RELEASING docs,
and monorepo wiring for publishing @shadcn/react independently from
the shadcn CLI.
* docs: fix display of component preview on mobile
* fix
* fix
* docs: add message scroller docs
* style: format
* fix
* fix(v4): update homepage mobile demo fallback images
Replace registry dashboard screenshots with compressed CardsDemo captures and narrow the mobile bleed width to 140vw.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(v4): remove container-wrapper padding on homepage
Use p-0 on the demo section wrapper so the mobile preview image aligns flush without extra horizontal inset.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(v4): drop redundant md:p-0 on homepage wrapper
Co-authored-by: Cursor <cursoragent@cursor.com>
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
The <ComponentsList /> tag on /docs/components was emitted as-is by
the Copy Page button and the /llm/[slug] markdown endpoint because
getComponentsList() walked components.children for pages directly.
After #9304 restructured the folder into components/radix/ and
components/base/ subfolders, the filter always returned [] and the
tag was replaced with an empty string (or, in the copy-page case,
never replaced at all).
- Reuse getPagesFromFolder() from lib/page-tree so the walker stays
in sync with the on-screen ComponentsList React component.
- Match the existing llms.txt format: flat absolute URLs (the
/docs/components/:name -> /docs/components/radix/:name redirect in
next.config.mjs is the canonical form) plus the frontmatter
description pulled via source.getPage() on each page.
- Export replaceComponentsList() and call it from
docs/[[...slug]]/page.tsx so the Copy Page button goes through the
same replacement path as processMdxForLLMs.