diff --git a/packages/rdx-ui/package.json b/packages/rdx-ui/package.json index 53ad8c14..47e00620 100644 --- a/packages/rdx-ui/package.json +++ b/packages/rdx-ui/package.json @@ -54,7 +54,7 @@ "class-variance-authority": "^0.7.1", "cmdk": "^1.1.1", "esbuild-raw-plugin": "^0.2.0", - "lucide-react": "^0.503.0", + "lucide-react": "^0.577.0", "react-i18next": "^15.5.1", "react-router": "^6.26.0", "react-router-dom": "^6.26.0", diff --git a/packages/rdx-ui/src/components/datatable/data-table-column-header.tsx b/packages/rdx-ui/src/components/datatable/data-table-column-header.tsx index c9c9f940..fdafb61e 100644 --- a/packages/rdx-ui/src/components/datatable/data-table-column-header.tsx +++ b/packages/rdx-ui/src/components/datatable/data-table-column-header.tsx @@ -3,11 +3,12 @@ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, + DropdownMenuSeparator, DropdownMenuTrigger, } from "@repo/shadcn-ui/components"; import { cn } from "@repo/shadcn-ui/lib/utils"; import type { Column } from "@tanstack/react-table"; -import { ArrowDown, ArrowDownIcon, ArrowUp, ArrowUpIcon, ChevronsUpDownIcon } from "lucide-react"; +import { ArrowDownIcon, ArrowUpIcon, ChevronsUpDownIcon, EyeOffIcon } from "lucide-react"; import { useTranslation } from "../../locales/i18n.ts"; @@ -24,46 +25,44 @@ export function DataTableColumnHeader({ const { t } = useTranslation(); if (!column.getCanSort()) { - return ( -
- {title} -
- ); + return
{title}
; } return ( -
+
column.toggleSorting(false)}> - + {t("components.datatable.asc")} column.toggleSorting(true)}> - + {t("components.datatable.desc")} + + column.toggleVisibility(false)}> + + {t("components.datatable.hide")} +
diff --git a/packages/rdx-ui/src/components/datatable/data-table-pagination.tsx b/packages/rdx-ui/src/components/datatable/data-table-pagination.tsx index 345b03ee..fb5d48d4 100644 --- a/packages/rdx-ui/src/components/datatable/data-table-pagination.tsx +++ b/packages/rdx-ui/src/components/datatable/data-table-pagination.tsx @@ -68,9 +68,9 @@ export function DataTablePagination({ const gotoLastPage = () => gotoPage(pageCount - 1); return ( -
+
{/* Información izquierda */} -
+
{t("components.datatable.pagination.showing_range", { start, end, total: totalRows })} diff --git a/packages/rdx-ui/src/components/datatable/data-table.tsx b/packages/rdx-ui/src/components/datatable/data-table.tsx index d0788a5a..a29d8ca5 100644 --- a/packages/rdx-ui/src/components/datatable/data-table.tsx +++ b/packages/rdx-ui/src/components/datatable/data-table.tsx @@ -189,7 +189,7 @@ export function DataTable({
{/* CABECERA */} - + {table.getHeaderGroups().map((hg) => ( {hg.headers.map((h) => { @@ -206,11 +206,9 @@ export function DataTable({ maxWidth: typeof maxW === "number" ? `${maxW}px` : undefined, }} > -
- {h.isPlaceholder - ? null - : flexRender(h.column.columnDef.header, h.getContext())} -
+ {h.isPlaceholder + ? null + : flexRender(h.column.columnDef.header, h.getContext())} ); })} @@ -271,7 +269,7 @@ export function DataTable({ {/* Paginación */} {enablePagination && ( - + { > {/* Aquí está el MAIN */} - + diff --git a/packages/rdx-ui/src/components/layout/search-form.tsx b/packages/rdx-ui/src/components/layout/search-form.tsx index 2a8eb8f8..e78e3aa0 100644 --- a/packages/rdx-ui/src/components/layout/search-form.tsx +++ b/packages/rdx-ui/src/components/layout/search-form.tsx @@ -12,22 +12,22 @@ import { BinocularsIcon, SearchIcon } from "lucide-react"; export function SearchForm({ ...props }: React.ComponentProps<"form">) { return (
- - + + - - diff --git a/packages/rdx-ui/src/helpers/toast-utils.ts b/packages/rdx-ui/src/helpers/toast-utils.ts index 5a1e53fd..0d773916 100644 --- a/packages/rdx-ui/src/helpers/toast-utils.ts +++ b/packages/rdx-ui/src/helpers/toast-utils.ts @@ -1,4 +1,4 @@ -import { toast } from "@repo/shadcn-ui/components"; +import { toast } from "sonner"; /** * Muestra un toast de aviso diff --git a/packages/shadcn-ui/components.json b/packages/shadcn-ui/components.json index 3f96316a..5cced8c9 100644 --- a/packages/shadcn-ui/components.json +++ b/packages/shadcn-ui/components.json @@ -1,6 +1,6 @@ { "$schema": "https://ui.shadcn.com/schema.json", - "style": "new-york", + "style": "radix-nova", "rsc": false, "tsx": true, "tailwind": { @@ -10,6 +10,7 @@ "cssVariables": true, "prefix": "" }, + "iconLibrary": "lucide", "aliases": { "components": "@repo/shadcn-ui/components", "utils": "@repo/shadcn-ui/lib/utils", @@ -17,6 +18,7 @@ "lib": "@repo/shadcn-ui/lib", "hooks": "@repo/shadcn-ui/hooks" }, - "iconLibrary": "lucide", - "rtl": true + "rtl": false, + "menuColor": "default", + "menuAccent": "subtle" } \ No newline at end of file diff --git a/packages/shadcn-ui/package.json b/packages/shadcn-ui/package.json index d9bca9be..0fdd1359 100644 --- a/packages/shadcn-ui/package.json +++ b/packages/shadcn-ui/package.json @@ -35,9 +35,12 @@ "postcss": "^8.5.3", "react": "^19.1.0", "react-dom": "^19.1.0", + "shadcn": "^4.0.8", + "tw-animate-css": "^1.4.0", "typescript": "^5.6.0" }, "dependencies": { + "@fontsource-variable/geist": "^5.2.8", "@hookform/resolvers": "^5.2.2", "add": "^2.0.6", "class-variance-authority": "^0.7.1", @@ -47,19 +50,18 @@ "embla-carousel-react": "^8.6.0", "framer-motion": "^12.4.7", "input-otp": "^1.4.2", - "lucide-react": "^0.503.0", + "lucide-react": "^0.577.0", "next-themes": "^0.4.6", "pnpm": "^10.10.0", - "react-day-picker": "9.11.1", + "radix-ui": "latest", + "react-day-picker": "9.14.0", "react-hook-form": "^7.65.0", "react-resizable-panels": "^3.0.6", - "recharts": "^2.15.4", + "recharts": "2.15.4", "sonner": "^2.0.7", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.5.0", "tailwindcss": "^4.1.10", - "tw-animate-css": "^1.2.9", "vaul": "^1.1.2", - "zod": "^3.25.76", - "radix-ui": "latest" + "zod": "^3.25.76" } } \ No newline at end of file diff --git a/packages/shadcn-ui/src/components/accordion.tsx b/packages/shadcn-ui/src/components/accordion.tsx index 49a0bcbd..b390c16b 100644 --- a/packages/shadcn-ui/src/components/accordion.tsx +++ b/packages/shadcn-ui/src/components/accordion.tsx @@ -1,13 +1,20 @@ import * as React from "react" import { Accordion as AccordionPrimitive } from "radix-ui" -import { ChevronDownIcon } from "lucide-react" import { cn } from "@repo/shadcn-ui/lib/utils" +import { ChevronDownIcon, ChevronUpIcon } from "lucide-react" function Accordion({ + className, ...props }: React.ComponentProps) { - return + return ( + + ) } function AccordionItem({ @@ -17,7 +24,7 @@ function AccordionItem({ return ( ) @@ -33,13 +40,14 @@ function AccordionTrigger({ svg]:rotate-180", + "group/accordion-trigger relative flex flex-1 items-start justify-between rounded-lg border border-transparent py-2.5 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 focus-visible:after:border-ring disabled:pointer-events-none disabled:opacity-50 **:data-[slot=accordion-trigger-icon]:ml-auto **:data-[slot=accordion-trigger-icon]:size-4 **:data-[slot=accordion-trigger-icon]:text-muted-foreground", className )} {...props} > {children} - + + ) @@ -53,10 +61,17 @@ function AccordionContent({ return ( -
{children}
+
+ {children} +
) } diff --git a/packages/shadcn-ui/src/components/alert-dialog.tsx b/packages/shadcn-ui/src/components/alert-dialog.tsx index 8b208a64..1290c9b1 100644 --- a/packages/shadcn-ui/src/components/alert-dialog.tsx +++ b/packages/shadcn-ui/src/components/alert-dialog.tsx @@ -2,7 +2,7 @@ import * as React from "react" import { AlertDialog as AlertDialogPrimitive } from "radix-ui" import { cn } from "@repo/shadcn-ui/lib/utils" -import { buttonVariants } from "@repo/shadcn-ui/components/button" +import { Button } from "@repo/shadcn-ui/components/button" function AlertDialog({ ...props @@ -34,7 +34,7 @@ function AlertDialogOverlay({ ) { +}: React.ComponentProps & { + size?: "default" | "sm" +}) { return ( ) @@ -82,7 +89,23 @@ function AlertDialogFooter({
+ ) +} + +function AlertDialogMedia({ + className, + ...props +}: React.ComponentProps<"div">) { + return ( +
) @@ -110,7 +136,10 @@ function AlertDialogDescription({ return ( ) @@ -118,38 +147,51 @@ function AlertDialogDescription({ function AlertDialogAction({ className, + variant = "default", + size = "default", ...props -}: React.ComponentProps) { +}: React.ComponentProps & + Pick, "variant" | "size">) { return ( - + ) } function AlertDialogCancel({ className, + variant = "outline", + size = "default", ...props -}: React.ComponentProps) { +}: React.ComponentProps & + Pick, "variant" | "size">) { return ( - + ) } export { AlertDialog, - AlertDialogPortal, - AlertDialogOverlay, - AlertDialogTrigger, - AlertDialogContent, - AlertDialogHeader, - AlertDialogFooter, - AlertDialogTitle, - AlertDialogDescription, AlertDialogAction, AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogMedia, + AlertDialogOverlay, + AlertDialogPortal, + AlertDialogTitle, + AlertDialogTrigger, } diff --git a/packages/shadcn-ui/src/components/alert.tsx b/packages/shadcn-ui/src/components/alert.tsx index cb11ebb3..5197a955 100644 --- a/packages/shadcn-ui/src/components/alert.tsx +++ b/packages/shadcn-ui/src/components/alert.tsx @@ -4,13 +4,13 @@ import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@repo/shadcn-ui/lib/utils" const alertVariants = cva( - "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", + "group/alert relative grid w-full gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4", { variants: { variant: { default: "bg-card text-card-foreground", destructive: - "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", + "bg-card text-destructive *:data-[slot=alert-description]:text-destructive/90 *:[svg]:text-current", }, }, defaultVariants: { @@ -39,7 +39,7 @@ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
svg]/alert:col-start-2 [&_a]:underline [&_a]:underline-offset-3 [&_a]:hover:text-foreground", className )} {...props} @@ -55,7 +55,7 @@ function AlertDescription({
) { + return ( +
+ ) +} + +export { Alert, AlertTitle, AlertDescription, AlertAction } diff --git a/packages/shadcn-ui/src/components/avatar.tsx b/packages/shadcn-ui/src/components/avatar.tsx index aaa4d9a5..0043e851 100644 --- a/packages/shadcn-ui/src/components/avatar.tsx +++ b/packages/shadcn-ui/src/components/avatar.tsx @@ -5,13 +5,17 @@ import { cn } from "@repo/shadcn-ui/lib/utils" function Avatar({ className, + size = "default", ...props -}: React.ComponentProps) { +}: React.ComponentProps & { + size?: "default" | "sm" | "lg" +}) { return ( ) @@ -40,7 +47,7 @@ function AvatarFallback({ ) { + 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} + /> + ) +} + +export { + Avatar, + AvatarImage, + AvatarFallback, + AvatarGroup, + AvatarGroupCount, + AvatarBadge, +} diff --git a/packages/shadcn-ui/src/components/badge.tsx b/packages/shadcn-ui/src/components/badge.tsx index b02f598b..72b2aed2 100644 --- a/packages/shadcn-ui/src/components/badge.tsx +++ b/packages/shadcn-ui/src/components/badge.tsx @@ -1,22 +1,24 @@ import * as React from "react" -import { Slot as SlotPrimitive } from "radix-ui" import { cva, type VariantProps } from "class-variance-authority" +import { Slot } from "radix-ui" import { cn } from "@repo/shadcn-ui/lib/utils" const badgeVariants = cva( - "inline-flex items-center justify-center rounded-full 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,16 +29,17 @@ const badgeVariants = cva( function Badge({ className, - variant, + variant = "default", asChild = false, ...props }: React.ComponentProps<"span"> & VariantProps & { asChild?: boolean }) { - const Comp = asChild ? SlotPrimitive.Slot : "span" + const Comp = asChild ? Slot.Root : "span" return ( diff --git a/packages/shadcn-ui/src/components/breadcrumb.tsx b/packages/shadcn-ui/src/components/breadcrumb.tsx index 7304d982..62863575 100644 --- a/packages/shadcn-ui/src/components/breadcrumb.tsx +++ b/packages/shadcn-ui/src/components/breadcrumb.tsx @@ -1,11 +1,18 @@ import * as React from "react" -import { Slot as SlotPrimitive } from "radix-ui" -import { ChevronRight, MoreHorizontal } from "lucide-react" +import { Slot } from "radix-ui" import { cn } from "@repo/shadcn-ui/lib/utils" +import { ChevronRightIcon, MoreHorizontalIcon } from "lucide-react" -function Breadcrumb({ ...props }: React.ComponentProps<"nav">) { - return