From 2f8edc1c478678aff92378d76bda5fffd3c5ad53 Mon Sep 17 00:00:00 2001 From: Matthew Lipski Date: Thu, 23 Jul 2026 15:18:11 +0200 Subject: [PATCH] Updated ShadCN components --- packages/shadcn/components.json | 3 +- packages/shadcn/package.json | 11 +- .../shadcn/src/ShadCNComponentsContext.tsx | 2 + packages/shadcn/src/badge/Badge.tsx | 13 +- packages/shadcn/src/components/ui/avatar.tsx | 80 +++++- packages/shadcn/src/components/ui/badge.tsx | 48 ++-- packages/shadcn/src/components/ui/button.tsx | 45 ++- packages/shadcn/src/components/ui/card.tsx | 25 +- .../src/components/ui/dropdown-menu.tsx | 257 ++++++++++-------- packages/shadcn/src/components/ui/form.tsx | 34 +-- packages/shadcn/src/components/ui/input.tsx | 7 +- packages/shadcn/src/components/ui/label.tsx | 12 +- packages/shadcn/src/components/ui/popover.tsx | 86 ++++-- packages/shadcn/src/components/ui/select.tsx | 155 ++++++----- .../shadcn/src/components/ui/skeleton.tsx | 2 +- packages/shadcn/src/components/ui/tabs.tsx | 60 ++-- packages/shadcn/src/components/ui/toggle.tsx | 24 +- packages/shadcn/src/components/ui/tooltip.tsx | 71 +++-- packages/shadcn/src/menu/Menu.tsx | 67 ++--- packages/shadcn/src/popover/popover.tsx | 26 +- packages/shadcn/src/style.css | 4 +- .../src/suggestionMenu/SuggestionMenu.tsx | 2 +- .../gridSuggestionMenu/GridSuggestionMenu.tsx | 2 +- packages/shadcn/src/toolbar/Toolbar.tsx | 31 ++- pnpm-lock.yaml | 140 +++++----- 25 files changed, 675 insertions(+), 532 deletions(-) diff --git a/packages/shadcn/components.json b/packages/shadcn/components.json index eafc961dca..6b23cf1dd6 100644 --- a/packages/shadcn/components.json +++ b/packages/shadcn/components.json @@ -1,8 +1,9 @@ { "$schema": "https://ui.shadcn.com/schema/index.json", - "style": "default", + "style": "base-vega", "rsc": false, "tsx": true, + "iconLibrary": "lucide", "tailwind": { "css": "src/style.css", "baseColor": "slate", diff --git a/packages/shadcn/package.json b/packages/shadcn/package.json index 25e4f70ce1..920c686f99 100644 --- a/packages/shadcn/package.json +++ b/packages/shadcn/package.json @@ -55,17 +55,9 @@ "clean": "rimraf dist && rimraf types" }, "dependencies": { + "@base-ui/react": "^1.6.0", "@blocknote/core": "workspace:^", "@blocknote/react": "workspace:^", - "@radix-ui/react-avatar": "^1.1.10", - "@radix-ui/react-dropdown-menu": "^2.1.16", - "@radix-ui/react-label": "^2.1.7", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-select": "^2.2.6", - "@radix-ui/react-slot": "^1.2.3", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-toggle": "^1.1.10", - "@radix-ui/react-tooltip": "^1.2.8", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "lucide-react": "^0.525.0", @@ -73,7 +65,6 @@ "tailwind-merge": "^2.6.0" }, "devDependencies": { - "@radix-ui/colors": "^3.0.0", "@types/node": "^20.19.22", "@types/react": "^19.2.3", "@types/react-dom": "^19.2.3", diff --git a/packages/shadcn/src/ShadCNComponentsContext.tsx b/packages/shadcn/src/ShadCNComponentsContext.tsx index 29a4ea0673..f0ee1962c8 100644 --- a/packages/shadcn/src/ShadCNComponentsContext.tsx +++ b/packages/shadcn/src/ShadCNComponentsContext.tsx @@ -13,6 +13,7 @@ import { DropdownMenu as ShadCNDropdownMenu, DropdownMenuCheckboxItem as ShadCNDropdownMenuCheckboxItem, DropdownMenuContent as ShadCNDropdownMenuContent, + DropdownMenuGroup as ShadCNDropdownMenuGroup, DropdownMenuItem as ShadCNDropdownMenuItem, DropdownMenuLabel as ShadCNDropdownMenuLabel, DropdownMenuSeparator as ShadCNDropdownMenuSeparator, @@ -73,6 +74,7 @@ export const ShadCNDefaultComponents = { DropdownMenu: ShadCNDropdownMenu, DropdownMenuCheckboxItem: ShadCNDropdownMenuCheckboxItem, DropdownMenuContent: ShadCNDropdownMenuContent, + DropdownMenuGroup: ShadCNDropdownMenuGroup, DropdownMenuItem: ShadCNDropdownMenuItem, DropdownMenuLabel: ShadCNDropdownMenuLabel, DropdownMenuSeparator: ShadCNDropdownMenuSeparator, diff --git a/packages/shadcn/src/badge/Badge.tsx b/packages/shadcn/src/badge/Badge.tsx index 74c1787953..a6417a8b27 100644 --- a/packages/shadcn/src/badge/Badge.tsx +++ b/packages/shadcn/src/badge/Badge.tsx @@ -1,5 +1,5 @@ import { assertEmpty } from "@blocknote/core"; -import { ComponentProps } from "@blocknote/react"; +import { ComponentProps, useBlockNoteEditor } from "@blocknote/react"; import { forwardRef } from "react"; import { cn } from "../lib/utils.js"; @@ -25,6 +25,10 @@ export const Badge = forwardRef< const ShadCNComponents = useShadCNComponentsContext()!; + // Portal the tooltip into the editor's portal element so it inherits the + // editor's light/dark color scheme instead of the document body's. + const editor = useBlockNoteEditor(); + const badge = ( - - {badge} - + {mainTooltip} @@ -71,7 +74,7 @@ export const BadgeGroup = forwardRef< const ShadCNComponents = useShadCNComponentsContext()!; return ( - +
) { +}: AvatarPrimitive.Root.Props & { + size?: "default" | "sm" | "lg"; +}) { return ( ) { +function AvatarImage({ className, ...props }: AvatarPrimitive.Image.Props) { return ( ); @@ -37,12 +39,57 @@ function AvatarImage({ function AvatarFallback({ className, ...props -}: React.ComponentProps) { +}: AvatarPrimitive.Fallback.Props) { return ( + ); +} + +function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) { + return ( + svg]:hidden", + "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2", + "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2", + className, + )} + {...props} + /> + ); +} + +function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function AvatarGroupCount({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3", className, )} {...props} @@ -50,4 +97,11 @@ function AvatarFallback({ ); } -export { Avatar, AvatarImage, AvatarFallback }; +export { + Avatar, + AvatarImage, + AvatarFallback, + AvatarGroup, + AvatarGroupCount, + AvatarBadge, +}; diff --git a/packages/shadcn/src/components/ui/badge.tsx b/packages/shadcn/src/components/ui/badge.tsx index b1c2ab1b85..595de45e09 100644 --- a/packages/shadcn/src/components/ui/badge.tsx +++ b/packages/shadcn/src/components/ui/badge.tsx @@ -1,22 +1,24 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; +import { mergeProps } from "@base-ui/react/merge-props"; +import { useRender } from "@base-ui/react/use-render"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../../lib/utils"; const badgeVariants = cva( - "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + "group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-4xl border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!", { variants: { variant: { - default: - "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80", secondary: - "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + "bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80", destructive: - "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + "bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20", outline: - "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground", + "border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground", + ghost: + "hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50", + link: "text-primary underline-offset-4 hover:underline", }, }, defaultVariants: { @@ -27,20 +29,24 @@ const badgeVariants = cva( function Badge({ className, - variant, - asChild = false, + variant = "default", + render, ...props -}: React.ComponentProps<"span"> & - VariantProps & { asChild?: boolean }) { - const Comp = asChild ? Slot : "span"; - - return ( - - ); +}: useRender.ComponentProps<"span"> & VariantProps) { + return useRender({ + defaultTagName: "span", + props: mergeProps<"span">( + { + className: cn(badgeVariants({ variant }), className), + }, + props, + ), + render, + state: { + slot: "badge", + variant, + }, + }); } export { Badge, badgeVariants }; diff --git a/packages/shadcn/src/components/ui/button.tsx b/packages/shadcn/src/components/ui/button.tsx index 43ab1151fc..dc51e6f367 100644 --- a/packages/shadcn/src/components/ui/button.tsx +++ b/packages/shadcn/src/components/ui/button.tsx @@ -1,31 +1,36 @@ -import * as React from "react"; -import { Slot } from "@radix-ui/react-slot"; +import { Button as ButtonPrimitive } from "@base-ui/react/button"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../../lib/utils"; const buttonVariants = cva( - "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=size-])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + "group/button inline-flex shrink-0 items-center justify-center rounded-md border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", { variants: { variant: { - default: - "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", - destructive: - "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + default: "bg-primary text-primary-foreground hover:bg-primary/80", outline: - "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + "border-border bg-background shadow-xs hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50", secondary: - "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + "bg-secondary text-secondary-foreground hover:bg-[color-mix(in_oklch,var(--secondary),var(--foreground)_5%)] aria-expanded:bg-secondary aria-expanded:text-secondary-foreground", ghost: - "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + "hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50", + destructive: + "bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40", link: "text-primary underline-offset-4 hover:underline", }, size: { - default: "h-9 px-4 py-2 has-[>svg]:px-3", - sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", - lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + default: + "h-9 gap-1.5 px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + xs: "h-6 gap-1 rounded-[min(var(--radius-md),8px)] px-2 text-xs in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3", + sm: "h-8 gap-1 rounded-[min(var(--radius-md),10px)] px-2.5 in-data-[slot=button-group]:rounded-md has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5", + lg: "h-10 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", icon: "size-9", + "icon-xs": + "size-6 rounded-[min(var(--radius-md),8px)] in-data-[slot=button-group]:rounded-md [&_svg:not([class*='size-'])]:size-3", + "icon-sm": + "size-8 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-md", + "icon-lg": "size-10", }, }, defaultVariants: { @@ -37,18 +42,12 @@ const buttonVariants = cva( function Button({ className, - variant, - size, - asChild = false, + variant = "default", + size = "default", ...props -}: React.ComponentProps<"button"> & - VariantProps & { - asChild?: boolean; - }) { - const Comp = asChild ? Slot : "button"; - +}: ButtonPrimitive.Props & VariantProps) { return ( - ) { +function Card({ + className, + size = "default", + ...props +}: React.ComponentProps<"div"> & { size?: "default" | "sm" }) { return (
img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(4)] *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl", className, )} {...props} @@ -20,7 +25,7 @@ function CardHeader({ className, ...props }: React.ComponentProps<"div">) {
) { return (
); @@ -42,7 +50,7 @@ function CardDescription({ className, ...props }: React.ComponentProps<"div">) { return (
); @@ -65,7 +73,7 @@ function CardContent({ className, ...props }: React.ComponentProps<"div">) { return (
); @@ -75,7 +83,10 @@ function CardFooter({ className, ...props }: React.ComponentProps<"div">) { return (
); diff --git a/packages/shadcn/src/components/ui/dropdown-menu.tsx b/packages/shadcn/src/components/ui/dropdown-menu.tsx index 568aad2a78..6ab45375be 100644 --- a/packages/shadcn/src/components/ui/dropdown-menu.tsx +++ b/packages/shadcn/src/components/ui/dropdown-menu.tsx @@ -1,47 +1,76 @@ "use client"; import * as React from "react"; -import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; -import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"; +import { Menu as MenuPrimitive } from "@base-ui/react/menu"; import { cn } from "../../lib/utils"; +import { ChevronRightIcon, CheckIcon } from "lucide-react"; -function DropdownMenu({ - ...props -}: React.ComponentProps) { - return ; +function DropdownMenu({ ...props }: MenuPrimitive.Root.Props) { + return ; } -function DropdownMenuPortal({ - ...props -}: React.ComponentProps) { - return ( - - ); +function DropdownMenuPortal({ ...props }: MenuPrimitive.Portal.Props) { + return ; } -function DropdownMenuTrigger({ +function DropdownMenuTrigger({ ...props }: MenuPrimitive.Trigger.Props) { + return ; +} + +function DropdownMenuContent({ + align = "start", + alignOffset = 0, + side = "bottom", + sideOffset = 4, + className, + container, ...props -}: React.ComponentProps) { +}: MenuPrimitive.Popup.Props & + Pick< + MenuPrimitive.Positioner.Props, + "align" | "alignOffset" | "side" | "sideOffset" + > & + Pick) { return ( - + + + + + ); } -function DropdownMenuContent({ +function DropdownMenuGroup({ ...props }: MenuPrimitive.Group.Props) { + return ; +} + +function DropdownMenuLabel({ className, - sideOffset = 4, + inset, ...props -}: React.ComponentProps) { +}: MenuPrimitive.GroupLabel.Props & { + inset?: boolean; +}) { return ( - ) { - return ( - - ); -} - function DropdownMenuItem({ className, inset, variant = "default", ...props -}: React.ComponentProps & { +}: MenuPrimitive.Item.Props & { inset?: boolean; variant?: "default" | "destructive"; }) { return ( - ; +} + +function DropdownMenuSubTrigger({ className, + inset, children, - checked, ...props -}: React.ComponentProps) { +}: MenuPrimitive.SubmenuTrigger.Props & { + inset?: boolean; +}) { return ( - - - - - - {children} - + + ); } -function DropdownMenuRadioGroup({ +function DropdownMenuSubContent({ + align = "start", + alignOffset = -3, + side = "right", + sideOffset = 0, + className, ...props -}: React.ComponentProps) { +}: React.ComponentProps) { return ( - ); } -function DropdownMenuRadioItem({ +function DropdownMenuCheckboxItem({ className, children, + checked, + inset, ...props -}: React.ComponentProps) { +}: MenuPrimitive.CheckboxItem.Props & { + inset?: boolean; +}) { return ( - - - - - + + + + {children} - + ); } -function DropdownMenuLabel({ +function DropdownMenuRadioGroup({ ...props }: MenuPrimitive.RadioGroup.Props) { + return ( + + ); +} + +function DropdownMenuRadioItem({ className, + children, inset, ...props -}: React.ComponentProps & { +}: MenuPrimitive.RadioItem.Props & { inset?: boolean; }) { return ( - + > + + + + + + {children} + ); } function DropdownMenuSeparator({ className, ...props -}: React.ComponentProps) { +}: MenuPrimitive.Separator.Props) { return ( - ); @@ -182,53 +247,7 @@ function DropdownMenuShortcut({ - ); -} - -function DropdownMenuSub({ - ...props -}: React.ComponentProps) { - return ; -} - -function DropdownMenuSubTrigger({ - className, - inset, - children, - ...props -}: React.ComponentProps & { - inset?: boolean; -}) { - return ( - - {children} - - - ); -} - -function DropdownMenuSubContent({ - className, - ...props -}: React.ComponentProps) { - return ( - ) { function FormLabel({ className, ...props -}: React.ComponentProps) { +}: React.ComponentProps) { const { error, formItemId } = useFormField(); return ( @@ -102,23 +102,25 @@ function FormLabel({ ); } -function FormControl({ ...props }: React.ComponentProps) { +function FormControl({ render, ...props }: useRender.ComponentProps<"div">) { const { error, formItemId, formDescriptionId, formMessageId } = useFormField(); - return ( - ( + { + "data-slot": "form-control", + id: formItemId, + "aria-describedby": !error ? `${formDescriptionId}` - : `${formDescriptionId} ${formMessageId}` - } - aria-invalid={!!error} - {...props} - /> - ); + : `${formDescriptionId} ${formMessageId}`, + "aria-invalid": !!error, + } as React.ComponentProps<"div">, + props, + ), + }); } function FormDescription({ className, ...props }: React.ComponentProps<"p">) { diff --git a/packages/shadcn/src/components/ui/input.tsx b/packages/shadcn/src/components/ui/input.tsx index 75927ffb35..828169a8fa 100644 --- a/packages/shadcn/src/components/ui/input.tsx +++ b/packages/shadcn/src/components/ui/input.tsx @@ -1,16 +1,15 @@ import * as React from "react"; +import { Input as InputPrimitive } from "@base-ui/react/input"; import { cn } from "../../lib/utils"; function Input({ className, type, ...props }: React.ComponentProps<"input">) { return ( - ) { +function Label({ className, ...props }: React.ComponentProps<"label">) { return ( - ) { +function Popover({ ...props }: PopoverPrimitive.Root.Props) { return ; } -function PopoverTrigger({ - ...props -}: React.ComponentProps) { +function PopoverTrigger({ ...props }: PopoverPrimitive.Trigger.Props) { return ; } function PopoverContent({ className, align = "center", + alignOffset = 0, + side = "bottom", sideOffset = 4, + container, ...props -}: React.ComponentProps) { +}: PopoverPrimitive.Popup.Props & + Pick< + PopoverPrimitive.Positioner.Props, + "align" | "alignOffset" | "side" | "sideOffset" + > & + Pick) { return ( - + + + + + ); +} + +function PopoverHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
); } -function PopoverAnchor({ +function PopoverTitle({ className, ...props }: PopoverPrimitive.Title.Props) { + return ( + + ); +} + +function PopoverDescription({ + className, ...props -}: React.ComponentProps) { - return ; +}: PopoverPrimitive.Description.Props) { + return ( + + ); } -export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor }; +export { + Popover, + PopoverContent, + PopoverDescription, + PopoverHeader, + PopoverTitle, + PopoverTrigger, +}; diff --git a/packages/shadcn/src/components/ui/select.tsx b/packages/shadcn/src/components/ui/select.tsx index 69a5981dbf..76d1047c6c 100644 --- a/packages/shadcn/src/components/ui/select.tsx +++ b/packages/shadcn/src/components/ui/select.tsx @@ -1,25 +1,29 @@ import * as React from "react"; -import * as SelectPrimitive from "@radix-ui/react-select"; -import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"; +import { Select as SelectPrimitive } from "@base-ui/react/select"; import { cn } from "../../lib/utils"; +import { ChevronDownIcon, CheckIcon, ChevronUpIcon } from "lucide-react"; -function Select({ - ...props -}: React.ComponentProps) { - return ; -} +const Select = SelectPrimitive.Root; -function SelectGroup({ - ...props -}: React.ComponentProps) { - return ; +function SelectGroup({ className, ...props }: SelectPrimitive.Group.Props) { + return ( + + ); } -function SelectValue({ - ...props -}: React.ComponentProps) { - return ; +function SelectValue({ className, ...props }: SelectPrimitive.Value.Props) { + return ( + + ); } function SelectTrigger({ @@ -27,7 +31,7 @@ function SelectTrigger({ size = "default", children, ...props -}: React.ComponentProps & { +}: SelectPrimitive.Trigger.Props & { size?: "sm" | "default"; }) { return ( @@ -35,15 +39,17 @@ function SelectTrigger({ data-slot="select-trigger" data-size={size} className={cn( - "border-input data-[placeholder]:text-muted-foreground [&_svg:not([class*=text-])]:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive dark:bg-input/30 dark:hover:bg-input/50 shadow-xs flex w-fit items-center justify-between gap-2 whitespace-nowrap rounded-md border bg-transparent px-3 py-2 text-sm outline-none transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg:not([class*=size-])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0", + "flex w-fit items-center justify-between gap-1.5 rounded-md border border-input bg-transparent py-2 pr-2 pl-2.5 text-sm whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 data-placeholder:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-1.5 dark:bg-input/30 dark:hover:bg-input/50 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className, )} {...props} > {children} - - - + + } + /> ); } @@ -51,44 +57,55 @@ function SelectTrigger({ function SelectContent({ className, children, - position = "popper", + side = "bottom", + sideOffset = 4, + align = "center", + alignOffset = 0, + alignItemWithTrigger = true, + container, ...props -}: React.ComponentProps) { +}: SelectPrimitive.Popup.Props & + Pick< + SelectPrimitive.Positioner.Props, + "align" | "alignOffset" | "side" | "sideOffset" | "alignItemWithTrigger" + > & + Pick) { return ( - - - + - {children} - - - + + + {children} + + + + ); } function SelectLabel({ className, ...props -}: React.ComponentProps) { +}: SelectPrimitive.GroupLabel.Props) { return ( - ); @@ -98,22 +115,26 @@ function SelectItem({ className, children, ...props -}: React.ComponentProps) { +}: SelectPrimitive.Item.Props) { return ( - - - - - - {children} + + {children} + + + } + > + + ); } @@ -121,11 +142,11 @@ function SelectItem({ function SelectSeparator({ className, ...props -}: React.ComponentProps) { +}: SelectPrimitive.Separator.Props) { return ( ); @@ -134,36 +155,36 @@ function SelectSeparator({ function SelectScrollUpButton({ className, ...props -}: React.ComponentProps) { +}: React.ComponentProps) { return ( - - - + + ); } function SelectScrollDownButton({ className, ...props -}: React.ComponentProps) { +}: React.ComponentProps) { return ( - - - + + ); } diff --git a/packages/shadcn/src/components/ui/skeleton.tsx b/packages/shadcn/src/components/ui/skeleton.tsx index f0d550c365..8a8634476f 100644 --- a/packages/shadcn/src/components/ui/skeleton.tsx +++ b/packages/shadcn/src/components/ui/skeleton.tsx @@ -4,7 +4,7 @@ function Skeleton({ className, ...props }: React.ComponentProps<"div">) { return (
); diff --git a/packages/shadcn/src/components/ui/tabs.tsx b/packages/shadcn/src/components/ui/tabs.tsx index 21dce6cc6e..b35a843c26 100644 --- a/packages/shadcn/src/components/ui/tabs.tsx +++ b/packages/shadcn/src/components/ui/tabs.tsx @@ -1,48 +1,67 @@ "use client"; -import * as React from "react"; -import * as TabsPrimitive from "@radix-ui/react-tabs"; +import { Tabs as TabsPrimitive } from "@base-ui/react/tabs"; +import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../../lib/utils"; function Tabs({ className, + orientation = "horizontal", ...props -}: React.ComponentProps) { +}: TabsPrimitive.Root.Props) { return ( ); } +const tabsListVariants = cva( + "group/tabs-list inline-flex w-fit items-center justify-center rounded-lg p-[3px] text-muted-foreground group-data-[orientation=horizontal]/tabs:h-9 group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col data-[variant=line]:rounded-none", + { + variants: { + variant: { + default: "bg-muted", + line: "gap-1 bg-transparent", + }, + }, + defaultVariants: { + variant: "default", + }, + }, +); + function TabsList({ className, + variant = "default", ...props -}: React.ComponentProps) { +}: TabsPrimitive.List.Props & VariantProps) { return ( ); } -function TabsTrigger({ - className, - ...props -}: React.ComponentProps) { +function TabsTrigger({ className, ...props }: TabsPrimitive.Tab.Props) { return ( - ) { +function TabsContent({ className, ...props }: TabsPrimitive.Panel.Props) { return ( - ); } -export { Tabs, TabsList, TabsTrigger, TabsContent }; +export { Tabs, TabsList, TabsTrigger, TabsContent, tabsListVariants }; diff --git a/packages/shadcn/src/components/ui/toggle.tsx b/packages/shadcn/src/components/ui/toggle.tsx index 6b66928550..ca313a1e12 100644 --- a/packages/shadcn/src/components/ui/toggle.tsx +++ b/packages/shadcn/src/components/ui/toggle.tsx @@ -1,22 +1,21 @@ -import * as React from "react"; -import * as TogglePrimitive from "@radix-ui/react-toggle"; +import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"; import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "../../lib/utils"; const toggleVariants = cva( - "inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium hover:bg-muted hover:text-muted-foreground disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg:not([class*=size-])]:size-4 [&_svg]:shrink-0 focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] outline-none transition-[color,box-shadow] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive whitespace-nowrap", + "group/toggle inline-flex items-center justify-center gap-1 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", { variants: { variant: { default: "bg-transparent", - outline: - "border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground", + outline: "border border-input bg-transparent shadow-xs hover:bg-muted", }, size: { - default: "h-9 px-2 min-w-9", - sm: "h-8 px-1.5 min-w-8", - lg: "h-10 px-2.5 min-w-10", + default: + "h-9 min-w-9 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", + sm: "h-8 min-w-8 px-2.5 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5", + lg: "h-10 min-w-10 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2", }, }, defaultVariants: { @@ -28,13 +27,12 @@ const toggleVariants = cva( function Toggle({ className, - variant, - size, + variant = "default", + size = "default", ...props -}: React.ComponentProps & - VariantProps) { +}: TogglePrimitive.Props & VariantProps) { return ( - ) { +}: TooltipPrimitive.Provider.Props) { return ( ); } -function Tooltip({ - ...props -}: React.ComponentProps) { - return ( - - - - ); +function Tooltip({ ...props }: TooltipPrimitive.Root.Props) { + return ; } -function TooltipTrigger({ - ...props -}: React.ComponentProps) { +function TooltipTrigger({ ...props }: TooltipPrimitive.Trigger.Props) { return ; } function TooltipContent({ className, - sideOffset = 0, + side = "top", + sideOffset = 4, + align = "center", + alignOffset = 0, children, + container, ...props -}: React.ComponentProps) { +}: TooltipPrimitive.Popup.Props & + Pick< + TooltipPrimitive.Positioner.Props, + "align" | "alignOffset" | "side" | "sideOffset" + > & + Pick) { return ( - - {children} - - + + + + {children} + + + + ); } diff --git a/packages/shadcn/src/menu/Menu.tsx b/packages/shadcn/src/menu/Menu.tsx index 44ed6b99ea..1e5eb6ea54 100644 --- a/packages/shadcn/src/menu/Menu.tsx +++ b/packages/shadcn/src/menu/Menu.tsx @@ -1,39 +1,11 @@ import { assertEmpty } from "@blocknote/core"; -import { ComponentProps } from "@blocknote/react"; +import { ComponentProps, useBlockNoteEditor } from "@blocknote/react"; import { ChevronRight } from "lucide-react"; -import { forwardRef, useMemo } from "react"; +import { forwardRef, ReactElement } from "react"; -import type { DropdownMenuTrigger as ShadCNDropdownMenuTrigger } from "../components/ui/dropdown-menu.js"; import { cn } from "../lib/utils.js"; import { useShadCNComponentsContext } from "../ShadCNComponentsContext.js"; -// hacky HoC to change DropdownMenuTrigger to open a menu on PointerUp instead of PointerDown -// Needed to fix this issue: https://github.com/radix-ui/primitives/issues/2867 -const MenuTriggerWithPointerUp = (Comp: typeof ShadCNDropdownMenuTrigger) => - forwardRef>( - (props, ref) => { - return ( - { - if (!(e.nativeEvent as any).fakeEvent) { - // setting ctrlKey will block the menu from opening - // as it will block this line: https://github.com/radix-ui/primitives/blob/b32a93318cdfce383c2eec095710d35ffbd33a1c/packages/react/dropdown-menu/src/DropdownMenu.tsx#L120 - e.ctrlKey = true; - } - }} - onPointerUp={(event) => { - // dispatch a pointerdown event so the Radix pointer down handler gets called that opens the menu - const e = new PointerEvent("pointerdown", event.nativeEvent); - (e as any).fakeEvent = true; - event.target.dispatchEvent(e); - }} - {...props} - ref={ref} - /> - ); - }, - ); - export const Menu = (props: ComponentProps["Generic"]["Menu"]["Root"]) => { const { children, @@ -76,14 +48,6 @@ export const MenuTrigger = ( const ShadCNComponents = useShadCNComponentsContext()!; - const DropdownMenuTrigger = useMemo( - () => - MenuTriggerWithPointerUp( - ShadCNComponents.DropdownMenu.DropdownMenuTrigger, - ), - [ShadCNComponents.DropdownMenu.DropdownMenuTrigger], - ); - if (sub) { return ( @@ -92,9 +56,9 @@ export const MenuTrigger = ( ); } else { return ( - - {children} - + ); } }; @@ -109,10 +73,16 @@ export const MenuDropdown = forwardRef< const ShadCNComponents = useShadCNComponentsContext()!; + // Portal into the editor's portal element (which carries the color-scheme + // class) so the menu inherits light/dark mode instead of the document body's. + const editor = useBlockNoteEditor(); + const container = editor.portalElement; + if (sub) { return ( {children} @@ -122,6 +92,7 @@ export const MenuDropdown = forwardRef< return ( {children} @@ -208,11 +179,13 @@ export const MenuLabel = forwardRef< const ShadCNComponents = useShadCNComponentsContext()!; return ( - - {children} - + + + {children} + + ); }); diff --git a/packages/shadcn/src/popover/popover.tsx b/packages/shadcn/src/popover/popover.tsx index 54d3933dad..76c822dba2 100644 --- a/packages/shadcn/src/popover/popover.tsx +++ b/packages/shadcn/src/popover/popover.tsx @@ -1,7 +1,6 @@ import { assertEmpty } from "@blocknote/core"; -import { ComponentProps } from "@blocknote/react"; -import { createContext, forwardRef, useContext } from "react"; -import { createPortal } from "react-dom"; +import { ComponentProps, useBlockNoteEditor } from "@blocknote/react"; +import { createContext, forwardRef, ReactElement, useContext } from "react"; import { cn } from "../lib/utils.js"; import { useShadCNComponentsContext } from "../ShadCNComponentsContext.js"; @@ -44,9 +43,10 @@ export const PopoverTrigger = forwardRef( const ShadCNComponents = useShadCNComponentsContext()!; return ( - - {children} - + ); }, ); @@ -62,9 +62,15 @@ export const PopoverContent = forwardRef< const ShadCNComponents = useShadCNComponentsContext()!; const portalRoot = useContext(PortalRootContext); - const content = ( + // Default to the editor's portal element (which carries the color-scheme + // class) so popovers inherit light/dark mode instead of the document body's, + // even when the caller doesn't pass an explicit portalRoot. + const editor = useBlockNoteEditor(); + + return ( ); - - if (portalRoot) { - return createPortal(content, portalRoot); - } - - return content; }); diff --git a/packages/shadcn/src/style.css b/packages/shadcn/src/style.css index 651e63f52c..b675e6d513 100644 --- a/packages/shadcn/src/style.css +++ b/packages/shadcn/src/style.css @@ -30,11 +30,11 @@ } .bn-shadcn .bn-select { - max-height: var(--radix-select-content-available-height); + max-height: var(--available-height); } .bn-shadcn .bn-menu-dropdown { - max-height: var(--radix-dropdown-menu-content-available-height); + max-height: var(--available-height); } .bn-shadcn .bn-color-picker-dropdown { diff --git a/packages/shadcn/src/suggestionMenu/SuggestionMenu.tsx b/packages/shadcn/src/suggestionMenu/SuggestionMenu.tsx index 3802d88019..4f294f6589 100644 --- a/packages/shadcn/src/suggestionMenu/SuggestionMenu.tsx +++ b/packages/shadcn/src/suggestionMenu/SuggestionMenu.tsx @@ -18,7 +18,7 @@ export const SuggestionMenu = forwardRef< role="listbox" // Styles from ShadCN DropdownMenuContent component className={cn( - "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 max-h-(--radix-dropdown-menu-content-available-height) origin-(--radix-dropdown-menu-content-transform-origin) z-50 min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border p-1 shadow-md", + "bg-popover text-popover-foreground z-50 min-w-32 overflow-x-hidden overflow-y-auto rounded-md p-1 shadow-md ring-1 ring-foreground/10", className, )} ref={ref} diff --git a/packages/shadcn/src/suggestionMenu/gridSuggestionMenu/GridSuggestionMenu.tsx b/packages/shadcn/src/suggestionMenu/gridSuggestionMenu/GridSuggestionMenu.tsx index 1efeff3076..f8c95331b8 100644 --- a/packages/shadcn/src/suggestionMenu/gridSuggestionMenu/GridSuggestionMenu.tsx +++ b/packages/shadcn/src/suggestionMenu/gridSuggestionMenu/GridSuggestionMenu.tsx @@ -16,7 +16,7 @@ export const GridSuggestionMenu = forwardRef<
( const ShadCNComponents = useShadCNComponentsContext()!; return ( - +
( const ShadCNComponents = useShadCNComponentsContext()!; + // Portal the tooltip into the editor's portal element so it inherits the + // editor's light/dark color scheme instead of the document body's. + const editor = useBlockNoteEditor(); + const trigger = isSelected === undefined ? ( ( ( onClick={onClick} pressed={isSelected} disabled={isDisabled} - data-state={isSelected ? "on" : "off"} - data-disabled={isDisabled} ref={ref} {...rest} > @@ -107,10 +109,9 @@ export const ToolbarButton = forwardRef( return ( - - {trigger} - + {mainTooltip} @@ -131,6 +132,10 @@ export const ToolbarSelect = forwardRef< const ShadCNComponents = useShadCNComponentsContext()!; + // Portal into the editor's portal element (which carries the color-scheme + // class) so the dropdown inherits light/dark mode instead of the body's. + const editor = useBlockNoteEditor(); + // TODO? const SelectItemContent = (props: any) => (
@@ -156,7 +161,15 @@ export const ToolbarSelect = forwardRef< - + {items.map((item) => ( =14.0.0'} + peerDependencies: + '@date-fns/tz': ^1.2.0 + '@types/react': ^17 || ^18 || ^19 + date-fns: ^4.0.0 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@date-fns/tz': + optional: true + '@types/react': + optional: true + date-fns: + optional: true + '@base-ui/utils@0.2.6': resolution: {integrity: sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw==} peerDependencies: @@ -6447,6 +6437,16 @@ packages: '@types/react': optional: true + '@base-ui/utils@0.3.1': + resolution: {integrity: sha512-gFFiltORVmW/N6IILTGxizP3PBpVpysqML1ALY5Vk0mH+7faVkCknOU31goYHN5Aoek2dkjxva1XOD2Ce9WuIg==} + peerDependencies: + '@types/react': ^17 || ^18 || ^19 + react: ^17 || ^18 || ^19 + react-dom: ^17 || ^18 || ^19 + peerDependenciesMeta: + '@types/react': + optional: true + '@base2/pretty-print-object@1.0.2': resolution: {integrity: sha512-rBha0UDfV7EmBRjWrGG7Cpwxg8WomPlo0q+R2so47ZFf9wy4YKJzLuHcVa0UGFjdcLZj/4F/1FNC46GIQhe7sA==} @@ -8233,9 +8233,6 @@ packages: '@quansync/fs@1.0.0': resolution: {integrity: sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==} - '@radix-ui/colors@3.0.0': - resolution: {integrity: sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==} - '@radix-ui/number@1.1.1': resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} @@ -8320,19 +8317,6 @@ packages: '@types/react-dom': optional: true - '@radix-ui/react-avatar@1.1.11': - resolution: {integrity: sha512-0Qk603AHGV28BOBO34p7IgD5m+V5Sg/YovfayABkoDDBM5d3NCx0Mp4gGrjzLGes1jV5eNOE1r3itqOR33VC6Q==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@radix-ui/react-checkbox@1.3.3': resolution: {integrity: sha512-wBbpv+NQftHDdG86Qc0pIyXk5IR3tM8Vd0nWLKDcX8nNn4nXFOFwsKuqw2okA/1D/mpaAkmuyndrPJTYDNZtFw==} peerDependencies: @@ -8403,15 +8387,6 @@ packages: '@types/react': optional: true - '@radix-ui/react-context@1.1.3': - resolution: {integrity: sha512-ieIFACdMpYfMEjF0rEf5KLvfVyIkOz6PDGyNnP+u+4xQ6jny3VCgA4OgXOwNx2aUkxn8zx9fiVcM8CfFYv9Lxw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@radix-ui/react-dialog@1.1.15': resolution: {integrity: sha512-TCglVRtzlffRNxRMEyR36DGBLJpeusFcgMVD9PZEzAKnUs1lKCgX5u9BmC2Yg+LL9MgZDugFFs1Vl+Jp4t/PGw==} peerDependencies: @@ -14510,6 +14485,9 @@ packages: reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} + reselect@5.2.0: + resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -16472,6 +16450,20 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@base-ui/react@1.6.0(@date-fns/tz@1.4.1)(@types/react@19.2.14)(date-fns@4.1.0)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@babel/runtime': 7.29.2 + '@base-ui/utils': 0.3.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.5(react@19.2.5))(react@19.2.5) + '@floating-ui/utils': 0.2.11 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + use-sync-external-store: 1.6.0(react@19.2.5) + optionalDependencies: + '@date-fns/tz': 1.4.1 + '@types/react': 19.2.14 + date-fns: 4.1.0 + '@base-ui/utils@0.2.6(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@babel/runtime': 7.29.2 @@ -16483,6 +16475,17 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 + '@base-ui/utils@0.3.1(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': + dependencies: + '@babel/runtime': 7.29.2 + '@floating-ui/utils': 0.2.11 + react: 19.2.5 + react-dom: 19.2.5(react@19.2.5) + reselect: 5.2.0 + use-sync-external-store: 1.6.0(react@19.2.5) + optionalDependencies: + '@types/react': 19.2.14 + '@base2/pretty-print-object@1.0.2': {} '@better-auth/core@1.4.22(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.2.2)(kysely@0.28.15)(nanostores@1.2.0)': @@ -18180,8 +18183,6 @@ snapshots: dependencies: quansync: 1.0.0 - '@radix-ui/colors@3.0.0': {} - '@radix-ui/number@1.1.1': {} '@radix-ui/primitive@1.1.3': {} @@ -18257,19 +18258,6 @@ snapshots: '@types/react': 19.2.14 '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-avatar@1.1.11(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': - dependencies: - '@radix-ui/react-context': 1.1.3(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.14)(react@19.2.5) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.5) - react: 19.2.5 - react-dom: 19.2.5(react@19.2.5) - optionalDependencies: - '@types/react': 19.2.14 - '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -18340,12 +18328,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - '@radix-ui/react-context@1.1.3(@types/react@19.2.14)(react@19.2.5)': - dependencies: - react: 19.2.5 - optionalDependencies: - '@types/react': 19.2.14 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': dependencies: '@radix-ui/primitive': 1.1.3 @@ -25770,6 +25752,8 @@ snapshots: reselect@5.1.1: {} + reselect@5.2.0: {} + resolve-from@4.0.0: {} resolve-pkg-maps@1.0.0: {} @@ -27212,7 +27196,7 @@ snapshots: picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 + tinyexec: 1.2.4 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 vite: 8.0.8(@types/node@20.19.37)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0) @@ -27242,7 +27226,7 @@ snapshots: picomatch: 4.0.4 std-env: 4.0.0 tinybench: 2.9.0 - tinyexec: 1.0.4 + tinyexec: 1.2.4 tinyglobby: 0.2.16 tinyrainbow: 3.1.0 vite: 8.0.8(@types/node@25.5.0)(esbuild@0.27.5)(jiti@2.6.1)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)