VI
Total Points
720
All time
Total Activities
445
All time
Activity Types
8
Different types
Activity Overview
372 contributions in the last year
Jul
Aug
Sep
Oct
Nov
Dec
Jan
Feb
Mar
Apr
May
Jun
Jul
Mon
Wed
Fri
Less
More
Achievements
7 badges earnedPoints Milestone
Awarded for reaching points milestones
2 / 3 tiers earned
bronze
100+ points
silver
500+ points
gold
1,000+ points
Consistency Champion
Awarded for maintaining activity streaks
2 / 3 tiers earned
bronze
7 day streak
silver
14 day streak
gold
30 day streak
Activity Milestone
Awarded for reaching activity count milestones
3 / 4 tiers earned
bronze
10+ activities
silver
50+ activities
gold
100+ activities
platinum
500+ activities
Activity Breakdown
365 total activities · 720 total points
Commit Created
277 (75.9%)·554 pts
Issue Opened
29 (7.9%)·58 pts
PR Merged
10 (2.7%)·50 pts
Issue Assigned
29 (7.9%)·29 pts
PR Reviewed
9 (2.5%)·18 pts
PR Opened
11 (3.0%)·11 pts
365
Total Activities
720
Total Points
6
Activity Types
2.0
Avg Points/Activity
Activity Timeline
57 of 445 activities· 1 of 27 months
July 202657 activities
Commit Created+2
docs: remove remaining Radix references from docs and demos
- Update install instructions in registry docs (checkbox, collapsible,
context-menu, dialog, dropdown-menu, popover, radio-group,
scroll-area, separator, sheet, switch, tooltip, button-group,
sidebar) from 'radix-ui' to '@base-ui/react'.
- Fix stale @dependencies JSDoc in field.tsx, combobox.tsx, command.tsx
that still referenced radix-ui/vaul; regenerate registry JSON.
- Update Get Started, Accessibility, and documentation.ts prose to
credit Base UI instead of Radix for accessibility primitives and
focus-trap behavior.
- Replace dead --radix-dropdown-menu-*/--radix-popover-* CSS vars
(never set by Base UI) with --anchor-width/--available-height in
filters.tsx, sidebar.tsx, sidebar-01-demo.tsx, nav-user.tsx, and
inner-page-01.tsx.
Commit Created+2
chore: complete Radix -> Base UI migration
- Flip components.json style from radix-vega to base-vega
- Remove radix-ui dependency from package.json, pnpm install to sync
the lockfile and prune it from node_modules
- Delete src/components/careui/button.tsx and menubar.tsx: confirmed
unused orphaned duplicates (not imported anywhere, not part of the
active registry) that still imported radix-ui directly and would
have broken compilation once the package was removed
Verified after this change:
- npx tsc -b --noEmit: clean
- pnpm lint: clean (same 3 pre-existing unrelated warnings as before)
- pnpm run build: succeeds
- pnpm run build:registry: no diff (registry already in sync)
- grep -rl 'from "radix-ui"' src/: zero matches anywhere in the project
This is the final step of the progressive Radix -> Base UI migration
covering all 32 active registry components (see .migration/*.md for
the full per-component history).
Commit Created+2
refactor(studio-sidebar): migrate 5 Slot/asChild parts to useRender
- Replace radix-ui Slot with @base-ui/react's useRender across
SidebarGroupLabel, SidebarGroupAction, SidebarMenuButton,
SidebarMenuAction, SidebarMenuSubButton
- Drop asChild entirely (render-only): zero usages found anywhere
for this component (used only by App.tsx/app-sidebar.tsx/search-form.tsx,
none pass asChild)
- Same literal-data-attribute design as sidebar.tsx (not via state)
for consistency and to avoid the same data-active value risk
- Update @dependencies JSDoc tag, regenerate registry JSON
- Add .migration/studio-sidebar.md report
This is the last component on Radix in src/components/ui -- 0 files
remain. Flagging the components.json style flip (radix-vega ->
base-vega) and radix-ui package removal as a separate, explicit
decision, not bundled into this commit.
Commit Created+2
refactor(sidebar): migrate 5 Slot/asChild parts to useRender
- Replace radix-ui Slot with @base-ui/react's useRender across
SidebarGroupLabel, SidebarGroupAction, SidebarMenuButton,
SidebarMenuAction, SidebarMenuSubButton
- Keep asChild compat shim only on SidebarMenuButton/SidebarMenuSubButton
(real usage in nav-main.tsx/nav-projects.tsx/nav-secondary.tsx/
lib/registry/sidebar.tsx); drop it cleanly on the other 3 (zero usage)
- Keep data-slot/data-sidebar/data-size/data-active as literal
attributes, NOT via useRender's state param: verified a real
consumer selector (data-[active=true]:font-medium) depends on the
exact string value, which state-based conversion would silently
break (data-active="" instead of data-active="true")
- Drop mergeProps (TypeScript rejects data-* keys in its strict
generic); use plain object spread instead, since props never
actually conflicts with the explicit attributes
- Update @dependencies JSDoc tag, regenerate registry JSON
- Add .migration/sidebar.md report
Commit Created+2
refactor(item): migrate Item off Slot/asChild
- Replace radix-ui Slot with useRender + mergeProps
- Keep asChild compat shim: 4 real usages in docs render Item as a
link (- ...)
- data-slot/data-variant/data-size via useRender's state param;
verified identical output to prior literal attributes since both
are string values (only booleans differ under state conversion)
- Update @dependencies JSDoc tag, regenerate registry JSON
- Add .migration/item.md report
Commit Created+2
refactor(button-group): migrate ButtonGroupText off Slot/asChild
- Replace radix-ui Slot with useRender + mergeProps (matches golden
base-vega ButtonGroupText exactly)
- No asChild compat shim: zero real usages found anywhere in the repo
- Adds data-slot="button-group-text" (previously missing, matching
every other part in this file; purely additive)
- Update @dependencies JSDoc tag, regenerate registry JSON
- Add .migration/button-group.md report
Commit Created+2
refactor(collapsible): migrate to Base UI
- Switch primitives from radix-ui to @base-ui/react/collapsible
- Rename CollapsibleTrigger/CollapsibleContent parts to Trigger/Panel
- Add asChild compat shim on both Root and Trigger (real consumers use
asChild on the Root itself, e.g. nav-main.tsx/sidebar.tsx)
- Fix 3 real consumer data-attribute selectors after verifying the
actual runtime behavior against installed @base-ui/react source
(not just the reference doc or official example, which disagreed):
CollapsibleRoot emits data-open/data-closed on itself;
CollapsibleTrigger emits only data-panel-open. Updated
nav-main.tsx, lib/registry/collapsible.tsx (6 occurrences), and
lib/registry/sidebar.tsx accordingly
- Regenerate registry JSON
- Add .migration/collapsible.md report
Flagged (not fixed, out of scope): lib/registry/sidebar.tsx has 3
likely-dead data-[state=open] selectors tied to the already-migrated
dropdown-menu.tsx, discovered while investigating this component but
belonging to that migration instead.
Commit Created+2
refactor(navigation-menu): migrate to Base UI
- Swap radix-ui import for @base-ui/react/navigation-menu: the
biggest structural rewrite in this batch. viewport boolean prop
dropped entirely; NavigationMenuViewport replaced by
NavigationMenuPositioner (Portal>Positioner>Popup>Viewport), always
mounted unconditionally in Root instead of Radix's
below-the-list-viewport toggle
- NavigationMenuIndicator now wraps Icon instead of .Indicator (Base
UI's Icon is a different concept, a chevron inside the Trigger, not
a tracker below the list) - unused by the one consumer here
- NavigationMenuLink gains the standard asChild -> render compat shim
- No consumer changes needed (viewport prop and
NavigationMenuViewport/Indicator aren't used anywhere in this repo)
- Verified live: menu open, animated content-swap between two
different triggers, and chevron rotation all confirmed working,
zero console errors
- Regenerate registry JSON, add .migration/navigation-menu.md report
Commit Created+2
refactor(menubar): migrate to Base UI
- Swap radix-ui import for @base-ui/react/menu (shared parts) +
@base-ui/react/menubar (the Root container, single-part callable)
- Deliberately kept self-contained on MenuPrimitive rather than
composing this project's dropdown-menu.tsx (which the shadcn golden
does): dropdown-menu.tsx here is customized with larger responsive
item sizing, and composing it would have silently leaked that sizing
into menubar's independently-sized, smaller items
- Part renames (exported names unchanged): Label -> GroupLabel,
ItemIndicator splits per item type, Sub -> SubmenuRoot, SubTrigger ->
SubmenuTrigger; SubContent composes the file's own MenubarContent
- No consumer changes needed (Root's dropped value/onValueChange
system and loop prop aren't used; the one consumer never uses
MenubarLabel)
- Verified live: hover-switching between menus, submenus, and a radio
group all confirmed working, zero console errors
- Regenerate registry JSON, add .migration/menubar.md report
Commit Created+2
refactor(context-menu): migrate to Base UI
- Swap radix-ui import for @base-ui/react/context-menu (shares the
Menu part set with dropdown-menu): Content -> Portal>Positioner>Popup,
Label -> GroupLabel, ItemIndicator splits per item type, Sub ->
SubmenuRoot, SubTrigger -> SubmenuTrigger; SubContent stays a true
minimal compose (side="right" + shadow-lg only)
- The wrapper's own `side` prop was silently dead under Radix
(ContextMenu.Content has no positioning props at all); Base UI's
Positioner makes it genuinely functional now, with no observed
behavior change since no consumer passed it
- Confirmed the two hard Base UI drops (Root has no modal,
Trigger has no disabled) aren't used anywhere in this repo
- No consumer changes needed; the one demo file already wrapped every
ContextMenuLabel in a ContextMenuGroup
- Verified live: right-click menu, submenu, checkbox/radio items, and
destructive styling all confirmed working, zero console errors
- Regenerate registry JSON, add .migration/context-menu.md report
Commit Created+2
refactor(dropdown-menu): migrate to Base UI
- Swap radix-ui import for @base-ui/react/menu (Radix DropdownMenu ->
Base UI Menu): Content -> Portal>Positioner>Popup, Label ->
GroupLabel, ItemIndicator splits into CheckboxItemIndicator/
RadioItemIndicator, Sub -> SubmenuRoot, SubTrigger -> SubmenuTrigger;
SubContent now composes DropdownMenuContent (matches the shadcn
golden's own SubContent shape)
- DropdownMenuTrigger gains the standard asChild -> render compat shim
(21+ call sites across the app)
- onSelect -> onClick + closeOnClick (restructure, not rename): fixed
14 call sites in the docs demo and 1 in filters.tsx; the 4
CheckboxItem occurrences became pure no-ops (closeOnClick already
defaults false there) and were removed outright, the rest got
explicit closeOnClick to replicate the old preventDefault-to-stay-open
behavior
- Caught live, not by typecheck: Base UI's GroupLabel throws at
runtime unless rendered inside a Group. Wrapped every bare
in across 8 files
(inner-page-01.tsx, sidebar-01.tsx, data-table.tsx,
sidebar-01-demo.tsx, sidebar.tsx, and 9 spots in the docs demo)
- Verified live: every menu trigger, submenu positioning, and
checkbox-item stay-open behavior confirmed working, zero console
errors
- Regenerate registry JSON, add .migration/dropdown-menu.md report
Commit Created+2
refactor(hover-card): migrate to Base UI's Preview Card
- Swap radix-ui import for @base-ui/react/preview-card (renamed
primitive; exported wrapper names HoverCard/HoverCardTrigger/
HoverCardContent kept unchanged for consumers)
- HoverCardTrigger gains the standard asChild -> render compat shim
- Fix the one consumer: openDelay/closeDelay move from Root to
Trigger as delay/closeDelay (both the main and "Sides" demo, display
code strings and executable previews)
- Regenerate registry JSON, add .migration/hover-card.md report
Commit Created+2
refactor(popover): migrate to Base UI
- Swap radix-ui import for @base-ui/react/popover: Content ->
Portal>Positioner>Popup, PopoverAnchor dropped entirely (Base UI has
no Anchor part, replaced by a Positioner anchor prop; unused here)
- PopoverTrigger gains the standard asChild -> render compat shim
(initially migrated as a bare passthrough; typecheck immediately
caught 12 broken asChild call sites across the app, confirming the
shim was needed)
- PopoverTitle/PopoverDescription now render real Base UI Title/
Description primitives instead of plain div/p (new a11y wiring,
Radix's Popover never had these parts)
- Fix filters.tsx's "Saved filters" popover: onOpenAutoFocus (focus
the popup container itself, not an input) -> initialFocus via a ref
attached to the now ref-forwarding PopoverContent
- Regenerate registry JSON, add .migration/popover.md report
Commit Created+2
fix(sheet): regenerate registry JSON to include the useEffect refs fix
The registry JSON for sheet was generated before the eslint
react-hooks/refs fix (writing to refs during render -> useEffect) was
applied to the source, so it had gone stale relative to the committed
source file. No source changes here, just re-syncing the generated
artifact.
Commit Created+2
refactor(sheet): migrate to Base UI
- Swap radix-ui import for @base-ui/react/dialog (Sheet is built on
the Dialog family): Overlay -> Backdrop, Content -> Popup
- Outside-dismiss blocking restructured: moved from Content-level
onInteractOutside/onPointerDownOutside to a Root-level onOpenChange
interception, bridged via always-latest refs since `dismissible` is
a Content-level prop but onOpenChange is now Root-only
- onOpenAutoFocus -> initialFocus (same restructure as dialog.tsx),
preserving the mobile-skip-autofocus behavior
- All custom behavior (shake-on-blocked-dismiss, scroll-collapsing
header, viewport-aware sizing) verified live and unchanged
- No consumer changes needed
- Regenerate registry JSON, add .migration/sheet.md report
Commit Created+2
refactor(dialog): migrate to Base UI
- Swap radix-ui import for @base-ui/react/dialog: Overlay -> Backdrop,
Content -> Popup (exported names unchanged); DialogTrigger/DialogClose
gain the standard asChild -> render compat shim (101+ call sites
project-wide use asChild)
- onOpenAutoFocus -> initialFocus, restructured not renamed: attached a
ref to Popup and default initialFocus to a function that queries it
for the first enabled input, reproducing the original
auto-focus-first-input behavior exactly (verified live)
- Preserve the project's own inner-div layout (innerClassName) and
header-embedded close button unchanged
- Fix command.tsx's CommandDialogProps: it inherited
React.ComponentProps wholesale, which now conflicts
with also passing the same children/onOpenChange into (a
separately-typed sibling); narrowed to a boolean-only onOpenChange
and plain ReactNode children (no runtime behavior change, command.tsx
itself remains untouched cmdk code)
- Regenerate registry JSON, add .migration/dialog.md report
Commit Created+2
refactor(select): migrate to Base UI
- Swap radix-ui import for @base-ui/react/select: restructured onto
the positioner model (Content -> Portal>Positioner>Popup), position
prop dropped in favor of alignItemWithTrigger, Viewport -> List,
Label -> GroupLabel, ScrollUpButton/ScrollDownButton ->
ScrollUpArrow/ScrollDownArrow, Select itself becomes a bare re-export
(SelectPrimitive.Root.Props is generic and breaks the usual
ComponentProps pattern)
- Preserve the project's own larger trigger/item sizing and responsive
breakpoints
- Fix one consumer (lib/registry/button-group.tsx's currency selector):
the bare-re-export Select has no explicit generic here, so
onValueChange's value typed as unknown; cast to string
- Regenerate registry JSON, add .migration/select.md report
Commit Created+2
refactor(breadcrumb): migrate BreadcrumbLink off Slot/asChild
- This file only ever imported Slot from radix-ui (not a stateful
Radix primitive); replaced the asChild ? Slot.Root : "a" idiom with
useRender + mergeProps, matching the badge.tsx precedent for
non-button polymorphic components
- Preserve the project's own soft-background/soft-foreground link and
page styling unchanged
- Update the docs "Link component" example's prose (asChild -> render)
- Regenerate registry JSON, add .migration/breadcrumb.md report
Commit Created+2
refactor(tabs): migrate to Base UI
- Swap radix-ui import for @base-ui/react/tabs (Trigger -> Tab,
Content -> Panel; exported names unchanged)
- Preserve the project's own browser-style third variant, larger
dimensions, and custom active-tab indicator colors; merged the one
real upstream delta (added aria-disabled hook) onto the customized
classes
- Flagged, not patched: Base UI defaults to manual tab activation
(arrow-key focus no longer auto-switches the panel), a behavior
change from Radix's automatic default
- No consumer changes needed
- Regenerate registry JSON, add .migration/tabs.md report
Commit Created+2
refactor(scroll-area): migrate to Base UI
- Swap radix-ui import for @base-ui/react/scroll-area (direct 1:1,
ScrollAreaScrollbar/ScrollAreaThumb renamed to Scrollbar/Thumb)
- No consumer changes needed (the dropped type prop isn't used
anywhere in this repo)
- Regenerate registry JSON, add .migration/scroll-area.md report
Commit Created+2
refactor(progress): migrate to Base UI
- Swap radix-ui import for @base-ui/react/progress: restructured with
new Track/Label/Value sub-parts; Progress itself keeps the same
simple call shape (value/className/children) so existing
usage is unaffected
- Manual translateX() width calculation removed; Base UI's Indicator
computes it internally
- No consumer changes needed
- Regenerate registry JSON, add .migration/progress.md report
Commit Created+2
refactor(slider): migrate to Base UI
- Swap radix-ui import for @base-ui/react/slider: new required
Control part (Root > Control > Track > (Indicator, Thumb)),
Range -> Indicator rename, thumbAlignment="edge" added to match
Radix's original thumb-edge alignment
- value/defaultValue/onValueChange widen to number | number[] (a bare
number now means a single-thumb slider); fix 4 consumers whose
useState setters no longer satisfied the widened
onValueChange type: playground.tsx, lib/registry/filters.tsx,
lib/registry/progress.tsx, lib/registry/slider.tsx (both the display
code string and executable preview for the range-slider example)
- Regenerate registry JSON, add .migration/slider.md report
Commit Created+2
refactor(radio-group): migrate to Base UI
- Swap radix-ui import for @base-ui/react/radio-group +
@base-ui/react/radio: Base UI splits Radix's single RadioGroup
namespace into a standalone callable RadioGroup and a separate Radio
primitive (Root/Indicator)
- RadioGroupItem now renders Radio.Root internally (exported name
unchanged)
- No consumer changes needed (orientation prop, the one dropped prop,
isn't used anywhere in this repo)
- Regenerate registry JSON, add .migration/radio-group.md report
Commit Created+2
refactor(switch): migrate to Base UI
- Swap radix-ui import for @base-ui/react/switch (Root/Thumb parts
unchanged; checked/onCheckedChange/disabled/required/name/value all
unchanged prop names)
- Preserve the project's own larger sizing scale, responsive
breakpoints, and checked/unchecked thumb icons unchanged
- No consumer changes needed
- Regenerate registry JSON, add .migration/switch.md report
Commit Created+2
refactor(checkbox): migrate to Base UI
- Swap radix-ui import for @base-ui/react/checkbox (Root/Indicator
parts unchanged, Checkbox is not single-part-callable)
- Preserve the project's own size variant (default/md via cva) and
concrete lucide CheckIcon
- checked="indeterminate" -> separate indeterminate boolean prop
(Base UI split): fix 8 call sites in the data-table docs demo that
used the old combined Radix idiom for the "select all" header
checkbox, splitting into checked={allSelected} +
indeterminate={someSelected && !allSelected}
- Update the docs prop table (checked/onCheckedChange narrowed to
boolean, new indeterminate row)
- Regenerate registry JSON, add .migration/checkbox.md report
Commit Created+2
refactor(separator): migrate to Base UI
- Swap radix-ui import for @base-ui/react/separator (direct 1:1
mapping, Separator is a callable single-part primitive)
- Drop the decorative prop entirely (Base UI has no equivalent; no
consumer passed it explicitly)
- Preserve the project's own variant system (solid/dashed/inset/dotted
via cva) unchanged
- Remove the decorative row from the docs prop table
- Regenerate registry JSON, add .migration/separator.md report
Commit Created+2
refactor(toggle-group): migrate to Base UI
- Swap radix-ui import for @base-ui/react/toggle-group +
@base-ui/react/toggle
- ToggleGroupPrimitive.Root -> ToggleGroupPrimitive (callable
single-part primitive); ToggleGroupPrimitive.Item -> TogglePrimitive
(Base UI has no dedicated Item part: group items ARE Toggle
primitives)
- Customized wrapper (different default spacing, verbose
data-[orientation=vertical] selector instead of shadcn's
data-vertical shorthand, no has-data-[icon=...] utilities): merged
via git merge-file so all three customizations survived
- Corrected a bug in the live shadcn base-vega registry: its
ToggleGroupItem still uses data-[state=on]:bg-muted, but Base UI's
Toggle never emits data-state, only data-pressed (confirmed against
node_modules/@base-ui/react/toggle/ToggleDataAttributes.js).
Reproducing it verbatim would have silently broken the pressed
background highlight; used data-pressed:bg-muted instead
- Update the one demo consumer (lib/registry/toggle-group.tsx):
type="single" dropped entirely (Base UI ToggleGroup has no type
prop; multiple defaults to false, same as the old single mode)
- Regenerate registry JSON, add .migration/toggle-group.md report
- Verified live: dev server + headless browser click-through confirmed
press/highlight and single-select mutual exclusivity both work, no
console errors
Commit Created+2
refactor(toggle): migrate to Base UI
- Swap radix-ui import for @base-ui/react/toggle
- TogglePrimitive.Root -> TogglePrimitive (Base UI's Toggle is a
callable single-part primitive, no .Root)
- Customized wrapper (project's own size-variant padding scale, no
has-data-[icon=...] utilities from the shadcn default): merged via
git merge-file (radix-vega golden as ancestor, base-vega golden as
target) so the customization survived byte-for-byte
- Drop now-unused React import; keep pre-existing "use client"
directive as-is
- pressed/defaultPressed/onPressedChange/disabled and the
aria-pressed:bg-muted class hook are unchanged (Base UI's Toggle
sets a real aria-pressed attribute, confirmed against
node_modules/@base-ui/react/toggle/Toggle.js)
- Regenerate registry JSON, add .migration/toggle.md report
Commit Created+2
refactor(tooltip): migrate to Base UI
- Switch primitives from radix-ui to @base-ui/react/tooltip
- Restructure Content -> Portal > Positioner > Popup per the positioner
model; side/sideOffset/align/alignOffset move to Positioner
- TooltipTrigger keeps an asChild compat prop translated to render via
a local resolveAsChild helper, matching the alert-dialog.tsx/drawer.tsx/
button.tsx precedent (101+ asChild call sites project-wide)
- TooltipProvider delayDuration -> delay (straight rename, no compat
shim needed): update call sites in sidebar.tsx, filters.tsx, and
button-group.tsx docs demo
- Update docs prop table (delayDuration -> delay)
- Regenerate registry JSON (tooltip, sidebar, filters, index)
- Add .migration/tooltip.md and .migration/command.md reports
(command.md documents that command.tsx is built on cmdk, not Radix,
and is out of migration scope per the hard rules)
Flagged behavior change: TooltipContent's default sideOffset moves from
0 to 4 (the base-vega registry's own default, not a discarded project
customization) -- tooltips now render with a small gap from their
trigger instead of touching it.
Commit Created+2
refactor(button): migrate to the real @base-ui/react/button primitive
- Use ButtonPrimitive from @base-ui/react/button directly, per the
skill's hard rule (never a hand-rolled useRender wrapper)
- Keep asChild as a compat prop translated to render, matching the
drawer.tsx/alert-dialog.tsx precedent already in this repo (101
asChild call sites across 28 files, out of scope to hand-migrate
for a single-component request)
- Add nativeButton auto-inference: Base UI's real Button logs a dev
console warning when nativeButton doesn't match the rendered tag;
automatically set nativeButton=false when asChild wraps a plain
non-button DOM tag (e.g. ), matching real usages in
brands-page.tsx/invalid-browser.tsx/empty.tsx with no consumer edits
- Preserve data-slot/data-variant/data-size as explicit attributes
(deviates from the golden pair, which drops them; kept since this
project's existing public contract includes them)
- Update @dependencies JSDoc tag, regenerate registry JSON
- Add .migration/button.md report
Full project typecheck stayed clean with zero consumer file changes.
Commit Created+2
refactor(badge): migrate Slot/asChild to useRender + mergeProps
- Replace radix-ui Slot-based polymorphism with @base-ui/react's
useRender + mergeProps (first Slot/asChild component migrated in
this project)
- asChild -> render; zero consumers use it, no compat shim needed
- data-slot/data-variant now generated automatically via useRender's
state param (verified byte-identical output against getStateAttributesProps.mjs)
- data-solid now renders as data-solid="" instead of data-solid="true";
flagged as a behavior change, harmless since nothing selects on the
specific string value
- Preserve all custom features unchanged: dot, solid, counter, onClose,
full color variant system (badgeVariants CVA untouched)
- Update @dependencies JSDoc tag, regenerate registry JSON
- Add .migration/badge.md report
Commit Created+2
refactor(avatar): migrate to Base UI
- Swap radix-ui import for @base-ui/react/avatar (direct 1:1 mapping,
confirmed via golden pair: identical anatomy/props/behavior)
- Update type annotations to the AvatarPrimitive.X.Props idiom
- Update @dependencies JSDoc tag
- Regenerate registry JSON
- Add .migration/avatar.md report
No consumer or docs changes needed: no usage of asChild or delayMs
anywhere in this repo, both of which are the only props that changed
shape in the Radix -> Base UI avatar mapping.
Commit Created+2
refactor(aspect-ratio): drop Radix, use CSS aspect-ratio
- Replace AspectRatioPrimitive.Root with a plain div using the
aspect-(--ratio) Tailwind v4 utility driven by a --ratio CSS var,
matching the canonical shadcn base-vega golden pair exactly
- ratio is now a required prop (previously an implicit Radix default);
verified as a no-op against all real consumers, which already pass it
- Apply the same fix to tv-display.tsx, which independently imported
AspectRatioPrimitive directly from radix-ui
- Update @dependencies JSDoc tags and the aspect-ratio docs install snippet
- Regenerate registry JSON
- Add .migration/aspect-ratio.md report
Commit Created+2
docs(alert-dialog): document AlertDialogAction no longer auto-closes
Add a props table entry clarifying that AlertDialogAction renders a plain
button and does not close the dialog automatically on click (Base UI has
no Action primitive), unlike AlertDialogCancel which still does.
Commit Created+2
fix(alert-dialog): match canonical Base UI golden pair
- Import from @base-ui/react/alert-dialog subpath instead of the barrel
- Use AlertDialogPrimitive.Root.Props idiom on the Root type
- Add isolate to AlertDialogOverlay (Base UI-specific stacking fix)
- Revert AlertDialogAction to a plain Button: Base UI has no Action
primitive, so wrapping it in Close (as done previously) silently
reintroduced auto-close-on-click behavior that the canonical shadcn
base-vega target intentionally drops. Flagged as a behavior change.
- Regenerate alert-dialog.json
- Add .migration/alert-dialog.md and .migration/alert.md reports
(alert.md documents that plain alert.tsx has no Radix dependency
and needs no migration)
Commit Created+2
refactor(accordion): migrate to Base UI
- Switch primitives from radix-ui to @base-ui/react/accordion
- Rename Content -> Panel, disabled: -> aria-disabled: on trigger
- Rename CSS var --radix-accordion-content-height -> --accordion-panel-height
- Update docs registry examples for Base UI Root API (drop type/collapsible,
always-array value/defaultValue, multiple boolean for multi-mode)
- Regenerate registry JSON
- Add .migration/accordion.md migration report
Commit Created+2
refactor(alert-dialog): migrate to Base UI
- Switch primitives from radix-ui to @base-ui/react
- Add asChild compatibility shim for AlertDialogTrigger
- Map AlertDialogOverlay -> Backdrop, AlertDialogContent -> Popup
- Map AlertDialogAction/AlertDialogCancel -> Close rendered with Button
- Update registry docs install snippet and regenerate registry JSON
Commit Created+2
chore: apply low-risk dependency upgrades and sync registry artifacts
Commit Created+2
fix: update brands-page SectionHeading to use SectionTitle component
- Add SectionTitle to typography imports (missed in bulk update)
- Update SectionHeading function body to delegate to SectionTitle
- Align header spacing with other docs pages (mt-3/mt-6 instead of space-y-4)
Commit Created+2
refactor: use Care UI typography components across all documentation pages
- Replace local SectionHeading wrappers with SectionTitle from @/components/ui/typography
- Replace raw h1/div/p headers with PageTitle, EyebrowTitle, Lead components
- Apply consistent border-b pb-2 scroll-m-20 classes to SectionTitle usage
- Add typography imports to accessibility, contributing, foundations, colors, brands pages
- Add Lead import to typography page
- Update get-started-page header to match other docs pages pattern
- Remove custom PageHeading function from get-started-page
- All 7 documentation pages now use the same Care typography component set
Commit Created+2
fix: align Get Started page heading with documentation style
- Replace PageTitle with custom PageHeading component
- Add border-bottom separator to main title matching Colors, Accessibility, Foundation pages
- Remove redundant Separator component
- Use consistent heading styling: border-b pb-3 text-4xl font-bold tracking-tight
Commit Created+2
refactor: redesign Get Started page with improved layout and typography
- Create dedicated GetStartedPage component with custom JSX rendering
- Follow documentation page layout pattern (PageTitle, SectionTitle, Lead)
- Add styled CodeBlock component with copy-to-clipboard functionality
- Reorganize content into clear sections: Prerequisites, Add a component, Tailwind setup, Use in app, What you get, Next steps
- Include feature list with visual indicators
- Add navigation links to related documentation pages
- Improve readability and visual hierarchy matching other docs pages
Commit Created+2
fix: prevent trackpad horizontal scroll in sidebars
- Change SidebarContent overflow-auto to overflow-y-auto with overflow-x-hidden
- Add overflow-x-hidden to sidebar-inner container
- Prevents unintended horizontal scrolling via trackpad while preserving vertical scroll
- Fixes issue in Main Dashboard, Inner Page, and Patient Detail blocks
Commit Created+2
feat: improve mobile touch behavior on Snellen chart
- Capture touch coordinates and apply radial gradient mask at touch point
- Single touch now shows unblurred area exactly where user touched (matching mouse behavior)
- Unblurs for 6 seconds then re-blurs automatically
Commit Created+2
fix: resolve TypeScript errors
- Replace NodeJS.Timeout with ReturnType for timeout refs
- Remove unused ANIMATION_CYCLE_MS constant
Commit Created+2
refactor: optimize error pages with refined animations and mobile support
- Load Failed: Add Snellen chart visual effect with optimized mouse tracking and mobile touch support
- Session Expired: Implement ripple timer with pulsating squircles, breathing animation, and accessibility
- Add ripple animations to index.css with reduced-motion support
- Optimize for mobile with responsive scaling and typography
- Improve performance with memoization, throttling, and GPU acceleration hints
- Add prefers-reduced-motion support for accessibility compliance
- Unify error page typography and layout patterns
Commented
Commented