create-lexy 0.6.1 → 0.6.3
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.
- package/README.md +7 -2
- package/assets/fonts/{OFL-NotoSans.txt → LICENSE-Geist.txt} +4 -5
- package/assets/fonts/geist-mono-variable-italic.woff2 +0 -0
- package/assets/fonts/geist-mono-variable.woff2 +0 -0
- package/assets/fonts/geist-sans-variable-italic.woff2 +0 -0
- package/assets/fonts/geist-sans-variable.woff2 +0 -0
- package/assets/r/accordion.json +3 -3
- package/assets/r/alert-dialog.json +3 -3
- package/assets/r/app-accordion.json +1 -1
- package/assets/r/app-dialog.json +3 -3
- package/assets/r/app-header-bar.json +2 -2
- package/assets/r/app-sidebar.json +2 -2
- package/assets/r/avatar.json +3 -3
- package/assets/r/badge.json +3 -3
- package/assets/r/brand-background.json +1 -1
- package/assets/r/breadcrumb.json +3 -3
- package/assets/r/button-group.json +3 -3
- package/assets/r/button.json +3 -3
- package/assets/r/calendar.json +2 -2
- package/assets/r/card.json +3 -3
- package/assets/r/chart.json +2 -2
- package/assets/r/checkbox.json +2 -2
- package/assets/r/combobox.json +3 -3
- package/assets/r/command.json +3 -3
- package/assets/r/confirmacion.json +1 -1
- package/assets/r/counter-badge.json +3 -3
- package/assets/r/crm-desk.json +1 -1
- package/assets/r/crm-detalle-caso.json +5 -5
- package/assets/r/date-picker.json +1 -1
- package/assets/r/dialog.json +3 -3
- package/assets/r/dropdown-menu.json +3 -3
- package/assets/r/empty.json +2 -2
- package/assets/r/feature-card.json +3 -3
- package/assets/r/form.json +3 -3
- package/assets/r/header-bar.json +2 -2
- package/assets/r/input.json +3 -3
- package/assets/r/intake-wizard.json +1 -1
- package/assets/r/label.json +3 -3
- package/assets/r/logo.json +2 -2
- package/assets/r/menubar.json +3 -3
- package/assets/r/navigation-menu.json +3 -3
- package/assets/r/pagination.json +2 -2
- package/assets/r/popover.json +3 -3
- package/assets/r/profile-card.json +3 -3
- package/assets/r/progress.json +2 -2
- package/assets/r/radio-group.json +2 -2
- package/assets/r/registry.json +47 -47
- package/assets/r/scroll-area.json +2 -2
- package/assets/r/searchbox.json +3 -3
- package/assets/r/select.json +3 -3
- package/assets/r/separator.json +2 -2
- package/assets/r/sheet.json +2 -2
- package/assets/r/sidebar.json +3 -3
- package/assets/r/skeleton.json +2 -2
- package/assets/r/slider.json +3 -3
- package/assets/r/snippet.json +3 -3
- package/assets/r/spinner.json +2 -2
- package/assets/r/status-dot.json +3 -3
- package/assets/r/switch.json +3 -3
- package/assets/r/table.json +3 -3
- package/assets/r/tabs.json +3 -3
- package/assets/r/tag.json +3 -3
- package/assets/r/textarea.json +3 -3
- package/assets/r/toaster.json +3 -3
- package/assets/r/tooltip.json +3 -3
- package/assets/r/tree.json +3 -3
- package/assets/registry-version +1 -1
- package/assets/theme/lexy-theme.css +562 -112
- package/dist/index.js +590 -276
- package/package.json +4 -2
- package/templates/.claude/skills/lexy-design/SKILL.md +189 -0
- package/templates/.claude/skills/lexy-dev/SKILL.md +168 -0
- package/templates/.claude/skills/lexy-mock-data/SKILL.md +50 -0
- package/templates/.github/copilot-instructions.md +50 -0
- package/templates/.mcp.json +8 -0
- package/templates/AGENTS.md +243 -0
- package/templates/CLAUDE.md +61 -0
- package/templates/ai/IMPLEMENTATION-PROTOCOL.md +148 -0
- package/templates/ai/PRODUCTION-CLEANUP.md +17 -0
- package/templates/ai/PROJECT-CONTEXT.md +65 -0
- package/templates/ai/README.md +19 -0
- package/templates/ai/TECHNICAL-USAGE.md +220 -0
- package/templates/ai/pautas/arquitectura-informacion-ux.md +243 -0
- package/templates/ai/pautas/buenas-practicas.md +236 -0
- package/templates/ai/pautas/calidad-industria.md +109 -0
- package/templates/ai/pautas/diseno-cliente.md +136 -0
- package/templates/ai/pautas/diseno-crm-lexy.md +109 -0
- package/templates/ai/pautas/patrones-de-codigo.md +234 -0
- package/templates/ai/pautas/recetas-layout.md +419 -0
- package/templates/ai/pautas/sistema-visual.md +197 -0
- package/templates/ai/pautas/ux-writing.md +214 -0
- package/templates/scripts/check-geometry.mjs +139 -0
- package/assets/fonts/noto-sans-latin.woff2 +0 -0
package/assets/r/registry.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"name": "accordion",
|
|
8
8
|
"type": "registry:ui",
|
|
9
9
|
"title": "Accordion",
|
|
10
|
-
"description": "Secciones colapsables para mostrar detalle bajo demanda (Radix). Progressive disclosure: muestra primero los títulos y despliega el contenido al pedirlo.
|
|
10
|
+
"description": "Secciones colapsables para mostrar detalle bajo demanda (Radix). Progressive disclosure: muestra primero los títulos y despliega el contenido al pedirlo.",
|
|
11
11
|
"dependencies": [
|
|
12
12
|
"@radix-ui/react-accordion"
|
|
13
13
|
],
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"name": "alert-dialog",
|
|
30
30
|
"type": "registry:ui",
|
|
31
31
|
"title": "AlertDialog",
|
|
32
|
-
"description": "Confirmación modal que **interrumpe** (rol `alertdialog`): la persona debe elegir entre cancelar o confirmar — no hay X, ni cierre con click afuera. Para destruir, descartar cambios o salir de un flujo con costo.
|
|
32
|
+
"description": "Confirmación modal que **interrumpe** (rol `alertdialog`): la persona debe elegir entre cancelar o confirmar — no hay X, ni cierre con click afuera. Para destruir, descartar cambios o salir de un flujo con costo.",
|
|
33
33
|
"dependencies": [
|
|
34
34
|
"@radix-ui/react-alert-dialog",
|
|
35
35
|
"class-variance-authority"
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
"name": "app-dialog",
|
|
77
77
|
"type": "registry:ui",
|
|
78
78
|
"title": "AppDialog",
|
|
79
|
-
"description": "Diálogo de aplicación al estilo **Material 3**. Estructura canónica sin dividers:
|
|
79
|
+
"description": "Diálogo de aplicación al estilo **Material 3**. Estructura canónica sin dividers:",
|
|
80
80
|
"dependencies": [],
|
|
81
81
|
"registryDependencies": [
|
|
82
82
|
"@lexy/button",
|
|
@@ -150,7 +150,7 @@
|
|
|
150
150
|
"name": "avatar",
|
|
151
151
|
"type": "registry:ui",
|
|
152
152
|
"title": "Avatar",
|
|
153
|
-
"description": "Imagen de perfil con fallback. Para identificación visual.
|
|
153
|
+
"description": "Imagen de perfil con fallback. Para identificación visual.",
|
|
154
154
|
"dependencies": [
|
|
155
155
|
"@radix-ui/react-avatar"
|
|
156
156
|
],
|
|
@@ -172,7 +172,7 @@
|
|
|
172
172
|
"name": "badge",
|
|
173
173
|
"type": "registry:ui",
|
|
174
174
|
"title": "Badge",
|
|
175
|
-
"description": "Etiqueta de estado o categoría, **no interactiva** (`<span>`). Para marcar estados (\"Activo\", \"Pendiente\") o clasificar.
|
|
175
|
+
"description": "Etiqueta de estado o categoría, **no interactiva** (`<span>`). Para marcar estados (\"Activo\", \"Pendiente\") o clasificar.",
|
|
176
176
|
"dependencies": [
|
|
177
177
|
"class-variance-authority"
|
|
178
178
|
],
|
|
@@ -310,7 +310,7 @@
|
|
|
310
310
|
"name": "breadcrumb",
|
|
311
311
|
"type": "registry:ui",
|
|
312
312
|
"title": "Breadcrumb",
|
|
313
|
-
"description": "Componente Breadcrumb.
|
|
313
|
+
"description": "Componente Breadcrumb.",
|
|
314
314
|
"dependencies": [
|
|
315
315
|
"@radix-ui/react-slot"
|
|
316
316
|
],
|
|
@@ -332,7 +332,7 @@
|
|
|
332
332
|
"name": "button",
|
|
333
333
|
"type": "registry:ui",
|
|
334
334
|
"title": "Button",
|
|
335
|
-
"description": "Botón de acción. Renderiza un `<button>` nativo; acepta todos sus atributos (`onClick`, `type`, `disabled`, `aria-*`).
|
|
335
|
+
"description": "Botón de acción. Renderiza un `<button>` nativo; acepta todos sus atributos (`onClick`, `type`, `disabled`, `aria-*`).",
|
|
336
336
|
"dependencies": [
|
|
337
337
|
"@radix-ui/react-slot",
|
|
338
338
|
"class-variance-authority"
|
|
@@ -355,7 +355,7 @@
|
|
|
355
355
|
"name": "button-group",
|
|
356
356
|
"type": "registry:ui",
|
|
357
357
|
"title": "ButtonGroup",
|
|
358
|
-
"description": "Agrupa botones relacionados en una sola unidad visual. Sirve para acciones hermanas, comandos de toolbar o split actions. No mantiene estado de selección por sí mismo.
|
|
358
|
+
"description": "Agrupa botones relacionados en una sola unidad visual. Sirve para acciones hermanas, comandos de toolbar o split actions. No mantiene estado de selección por sí mismo.",
|
|
359
359
|
"dependencies": [
|
|
360
360
|
"@radix-ui/react-slot",
|
|
361
361
|
"class-variance-authority"
|
|
@@ -405,7 +405,7 @@
|
|
|
405
405
|
"name": "card",
|
|
406
406
|
"type": "registry:ui",
|
|
407
407
|
"title": "Card",
|
|
408
|
-
"description": "Contenedor de contenido. Para agrupar información relacionada.
|
|
408
|
+
"description": "Contenedor de contenido. Para agrupar información relacionada.",
|
|
409
409
|
"dependencies": [
|
|
410
410
|
"class-variance-authority"
|
|
411
411
|
],
|
|
@@ -449,7 +449,7 @@
|
|
|
449
449
|
"name": "checkbox",
|
|
450
450
|
"type": "registry:ui",
|
|
451
451
|
"title": "Checkbox",
|
|
452
|
-
"description": "Casilla de verificación (Radix). Para un sí/no independiente o para elegir **varias** opciones de una lista. No trae label: emparéjalo con `Label`.
|
|
452
|
+
"description": "Casilla de verificación (Radix). Para un sí/no independiente o para elegir **varias** opciones de una lista. No trae label: emparéjalo con `Label`.",
|
|
453
453
|
"dependencies": [
|
|
454
454
|
"@radix-ui/react-checkbox"
|
|
455
455
|
],
|
|
@@ -471,7 +471,7 @@
|
|
|
471
471
|
"name": "combobox",
|
|
472
472
|
"type": "registry:ui",
|
|
473
473
|
"title": "Combobox",
|
|
474
|
-
"description": "Campo de entrada con lista desplegable filtrable. Para búsqueda + selección.
|
|
474
|
+
"description": "Campo de entrada con lista desplegable filtrable. Para búsqueda + selección.",
|
|
475
475
|
"dependencies": [],
|
|
476
476
|
"registryDependencies": [
|
|
477
477
|
"@lexy/button",
|
|
@@ -495,7 +495,7 @@
|
|
|
495
495
|
"name": "command",
|
|
496
496
|
"type": "registry:ui",
|
|
497
497
|
"title": "Command",
|
|
498
|
-
"description": "Paleta de comandos. Para búsqueda y acciones rápidas.
|
|
498
|
+
"description": "Paleta de comandos. Para búsqueda y acciones rápidas.",
|
|
499
499
|
"dependencies": [
|
|
500
500
|
"cmdk"
|
|
501
501
|
],
|
|
@@ -517,7 +517,7 @@
|
|
|
517
517
|
"name": "counter-badge",
|
|
518
518
|
"type": "registry:ui",
|
|
519
519
|
"title": "CounterBadge",
|
|
520
|
-
"description": "Badge con contador numérico. Para notificaciones.
|
|
520
|
+
"description": "Badge con contador numérico. Para notificaciones.",
|
|
521
521
|
"dependencies": [
|
|
522
522
|
"class-variance-authority"
|
|
523
523
|
],
|
|
@@ -566,7 +566,7 @@
|
|
|
566
566
|
"name": "dialog",
|
|
567
567
|
"type": "registry:ui",
|
|
568
568
|
"title": "Dialog",
|
|
569
|
-
"description": "Diálogo modal primitivo (Radix). **Para la mayoría de los casos usa `AppDialog`**, que ya arma la composición Material 3 (icono, título, descripción, acciones). Usa `Dialog` directo solo para layouts modales a medida sin esa estructura.
|
|
569
|
+
"description": "Diálogo modal primitivo (Radix). **Para la mayoría de los casos usa `AppDialog`**, que ya arma la composición Material 3 (icono, título, descripción, acciones). Usa `Dialog` directo solo para layouts modales a medida sin esa estructura.",
|
|
570
570
|
"dependencies": [
|
|
571
571
|
"@radix-ui/react-dialog"
|
|
572
572
|
],
|
|
@@ -588,7 +588,7 @@
|
|
|
588
588
|
"name": "dropdown-menu",
|
|
589
589
|
"type": "registry:ui",
|
|
590
590
|
"title": "DropdownMenu",
|
|
591
|
-
"description": "Menú de **acciones** contextuales que se abre desde un disparador (Radix). Para agrupar acciones secundarias (\"⋯\", \"Opciones\") sin llenar la pantalla de botones.
|
|
591
|
+
"description": "Menú de **acciones** contextuales que se abre desde un disparador (Radix). Para agrupar acciones secundarias (\"⋯\", \"Opciones\") sin llenar la pantalla de botones.",
|
|
592
592
|
"dependencies": [
|
|
593
593
|
"@radix-ui/react-dropdown-menu"
|
|
594
594
|
],
|
|
@@ -632,7 +632,7 @@
|
|
|
632
632
|
"name": "feature-card",
|
|
633
633
|
"type": "registry:ui",
|
|
634
634
|
"title": "FeatureCard",
|
|
635
|
-
"description": "Tarjeta con icono y descripción. Para destacar características.
|
|
635
|
+
"description": "Tarjeta con icono y descripción. Para destacar características.",
|
|
636
636
|
"dependencies": [],
|
|
637
637
|
"registryDependencies": [],
|
|
638
638
|
"files": [
|
|
@@ -652,7 +652,7 @@
|
|
|
652
652
|
"name": "form",
|
|
653
653
|
"type": "registry:ui",
|
|
654
654
|
"title": "Form",
|
|
655
|
-
"description": "Formularios con validación (patrón shadcn sobre `react-hook-form` + `zod`). `Form` provee el contexto, `FormField` registra cada campo y `FormItem`/`FormLabel`/`FormControl` cablean ids y `aria-*` automáticamente; `FormMessage` muestra el error del campo. `create-lexy add form` instala también `zod` y `@hookform/resolvers`.
|
|
655
|
+
"description": "Formularios con validación (patrón shadcn sobre `react-hook-form` + `zod`). `Form` provee el contexto, `FormField` registra cada campo y `FormItem`/`FormLabel`/`FormControl` cablean ids y `aria-*` automáticamente; `FormMessage` muestra el error del campo. `create-lexy add form` instala también `zod` y `@hookform/resolvers`.",
|
|
656
656
|
"dependencies": [
|
|
657
657
|
"@radix-ui/react-slot",
|
|
658
658
|
"react-hook-form@^7.62.0",
|
|
@@ -679,7 +679,7 @@
|
|
|
679
679
|
"name": "header-bar",
|
|
680
680
|
"type": "registry:ui",
|
|
681
681
|
"title": "HeaderBar",
|
|
682
|
-
"description": "Barra superior de aplicación o sitio: marca a la izquierda y acciones a la derecha. Renderiza un `<header>` semántico.
|
|
682
|
+
"description": "Barra superior de aplicación o sitio: marca a la izquierda y acciones a la derecha. Renderiza un `<header>` semántico.",
|
|
683
683
|
"dependencies": [
|
|
684
684
|
"class-variance-authority"
|
|
685
685
|
],
|
|
@@ -703,7 +703,7 @@
|
|
|
703
703
|
"name": "input",
|
|
704
704
|
"type": "registry:ui",
|
|
705
705
|
"title": "Input",
|
|
706
|
-
"description": "Campo de texto de una línea. Renderiza un `<input>` nativo; acepta todos sus atributos (`type`, `value`, `onChange`, `placeholder`, `aria-*`).
|
|
706
|
+
"description": "Campo de texto de una línea. Renderiza un `<input>` nativo; acepta todos sus atributos (`type`, `value`, `onChange`, `placeholder`, `aria-*`).",
|
|
707
707
|
"dependencies": [],
|
|
708
708
|
"registryDependencies": [],
|
|
709
709
|
"files": [
|
|
@@ -723,7 +723,7 @@
|
|
|
723
723
|
"name": "label",
|
|
724
724
|
"type": "registry:ui",
|
|
725
725
|
"title": "Label",
|
|
726
|
-
"description": "Etiqueta para campos de formulario. Incluye indicador de requerido.
|
|
726
|
+
"description": "Etiqueta para campos de formulario. Incluye indicador de requerido.",
|
|
727
727
|
"dependencies": [
|
|
728
728
|
"@radix-ui/react-label",
|
|
729
729
|
"class-variance-authority"
|
|
@@ -746,7 +746,7 @@
|
|
|
746
746
|
"name": "logo",
|
|
747
747
|
"type": "registry:ui",
|
|
748
748
|
"title": "Logo",
|
|
749
|
-
"description": "Logo de Lexy. Para marca del producto.
|
|
749
|
+
"description": "Logo de Lexy. Para marca del producto.",
|
|
750
750
|
"dependencies": [],
|
|
751
751
|
"registryDependencies": [],
|
|
752
752
|
"files": [
|
|
@@ -856,7 +856,7 @@
|
|
|
856
856
|
"name": "menubar",
|
|
857
857
|
"type": "registry:ui",
|
|
858
858
|
"title": "Menubar",
|
|
859
|
-
"description": "Barra de menús horizontal. Para navegación de aplicación.
|
|
859
|
+
"description": "Barra de menús horizontal. Para navegación de aplicación.",
|
|
860
860
|
"dependencies": [
|
|
861
861
|
"@radix-ui/react-menubar"
|
|
862
862
|
],
|
|
@@ -878,7 +878,7 @@
|
|
|
878
878
|
"name": "navigation-menu",
|
|
879
879
|
"type": "registry:ui",
|
|
880
880
|
"title": "NavigationMenu",
|
|
881
|
-
"description": "Menú de navegación con dropdowns. Para sitios web.
|
|
881
|
+
"description": "Menú de navegación con dropdowns. Para sitios web.",
|
|
882
882
|
"dependencies": [
|
|
883
883
|
"@radix-ui/react-navigation-menu",
|
|
884
884
|
"class-variance-authority"
|
|
@@ -926,7 +926,7 @@
|
|
|
926
926
|
"name": "popover",
|
|
927
927
|
"type": "registry:ui",
|
|
928
928
|
"title": "Popover",
|
|
929
|
-
"description": "Panel flotante que se ancla a un elemento. Para contenido interactivo.
|
|
929
|
+
"description": "Panel flotante que se ancla a un elemento. Para contenido interactivo.",
|
|
930
930
|
"dependencies": [
|
|
931
931
|
"@radix-ui/react-popover"
|
|
932
932
|
],
|
|
@@ -948,7 +948,7 @@
|
|
|
948
948
|
"name": "profile-card",
|
|
949
949
|
"type": "registry:ui",
|
|
950
950
|
"title": "ProfileCard",
|
|
951
|
-
"description": "Tarjeta de perfil. Para mostrar información de usuario.
|
|
951
|
+
"description": "Tarjeta de perfil. Para mostrar información de usuario.",
|
|
952
952
|
"dependencies": [],
|
|
953
953
|
"registryDependencies": [
|
|
954
954
|
"@lexy/avatar",
|
|
@@ -971,7 +971,7 @@
|
|
|
971
971
|
"name": "progress",
|
|
972
972
|
"type": "registry:ui",
|
|
973
973
|
"title": "Progress",
|
|
974
|
-
"description": "Barra de progreso. Para mostrar avance.
|
|
974
|
+
"description": "Barra de progreso. Para mostrar avance.",
|
|
975
975
|
"dependencies": [
|
|
976
976
|
"@radix-ui/react-progress"
|
|
977
977
|
],
|
|
@@ -993,7 +993,7 @@
|
|
|
993
993
|
"name": "radio-group",
|
|
994
994
|
"type": "registry:ui",
|
|
995
995
|
"title": "RadioGroup",
|
|
996
|
-
"description": "Selección **única** entre opciones visibles (Radix). Usa `RadioGroup` como contenedor y `RadioGroupItem` por opción.
|
|
996
|
+
"description": "Selección **única** entre opciones visibles (Radix). Usa `RadioGroup` como contenedor y `RadioGroupItem` por opción.",
|
|
997
997
|
"dependencies": [
|
|
998
998
|
"@radix-ui/react-radio-group"
|
|
999
999
|
],
|
|
@@ -1037,7 +1037,7 @@
|
|
|
1037
1037
|
"name": "searchbox",
|
|
1038
1038
|
"type": "registry:ui",
|
|
1039
1039
|
"title": "Searchbox",
|
|
1040
|
-
"description": "Campo de búsqueda con icono. Para búsquedas.
|
|
1040
|
+
"description": "Campo de búsqueda con icono. Para búsquedas.",
|
|
1041
1041
|
"dependencies": [],
|
|
1042
1042
|
"registryDependencies": [],
|
|
1043
1043
|
"files": [
|
|
@@ -1057,7 +1057,7 @@
|
|
|
1057
1057
|
"name": "select",
|
|
1058
1058
|
"type": "registry:ui",
|
|
1059
1059
|
"title": "Select",
|
|
1060
|
-
"description": "Lista desplegable de selección **única** (Radix). Ahorra espacio cuando hay muchas opciones y no necesitas verlas todas a la vez.
|
|
1060
|
+
"description": "Lista desplegable de selección **única** (Radix). Ahorra espacio cuando hay muchas opciones y no necesitas verlas todas a la vez.",
|
|
1061
1061
|
"dependencies": [
|
|
1062
1062
|
"@radix-ui/react-select"
|
|
1063
1063
|
],
|
|
@@ -1079,7 +1079,7 @@
|
|
|
1079
1079
|
"name": "separator",
|
|
1080
1080
|
"type": "registry:ui",
|
|
1081
1081
|
"title": "Separator",
|
|
1082
|
-
"description": "Separador visual. Para dividir secciones.
|
|
1082
|
+
"description": "Separador visual. Para dividir secciones.",
|
|
1083
1083
|
"dependencies": [
|
|
1084
1084
|
"@radix-ui/react-separator"
|
|
1085
1085
|
],
|
|
@@ -1124,7 +1124,7 @@
|
|
|
1124
1124
|
"name": "sidebar",
|
|
1125
1125
|
"type": "registry:ui",
|
|
1126
1126
|
"title": "Sidebar",
|
|
1127
|
-
"description": "Primitivas internas (estilo shadcn) que usa `AppSidebar` por debajo. **No las compongas a mano para una barra de navegación: usa `AppSidebar`** (data-driven). Recurre a estas primitivas solo para layouts a medida.
|
|
1127
|
+
"description": "Primitivas internas (estilo shadcn) que usa `AppSidebar` por debajo. **No las compongas a mano para una barra de navegación: usa `AppSidebar`** (data-driven). Recurre a estas primitivas solo para layouts a medida.",
|
|
1128
1128
|
"dependencies": [
|
|
1129
1129
|
"@radix-ui/react-slot",
|
|
1130
1130
|
"class-variance-authority",
|
|
@@ -1155,7 +1155,7 @@
|
|
|
1155
1155
|
"name": "skeleton",
|
|
1156
1156
|
"type": "registry:ui",
|
|
1157
1157
|
"title": "Skeleton",
|
|
1158
|
-
"description": "Esqueleto de carga. Para estados de espera.
|
|
1158
|
+
"description": "Esqueleto de carga. Para estados de espera.",
|
|
1159
1159
|
"dependencies": [
|
|
1160
1160
|
"class-variance-authority"
|
|
1161
1161
|
],
|
|
@@ -1177,7 +1177,7 @@
|
|
|
1177
1177
|
"name": "slider",
|
|
1178
1178
|
"type": "registry:ui",
|
|
1179
1179
|
"title": "Slider",
|
|
1180
|
-
"description": "Control deslizante. Para selección de rango numérico.
|
|
1180
|
+
"description": "Control deslizante. Para selección de rango numérico.",
|
|
1181
1181
|
"dependencies": [
|
|
1182
1182
|
"@radix-ui/react-slider"
|
|
1183
1183
|
],
|
|
@@ -1199,7 +1199,7 @@
|
|
|
1199
1199
|
"name": "snippet",
|
|
1200
1200
|
"type": "registry:ui",
|
|
1201
1201
|
"title": "Snippet",
|
|
1202
|
-
"description": "Fragmento de código. Para mostrar código con copia.
|
|
1202
|
+
"description": "Fragmento de código. Para mostrar código con copia.",
|
|
1203
1203
|
"dependencies": [
|
|
1204
1204
|
"class-variance-authority"
|
|
1205
1205
|
],
|
|
@@ -1221,7 +1221,7 @@
|
|
|
1221
1221
|
"name": "spinner",
|
|
1222
1222
|
"type": "registry:ui",
|
|
1223
1223
|
"title": "Spinner",
|
|
1224
|
-
"description": "Indicador de carga visual. Usa el icono `Loader2` de Lucide con animación de rotación.
|
|
1224
|
+
"description": "Indicador de carga visual. Usa el icono `Loader2` de Lucide con animación de rotación.",
|
|
1225
1225
|
"dependencies": [
|
|
1226
1226
|
"class-variance-authority",
|
|
1227
1227
|
"lucide-react"
|
|
@@ -1244,7 +1244,7 @@
|
|
|
1244
1244
|
"name": "status-dot",
|
|
1245
1245
|
"type": "registry:ui",
|
|
1246
1246
|
"title": "StatusDot",
|
|
1247
|
-
"description": "Punto de estado con color, pensado para acompañar texto (estado de una fila, disponibilidad, conexión). El color **nunca** es la única señal: va con texto o `aria-label`.
|
|
1247
|
+
"description": "Punto de estado con color, pensado para acompañar texto (estado de una fila, disponibilidad, conexión). El color **nunca** es la única señal: va con texto o `aria-label`.",
|
|
1248
1248
|
"dependencies": [
|
|
1249
1249
|
"class-variance-authority"
|
|
1250
1250
|
],
|
|
@@ -1266,7 +1266,7 @@
|
|
|
1266
1266
|
"name": "switch",
|
|
1267
1267
|
"type": "registry:ui",
|
|
1268
1268
|
"title": "Switch",
|
|
1269
|
-
"description": "Interruptor de palanca. Para activar/desactivar estados.
|
|
1269
|
+
"description": "Interruptor de palanca. Para activar/desactivar estados.",
|
|
1270
1270
|
"dependencies": [
|
|
1271
1271
|
"@radix-ui/react-switch"
|
|
1272
1272
|
],
|
|
@@ -1288,7 +1288,7 @@
|
|
|
1288
1288
|
"name": "table",
|
|
1289
1289
|
"type": "registry:ui",
|
|
1290
1290
|
"title": "Table",
|
|
1291
|
-
"description": "Tabla de datos para comparar/escanear filas y columnas. Componente compuesto (`TableHeader`, `TableContent`, `TableRow`, `TableCell` — también disponibles como alias `Table.Header`, `Table.Content`, `Table.Row`, `Table.Cell`) basado en CSS grid.
|
|
1291
|
+
"description": "Tabla de datos para comparar/escanear filas y columnas. Componente compuesto (`TableHeader`, `TableContent`, `TableRow`, `TableCell` — también disponibles como alias `Table.Header`, `Table.Content`, `Table.Row`, `Table.Cell`) basado en CSS grid.",
|
|
1292
1292
|
"dependencies": [
|
|
1293
1293
|
"class-variance-authority"
|
|
1294
1294
|
],
|
|
@@ -1310,7 +1310,7 @@
|
|
|
1310
1310
|
"name": "tabs",
|
|
1311
1311
|
"type": "registry:ui",
|
|
1312
1312
|
"title": "Tabs",
|
|
1313
|
-
"description": "Pestañas para alternar entre vistas **del mismo nivel** sin salir de la página (Radix). Progressive disclosure: muestra una categoría a la vez.
|
|
1313
|
+
"description": "Pestañas para alternar entre vistas **del mismo nivel** sin salir de la página (Radix). Progressive disclosure: muestra una categoría a la vez.",
|
|
1314
1314
|
"dependencies": [
|
|
1315
1315
|
"@radix-ui/react-tabs"
|
|
1316
1316
|
],
|
|
@@ -1332,7 +1332,7 @@
|
|
|
1332
1332
|
"name": "tag",
|
|
1333
1333
|
"type": "registry:ui",
|
|
1334
1334
|
"title": "Tag",
|
|
1335
|
-
"description": "Etiqueta de categoría. Para clasificación.
|
|
1335
|
+
"description": "Etiqueta de categoría. Para clasificación.",
|
|
1336
1336
|
"dependencies": [
|
|
1337
1337
|
"class-variance-authority"
|
|
1338
1338
|
],
|
|
@@ -1354,7 +1354,7 @@
|
|
|
1354
1354
|
"name": "textarea",
|
|
1355
1355
|
"type": "registry:ui",
|
|
1356
1356
|
"title": "Textarea",
|
|
1357
|
-
"description": "Campo de texto multilínea, redimensionable verticalmente (alto mínimo predefinido). Renderiza un `<textarea>` nativo.
|
|
1357
|
+
"description": "Campo de texto multilínea, redimensionable verticalmente (alto mínimo predefinido). Renderiza un `<textarea>` nativo.",
|
|
1358
1358
|
"dependencies": [],
|
|
1359
1359
|
"registryDependencies": [],
|
|
1360
1360
|
"files": [
|
|
@@ -1374,7 +1374,7 @@
|
|
|
1374
1374
|
"name": "toaster",
|
|
1375
1375
|
"type": "registry:ui",
|
|
1376
1376
|
"title": "Toaster",
|
|
1377
|
-
"description": "Notificaciones efímeras de la app (sobre **Sonner**, tematizado con tokens Lexy). Se monta **una vez** en el layout raíz y se dispara imperativo con `toast.*` desde cualquier parte. Reemplaza al `Toast` presentacional del sistema antiguo (deprecado).
|
|
1377
|
+
"description": "Notificaciones efímeras de la app (sobre **Sonner**, tematizado con tokens Lexy). Se monta **una vez** en el layout raíz y se dispara imperativo con `toast.*` desde cualquier parte. Reemplaza al `Toast` presentacional del sistema antiguo (deprecado).",
|
|
1378
1378
|
"dependencies": [
|
|
1379
1379
|
"sonner@^2.0.0"
|
|
1380
1380
|
],
|
|
@@ -1396,7 +1396,7 @@
|
|
|
1396
1396
|
"name": "tooltip",
|
|
1397
1397
|
"type": "registry:ui",
|
|
1398
1398
|
"title": "Tooltip",
|
|
1399
|
-
"description": "Etiqueta breve que aparece al pasar el cursor o enfocar (Radix). Para **ayuda complementaria**, nunca para información esencial.
|
|
1399
|
+
"description": "Etiqueta breve que aparece al pasar el cursor o enfocar (Radix). Para **ayuda complementaria**, nunca para información esencial.",
|
|
1400
1400
|
"dependencies": [
|
|
1401
1401
|
"@radix-ui/react-tooltip"
|
|
1402
1402
|
],
|
|
@@ -1418,7 +1418,7 @@
|
|
|
1418
1418
|
"name": "tree",
|
|
1419
1419
|
"type": "registry:ui",
|
|
1420
1420
|
"title": "Tree",
|
|
1421
|
-
"description": "Árbol jerárquico. Para navegación en profundidad.
|
|
1421
|
+
"description": "Árbol jerárquico. Para navegación en profundidad.",
|
|
1422
1422
|
"dependencies": [],
|
|
1423
1423
|
"registryDependencies": [],
|
|
1424
1424
|
"files": [
|
|
@@ -1516,13 +1516,13 @@
|
|
|
1516
1516
|
"name": "crm-detalle-caso",
|
|
1517
1517
|
"type": "registry:block",
|
|
1518
1518
|
"title": "crm-detalle-caso",
|
|
1519
|
-
"description": "Detalle master-detail para **CRM**: contexto del caso a la izquierda (panel fijo de 288px), trabajo al centro en tabs, acción primaria a la mano. La información que se consulta junta vive junta. Instálalo con `create-lexy add crm-detalle-caso` — trae `Tabs`, `
|
|
1519
|
+
"description": "Detalle master-detail para **CRM**: contexto del caso a la izquierda (panel fijo de 288px), trabajo al centro en tabs, acción primaria a la mano. La información que se consulta junta vive junta. Instálalo con `create-lexy add crm-detalle-caso` — trae `Tabs`, `Badge`, `Separator` y `Button`. La vista queda en tu proyecto (`views/CasoDetalle.tsx`): edítala con libertad.",
|
|
1520
1520
|
"dependencies": [],
|
|
1521
1521
|
"registryDependencies": [
|
|
1522
|
+
"@lexy/badge",
|
|
1522
1523
|
"@lexy/button",
|
|
1523
1524
|
"@lexy/separator",
|
|
1524
|
-
"@lexy/tabs"
|
|
1525
|
-
"@lexy/tag"
|
|
1525
|
+
"@lexy/tabs"
|
|
1526
1526
|
],
|
|
1527
1527
|
"files": [
|
|
1528
1528
|
{
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
"path": "components/base/ScrollArea.tsx",
|
|
14
14
|
"type": "registry:ui",
|
|
15
15
|
"target": "components/base/ScrollArea.tsx",
|
|
16
|
-
"content": "import * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nfunction ScrollArea({\n className,\n children,\n ...props\n}:
|
|
16
|
+
"content": "import * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\ntype ScrollAreaProps = React.ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n /**\n * Barras que puede mostrar el área cuando el contenido desborda.\n * @default \"vertical\"\n */\n orientation?: \"vertical\" | \"horizontal\" | \"both\";\n};\n\nfunction ScrollArea({\n className,\n children,\n orientation = \"vertical\",\n ...props\n}: ScrollAreaProps) {\n return (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\"relative\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n data-slot=\"scroll-area-viewport\"\n className=\"size-full rounded-[inherit] transition-[color,box-shadow] outline-none\"\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {orientation !== \"horizontal\" && <ScrollBar orientation=\"vertical\" />}\n {orientation !== \"vertical\" && <ScrollBar orientation=\"horizontal\" />}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n}\n\nfunction ScrollBar({\n className,\n orientation = \"vertical\",\n ...props\n}: React.ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>) {\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n \"data-[orientation=horizontal]:h-2 data-[orientation=horizontal]:flex-col data-[orientation=horizontal]:border-t data-[orientation=horizontal]:border-t-transparent\",\n \"data-[orientation=vertical]:h-full data-[orientation=vertical]:w-2 data-[orientation=vertical]:border-l data-[orientation=vertical]:border-l-transparent\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-muted-foreground/20 hover:bg-muted-foreground/30 transition-colors\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n}\n\nexport { ScrollArea, ScrollBar, type ScrollAreaProps };\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "components/base/ScrollArea.md",
|
|
20
20
|
"type": "registry:file",
|
|
21
21
|
"target": "components/base/ScrollArea.md",
|
|
22
|
-
"content": "# ScrollArea
|
|
22
|
+
"content": "# ScrollArea\nÁrea de scroll estilizada con barras de scroll personalizadas.\nBasado en `@radix-ui/react-scroll-area`.\n\n## Cuándo usarlo\n\nPara paneles con alto fijo cuyo contenido crece: listas laterales, paneles de detalle, menús largos. Estiliza la barra y evita saltos de layout. Para el scroll de la página entera no hace falta — el navegador ya sabe.\n\n## Composición\n\n`ScrollArea` envuelve el contenido y monta las barras necesarias según\n`orientation`: vertical, horizontal o ambas.\n\n## Uso básico\n\n```tsx\n<ScrollArea className=\"h-72 w-72 rounded-md border border-border p-4\">\n <div className=\"space-y-4\">\n {items.map((item) => (\n <div key={item.id}>\n <div className=\"font-medium\">{item.title}</div>\n <div className=\"text-muted-foreground\">{item.description}</div>\n </div>\n ))}\n </div>\n</ScrollArea>\n```\n\n## Scroll horizontal\n\n```tsx\n<ScrollArea\n orientation=\"horizontal\"\n className=\"w-96 rounded-md border border-border p-4\"\n>\n <div className=\"flex w-max gap-4\">\n {items.map((item) => (\n <div key={item.id} className=\"w-32 shrink-0\">\n {item.title}\n </div>\n ))}\n </div>\n</ScrollArea>\n```\n\n## Scroll en ambos ejes\n\n```tsx\n<ScrollArea\n orientation=\"both\"\n className=\"h-72 w-72 rounded-md border border-border p-4\"\n>\n <div className=\"h-[500px] w-[500px]\">\n {content}\n </div>\n</ScrollArea>\n```\n\n## Reglas\n\n- Define una altura o ancho fijo para que el scroll funcione.\n- El contenido debe ser más grande que el contenedor para que aparezca scroll.\n- No envuelvas toda la página en `ScrollArea` → usa scroll nativo del body.\n- No anides múltiples `ScrollArea`.\n\n## Import\n\n```tsx\nimport { ScrollArea } from \"@/shared/components/base/ScrollArea\"; // o @/components/base/ScrollArea\n```\n\n## Props\n\n| Componente | Props | Descripción |\n|---|---|---|\n| `ScrollArea` | `className?`, `children`, `orientation?`, `...` | Contenedor con scroll. `orientation`: `\"vertical\"` (default), `\"horizontal\"` o `\"both\"`. |\n| `ScrollBar` | `className?`, `orientation?` | Primitiva de barra para composiciones avanzadas. |\n\n## Para IA\n\n1. Identifica si el contenido excede el espacio disponible.\n2. Si necesitas scroll estilizado → usa `ScrollArea`.\n3. Define `height` y/o `width` en el contenedor y elige `orientation`.\n4. No uses `ScrollArea` para scroll de página completa.\n"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
package/assets/r/searchbox.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "searchbox",
|
|
4
4
|
"type": "registry:ui",
|
|
5
5
|
"title": "Searchbox",
|
|
6
|
-
"description": "Campo de búsqueda con icono. Para búsquedas.
|
|
6
|
+
"description": "Campo de búsqueda con icono. Para búsquedas.",
|
|
7
7
|
"dependencies": [],
|
|
8
8
|
"registryDependencies": [],
|
|
9
9
|
"files": [
|
|
@@ -11,13 +11,13 @@
|
|
|
11
11
|
"path": "components/base/Searchbox.tsx",
|
|
12
12
|
"type": "registry:ui",
|
|
13
13
|
"target": "components/base/Searchbox.tsx",
|
|
14
|
-
"content": "import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nexport interface SearchboxProps extends Omit<React.ComponentProps<\"input\">, \"type\"> {\n /** Cuando se define, muestra un botón (×) para limpiar el campo. */\n onClear?: () => void;\n}\n\nconst Searchbox = React.forwardRef<HTMLInputElement, SearchboxProps>(\n ({ className, onClear, value, disabled, ...props }, ref) => {\n const hasValue = value !== undefined && String(value) !== \"\";\n const showClear = !!onClear && hasValue && !disabled;\n\n return (\n <div className={cn(\"relative flex w-full items-center\", className)}>\n <svg\n className=\"pointer-events-none absolute left-3
|
|
14
|
+
"content": "import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nexport interface SearchboxProps extends Omit<React.ComponentProps<\"input\">, \"type\"> {\n /** Cuando se define, muestra un botón (×) para limpiar el campo. */\n onClear?: () => void;\n}\n\nconst Searchbox = React.forwardRef<HTMLInputElement, SearchboxProps>(\n ({ className, onClear, value, disabled, ...props }, ref) => {\n const hasValue = value !== undefined && String(value) !== \"\";\n const showClear = !!onClear && hasValue && !disabled;\n\n return (\n <div className={cn(\"relative flex w-full items-center\", className)}>\n <svg\n className=\"pointer-events-none absolute left-3 size-(--icon-size-inline) text-muted-foreground\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <path d=\"m21 21-4.3-4.3\" />\n </svg>\n <input\n ref={ref}\n type=\"search\"\n role=\"searchbox\"\n value={value}\n disabled={disabled}\n className={cn(\n \"flex h-10 w-full rounded-control border border-input bg-background pl-9 pr-9 type-supporting text-foreground outline-none transition-colors duration-[var(--duration-fast)] ease-[var(--ease-standard)] motion-reduce:transition-none\",\n \"placeholder:text-muted-foreground\",\n \"hover:border-muted-foreground/40 focus-visible:border-primary\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"[&::-webkit-search-cancel-button]:appearance-none\",\n )}\n {...props}\n />\n {showClear && (\n <button\n type=\"button\"\n onClick={onClear}\n aria-label=\"Limpiar\"\n className=\"absolute right-3 flex size-(--icon-size-control) cursor-pointer items-center justify-center rounded-button text-muted-foreground transition-colors hover:text-foreground\"\n >\n <svg\n className=\"size-(--icon-size-control)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M18 6 6 18M6 6l12 12\" />\n </svg>\n </button>\n )}\n </div>\n );\n },\n);\nSearchbox.displayName = \"Searchbox\";\n\nexport { Searchbox };\n"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
17
|
"path": "components/base/Searchbox.md",
|
|
18
18
|
"type": "registry:file",
|
|
19
19
|
"target": "components/base/Searchbox.md",
|
|
20
|
-
"content": "# Searchbox
|
|
20
|
+
"content": "# Searchbox\nCampo de búsqueda con icono. Para búsquedas.\n\n## Cuándo usarlo\n\nPara filtrar o buscar dentro de un conjunto: la tabla del desk, un listado. El icono de lupa fija la expectativa. Si en realidad se elige entre opciones (no se filtra contenido), eso es un `Combobox`.\n\n## Composición\n\nUna sola pieza (`Searchbox`): un `Input` con el icono de búsqueda integrado. En toolbars convive con las acciones a la derecha.\n\n## Uso básico\n\n```tsx\n<Searchbox />\n```\n\n## Reglas\n\n- Usa Searchbox según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Import\n\n```tsx\nimport { Searchbox } from \"@/components/base/Searchbox\";\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa Searchbox 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"
|
|
21
21
|
}
|
|
22
22
|
]
|
|
23
23
|
}
|
package/assets/r/select.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "select",
|
|
4
4
|
"type": "registry:ui",
|
|
5
5
|
"title": "Select",
|
|
6
|
-
"description": "Lista desplegable de selección **única** (Radix). Ahorra espacio cuando hay muchas opciones y no necesitas verlas todas a la vez.
|
|
6
|
+
"description": "Lista desplegable de selección **única** (Radix). Ahorra espacio cuando hay muchas opciones y no necesitas verlas todas a la vez.",
|
|
7
7
|
"dependencies": [
|
|
8
8
|
"@radix-ui/react-select"
|
|
9
9
|
],
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
"path": "components/base/Select.tsx",
|
|
14
14
|
"type": "registry:ui",
|
|
15
15
|
"target": "components/base/Select.tsx",
|
|
16
|
-
"content": "import * as SelectPrimitive from \"@radix-ui/react-select\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded border border-input bg-background px-3 py-2
|
|
16
|
+
"content": "import * as SelectPrimitive from \"@radix-ui/react-select\";\nimport * as React from \"react\";\n\nimport { cn } from \"@/lib/utils/cn\";\n\nconst Select = SelectPrimitive.Root;\nconst SelectGroup = SelectPrimitive.Group;\nconst SelectValue = SelectPrimitive.Value;\n\nconst SelectTrigger = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Trigger\n ref={ref}\n className={cn(\n \"flex h-10 w-full items-center justify-between rounded-control border border-input bg-background px-3 py-2 type-supporting text-foreground outline-none transition-colors duration-[var(--duration-fast)] ease-[var(--ease-standard)] hover:border-muted-foreground/40 focus:border-primary disabled:cursor-not-allowed disabled:opacity-50 motion-reduce:transition-none data-[placeholder]:text-muted-foreground [&>span]:line-clamp-1\",\n className,\n )}\n {...props}\n >\n {children}\n <SelectPrimitive.Icon asChild>\n <svg\n className=\"size-(--icon-size-inline) opacity-50 transition-transform duration-[var(--duration-normal)] ease-[var(--ease-standard)] motion-reduce:transition-none 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 >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </SelectPrimitive.Icon>\n </SelectPrimitive.Trigger>\n));\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName;\n\nconst SelectScrollUpButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollUpButton\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <svg\n className=\"size-(--icon-size-inline)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m18 15-6-6-6 6\" />\n </svg>\n </SelectPrimitive.ScrollUpButton>\n));\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;\n\nconst SelectScrollDownButton = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.ScrollDownButton\n ref={ref}\n className={cn(\"flex cursor-default items-center justify-center py-1\", className)}\n {...props}\n >\n <svg\n className=\"size-(--icon-size-inline)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </SelectPrimitive.ScrollDownButton>\n));\nSelectScrollDownButton.displayName = SelectPrimitive.ScrollDownButton.displayName;\n\nconst SelectContent = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n ref={ref}\n className={cn(\n \"relative z-50 max-h-96 overflow-hidden rounded-md border border-border bg-popover text-popover-foreground shadow-overlay 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=top]:slide-in-from-bottom-2\",\n position === \"popper\" &&\n \"w-[var(--radix-select-trigger-width)] data-[side=bottom]:translate-y-1 data-[side=top]:-translate-y-1\",\n className,\n )}\n position={position}\n {...props}\n >\n <SelectScrollUpButton />\n <SelectPrimitive.Viewport\n className={cn(\n \"p-1\",\n position === \"popper\" &&\n \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\",\n )}\n >\n {children}\n </SelectPrimitive.Viewport>\n <SelectScrollDownButton />\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n));\nSelectContent.displayName = SelectPrimitive.Content.displayName;\n\nconst SelectLabel = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Label\n ref={ref}\n className={cn(\"px-2 py-1.5 type-meta font-medium text-muted-foreground\", className)}\n {...props}\n />\n));\nSelectLabel.displayName = SelectPrimitive.Label.displayName;\n\nconst SelectItem = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n <SelectPrimitive.Item\n ref={ref}\n className={cn(\n \"relative flex w-full cursor-pointer select-none items-center rounded-menu-item py-1.5 pl-8 pr-2 type-supporting text-foreground outline-none focus:bg-primary/15 focus:text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n className,\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <SelectPrimitive.ItemIndicator>\n <svg\n className=\"size-(--icon-size-inline)\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </SelectPrimitive.ItemIndicator>\n </span>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n </SelectPrimitive.Item>\n));\nSelectItem.displayName = SelectPrimitive.Item.displayName;\n\nconst SelectSeparator = React.forwardRef<\n React.ElementRef<typeof SelectPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <SelectPrimitive.Separator\n ref={ref}\n className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n {...props}\n />\n));\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName;\n\nexport {\n Select,\n SelectContent,\n SelectGroup,\n SelectItem,\n SelectLabel,\n SelectScrollDownButton,\n SelectScrollUpButton,\n SelectSeparator,\n SelectTrigger,\n SelectValue,\n};\n"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"path": "components/base/Select.md",
|
|
20
20
|
"type": "registry:file",
|
|
21
21
|
"target": "components/base/Select.md",
|
|
22
|
-
"content": "# Select
|
|
22
|
+
"content": "# Select\nLista desplegable de selección **única** (Radix). Ahorra espacio cuando hay muchas opciones y no necesitas verlas todas a la vez.\n\n## Cuándo usarlo\n\nPara selección única en listas medianas donde no necesitas ver todas las opciones a la vez: región, estado civil. Ahorra pantalla a cambio de un click. Con pocas opciones muestra `RadioGroup`; con muchas o con búsqueda, `Combobox`.\n\n## Composición\n\n`Select` con `SelectTrigger` (el campo, con `SelectValue`) y `SelectContent` con un `SelectItem` por opción; `SelectGroup` y `SelectLabel` organizan listas largas.\n\n## Uso básico\n\n```tsx\n<div className=\"grid gap-1.5\">\n <Label htmlFor=\"region\">Región</Label>\n <Select onValueChange={setRegion}>\n <SelectTrigger id=\"region\">\n <SelectValue placeholder=\"Selecciona una región\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"rm\">Metropolitana</SelectItem>\n <SelectItem value=\"v\">Valparaíso</SelectItem>\n <SelectItem value=\"viii\">Biobío</SelectItem>\n </SelectContent>\n </Select>\n</div>\n```\n\n## Con grupos\n\n```tsx\n<SelectContent>\n <SelectGroup>\n <SelectLabel>Zona norte</SelectLabel>\n <SelectItem value=\"i\">Tarapacá</SelectItem>\n </SelectGroup>\n <SelectSeparator />\n <SelectGroup>\n <SelectLabel>Zona centro</SelectLabel>\n <SelectItem value=\"rm\">Metropolitana</SelectItem>\n </SelectGroup>\n</SelectContent>\n```\n\n## Reglas\n\n- Asocia el `SelectTrigger` con un `Label` (`id`/`htmlFor`).\n- Usa `SelectValue` con `placeholder` claro; no dejes el trigger vacío.\n- Agrupa con `SelectGroup`/`SelectLabel` si hay categorías.\n- Cada `SelectItem` necesita `value` único.\n\n## Cuándo NO usar\n\n- **Pocas opciones (2–4) que conviene ver siempre** → `RadioGroup`.\n- **Necesitas escribir para filtrar** → `Combobox`.\n- **Selección múltiple** → `Checkbox` o `Combobox` con multiselección (no este Select).\n- **Acciones (no selección de valor)** → `DropdownMenu`.\n\n## Import\n\n```tsx\nimport {\n Select, SelectTrigger, SelectValue, SelectContent, SelectItem,\n} from \"@/components/base/Select\";\n```\n\n## Exports\n\n`Select`, `SelectTrigger`, `SelectValue`, `SelectContent`, `SelectItem`, `SelectGroup`, `SelectLabel`, `SelectSeparator`, `SelectScrollUpButton`, `SelectScrollDownButton`.\n\n## Props (esenciales)\n\n| Parte | Prop | Descripción |\n|---|---|---|\n| `Select` | `value` / `defaultValue` | Selección controlada / inicial. |\n| `Select` | `onValueChange` | Cambio de selección. |\n| `SelectTrigger` | `id` | Para asociar el `Label`. |\n| `SelectValue` | `placeholder` | Texto cuando no hay selección. |\n| `SelectItem` | `value` | **Requerido.** Valor de la opción. |\n\n## Para IA\n\n1. Confirma que es selección única de un valor de formulario (no acciones, no multiselección).\n2. Si son ≤4 opciones siempre visibles, considera `RadioGroup`; si requieren búsqueda, `Combobox`.\n3. Arma `Select > SelectTrigger (con SelectValue) > SelectContent > SelectItem`.\n4. Asocia el trigger con un `Label`.\n5. Controla con `value`/`onValueChange` cuando alimente un formulario.\n"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
package/assets/r/separator.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "separator",
|
|
4
4
|
"type": "registry:ui",
|
|
5
5
|
"title": "Separator",
|
|
6
|
-
"description": "Separador visual. Para dividir secciones.
|
|
6
|
+
"description": "Separador visual. Para dividir secciones.",
|
|
7
7
|
"dependencies": [
|
|
8
8
|
"@radix-ui/react-separator"
|
|
9
9
|
],
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"path": "components/base/Separator.md",
|
|
20
20
|
"type": "registry:file",
|
|
21
21
|
"target": "components/base/Separator.md",
|
|
22
|
-
"content": "# Separator
|
|
22
|
+
"content": "# Separator\nSeparador visual. Para dividir secciones.\n\n## Cuándo usarlo\n\nPara marcar un límite entre zonas cuando el aire no basta: menús, toolbars, metadatos en línea. Primero prueba con espacio — la línea es el recurso de segunda instancia.\n\n## Composición\n\nUna sola pieza (`Separator`) con orientación horizontal o vertical. Decorativa por defecto: los lectores de pantalla la ignoran.\n\n## Uso básico\n\n```tsx\n<Separator />\n```\n\n## Reglas\n\n- Usa Separator según el propósito descrito.\n- No abuses de este componente en contexts donde no aplica.\n\n## Import\n\n```tsx\nimport { Separator } from \"@/components/base/Separator\";\n```\n\n## Props\n\nConsulta la story en Storybook para ver las props disponibles.\n\n## Para IA\n\n1. Identifica el contexto de uso del componente.\n2. Importa Separator 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
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|