From 075053c38b4bffb31a5d0618949dffa815cb8087 Mon Sep 17 00:00:00 2001 From: ReaJason Date: Thu, 3 Apr 2025 01:49:55 +0800 Subject: [PATCH] chore: upgrade ui components --- web/bun.lockb | Bin 201772 -> 229188 bytes web/package.json | 52 ++- web/src/components/code-viewer.tsx | 19 +- web/src/components/main-config-card.tsx | 4 +- web/src/components/shell-result.tsx | 81 ++--- web/src/components/tools/antsword-tab.tsx | 6 +- web/src/components/tools/behinder-tab.tsx | 6 +- web/src/components/tools/classname-field.tsx | 4 +- web/src/components/tools/command-tab.tsx | 2 +- web/src/components/tools/custom-tab.tsx | 4 +- web/src/components/tools/godzilla-tab.tsx | 8 +- web/src/components/tools/neoreg-tab.tsx | 4 +- web/src/components/tools/shelltype-field.tsx | 2 +- web/src/components/tools/suo5-tab.tsx | 4 +- web/src/components/tools/urlpattern-field.tsx | 2 +- web/src/components/ui/alert-dialog.tsx | 149 ++++---- web/src/components/ui/alert.tsx | 50 +-- web/src/components/ui/button.tsx | 47 +-- web/src/components/ui/card.tsx | 79 +++-- web/src/components/ui/checkbox.tsx | 41 ++- web/src/components/ui/dropdown-menu.tsx | 331 ++++++++++-------- web/src/components/ui/form.tsx | 130 +++---- web/src/components/ui/input.tsx | 31 +- web/src/components/ui/label.tsx | 22 +- web/src/components/ui/radio-group.tsx | 31 +- web/src/components/ui/select.tsx | 246 +++++++------ web/src/components/ui/separator.tsx | 34 +- web/src/components/ui/sonner.tsx | 21 +- web/src/components/ui/switch.tsx | 39 ++- web/src/components/ui/tabs.tsx | 75 ++-- web/src/components/ui/textarea.tsx | 27 +- web/src/components/ui/tooltip.tsx | 56 +-- 32 files changed, 863 insertions(+), 744 deletions(-) diff --git a/web/bun.lockb b/web/bun.lockb index 0f676f387b2913b52ef89eaf33b31e2923b0df3b..c577063858d642dbdd51b03bcc841b45759acc4e 100755 GIT binary patch delta 58537 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 E1L@HN!~g&Q diff --git a/web/package.json b/web/package.json index fb299fb1..8bacb9a9 100644 --- a/web/package.json +++ b/web/package.json @@ -15,50 +15,74 @@ }, "devDependencies": { "@biomejs/biome": "1.9.4", - "@tanstack/router-plugin": "^1.114.30", - "@types/node": "^22.13.14", - "@types/react": "^19.0.12", + "@tanstack/router-plugin": "^1.114.32", + "@types/node": "^22.13.17", + "@types/react": "^19.1.0", "@types/react-copy-to-clipboard": "^5.0.7", - "@types/react-dom": "^19.0.4", + "@types/react-dom": "^19.1.1", "@types/react-syntax-highlighter": "^15.5.13", "@vitejs/plugin-react": "^4.3.4", "rimraf": "^6.0.1", - "tailwindcss": "^4.0.17", + "tailwindcss": "^4.1.1", "typescript": "^5.8.2", - "vite": "^6.2.3", + "vite": "^6.2.4", "vite-bundle-visualizer": "^1.2.1" }, "dependencies": { - "@hookform/resolvers": "^4.1.3", + "@hookform/resolvers": "^5.0.1", + "@radix-ui/react-accordion": "^1.2.3", "@radix-ui/react-alert-dialog": "^1.1.6", + "@radix-ui/react-aspect-ratio": "^1.1.2", + "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-checkbox": "^1.1.4", + "@radix-ui/react-collapsible": "^1.1.3", + "@radix-ui/react-context-menu": "^2.2.6", + "@radix-ui/react-dialog": "^1.1.6", "@radix-ui/react-dropdown-menu": "^2.1.6", + "@radix-ui/react-hover-card": "^1.1.6", "@radix-ui/react-label": "^2.1.2", + "@radix-ui/react-menubar": "^1.1.6", + "@radix-ui/react-navigation-menu": "^1.2.5", + "@radix-ui/react-popover": "^1.1.6", + "@radix-ui/react-progress": "^1.1.2", "@radix-ui/react-radio-group": "^1.2.3", + "@radix-ui/react-scroll-area": "^1.2.3", "@radix-ui/react-select": "^2.1.6", "@radix-ui/react-separator": "^1.1.2", + "@radix-ui/react-slider": "^1.2.3", "@radix-ui/react-slot": "^1.1.2", "@radix-ui/react-switch": "^1.1.3", "@radix-ui/react-tabs": "^1.1.3", + "@radix-ui/react-toggle": "^1.1.2", + "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", - "@tailwindcss/vite": "^4.0.17", - "@tanstack/react-query": "^5.70.0", - "@tanstack/react-router": "^1.114.29", - "@tanstack/router-devtools": "^1.114.29", + "@tailwindcss/vite": "^4.1.1", + "@tanstack/react-query": "^5.71.3", + "@tanstack/react-router": "^1.114.32", + "@tanstack/router-devtools": "^1.114.32", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", + "cmdk": "^1.1.1", + "date-fns": "^4.1.0", + "embla-carousel-react": "^8.5.2", "i18next": "^24.2.3", - "lucide-react": "^0.485.0", + "input-otp": "^1.4.2", + "lucide-react": "^0.487.0", + "next-themes": "^0.4.6", "react": "^19.1.0", "react-copy-to-clipboard": "^5.1.0", + "react-day-picker": "9.6.4", "react-dom": "^19.1.0", "react-hook-form": "^7.55.0", "react-i18next": "^15.4.1", + "react-resizable-panels": "^2.1.7", "react-syntax-highlighter": "^15.6.1", - "sonner": "^2.0.2", - "tailwind-merge": "^3.0.2", + "recharts": "^2.15.1", + "sonner": "^2.0.3", + "tailwind-merge": "^3.1.0", "tailwind-scrollbar": "^4.0.2", "tailwindcss-animate": "^1.0.7", + "vaul": "^1.1.2", "zod": "^3.24.2" }, "trustedDependencies": ["@biomejs/biome"] diff --git a/web/src/components/code-viewer.tsx b/web/src/components/code-viewer.tsx index 572329c9..f193bc37 100644 --- a/web/src/components/code-viewer.tsx +++ b/web/src/components/code-viewer.tsx @@ -1,4 +1,5 @@ import { Button, type ButtonProps } from "@/components/ui/button"; +import { cn } from "@/lib/utils"; import { Check, Copy } from "lucide-react"; import { type HTMLProps, type ReactNode, useCallback, useEffect, useState } from "react"; import { CopyToClipboard } from "react-copy-to-clipboard"; @@ -50,27 +51,24 @@ export function CopyButton({ value }: Readonly) { export function CodeViewer({ code, header, + button, language, height, showLineNumbers = true, wrapLongLines = true, -}: CodeViewerProps) { +}: Readonly) { const lineProps: lineTagPropsFunction | HTMLProps | undefined = wrapLongLines ? { style: { overflowWrap: "break-word", whiteSpace: "pre-wrap" } } : undefined; return (
- {header && ( -
- {header} +
+ {header} +
+ {button}
- )} - {!header && ( -
- -
- )} +
( - + {t("mainConfig.server")} @@ -38,7 +38,7 @@ export function AntSwordTabContent({ control={form.control} name="headerName" render={({ field }) => ( - + {t("shellToolConfig.headerName")} @@ -48,7 +48,7 @@ export function AntSwordTabContent({ control={form.control} name="headerValue" render={({ field }) => ( - + {t("shellToolConfig.headerValue")} diff --git a/web/src/components/tools/behinder-tab.tsx b/web/src/components/tools/behinder-tab.tsx index 964c0a6d..cbc0083d 100644 --- a/web/src/components/tools/behinder-tab.tsx +++ b/web/src/components/tools/behinder-tab.tsx @@ -27,7 +27,7 @@ export function BehinderTabContent({ control={form.control} name="behinderPass" render={({ field }) => ( - + {t("shellToolConfig.behinderPass")} @@ -38,7 +38,7 @@ export function BehinderTabContent({ control={form.control} name="headerName" render={({ field }) => ( - + {t("shellToolConfig.headerName")} @@ -48,7 +48,7 @@ export function BehinderTabContent({ control={form.control} name="headerValue" render={({ field }) => ( - + {t("shellToolConfig.headerValue")} diff --git a/web/src/components/tools/classname-field.tsx b/web/src/components/tools/classname-field.tsx index 5f5a2f7d..3ba5cac9 100644 --- a/web/src/components/tools/classname-field.tsx +++ b/web/src/components/tools/classname-field.tsx @@ -12,7 +12,7 @@ export function OptionalClassFormField({ form }: Readonly<{ form: UseFormReturn< control={form.control} name="shellClassName" render={({ field }) => ( - + {t("mainConfig.shellClassName")} {t("optional")} @@ -24,7 +24,7 @@ export function OptionalClassFormField({ form }: Readonly<{ form: UseFormReturn< control={form.control} name="injectorClassName" render={({ field }) => ( - + {t("mainConfig.injectorClassName")} {t("optional")} diff --git a/web/src/components/tools/command-tab.tsx b/web/src/components/tools/command-tab.tsx index 7ba8f2ac..6fafcb6c 100644 --- a/web/src/components/tools/command-tab.tsx +++ b/web/src/components/tools/command-tab.tsx @@ -27,7 +27,7 @@ export function CommandTabContent({ control={form.control} name="commandParamName" render={({ field }) => ( - + {t("shellToolConfig.paramName")} diff --git a/web/src/components/tools/custom-tab.tsx b/web/src/components/tools/custom-tab.tsx index 9c6c076f..df7b4efa 100644 --- a/web/src/components/tools/custom-tab.tsx +++ b/web/src/components/tools/custom-tab.tsx @@ -32,7 +32,7 @@ export default function CustomTabContent({ control={form.control} name="shellClassBase64" render={({ field }) => ( - + {t("shellToolConfig.base64String")} File
- + {isFile ? ( { diff --git a/web/src/components/tools/godzilla-tab.tsx b/web/src/components/tools/godzilla-tab.tsx index 30aa6f5d..f2f30183 100644 --- a/web/src/components/tools/godzilla-tab.tsx +++ b/web/src/components/tools/godzilla-tab.tsx @@ -28,7 +28,7 @@ export function GodzillaTabContent({ control={form.control} name="godzillaPass" render={({ field }) => ( - + {t("shellToolConfig.pass")} @@ -38,7 +38,7 @@ export function GodzillaTabContent({ control={form.control} name="godzillaKey" render={({ field }) => ( - + {t("shellToolConfig.key")} @@ -48,7 +48,7 @@ export function GodzillaTabContent({ control={form.control} name="headerName" render={({ field }) => ( - + {t("shellToolConfig.headerName")} @@ -58,7 +58,7 @@ export function GodzillaTabContent({ control={form.control} name="headerValue" render={({ field }) => ( - + {t("shellToolConfig.headerValue")} diff --git a/web/src/components/tools/neoreg-tab.tsx b/web/src/components/tools/neoreg-tab.tsx index 61fb1a20..b27307b6 100644 --- a/web/src/components/tools/neoreg-tab.tsx +++ b/web/src/components/tools/neoreg-tab.tsx @@ -28,7 +28,7 @@ export function NeoRegTabContent({ control={form.control} name="headerName" render={({ field }) => ( - + {t("shellToolConfig.headerName")} @@ -38,7 +38,7 @@ export function NeoRegTabContent({ control={form.control} name="headerValue" render={({ field }) => ( - + {t("shellToolConfig.headerValue")} diff --git a/web/src/components/tools/shelltype-field.tsx b/web/src/components/tools/shelltype-field.tsx index 4bd045db..65ce4446 100644 --- a/web/src/components/tools/shelltype-field.tsx +++ b/web/src/components/tools/shelltype-field.tsx @@ -16,7 +16,7 @@ export function ShellTypeFormField({ control={form.control} name="shellType" render={({ field }) => ( - + {t("mainConfig.shellMountType")} @@ -38,7 +38,7 @@ export function Suo5TabContent({ control={form.control} name="headerValue" render={({ field }) => ( - + {t("shellToolConfig.headerValue")} diff --git a/web/src/components/tools/urlpattern-field.tsx b/web/src/components/tools/urlpattern-field.tsx index 5b086e58..23a004a3 100644 --- a/web/src/components/tools/urlpattern-field.tsx +++ b/web/src/components/tools/urlpattern-field.tsx @@ -13,7 +13,7 @@ export function UrlPatternFormField({ form }: Readonly<{ form: UseFormReturn ( - + {t("mainConfig.urlPattern")} diff --git a/web/src/components/ui/alert-dialog.tsx b/web/src/components/ui/alert-dialog.tsx index 6dfbfb49..05f1664b 100644 --- a/web/src/components/ui/alert-dialog.tsx +++ b/web/src/components/ui/alert-dialog.tsx @@ -1,93 +1,102 @@ +"use client"; + import * as React from "react"; import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog"; import { cn } from "@/lib/utils"; import { buttonVariants } from "@/components/ui/button"; -const AlertDialog = AlertDialogPrimitive.Root; +function AlertDialog({ ...props }: React.ComponentProps) { + return ; +} -const AlertDialogTrigger = AlertDialogPrimitive.Trigger; +function AlertDialogTrigger({ ...props }: React.ComponentProps) { + return ; +} -const AlertDialogPortal = AlertDialogPrimitive.Portal; +function AlertDialogPortal({ ...props }: React.ComponentProps) { + return ; +} -const AlertDialogOverlay = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName; - -const AlertDialogContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - ) { + return ( + - -)); -AlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName; + ); +} -const AlertDialogHeader = ({ className, ...props }: React.HTMLAttributes) => ( -
-); -AlertDialogHeader.displayName = "AlertDialogHeader"; +function AlertDialogContent({ className, ...props }: React.ComponentProps) { + return ( + + + + + ); +} -const AlertDialogFooter = ({ className, ...props }: React.HTMLAttributes) => ( -
-); -AlertDialogFooter.displayName = "AlertDialogFooter"; +function AlertDialogHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} -const AlertDialogTitle = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName; +function AlertDialogFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} -const AlertDialogDescription = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AlertDialogDescription.displayName = AlertDialogPrimitive.Description.displayName; +function AlertDialogTitle({ className, ...props }: React.ComponentProps) { + return ( + + ); +} -const AlertDialogAction = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName; +function AlertDialogDescription({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} -const AlertDialogCancel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -AlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName; +function AlertDialogAction({ className, ...props }: React.ComponentProps) { + return ; +} + +function AlertDialogCancel({ className, ...props }: React.ComponentProps) { + return ; +} export { AlertDialog, diff --git a/web/src/components/ui/alert.tsx b/web/src/components/ui/alert.tsx index d457ccb7..aadf66c4 100644 --- a/web/src/components/ui/alert.tsx +++ b/web/src/components/ui/alert.tsx @@ -4,12 +4,13 @@ import { cva, type VariantProps } from "class-variance-authority"; import { cn } from "@/lib/utils"; const alertVariants = cva( - "relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground [&>svg~*]:pl-7", + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", { variants: { variant: { - default: "bg-background text-foreground", - destructive: "border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive", + default: "bg-card text-card-foreground", + destructive: + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", }, }, defaultVariants: { @@ -18,26 +19,31 @@ const alertVariants = cva( }, ); -const Alert = React.forwardRef< - HTMLDivElement, - React.HTMLAttributes & VariantProps ->(({ className, variant, ...props }, ref) => ( -
-)); -Alert.displayName = "Alert"; +function Alert({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps) { + return
; +} -const AlertTitle = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -AlertTitle.displayName = "AlertTitle"; +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} -const AlertDescription = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -AlertDescription.displayName = "AlertDescription"; +function AlertDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} export { Alert, AlertTitle, AlertDescription }; diff --git a/web/src/components/ui/button.tsx b/web/src/components/ui/button.tsx index ef8b515f..0e17490e 100644 --- a/web/src/components/ui/button.tsx +++ b/web/src/components/ui/button.tsx @@ -5,22 +5,24 @@ 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-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", + "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", { variants: { variant: { - default: "bg-primary text-primary-foreground shadow hover:bg-primary/90", - destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", - outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", - secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", - ghost: "hover:bg-accent hover:text-accent-foreground", + 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", + 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", + secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", link: "text-primary underline-offset-4 hover:underline", }, size: { - default: "h-9 px-4 py-2", - sm: "h-8 rounded-md px-3 text-xs", - lg: "h-10 rounded-md px-8", - icon: "h-9 w-9", + 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", + icon: "size-9", }, }, defaultVariants: { @@ -30,18 +32,19 @@ const buttonVariants = cva( }, ); -export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean; +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean; + }) { + const Comp = asChild ? Slot : "button"; + + return ; } -const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : "button"; - return ; - }, -); -Button.displayName = "Button"; - export { Button, buttonVariants }; diff --git a/web/src/components/ui/card.tsx b/web/src/components/ui/card.tsx index 82099ea7..a8fc56ae 100644 --- a/web/src/components/ui/card.tsx +++ b/web/src/components/ui/card.tsx @@ -2,42 +2,55 @@ import * as React from "react"; import { cn } from "@/lib/utils"; -const Card = React.forwardRef>(({ className, ...props }, ref) => ( -
-)); -Card.displayName = "Card"; +function Card({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} -const CardHeader = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -CardHeader.displayName = "CardHeader"; +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} -const CardTitle = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -CardTitle.displayName = "CardTitle"; +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return
; +} -const CardDescription = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -CardDescription.displayName = "CardDescription"; +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return
; +} -const CardContent = React.forwardRef>( - ({ className, ...props }, ref) =>
, -); -CardContent.displayName = "CardContent"; +function CardAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} -const CardFooter = React.forwardRef>( - ({ className, ...props }, ref) => ( -
- ), -); -CardFooter.displayName = "CardFooter"; +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return
; +} -export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }; +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent }; diff --git a/web/src/components/ui/checkbox.tsx b/web/src/components/ui/checkbox.tsx index 5a4cc5a5..af4f2a07 100644 --- a/web/src/components/ui/checkbox.tsx +++ b/web/src/components/ui/checkbox.tsx @@ -1,26 +1,29 @@ +"use client"; + import * as React from "react"; import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; -import { Check } from "lucide-react"; +import { CheckIcon } from "lucide-react"; import { cn } from "@/lib/utils"; -const Checkbox = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - - - - - -)); -Checkbox.displayName = CheckboxPrimitive.Root.displayName; +function Checkbox({ className, ...props }: React.ComponentProps) { + return ( + + + + + + ); +} export { Checkbox }; diff --git a/web/src/components/ui/dropdown-menu.tsx b/web/src/components/ui/dropdown-menu.tsx index 767ced0c..43ea299f 100644 --- a/web/src/components/ui/dropdown-menu.tsx +++ b/web/src/components/ui/dropdown-menu.tsx @@ -1,180 +1,219 @@ +"use client"; + import * as React from "react"; import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; -import { Check, ChevronRight, Circle } from "lucide-react"; +import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"; import { cn } from "@/lib/utils"; -const DropdownMenu = DropdownMenuPrimitive.Root; +function DropdownMenu({ ...props }: React.ComponentProps) { + return ; +} -const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; +function DropdownMenuPortal({ ...props }: React.ComponentProps) { + return ; +} -const DropdownMenuGroup = DropdownMenuPrimitive.Group; +function DropdownMenuTrigger({ ...props }: React.ComponentProps) { + return ; +} -const DropdownMenuPortal = DropdownMenuPrimitive.Portal; +function DropdownMenuContent({ + className, + sideOffset = 4, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} -const DropdownMenuSub = DropdownMenuPrimitive.Sub; +function DropdownMenuGroup({ ...props }: React.ComponentProps) { + return ; +} -const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; - -const DropdownMenuSubTrigger = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, children, ...props }, ref) => ( - - {children} - - -)); -DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName; - -const DropdownMenuSubContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName; - -const DropdownMenuContent = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, sideOffset = 4, ...props }, ref) => ( - - & { + inset?: boolean; + variant?: "default" | "destructive"; +}) { + return ( + - -)); -DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName; + ); +} -const DropdownMenuItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - svg]:size-4 [&>svg]:shrink-0", - inset && "pl-8", - className, - )} - {...props} - /> -)); -DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName; +function DropdownMenuCheckboxItem({ + className, + children, + checked, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ); +} -const DropdownMenuCheckboxItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, checked, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuCheckboxItem.displayName = DropdownMenuPrimitive.CheckboxItem.displayName; +function DropdownMenuRadioGroup({ ...props }: React.ComponentProps) { + return ; +} -const DropdownMenuRadioItem = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, children, ...props }, ref) => ( - - - - - - - {children} - -)); -DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName; +function DropdownMenuRadioItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ); +} -const DropdownMenuLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef & { - inset?: boolean; - } ->(({ className, inset, ...props }, ref) => ( - -)); -DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName; +function DropdownMenuLabel({ + className, + inset, + ...props +}: React.ComponentProps & { + inset?: boolean; +}) { + return ( + + ); +} -const DropdownMenuSeparator = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => ( - -)); -DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName; +function DropdownMenuSeparator({ className, ...props }: React.ComponentProps) { + return ( + + ); +} -const DropdownMenuShortcut = ({ className, ...props }: React.HTMLAttributes) => { - return ; -}; -DropdownMenuShortcut.displayName = "DropdownMenuShortcut"; +function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">) { + return ( + + ); +} + +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 ( + + ); +} export { DropdownMenu, + DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, + DropdownMenuRadioGroup, DropdownMenuRadioItem, - DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuShortcut, - DropdownMenuGroup, - DropdownMenuPortal, DropdownMenuSub, - DropdownMenuSubContent, DropdownMenuSubTrigger, - DropdownMenuRadioGroup, + DropdownMenuSubContent, }; diff --git a/web/src/components/ui/form.tsx b/web/src/components/ui/form.tsx index d2465746..d2f203f4 100644 --- a/web/src/components/ui/form.tsx +++ b/web/src/components/ui/form.tsx @@ -1,7 +1,15 @@ import * as React from "react"; import * as LabelPrimitive from "@radix-ui/react-label"; import { Slot } from "@radix-ui/react-slot"; -import { Controller, ControllerProps, FieldPath, FieldValues, FormProvider, useFormContext } from "react-hook-form"; +import { + Controller, + FormProvider, + useFormContext, + useFormState, + type ControllerProps, + type FieldPath, + type FieldValues, +} from "react-hook-form"; import { cn } from "@/lib/utils"; import { Label } from "@/components/ui/label"; @@ -33,8 +41,8 @@ const FormField = < const useFormField = () => { const fieldContext = React.useContext(FormFieldContext); const itemContext = React.useContext(FormItemContext); - const { getFieldState, formState } = useFormContext(); - + const { getFieldState } = useFormContext(); + const formState = useFormState({ name: fieldContext.name }); const fieldState = getFieldState(fieldContext.name, formState); if (!fieldContext) { @@ -59,78 +67,70 @@ type FormItemContextValue = { const FormItemContext = React.createContext({} as FormItemContextValue); -const FormItem = React.forwardRef>( - ({ className, ...props }, ref) => { - const id = React.useId(); +function FormItem({ className, ...props }: React.ComponentProps<"div">) { + const id = React.useId(); - return ( - -
- - ); - }, -); -FormItem.displayName = "FormItem"; + return ( + +
+ + ); +} -const FormLabel = React.forwardRef< - React.ElementRef, - React.ComponentPropsWithoutRef ->(({ className, ...props }, ref) => { +function FormLabel({ className, ...props }: React.ComponentProps) { const { error, formItemId } = useFormField(); - return