From b0e4d841b6d9a1a2ec0fc54a92e2c76650eaf476 Mon Sep 17 00:00:00 2001 From: Aditya <2005akjha@gmail.com> Date: Fri, 17 Oct 2025 16:57:19 +0530 Subject: [PATCH 1/2] ref(ui): migrate components to React 19 ref-as-prop (remove forwardRef, displayName); update all elements --- packages/ui/src/elements/accordion.tsx | 33 +++--- packages/ui/src/elements/alert.tsx | 27 ++--- packages/ui/src/elements/avatar.tsx | 43 ++++---- packages/ui/src/elements/breadcrumb.tsx | 70 +++++------- packages/ui/src/elements/button.tsx | 12 +-- packages/ui/src/elements/card.tsx | 40 +++---- packages/ui/src/elements/chart.tsx | 92 +++++++--------- packages/ui/src/elements/checkbox.tsx | 41 ++++--- packages/ui/src/elements/command.tsx | 88 +++++++-------- packages/ui/src/elements/dialog.tsx | 50 ++++----- packages/ui/src/elements/dropdown-menu.tsx | 96 ++++++++--------- packages/ui/src/elements/input.tsx | 98 +++++++++-------- packages/ui/src/elements/label.tsx | 10 +- packages/ui/src/elements/navigation-menu.tsx | 72 ++++++------- packages/ui/src/elements/pagination.tsx | 14 ++- packages/ui/src/elements/popover.tsx | 11 +- packages/ui/src/elements/progress.tsx | 46 ++++---- packages/ui/src/elements/radio-group.tsx | 33 +++--- packages/ui/src/elements/select.tsx | 108 ++++++++----------- packages/ui/src/elements/separator.tsx | 11 +- packages/ui/src/elements/sheet.tsx | 61 +++++------ packages/ui/src/elements/switch.tsx | 11 +- packages/ui/src/elements/table.tsx | 80 ++++++-------- packages/ui/src/elements/textarea.tsx | 60 +++++------ packages/ui/src/elements/toast.tsx | 65 +++++------ packages/ui/src/elements/toggle-group.tsx | 22 ++-- packages/ui/src/elements/toggle.tsx | 11 +- packages/ui/src/elements/tooltip.tsx | 11 +- packages/ui/src/elements/typography.tsx | 12 +-- 29 files changed, 579 insertions(+), 749 deletions(-) diff --git a/packages/ui/src/elements/accordion.tsx b/packages/ui/src/elements/accordion.tsx index d06dfdf7..163ca829 100644 --- a/packages/ui/src/elements/accordion.tsx +++ b/packages/ui/src/elements/accordion.tsx @@ -7,20 +7,21 @@ import { cn } from '@o2s/ui/lib/utils'; const Accordion = AccordionPrimitive.Root; -const AccordionItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( +type AccordionItemProps = React.ComponentPropsWithoutRef & { + ref?: React.Ref>; +}; +const AccordionItem = ({ className, ref, ...props }: AccordionItemProps) => ( -)); -AccordionItem.displayName = 'AccordionItem'; +); export interface AccordionTriggerProps extends React.ComponentPropsWithoutRef { tag?: keyof JSX.IntrinsicElements; } -const AccordionTrigger = React.forwardRef, AccordionTriggerProps>( - ({ className, tag = 'h3', children, ...props }, ref) => { +type AccordionTriggerOwnProps = AccordionTriggerProps & { + ref?: React.Ref>; +}; +const AccordionTrigger = ({ className, tag = 'h3', children, ref, ...props }: AccordionTriggerOwnProps) => { const Comp = tag; return ( @@ -40,14 +41,12 @@ const AccordionTrigger = React.forwardRef ); - }, -); -AccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName; + }; -const AccordionContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( +type AccordionContentProps = React.ComponentPropsWithoutRef & { + ref?: React.Ref>; +}; +const AccordionContent = ({ className, children, ref, ...props }: AccordionContentProps) => (
{children}
-)); - -AccordionContent.displayName = AccordionPrimitive.Content.displayName; +); export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }; diff --git a/packages/ui/src/elements/alert.tsx b/packages/ui/src/elements/alert.tsx index ba01f67a..4b470cc7 100644 --- a/packages/ui/src/elements/alert.tsx +++ b/packages/ui/src/elements/alert.tsx @@ -18,26 +18,21 @@ const alertVariants = cva( }, ); -const Alert = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes & VariantProps ->(({ className, variant, ...props }, ref) => ( +type AlertProps = React.HTMLAttributes & VariantProps & { + ref?: React.Ref; +}; +const Alert = ({ className, variant, ref, ...props }: AlertProps) => (
-)); -Alert.displayName = 'Alert'; +); -const AlertTitle = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), +type AlertTitleProps = React.HTMLAttributes & { ref?: React.Ref }; +const AlertTitle = ({ className, ref, ...props }: AlertTitleProps) => ( +
); -AlertTitle.displayName = 'AlertTitle'; -const AlertDescription = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), +type AlertDescriptionProps = React.HTMLAttributes & { ref?: React.Ref }; +const AlertDescription = ({ className, ref, ...props }: AlertDescriptionProps) => ( +
); -AlertDescription.displayName = 'AlertDescription'; export { Alert, AlertTitle, AlertDescription }; diff --git a/packages/ui/src/elements/avatar.tsx b/packages/ui/src/elements/avatar.tsx index 7ce8881b..96492a9f 100644 --- a/packages/ui/src/elements/avatar.tsx +++ b/packages/ui/src/elements/avatar.tsx @@ -23,27 +23,24 @@ type AvatarProps = { email?: string; } & React.ComponentPropsWithoutRef; -const Avatar = React.forwardRef, AvatarProps>( - ({ name, email, className, ...props }, ref) => ( -
- - {name && } -
- ), +type AvatarOwnProps = AvatarProps & { ref?: React.Ref> }; +const Avatar = ({ name, email, className, ref, ...props }: AvatarOwnProps) => ( +
+ + {name && } +
); -Avatar.displayName = AvatarPrimitive.Root.displayName; -const AvatarImage = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, alt = '', ...props }, ref) => ( +type AvatarImageProps = React.ComponentPropsWithoutRef & { + ref?: React.Ref>; +}; +const AvatarImage = ({ className, alt = '', ref, ...props }: AvatarImageProps) => ( -)); -AvatarImage.displayName = AvatarPrimitive.Image.displayName; +); export interface AvatarFallbackProps extends React.ComponentPropsWithoutRef, @@ -51,8 +48,10 @@ export interface AvatarFallbackProps name: string; } -const AvatarFallback = React.forwardRef, AvatarFallbackProps>( - ({ variant, className, name, ...props }, ref) => { +type AvatarFallbackOwnProps = AvatarFallbackProps & { + ref?: React.Ref>; +}; +const AvatarFallback = ({ variant, className, name, ref, ...props }: AvatarFallbackOwnProps) => { const initials = name .split(' ') .map((name) => name[0]) @@ -64,9 +63,7 @@ const AvatarFallback = React.forwardRef ); - }, -); -AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName; +}; type AvatarUserProps = { name: string; diff --git a/packages/ui/src/elements/breadcrumb.tsx b/packages/ui/src/elements/breadcrumb.tsx index 7d6d4a31..3426b1ac 100644 --- a/packages/ui/src/elements/breadcrumb.tsx +++ b/packages/ui/src/elements/breadcrumb.tsx @@ -4,60 +4,40 @@ import * as React from 'react'; import { cn } from '@o2s/ui/lib/utils'; -const Breadcrumb = React.forwardRef< - HTMLElement, - React.ComponentPropsWithoutRef<'nav'> & { - separator?: React.ReactNode; - } ->(({ ...props }, ref) =>