@adamosuiteservices/ui 1.8.13 → 1.9.14

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 (144) hide show
  1. package/dist/components/ui/icon/icon.d.ts +11 -0
  2. package/dist/components/ui/icon/icon.stories.d.ts +55 -0
  3. package/dist/components/ui/icon/index.d.ts +1 -0
  4. package/dist/components/ui/input-group/input-group.d.ts +1 -1
  5. package/dist/custom-layered-styles.css +1 -1
  6. package/dist/icon.cjs +6 -0
  7. package/dist/icon.js +36 -0
  8. package/dist/icons.css +1 -0
  9. package/dist/styles.css +1 -1
  10. package/docs/AI-GUIDE.md +321 -321
  11. package/docs/components/layout/sidebar.md +404 -404
  12. package/docs/components/layout/toaster.md +436 -436
  13. package/docs/components/ui/accordion-rounded.md +583 -583
  14. package/docs/components/ui/accordion.md +267 -267
  15. package/docs/components/ui/alert.md +671 -671
  16. package/docs/components/ui/avatar.md +588 -588
  17. package/docs/components/ui/badge.md +1024 -1024
  18. package/docs/components/ui/button-group.md +1002 -1002
  19. package/docs/components/ui/button.md +1078 -1078
  20. package/docs/components/ui/calendar.md +1159 -1159
  21. package/docs/components/ui/card.md +1265 -1265
  22. package/docs/components/ui/checkbox.md +292 -292
  23. package/docs/components/ui/collapsible.md +320 -320
  24. package/docs/components/ui/command.md +454 -454
  25. package/docs/components/ui/context-menu.md +540 -540
  26. package/docs/components/ui/dialog.md +628 -628
  27. package/docs/components/ui/dropdown-menu.md +731 -731
  28. package/docs/components/ui/field.md +706 -706
  29. package/docs/components/ui/hover-card.md +446 -446
  30. package/docs/components/ui/icon.md +502 -0
  31. package/docs/components/ui/input-group.md +509 -509
  32. package/docs/components/ui/input.md +362 -362
  33. package/docs/components/ui/kbd.md +434 -434
  34. package/docs/components/ui/label.md +359 -359
  35. package/docs/components/ui/pagination.md +650 -650
  36. package/docs/components/ui/popover.md +536 -536
  37. package/docs/components/ui/progress.md +182 -182
  38. package/docs/components/ui/radio-group.md +311 -311
  39. package/docs/components/ui/select.md +352 -352
  40. package/docs/components/ui/separator.md +214 -214
  41. package/docs/components/ui/sheet.md +142 -142
  42. package/docs/components/ui/skeleton.md +140 -140
  43. package/docs/components/ui/slider.md +341 -341
  44. package/docs/components/ui/spinner.md +170 -170
  45. package/docs/components/ui/switch.md +402 -402
  46. package/docs/components/ui/table.md +183 -183
  47. package/docs/components/ui/tabs-underline.md +106 -106
  48. package/docs/components/ui/tabs.md +122 -122
  49. package/docs/components/ui/textarea.md +243 -243
  50. package/docs/components/ui/toggle.md +243 -243
  51. package/docs/components/ui/tooltip.md +320 -320
  52. package/docs/components/ui/typography.md +191 -191
  53. package/package.json +6 -5
  54. package/dist/components/icons/account-balance-icon.d.ts +0 -3
  55. package/dist/components/icons/account-icon.d.ts +0 -3
  56. package/dist/components/icons/add-circle-icon.d.ts +0 -3
  57. package/dist/components/icons/alarm-icon.d.ts +0 -3
  58. package/dist/components/icons/archive-icon.d.ts +0 -3
  59. package/dist/components/icons/arrow-back-icon.d.ts +0 -3
  60. package/dist/components/icons/arrow-circle-up-icon.d.ts +0 -3
  61. package/dist/components/icons/arrow-forward-icon.d.ts +0 -3
  62. package/dist/components/icons/arrow-outward-icon.d.ts +0 -3
  63. package/dist/components/icons/article-icon.d.ts +0 -3
  64. package/dist/components/icons/attach-file-icon.d.ts +0 -3
  65. package/dist/components/icons/autorenew-icon.d.ts +0 -3
  66. package/dist/components/icons/bookmark-icon.d.ts +0 -3
  67. package/dist/components/icons/calculate-icon.d.ts +0 -3
  68. package/dist/components/icons/calendar-today-icon.d.ts +0 -3
  69. package/dist/components/icons/call-split-icon.d.ts +0 -3
  70. package/dist/components/icons/cancel-filled-icon.d.ts +0 -3
  71. package/dist/components/icons/cancel-icon.d.ts +0 -3
  72. package/dist/components/icons/check-circle-icon.d.ts +0 -3
  73. package/dist/components/icons/check-icon.d.ts +0 -3
  74. package/dist/components/icons/chevron-back-icon.d.ts +0 -3
  75. package/dist/components/icons/chevron-down-icon.d.ts +0 -3
  76. package/dist/components/icons/chevron-forward-icon.d.ts +0 -3
  77. package/dist/components/icons/chevron-up-icon.d.ts +0 -3
  78. package/dist/components/icons/clarify-icon.d.ts +0 -3
  79. package/dist/components/icons/clock-icon.d.ts +0 -3
  80. package/dist/components/icons/close-icon.d.ts +0 -3
  81. package/dist/components/icons/confirmation-number-icon.d.ts +0 -3
  82. package/dist/components/icons/contacts-icon.d.ts +0 -3
  83. package/dist/components/icons/contract-delete-icon.d.ts +0 -3
  84. package/dist/components/icons/copy-icon.d.ts +0 -3
  85. package/dist/components/icons/do-not-touch-icon.d.ts +0 -3
  86. package/dist/components/icons/download-icon.d.ts +0 -3
  87. package/dist/components/icons/dragger-icon.d.ts +0 -3
  88. package/dist/components/icons/edit-icon.d.ts +0 -3
  89. package/dist/components/icons/edit-square-icon.d.ts +0 -3
  90. package/dist/components/icons/exclamation-icon.d.ts +0 -3
  91. package/dist/components/icons/expand-circle-right-icon.d.ts +0 -3
  92. package/dist/components/icons/feature-search-icon.d.ts +0 -3
  93. package/dist/components/icons/filter-icon.d.ts +0 -3
  94. package/dist/components/icons/folder-icon.d.ts +0 -3
  95. package/dist/components/icons/folder-open-icon.d.ts +0 -3
  96. package/dist/components/icons/format-list-bulleted-icon.d.ts +0 -3
  97. package/dist/components/icons/hamburger-menu-icon.d.ts +0 -3
  98. package/dist/components/icons/help-icon.d.ts +0 -3
  99. package/dist/components/icons/hide-pass-icon.d.ts +0 -3
  100. package/dist/components/icons/home-icon.d.ts +0 -3
  101. package/dist/components/icons/id-card-icon.d.ts +0 -3
  102. package/dist/components/icons/index.d.ts +0 -88
  103. package/dist/components/icons/info-icon.d.ts +0 -3
  104. package/dist/components/icons/kid-star-icon.d.ts +0 -3
  105. package/dist/components/icons/language-icon.d.ts +0 -3
  106. package/dist/components/icons/last-page-icon.d.ts +0 -3
  107. package/dist/components/icons/layers-icon.d.ts +0 -3
  108. package/dist/components/icons/location-icon.d.ts +0 -3
  109. package/dist/components/icons/mail-icon.d.ts +0 -3
  110. package/dist/components/icons/manage-search-icon.d.ts +0 -3
  111. package/dist/components/icons/menu-icon.d.ts +0 -3
  112. package/dist/components/icons/message-icon.d.ts +0 -3
  113. package/dist/components/icons/metrics-icon.d.ts +0 -3
  114. package/dist/components/icons/mic-icon.d.ts +0 -3
  115. package/dist/components/icons/minus-icon.d.ts +0 -3
  116. package/dist/components/icons/mode-comment-icon.d.ts +0 -3
  117. package/dist/components/icons/money-icon.d.ts +0 -3
  118. package/dist/components/icons/monitoring-icon.d.ts +0 -3
  119. package/dist/components/icons/more-icon.d.ts +0 -3
  120. package/dist/components/icons/notifications-icon.d.ts +0 -3
  121. package/dist/components/icons/open-in-new-icon.d.ts +0 -3
  122. package/dist/components/icons/palette-icon.d.ts +0 -3
  123. package/dist/components/icons/password-icon.d.ts +0 -3
  124. package/dist/components/icons/pending-icon.d.ts +0 -3
  125. package/dist/components/icons/person-add-icon.d.ts +0 -3
  126. package/dist/components/icons/person-search-icon.d.ts +0 -3
  127. package/dist/components/icons/photo-icon.d.ts +0 -3
  128. package/dist/components/icons/plus-icon.d.ts +0 -3
  129. package/dist/components/icons/policy-icon.d.ts +0 -3
  130. package/dist/components/icons/publish-icon.d.ts +0 -3
  131. package/dist/components/icons/ready-icon.d.ts +0 -3
  132. package/dist/components/icons/receipt-icon.d.ts +0 -3
  133. package/dist/components/icons/receive-icon.d.ts +0 -3
  134. package/dist/components/icons/refresh-icon.d.ts +0 -3
  135. package/dist/components/icons/search-icon.d.ts +0 -3
  136. package/dist/components/icons/see-icon.d.ts +0 -3
  137. package/dist/components/icons/send-icon.d.ts +0 -3
  138. package/dist/components/icons/settings-icon.d.ts +0 -3
  139. package/dist/components/icons/shield-icon.d.ts +0 -3
  140. package/dist/components/icons/swap-horiz-icon.d.ts +0 -3
  141. package/dist/components/icons/tag-icon.d.ts +0 -3
  142. package/dist/components/icons/trash-icon.d.ts +0 -3
  143. package/dist/icons.cjs +0 -1
  144. package/dist/icons.js +0 -1507
@@ -1,320 +1,320 @@
1
- # Collapsible
2
-
3
- Componente interactivo basado en Radix UI para expandir/colapsar contenido con animaciones suaves. Útil para FAQs, menús de navegación, y secciones opcionales.
4
-
5
- ## Importación
6
-
7
- ```tsx
8
- import {
9
- Collapsible,
10
- CollapsibleTrigger,
11
- CollapsibleContent,
12
- } from "@adamosuiteservices/ui/collapsible";
13
- ```
14
-
15
- ## Anatomía
16
-
17
- ```tsx
18
- <Collapsible>
19
- <CollapsibleTrigger>Click to toggle</CollapsibleTrigger>
20
- <CollapsibleContent>Hidden content that expands/collapses</CollapsibleContent>
21
- </Collapsible>
22
- ```
23
-
24
- **Componentes**: 3 (Collapsible root, CollapsibleTrigger, CollapsibleContent)
25
-
26
- ## Props Principales
27
-
28
- ### Collapsible (Root)
29
-
30
- | Prop | Tipo | Default | Descripción |
31
- | -------------- | ------------------------- | ------- | ----------------------------------- |
32
- | `open` | `boolean` | - | Estado controlado (abierto/cerrado) |
33
- | `defaultOpen` | `boolean` | `false` | Estado inicial no controlado |
34
- | `onOpenChange` | `(open: boolean) => void` | - | Callback al cambiar estado |
35
- | `disabled` | `boolean` | `false` | Desactiva interacción |
36
- | `className` | `string` | - | Clases CSS adicionales |
37
-
38
- ### CollapsibleTrigger
39
-
40
- | Prop | Tipo | Default | Descripción |
41
- | ----------- | --------- | ------- | ----------------------------------- |
42
- | `asChild` | `boolean` | `false` | Usa child como trigger (Radix Slot) |
43
- | `className` | `string` | - | Clases CSS adicionales |
44
-
45
- ### CollapsibleContent
46
-
47
- | Prop | Tipo | Default | Descripción |
48
- | ------------ | --------- | ------- | ----------------------------------------- |
49
- | `forceMount` | `boolean` | `false` | Fuerza montaje en DOM aunque esté cerrado |
50
- | `className` | `string` | - | Clases CSS adicionales |
51
-
52
- ## Patrones de Uso
53
-
54
- ### Básico (No Controlado)
55
-
56
- ```tsx
57
- <Collapsible>
58
- <CollapsibleTrigger>Show details</CollapsibleTrigger>
59
- <CollapsibleContent>
60
- <p>Additional information here.</p>
61
- </CollapsibleContent>
62
- </Collapsible>
63
- ```
64
-
65
- ### Controlado con Estado
66
-
67
- ```tsx
68
- const [isOpen, setIsOpen] = useState(false);
69
-
70
- <Collapsible open={isOpen} onOpenChange={setIsOpen}>
71
- <CollapsibleTrigger>{isOpen ? "Hide" : "Show"} content</CollapsibleTrigger>
72
- <CollapsibleContent>
73
- <p>Controlled content</p>
74
- </CollapsibleContent>
75
- </Collapsible>;
76
- ```
77
-
78
- ### Con Botón Custom (asChild)
79
-
80
- ```tsx
81
- import { Button } from "@adamosuiteservices/ui/button";
82
- import { ChevronsUpDownIcon } from "lucide-react";
83
-
84
- <Collapsible>
85
- <CollapsibleTrigger asChild>
86
- <Button variant="outline" size="sm">
87
- <ChevronsUpDownIcon />
88
- Toggle
89
- </Button>
90
- </CollapsibleTrigger>
91
- <CollapsibleContent>
92
- <p>Content</p>
93
- </CollapsibleContent>
94
- </Collapsible>;
95
- ```
96
-
97
- ### Con Chevron Rotatorio
98
-
99
- ```tsx
100
- const [isOpen, setIsOpen] = useState(false);
101
-
102
- <Collapsible open={isOpen} onOpenChange={setIsOpen}>
103
- <CollapsibleTrigger className="flex w-full items-center justify-between p-4 border rounded-lg hover:bg-muted">
104
- <span>Section Title</span>
105
- <ChevronDownIcon
106
- className={`h-4 w-4 transition-transform ${isOpen ? "rotate-180" : ""}`}
107
- />
108
- </CollapsibleTrigger>
109
- <CollapsibleContent className="p-4">
110
- <p>Expandable content</p>
111
- </CollapsibleContent>
112
- </Collapsible>;
113
- ```
114
-
115
- ### FAQ Pattern
116
-
117
- ```tsx
118
- <div className="space-y-4">
119
- <Collapsible>
120
- <CollapsibleTrigger className="flex w-full items-center justify-between border p-4 rounded-lg hover:bg-muted">
121
- <span className="font-medium">What is this?</span>
122
- <ChevronRightIcon className="h-4 w-4" />
123
- </CollapsibleTrigger>
124
- <CollapsibleContent className="px-4 pb-4">
125
- <p className="text-sm text-muted-foreground">
126
- This is a reusable UI component library.
127
- </p>
128
- </CollapsibleContent>
129
- </Collapsible>
130
-
131
- <Collapsible>
132
- <CollapsibleTrigger className="flex w-full items-center justify-between border p-4 rounded-lg hover:bg-muted">
133
- <span className="font-medium">How to install?</span>
134
- <ChevronRightIcon className="h-4 w-4" />
135
- </CollapsibleTrigger>
136
- <CollapsibleContent className="px-4 pb-4">
137
- <p className="text-sm text-muted-foreground">
138
- Use: <code>npm install @adamosuiteservices/ui</code>
139
- </p>
140
- </CollapsibleContent>
141
- </Collapsible>
142
- </div>
143
- ```
144
-
145
- ### Navigation Menu
146
-
147
- ```tsx
148
- const [openSections, setOpenSections] = useState<string[]>(["settings"]);
149
-
150
- const toggleSection = (id: string) => {
151
- setOpenSections((prev) =>
152
- prev.includes(id) ? prev.filter((s) => s !== id) : [...prev, id]
153
- );
154
- };
155
-
156
- <div className="space-y-2">
157
- <Collapsible
158
- open={openSections.includes("settings")}
159
- onOpenChange={() => toggleSection("settings")}
160
- >
161
- <CollapsibleTrigger className="flex w-full items-center gap-2 p-3 rounded-lg hover:bg-muted">
162
- <SettingsIcon className="h-4 w-4" />
163
- <span className="flex-1 font-medium">Settings</span>
164
- <ChevronDownIcon
165
- className={`h-4 w-4 transition-transform ${
166
- openSections.includes("settings") ? "rotate-180" : ""
167
- }`}
168
- />
169
- </CollapsibleTrigger>
170
- <CollapsibleContent className="ml-6 space-y-1">
171
- <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
172
- Profile
173
- </a>
174
- <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
175
- Security
176
- </a>
177
- </CollapsibleContent>
178
- </Collapsible>
179
-
180
- <Collapsible
181
- open={openSections.includes("account")}
182
- onOpenChange={() => toggleSection("account")}
183
- >
184
- <CollapsibleTrigger className="flex w-full items-center gap-2 p-3 rounded-lg hover:bg-muted">
185
- <UserIcon className="h-4 w-4" />
186
- <span className="flex-1 font-medium">Account</span>
187
- <ChevronDownIcon
188
- className={`h-4 w-4 transition-transform ${
189
- openSections.includes("account") ? "rotate-180" : ""
190
- }`}
191
- />
192
- </CollapsibleTrigger>
193
- <CollapsibleContent className="ml-6 space-y-1">
194
- <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
195
- Billing
196
- </a>
197
- <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
198
- API Keys
199
- </a>
200
- </CollapsibleContent>
201
- </Collapsible>
202
- </div>;
203
- ```
204
-
205
- ### Lista de Archivos
206
-
207
- ```tsx
208
- <Collapsible defaultOpen className="w-full space-y-2">
209
- <CollapsibleTrigger className="w-full border p-3 rounded-lg text-left font-medium hover:bg-muted">
210
- Recent Files
211
- </CollapsibleTrigger>
212
- <CollapsibleContent className="space-y-1">
213
- <div className="border p-3 rounded text-sm">document.pdf</div>
214
- <div className="border p-3 rounded text-sm">presentation.pptx</div>
215
- <div className="border p-3 rounded text-sm">spreadsheet.xlsx</div>
216
- </CollapsibleContent>
217
- </Collapsible>
218
- ```
219
-
220
- ### Sección Deshabilitada
221
-
222
- ```tsx
223
- <Collapsible disabled>
224
- <CollapsibleTrigger className="w-full border p-3 rounded-lg text-left font-medium opacity-50 cursor-not-allowed">
225
- Coming Soon
226
- </CollapsibleTrigger>
227
- <CollapsibleContent>
228
- <p className="p-3 text-sm text-muted-foreground">Not available yet.</p>
229
- </CollapsibleContent>
230
- </Collapsible>
231
- ```
232
-
233
- ### Con Layout de Tarjeta
234
-
235
- ```tsx
236
- <Collapsible className="border rounded-lg p-4">
237
- <div className="flex items-center justify-between mb-2">
238
- <h4 className="font-semibold">@user starred 3 repos</h4>
239
- <CollapsibleTrigger asChild>
240
- <Button variant="outline" size="sm">
241
- <ChevronsUpDownIcon />
242
- </Button>
243
- </CollapsibleTrigger>
244
- </div>
245
-
246
- <div className="border px-4 py-2 rounded font-mono text-sm">
247
- @radix-ui/primitives
248
- </div>
249
-
250
- <CollapsibleContent className="mt-2 space-y-2">
251
- <div className="border px-4 py-2 rounded font-mono text-sm">
252
- @radix-ui/colors
253
- </div>
254
- <div className="border px-4 py-2 rounded font-mono text-sm">
255
- @stitches/react
256
- </div>
257
- </CollapsibleContent>
258
- </Collapsible>
259
- ```
260
-
261
- ## Casos de Uso Comunes
262
-
263
- **FAQ sections**: Lista de preguntas frecuentes expandibles
264
- **Navigation menus**: Menús colapsables con subsecciones
265
- **Details/Summary**: Información adicional opcional
266
- **File browsers**: Estructuras de carpetas expandibles
267
- **Settings panels**: Grupos de configuraciones organizadas
268
- **Table rows**: Filas de tabla con detalles expandibles
269
-
270
- ## Estilos y Animaciones
271
-
272
- ### Data States
273
-
274
- - **Abierto**: `data-state="open"` en todos los componentes
275
- - **Cerrado**: `data-state="closed"` en todos los componentes
276
- - **Disabled**: `data-disabled` cuando `disabled={true}`
277
-
278
- ### Animación Suave
279
-
280
- El contenido usa animaciones CSS automáticas (height, opacity) al expandir/colapsar. No requiere configuración adicional.
281
-
282
- ### Custom Animations
283
-
284
- ```tsx
285
- <CollapsibleContent className="data-[state=open]:animate-slideDown data-[state=closed]:animate-slideUp">
286
- Content with custom animations
287
- </CollapsibleContent>
288
- ```
289
-
290
- ## Accesibilidad
291
-
292
- - ✅ **Navegación teclado**: Enter/Space para toggle en trigger, Tab para navegar
293
- - ✅ **ARIA**: `aria-expanded`, `aria-controls` automáticos en trigger
294
- - ✅ **Screen readers**: Anuncia estado expandido/colapsado
295
- - ✅ **Focus visible**: Trigger recibe focus del teclado
296
- - ✅ **Disabled state**: `aria-disabled` cuando disabled
297
-
298
- ## Notas de Implementación
299
-
300
- - **Basado en Radix UI**: `@radix-ui/react-collapsible`
301
- - **No tiene estilos propios**: Wrapper limpio, agrega tus propios estilos
302
- - **Data slots**: `data-slot="collapsible"`, `data-slot="collapsible-trigger"`, `data-slot="collapsible-content"`
303
- - **asChild pattern**: CollapsibleTrigger soporta `asChild` para usar componentes custom
304
- - **Animaciones automáticas**: Radix maneja transiciones de height/opacity
305
- - **forceMount**: Útil para animaciones custom o cuando necesitas el DOM montado siempre
306
- - **Multiple instances**: Puedes tener múltiples Collapsibles independientes
307
- - **Accordion vs Collapsible**: Usa Accordion cuando solo uno debe estar abierto, Collapsible para control independiente
308
-
309
- ## Troubleshooting
310
-
311
- **Animación no suave**: Radix maneja animaciones automáticamente, si no se ve suave verifica que no haya `transition` conflictivos en CSS
312
- **Trigger no clickeable**: Verifica que esté dentro de `<Collapsible>`, no como hermano
313
- **asChild no funciona**: Asegúrate que el child acepta props `onClick` y `aria-*`
314
- **Content siempre visible**: Verifica que no tengas `forceMount` activado sin intención
315
- **Estado no sincroniza**: En modo controlado, asegúrate de usar ambos `open` y `onOpenChange`
316
-
317
- ## Referencias
318
-
319
- - **Radix UI Collapsible**: https://www.radix-ui.com/primitives/docs/components/collapsible
320
- - **ARIA Disclosure**: https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/
1
+ # Collapsible
2
+
3
+ Componente interactivo basado en Radix UI para expandir/colapsar contenido con animaciones suaves. Útil para FAQs, menús de navegación, y secciones opcionales.
4
+
5
+ ## Importación
6
+
7
+ ```tsx
8
+ import {
9
+ Collapsible,
10
+ CollapsibleTrigger,
11
+ CollapsibleContent,
12
+ } from "@adamosuiteservices/ui/collapsible";
13
+ ```
14
+
15
+ ## Anatomía
16
+
17
+ ```tsx
18
+ <Collapsible>
19
+ <CollapsibleTrigger>Click to toggle</CollapsibleTrigger>
20
+ <CollapsibleContent>Hidden content that expands/collapses</CollapsibleContent>
21
+ </Collapsible>
22
+ ```
23
+
24
+ **Componentes**: 3 (Collapsible root, CollapsibleTrigger, CollapsibleContent)
25
+
26
+ ## Props Principales
27
+
28
+ ### Collapsible (Root)
29
+
30
+ | Prop | Tipo | Default | Descripción |
31
+ | -------------- | ------------------------- | ------- | ----------------------------------- |
32
+ | `open` | `boolean` | - | Estado controlado (abierto/cerrado) |
33
+ | `defaultOpen` | `boolean` | `false` | Estado inicial no controlado |
34
+ | `onOpenChange` | `(open: boolean) => void` | - | Callback al cambiar estado |
35
+ | `disabled` | `boolean` | `false` | Desactiva interacción |
36
+ | `className` | `string` | - | Clases CSS adicionales |
37
+
38
+ ### CollapsibleTrigger
39
+
40
+ | Prop | Tipo | Default | Descripción |
41
+ | ----------- | --------- | ------- | ----------------------------------- |
42
+ | `asChild` | `boolean` | `false` | Usa child como trigger (Radix Slot) |
43
+ | `className` | `string` | - | Clases CSS adicionales |
44
+
45
+ ### CollapsibleContent
46
+
47
+ | Prop | Tipo | Default | Descripción |
48
+ | ------------ | --------- | ------- | ----------------------------------------- |
49
+ | `forceMount` | `boolean` | `false` | Fuerza montaje en DOM aunque esté cerrado |
50
+ | `className` | `string` | - | Clases CSS adicionales |
51
+
52
+ ## Patrones de Uso
53
+
54
+ ### Básico (No Controlado)
55
+
56
+ ```tsx
57
+ <Collapsible>
58
+ <CollapsibleTrigger>Show details</CollapsibleTrigger>
59
+ <CollapsibleContent>
60
+ <p>Additional information here.</p>
61
+ </CollapsibleContent>
62
+ </Collapsible>
63
+ ```
64
+
65
+ ### Controlado con Estado
66
+
67
+ ```tsx
68
+ const [isOpen, setIsOpen] = useState(false);
69
+
70
+ <Collapsible open={isOpen} onOpenChange={setIsOpen}>
71
+ <CollapsibleTrigger>{isOpen ? "Hide" : "Show"} content</CollapsibleTrigger>
72
+ <CollapsibleContent>
73
+ <p>Controlled content</p>
74
+ </CollapsibleContent>
75
+ </Collapsible>;
76
+ ```
77
+
78
+ ### Con Botón Custom (asChild)
79
+
80
+ ```tsx
81
+ import { Button } from "@adamosuiteservices/ui/button";
82
+ import { ChevronsUpDownIcon } from "lucide-react";
83
+
84
+ <Collapsible>
85
+ <CollapsibleTrigger asChild>
86
+ <Button variant="outline" size="sm">
87
+ <ChevronsUpDownIcon />
88
+ Toggle
89
+ </Button>
90
+ </CollapsibleTrigger>
91
+ <CollapsibleContent>
92
+ <p>Content</p>
93
+ </CollapsibleContent>
94
+ </Collapsible>;
95
+ ```
96
+
97
+ ### Con Chevron Rotatorio
98
+
99
+ ```tsx
100
+ const [isOpen, setIsOpen] = useState(false);
101
+
102
+ <Collapsible open={isOpen} onOpenChange={setIsOpen}>
103
+ <CollapsibleTrigger className="flex w-full items-center justify-between p-4 border rounded-lg hover:bg-muted">
104
+ <span>Section Title</span>
105
+ <ChevronDownIcon
106
+ className={`h-4 w-4 transition-transform ${isOpen ? "rotate-180" : ""}`}
107
+ />
108
+ </CollapsibleTrigger>
109
+ <CollapsibleContent className="p-4">
110
+ <p>Expandable content</p>
111
+ </CollapsibleContent>
112
+ </Collapsible>;
113
+ ```
114
+
115
+ ### FAQ Pattern
116
+
117
+ ```tsx
118
+ <div className="space-y-4">
119
+ <Collapsible>
120
+ <CollapsibleTrigger className="flex w-full items-center justify-between border p-4 rounded-lg hover:bg-muted">
121
+ <span className="font-medium">What is this?</span>
122
+ <ChevronRightIcon className="h-4 w-4" />
123
+ </CollapsibleTrigger>
124
+ <CollapsibleContent className="px-4 pb-4">
125
+ <p className="text-sm text-muted-foreground">
126
+ This is a reusable UI component library.
127
+ </p>
128
+ </CollapsibleContent>
129
+ </Collapsible>
130
+
131
+ <Collapsible>
132
+ <CollapsibleTrigger className="flex w-full items-center justify-between border p-4 rounded-lg hover:bg-muted">
133
+ <span className="font-medium">How to install?</span>
134
+ <ChevronRightIcon className="h-4 w-4" />
135
+ </CollapsibleTrigger>
136
+ <CollapsibleContent className="px-4 pb-4">
137
+ <p className="text-sm text-muted-foreground">
138
+ Use: <code>npm install @adamosuiteservices/ui</code>
139
+ </p>
140
+ </CollapsibleContent>
141
+ </Collapsible>
142
+ </div>
143
+ ```
144
+
145
+ ### Navigation Menu
146
+
147
+ ```tsx
148
+ const [openSections, setOpenSections] = useState<string[]>(["settings"]);
149
+
150
+ const toggleSection = (id: string) => {
151
+ setOpenSections((prev) =>
152
+ prev.includes(id) ? prev.filter((s) => s !== id) : [...prev, id]
153
+ );
154
+ };
155
+
156
+ <div className="space-y-2">
157
+ <Collapsible
158
+ open={openSections.includes("settings")}
159
+ onOpenChange={() => toggleSection("settings")}
160
+ >
161
+ <CollapsibleTrigger className="flex w-full items-center gap-2 p-3 rounded-lg hover:bg-muted">
162
+ <SettingsIcon className="h-4 w-4" />
163
+ <span className="flex-1 font-medium">Settings</span>
164
+ <ChevronDownIcon
165
+ className={`h-4 w-4 transition-transform ${
166
+ openSections.includes("settings") ? "rotate-180" : ""
167
+ }`}
168
+ />
169
+ </CollapsibleTrigger>
170
+ <CollapsibleContent className="ml-6 space-y-1">
171
+ <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
172
+ Profile
173
+ </a>
174
+ <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
175
+ Security
176
+ </a>
177
+ </CollapsibleContent>
178
+ </Collapsible>
179
+
180
+ <Collapsible
181
+ open={openSections.includes("account")}
182
+ onOpenChange={() => toggleSection("account")}
183
+ >
184
+ <CollapsibleTrigger className="flex w-full items-center gap-2 p-3 rounded-lg hover:bg-muted">
185
+ <UserIcon className="h-4 w-4" />
186
+ <span className="flex-1 font-medium">Account</span>
187
+ <ChevronDownIcon
188
+ className={`h-4 w-4 transition-transform ${
189
+ openSections.includes("account") ? "rotate-180" : ""
190
+ }`}
191
+ />
192
+ </CollapsibleTrigger>
193
+ <CollapsibleContent className="ml-6 space-y-1">
194
+ <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
195
+ Billing
196
+ </a>
197
+ <a href="#" className="block px-3 py-2 text-sm rounded hover:bg-muted">
198
+ API Keys
199
+ </a>
200
+ </CollapsibleContent>
201
+ </Collapsible>
202
+ </div>;
203
+ ```
204
+
205
+ ### Lista de Archivos
206
+
207
+ ```tsx
208
+ <Collapsible defaultOpen className="w-full space-y-2">
209
+ <CollapsibleTrigger className="w-full border p-3 rounded-lg text-left font-medium hover:bg-muted">
210
+ Recent Files
211
+ </CollapsibleTrigger>
212
+ <CollapsibleContent className="space-y-1">
213
+ <div className="border p-3 rounded text-sm">document.pdf</div>
214
+ <div className="border p-3 rounded text-sm">presentation.pptx</div>
215
+ <div className="border p-3 rounded text-sm">spreadsheet.xlsx</div>
216
+ </CollapsibleContent>
217
+ </Collapsible>
218
+ ```
219
+
220
+ ### Sección Deshabilitada
221
+
222
+ ```tsx
223
+ <Collapsible disabled>
224
+ <CollapsibleTrigger className="w-full border p-3 rounded-lg text-left font-medium opacity-50 cursor-not-allowed">
225
+ Coming Soon
226
+ </CollapsibleTrigger>
227
+ <CollapsibleContent>
228
+ <p className="p-3 text-sm text-muted-foreground">Not available yet.</p>
229
+ </CollapsibleContent>
230
+ </Collapsible>
231
+ ```
232
+
233
+ ### Con Layout de Tarjeta
234
+
235
+ ```tsx
236
+ <Collapsible className="border rounded-lg p-4">
237
+ <div className="flex items-center justify-between mb-2">
238
+ <h4 className="font-semibold">@user starred 3 repos</h4>
239
+ <CollapsibleTrigger asChild>
240
+ <Button variant="outline" size="sm">
241
+ <ChevronsUpDownIcon />
242
+ </Button>
243
+ </CollapsibleTrigger>
244
+ </div>
245
+
246
+ <div className="border px-4 py-2 rounded font-mono text-sm">
247
+ @radix-ui/primitives
248
+ </div>
249
+
250
+ <CollapsibleContent className="mt-2 space-y-2">
251
+ <div className="border px-4 py-2 rounded font-mono text-sm">
252
+ @radix-ui/colors
253
+ </div>
254
+ <div className="border px-4 py-2 rounded font-mono text-sm">
255
+ @stitches/react
256
+ </div>
257
+ </CollapsibleContent>
258
+ </Collapsible>
259
+ ```
260
+
261
+ ## Casos de Uso Comunes
262
+
263
+ **FAQ sections**: Lista de preguntas frecuentes expandibles
264
+ **Navigation menus**: Menús colapsables con subsecciones
265
+ **Details/Summary**: Información adicional opcional
266
+ **File browsers**: Estructuras de carpetas expandibles
267
+ **Settings panels**: Grupos de configuraciones organizadas
268
+ **Table rows**: Filas de tabla con detalles expandibles
269
+
270
+ ## Estilos y Animaciones
271
+
272
+ ### Data States
273
+
274
+ - **Abierto**: `data-state="open"` en todos los componentes
275
+ - **Cerrado**: `data-state="closed"` en todos los componentes
276
+ - **Disabled**: `data-disabled` cuando `disabled={true}`
277
+
278
+ ### Animación Suave
279
+
280
+ El contenido usa animaciones CSS automáticas (height, opacity) al expandir/colapsar. No requiere configuración adicional.
281
+
282
+ ### Custom Animations
283
+
284
+ ```tsx
285
+ <CollapsibleContent className="data-[state=open]:animate-slideDown data-[state=closed]:animate-slideUp">
286
+ Content with custom animations
287
+ </CollapsibleContent>
288
+ ```
289
+
290
+ ## Accesibilidad
291
+
292
+ - ✅ **Navegación teclado**: Enter/Space para toggle en trigger, Tab para navegar
293
+ - ✅ **ARIA**: `aria-expanded`, `aria-controls` automáticos en trigger
294
+ - ✅ **Screen readers**: Anuncia estado expandido/colapsado
295
+ - ✅ **Focus visible**: Trigger recibe focus del teclado
296
+ - ✅ **Disabled state**: `aria-disabled` cuando disabled
297
+
298
+ ## Notas de Implementación
299
+
300
+ - **Basado en Radix UI**: `@radix-ui/react-collapsible`
301
+ - **No tiene estilos propios**: Wrapper limpio, agrega tus propios estilos
302
+ - **Data slots**: `data-slot="collapsible"`, `data-slot="collapsible-trigger"`, `data-slot="collapsible-content"`
303
+ - **asChild pattern**: CollapsibleTrigger soporta `asChild` para usar componentes custom
304
+ - **Animaciones automáticas**: Radix maneja transiciones de height/opacity
305
+ - **forceMount**: Útil para animaciones custom o cuando necesitas el DOM montado siempre
306
+ - **Multiple instances**: Puedes tener múltiples Collapsibles independientes
307
+ - **Accordion vs Collapsible**: Usa Accordion cuando solo uno debe estar abierto, Collapsible para control independiente
308
+
309
+ ## Troubleshooting
310
+
311
+ **Animación no suave**: Radix maneja animaciones automáticamente, si no se ve suave verifica que no haya `transition` conflictivos en CSS
312
+ **Trigger no clickeable**: Verifica que esté dentro de `<Collapsible>`, no como hermano
313
+ **asChild no funciona**: Asegúrate que el child acepta props `onClick` y `aria-*`
314
+ **Content siempre visible**: Verifica que no tengas `forceMount` activado sin intención
315
+ **Estado no sincroniza**: En modo controlado, asegúrate de usar ambos `open` y `onOpenChange`
316
+
317
+ ## Referencias
318
+
319
+ - **Radix UI Collapsible**: https://www.radix-ui.com/primitives/docs/components/collapsible
320
+ - **ARIA Disclosure**: https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/