* chore(v4): stop tracking generated styles
Phase 2 of generated-output untracking (follows #11189). The compiled
style sources under apps/v4/styles (base-*/radix-*, ~1,080 files) are
produced by registry:build (copyUIToStyles + RTL) on every deploy, so
the committed copies were redundant. Only styles/README.md stays
tracked.
Unlike public/r/styles, these are imported modules, so:
- code-check.yml: the typecheck job now runs
`registry:build --style all` (the fast targeted build) after
installing Bun, since v4 typecheck imports @/styles/*.
- next.config.mjs: fail fast in dev with the regeneration command when
the styles are missing, instead of a module-not-found cascade.
- .prettierignore: skip styles/ — targeted builds intentionally skip
prettier on generated output.
- turbo.json: declare public/r/styles/** and styles/** as build
outputs so a turbo cache replay of v4#build restores them (also
fixes a latent phase-1 gap where a cache hit could deploy without
registry JSON).
Fresh clones: run `pnpm --filter=v4 registry:build --style all` once
(~50s) before next dev; see styles/README.md.
* docs: document untracked generated styles in CONTRIBUTING
* fix(v4): register gitignored styles as tailwind sources
Tailwind v4's source detection skips gitignored files, so untracking
styles/ dropped every utility class that only appears in the generated
output — progress bars collapsed (h-1), radio indicators and bubble
radii lost their styles.
An explicit @source glob only overrides .gitignore when the path
through the ignored level is literal: ../styles/**/*.tsx gets pruned
at the ignored directory, while ../styles/base-nova/**/*.tsx is
scanned. Register each generated style explicitly. When adding a new
style, add a line here.
Verified byte-identical CSS output against an unrestricted scan.
public/r/styles output for new-york-v4 and the base-*/radix-* style
combinations is regenerated by registry:build on every deploy, so the
committed copies were redundant. Ignore them and drop them from the
index (~4,000 files).
Still tracked, since the build does not produce them:
- public/r/styles/index.json: static contract fetched by older CLIs
- public/r/styles/default, public/r/styles/new-york: frozen v3 styles
maintained by editing the JSON directly
calendar.test.ts now scans only those frozen styles for published JSON;
generated styles are covered by the source checks.
* refactor(create): consolidate create code into a single route group
Move all create code from app/(app)/create and app/(create) into the
nested route group app/(app)/(create), and the preview iframe pages
into app/(view). URLs are unchanged: /create keeps the (app) chrome
(and the header now persists across / <-> /create), /init keeps its
root-level path for the CLI contract, and /preview stays chrome-less
for the customizer iframe.
Registry sources and published payloads are untouched: two temporary
tsconfig path aliases map @/app/(create)/* and the legacy
@/app/(app)/create/* onto the new location. App code imports the real
path.
Also inline parse-config and build-instructions into the create lib so
the init routes are thin HTTP handlers, and remove the icon-placeholder
and lib re-export shims.
* fix
The tail spacer makes a freshly anchored turn read as "at the end", so
reconcileFollowMode re-armed following-bottom one frame after the anchor
placement and the first streamed chunk yanked the reader off the anchor.
Exclude the anchored-to-message hold from arming, matching the existing
settling-jump exclusion.
Claude-Session: https://claude.ai/code/session_0186fcQpHo1aLQC4wRpwKFFu
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
* 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(registry): add ai-elements components to new-york-v4
Adds attachment, bubble, marker, message, and message-scroller (registry:ui) to the new-york-v4 style, ported from radix-vega (also Radix-based, so non-breaking). Regenerates the runtime indexes (__index__.tsx, __components__.tsx) and the built catalog so they stay in sync.
* fix(registry): use resolved orientation for attachment variants
data-orientation used the normalized resolvedOrientation while the variant classes used the raw orientation prop, desyncing them when orientation is null. Use resolvedOrientation for both. Addresses Copilot review on #11051.
Add MessageScroller, Message, Bubble, Attachment, and Marker guidance,
driven by a baseline gap analysis: fresh agents hand-rolled all five
primitives, so this adds a rules/chat.md, discovery hooks in SKILL.md,
two evals, and supporting composition/styling rules.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The v4 app imports @shadcn/react/message-scroller, which resolves via the
package's built dist. CI is a fresh clone and registry:build only built
shadcn, so the import was unresolved and the dev server never compiled,
timing out the test job. Build @shadcn/react first.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
DropdownMenuLabel renders Base UI's Menu.GroupLabel, which throws
"MenuGroupContext is missing" (Base UI error #31) unless rendered inside
a Menu.Group. Wrap the label and items in DropdownMenuGroup so the
"Jump to..." menu opens without crashing.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>