fix: address audit findings ahead of next -> main merge - #83
Merged
Merged
Conversation
Fixes surfaced by a full component/docs audit ahead of the next -> main merge: broken installation links, leftover Tailwind styling in an unstyled primitive demo, the virtualizer/virtualized naming mismatch across demos and docs, a stale changelog section on the timeline page, nova styling drift in dropzone and phone-input, a dead null-check in useVirtualized(), missing Accessibility sections on confirmer and wheel-picker docs, and a registry:validate script for local registry checks. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The previous commit picked up only the virtualizer->virtualized file renames; the accompanying content edits (naming, docs, styling, and the registry:validate script) were left unstaged by a lint-staged stash/restore hiccup. This commit lands that content. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Contributor
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The guard is unreachable in isolation (VirtualizedContext's default is a real object, never null), but sortable.tsx's useSortable() has the identical shape and every other "must be used within" hook in the registry follows the same throw-guard pattern. Removing it only here broke consistency rather than fixing a real bug. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Drop DropzoneGroup, DropzoneTitle, DropzoneDescription and DropzoneUploadIcon in favor of shadcn/ui's Empty component. Dropzone now covers only the interactive parts; the zone's icon, title and description are composed with Empty/EmptyHeader/EmptyMedia/EmptyTitle/EmptyDescription. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Restore DropzoneUploadIcon as a thin, behavior-only wrapper. The icon swap reads the primitive's drag context (DragAccepted/DragRejected/ DragDefault), so it's genuine Dropzone behavior rather than styling Empty owns — the same principle DatePicker follows when it wraps Calendar/DateField to bind primitive context. Title and description stay composed with Empty directly. Demos, docs and the changelog now render the icon via <EmptyMedia variant="icon"><DropzoneUploadIcon /></EmptyMedia> instead of inlining the primitive drag-state blocks. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…orting Drop the thin re-export wrappers that only renamed a data-slot without adding behavior, styling, or a composed default — these are better composed from the outside, matching how Date Picker already composes InputGroup and Calendar directly. - password-input: remove PasswordInputAdornment and the unused PasswordInputAdornmentButton; demos compose InputGroupAddon directly - phone-input: remove PhoneInputCountrySelectTrigger; demos compose the styled SelectTrigger directly - docs: update Usage, Accessibility and API Reference accordingly Behavioral wrappers (PhoneInputCountrySelect/Value/Content, the toggle, etc.) are unchanged — they wire context, styling or defaults and stay. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Capture the project philosophy and API-design rules as the default prompt for agents and contributors: ui-x as a natural extension of shadcn (not a fork), Base UI + base-nova only, the primitive/styled two-layer architecture, and — front and center — the wrapping principle (wrap + re-export only for behavior/styling/composed defaults; compose cosmetic parts from the outside) that the component audit produced. Also add .mcp.json so agents get live shadcn registry access. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Not every component is primitive + styled: document the three real shapes (styled composition, primitive+styled, library-adapter primitive). - Lead with the library-first philosophy — lean on popular headless libraries (react-dropzone, react-phone-number-input, timescape, …) and only author behavior on Base UI when none fits. - Reframe "Base UI only" as "Base UI, not Radix" (we do use domain libs). - Trim verbosity and soften the rulebook tone into principles + a short hard-rules list. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Addresses the consolidated findings from the full component/docs audit run against draft PR #82 (
next->main, not yet merged) before that merge is finalized.phone-input-primitive-preferred-countrydemo (primitives stay unstyled)virtualizer-*demo files, exported function names, and the/docs/utilities/virtualizerpage tovirtualizedto match the shipped<Virtualized />component naming## Changelogsection fromtimeline.mdxrounded-lg/ring-3) indropzone.tsxand staleSelectItemclassNames inphone-input.tsx## Accessibilitysections toconfirmer.mdxandwheel-picker.mdx(leftdescription-list.mdxwithout one — it's a plain semantic<dl>wrapper with no interactive/ARIA behavior to document)virtualized.tsx'suseVirtualized()— the context always has a valid default, so the guard could never fireregistry:validatescript toapps/v4/package.jsonsoapps/v4/registry.jsoncan be validated locally, matching the CIregistry-validateworkflowTest plan
npx tsc --noEmitpasses with no errorspnpm lintpasses with 0 errors (7 pre-existing warnings in unrelated files)pnpm registry:validatereports the registry as validvirtualizerreferences remain outside ofvirtua's ownVirtualizerHandlenaming🤖 Generated with Claude Code