Skip to content

chore: migrate radix, bump packages, audit#534

Merged
softmarshmallow merged 13 commits intomainfrom
canary
Feb 8, 2026
Merged

chore: migrate radix, bump packages, audit#534
softmarshmallow merged 13 commits intomainfrom
canary

Conversation

@softmarshmallow
Copy link
Member

@softmarshmallow softmarshmallow commented Feb 8, 2026

  • migrate radix-ui
  • monaco-themes

Summary by CodeRabbit

  • Chores

    • Consolidated UI library imports across the codebase, updated dependency pins, and applied assorted formatting and housekeeping.
  • New Features

    • Added a new Monaco Editor dark theme (grida-dark) with accompanying README.
  • UI Improvements

    • Reworked notifications/communications into an interactive Email/SMS/messaging authoring experience with live previews and richer inline controls.

@coderabbitai
Copy link

coderabbitai bot commented Feb 8, 2026

Walkthrough

Replaced many scoped @radix-ui/react-* imports with consolidated radix-ui named imports (aliased as primitives), updated a few provider usages (Tooltip/Dialog/Portal), added a new Monaco theme (editor/public/monaco-themes/grida-dark.json + README), and updated dependency manifests and minor formatting across the repo.

Changes

Cohort / File(s) Summary
Core UI primitives
editor/components/ui/*.tsx, editor/components/ui-editor/*
Swapped scoped @radix-ui/react-* namespace imports for named imports from radix-ui (aliased e.g., *Primitive). Updated internal references (e.g., SlotSlotPrimitive.Slot, DialogDialogPrimitive.Root). JSX/logic largely unchanged; import surface and type resolution changed.
Specific components & hooks
editor/components/data-table/data-table-view-options.tsx, editor/components/hooks/use-dialog-state.ts, editor/components/mediaviewer/index.tsx, editor/components/monaco/index.tsx, editor/components/panels/side-panel.tsx
Applied Radix import consolidation; monaco theme loading now fetches public/monaco-themes/grida-dark.json. Dialog/Dropdown/Tooltip usages adapted to primitive-based imports; some JSX nesting adjusted.
App pages, scaffolds & providers
editor/app/(dev)/ui/components/degree/page.tsx, editor/app/(tenant)/*/_components/invitation.tsx, editor/scaffolds/**/editor.tsx, editor/scaffolds/sidecontrol/**
Provider and primitive imports migrated to radix-ui; wrappers updated where required (e.g., TooltipPrimitive.Provider, PortalPrimitive.Root, DialogPrimitive.Close). Mostly import/alias edits and formatting.
Playground / canvas / starter
editor/grida-canvas-hosted/playground/*, editor/grida-canvas-react-renderer-dom/nodes/bitmap.tsx, editor/grida-canvas-react-starter-kit/*
Dialog/Progress/other primitives imported from radix-ui; ImageData creation changed to explicit buffer copy in bitmap node.
Kits, www and starter UI
editor/kits/minimal-tiptap/**, editor/www/ui/*, editor/kits/AGENTS.md
Tooltip type usages moved to TooltipPrimitive.*. Slot API usage changed to SlotPrimitive.Slot/SlotPrimitive.Slottable. Minor docs/markdown tweaks.
Monaco themes (new)
editor/public/monaco-themes/grida-dark.json, editor/public/monaco-themes/README.md
Added a new VS Code-style dark Monaco theme JSON and README documenting the theme and its origin.
Dependency manifests
editor/package.json, root package.json, workspace app package.json files
Removed many scoped @radix-ui/* packages, added aggregate radix-ui (^1.4.3) and selective @radix-ui/* entries; bumped deps (motion, next, axios, openai); removed monaco-themes.
Pages, scaffolds & misc formatting
various editor/app/**, tests, layouts, scaffolds (incl. large ConnectChannels change)
Numerous non-functional formatting changes and minor refactors. One large UI refactor: ConnectChannels updated to richer interactive email/SMS/WhatsApp/Kakao sections (internal JSX changes).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • bump tiptap editor #295 — touches Tooltip provider imports/usages similar to this PR's Tooltip → TooltipPrimitive.Provider migration.
  • Daily RC #441 — related changes to Spinner/import paths and UI primitives across components.

Suggested labels

migration

Suggested reviewers

  • kmk142789

Poem

🐰 I hopped through imports, swift and spry,
Swapped scattered crates for one neat tie.
A dark theme tucked in JSON night,
Providers renamed, the code feels light.
Hooray — a tiny rabbit's migration delight!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.89% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: migrating Radix UI components to a unified package, bumping dependencies, and auditing the codebase.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch canary

No actionable comments were generated in the recent review. 🎉


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@vercel
Copy link

vercel bot commented Feb 8, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
backgrounds Ready Ready Preview, Comment Feb 8, 2026 8:04am
blog Ready Ready Preview, Comment Feb 8, 2026 8:04am
docs Ready Ready Preview, Comment Feb 8, 2026 8:04am
grida Ready Ready Preview, Comment Feb 8, 2026 8:04am
viewer Ready Ready Preview, Comment Feb 8, 2026 8:04am
2 Skipped Deployments
Project Deployment Actions Updated (UTC)
code Ignored Ignored Feb 8, 2026 8:04am
legacy Ignored Ignored Feb 8, 2026 8:04am

Request Review

- Replaced imports from `@radix-ui/react-*` to `radix-ui` for various components including Dialog, Tooltip, DropdownMenu, and Progress.
- Updated component usage across the application to reflect the new import structure, ensuring consistency and adherence to the latest Radix UI practices.
@softmarshmallow softmarshmallow marked this pull request as ready for review February 8, 2026 07:13
@vercel vercel bot temporarily deployed to Preview – viewer February 8, 2026 07:13 Inactive
@vercel vercel bot temporarily deployed to Preview – backgrounds February 8, 2026 07:13 Inactive
@vercel vercel bot temporarily deployed to Preview – blog February 8, 2026 07:13 Inactive
@chatgpt-codex-connector
Copy link

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
editor/app/(tenant)/~/[tenant]/(r)/r/[slug]/t/[code]/_components/invitation.tsx (1)

50-50: ⚠️ Potential issue | 🔴 Critical

Fix incorrect Dialog component property: DialogPrimitive.DialogContent should be DialogPrimitive.Content.

In the radix-ui package (and its predecessor @radix-ui/react-dialog), the Dialog content component is accessed as Dialog.Content, not Dialog.DialogContent. The codebase confirms this pattern—other files using the same import syntax (Dialog as DialogPrimitive) correctly use DialogPrimitive.Content. This will cause a runtime error at lines 50 and 68.

🐛 Proposed fix
-          <DialogPrimitive.DialogContent className="fixed inset-0 p-0 border-none outline-none bg-background data-[state=closed]:animate-out data-[state=closed]:fade-out-0 z-10">
+          <DialogPrimitive.Content className="fixed inset-0 p-0 border-none outline-none bg-background data-[state=closed]:animate-out data-[state=closed]:fade-out-0 z-10">
-          </DialogPrimitive.DialogContent>
+          </DialogPrimitive.Content>
editor/components/ui/aspect-ratio.tsx (1)

1-11: ⚠️ Potential issue | 🔴 Critical

Missing React import — React.ComponentProps on line 7 will fail.

The file references React.ComponentProps but never imports React. The new JSX transform handles JSX without an explicit import, but the type reference to React.ComponentProps still requires the namespace to be in scope.

Proposed fix
 "use client";
 
+import * as React from "react";
 import { AspectRatio as AspectRatioPrimitive } from "radix-ui";
🤖 Fix all issues with AI agents
In `@editor/components/data-table/data-table-view-options.tsx`:
- Line 3: The file currently imports DropdownMenu as DropdownMenuPrimitive from
"radix-ui" and uses DropdownMenuPrimitive.Trigger; replace that by removing the
raw Radix import and instead import DropdownMenuTrigger from the shadcn
dropdown-menu wrapper alongside DropdownMenu, DropdownMenuContent,
DropdownMenuLabel, DropdownMenuSeparator, and DropdownMenuCheckboxItem, then
update usages of DropdownMenuPrimitive.Trigger to use DropdownMenuTrigger
(keeping the rest of the shadcn components unchanged).

In `@editor/components/monaco/index.tsx`:
- Around line 16-22: The fetch for "/monaco-themes/grida-dark.json" lacks error
handling and can leave themeloaded false; wrap the promise chain for
monaco.editor.defineTheme and monaco.editor.setTheme in a catch so any
fetch/network/JSON error still calls setThemeLoaded(true) and logs the error.
Update the promise chain that currently calls monaco.editor.defineTheme("dark",
...) and setThemeLoaded(true) to include a .catch handler that calls
setThemeLoaded(true) (so the light theme fallback and the second useEffect can
run) and optionally logs the error for debugging.

In `@editor/scaffolds/editor/editor.tsx`:
- Line 19: The PR is importing and using TooltipPrimitive.Provider directly
which uses Radix's 700ms delay; replace usage by importing the shared
TooltipProvider (exported from '@/components/ui/tooltip') and swap all instances
of <TooltipPrimitive.Provider>...</TooltipPrimitive.Provider> to
<TooltipProvider>...</TooltipProvider> so the default delayDuration={0} from the
shared component is applied (search for TooltipPrimitive.Provider and update to
TooltipProvider; ensure you add the TooltipProvider import and remove the direct
radix TooltipPrimitive import).
🧹 Nitpick comments (4)
editor/grida-canvas-react-starter-kit/starterkit-loading/loading.tsx (1)

324-344: Consider reusing the shared Progress component from @/components/ui/progress.

This local Progress duplicates the shared one with only minor styling differences (h-1 vs h-2, no rounded-full). Since both accept className, you could use the shared component and override styles via the className prop at the call site (line 224).

editor/scaffolds/sidecontrol/controls/x-userdata.tsx (1)

11-11: Consider importing DialogClose from the shadcn wrapper instead of reaching into radix-ui directly.

Lines 3-10 already import Dialog sub-components from @/components/ui/dialog. The shadcn wrapper exports DialogClose, but the current code imports Dialog as DialogPrimitive from radix-ui and uses DialogPrimitive.Close at lines 96–103. This mixes abstraction layers—prefer the shadcn wrapper for consistency.

Proposed fix
 import {
   Dialog,
   DialogContent,
   DialogDescription,
   DialogFooter,
   DialogHeader,
   DialogTitle,
   DialogTrigger,
+  DialogClose,
 } from "@/components/ui/dialog";
-import { Dialog as DialogPrimitive } from "radix-ui";

Then replace DialogPrimitive.Close with DialogClose at lines 96–103.

editor/public/monaco-themes/grida-dark.json (1)

1-1: Consider formatting the JSON for maintainability.

The theme definition is valid, but being a single minified line makes it difficult to review diffs or make targeted edits. Since this is a static asset (not a build artifact), pretty-printing would improve readability at negligible cost.

editor/kits/minimal-tiptap/components/toolbar-button.tsx (1)

2-2: Consider using a type-only import since this is only used for type references.

The TooltipPrimitive import is only used for the TooltipContentProps type on line 14. A type-only import makes the intent clearer and guarantees it's erased at compile time.

♻️ Suggested change
-import { Tooltip as TooltipPrimitive } from "radix-ui";
+import type { Tooltip as TooltipPrimitive } from "radix-ui";

"use client";

import { DropdownMenuTrigger } from "@radix-ui/react-dropdown-menu";
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, locate and read the file
find . -name "data-table-view-options.tsx" -type f

Repository: gridaco/grida

Length of output: 115


🏁 Script executed:

#!/bin/bash
# Check the shadcn dropdown-menu component to see what it exports
find . -path "*/components/ui/dropdown-menu*" -type f | head -10

Repository: gridaco/grida

Length of output: 97


🏁 Script executed:

#!/bin/bash
# Look for the actual data-table-view-options file and examine its imports/usage
fd "data-table-view-options.tsx" --type f

Repository: gridaco/grida

Length of output: 113


🏁 Script executed:

#!/bin/bash
# Read the data-table-view-options.tsx file
cat -n editor/components/data-table/data-table-view-options.tsx

Repository: gridaco/grida

Length of output: 2114


🏁 Script executed:

#!/bin/bash
# Read the dropdown-menu.tsx file to check exports
cat -n editor/components/ui/dropdown-menu.tsx

Repository: gridaco/grida

Length of output: 10315


Use the shadcn DropdownMenuTrigger instead of the raw Radix primitive.

This file imports DropdownMenu as DropdownMenuPrimitive directly from "radix-ui" and uses DropdownMenuPrimitive.Trigger at lines 24 and 33, while using shadcn wrappers everywhere else (DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuCheckboxItem). The shadcn dropdown-menu module exports a DropdownMenuTrigger wrapper that should be used instead. Remove the raw Radix import and add DropdownMenuTrigger to the shadcn imports.

Proposed fix
-import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
 import { Table } from "@tanstack/react-table";
 import { Settings2 } from "lucide-react";
 import { Button } from "@/components/ui/button";
 import {
   DropdownMenu,
   DropdownMenuCheckboxItem,
   DropdownMenuContent,
   DropdownMenuLabel,
   DropdownMenuSeparator,
+  DropdownMenuTrigger,
 } from "@/components/ui/dropdown-menu";
     <DropdownMenu>
-      <DropdownMenuPrimitive.Trigger asChild>
+      <DropdownMenuTrigger asChild>
         <Button
           variant="outline"
           size="sm"
           className="ml-auto hidden h-8 lg:flex"
         >
           <Settings2 className="size-4" />
           View
         </Button>
-      </DropdownMenuPrimitive.Trigger>
+      </DropdownMenuTrigger>
🤖 Prompt for AI Agents
In `@editor/components/data-table/data-table-view-options.tsx` at line 3, The file
currently imports DropdownMenu as DropdownMenuPrimitive from "radix-ui" and uses
DropdownMenuPrimitive.Trigger; replace that by removing the raw Radix import and
instead import DropdownMenuTrigger from the shadcn dropdown-menu wrapper
alongside DropdownMenu, DropdownMenuContent, DropdownMenuLabel,
DropdownMenuSeparator, and DropdownMenuCheckboxItem, then update usages of
DropdownMenuPrimitive.Trigger to use DropdownMenuTrigger (keeping the rest of
the shadcn components unchanged).

Comment on lines +16 to +22
fetch("/monaco-themes/grida-dark.json")
.then((res) => res.json())
.then((data) => {
monaco.editor.defineTheme("dark", data as any);
monaco.editor.setTheme(theme === "dark" ? "dark" : "light");
setThemeLoaded(true);
});
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Missing error handling on theme fetch — silent failure.

If /monaco-themes/grida-dark.json fails to load (404, network error, invalid JSON), the promise rejects unhandled and setThemeLoaded(true) is never called. This means the second useEffect (line 27–31) that reacts to theme changes will be permanently gated by themeloaded === false, silently breaking all theme switching.

Add a .catch() to handle the failure gracefully — at minimum, still mark the theme as loaded so the light theme fallback works.

Proposed fix
     fetch("/monaco-themes/grida-dark.json")
       .then((res) => res.json())
       .then((data) => {
         monaco.editor.defineTheme("dark", data as any);
         monaco.editor.setTheme(theme === "dark" ? "dark" : "light");
         setThemeLoaded(true);
-      });
+      })
+      .catch((err) => {
+        console.error("Failed to load Monaco theme:", err);
+        // Still mark as loaded so light theme fallback works
+        monaco.editor.setTheme("light");
+        setThemeLoaded(true);
+      });
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
fetch("/monaco-themes/grida-dark.json")
.then((res) => res.json())
.then((data) => {
monaco.editor.defineTheme("dark", data as any);
monaco.editor.setTheme(theme === "dark" ? "dark" : "light");
setThemeLoaded(true);
});
fetch("/monaco-themes/grida-dark.json")
.then((res) => res.json())
.then((data) => {
monaco.editor.defineTheme("dark", data as any);
monaco.editor.setTheme(theme === "dark" ? "dark" : "light");
setThemeLoaded(true);
})
.catch((err) => {
console.error("Failed to load Monaco theme:", err);
// Still mark as loaded so light theme fallback works
monaco.editor.setTheme("light");
setThemeLoaded(true);
});
🤖 Prompt for AI Agents
In `@editor/components/monaco/index.tsx` around lines 16 - 22, The fetch for
"/monaco-themes/grida-dark.json" lacks error handling and can leave themeloaded
false; wrap the promise chain for monaco.editor.defineTheme and
monaco.editor.setTheme in a catch so any fetch/network/JSON error still calls
setThemeLoaded(true) and logs the error. Update the promise chain that currently
calls monaco.editor.defineTheme("dark", ...) and setThemeLoaded(true) to include
a .catch handler that calls setThemeLoaded(true) (so the light theme fallback
and the second useEffect can run) and optionally logs the error for debugging.

import { FormFieldDefinition } from "@/grida-forms-hosted/types";
import { FormFieldUpsert, EditorApiResponse } from "@/types/private/api";
import { TooltipProvider } from "@radix-ui/react-tooltip";
import { Tooltip as TooltipPrimitive } from "radix-ui";
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Using raw TooltipPrimitive.Provider loses the delayDuration=0 default.

The TooltipProvider exported from @/components/ui/tooltip sets delayDuration={0} by default. By importing TooltipPrimitive directly from radix-ui and using <TooltipPrimitive.Provider> without props, you'll get the Radix default delay of 700ms, making tooltips noticeably slower to appear. This is likely a UX regression.

Consider importing TooltipProvider from the shared UI component instead:

Proposed fix
-import { Tooltip as TooltipPrimitive } from "radix-ui";
+import { TooltipProvider } from "@/components/ui/tooltip";

Then replace all <TooltipPrimitive.Provider> / </TooltipPrimitive.Provider> with <TooltipProvider> / </TooltipProvider>.

Also applies to: 84-92

🤖 Prompt for AI Agents
In `@editor/scaffolds/editor/editor.tsx` at line 19, The PR is importing and using
TooltipPrimitive.Provider directly which uses Radix's 700ms delay; replace usage
by importing the shared TooltipProvider (exported from
'@/components/ui/tooltip') and swap all instances of
<TooltipPrimitive.Provider>...</TooltipPrimitive.Provider> to
<TooltipProvider>...</TooltipProvider> so the default delayDuration={0} from the
shared component is applied (search for TooltipPrimitive.Provider and update to
TooltipProvider; ensure you add the TooltipProvider import and remove the direct
radix TooltipPrimitive import).

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@editor/package.json`:
- Around line 65-72: Remove the duplicate Radix packages listed
individually—@radix-ui/react-checkbox, `@radix-ui/react-popover`,
`@radix-ui/react-select`, `@radix-ui/react-slider`, `@radix-ui/react-toggle`, and
`@radix-ui/react-toggle-group`—and keep only `@radix-ui/react-icons` and
`@radix-ui/react-use-controllable-state` in package.json; if
`@radix-ui/react-select`@^2.2.6 intentionally needs a different major than the
aggregate exported by `@radix-ui/react`, either move that pinned version into an
overrides (or resolutions) entry or document the deliberate override (e.g., in
README) so the version discrepancy is explicit.
🧹 Nitpick comments (5)
apps/viewer/package.json (1)

15-15: eslint-config-next still at 16.1.3 while next is bumped to 16.1.6.

Line 29 pins eslint-config-next to 16.1.3. Consider bumping it to 16.1.6 to keep them in sync and avoid potential lint rule mismatches.

apps/backgrounds/package.json (1)

14-19: @next/third-parties and eslint-config-next lag behind next version.

@next/third-parties (line 14) and eslint-config-next (line 34) are still at 16.1.3 while next has been bumped to 16.1.6. These packages are part of the same Next.js release and should ideally stay aligned.

editor/package.json (3)

61-62: @next/mdx, @next/third-parties, and eslint-config-next not bumped with next.

Same pattern as the other apps — next is at 16.1.6 but @next/mdx (line 61), @next/third-parties (line 62), and eslint-config-next (line 248) remain at 16.1.3. Keeping these in sync avoids subtle compatibility issues.

Also applies to: 157-157, 248-248


113-113: Loose axios range ^1 is effectively overridden by root.

The root pnpm.overrides pins axios to 1.13.4, so this ^1 range has no practical effect. Consider aligning the declared version here with the override for clarity, or noting that the override governs the resolved version.


159-159: Loose openai range ^6 is pinned to 6.18.0 by root override.

Same situation as axios — the root override controls the actual resolved version. The wide range here is cosmetically misleading. Consider using 6.18.0 directly or adding a comment.

Comment on lines +65 to 72
"@radix-ui/react-checkbox": "^1.3.3",
"@radix-ui/react-icons": "^1.3.2",
"@radix-ui/react-label": "^2.1.7",
"@radix-ui/react-menubar": "^1.1.14",
"@radix-ui/react-navigation-menu": "^1.2.12",
"@radix-ui/react-popover": "^1.1.13",
"@radix-ui/react-portal": "^1.1.8",
"@radix-ui/react-progress": "^1.1.7",
"@radix-ui/react-radio-group": "^1.3.6",
"@radix-ui/react-scroll-area": "^1.2.9",
"@radix-ui/react-select": "^2.2.5",
"@radix-ui/react-separator": "^1.1.7",
"@radix-ui/react-slider": "^1.3.4",
"@radix-ui/react-slot": "^1.2.3",
"@radix-ui/react-switch": "^1.2.4",
"@radix-ui/react-tabs": "^1.1.11",
"@radix-ui/react-toggle": "^1.1.8",
"@radix-ui/react-toggle-group": "^1.1.9",
"@radix-ui/react-toolbar": "^1.1.9",
"@radix-ui/react-tooltip": "^1.2.7",
"@radix-ui/react-popover": "^1.1.15",
"@radix-ui/react-select": "^2.2.6",
"@radix-ui/react-slider": "^1.3.6",
"@radix-ui/react-toggle": "^1.1.10",
"@radix-ui/react-toggle-group": "^1.1.11",
"@radix-ui/react-use-controllable-state": "^1.2.2",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

radix-ui aggregate package what does it export include

💡 Result:

The radix-ui “aggregate” package is a barrel that re-exports each Radix Primitives package as a single named export per component, where the value is the module namespace (so you can do import { Dialog } from "radix-ui" and then use Dialog.Root, Dialog.Trigger, etc.). (cdn.jsdelivr.net)

Main entry (radix-ui)

It exports these namespaces: AccessibleIcon, Accordion, AlertDialog, AspectRatio, Avatar, Checkbox, Collapsible, ContextMenu, Dialog, Direction, DropdownMenu, Form, HoverCard, Label, Menubar, NavigationMenu, Popover, Portal, Progress, RadioGroup, ScrollArea, Select, Separator, Slider, Slot, Switch, Tabs, Toast, Toggle, ToggleGroup, Toolbar, Tooltip, VisuallyHidden, plus unstable_OneTimePasswordField and unstable_PasswordToggleField. (cdn.jsdelivr.net)

Subpath exports (notably radix-ui/internal)

The package export map includes subpath exports ("./*"), and dist/internal.* exports internal building blocks/utilities like Arrow, Collection, Context, DismissableLayer, FocusGuards, FocusScope, Menu, Popper, Presence, RovingFocus, Primitive, plus helpers/hooks like composeRefs/useComposedRefs, useCallbackRef, useControllableState(+Reducer), useEffectEvent, useEscapeKeydown, useIsHydrated, useLayoutEffect, useSize, composeEventHandlers, and PrimitivePropsWithRef. (unpkg.com)

Citations:


🏁 Script executed:

# First, let's locate and read the editor/package.json file
fd -t f 'package.json' | grep -E 'editor/package.json'

Repository: gridaco/grida

Length of output: 76


🏁 Script executed:

# Read the editor/package.json to verify the lines mentioned
cat -n editor/package.json | sed -n '60,75p; 155,170p'

Repository: gridaco/grida

Length of output: 1376


Remove duplicate @radix-ui/* packages or explicitly pin versions if intentional.

The radix-ui aggregate (^1.4.3, line 163) re-exports Checkbox, Popover, Select, Slider, Toggle, and ToggleGroup. These same packages are listed individually at lines 65–71, creating duplicate dependencies.

Keep only: @radix-ui/react-icons (standalone package, not in aggregate) and @radix-ui/react-use-controllable-state (internal utility).

For the others: Either remove them (if versions align with aggregate's re-exports) or, if @radix-ui/react-select@^2.2.6 intentionally pins a newer major version than the aggregate includes, add a brief comment explaining the version override.

🤖 Prompt for AI Agents
In `@editor/package.json` around lines 65 - 72, Remove the duplicate Radix
packages listed individually—@radix-ui/react-checkbox, `@radix-ui/react-popover`,
`@radix-ui/react-select`, `@radix-ui/react-slider`, `@radix-ui/react-toggle`, and
`@radix-ui/react-toggle-group`—and keep only `@radix-ui/react-icons` and
`@radix-ui/react-use-controllable-state` in package.json; if
`@radix-ui/react-select`@^2.2.6 intentionally needs a different major than the
aggregate exported by `@radix-ui/react`, either move that pinned version into an
overrides (or resolutions) entry or document the deliberate override (e.g., in
README) so the version discrepancy is explicit.

@softmarshmallow softmarshmallow changed the title chore: migrate radix chore: migrate radix, bump packages, audit Feb 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant