create-lexy 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/assets/r/accordion.json +25 -0
  2. package/assets/r/alert-dialog.json +28 -0
  3. package/assets/r/app-accordion.json +25 -0
  4. package/assets/r/app-dialog.json +26 -0
  5. package/assets/r/app-header-bar.json +29 -0
  6. package/assets/r/app-sidebar.json +28 -0
  7. package/assets/r/avatar.json +25 -0
  8. package/assets/r/badge.json +25 -0
  9. package/assets/r/breadcrumb.json +25 -0
  10. package/assets/r/button-group.json +28 -0
  11. package/assets/r/button.json +1 -0
  12. package/assets/r/calendar.json +28 -0
  13. package/assets/r/card.json +25 -0
  14. package/assets/r/chart.json +25 -0
  15. package/assets/r/checkbox.json +25 -0
  16. package/assets/r/combobox.json +27 -0
  17. package/assets/r/command.json +25 -0
  18. package/assets/r/confirmacion.json +27 -0
  19. package/assets/r/counter-badge.json +25 -0
  20. package/assets/r/crm-app-layout.json +29 -0
  21. package/assets/r/crm-desk.json +31 -0
  22. package/assets/r/crm-detalle-caso.json +28 -0
  23. package/assets/r/date-picker.json +30 -0
  24. package/assets/r/dialog.json +25 -0
  25. package/assets/r/dropdown-menu.json +25 -0
  26. package/assets/r/empty.json +25 -0
  27. package/assets/r/feature-card.json +23 -0
  28. package/assets/r/form.json +30 -0
  29. package/assets/r/header-bar.json +27 -0
  30. package/assets/r/input.json +23 -0
  31. package/assets/r/intake-wizard.json +28 -0
  32. package/assets/r/label.json +26 -0
  33. package/assets/r/login.json +28 -0
  34. package/assets/r/logo.json +131 -0
  35. package/assets/r/menubar.json +25 -0
  36. package/assets/r/navigation-menu.json +26 -0
  37. package/assets/r/pagination.json +28 -0
  38. package/assets/r/popover.json +25 -0
  39. package/assets/r/profile-card.json +26 -0
  40. package/assets/r/progress.json +25 -0
  41. package/assets/r/radio-group.json +25 -0
  42. package/assets/r/registry.json +1447 -1
  43. package/assets/r/scroll-area.json +25 -0
  44. package/assets/r/searchbox.json +23 -0
  45. package/assets/r/select.json +25 -0
  46. package/assets/r/separator.json +25 -0
  47. package/assets/r/sheet.json +26 -0
  48. package/assets/r/sidebar.json +34 -0
  49. package/assets/r/skeleton.json +25 -0
  50. package/assets/r/slider.json +25 -0
  51. package/assets/r/snippet.json +25 -0
  52. package/assets/r/spinner.json +26 -0
  53. package/assets/r/status-dot.json +25 -0
  54. package/assets/r/switch.json +25 -0
  55. package/assets/r/table.json +25 -0
  56. package/assets/r/tabs.json +25 -0
  57. package/assets/r/tag.json +25 -0
  58. package/assets/r/textarea.json +23 -0
  59. package/assets/r/toaster.json +25 -0
  60. package/assets/r/tooltip.json +25 -0
  61. package/assets/r/tree.json +23 -0
  62. package/assets/theme/lexy-theme.css +3 -0
  63. package/dist/index.js +37 -36
  64. package/package.json +1 -1
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "menubar",
4
+ "type": "registry:ui",
5
+ "title": "Menubar",
6
+ "description": "Barra de menús horizontal. Para navegación de aplicación. El componente vive en tu proyecto: instálalo con `create-lexy add menubar` y edítalo con libertad.",
7
+ "dependencies": [
8
+ "@radix-ui/react-menubar"
9
+ ],
10
+ "registryDependencies": [],
11
+ "files": [
12
+ {
13
+ "path": "components/base/Menubar.tsx",
14
+ "type": "registry:ui",
15
+ "target": "components/base/Menubar.tsx",
16
+ "content": "import * as React from \"react\";\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst MenubarMenu = MenubarPrimitive.Menu;\nconst MenubarGroup = MenubarPrimitive.Group;\nconst MenubarPortal = MenubarPrimitive.Portal;\nconst MenubarSub = MenubarPrimitive.Sub;\nconst MenubarRadioGroup = MenubarPrimitive.RadioGroup;\n\nconst ChevronRightIcon = () => (\n <svg\n className='ml-auto h-4 w-4'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='2'\n strokeLinecap='round'\n strokeLinejoin='round'>\n <path d='m9 18 6-6-6-6' />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n className='h-4 w-4'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='2'\n strokeLinecap='round'\n strokeLinejoin='round'>\n <path d='M20 6 9 17l-5-5' />\n </svg>\n);\n\nconst DotIcon = () => (\n <svg className='h-2 w-2 fill-current' viewBox='0 0 24 24'>\n <circle cx='12' cy='12' r='12' />\n </svg>\n);\n\nconst Menubar = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Root\n ref={ref}\n className={cn(\n \"flex h-10 items-center gap-1 rounded border border-border bg-background p-1\",\n className,\n )}\n {...props}\n />\n));\nMenubar.displayName = MenubarPrimitive.Root.displayName;\n\nconst MenubarTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex cursor-pointer select-none items-center rounded px-3 py-1.5 text-sm font-medium text-foreground outline-none focus:bg-primary/15 focus:text-primary data-[state=open]:bg-primary/15 data-[state=open]:text-primary\",\n className,\n )}\n {...props}\n />\n));\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;\n\nconst MenubarSubTrigger = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <MenubarPrimitive.SubTrigger\n ref={ref}\n className={cn(\n \"flex cursor-pointer select-none items-center rounded px-2 py-1.5 text-sm outline-none focus:bg-primary/15 focus:text-primary data-[state=open]:bg-primary/15 data-[state=open]:text-primary\",\n inset && \"pl-8\",\n className,\n )}\n {...props}>\n {children}\n <ChevronRightIcon />\n </MenubarPrimitive.SubTrigger>\n));\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;\n\nconst MenubarSubContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.SubContent\n ref={ref}\n className={cn(\n \"z-50 min-w-32 overflow-hidden rounded border border-border bg-popover p-1 text-popover-foreground shadow-md 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\",\n className,\n )}\n {...props}\n />\n));\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;\n\nconst MenubarContent = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(\n (\n { className, align = \"start\", alignOffset = -4, sideOffset = 8, ...props },\n ref,\n ) => (\n <MenubarPortal>\n <MenubarPrimitive.Content\n ref={ref}\n align={align}\n alignOffset={alignOffset}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 min-w-48 overflow-hidden rounded border border-border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95\",\n className,\n )}\n {...props}\n />\n </MenubarPortal>\n ),\n);\nMenubarContent.displayName = MenubarPrimitive.Content.displayName;\n\nconst MenubarItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded px-2 py-1.5 text-sm outline-none focus:bg-primary/15 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nMenubarItem.displayName = MenubarPrimitive.Item.displayName;\n\nconst MenubarCheckboxItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <MenubarPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-primary/15 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n checked={checked}\n {...props}>\n <span className='absolute left-2 flex h-3.5 w-3.5 items-center justify-center'>\n <MenubarPrimitive.ItemIndicator>\n <CheckIcon />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.CheckboxItem>\n));\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;\n\nconst MenubarRadioItem = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <MenubarPrimitive.RadioItem\n ref={ref}\n className={cn(\n \"relative flex cursor-pointer select-none items-center rounded py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-primary/15 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}>\n <span className='absolute left-2 flex h-3.5 w-3.5 items-center justify-center'>\n <MenubarPrimitive.ItemIndicator>\n <DotIcon />\n </MenubarPrimitive.ItemIndicator>\n </span>\n {children}\n </MenubarPrimitive.RadioItem>\n));\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;\n\nconst MenubarLabel = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <MenubarPrimitive.Label\n ref={ref}\n className={cn(\n \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n />\n));\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName;\n\nconst MenubarSeparator = React.forwardRef<\n React.ElementRef<typeof MenubarPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <MenubarPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n));\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;\n\nconst MenubarShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest text-muted-foreground\",\n className,\n )}\n {...props}\n />\n);\nMenubarShortcut.displayName = \"MenubarShortcut\";\n\nexport {\n Menubar,\n MenubarMenu,\n MenubarTrigger,\n MenubarContent,\n MenubarItem,\n MenubarSeparator,\n MenubarLabel,\n MenubarCheckboxItem,\n MenubarRadioGroup,\n MenubarRadioItem,\n MenubarPortal,\n MenubarSubContent,\n MenubarSubTrigger,\n MenubarGroup,\n MenubarSub,\n MenubarShortcut,\n};\n"
17
+ },
18
+ {
19
+ "path": "components/base/Menubar.md",
20
+ "type": "registry:file",
21
+ "target": "components/base/Menubar.md",
22
+ "content": "# Menubar — guía de uso\n\nBarra de menús horizontal. Para navegación de aplicación. El componente vive en tu proyecto: instálalo con `create-lexy add menubar` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport { Menubar } from \"@/components/base/Menubar\";\n```\n\n## Uso básico\n\n```tsx\n<Menubar />\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Reglas\n\n- Usa Menubar según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa Menubar desde el path correcto.\n3. Configura las props según la necesidad.\n4. Verifica que el componente se integre correctamente en el layout.\n5. Solo usa variantes documentadas.\n"
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "navigation-menu",
4
+ "type": "registry:ui",
5
+ "title": "NavigationMenu",
6
+ "description": "Menú de navegación con dropdowns. Para sitios web. El componente vive en tu proyecto: instálalo con `create-lexy add navigation-menu` y edítalo con libertad.",
7
+ "dependencies": [
8
+ "@radix-ui/react-navigation-menu",
9
+ "class-variance-authority"
10
+ ],
11
+ "registryDependencies": [],
12
+ "files": [
13
+ {
14
+ "path": "components/base/NavigationMenu.tsx",
15
+ "type": "registry:ui",
16
+ "target": "components/base/NavigationMenu.tsx",
17
+ "content": "import * as React from \"react\";\nimport * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\";\nimport { cva } from \"class-variance-authority\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst NavigationMenu = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n <NavigationMenuPrimitive.Root\n ref={ref}\n className={cn(\n \"relative z-10 flex max-w-max flex-1 items-center justify-center\",\n className,\n )}\n {...props}>\n {children}\n <NavigationMenuViewport />\n </NavigationMenuPrimitive.Root>\n));\nNavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;\n\nconst NavigationMenuList = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.List\n ref={ref}\n className={cn(\n \"group flex flex-1 list-none items-center justify-center gap-1\",\n className,\n )}\n {...props}\n />\n));\nNavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;\n\nconst NavigationMenuItem = NavigationMenuPrimitive.Item;\n\nconst navigationMenuTriggerStyle = cva(\n \"group inline-flex h-10 w-max cursor-pointer items-center justify-center rounded bg-background px-4 py-2 text-sm font-medium text-foreground transition-colors hover:bg-primary/15 hover:text-primary focus:bg-primary/15 focus:text-primary focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[active]:bg-secondary data-[state=open]:bg-secondary\",\n);\n\nconst NavigationMenuTrigger = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>\n>(({ className, children, onPointerMove, onPointerLeave, ...props }, ref) => (\n <NavigationMenuPrimitive.Trigger\n ref={ref}\n className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n // Desactiva la apertura por hover para evitar el conflicto hover/click de\n // Radix (el menú se cerraba al reabrirlo tras un click). Queda controlado\n // por click y teclado. Radix omite su handler si el evento está prevenido.\n onPointerMove={(event) => {\n event.preventDefault();\n onPointerMove?.(event);\n }}\n onPointerLeave={(event) => {\n event.preventDefault();\n onPointerLeave?.(event);\n }}\n {...props}>\n {children}{\" \"}\n <svg\n className='relative top-px ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180'\n viewBox='0 0 24 24'\n fill='none'\n stroke='currentColor'\n strokeWidth='2'\n strokeLinecap='round'\n strokeLinejoin='round'\n aria-hidden='true'>\n <path d='m6 9 6 6 6-6' />\n </svg>\n </NavigationMenuPrimitive.Trigger>\n));\nNavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;\n\nconst NavigationMenuContent = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.Content\n ref={ref}\n className={cn(\n \"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out md:absolute md:w-auto\",\n className,\n )}\n {...props}\n />\n));\nNavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;\n\nconst NavigationMenuLink = NavigationMenuPrimitive.Link;\n\nconst NavigationMenuViewport = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>\n>(({ className, ...props }, ref) => (\n <div className={cn(\"absolute left-0 top-full flex justify-center\")}>\n <NavigationMenuPrimitive.Viewport\n ref={ref}\n className={cn(\n \"origin-top-center relative mt-2 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded border border-border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n className,\n )}\n {...props}\n />\n </div>\n));\nNavigationMenuViewport.displayName =\n NavigationMenuPrimitive.Viewport.displayName;\n\nconst NavigationMenuIndicator = React.forwardRef<\n React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,\n React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>\n>(({ className, ...props }, ref) => (\n <NavigationMenuPrimitive.Indicator\n ref={ref}\n className={cn(\n \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in\",\n className,\n )}\n {...props}>\n <div className='relative top-[60%] h-2 w-2 rotate-45 rounded-tl bg-border shadow-md' />\n </NavigationMenuPrimitive.Indicator>\n));\nNavigationMenuIndicator.displayName =\n NavigationMenuPrimitive.Indicator.displayName;\n\nexport {\n navigationMenuTriggerStyle,\n NavigationMenu,\n NavigationMenuList,\n NavigationMenuItem,\n NavigationMenuContent,\n NavigationMenuTrigger,\n NavigationMenuLink,\n NavigationMenuIndicator,\n NavigationMenuViewport,\n};\n"
18
+ },
19
+ {
20
+ "path": "components/base/NavigationMenu.md",
21
+ "type": "registry:file",
22
+ "target": "components/base/NavigationMenu.md",
23
+ "content": "# NavigationMenu — guía de uso\n\nMenú de navegación con dropdowns. Para sitios web. El componente vive en tu proyecto: instálalo con `create-lexy add navigation-menu` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport { NavigationMenu } from \"@/components/base/NavigationMenu\";\n```\n\n## Uso básico\n\n```tsx\n<NavigationMenu />\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Reglas\n\n- Usa NavigationMenu según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa NavigationMenu desde el path correcto.\n3. Configura las props según la necesidad.\n4. Verifica que el componente se integre correctamente en el layout.\n5. Solo usa variantes documentadas.\n"
24
+ }
25
+ ]
26
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "pagination",
4
+ "type": "registry:ui",
5
+ "title": "Pagination",
6
+ "description": "Navegación de paginación para listados, tablas y resultados de búsqueda.",
7
+ "dependencies": [
8
+ "class-variance-authority",
9
+ "lucide-react"
10
+ ],
11
+ "registryDependencies": [
12
+ "button"
13
+ ],
14
+ "files": [
15
+ {
16
+ "path": "components/base/Pagination.tsx",
17
+ "type": "registry:ui",
18
+ "target": "components/base/Pagination.tsx",
19
+ "content": "import * as React from \"react\";\n\nimport { type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@/lib/utils/cn\";\nimport { buttonVariants } from \"./Button\";\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from \"lucide-react\";\n\nfunction Pagination({ className, ...props }: React.ComponentProps<\"nav\">) {\n return (\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n className={cn(\"mx-auto flex w-full justify-center\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationContent({\n className,\n ...props\n}: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"pagination-content\"\n className={cn(\"flex items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<\"li\">) {\n return <li data-slot=\"pagination-item\" {...props} />;\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean;\n} & Pick<VariantProps<typeof buttonVariants>, \"size\"> &\n Omit<React.ComponentProps<\"a\">, \"size\">;\n\nfunction PaginationLink({\n className,\n isActive,\n size = \"icon\",\n ...props\n}: PaginationLinkProps) {\n return (\n <a\n aria-current={isActive ? \"page\" : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n className={cn(\n buttonVariants({\n variant: isActive ? \"outline\" : \"ghost\",\n size,\n }),\n \"cursor-pointer\",\n className\n )}\n {...props}\n />\n );\n}\n\nfunction PaginationPrevious({\n className,\n text = \"Anterior\",\n ...props\n}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {\n return (\n <PaginationLink\n aria-label=\"Ir a la página anterior\"\n size=\"default\"\n className={cn(\"pl-2!\", className)}\n {...props}\n >\n <ChevronLeftIcon data-icon=\"inline-start\" className=\"cn-rtl-flip\" />\n <span className=\"hidden sm:block\">{text}</span>\n </PaginationLink>\n );\n}\n\nfunction PaginationNext({\n className,\n text = \"Siguiente\",\n ...props\n}: React.ComponentProps<typeof PaginationLink> & { text?: string }) {\n return (\n <PaginationLink\n aria-label=\"Ir a la página siguiente\"\n size=\"default\"\n className={cn(\"pr-2!\", className)}\n {...props}\n >\n <span className=\"hidden sm:block\">{text}</span>\n <ChevronRightIcon data-icon=\"inline-end\" className=\"cn-rtl-flip\" />\n </PaginationLink>\n );\n}\n\nfunction PaginationEllipsis({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn(\n \"flex size-9 items-center justify-center [&_svg:not([class*='size-'])]:size-4\",\n className\n )}\n {...props}\n >\n <MoreHorizontalIcon />\n <span className=\"sr-only\">Más páginas</span>\n </span>\n );\n}\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n};\n"
20
+ },
21
+ {
22
+ "path": "components/base/Pagination.md",
23
+ "type": "registry:file",
24
+ "target": "components/base/Pagination.md",
25
+ "content": "# Pagination — guía de uso\n\nNavegación de paginación para listados, tablas y resultados de búsqueda.\nCompuesta por sub-componentes que permiten construir distintas configuraciones. El componente vive en tu proyecto: instálalo con `create-lexy add pagination` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n} from \"@/shared/components/base/Pagination\"; // o @/components/base/Pagination\n```\n\n## Uso básico\n\n```tsx\n<Pagination>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"/items?page=1\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"/items?page=1\" isActive>1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"/items?page=2\">2</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"/items?page=3\">3</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"/items?page=10\">10</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"/items?page=2\" />\n </PaginationItem>\n </PaginationContent>\n</Pagination>\n```\n\n## Con muchas páginas\n\n```tsx\n<Pagination>\n <PaginationContent>\n <PaginationItem>\n <PaginationPrevious href=\"#\" />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">1</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">4</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\" isActive>5</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">6</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationEllipsis />\n </PaginationItem>\n <PaginationItem>\n <PaginationLink href=\"#\">20</PaginationLink>\n </PaginationItem>\n <PaginationItem>\n <PaginationNext href=\"#\" />\n </PaginationItem>\n </PaginationContent>\n</Pagination>\n```\n\n## Props\n\n### Sub-componentes\n\n| Componente | Props | Descripción |\n|---|---|---|\n| `Pagination` | `className?` | Contenedor `nav` con `aria-label=\"pagination\"`. |\n| `PaginationContent` | `className?` | Lista `ul` que contiene los items. |\n| `PaginationItem` | — | Item `li` de la lista. |\n| `PaginationLink` | `isActive?: boolean`, `size?`, `className?` | Link de página. `isActive` aplica estilo outline. |\n| `PaginationPrevious` | `text?: string`, `className?` | Botón \"Anterior\" con icono. |\n| `PaginationNext` | `text?: string`, `className?` | Botón \"Siguiente\" con icono. |\n| `PaginationEllipsis` | `className?` | Indicador de páginas omitidas (\"...\"). |\n\n## Reglas\n\n- Muestra máximo 5–7 números de página visibles.\n- Usa `PaginationEllipsis` para ocultar páginas intermedias.\n- Marca la página actual con `isActive`.\n- Deshabilita u oculta \"Anterior\" en la primera página.\n- Deshabilita u oculta \"Siguiente\" en la última página.\n- No uses paginación para menos de 2 páginas.\n- No mezcles paginación con scroll infinito en la misma vista.\n\n## Para IA\n\n1. Identifica si el listado tiene más de una página de resultados.\n2. Si es paginable → usa `Pagination`.\n3. Calcula el rango de páginas visibles (máximo 5–7 items).\n4. Usa `PaginationEllipsis` para ocultar páginas intermedias.\n5. Marca la página actual con `isActive` en `PaginationLink`.\n6. Deshabilita/oculta los botones de navegación en los extremos.\n7. Considera scroll infinito si la navegación por página no aporta valor.\n"
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "popover",
4
+ "type": "registry:ui",
5
+ "title": "Popover",
6
+ "description": "Panel flotante que se ancla a un elemento. Para contenido interactivo. El componente vive en tu proyecto: instálalo con `create-lexy add popover` y edítalo con libertad.",
7
+ "dependencies": [
8
+ "@radix-ui/react-popover"
9
+ ],
10
+ "registryDependencies": [],
11
+ "files": [
12
+ {
13
+ "path": "components/base/Popover.tsx",
14
+ "type": "registry:ui",
15
+ "target": "components/base/Popover.tsx",
16
+ "content": "import * as React from \"react\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst Popover = PopoverPrimitive.Root;\nconst PopoverTrigger = PopoverPrimitive.Trigger;\nconst PopoverAnchor = PopoverPrimitive.Anchor;\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-50 w-72 rounded border border-border bg-popover p-4 text-popover-foreground shadow-md outline-none 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\",\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n));\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n\nexport { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };\n"
17
+ },
18
+ {
19
+ "path": "components/base/Popover.md",
20
+ "type": "registry:file",
21
+ "target": "components/base/Popover.md",
22
+ "content": "# Popover — guía de uso\n\nPanel flotante que se ancla a un elemento. Para contenido interactivo. El componente vive en tu proyecto: instálalo con `create-lexy add popover` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport { Popover } from \"@/components/base/Popover\";\n```\n\n## Uso básico\n\n```tsx\n<Popover />\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Reglas\n\n- Usa Popover según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa Popover desde el path correcto.\n3. Configura las props según la necesidad.\n4. Verifica que el componente se integre correctamente en el layout.\n5. Solo usa variantes documentadas.\n"
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "profile-card",
4
+ "type": "registry:ui",
5
+ "title": "ProfileCard",
6
+ "description": "Tarjeta de perfil. Para mostrar información de usuario. El componente vive en tu proyecto: instálalo con `create-lexy add profile-card` y edítalo con libertad.",
7
+ "dependencies": [],
8
+ "registryDependencies": [
9
+ "avatar",
10
+ "button"
11
+ ],
12
+ "files": [
13
+ {
14
+ "path": "components/base/ProfileCard.tsx",
15
+ "type": "registry:ui",
16
+ "target": "components/base/ProfileCard.tsx",
17
+ "content": "import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\nimport { Avatar, AvatarFallback, AvatarImage } from \"./Avatar\";\nimport { Button } from \"./Button\";\n\nexport interface ProfileCardProps extends React.HTMLAttributes<HTMLDivElement> {\n name: string;\n role?: string;\n initials?: string;\n src?: string;\n primaryAction?: string;\n secondaryAction?: string;\n onPrimary?: () => void;\n onSecondary?: () => void;\n /** Oculta la fila de acciones cuando es `false`. */\n showActions?: boolean;\n}\n\nexport const ProfileCard = React.forwardRef<HTMLDivElement, ProfileCardProps>(\n (\n {\n name,\n role,\n initials,\n src,\n primaryAction = \"Ver perfil\",\n secondaryAction = \"Mensaje\",\n onPrimary,\n onSecondary,\n showActions = true,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <article\n ref={ref}\n className={cn(\n \"flex w-70 flex-col gap-4 rounded-lg border border-border bg-background p-6 transition-shadow hover:shadow-md\",\n className,\n )}\n {...props}>\n <Avatar className='h-16 w-16'>\n {src && <AvatarImage src={src} alt={name} />}\n <AvatarFallback>{initials ?? name.slice(0, 2)}</AvatarFallback>\n </Avatar>\n <div className='flex flex-col gap-0.5'>\n <h3 className='text-sm font-medium text-foreground'>{name}</h3>\n {role && <p className='text-xs text-muted-foreground'>{role}</p>}\n </div>\n {showActions && (\n <div className='flex gap-2'>\n <Button size='sm' onClick={onPrimary}>\n {primaryAction}\n </Button>\n <Button size='sm' variant='secondary' onClick={onSecondary}>\n {secondaryAction}\n </Button>\n </div>\n )}\n </article>\n );\n },\n);\n\nProfileCard.displayName = \"ProfileCard\";\n"
18
+ },
19
+ {
20
+ "path": "components/base/ProfileCard.md",
21
+ "type": "registry:file",
22
+ "target": "components/base/ProfileCard.md",
23
+ "content": "# ProfileCard — guía de uso\n\nTarjeta de perfil. Para mostrar información de usuario. El componente vive en tu proyecto: instálalo con `create-lexy add profile-card` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport { ProfileCard } from \"@/components/base/ProfileCard\";\n```\n\n## Uso básico\n\n```tsx\n<ProfileCard />\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Reglas\n\n- Usa ProfileCard según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa ProfileCard desde el path correcto.\n3. Configura las props según la necesidad.\n4. Verifica que el componente se integre correctamente en el layout.\n5. Solo usa variantes documentadas.\n"
24
+ }
25
+ ]
26
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "progress",
4
+ "type": "registry:ui",
5
+ "title": "Progress",
6
+ "description": "Barra de progreso. Para mostrar avance. El componente vive en tu proyecto: instálalo con `create-lexy add progress` y edítalo con libertad.",
7
+ "dependencies": [
8
+ "@radix-ui/react-progress"
9
+ ],
10
+ "registryDependencies": [],
11
+ "files": [
12
+ {
13
+ "path": "components/base/Progress.tsx",
14
+ "type": "registry:ui",
15
+ "target": "components/base/Progress.tsx",
16
+ "content": "import * as React from \"react\";\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst Progress = React.forwardRef<\n React.ElementRef<typeof ProgressPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n <ProgressPrimitive.Root\n ref={ref}\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-secondary\",\n className,\n )}\n {...props}>\n <ProgressPrimitive.Indicator\n className='h-full w-full flex-1 bg-primary transition-all'\n style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n />\n </ProgressPrimitive.Root>\n));\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n"
17
+ },
18
+ {
19
+ "path": "components/base/Progress.md",
20
+ "type": "registry:file",
21
+ "target": "components/base/Progress.md",
22
+ "content": "# Progress — guía de uso\n\nBarra de progreso. Para mostrar avance. El componente vive en tu proyecto: instálalo con `create-lexy add progress` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport { Progress } from \"@/components/base/Progress\";\n```\n\n## Uso básico\n\n```tsx\n<Progress />\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Reglas\n\n- Usa Progress según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa Progress desde el path correcto.\n3. Configura las props según la necesidad.\n4. Verifica que el componente se integre correctamente en el layout.\n5. Solo usa variantes documentadas.\n"
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema/registry-item.json",
3
+ "name": "radio-group",
4
+ "type": "registry:ui",
5
+ "title": "RadioGroup",
6
+ "description": "Selección **única** entre opciones visibles (Radix). Usa `RadioGroup` como contenedor y `RadioGroupItem` por opción. El componente vive en tu proyecto: instálalo con `create-lexy add radio-group` y edítalo con libertad.",
7
+ "dependencies": [
8
+ "@radix-ui/react-radio-group"
9
+ ],
10
+ "registryDependencies": [],
11
+ "files": [
12
+ {
13
+ "path": "components/base/RadioGroup.tsx",
14
+ "type": "registry:ui",
15
+ "target": "components/base/RadioGroup.tsx",
16
+ "content": "import * as React from \"react\";\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst RadioGroup = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Root\n ref={ref}\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n));\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nconst RadioGroupItem = React.forwardRef<\n React.ElementRef<typeof RadioGroupPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <RadioGroupPrimitive.Item\n ref={ref}\n className={cn(\n \"aspect-square h-4 w-4 cursor-pointer rounded-full border border-primary text-primary focus:outline-none focus-visible:ring-2 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50\",\n className,\n )}\n {...props}>\n <RadioGroupPrimitive.Indicator className='flex items-center justify-center'>\n <span className='h-2.5 w-2.5 rounded-full bg-current' />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n));\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n"
17
+ },
18
+ {
19
+ "path": "components/base/RadioGroup.md",
20
+ "type": "registry:file",
21
+ "target": "components/base/RadioGroup.md",
22
+ "content": "# RadioGroup — guía de uso\n\nSelección **única** entre opciones visibles (Radix). Usa `RadioGroup` como contenedor y `RadioGroupItem` por opción. El componente vive en tu proyecto: instálalo con `create-lexy add radio-group` y edítalo con libertad.\n\n## Import\n\n```tsx\nimport { RadioGroup, RadioGroupItem } from \"@/components/base/RadioGroup\";\n```\n\n## Uso básico\n\n```tsx\n<fieldset>\n <legend className=\"mb-2 text-sm font-medium\">Plan</legend>\n <RadioGroup defaultValue=\"mensual\">\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"mensual\" id=\"r-mensual\" />\n <Label htmlFor=\"r-mensual\">Mensual</Label>\n </div>\n <div className=\"flex items-center gap-2\">\n <RadioGroupItem value=\"anual\" id=\"r-anual\" />\n <Label htmlFor=\"r-anual\">Anual</Label>\n </div>\n </RadioGroup>\n</fieldset>\n```\n\n## Props\n\n### `RadioGroup`\n| Prop | Tipo | Default | Descripción |\n|---|---|---|---|\n| `value` / `defaultValue` | `string` | — | Opción seleccionada (controlado / inicial). |\n| `onValueChange` | `(value) => void` | — | Cambio de selección. |\n| `disabled` | `boolean` | `false` | Deshabilita todo el grupo. |\n\n### `RadioGroupItem`\n| Prop | Tipo | Descripción |\n|---|---|---|\n| `value` | `string` | **Requerido.** Valor de la opción. |\n| `id` | `string` | Para asociar el `Label`. |\n| `disabled` | `boolean` | Deshabilita esa opción. |\n\n## Reglas\n\n- Cada `RadioGroupItem` necesita `value` único y un `Label` con `id`/`htmlFor`.\n- Envuelve el grupo en `fieldset` + `legend` que nombre la decisión.\n- Conceptualmente siempre hay una sola opción activa.\n- Mantén el orden estable; no reordenes opciones entre renders.\n\n## Cuándo NO usar\n\n- **Selección múltiple** → `Checkbox`.\n- **Muchas opciones (>5–7) o con búsqueda** → `Select` / `Combobox` (ahorra espacio vertical).\n- **Dos estados opuestos on/off de un ajuste** → `Switch`.\n\n## Para IA\n\n1. Confirma que es \"una sola entre varias\" y que ver todas a la vez ayuda a decidir.\n2. Si son demasiadas o necesitan búsqueda, prefiere `Select`/`Combobox`.\n3. Empareja cada opción con un `Label`; envuelve en `fieldset`/`legend`.\n4. Controla con `value` + `onValueChange` cuando dependa del estado del formulario.\n"
23
+ }
24
+ ]
25
+ }