@ajuarezso/sui-design-system 0.19.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/INDEX.md +136 -0
- package/docs/sui-alert/README.md +229 -0
- package/docs/sui-app-store-badge/README.md +137 -0
- package/docs/sui-avatar/README.md +263 -0
- package/docs/sui-avatar-group/README.md +115 -0
- package/docs/sui-badge/README.md +229 -0
- package/docs/sui-banner/README.md +190 -0
- package/docs/sui-brand-logo/README.md +143 -0
- package/docs/sui-breadcrumb-item/README.md +96 -0
- package/docs/sui-breadcrumbs/README.md +122 -0
- package/docs/sui-button/README.md +209 -0
- package/docs/sui-button-group/README.md +178 -0
- package/docs/sui-button-group-item/README.md +102 -0
- package/docs/sui-card/README.md +168 -0
- package/docs/sui-chart-legend/README.md +140 -0
- package/docs/sui-chart-legend-dot/README.md +118 -0
- package/docs/sui-checkbox/README.md +147 -0
- package/docs/sui-checkbox-card/README.md +150 -0
- package/docs/sui-checkbox-label/README.md +143 -0
- package/docs/sui-circular-progress-bar/README.md +131 -0
- package/docs/sui-color-dot/README.md +112 -0
- package/docs/sui-color-picker/README.md +124 -0
- package/docs/sui-compact-avatar-group/README.md +103 -0
- package/docs/sui-compact-button/README.md +190 -0
- package/docs/sui-compact-select/README.md +127 -0
- package/docs/sui-compact-select-for-input/README.md +117 -0
- package/docs/sui-content-card/README.md +147 -0
- package/docs/sui-content-divider/README.md +124 -0
- package/docs/sui-content-label/README.md +148 -0
- package/docs/sui-counter-input/README.md +145 -0
- package/docs/sui-date-selector/README.md +98 -0
- package/docs/sui-datepicker/README.md +193 -0
- package/docs/sui-day-cell/README.md +118 -0
- package/docs/sui-day-label/README.md +81 -0
- package/docs/sui-divider/README.md +102 -0
- package/docs/sui-drawer-footer/README.md +127 -0
- package/docs/sui-drawer-header/README.md +140 -0
- package/docs/sui-emoji/README.md +138 -0
- package/docs/sui-empty-state/README.md +145 -0
- package/docs/sui-fancy-button/README.md +148 -0
- package/docs/sui-file-icon/README.md +103 -0
- package/docs/sui-file-upload/README.md +154 -0
- package/docs/sui-file-upload-card/README.md +129 -0
- package/docs/sui-flag/README.md +99 -0
- package/docs/sui-form-hint/README.md +124 -0
- package/docs/sui-form-label/README.md +148 -0
- package/docs/sui-icon/README.md +135 -0
- package/docs/sui-image-upload/README.md +200 -0
- package/docs/sui-image-upload-profile/README.md +145 -0
- package/docs/sui-inline-input/README.md +104 -0
- package/docs/sui-inline-select/README.md +101 -0
- package/docs/sui-input/README.md +244 -0
- package/docs/sui-integration-switch/README.md +142 -0
- package/docs/sui-kbd/README.md +97 -0
- package/docs/sui-key-icon/README.md +125 -0
- package/docs/sui-link-button/README.md +221 -0
- package/docs/sui-logo/README.md +152 -0
- package/docs/sui-notification/README.md +179 -0
- package/docs/sui-notification-footer/README.md +98 -0
- package/docs/sui-notification-tab-menu/README.md +112 -0
- package/docs/sui-otp-input/README.md +116 -0
- package/docs/sui-pagination/README.md +146 -0
- package/docs/sui-password-strength/README.md +99 -0
- package/docs/sui-payment-icon/README.md +98 -0
- package/docs/sui-period-range/README.md +93 -0
- package/docs/sui-popover/README.md +178 -0
- package/docs/sui-product-card/README.md +173 -0
- package/docs/sui-progress-bar/README.md +132 -0
- package/docs/sui-progress-bar-label/README.md +143 -0
- package/docs/sui-radio/README.md +134 -0
- package/docs/sui-radio-card/README.md +160 -0
- package/docs/sui-radio-label/README.md +137 -0
- package/docs/sui-rating/README.md +199 -0
- package/docs/sui-rich-editor/README.md +114 -0
- package/docs/sui-segmented-control/README.md +144 -0
- package/docs/sui-select/README.md +180 -0
- package/docs/sui-slider/README.md +143 -0
- package/docs/sui-social-button/README.md +158 -0
- package/docs/sui-status-badge/README.md +164 -0
- package/docs/sui-stepper/README.md +166 -0
- package/docs/sui-store-card/README.md +147 -0
- package/docs/sui-switch/README.md +146 -0
- package/docs/sui-switch-card/README.md +149 -0
- package/docs/sui-switch-label/README.md +139 -0
- package/docs/sui-tab-chips/README.md +185 -0
- package/docs/sui-tab-menu-horizontal/README.md +142 -0
- package/docs/sui-tab-menu-vertical/README.md +136 -0
- package/docs/sui-tag/README.md +145 -0
- package/docs/sui-tag-input/README.md +120 -0
- package/docs/sui-textarea/README.md +157 -0
- package/docs/sui-time-picker/README.md +237 -0
- package/docs/sui-toast/README.md +190 -0
- package/docs/sui-tooltip/README.md +201 -0
- package/fesm2022/ajuarezso-sui-design-system.mjs +466 -279
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +367 -72
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-switch-label
|
|
3
|
+
selector: sui-switch-label
|
|
4
|
+
resumen: Interruptor con su texto (y opcionalmente descripción, badge y link) para un ajuste que se aplica al instante
|
|
5
|
+
alternativas: [sui-switch (el interruptor solo, el texto vive en otra parte), sui-switch-card (cada ajuste es una tarjeta), sui-integration-switch (fila de integración con logo), sui-checkbox-label (se confirma después)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-switch-label
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Checkbox, Radio & Switch/Switch Label](https://sui-design-system.web.app/?path=/docs/atoms-checkbox-radio-switch-switch-label--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para cada fila de ajustes que se prende o se apaga: «Disponible para pedir», «Recibir
|
|
15
|
+
pedidos», «Un uso por cliente», «Permitir analítica de uso». Es el default de una lista de
|
|
16
|
+
ajustes: toda la fila se toca y el texto queda alineado con el interruptor.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- Un ajuste que merece tarjeta (borde, ícono, más contexto): `sui-switch-card`.
|
|
21
|
+
- Una integración con logo y botón de administrar: `sui-integration-switch`.
|
|
22
|
+
- Algo que se confirma después con «Guardar» y no tiene efecto propio: `sui-checkbox-label`.
|
|
23
|
+
- Algo destructivo o que no se deshace.
|
|
24
|
+
|
|
25
|
+
Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · sin texto → sui-switch.**
|
|
26
|
+
|
|
27
|
+
## Qué variante usar
|
|
28
|
+
|
|
29
|
+
> **La guía del DS dice para qué es el switch** («prender o apagar un ajuste de forma inmediata»)
|
|
30
|
+
> y su ejemplo avanzado arma Label + (Sublabel) + badge «NEW» + descripción + Link Button, con el
|
|
31
|
+
> interruptor a la izquierda o a la derecha. No dice cuándo va cada lado.
|
|
32
|
+
>
|
|
33
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
34
|
+
> **5 usos en 4 archivos**, todos con `description`. Desde el 03-10-2026, 3 con `flip` (los
|
|
35
|
+
> ajustes del producto en `add-product-modal` y la analítica de `privacidad`) y 2 sin él porque
|
|
36
|
+
> viven dentro de un formulario (el horario de una categoría en `products`, «Cerrar por hoy» en
|
|
37
|
+
> `central-inicio`). Tamaños: 2 `ctrlSize()`
|
|
38
|
+
> (`large`/`xlarge`), 1 `xlarge` fijo, 2 sin `size` (`medium`). Hay **19 `sui-switch` con el texto
|
|
39
|
+
> armado a mano** y 1 nativo que deberían ser este componente.
|
|
40
|
+
|
|
41
|
+
### Las piezas
|
|
42
|
+
|
|
43
|
+
| prop | cuándo | fuente |
|
|
44
|
+
|---|---|---|
|
|
45
|
+
| `label` | Siempre. Qué hace prenderlo, sin cambiar con el estado: «Recibir pedidos», no «Abierto/Cerrado». | según la guía del DS (pieza); la regla de qué dice es propuesta (precedente en `pages/schedule/schedule.html:31`) |
|
|
46
|
+
| `description` | Cuando conviene decir la consecuencia: «Los clientes pueden agregarlo al carrito. Apágalo si se te acabó.» Es lo que ya hacen los 5 usos. | según la guía del DS (pieza); el «cuándo» ya es práctica de la app |
|
|
47
|
+
| `sublabel` | Precisión corta entre paréntesis: «(beta)». | según la guía del DS |
|
|
48
|
+
| `badge` | Solo novedad. Con string sale naranja `light`: pasa el objeto. | según la guía del DS (pieza «NEW»); el color es propuesta |
|
|
49
|
+
| `link` | «Saber más» que no toca el interruptor. Solo se ve con `description`. | según la guía del DS |
|
|
50
|
+
| `flip` | Interruptor a la **derecha** en listas de ajustes: el texto se lee primero y el control queda bajo el pulgar, como en iOS y Android (es lo que hacen a mano `drivers.html:58`, `discounts.html:198`, `schedule.html:46`). Sin `flip` (izquierda) dentro de un formulario, alineado con las casillas o los switches del resto del form. | canon (aprobado por el dueño, 03-10-2026) |
|
|
51
|
+
| `disabled` | Mientras se guarda el cambio o cuando no aplica. | según la guía del DS |
|
|
52
|
+
|
|
53
|
+
### `size`
|
|
54
|
+
|
|
55
|
+
| size | cuándo | fuente |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| `xlarge` | Mobile, vía `bp.controlSize()`; y cuando el ajuste es la acción principal de la pantalla («Cerrar por hoy» en Central). | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
|
|
58
|
+
| `large` | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
59
|
+
| `medium` (default) | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
|
|
60
|
+
|
|
61
|
+
**Usos de hoy que rompen las reglas:**
|
|
62
|
+
|
|
63
|
+
- **2 en `medium`:** `pages/products/products.html:300` («Horario propio
|
|
64
|
+
para esta categoría») y `pages/public/privacidad/privacidad.html:132` («Permitir analítica de uso»).
|
|
65
|
+
- **19 `sui-switch` con texto a mano + 1 nativo** que deberían ser este componente: el detalle
|
|
66
|
+
está en el README de `sui-switch`. Ejemplos: `pages/discounts/discounts.html:198`,
|
|
67
|
+
`pages/drivers/drivers.html:58`, `components/settings-panel/settings-panel.html:97`.
|
|
68
|
+
|
|
69
|
+
## Tamaño en mobile y en web
|
|
70
|
+
|
|
71
|
+
| uso | mobile | web |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| fila de ajustes | `xlarge` (48 × 28) | `large` (40 × 24) |
|
|
74
|
+
| ajuste que es la acción principal de la pantalla («Cerrar por hoy») | `xlarge` | `xlarge` |
|
|
75
|
+
|
|
76
|
+
```html
|
|
77
|
+
<sui-switch-label [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
El bloque entero se toca, así que con descripción la fila pasa los 44 px sola. Sin descripción,
|
|
81
|
+
dale a la fila un alto mínimo de 44 px.
|
|
82
|
+
|
|
83
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
84
|
+
|
|
85
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `badge` (0 usos) | ningún ajuste es nuevo | un ajuste recién agregado en una pantalla que el usuario ya conoce |
|
|
88
|
+
| `link` (0 usos) | ningún ajuste necesita más detalle | «Permitir analítica de uso» con «Qué se mide» (con `description`) |
|
|
89
|
+
| `size="medium"` | se pierde en el teléfono | una tabla densa solo de desktop |
|
|
90
|
+
|
|
91
|
+
## API
|
|
92
|
+
|
|
93
|
+
<!-- api:inicio -->
|
|
94
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
95
|
+
|
|
96
|
+
| input | tipo | default |
|
|
97
|
+
|---|---|---|
|
|
98
|
+
| `label` | `string` | `''` |
|
|
99
|
+
| `sublabel` | `string \| null` | `null` |
|
|
100
|
+
| `description` | `string \| null` | `null` |
|
|
101
|
+
| `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
102
|
+
| `badge` | `SuiBadgeConfig \| string \| null` | `null` |
|
|
103
|
+
| `link` | `SuiLinkConfig \| string \| null` | `null` |
|
|
104
|
+
| `flip` | `boolean` | `false` |
|
|
105
|
+
| `disabled` | `boolean` | `false` |
|
|
106
|
+
| `active` | `boolean` | `false` |
|
|
107
|
+
|
|
108
|
+
| output | payload |
|
|
109
|
+
|---|---|
|
|
110
|
+
| `activeChange` | `boolean` |
|
|
111
|
+
| `linkClick` | `MouseEvent` |
|
|
112
|
+
<!-- api:fin -->
|
|
113
|
+
|
|
114
|
+
Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
|
|
115
|
+
|
|
116
|
+
## Trampas
|
|
117
|
+
|
|
118
|
+
- **El estado se llama `active` / `activeChange`**, no `checked` como en `sui-switch`.
|
|
119
|
+
- **Es controlado**, como `sui-switch`: sin `[(active)]` o `(activeChange)` el toque no se ve.
|
|
120
|
+
- **El host es `inline-flex`.** Con `flip`, para que el interruptor quede pegado al borde derecho
|
|
121
|
+
de la fila, dale `display: flex` (o `width: 100%`) desde afuera.
|
|
122
|
+
- **`link` solo se dibuja con `description`.**
|
|
123
|
+
- `description` sube el label a peso medio y abre el bloque en columna.
|
|
124
|
+
- Deshabilitado baja todo el bloque a 0.5 de opacidad **además** del gris propio del switch.
|
|
125
|
+
- El badge con string sale naranja; en `sui-switch-card` el default es azul.
|
|
126
|
+
- `flip` usa CSS `order`: el orden de lectura no cambia.
|
|
127
|
+
|
|
128
|
+
## Ejemplo
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<sui-switch-label
|
|
132
|
+
[size]="bp.controlSize()"
|
|
133
|
+
[flip]="true"
|
|
134
|
+
label="Recibir pedidos"
|
|
135
|
+
description="Desactívalo para cerrar un rato sin tocar el horario."
|
|
136
|
+
[active]="abierto()"
|
|
137
|
+
[disabled]="guardando()"
|
|
138
|
+
(activeChange)="cambiarAbierto($event)" />
|
|
139
|
+
```
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-tab-chips
|
|
3
|
+
selector: sui-tab-chips
|
|
4
|
+
resumen: Fila de chips que se desliza en horizontal para filtrar una lista o saltar entre categorías; siempre hay uno elegido
|
|
5
|
+
alternativas: [sui-segmented-control (2 a 4 modos de la misma vista), sui-tab-menu-horizontal (secciones de contenido distinto), sui-radio-card (elegir un valor de un formulario), sui-tag (chip que se quita)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-tab-chips
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Tabs/Tab Chips](https://sui-design-system.web.app/?path=/docs/molecules-tabs-tab-chips--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para:
|
|
15
|
+
|
|
16
|
+
- **Filtrar una lista** por estado, período, rol o zona: «Todos · Activos · Entregados · Cancelados»,
|
|
17
|
+
«Hoy · 7 días · 30 días», los meses de la central.
|
|
18
|
+
- **Saltar entre categorías** de un catálogo que viene de la base («Hamburguesas · Pizzas ·
|
|
19
|
+
Bebidas»), con `sticky` en la carta del local.
|
|
20
|
+
|
|
21
|
+
Sirve cuando las opciones son muchas, cambian según los datos o no caben y tienen que deslizarse.
|
|
22
|
+
|
|
23
|
+
**No lo uses** para:
|
|
24
|
+
|
|
25
|
+
- **2 a 4 modos de la misma vista** (por semana / día vs día): `sui-segmented-control`.
|
|
26
|
+
- **Secciones de contenido distinto** (Ventas · Productos · Repartidores): `sui-tab-menu-horizontal`.
|
|
27
|
+
- **Elegir un valor que se guarda** con un botón (radio de visibilidad, motivo de rechazo,
|
|
28
|
+
sumar o descontar): `sui-radio-card` o `sui-segmented-control`. El tab-chips **siempre tiene uno
|
|
29
|
+
elegido** y no puede quedar vacío (ver Trampas).
|
|
30
|
+
- Un chip que la persona quita: `sui-tag`.
|
|
31
|
+
|
|
32
|
+
Regla corta (la misma del README de `sui-segmented-control`, 03-10-2026): **2-4 modos de la misma
|
|
33
|
+
vista → segmented · secciones → tab menu · filtros o categorías → tab-chips.**
|
|
34
|
+
|
|
35
|
+
## Qué variante usar
|
|
36
|
+
|
|
37
|
+
> **La guía del DS no tiene este componente**: es una extensión de SUI (la «cat nav» de las apps de
|
|
38
|
+
> delivery). Todo lo que sigue es propuesta salvo lo marcado como canon.
|
|
39
|
+
>
|
|
40
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin `master-preview`, `master-prototipos`,
|
|
41
|
+
> `mockup-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`):
|
|
42
|
+
> **41 usos en 28 archivos `.html`**. `[sticky]="true"`: 1 (carta del local). `count`: 5 listas.
|
|
43
|
+
> `[(value)]`: 2; el resto `[value]` + `(valueChange)`. `autoScroll`: 0. `size`: 0 (no existe en
|
|
44
|
+
> la versión publicada).
|
|
45
|
+
|
|
46
|
+
### Para qué se usa (el contenido de los chips)
|
|
47
|
+
|
|
48
|
+
| caso | cuándo | ejemplo real de la app | fuente |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| filtro de estado | La lista es la misma; los chips la recortan. «Todos» va primero y es el elegido por defecto. | `pages/envios/envios.html:98` («Todos · Activos · Entregados · Cancelados») · `pages/orders/orders.html:64` | propuesta, falta aprobación |
|
|
51
|
+
| filtro de período | Rango de fechas de un reporte o gráfico. | `pages/super-admin/master-earnings/master-earnings.html:11` · `pages/central/central-gastos/central-gastos.html:10` (meses) | propuesta, falta aprobación |
|
|
52
|
+
| categorías del catálogo | Saltar a una categoría de la carta; con `sticky` y `autoScroll`. | `pages/customer/restaurant-menu/restaurant-menu.html:226` | propuesta, falta aprobación |
|
|
53
|
+
| sugerencias rápidas | **No.** Un motivo frecuente que completa un texto no es una selección: el chip elige el primero solo. Si se usa, el primer chip es el neutro («Otro motivo») y el texto lleva su propio signal. | `pages/super-admin/master-orders/master-orders.html:898` (bien resuelto) | propuesta, falta aprobación |
|
|
54
|
+
|
|
55
|
+
### `sticky`
|
|
56
|
+
|
|
57
|
+
| valor | cuándo | fuente |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `false` (default) | Filtros arriba de una lista corta o dentro de un modal o sheet. | propuesta, falta aprobación |
|
|
60
|
+
| `true` | Solo la navegación de categorías de una lista larga que scrollea (la carta). Se pega arriba del contenedor de scroll y, pegado, pinta fondo `bg-weak-50`. | propuesta, falta aprobación |
|
|
61
|
+
|
|
62
|
+
### `autoScroll`
|
|
63
|
+
|
|
64
|
+
| valor | cuándo | fuente |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `true` (default) | Siempre: centra el chip elegido cuando cambia `value` (también si lo cambia el scroll de la carta). | propuesta, falta aprobación |
|
|
67
|
+
| `false` | Solo si el `value` cambia muy seguido por código y el movimiento distrae. Hoy ningún caso. | propuesta, falta aprobación |
|
|
68
|
+
|
|
69
|
+
### Ítems (`chips`)
|
|
70
|
+
|
|
71
|
+
| qué | cuándo | fuente |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| `string[]` | Cuando el texto es el valor (meses, provincias). | propuesta, falta aprobación |
|
|
74
|
+
| `{ value, label }` | Cuando el valor es un id o una clave en inglés (`'active'` → «Activos»). | propuesta, falta aprobación |
|
|
75
|
+
| `count` | El número de ítems detrás del filtro, cuando ayuda a decidir («Recargas 3»). `0` o `undefined` no se dibuja. **El número va en `count`, no dentro del `label`.** | propuesta, falta aprobación |
|
|
76
|
+
| texto | Una o dos palabras, sentence case, sin punto. Plural si filtra («Activos»). | canon (copy de `docs/CANON-SUI.md`) |
|
|
77
|
+
|
|
78
|
+
**Usos de hoy que rompen las reglas:**
|
|
79
|
+
|
|
80
|
+
- **3 con un bug real: el motivo escrito a mano rebota al primer chip.** En los modales de rechazo
|
|
81
|
+
del super admin, los chips y el textarea comparten el mismo signal. Cada tecla deja un texto que
|
|
82
|
+
no es ningún chip; el componente vuelve al primero y lo emite, así que el textarea se reescribe con
|
|
83
|
+
«El comprobante no se lee». No se puede escribir un motivo propio, y al abrir el modal ya hay un
|
|
84
|
+
motivo elegido sin que nadie lo toque. `pages/super-admin/master-drivers/master-drivers.html:652`,
|
|
85
|
+
`:924` y `:1002`. Es el mismo bug que se arregló en `master-orders` el 01-09-2026 (signal propio
|
|
86
|
+
para los chips y «Otro motivo» primero).
|
|
87
|
+
- **4 son secciones de contenido distinto** (→ `sui-tab-menu-horizontal` en web; en mobile, a
|
|
88
|
+
discutir porque el tab menu no se desliza, ver su README): `pages/products/products.html:6`
|
|
89
|
+
(«Categorías · Productos · Secciones reutilizables»), `pages/promociones/promociones.html:7`
|
|
90
|
+
(«Carrusel pagado · Push notifications»), `pages/super-admin/master-drivers/master-drivers.html:16`,
|
|
91
|
+
`pages/reports/reports.html:98` («Ventas · Productos · Repartidores · Clientes»).
|
|
92
|
+
- **2 son modos de la misma vista** (→ `sui-segmented-control`):
|
|
93
|
+
`pages/super-admin/master-semanas/master-semanas.html:67` (3 métricas del mismo gráfico) y `:72`
|
|
94
|
+
(«Por semana · Día vs día»).
|
|
95
|
+
- **4 eligen un valor de un formulario** (→ `sui-radio-card` o `sui-segmented-control`):
|
|
96
|
+
`components/option-sections-manager/option-sections-manager.html:175` (a qué se aplica),
|
|
97
|
+
`pages/super-admin/master-drivers/master-drivers.html:98` («Sumar · Descontar»),
|
|
98
|
+
`pages/mi-negocio/mi-negocio.html:938` (radio de visibilidad) y `:973` (tiempo para confirmar).
|
|
99
|
+
A discutir: `pages/customer/checkout/checkout.html:468` (día del pedido programado), que filtra
|
|
100
|
+
las franjas de abajo y se parece más a un filtro.
|
|
101
|
+
- **1 con el número dentro del texto:** `pages/notifications/notifications.ts:191`
|
|
102
|
+
(`No leídas (3)` → `count: 3`).
|
|
103
|
+
- **41 sin tamaño por plataforma** (el input todavía no está publicado): cuando se publique, los de
|
|
104
|
+
pantallas del cliente y del repartidor pasan a `large`.
|
|
105
|
+
|
|
106
|
+
## Tamaño en mobile y en web
|
|
107
|
+
|
|
108
|
+
> `size` está **en el repo del DS (03-10-2026) y no en la versión publicada 0.19.0**. Hasta que se
|
|
109
|
+
> publique, todos miden lo de `medium`.
|
|
110
|
+
|
|
111
|
+
Alto del chip: `small` 32 px · `medium` 36 px (el de siempre, default) · `large` 40 px. Los tres
|
|
112
|
+
con texto de 14 px; cambia el alto y el aire lateral. El scroller suma 12 px arriba y abajo.
|
|
113
|
+
|
|
114
|
+
| uso | mobile | web | fuente |
|
|
115
|
+
|---|---|---|---|
|
|
116
|
+
| filtros y categorías | `large` (40; con el aire del scroller llega a 44+ de área táctil) | `medium` | canon (dueño: tamaño por plataforma, 03-10-2026) |
|
|
117
|
+
| filtros densos en la cabecera de una tabla | — | `small` | propuesta, falta aprobación |
|
|
118
|
+
|
|
119
|
+
```html
|
|
120
|
+
<sui-tab-chips [chips]="filtros" [(value)]="filtro" [size]="bp.isMobile() ? 'large' : 'medium'" />
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
124
|
+
|
|
125
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| `autoScroll` en `false` | ningún caso cambia el valor tan seguido como para que moleste | una vista que sincroniza el chip con un scroll muy rápido y el movimiento distrae |
|
|
128
|
+
| `sticky` fuera de la carta | en una lista corta tapa contenido sin ayudar | otra lista larga por categorías (un catálogo de bodega con muchas secciones) |
|
|
129
|
+
| `small` en mobile | 32 px no llega al dedo | nunca en mobile |
|
|
130
|
+
|
|
131
|
+
## API
|
|
132
|
+
|
|
133
|
+
<!-- api:inicio -->
|
|
134
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
135
|
+
|
|
136
|
+
| input | tipo | default |
|
|
137
|
+
|---|---|---|
|
|
138
|
+
| `chips` | `readonly (string \| SuiTabChipItem)[]` | — (requerido) |
|
|
139
|
+
| `value` · model, `[(value)]` | `string` | `''` |
|
|
140
|
+
| `sticky` | `boolean` | `false` |
|
|
141
|
+
| `size` | `'small' \| 'medium' \| 'large'` | `'medium'` |
|
|
142
|
+
| `autoScroll` | `boolean` | `true` |
|
|
143
|
+
|
|
144
|
+
Outputs: ninguno.
|
|
145
|
+
<!-- api:fin -->
|
|
146
|
+
|
|
147
|
+
```ts
|
|
148
|
+
interface SuiTabChipItem {
|
|
149
|
+
value: string;
|
|
150
|
+
label: string;
|
|
151
|
+
count?: number; // 0 o undefined no se dibuja
|
|
152
|
+
}
|
|
153
|
+
type SuiTabChipsSize = 'small' | 'medium' | 'large'; // repo del DS, no en 0.19.0
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Trampas
|
|
157
|
+
|
|
158
|
+
- **Siempre hay uno elegido.** Si `value` está vacío o no coincide con ningún chip, el componente
|
|
159
|
+
elige el **primero y lo emite** por `valueChange`. No existe «ninguno». Si el valor también lo
|
|
160
|
+
escribe otro control (un textarea), cada tecla rebota al primer chip: usa un signal propio para
|
|
161
|
+
los chips.
|
|
162
|
+
- **`value` es `string`.** Para números (km, minutos) hay que convertir en los dos sentidos
|
|
163
|
+
(`radioEfectivo() + ''` y `+$event`).
|
|
164
|
+
- **Lleva `role="tablist"`** aunque se use como filtro: el lector de pantalla lo anuncia como pestañas.
|
|
165
|
+
- **No tiene padding lateral propio**: lo pone la pantalla. Sí trae 12 px arriba y abajo.
|
|
166
|
+
- **`sticky` cambia el host a `display: contents`**: las clases que le pongas al host dejan de
|
|
167
|
+
pintar caja (márgenes, anchos). Pon el estilo en un contenedor.
|
|
168
|
+
- **Pegado, el fondo es `bg-weak-50`**: sobre una página blanca se nota la franja gris.
|
|
169
|
+
Con `sticky` el sentinel agrega 16 px arriba.
|
|
170
|
+
- **`count` en 0 no se dibuja**: no sirve para decir «0 pendientes».
|
|
171
|
+
- **El chip activo es oscuro** (`bg-strong-950`), no naranja: es el estilo del componente, no se
|
|
172
|
+
cambia por pantalla.
|
|
173
|
+
|
|
174
|
+
## Ejemplo
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<!-- Filtro de estado: «Todos» primero -->
|
|
178
|
+
<sui-tab-chips
|
|
179
|
+
[chips]="[{ value: 'todos', label: 'Todos' }, { value: 'activos', label: 'Activos' },
|
|
180
|
+
{ value: 'entregados', label: 'Entregados' }, { value: 'cancelados', label: 'Cancelados' }]"
|
|
181
|
+
[(value)]="filtro" />
|
|
182
|
+
|
|
183
|
+
<!-- Categorías de la carta -->
|
|
184
|
+
<sui-tab-chips [chips]="categorias()" [value]="categoria()" (valueChange)="irA($event)" [sticky]="true" />
|
|
185
|
+
```
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-tab-menu-horizontal
|
|
3
|
+
selector: sui-tab-menu-horizontal
|
|
4
|
+
resumen: Pestañas subrayadas para cambiar entre secciones de contenido distinto dentro de una pantalla
|
|
5
|
+
alternativas: [sui-tab-chips (filtros o categorías que se deslizan), sui-segmented-control (2 a 4 modos de la misma vista), sui-tab-menu-vertical (menú lateral de ajustes en web)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-tab-menu-horizontal
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Tabs/Tab Menu Horizontal](https://sui-design-system.web.app/?path=/docs/molecules-tabs-tab-menu-horizontal--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para cambiar entre **secciones de contenido distinto** de la misma pantalla o detalle:
|
|
15
|
+
«Opiniones · Información» en el modal del local, «Ventas · Productos · Repartidores · Clientes» en
|
|
16
|
+
reportes. Cada pestaña muestra otra cosa, no la misma lista recortada.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **Filtrar una lista** o saltar entre categorías: `sui-tab-chips`.
|
|
21
|
+
- **2 a 4 modos de la misma vista** (cuadrícula o lista): `sui-segmented-control`.
|
|
22
|
+
- **Secciones que no entran a lo ancho en mobile** (4 con nombres largos o con `number`, o 5+): el
|
|
23
|
+
componente no se desliza y las pestañas se salen de la pantalla (ver Trampas). Ahí, por ahora,
|
|
24
|
+
`sui-tab-chips`.
|
|
25
|
+
- Un menú lateral de ajustes en web: `sui-tab-menu-vertical`.
|
|
26
|
+
|
|
27
|
+
Regla corta (README de `sui-segmented-control`, 03-10-2026): **2-4 modos de la misma vista →
|
|
28
|
+
segmented · secciones → tab menu · filtros → tab-chips.**
|
|
29
|
+
|
|
30
|
+
## Qué variante usar
|
|
31
|
+
|
|
32
|
+
> **Lo que dice la guía del DS**: es un layout lineal para **cambiar entre secciones o categorías**.
|
|
33
|
+
> Muestra un ejemplo con pestañas que **desbordan y se deslizan**, y su pestaña mide 48 px de alto
|
|
34
|
+
> (toda la franja es tocable). No trae do/don't ni tamaños.
|
|
35
|
+
>
|
|
36
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
37
|
+
> **1 uso**: `components/store-ratings-modal/store-ratings-modal.html:43` («Opiniones ·
|
|
38
|
+
> Información»), sin `size`, sin ícono, sin `number`.
|
|
39
|
+
|
|
40
|
+
### Ítems (`tabs`)
|
|
41
|
+
|
|
42
|
+
| qué | cuándo | fuente |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| texto | Lo normal: el nombre de la sección, una o dos palabras. | según la guía del DS (ejemplos con texto) |
|
|
45
|
+
| `icon` | Solo si **todas** las pestañas llevan ícono y ayuda a reconocerlas. Nunca en una sola. | propuesta, falta aprobación |
|
|
46
|
+
| `number` | Pendientes **que piden acción** dentro de esa sección («Solicitudes 3»). Es un círculo rojo: no lo uses para totales neutros. | propuesta, falta aprobación |
|
|
47
|
+
| `rightIcon` | No: la flecha dice «te lleva a otra pantalla» y una pestaña no navega. | propuesta, falta aprobación |
|
|
48
|
+
| `disabled` | Una sección que existe pero no aplica todavía (depende del plan). | propuesta, falta aprobación |
|
|
49
|
+
|
|
50
|
+
### `size`
|
|
51
|
+
|
|
52
|
+
| size | cuándo | fuente |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `medium` (default) | El único que cambia algo: **ninguno**. El input existe pero no tiene estilos; los cuatro valores se ven igual. No lo pases. | según el código (`sui-tab-menu-horizontal.scss`: no hay reglas por tamaño) |
|
|
55
|
+
| `small` · `large` · `xlarge` | No usar: no hacen nada. | según el código |
|
|
56
|
+
|
|
57
|
+
**Usos de hoy que rompen las reglas:**
|
|
58
|
+
|
|
59
|
+
- **0** en este componente. Los casos que deberían ser tab menu y hoy son `sui-tab-chips` están en el
|
|
60
|
+
README de `sui-tab-chips` (4: `pages/products/products.html:6`, `pages/promociones/promociones.html:7`,
|
|
61
|
+
`pages/super-admin/master-drivers/master-drivers.html:16`, `pages/reports/reports.html:98`).
|
|
62
|
+
- **A verificar en mobile:** el uso actual es del modal del local, que el cliente abre en el
|
|
63
|
+
teléfono. La pestaña mide 20 px de alto tocable (ver Tamaño).
|
|
64
|
+
|
|
65
|
+
## Tamaño en mobile y en web
|
|
66
|
+
|
|
67
|
+
Cada pestaña ocupa **todo el alto de la franja**, así que lo tocable es la franja entera (desde
|
|
68
|
+
03-10-2026; antes eran solo los 20 px del texto). El `size` cambia ese alto y el texto:
|
|
69
|
+
|
|
70
|
+
| size | franja tocable (+ 2 de bordes) | texto | ícono | gap | fuente |
|
|
71
|
+
|---|---|---|---|---|---|
|
|
72
|
+
| `small` | 40 | `label-sm` 14/20 | 20 | 20 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
|
|
73
|
+
| `medium` (default) | 48 | `label-sm` 14/20 | 20 | 24 | Figma |
|
|
74
|
+
| `large` | 52 | `label-md` 16/24 | 20 | 24 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
|
|
75
|
+
| `xlarge` | 56 | `label-md` 16/24 | 24 | 28 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
|
|
76
|
+
|
|
77
|
+
| uso | mobile | web | fuente |
|
|
78
|
+
|---|---|---|---|
|
|
79
|
+
| 2-3 secciones | `large` (52, texto 16) | `medium` (48) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
|
|
80
|
+
| 4+ secciones | si no entran a 390 px, se salen sin poder deslizarse (las 4 del panel de repartidores, con sus números, ya no entran a 360): va `sui-tab-chips` | el mismo | según el código |
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<sui-tab-menu-horizontal [tabs]="secciones" [(active)]="seccion" [size]="bp.isMobile() ? 'large' : 'medium'" />
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
87
|
+
|
|
88
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `rightIcon` | una pestaña no lleva a otra pantalla | nunca en pestañas; es del tab menu vertical cuando cada ítem abre una página |
|
|
91
|
+
| `icon` | ningún caso de hoy lo necesita | secciones con ícono reconocible en las tres (Mapa · Lista · Fotos) en web |
|
|
92
|
+
| `number` | ninguna sección del único uso tiene pendientes | «Solicitudes» o «Recargas» del panel de repartidores, si se pasa a tab menu |
|
|
93
|
+
| `disabled` | ninguna sección bloqueada | una sección que depende del plan («Reportes» en plan básico) |
|
|
94
|
+
|
|
95
|
+
## API
|
|
96
|
+
|
|
97
|
+
<!-- api:inicio -->
|
|
98
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
99
|
+
|
|
100
|
+
| input | tipo | default |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| `tabs` | `SuiTabMenuHorizontalItem<T>[]` | — (requerido) |
|
|
103
|
+
| `active` · model, `[(active)]` | `T` | `undefined` |
|
|
104
|
+
| `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
105
|
+
|
|
106
|
+
| output | payload |
|
|
107
|
+
|---|---|
|
|
108
|
+
| `tabChange` | `T` |
|
|
109
|
+
<!-- api:fin -->
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
interface SuiTabMenuHorizontalItem<T = string> {
|
|
113
|
+
value: T;
|
|
114
|
+
label: string;
|
|
115
|
+
icon?: string; // RemixIcon, 20 px
|
|
116
|
+
rightIcon?: boolean; // flecha en píldora
|
|
117
|
+
number?: number; // círculo rojo; 0/undefined no se dibuja
|
|
118
|
+
disabled?: boolean;
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Trampas
|
|
123
|
+
|
|
124
|
+
- **Sin `active` no se marca ninguna pestaña.** Pásale siempre un valor inicial.
|
|
125
|
+
- **No se desliza.** El track no tiene `overflow-x`: con muchas pestañas en un ancho chico se salen
|
|
126
|
+
del contenedor. La guía del DS sí lo resuelve; SUI todavía no.
|
|
127
|
+
- **El área tocable es toda la franja** (40–56 según `size`), desde 03-10-2026: el aire de 14 px
|
|
128
|
+
que Figma pone en el contenedor ahora va dentro de cada pestaña. Si algo de afuera le pone
|
|
129
|
+
padding al `.sui-tab-menu-horizontal__track`, la franja crece al doble.
|
|
130
|
+
- **Emite dos veces**: `tabChange` y `activeChange`. Con `[(active)]` no hace falta `(tabChange)`.
|
|
131
|
+
- **Trae bordes arriba y abajo** (`stroke-soft-200`) y fondo blanco: no lo metas en una card que ya
|
|
132
|
+
tiene borde, o quedan dos líneas.
|
|
133
|
+
- El ícono de la pestaña activa es `strong-950`, no naranja; en el tab menu vertical es naranja.
|
|
134
|
+
Es a propósito.
|
|
135
|
+
|
|
136
|
+
## Ejemplo
|
|
137
|
+
|
|
138
|
+
```html
|
|
139
|
+
<sui-tab-menu-horizontal
|
|
140
|
+
[tabs]="[{ value: 'opiniones', label: 'Opiniones' }, { value: 'info', label: 'Información' }]"
|
|
141
|
+
[(active)]="tab" />
|
|
142
|
+
```
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-tab-menu-vertical
|
|
3
|
+
selector: sui-tab-menu-vertical
|
|
4
|
+
resumen: Menú apilado para cambiar entre secciones de una página de ajustes en web
|
|
5
|
+
alternativas: [sui-tab-menu-horizontal (pocas secciones arriba del contenido), sui-sidebar (navegación de toda la app), sui-tab-chips (filtros o categorías)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-tab-menu-vertical
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Tabs/Tab Menu Vertical](https://sui-design-system.web.app/?path=/docs/molecules-tabs-tab-menu-vertical--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** en **web** para una página con varias secciones que se leen de a una, con el menú a la
|
|
15
|
+
izquierda y el contenido a la derecha: los ajustes del local («Datos del local · Horario · Métodos
|
|
16
|
+
de pago · Repartidores»), el perfil del super admin.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **Mobile**: el ítem mide 36 px y ocupa el ancho de la pantalla dejando el contenido debajo. En
|
|
21
|
+
mobile cada sección es una fila de una lista que abre su propia pantalla.
|
|
22
|
+
- La navegación de toda la app: `sui-sidebar`.
|
|
23
|
+
- 2 a 4 secciones arriba del contenido: `sui-tab-menu-horizontal`.
|
|
24
|
+
- Filtros de una lista: `sui-tab-chips`.
|
|
25
|
+
|
|
26
|
+
Regla corta: **secciones de una página de ajustes en web → tab menu vertical · en mobile → lista de
|
|
27
|
+
filas que abren pantalla.**
|
|
28
|
+
|
|
29
|
+
## Qué variante usar
|
|
30
|
+
|
|
31
|
+
> **Lo que dice la guía del DS**: es un layout apilado para **cambiar entre secciones o categorías**.
|
|
32
|
+
> Sus ejemplos son ajustes («Profile Settings · Contact Information · Social Links · Export Data»),
|
|
33
|
+
> uno con **título arriba** (en SUI, `dividerLabel`) y otro con **contenedor con estilo** (en SUI,
|
|
34
|
+
> `menuStyle="card"`). No trae do/don't.
|
|
35
|
+
>
|
|
36
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`): **0 usos**.
|
|
37
|
+
|
|
38
|
+
### `menuStyle`
|
|
39
|
+
|
|
40
|
+
| valor | cuándo | fuente |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `card` | El menú flota junto al contenido sobre un fondo gris (`bg-weak-50`): el borde y la sombra lo separan. | según la guía del DS (ejemplo «contenedor con estilo»); el cuándo es propuesta |
|
|
43
|
+
| `list` | El menú vive dentro de una columna que ya tiene fondo o borde propio (una card, un panel). | según la guía del DS (ejemplo base); el cuándo es propuesta |
|
|
44
|
+
|
|
45
|
+
### `dividerLabel`
|
|
46
|
+
|
|
47
|
+
| valor | cuándo | fuente |
|
|
48
|
+
|---|---|---|
|
|
49
|
+
| vacío (default) | Un solo grupo de secciones. | propuesta, falta aprobación |
|
|
50
|
+
| texto | Nombra el grupo cuando hay más de un menú apilado («Tu local» · «Tu cuenta»). Sale en MAYÚSCULAS y gris. | según la guía del DS (ejemplo con título) |
|
|
51
|
+
|
|
52
|
+
### Ítems (`tabs`)
|
|
53
|
+
|
|
54
|
+
| qué | cuándo | fuente |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| texto | El nombre de la sección. Una o dos palabras; si es más largo, se corta con «…». | según la guía del DS (ejemplos con texto) |
|
|
57
|
+
| `icon` | Sí, en todos los ítems: en un menú lateral el ícono ayuda a encontrar rápido. El activo se pinta naranja. | propuesta, falta aprobación |
|
|
58
|
+
| `number` | Pendientes que piden acción en esa sección (círculo rojo). | propuesta, falta aprobación |
|
|
59
|
+
| `rightIcon` | Cuando el ítem lleva a otra página en vez de cambiar el panel de al lado. | propuesta, falta aprobación |
|
|
60
|
+
| `disabled` | Una sección que depende del plan. | propuesta, falta aprobación |
|
|
61
|
+
|
|
62
|
+
Usos de hoy que rompen las reglas: **0** (no se usa).
|
|
63
|
+
|
|
64
|
+
## Tamaño en mobile y en web
|
|
65
|
+
|
|
66
|
+
Ítem de **36 px** (8 + 20 + 8), ícono de 20. **No tiene `size`** y no tiene tamaño para mobile.
|
|
67
|
+
|
|
68
|
+
| uso | mobile | web | fuente |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| secciones de ajustes | no se usa: lista de filas que abren pantalla | `tab-menu-vertical` | propuesta, falta aprobación |
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
@if (!bp.isMobile()) {
|
|
74
|
+
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" menuStyle="card" />
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
79
|
+
|
|
80
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| el componente entero | ninguna pantalla de la app tiene hoy un menú lateral de secciones | una página de ajustes en web con 5+ secciones (ajustes del local en desktop) |
|
|
83
|
+
| en mobile | 36 px y sin lugar para el contenido al lado | nunca |
|
|
84
|
+
| `rightIcon` | ningún menú mezcla paneles y páginas | un ítem «Facturación» que sale a otra página mientras el resto cambia el panel |
|
|
85
|
+
|
|
86
|
+
## API
|
|
87
|
+
|
|
88
|
+
<!-- api:inicio -->
|
|
89
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
90
|
+
|
|
91
|
+
| input | tipo | default |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| `tabs` | `SuiTabMenuVerticalItem<T>[]` | — (requerido) |
|
|
94
|
+
| `active` · model, `[(active)]` | `T` | `undefined` |
|
|
95
|
+
| `menuStyle` | `'card' \| 'list'` | `'card'` |
|
|
96
|
+
| `dividerLabel` | `string` | `''` |
|
|
97
|
+
|
|
98
|
+
| output | payload |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `tabChange` | `T` |
|
|
101
|
+
<!-- api:fin -->
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
interface SuiTabMenuVerticalItem<T = string> {
|
|
105
|
+
value: T;
|
|
106
|
+
label: string;
|
|
107
|
+
icon?: string; // RemixIcon, 20 px
|
|
108
|
+
rightIcon?: boolean; // flecha en píldora con sombra
|
|
109
|
+
number?: number; // círculo rojo; 0/undefined no se dibuja
|
|
110
|
+
disabled?: boolean;
|
|
111
|
+
}
|
|
112
|
+
type SuiTabMenuVerticalStyle = 'card' | 'list';
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Trampas
|
|
116
|
+
|
|
117
|
+
- **El estilo se llama `menuStyle`**, no `style` ni `variant` (ni `verticalStyle`, que era el nombre
|
|
118
|
+
viejo de `sui-tabs`).
|
|
119
|
+
- **Sin `active` no se marca ningún ítem.** Pásale un valor inicial.
|
|
120
|
+
- **Ocupa el ancho del padre**: dale un ancho fijo a la columna (240-280 px).
|
|
121
|
+
- **El ícono activo es naranja** (`primary-base`); en el tab menu horizontal es negro. Es a propósito.
|
|
122
|
+
- **Emite dos veces**: `tabChange` y `activeChange`.
|
|
123
|
+
- `role="tablist"`: si cada ítem navega a una ruta, el lector de pantalla lo anuncia mal; para
|
|
124
|
+
navegación entre rutas, `sui-sidebar`.
|
|
125
|
+
|
|
126
|
+
## Ejemplo
|
|
127
|
+
|
|
128
|
+
```html
|
|
129
|
+
<sui-tab-menu-vertical
|
|
130
|
+
menuStyle="card"
|
|
131
|
+
dividerLabel="Tu local"
|
|
132
|
+
[tabs]="[{ value: 'datos', label: 'Datos del local', icon: 'store-2-line' },
|
|
133
|
+
{ value: 'horario', label: 'Horario', icon: 'time-line' },
|
|
134
|
+
{ value: 'pagos', label: 'Métodos de pago', icon: 'bank-card-line' }]"
|
|
135
|
+
[(active)]="seccion" />
|
|
136
|
+
```
|