Jul 13, 2026 – Jul 20, 2026
[ENG-748] fix: text overflow in Administration Table
Mohammed Nihal ·[ENG-746] Hide "completed" from encounter status
Mohammed Nihal ·Fix "Show on Map" link oversized clickable area
Mohammed Nihal ·Consolidate Sentry initialization: single init, opt-in DSN, URL scrubbing
Mohammed Nihal ·[ENG-736] Fix Diagnostic Report print in Org level
Mohammed Nihal ·[QA-215] fix(ci): stop thank-you-note workflow failing on merged PRs
Mohammed Nihal ·[QA-210] Allow QA project key in PR title JIRA validation (#16569)
Mohammed Nihal ·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.
Vinu ·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 (<Item asChild><a href="#">...) - 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
Vinu ·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.
Vinu ·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
Vinu ·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 <DropdownMenuLabel> in <DropdownMenuGroup> 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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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 <Progress value={x} /> 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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·playwright: document overlapping Radix overlay close-animation race
Mohammed Nihal ·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
Vinu ·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.
Vinu ·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. <a>), 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.
Vinu ·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.
Vinu ·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.
Vinu ·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
Vinu ·chore: apply low-risk dependency upgrades and sync registry artifacts
Vinu ·ensure token number is always uppercase (#17)
Rithvik Nishad ·Fix js/trivial-conditional CodeQL quality alerts
Mohammed Nihal ·[ENG-754] Resolve react-hooks/refs violations
Mohammed Nihal ·[ENG-642] Add clear button and adjust styling for questionnaire question types
Mohammed Nihal ·feat: migrate drawer to Base UI and refresh docs/examples
Vinu ·[QA-210] Allow QA project key in PR title JIRA validation
Mohammed Nihal ·[ENG-748] fix: text overflow in Administration Table
Rithvik Nishad ·Add a unit-test harness (Vitest), typecheck script, and CI gates
Mohammed Nihal ·Add a unit-test harness (Vitest), typecheck script, and CI gates
Mohammed Nihal ·Add characterization tests for monetary component math and medication active-window logic
Mohammed Nihal ·move `dompurify` package to dependencies (#16532)
Rithvik Nishad ·Update care_token_display name in README
Rithvik Nishad ·Revert "ENG-549: Redesign the tv token display"
Rithvik Nishad ·[ENG-748] fix: text overflow in Administration Table
Mohammed Nihal ·[ENG-746] Hide "completed" from encounter status
Mohammed Nihal ·Fix "Show on Map" link oversized clickable area
Mohammed Nihal ·Consolidate Sentry initialization: single init, opt-in DSN, URL scrubbing
Mohammed Nihal ·[ENG-736] Fix Diagnostic Report print in Org level
Mohammed Nihal ·[QA-215] fix(ci): stop thank-you-note workflow failing on merged PRs
Mohammed Nihal ·[QA-210] Allow QA project key in PR title JIRA validation (#16569)
Mohammed Nihal ·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.
Vinu ·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 (<Item asChild><a href="#">...) - 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
Vinu ·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.
Vinu ·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
Vinu ·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 <DropdownMenuLabel> in <DropdownMenuGroup> 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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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 <Progress value={x} /> 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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·playwright: document overlapping Radix overlay close-animation race
Mohammed Nihal ·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
Vinu ·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.
Vinu ·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. <a>), 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.
Vinu ·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.
Vinu ·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.
Vinu ·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
Vinu ·chore: apply low-risk dependency upgrades and sync registry artifacts
Vinu ·ensure token number is always uppercase (#17)
Rithvik Nishad ·Fix js/trivial-conditional CodeQL quality alerts
Mohammed Nihal ·[ENG-754] Resolve react-hooks/refs violations
Mohammed Nihal ·[ENG-642] Add clear button and adjust styling for questionnaire question types
Mohammed Nihal ·feat: migrate drawer to Base UI and refresh docs/examples
Vinu ·[QA-210] Allow QA project key in PR title JIRA validation
Mohammed Nihal ·[ENG-748] fix: text overflow in Administration Table
Rithvik Nishad ·Add a unit-test harness (Vitest), typecheck script, and CI gates
Mohammed Nihal ·Add a unit-test harness (Vitest), typecheck script, and CI gates
Mohammed Nihal ·Add characterization tests for monetary component math and medication active-window logic
Mohammed Nihal ·move `dompurify` package to dependencies (#16532)
Rithvik Nishad ·Update care_token_display name in README
Rithvik Nishad ·Revert "ENG-549: Redesign the tv token display"
Rithvik Nishad ·[ENG-752] Resolve react-hooks/purity violations and enforce the rule
Mohammed Nihal ·[ENG-738] fix: update encounter end date handling in EncounterQuestion component
Mohammed Nihal ·[ENG-111] Clicking on an inventory item should display all supply deliveries
Mohammed Nihal ·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.
Vinu ·[ENG-500] Support for creating multiple diagnostic reports in a service request
Mohammed Nihal ·Clear persisted query cache on logout
Mohammed Nihal ·[QA-210] Allow QA project key in PR title JIRA validation
Mohammed Nihal ·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).
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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.
Vinu ·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<typeof Dialog> wholesale, which now conflicts with also passing the same children/onOpenChange into <Drawer> (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
Vinu ·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
Vinu ·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
Vinu ·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<number[]> 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
Vinu ·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
Vinu ·refactor(label): drop Radix, use native <label> - No Base UI counterpart exists for Radix's Label primitive; swap for a plain <label> element (matches the base-vega registry's own approach) - No consumer changes needed: every usage only passes className/htmlFor/children - Regenerate registry JSON, add .migration/label.md report
Vinu ·[ENG-30] Pharmacy: Improved bill medications flow
Mohammed Nihal ·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
Vinu ·[ENG-763] Allow plugins to add sections in user's profile page
Rithvik Nishad ·update data
Rithvik Nishad ·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
Vinu ·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
Vinu ·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)
Vinu ·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
Vinu ·[ENG-735] Add pagination in Dispense History selector
Mohammed Nihal ·ensure token number is always uppercase
Rithvik Nishad ·ensure token number is always uppercase
Rithvik Nishad ·[QA-214] Fix flaky device service history edit flow test
Mohammed Nihal ·Remove unneeded defensive code in useMultiFilterState
Mohammed Nihal ·[ENG-754] Resolve react-hooks/refs violations
Mohammed Nihal ·[QA-210] Allow QA project key in PR title JIRA validation
Rithvik Nishad ·Revert "ENG-549: Redesign the tv token display"
Rithvik Nishad ·[ENG - 506] Add support for custom links in the left sidebar
Mohammed Nihal ·[ENG-707]: Default account close reason to completed for settled accounts
Mohammed Nihal ·Request layer: bound the paginated fetch loop and fix double body consumption
Mohammed Nihal ·move `dompurify` package to dependencies
Rithvik Nishad ·[ENG-744] Highlight dosages when they aren't 1
Mohammed Nihal ·Register Components for Plugins using Vite
Mohammed Nihal ·[ENG-752] Resolve react-hooks/purity violations and enforce the rule
Mohammed Nihal ·[ENG-738] fix: update encounter end date handling in EncounterQuestion component
Mohammed Nihal ·[ENG-111] Clicking on an inventory item should display all supply deliveries
Mohammed Nihal ·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.
Vinu ·[ENG-500] Support for creating multiple diagnostic reports in a service request
Mohammed Nihal ·Clear persisted query cache on logout
Mohammed Nihal ·[QA-210] Allow QA project key in PR title JIRA validation
Mohammed Nihal ·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).
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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
Vinu ·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.
Vinu ·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<typeof Dialog> wholesale, which now conflicts with also passing the same children/onOpenChange into <Drawer> (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
Vinu ·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
Vinu ·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
Vinu ·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<number[]> 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
Vinu ·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
Vinu ·refactor(label): drop Radix, use native <label> - No Base UI counterpart exists for Radix's Label primitive; swap for a plain <label> element (matches the base-vega registry's own approach) - No consumer changes needed: every usage only passes className/htmlFor/children - Regenerate registry JSON, add .migration/label.md report
Vinu ·[ENG-30] Pharmacy: Improved bill medications flow
Mohammed Nihal ·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
Vinu ·[ENG-763] Allow plugins to add sections in user's profile page
Rithvik Nishad ·update data
Rithvik Nishad ·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
Vinu ·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
Vinu ·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)
Vinu ·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
Vinu ·[ENG-735] Add pagination in Dispense History selector
Mohammed Nihal ·ensure token number is always uppercase
Rithvik Nishad ·ensure token number is always uppercase
Rithvik Nishad ·[QA-214] Fix flaky device service history edit flow test
Mohammed Nihal ·Remove unneeded defensive code in useMultiFilterState
Mohammed Nihal ·[ENG-754] Resolve react-hooks/refs violations
Mohammed Nihal ·[QA-210] Allow QA project key in PR title JIRA validation
Rithvik Nishad ·Revert "ENG-549: Redesign the tv token display"
Rithvik Nishad ·[ENG - 506] Add support for custom links in the left sidebar
Mohammed Nihal ·[ENG-707]: Default account close reason to completed for settled accounts
Mohammed Nihal ·Request layer: bound the paginated fetch loop and fix double body consumption
Mohammed Nihal ·move `dompurify` package to dependencies
Rithvik Nishad ·[ENG-744] Highlight dosages when they aren't 1
Mohammed Nihal ·Register Components for Plugins using Vite
Mohammed Nihal ·Merged a Pull Request
Opened a Pull Request
Raised an Issue