@adamosuiteservices/ui 1.2.5 → 1.3.5
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/dist/accordion-rounded.cjs +1 -1
- package/dist/accordion-rounded.js +1 -1
- package/dist/accordion.cjs +1 -1
- package/dist/accordion.js +1 -1
- package/dist/avatar.cjs +1 -1
- package/dist/avatar.js +1 -1
- package/dist/badge.cjs +1 -1
- package/dist/badge.js +1 -1
- package/dist/breadcrumb.cjs +1 -0
- package/dist/breadcrumb.js +105 -0
- package/dist/{button-C1n6snOY.js → button-2GdKenQI.js} +1 -1
- package/dist/{button-BV-_FVKZ.cjs → button-DEQVHMrX.cjs} +1 -1
- package/dist/button-group.cjs +1 -1
- package/dist/button-group.js +2 -2
- package/dist/button.cjs +1 -1
- package/dist/button.js +1 -1
- package/dist/calendar.cjs +1 -1
- package/dist/calendar.js +1 -1
- package/dist/{checkbox-BrmXPKTn.js → checkbox-Dr487kAg.js} +3 -3
- package/dist/{checkbox-Lq-HvSgc.cjs → checkbox-YWAnswaW.cjs} +1 -1
- package/dist/checkbox.cjs +1 -1
- package/dist/checkbox.js +1 -1
- package/dist/collapsible.cjs +1 -1
- package/dist/collapsible.js +1 -1
- package/dist/combobox.cjs +1 -1
- package/dist/combobox.js +6 -6
- package/dist/components/ui/breadcrumb/breadcrumb.d.ts +11 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.d.ts +26 -0
- package/dist/components/ui/breadcrumb/index.d.ts +1 -0
- package/dist/components/ui/dialog/dialog.d.ts +2 -1
- package/dist/context-menu.cjs +1 -1
- package/dist/context-menu.js +2 -2
- package/dist/custom-layered-styles.css +1 -1
- package/dist/dialog.cjs +1 -1
- package/dist/dialog.js +33 -19
- package/dist/dropdown-menu.cjs +1 -1
- package/dist/dropdown-menu.js +3 -3
- package/dist/ellipsis-CryjZKZn.js +15 -0
- package/dist/ellipsis-Ct9VTDOG.cjs +6 -0
- package/dist/field.cjs +1 -1
- package/dist/field.js +2 -2
- package/dist/hover-card.cjs +1 -1
- package/dist/hover-card.js +6 -6
- package/dist/{index-CAOY367Y.js → index-B0M7VOwp.js} +2 -2
- package/dist/{index-B-ZRqW0J.js → index-BBoIAjAs.js} +3 -3
- package/dist/{index-gO_QEiaK.cjs → index-BDs8lUfq.cjs} +1 -1
- package/dist/index-BFyr34mw.cjs +5 -0
- package/dist/index-BMWt1NBG.js +79 -0
- package/dist/{index-yR-v1A4G.js → index-BX9hz-JD.js} +1 -1
- package/dist/{index-BGiGvaq8.cjs → index-BcGMAmWE.cjs} +1 -1
- package/dist/{index-IKJMQref.cjs → index-Bd0gQB0k.cjs} +1 -1
- package/dist/{index-VIUqZjyP.cjs → index-BeWgla7c.cjs} +1 -1
- package/dist/{index-EUea2gfp.js → index-BpWB3aFK.js} +1 -1
- package/dist/index-BvLQnI56.js +59 -0
- package/dist/{index-CwUFT-GQ.js → index-C0YiLSjW.js} +4 -4
- package/dist/{index-o0sNTcKe.js → index-CBjZooac.js} +2 -2
- package/dist/{index-DnS_sBBe.cjs → index-COuvjZLM.cjs} +1 -1
- package/dist/index-CTjlbbt9.cjs +1 -0
- package/dist/index-CUWMxxKG.js +97 -0
- package/dist/{index-C329e3yQ.js → index-CZZ3llmi.js} +2 -2
- package/dist/index-CjyiloO7.cjs +1 -0
- package/dist/{index-D3wSWKST.cjs → index-Cmx9M9cZ.cjs} +1 -1
- package/dist/index-CocSS1YK.cjs +1 -0
- package/dist/index-CzRiuk60.cjs +1 -0
- package/dist/index-DFPDUUq7.js +658 -0
- package/dist/{index-D3S7dBDI.cjs → index-DIwmXz1u.cjs} +1 -1
- package/dist/index-DLcqcWxM.js +29 -0
- package/dist/index-DMLQL2aG.js +286 -0
- package/dist/{index-DXQ-7kNJ.cjs → index-DMs8RL3E.cjs} +1 -1
- package/dist/{index-Ce3QBKyj.cjs → index-Dbj9vHNq.cjs} +1 -1
- package/dist/{index-BRLtxFFr.cjs → index-DmGzwG2z.cjs} +1 -1
- package/dist/{index-P1sVIHE3.js → index-PYkEXTqJ.js} +1 -1
- package/dist/{index-DulPG3F9.js → index-Se4vRnIO.js} +3 -3
- package/dist/index-_XxjJPRD.cjs +1 -0
- package/dist/{index-B-cHTKrs.js → index-yWvyIlmA.js} +4 -4
- package/dist/input-group.cjs +1 -1
- package/dist/input-group.js +1 -1
- package/dist/{label-Cne2J57f.cjs → label-BjXORCBM.cjs} +1 -1
- package/dist/{label-Ky8qBEC3.js → label-CmwGvhy1.js} +1 -1
- package/dist/label.cjs +1 -1
- package/dist/label.js +1 -1
- package/dist/pagination.cjs +1 -6
- package/dist/pagination.js +58 -69
- package/dist/popover-3rIoNCXs.js +306 -0
- package/dist/popover-FCKBtFo-.cjs +1 -0
- package/dist/popover.cjs +1 -1
- package/dist/popover.js +1 -1
- package/dist/progress.cjs +1 -1
- package/dist/progress.js +1 -1
- package/dist/radio-group.cjs +1 -1
- package/dist/radio-group.js +5 -5
- package/dist/select.cjs +2 -2
- package/dist/select.js +585 -542
- package/dist/{separator-CGnu_jIu.cjs → separator-BaZqZZ9R.cjs} +1 -1
- package/dist/{separator-BH73A90k.js → separator-DR7lQjv9.js} +1 -1
- package/dist/separator.cjs +1 -1
- package/dist/separator.js +1 -1
- package/dist/{sheet-CcxnJ6LH.cjs → sheet-CU-sFSaJ.cjs} +1 -1
- package/dist/{sheet-_DVpQIVF.js → sheet-UZWAbdXr.js} +1 -1
- package/dist/sheet.cjs +1 -1
- package/dist/sheet.js +1 -1
- package/dist/sidebar.cjs +1 -1
- package/dist/sidebar.js +4 -4
- package/dist/slider.cjs +1 -1
- package/dist/slider.js +3 -3
- package/dist/styles.css +1 -1
- package/dist/switch.cjs +1 -1
- package/dist/switch.js +2 -2
- package/dist/tabs-underline.cjs +1 -1
- package/dist/tabs-underline.js +1 -1
- package/dist/tabs.cjs +1 -1
- package/dist/tabs.js +1 -1
- package/dist/toaster.cjs +1 -1
- package/dist/toaster.js +1 -1
- package/dist/toggle.cjs +1 -1
- package/dist/toggle.js +1 -1
- package/dist/tooltip.cjs +1 -1
- package/dist/tooltip.js +114 -108
- package/dist/typography.cjs +1 -1
- package/dist/typography.js +1 -1
- package/docs/AI-GUIDE.md +321 -0
- package/docs/components/layout/sidebar.md +330 -0
- package/docs/components/layout/toaster.md +436 -0
- package/docs/components/ui/accordion-rounded.md +583 -0
- package/docs/components/ui/accordion.md +267 -0
- package/docs/components/ui/alert.md +671 -0
- package/docs/components/ui/avatar.md +588 -0
- package/docs/components/ui/badge.md +1024 -0
- package/docs/components/ui/breadcrumb.md +614 -0
- package/docs/components/ui/button-group.md +1002 -0
- package/docs/components/ui/button.md +1078 -0
- package/docs/components/ui/calendar.md +1159 -0
- package/docs/components/ui/card.md +1265 -0
- package/docs/components/ui/checkbox.md +292 -0
- package/docs/components/ui/collapsible.md +320 -0
- package/docs/components/ui/combobox.md +328 -0
- package/docs/components/ui/command.md +454 -0
- package/docs/components/ui/context-menu.md +540 -0
- package/docs/components/ui/dialog.md +628 -0
- package/docs/components/ui/dropdown-menu.md +731 -0
- package/docs/components/ui/field.md +706 -0
- package/docs/components/ui/hover-card.md +446 -0
- package/docs/components/ui/input-group.md +509 -0
- package/docs/components/ui/input.md +362 -0
- package/docs/components/ui/kbd.md +434 -0
- package/docs/components/ui/label.md +359 -0
- package/docs/components/ui/pagination.md +650 -0
- package/docs/components/ui/popover.md +536 -0
- package/docs/components/ui/progress.md +182 -0
- package/docs/components/ui/radio-group.md +311 -0
- package/docs/components/ui/select.md +352 -0
- package/docs/components/ui/separator.md +214 -0
- package/docs/components/ui/sheet.md +142 -0
- package/docs/components/ui/skeleton.md +140 -0
- package/docs/components/ui/slider.md +341 -0
- package/docs/components/ui/spinner.md +170 -0
- package/docs/components/ui/switch.md +402 -0
- package/docs/components/ui/table.md +183 -0
- package/docs/components/ui/tabs-underline.md +106 -0
- package/docs/components/ui/tabs.md +122 -0
- package/docs/components/ui/textarea.md +243 -0
- package/docs/components/ui/toggle.md +243 -0
- package/docs/components/ui/tooltip.md +320 -0
- package/docs/components/ui/typography.md +191 -0
- package/package.json +11 -5
- package/dist/index-6oTEokEx.js +0 -82
- package/dist/index-B-NyefE0.js +0 -243
- package/dist/index-BKbK2GzY.cjs +0 -1
- package/dist/index-BMitW9UR.cjs +0 -1
- package/dist/index-BpvjJ_T6.cjs +0 -5
- package/dist/index-C5wjudc-.js +0 -36
- package/dist/index-CezwiPd_.js +0 -615
- package/dist/index-D02K8KOB.js +0 -54
- package/dist/index-D7hQvndv.cjs +0 -1
- package/dist/index-DQvx1rG_.cjs +0 -1
- package/dist/popover-BjdTqaB8.cjs +0 -1
- package/dist/popover-EnVfE0YA.js +0 -263
|
@@ -0,0 +1,614 @@
|
|
|
1
|
+
# Breadcrumb Component
|
|
2
|
+
|
|
3
|
+
## Descripción
|
|
4
|
+
|
|
5
|
+
Componente de navegación que muestra la **ubicación actual del usuario dentro de una jerarquía navegacional**. Ayuda a los usuarios a comprender su posición en el sitio y navegar fácilmente a páginas superiores. Incluye soporte para separadores personalizables, iconos, elipsis para rutas largas, y menús desplegables para navegación colapsada.
|
|
6
|
+
|
|
7
|
+
## Características
|
|
8
|
+
|
|
9
|
+
- ✅ Estructura semántica con `<nav>` y `<ol>`
|
|
10
|
+
- ✅ Separadores personalizables (chevron por defecto)
|
|
11
|
+
- ✅ Soporte para iconos en cada nivel
|
|
12
|
+
- ✅ Elipsis para indicar elementos colapsados
|
|
13
|
+
- ✅ Integración con Dropdown Menu para rutas largas
|
|
14
|
+
- ✅ Prop `asChild` para componentes de link personalizados (React Router, Next.js)
|
|
15
|
+
- ✅ Responsive y adaptable a móviles
|
|
16
|
+
- ✅ Accesibilidad completa (aria-label, aria-current, role)
|
|
17
|
+
- ✅ Dark mode automático
|
|
18
|
+
- ✅ Estilos con transiciones suaves
|
|
19
|
+
|
|
20
|
+
## Importación
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import {
|
|
24
|
+
Breadcrumb,
|
|
25
|
+
BreadcrumbList,
|
|
26
|
+
BreadcrumbItem,
|
|
27
|
+
BreadcrumbLink,
|
|
28
|
+
BreadcrumbPage,
|
|
29
|
+
BreadcrumbSeparator,
|
|
30
|
+
BreadcrumbEllipsis,
|
|
31
|
+
} from "@adamosuiteservices/ui/breadcrumb";
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Uso Básico
|
|
35
|
+
|
|
36
|
+
### Breadcrumb Simple
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
<Breadcrumb>
|
|
40
|
+
<BreadcrumbList>
|
|
41
|
+
<BreadcrumbItem>
|
|
42
|
+
<BreadcrumbLink href="/">Home</BreadcrumbLink>
|
|
43
|
+
</BreadcrumbItem>
|
|
44
|
+
<BreadcrumbSeparator />
|
|
45
|
+
<BreadcrumbItem>
|
|
46
|
+
<BreadcrumbLink href="/docs">Docs</BreadcrumbLink>
|
|
47
|
+
</BreadcrumbItem>
|
|
48
|
+
<BreadcrumbSeparator />
|
|
49
|
+
<BreadcrumbItem>
|
|
50
|
+
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
|
|
51
|
+
</BreadcrumbItem>
|
|
52
|
+
</BreadcrumbList>
|
|
53
|
+
</Breadcrumb>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Con Iconos
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
import { HomeIcon, FolderIcon, FileIcon } from "lucide-react";
|
|
60
|
+
|
|
61
|
+
<Breadcrumb>
|
|
62
|
+
<BreadcrumbList>
|
|
63
|
+
<BreadcrumbItem>
|
|
64
|
+
<HomeIcon className="h-4 w-4" />
|
|
65
|
+
<BreadcrumbLink href="/">Home</BreadcrumbLink>
|
|
66
|
+
</BreadcrumbItem>
|
|
67
|
+
<BreadcrumbSeparator />
|
|
68
|
+
<BreadcrumbItem>
|
|
69
|
+
<FolderIcon className="h-4 w-4" />
|
|
70
|
+
<BreadcrumbLink href="/projects">Projects</BreadcrumbLink>
|
|
71
|
+
</BreadcrumbItem>
|
|
72
|
+
<BreadcrumbSeparator />
|
|
73
|
+
<BreadcrumbItem>
|
|
74
|
+
<FileIcon className="h-4 w-4" />
|
|
75
|
+
<BreadcrumbPage>Document.pdf</BreadcrumbPage>
|
|
76
|
+
</BreadcrumbItem>
|
|
77
|
+
</BreadcrumbList>
|
|
78
|
+
</Breadcrumb>;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
**Nota**: Los iconos mejoran el reconocimiento visual de diferentes tipos de páginas.
|
|
82
|
+
|
|
83
|
+
### Con React Router / Next.js Link
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
import { Link } from "react-router-dom";
|
|
87
|
+
|
|
88
|
+
<Breadcrumb>
|
|
89
|
+
<BreadcrumbList>
|
|
90
|
+
<BreadcrumbItem>
|
|
91
|
+
<BreadcrumbLink asChild>
|
|
92
|
+
<Link to="/">Home</Link>
|
|
93
|
+
</BreadcrumbLink>
|
|
94
|
+
</BreadcrumbItem>
|
|
95
|
+
<BreadcrumbSeparator />
|
|
96
|
+
<BreadcrumbItem>
|
|
97
|
+
<BreadcrumbPage>Settings</BreadcrumbPage>
|
|
98
|
+
</BreadcrumbItem>
|
|
99
|
+
</BreadcrumbList>
|
|
100
|
+
</Breadcrumb>;
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Uso de asChild**: Permite usar componentes de navegación personalizados mientras mantiene los estilos del breadcrumb.
|
|
104
|
+
|
|
105
|
+
## Componentes
|
|
106
|
+
|
|
107
|
+
### Breadcrumb
|
|
108
|
+
|
|
109
|
+
Contenedor principal del breadcrumb. Se renderiza como `<nav>` con `aria-label="breadcrumb"`.
|
|
110
|
+
|
|
111
|
+
```tsx
|
|
112
|
+
<Breadcrumb>
|
|
113
|
+
<BreadcrumbList>{/* items */}</BreadcrumbList>
|
|
114
|
+
</Breadcrumb>
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Props**: Hereda todas las props de `React.ComponentProps<"nav">`.
|
|
118
|
+
|
|
119
|
+
### BreadcrumbList
|
|
120
|
+
|
|
121
|
+
Lista ordenada que contiene los elementos del breadcrumb.
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
<BreadcrumbList>
|
|
125
|
+
<BreadcrumbItem>{/* ... */}</BreadcrumbItem>
|
|
126
|
+
<BreadcrumbSeparator />
|
|
127
|
+
<BreadcrumbItem>{/* ... */}</BreadcrumbItem>
|
|
128
|
+
</BreadcrumbList>
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Estilos**:
|
|
132
|
+
|
|
133
|
+
- Text: `text-muted-foreground`, `text-sm`
|
|
134
|
+
- Layout: `flex`, `flex-wrap`, `items-center`
|
|
135
|
+
- Spacing: `gap-1.5`, `sm:gap-2.5`
|
|
136
|
+
- Utility: `break-words` para texto largo
|
|
137
|
+
|
|
138
|
+
**Props**: Hereda todas las props de `React.ComponentProps<"ol">`.
|
|
139
|
+
|
|
140
|
+
### BreadcrumbItem
|
|
141
|
+
|
|
142
|
+
Elemento individual del breadcrumb (un nivel de navegación).
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
<BreadcrumbItem>
|
|
146
|
+
<BreadcrumbLink href="/docs">Docs</BreadcrumbLink>
|
|
147
|
+
</BreadcrumbItem>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Estilos**:
|
|
151
|
+
|
|
152
|
+
- Layout: `inline-flex`, `items-center`
|
|
153
|
+
- Spacing: `gap-1.5` entre icono y texto
|
|
154
|
+
|
|
155
|
+
**Props**: Hereda todas las props de `React.ComponentProps<"li">`.
|
|
156
|
+
|
|
157
|
+
### BreadcrumbLink
|
|
158
|
+
|
|
159
|
+
Link navegable dentro del breadcrumb.
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
<BreadcrumbLink href="/docs">Documentation</BreadcrumbLink>
|
|
163
|
+
|
|
164
|
+
// Con asChild
|
|
165
|
+
<BreadcrumbLink asChild>
|
|
166
|
+
<Link to="/docs">Documentation</Link>
|
|
167
|
+
</BreadcrumbLink>
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Estilos**:
|
|
171
|
+
|
|
172
|
+
- Text: `text-muted-foreground`
|
|
173
|
+
- Hover: `hover:text-foreground`
|
|
174
|
+
- Transition: `transition-colors`
|
|
175
|
+
|
|
176
|
+
**Props**:
|
|
177
|
+
|
|
178
|
+
- Hereda todas las props de `React.ComponentProps<"a">`
|
|
179
|
+
- `asChild?: boolean` - Usar Radix UI Slot para renderizar como elemento hijo
|
|
180
|
+
|
|
181
|
+
### BreadcrumbPage
|
|
182
|
+
|
|
183
|
+
Página actual (no navegable).
|
|
184
|
+
|
|
185
|
+
```tsx
|
|
186
|
+
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Estilos**:
|
|
190
|
+
|
|
191
|
+
- Text: `text-foreground`, `font-normal`
|
|
192
|
+
|
|
193
|
+
**Atributos de accesibilidad**:
|
|
194
|
+
|
|
195
|
+
- `role="link"`
|
|
196
|
+
- `aria-disabled="true"`
|
|
197
|
+
- `aria-current="page"`
|
|
198
|
+
|
|
199
|
+
**Props**: Hereda todas las props de `React.ComponentProps<"span">`.
|
|
200
|
+
|
|
201
|
+
### BreadcrumbSeparator
|
|
202
|
+
|
|
203
|
+
Separador visual entre elementos del breadcrumb.
|
|
204
|
+
|
|
205
|
+
```tsx
|
|
206
|
+
// Separador por defecto (ChevronRight)
|
|
207
|
+
<BreadcrumbSeparator />
|
|
208
|
+
|
|
209
|
+
// Separador personalizado
|
|
210
|
+
<BreadcrumbSeparator>
|
|
211
|
+
<SlashIcon />
|
|
212
|
+
</BreadcrumbSeparator>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Estilos**:
|
|
216
|
+
|
|
217
|
+
- Icon size: `[&>svg]:size-3.5` (14px)
|
|
218
|
+
|
|
219
|
+
**Atributos de accesibilidad**:
|
|
220
|
+
|
|
221
|
+
- `role="presentation"`
|
|
222
|
+
- `aria-hidden="true"`
|
|
223
|
+
|
|
224
|
+
**Props**: Hereda todas las props de `React.ComponentProps<"li">`.
|
|
225
|
+
|
|
226
|
+
### BreadcrumbEllipsis
|
|
227
|
+
|
|
228
|
+
Indicador de elementos colapsados (tres puntos).
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
<BreadcrumbEllipsis />
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**Estilos**:
|
|
235
|
+
|
|
236
|
+
- Layout: `flex`, `items-center`, `justify-center`
|
|
237
|
+
- Size: `size-9` (36x36px)
|
|
238
|
+
- Icon: `size-4` (16px MoreHorizontal)
|
|
239
|
+
|
|
240
|
+
**Incluye**:
|
|
241
|
+
|
|
242
|
+
- Icono `MoreHorizontal` de lucide-react
|
|
243
|
+
- `<span className="sr-only">More</span>` para accesibilidad
|
|
244
|
+
|
|
245
|
+
**Props**: Hereda todas las props de `React.ComponentProps<"span">`.
|
|
246
|
+
|
|
247
|
+
## Patrones de Uso
|
|
248
|
+
|
|
249
|
+
### Ruta Larga con Elipsis
|
|
250
|
+
|
|
251
|
+
Para rutas de navegación largas, usa `BreadcrumbEllipsis` para indicar elementos ocultos:
|
|
252
|
+
|
|
253
|
+
```tsx
|
|
254
|
+
<Breadcrumb>
|
|
255
|
+
<BreadcrumbList>
|
|
256
|
+
<BreadcrumbItem>
|
|
257
|
+
<BreadcrumbLink href="/">Home</BreadcrumbLink>
|
|
258
|
+
</BreadcrumbItem>
|
|
259
|
+
<BreadcrumbSeparator />
|
|
260
|
+
<BreadcrumbItem>
|
|
261
|
+
<BreadcrumbEllipsis />
|
|
262
|
+
</BreadcrumbItem>
|
|
263
|
+
<BreadcrumbSeparator />
|
|
264
|
+
<BreadcrumbItem>
|
|
265
|
+
<BreadcrumbLink href="/components">Components</BreadcrumbLink>
|
|
266
|
+
</BreadcrumbItem>
|
|
267
|
+
<BreadcrumbSeparator />
|
|
268
|
+
<BreadcrumbItem>
|
|
269
|
+
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
|
|
270
|
+
</BreadcrumbItem>
|
|
271
|
+
</BreadcrumbList>
|
|
272
|
+
</Breadcrumb>
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Ruta Larga con Dropdown
|
|
276
|
+
|
|
277
|
+
Para mejor UX en rutas largas, combina con `DropdownMenu`:
|
|
278
|
+
|
|
279
|
+
```tsx
|
|
280
|
+
import {
|
|
281
|
+
DropdownMenu,
|
|
282
|
+
DropdownMenuContent,
|
|
283
|
+
DropdownMenuItem,
|
|
284
|
+
DropdownMenuTrigger,
|
|
285
|
+
} from "@adamosuiteservices/ui/dropdown-menu";
|
|
286
|
+
|
|
287
|
+
<Breadcrumb>
|
|
288
|
+
<BreadcrumbList>
|
|
289
|
+
<BreadcrumbItem>
|
|
290
|
+
<BreadcrumbLink href="/">Home</BreadcrumbLink>
|
|
291
|
+
</BreadcrumbItem>
|
|
292
|
+
<BreadcrumbSeparator />
|
|
293
|
+
<BreadcrumbItem>
|
|
294
|
+
<DropdownMenu>
|
|
295
|
+
<DropdownMenuTrigger className="flex items-center gap-1">
|
|
296
|
+
<BreadcrumbEllipsis />
|
|
297
|
+
</DropdownMenuTrigger>
|
|
298
|
+
<DropdownMenuContent align="start">
|
|
299
|
+
<DropdownMenuItem>
|
|
300
|
+
<a href="/docs">Documentation</a>
|
|
301
|
+
</DropdownMenuItem>
|
|
302
|
+
<DropdownMenuItem>
|
|
303
|
+
<a href="/components">Components</a>
|
|
304
|
+
</DropdownMenuItem>
|
|
305
|
+
<DropdownMenuItem>
|
|
306
|
+
<a href="/themes">Themes</a>
|
|
307
|
+
</DropdownMenuItem>
|
|
308
|
+
</DropdownMenuContent>
|
|
309
|
+
</DropdownMenu>
|
|
310
|
+
</BreadcrumbItem>
|
|
311
|
+
<BreadcrumbSeparator />
|
|
312
|
+
<BreadcrumbItem>
|
|
313
|
+
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
|
|
314
|
+
</BreadcrumbItem>
|
|
315
|
+
</BreadcrumbList>
|
|
316
|
+
</Breadcrumb>;
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
### Breadcrumb Responsive
|
|
320
|
+
|
|
321
|
+
Colapsa elementos en móvil para ahorrar espacio:
|
|
322
|
+
|
|
323
|
+
```tsx
|
|
324
|
+
<Breadcrumb>
|
|
325
|
+
<BreadcrumbList>
|
|
326
|
+
<BreadcrumbItem className="hidden md:block">
|
|
327
|
+
<BreadcrumbLink href="/">Home</BreadcrumbLink>
|
|
328
|
+
</BreadcrumbItem>
|
|
329
|
+
<BreadcrumbSeparator className="hidden md:block" />
|
|
330
|
+
<BreadcrumbItem>
|
|
331
|
+
<DropdownMenu>
|
|
332
|
+
<DropdownMenuTrigger className="flex items-center gap-1 md:hidden">
|
|
333
|
+
<BreadcrumbEllipsis />
|
|
334
|
+
</DropdownMenuTrigger>
|
|
335
|
+
<DropdownMenuContent align="start">
|
|
336
|
+
<DropdownMenuItem>
|
|
337
|
+
<a href="/">Home</a>
|
|
338
|
+
</DropdownMenuItem>
|
|
339
|
+
<DropdownMenuItem>
|
|
340
|
+
<a href="/docs">Documentation</a>
|
|
341
|
+
</DropdownMenuItem>
|
|
342
|
+
</DropdownMenuContent>
|
|
343
|
+
</DropdownMenu>
|
|
344
|
+
<BreadcrumbLink href="/docs" className="hidden md:block">
|
|
345
|
+
Documentation
|
|
346
|
+
</BreadcrumbLink>
|
|
347
|
+
</BreadcrumbItem>
|
|
348
|
+
<BreadcrumbSeparator />
|
|
349
|
+
<BreadcrumbItem>
|
|
350
|
+
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
|
|
351
|
+
</BreadcrumbItem>
|
|
352
|
+
</BreadcrumbList>
|
|
353
|
+
</Breadcrumb>
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Separadores Personalizados
|
|
357
|
+
|
|
358
|
+
Usa cualquier icono o elemento como separador:
|
|
359
|
+
|
|
360
|
+
```tsx
|
|
361
|
+
import { SlashIcon, ChevronRight, ArrowRight } from "lucide-react";
|
|
362
|
+
|
|
363
|
+
// Slash
|
|
364
|
+
<BreadcrumbSeparator>
|
|
365
|
+
<SlashIcon />
|
|
366
|
+
</BreadcrumbSeparator>
|
|
367
|
+
|
|
368
|
+
// Texto
|
|
369
|
+
<BreadcrumbSeparator>
|
|
370
|
+
/
|
|
371
|
+
</BreadcrumbSeparator>
|
|
372
|
+
|
|
373
|
+
// Arrow
|
|
374
|
+
<BreadcrumbSeparator>
|
|
375
|
+
<ArrowRight />
|
|
376
|
+
</BreadcrumbSeparator>
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Casos de Uso
|
|
380
|
+
|
|
381
|
+
### E-commerce
|
|
382
|
+
|
|
383
|
+
Navegación de categorías de productos:
|
|
384
|
+
|
|
385
|
+
```tsx
|
|
386
|
+
<Breadcrumb>
|
|
387
|
+
<BreadcrumbList>
|
|
388
|
+
<BreadcrumbItem>
|
|
389
|
+
<BreadcrumbLink href="/">Home</BreadcrumbLink>
|
|
390
|
+
</BreadcrumbItem>
|
|
391
|
+
<BreadcrumbSeparator />
|
|
392
|
+
<BreadcrumbItem>
|
|
393
|
+
<BreadcrumbLink href="/products">Products</BreadcrumbLink>
|
|
394
|
+
</BreadcrumbItem>
|
|
395
|
+
<BreadcrumbSeparator />
|
|
396
|
+
<BreadcrumbItem>
|
|
397
|
+
<BreadcrumbLink href="/products/electronics">Electronics</BreadcrumbLink>
|
|
398
|
+
</BreadcrumbItem>
|
|
399
|
+
<BreadcrumbSeparator />
|
|
400
|
+
<BreadcrumbItem>
|
|
401
|
+
<BreadcrumbPage>Laptops</BreadcrumbPage>
|
|
402
|
+
</BreadcrumbItem>
|
|
403
|
+
</BreadcrumbList>
|
|
404
|
+
</Breadcrumb>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### Documentación
|
|
408
|
+
|
|
409
|
+
Navegación de documentos anidados:
|
|
410
|
+
|
|
411
|
+
```tsx
|
|
412
|
+
<Breadcrumb>
|
|
413
|
+
<BreadcrumbList>
|
|
414
|
+
<BreadcrumbItem>
|
|
415
|
+
<BreadcrumbLink href="/">Docs</BreadcrumbLink>
|
|
416
|
+
</BreadcrumbItem>
|
|
417
|
+
<BreadcrumbSeparator />
|
|
418
|
+
<BreadcrumbItem>
|
|
419
|
+
<BreadcrumbLink href="/components">Components</BreadcrumbLink>
|
|
420
|
+
</BreadcrumbItem>
|
|
421
|
+
<BreadcrumbSeparator />
|
|
422
|
+
<BreadcrumbItem>
|
|
423
|
+
<BreadcrumbLink href="/components/navigation">Navigation</BreadcrumbLink>
|
|
424
|
+
</BreadcrumbItem>
|
|
425
|
+
<BreadcrumbSeparator />
|
|
426
|
+
<BreadcrumbItem>
|
|
427
|
+
<BreadcrumbPage>Breadcrumb</BreadcrumbPage>
|
|
428
|
+
</BreadcrumbItem>
|
|
429
|
+
</BreadcrumbList>
|
|
430
|
+
</Breadcrumb>
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### Gestión de Archivos
|
|
434
|
+
|
|
435
|
+
Sistema de archivos o carpetas:
|
|
436
|
+
|
|
437
|
+
```tsx
|
|
438
|
+
import { FolderIcon, FileIcon } from "lucide-react";
|
|
439
|
+
|
|
440
|
+
<Breadcrumb>
|
|
441
|
+
<BreadcrumbList>
|
|
442
|
+
<BreadcrumbItem>
|
|
443
|
+
<BreadcrumbLink href="/files">
|
|
444
|
+
<FolderIcon className="h-4 w-4" />
|
|
445
|
+
My Files
|
|
446
|
+
</BreadcrumbLink>
|
|
447
|
+
</BreadcrumbItem>
|
|
448
|
+
<BreadcrumbSeparator />
|
|
449
|
+
<BreadcrumbItem>
|
|
450
|
+
<BreadcrumbLink href="/files/documents">
|
|
451
|
+
<FolderIcon className="h-4 w-4" />
|
|
452
|
+
Documents
|
|
453
|
+
</BreadcrumbLink>
|
|
454
|
+
</BreadcrumbItem>
|
|
455
|
+
<BreadcrumbSeparator />
|
|
456
|
+
<BreadcrumbItem>
|
|
457
|
+
<BreadcrumbPage>
|
|
458
|
+
<FileIcon className="h-4 w-4" />
|
|
459
|
+
Report.pdf
|
|
460
|
+
</BreadcrumbPage>
|
|
461
|
+
</BreadcrumbItem>
|
|
462
|
+
</BreadcrumbList>
|
|
463
|
+
</Breadcrumb>;
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
## Accesibilidad
|
|
467
|
+
|
|
468
|
+
### Estructura Semántica
|
|
469
|
+
|
|
470
|
+
- `<nav aria-label="breadcrumb">`: Identifica el breadcrumb para screen readers
|
|
471
|
+
- `<ol>`: Lista ordenada que refleja la jerarquía
|
|
472
|
+
- `<li>`: Elementos individuales del breadcrumb
|
|
473
|
+
|
|
474
|
+
### Página Actual
|
|
475
|
+
|
|
476
|
+
```tsx
|
|
477
|
+
<BreadcrumbPage>Current Page</BreadcrumbPage>
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
**Atributos**:
|
|
481
|
+
|
|
482
|
+
- `role="link"`: Indica que es un elemento de navegación
|
|
483
|
+
- `aria-disabled="true"`: No es interactivo
|
|
484
|
+
- `aria-current="page"`: Marca la página actual
|
|
485
|
+
|
|
486
|
+
### Separadores
|
|
487
|
+
|
|
488
|
+
```tsx
|
|
489
|
+
<BreadcrumbSeparator />
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
**Atributos**:
|
|
493
|
+
|
|
494
|
+
- `role="presentation"`: Decorativo, no semántico
|
|
495
|
+
- `aria-hidden="true"`: Oculto de screen readers
|
|
496
|
+
|
|
497
|
+
### Elipsis
|
|
498
|
+
|
|
499
|
+
```tsx
|
|
500
|
+
<BreadcrumbEllipsis />
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
**Incluye**:
|
|
504
|
+
|
|
505
|
+
- `<span className="sr-only">More</span>`: Texto descriptivo para screen readers
|
|
506
|
+
|
|
507
|
+
## Mejores Prácticas
|
|
508
|
+
|
|
509
|
+
### ✅ Hacer
|
|
510
|
+
|
|
511
|
+
- **Usar en navegación jerárquica**: Sitios con estructura de páginas anidadas
|
|
512
|
+
- **Mostrar ruta completa**: Incluir todos los niveles relevantes
|
|
513
|
+
- **Primera letra mayúscula**: Consistencia en nombres de páginas
|
|
514
|
+
- **Responsive**: Colapsar en móvil si hay muchos niveles
|
|
515
|
+
- **Links funcionales**: Todos los links deben navegar correctamente
|
|
516
|
+
- **Página actual no clickeable**: Usar `BreadcrumbPage` para el nivel actual
|
|
517
|
+
|
|
518
|
+
### ❌ Evitar
|
|
519
|
+
|
|
520
|
+
- **En sitios planos**: Si no hay jerarquía clara
|
|
521
|
+
- **Redundancia con navegación principal**: No duplicar menús
|
|
522
|
+
- **Demasiados niveles visibles**: Usar dropdown o elipsis para >5 niveles
|
|
523
|
+
- **Solo en desktop**: Debe funcionar en móvil
|
|
524
|
+
- **Página actual como link**: Usar `BreadcrumbPage` sin `href`
|
|
525
|
+
|
|
526
|
+
## Personalización
|
|
527
|
+
|
|
528
|
+
### Estilos Personalizados
|
|
529
|
+
|
|
530
|
+
```tsx
|
|
531
|
+
<Breadcrumb className="my-custom-breadcrumb">
|
|
532
|
+
<BreadcrumbList className="gap-4">
|
|
533
|
+
<BreadcrumbItem>
|
|
534
|
+
<BreadcrumbLink href="/" className="text-lg font-semibold">
|
|
535
|
+
Home
|
|
536
|
+
</BreadcrumbLink>
|
|
537
|
+
</BreadcrumbItem>
|
|
538
|
+
<BreadcrumbSeparator className="text-primary" />
|
|
539
|
+
<BreadcrumbItem>
|
|
540
|
+
<BreadcrumbPage className="text-lg">Current</BreadcrumbPage>
|
|
541
|
+
</BreadcrumbItem>
|
|
542
|
+
</BreadcrumbList>
|
|
543
|
+
</Breadcrumb>
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### Separador Custom
|
|
547
|
+
|
|
548
|
+
```tsx
|
|
549
|
+
<BreadcrumbSeparator className="text-primary">
|
|
550
|
+
<span>•</span>
|
|
551
|
+
</BreadcrumbSeparator>
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
### Dark Mode
|
|
555
|
+
|
|
556
|
+
Los estilos de dark mode están incluidos automáticamente:
|
|
557
|
+
|
|
558
|
+
- Links: `text-muted-foreground` → colores ajustados en dark
|
|
559
|
+
- Hover: `hover:text-foreground` → transición suave
|
|
560
|
+
- Página actual: `text-foreground` → contraste adecuado
|
|
561
|
+
|
|
562
|
+
## Data Slots
|
|
563
|
+
|
|
564
|
+
Cada componente incluye un atributo `data-slot` para facilitar el targeting con CSS:
|
|
565
|
+
|
|
566
|
+
```tsx
|
|
567
|
+
data-slot="breadcrumb" // Breadcrumb
|
|
568
|
+
data-slot="breadcrumb-list" // BreadcrumbList
|
|
569
|
+
data-slot="breadcrumb-item" // BreadcrumbItem
|
|
570
|
+
data-slot="breadcrumb-link" // BreadcrumbLink
|
|
571
|
+
data-slot="breadcrumb-page" // BreadcrumbPage
|
|
572
|
+
data-slot="breadcrumb-separator" // BreadcrumbSeparator
|
|
573
|
+
data-slot="breadcrumb-ellipsis" // BreadcrumbEllipsis
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
**Uso en CSS**:
|
|
577
|
+
|
|
578
|
+
```css
|
|
579
|
+
[data-slot="breadcrumb-link"]:hover {
|
|
580
|
+
color: var(--primary);
|
|
581
|
+
}
|
|
582
|
+
|
|
583
|
+
[data-slot="breadcrumb-separator"] {
|
|
584
|
+
color: var(--muted-foreground);
|
|
585
|
+
}
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
## TypeScript
|
|
589
|
+
|
|
590
|
+
Todos los componentes incluyen tipos completos:
|
|
591
|
+
|
|
592
|
+
```typescript
|
|
593
|
+
import type { ComponentProps } from "react";
|
|
594
|
+
|
|
595
|
+
type BreadcrumbProps = ComponentProps<"nav">;
|
|
596
|
+
type BreadcrumbListProps = ComponentProps<"ol">;
|
|
597
|
+
type BreadcrumbItemProps = ComponentProps<"li">;
|
|
598
|
+
type BreadcrumbLinkProps = ComponentProps<"a"> & { asChild?: boolean };
|
|
599
|
+
type BreadcrumbPageProps = ComponentProps<"span">;
|
|
600
|
+
type BreadcrumbSeparatorProps = ComponentProps<"li">;
|
|
601
|
+
type BreadcrumbEllipsisProps = ComponentProps<"span">;
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
## Dependencias
|
|
605
|
+
|
|
606
|
+
- **@radix-ui/react-slot**: Para el patrón `asChild`
|
|
607
|
+
- **lucide-react**: Iconos por defecto (ChevronRight, MoreHorizontal)
|
|
608
|
+
- **@src/lib/utils**: Utilidad `cn` para combinar clases
|
|
609
|
+
|
|
610
|
+
## Recursos
|
|
611
|
+
|
|
612
|
+
- [ARIA Breadcrumb Pattern](https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/)
|
|
613
|
+
- [MDN: Breadcrumb Navigation](https://developer.mozilla.org/en-US/docs/Web/CSS/Layout_cookbook/Breadcrumb_Navigation)
|
|
614
|
+
- [Nielsen Norman Group: Breadcrumb Navigation](https://www.nngroup.com/articles/breadcrumbs/)
|