@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,193 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-datepicker
|
|
3
|
+
selector: sui-datepicker
|
|
4
|
+
resumen: Calendario para elegir una fecha o un rango de fechas, en popover o en línea
|
|
5
|
+
alternativas: [sui-input type="date" (una fecha suelta en un formulario: abre el selector del sistema), sui-tab-chips + sui-radio-label (día y franja de un pedido programado), sui-tab-chips o sui-select (períodos fijos: hoy, 7 días, 30 días)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-datepicker
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Date & Time/Datepicker](https://sui-design-system.web.app/?path=/docs/molecules-date-time-datepicker--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para elegir un **rango de fechas** (desde–hasta) con presets al costado, o para mostrar
|
|
15
|
+
un **calendario en línea** donde importa ver el mes entero (días con pedidos marcados con
|
|
16
|
+
`markedDates`, días bloqueados con `min`/`max`).
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **Una fecha suelta en un formulario** («Válido hasta», «Fecha del gasto»): `sui-input type="date"`.
|
|
21
|
+
En el celular abre el selector del sistema, mide 48 px en `large` y no tapa la pantalla con un
|
|
22
|
+
popover de 368 px.
|
|
23
|
+
- **El día y la hora de un pedido programado**: el checkout ya tiene su hoja (`sui-modal-sheet`
|
|
24
|
+
con `sui-tab-chips` para el día y `sui-radio-label` con `flip` para la franja). Es la maqueta
|
|
25
|
+
aprobada.
|
|
26
|
+
- **Períodos fijos** («Hoy», «Últimos 7 días», «Este mes») sin rango libre: `sui-tab-chips`
|
|
27
|
+
(super admin, ganancias del repartidor) o `sui-select` (resumen del local).
|
|
28
|
+
- Una hora: `sui-time-picker`.
|
|
29
|
+
|
|
30
|
+
Regla corta: **rango o calendario visible → datepicker · una fecha en un formulario → `sui-input
|
|
31
|
+
type="date"` · día + franja de entrega → la hoja del checkout.**
|
|
32
|
+
|
|
33
|
+
## Qué variante usar
|
|
34
|
+
|
|
35
|
+
> **Lo que dice la guía del DS** (página del datepicker): sirve para elegir **una fecha o un rango
|
|
36
|
+
> de fechas**, y trae tres ejemplos: **Popover** (se aplica al tocar el día), **Approval** (con
|
|
37
|
+
> Cancelar/Aplicar: la fecha queda en espera hasta confirmar) y **Range** (rango con un solo mes a
|
|
38
|
+
> la vista). No dice cuándo usar cada uno. El resto es **propuesta, falta aprobación**.
|
|
39
|
+
>
|
|
40
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas): **0 usos**.
|
|
41
|
+
> Las fechas de la app van con `sui-input type="date"` (7) y `type="datetime-local"` (1).
|
|
42
|
+
|
|
43
|
+
### `mode`
|
|
44
|
+
|
|
45
|
+
| valor | cuándo | fuente |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `date` (default) | Una fecha cuando el calendario tiene que verse (en línea, con días marcados). Si es un campo de formulario, va `sui-input type="date"`. | guía (una fecha) · el «cuándo» es propuesta |
|
|
48
|
+
| `range` | Un período libre desde–hasta: reportes, filtros de ventas o de gastos con «Personalizado». | guía (rango) · el «cuándo» es propuesta |
|
|
49
|
+
|
|
50
|
+
### `inline`, `showFooter`, `calendars`
|
|
51
|
+
|
|
52
|
+
| input | valor | cuándo | fuente |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| `inline` | `false` (default) | El campo abre el calendario en un popover. Solo en web. | guía (ejemplo Popover) |
|
|
55
|
+
| `inline` | `true` | El calendario es el contenido: un panel de disponibilidad o el calendario de pedidos del día. También dentro de un `sui-modal` en mobile, para no depender del popover. | propuesta |
|
|
56
|
+
| `showFooter` | `true` (default) | Cancelar/Aplicar: la elección no se guarda hasta confirmar. Úsalo cuando cambiar la fecha recalcula algo caro (un reporte). | guía (ejemplo Approval) |
|
|
57
|
+
| `showFooter` | `false` | Se aplica al tocar el día. Fecha única y nada que recalcular. En `range` no tiene efecto: el rango siempre trae footer. | guía (ejemplo Popover) |
|
|
58
|
+
| `calendars` | `2` (default) | Rango en web: dos meses lado a lado (936 px). | propuesta |
|
|
59
|
+
| `calendars` | `1` | Rango en un espacio angosto (columna, modal `medium`). En mobile se fuerza a 1 solo. | guía (Range con un mes) |
|
|
60
|
+
|
|
61
|
+
### `min`, `max`, `markedDates`, `presets`, `placeholder`, `disabled`
|
|
62
|
+
|
|
63
|
+
| input | cuándo | fuente |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `min` / `max` | Siempre que haya un límite real: un cupón no vence en el pasado (`min` = hoy), un reporte no pasa de hoy (`max` = hoy). Los presets se recortan al límite. | propuesta |
|
|
66
|
+
| `markedDates` | Días con algo: pedidos programados, gastos cargados. El punto es chico: dice «hay algo», no cuánto. | propuesta |
|
|
67
|
+
| `presets` | Los 8 de fábrica están en español (Hoy, Últimos 7 días… Todo el tiempo). Recortarlos a los que la pantalla usa: un reporte del local no necesita «Últimos 12 meses» si no hay datos de hace un año. | propuesta |
|
|
68
|
+
| `placeholder` | Lo que se elige, no «Seleccionar fecha»: «Elige el período», «Desde cuándo». | propuesta |
|
|
69
|
+
| `disabled` | Mientras carga lo que depende de la fecha. | propuesta |
|
|
70
|
+
|
|
71
|
+
Usos de hoy que rompen la regla: **0** (no hay datepickers). Los 8 campos de fecha son fechas
|
|
72
|
+
sueltas en formularios y ya usan `sui-input`: `pages/discounts/discounts.html:181` y `:285`
|
|
73
|
+
(«Válido hasta»), `pages/super-admin/super-admin.html:323`, `:329` y `:414`,
|
|
74
|
+
`pages/super-admin/master-gastos/master-gastos.html:215`,
|
|
75
|
+
`pages/central/central-gastos/central-gastos.html:115`, y `pages/promociones/promociones.html:336`
|
|
76
|
+
(`datetime-local`, «Programar»).
|
|
77
|
+
|
|
78
|
+
**A decidir por el dueño** (la regla de arriba es la lectura plana; la contraria también se sostiene):
|
|
79
|
+
|
|
80
|
+
| opción | a favor | en contra |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| fecha suelta → `sui-input type="date"` (la propuesta) | selector del sistema, 48 px, cero código nuevo, 0 cambios en la app | se ve distinto en iOS, Android y web; no marca días |
|
|
83
|
+
| toda fecha → `sui-datepicker` | se ve igual en todos lados, con la marca | el popover de 368 px no es hoja en mobile, el trigger mide 40 px sin `size`, y los botones del footer están en inglés (ver Trampas) |
|
|
84
|
+
|
|
85
|
+
## Tamaño en mobile y en web
|
|
86
|
+
|
|
87
|
+
En mobile se toca con el dedo: lo que se toca mide **44 px o más** (40 en los botones sueltos). En
|
|
88
|
+
web, con mouse, puede ir más chico. En pantallas de los dos se elige con el servicio de breakpoints
|
|
89
|
+
de la app (`bp`, en `services/breakpoints.service.ts`).
|
|
90
|
+
|
|
91
|
+
Tiene `size` para el campo: `small` (36), `medium` (40, default, el de siempre) y **`large` (48)**,
|
|
92
|
+
el mismo alto que `sui-input` y `sui-select` `large`. Con `large` **y siempre en mobile (≤ 767
|
|
93
|
+
px)** el panel también crece: **flechas de mes de 40** y **Cancelar / Aplicar en `large` (48)**. En
|
|
94
|
+
el teléfono el footer del rango pone el resumen «Rango: …» arriba y los dos botones abajo, 50/50.
|
|
95
|
+
|
|
96
|
+
| pieza | web (`medium`) | `large` | mobile (cualquier size) | fuente |
|
|
97
|
+
|---|---|---|---|---|
|
|
98
|
+
| campo (trigger) | 40 | 48 | el del `size` | 40: medido · 36 y 48: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
99
|
+
| celda de día | 40 × 40, paso de 48 | igual | 40 × 40, paso de 44 | medido |
|
|
100
|
+
| flechas de mes | 24 | 40 | 40 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
101
|
+
| Cancelar / Aplicar | 36 | 48 | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
102
|
+
|
|
103
|
+
```html
|
|
104
|
+
<!-- Web: popover. Mobile: en línea dentro de un sui-modal fullscreen. -->
|
|
105
|
+
@if (bp.isMobile()) {
|
|
106
|
+
<sui-datepicker mode="range" size="large" [inline]="true" [calendars]="1" [(value)]="rango" />
|
|
107
|
+
} @else {
|
|
108
|
+
<sui-datepicker mode="range" placeholder="Elige el período" [(value)]="rango" />
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
| uso | mobile | web | fuente |
|
|
113
|
+
|---|---|---|---|
|
|
114
|
+
| fecha en un formulario | `large` | `medium` | propuesta, falta aprobación |
|
|
115
|
+
| filtro de período de un reporte | `large`, en línea dentro de un modal | `medium`, popover | propuesta, falta aprobación |
|
|
116
|
+
|
|
117
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
118
|
+
|
|
119
|
+
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
|
|
120
|
+
en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
|
|
121
|
+
|
|
122
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| todo el componente (0 usos) | las fechas de la app son sueltas y van con `sui-input type="date"`; los períodos son fijos | un filtro «Personalizado» en el resumen de ventas o en gastos del super admin (`mode="range"`) |
|
|
125
|
+
| `mode="date"` en un formulario | `sui-input type="date"` hace lo mismo con el selector del sistema | un calendario que se ve siempre, con días marcados (pedidos programados de la semana para el local) |
|
|
126
|
+
| `markedDates` | no hay calendarios a la vista | días con pedidos programados o con gastos cargados |
|
|
127
|
+
| `calendars="2"` en mobile | se fuerza a 1 solo | — |
|
|
128
|
+
| el popover (`inline=false`) en mobile | no es hoja: es un panel flotante de 368 px y el trigger mide 40 | ninguno en mobile; en web, cualquiera |
|
|
129
|
+
|
|
130
|
+
## API
|
|
131
|
+
|
|
132
|
+
<!-- api:inicio -->
|
|
133
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
134
|
+
|
|
135
|
+
| input | tipo | default |
|
|
136
|
+
|---|---|---|
|
|
137
|
+
| `mode` | `'date' \| 'range'` | `'date'` |
|
|
138
|
+
| `calendars` | `1 \| 2` | `2` |
|
|
139
|
+
| `inline` | `boolean` | `false` |
|
|
140
|
+
| `size` | `'small' \| 'medium' \| 'large'` | `'medium'` |
|
|
141
|
+
| `placeholder` | `string` | `'Seleccionar fecha'` |
|
|
142
|
+
| `showFooter` | `boolean` | `true` |
|
|
143
|
+
| `disabled` | `boolean` | `false` |
|
|
144
|
+
| `min` | `Date \| null` | `null` |
|
|
145
|
+
| `max` | `Date \| null` | `null` |
|
|
146
|
+
| `presets` | `DatepickerPreset[]` | `DEFAULT_PRESETS` |
|
|
147
|
+
| `markedDates` | `readonly Date[]` | `[]` |
|
|
148
|
+
| `value` · model, `[(value)]` | `Date \| SuiDateRange \| null` | `null` |
|
|
149
|
+
|
|
150
|
+
Outputs: ninguno.
|
|
151
|
+
<!-- api:fin -->
|
|
152
|
+
|
|
153
|
+
Es `ControlValueAccessor`: con `mode="date"` el valor es `Date | null`; con `mode="range"`,
|
|
154
|
+
`{ start, end }`.
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
interface SuiDateRange { start: Date | null; end: Date | null; }
|
|
158
|
+
interface DatepickerPreset { id: DatepickerPresetId; label: string; resolve: (hoy: Date) => [Date | null, Date | null]; }
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Trampas
|
|
162
|
+
|
|
163
|
+
- El footer dice «Cancelar», «Aplicar» y «Rango: 1 de oct 2026 – …» (antes venía en inglés). No
|
|
164
|
+
hay input para cambiarlos.
|
|
165
|
+
- **En mobile no es una hoja**, aunque el comentario del código lo diga: es el mismo popover
|
|
166
|
+
absoluto, de 368 px de ancho, debajo del campo. Para el celular, `inline` dentro de un modal.
|
|
167
|
+
- **`value` cambia de tipo con `mode`**: `Date` en `date`, `{ start, end }` en `range`. Al cambiar
|
|
168
|
+
el `mode` hay que resetear el valor.
|
|
169
|
+
- Con `inline`, el `[value]` de entrada se pinta marcado y el calendario abre en su mes (arreglado
|
|
170
|
+
el 03-10-2026; antes solo se copiaba al abrir el popover, que en línea nunca se abre).
|
|
171
|
+
- El mes sale con mayúscula inicial («Octubre 2026»), arreglado el 03-10-2026.
|
|
172
|
+
- **El rango siempre trae footer**, aunque `showFooter` sea `false`.
|
|
173
|
+
- **El trigger no es un `sui-input`**: no tiene `label`, `hint` ni `error` (sí `size`). El label va
|
|
174
|
+
aparte con `sui-form-label`.
|
|
175
|
+
- En mobile (hasta 767 px) **se fuerza un solo calendario** aunque `calendars` sea 2.
|
|
176
|
+
- El campo muestra la fecha como `dd/MM/yyyy`; el rango, como «1 de oct 2026 – 7 de oct 2026».
|
|
177
|
+
- «Todo el tiempo» devuelve `{ start: null, end: null }`: quien lo recibe tiene que tratarlo como
|
|
178
|
+
«sin filtro», no como «vacío».
|
|
179
|
+
- Cierra con clic afuera y con Escape, y eso **descarta** la elección (como Cancelar).
|
|
180
|
+
- Las piezas internas son `sui-date-selector`, `sui-day-label`, `sui-day-cell` y
|
|
181
|
+
`sui-period-range`: no se arman a mano.
|
|
182
|
+
|
|
183
|
+
## Ejemplo
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<!-- Filtro de ventas con rango libre (web) -->
|
|
187
|
+
<sui-form-label label="Período" />
|
|
188
|
+
<sui-datepicker mode="range" placeholder="Elige el período" [max]="hoy" [(value)]="rango" />
|
|
189
|
+
|
|
190
|
+
<!-- Calendario a la vista con los días que tienen pedidos programados -->
|
|
191
|
+
<sui-datepicker [inline]="true" [showFooter]="false" [markedDates]="diasConPedidos()"
|
|
192
|
+
[(value)]="diaElegido" />
|
|
193
|
+
```
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-day-cell
|
|
3
|
+
selector: sui-day-cell
|
|
4
|
+
resumen: Un día del calendario, con sus estados de elegido, rango, hoy, marcado y bloqueado
|
|
5
|
+
alternativas: [sui-datepicker (el calendario completo, que ya la trae), sui-tab-chips (pocos días para elegir, con nombre: hoy, mañana)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-day-cell
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Date & Time/Day Cell](https://sui-design-system.web.app/?path=/docs/molecules-date-time-day-cell--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** solo para **armar un calendario propio** que el `sui-datepicker` no cubre: una grilla
|
|
15
|
+
de la semana con los días de turno del repartidor, o un mes con los días que el local cerró.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Un calendario normal: `sui-datepicker` ya arma la grilla, las filas y la banda del rango.
|
|
20
|
+
- Elegir entre pocos días: `sui-tab-chips` (la hoja del pedido programado ya lo hace así).
|
|
21
|
+
- Mostrar una fecha como texto: un `<span>` con la fecha formateada.
|
|
22
|
+
|
|
23
|
+
## Qué variante usar
|
|
24
|
+
|
|
25
|
+
> **La guía del DS no tiene página para este componente** (vive dentro del datepicker). Todo es
|
|
26
|
+
> **propuesta, falta aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usa por dentro
|
|
29
|
+
> `sui-datepicker`.
|
|
30
|
+
|
|
31
|
+
### `type` y `rangePosition`
|
|
32
|
+
|
|
33
|
+
| valor | cuándo | fuente |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `type="basic"` (default) | Calendario de una fecha. | propuesta |
|
|
36
|
+
| `type="range"` | Calendario de rango. Va con `rangePosition`. | propuesta |
|
|
37
|
+
| `rangePosition="start"` | Primer día del rango (fondo naranja, esquina izquierda). | propuesta |
|
|
38
|
+
| `rangePosition="end"` | Último día (fondo naranja, esquina derecha). | propuesta |
|
|
39
|
+
| `rangePosition="in"` | Días del medio (texto naranja, sin fondo propio: la banda la pinta la fila). | propuesta |
|
|
40
|
+
| `rangePosition=null` | Fuera del rango. | propuesta |
|
|
41
|
+
|
|
42
|
+
### Estados
|
|
43
|
+
|
|
44
|
+
| input | cuándo | fuente |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| `selected` | El día elegido (fondo naranja). Uno solo en `basic`. | propuesta |
|
|
47
|
+
| `today` | Hoy: un punto debajo del número. Siempre, para que la persona se ubique. | propuesta |
|
|
48
|
+
| `marked` | El día tiene algo (pedidos, un turno). Si además es hoy, gana el punto de hoy. | propuesta |
|
|
49
|
+
| `disabled` | Fuera de `min`/`max` o no se puede elegir (local cerrado ese día). | propuesta |
|
|
50
|
+
| `outOfMonth` | Días del mes anterior o siguiente que completan la grilla: se ven apagados. | propuesta |
|
|
51
|
+
| `ariaLabel` | Siempre que el número solo no alcance: «Martes 7 de octubre, con pedidos». El default dice «Día 7». | propuesta |
|
|
52
|
+
|
|
53
|
+
Usos de hoy que rompen la regla: **0**.
|
|
54
|
+
|
|
55
|
+
## Tamaño en mobile y en web
|
|
56
|
+
|
|
57
|
+
**No tiene `size`.** Mide 40 × 40 fijo. En el `sui-datepicker` el paso entre celdas es de 44 px en
|
|
58
|
+
mobile (gap 4) y 48 en web (gap 8): llega justo a los 44.
|
|
59
|
+
|
|
60
|
+
| uso | mobile | web | fuente |
|
|
61
|
+
|---|---|---|---|
|
|
62
|
+
| celda de una grilla | 40 × 40 con gap 4 (paso 44) | 40 × 40 con gap 8 | medido |
|
|
63
|
+
|
|
64
|
+
```html
|
|
65
|
+
<!-- La grilla da el paso: gap 4 en mobile, 8 en web -->
|
|
66
|
+
<div class="semana" [style.gap.px]="bp.isMobile() ? 4 : 8">
|
|
67
|
+
@for (d of dias(); track d.fecha) {
|
|
68
|
+
<sui-day-cell [day]="d.numero" [today]="d.esHoy" [marked]="d.conTurno" (clicked)="elegir(d)" />
|
|
69
|
+
}
|
|
70
|
+
</div>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
74
|
+
|
|
75
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| todo el componente suelto (0 usos) | no hay calendarios propios | la semana de turnos del repartidor o el mes de cierres del local |
|
|
78
|
+
| `type="range"` suelto | el rango completo lo resuelve el datepicker, con la banda | ninguno fuera del datepicker |
|
|
79
|
+
|
|
80
|
+
## API
|
|
81
|
+
|
|
82
|
+
<!-- api:inicio -->
|
|
83
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
84
|
+
|
|
85
|
+
| input | tipo | default |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `day` | `number \| string` | — (requerido) |
|
|
88
|
+
| `type` | `'basic' \| 'range'` | `'basic'` |
|
|
89
|
+
| `rangePosition` | `'start' \| 'end' \| 'in' \| null` | `null` |
|
|
90
|
+
| `selected` | `boolean` | `false` |
|
|
91
|
+
| `marked` | `boolean` | `false` |
|
|
92
|
+
| `today` | `boolean` | `false` |
|
|
93
|
+
| `disabled` | `boolean` | `false` |
|
|
94
|
+
| `outOfMonth` | `boolean` | `false` |
|
|
95
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
96
|
+
|
|
97
|
+
| output | payload |
|
|
98
|
+
|---|---|
|
|
99
|
+
| `clicked` | `MouseEvent` |
|
|
100
|
+
<!-- api:fin -->
|
|
101
|
+
|
|
102
|
+
## Trampas
|
|
103
|
+
|
|
104
|
+
- **`day` es el número del día, no una fecha.** Toda la lógica (qué día es, si es hoy) la hace
|
|
105
|
+
quien lo usa.
|
|
106
|
+
- **La banda del rango no la pinta la celda**: en `in` solo cambia el color del texto. La franja
|
|
107
|
+
continua la dibuja la fila en el datepicker; suelta, un rango se ve como números naranjas sueltos.
|
|
108
|
+
- `today` y `marked` juntos: se ve solo el punto de hoy.
|
|
109
|
+
- `outOfMonth` no la bloquea: se puede tocar igual. Para bloquearla, `disabled`.
|
|
110
|
+
- Ya trae el arreglo de iOS para el `:active` pegado.
|
|
111
|
+
|
|
112
|
+
## Ejemplo
|
|
113
|
+
|
|
114
|
+
```html
|
|
115
|
+
<sui-day-cell day="7" [today]="true" />
|
|
116
|
+
<sui-day-cell day="9" [selected]="true" />
|
|
117
|
+
<sui-day-cell day="12" [marked]="true" ariaLabel="Domingo 12 de octubre, con pedidos" />
|
|
118
|
+
```
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-day-label
|
|
3
|
+
selector: sui-day-label
|
|
4
|
+
resumen: La inicial del día de la semana arriba de cada columna del calendario
|
|
5
|
+
alternativas: [sui-datepicker (el calendario completo, que ya la trae), sui-button-group (elegir días de la semana: L M M J V S D)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-day-label
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Date & Time/Day Label](https://sui-design-system.web.app/?path=/docs/molecules-date-time-day-label--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** solo como **cabecera de columna** de un calendario armado a mano con `sui-day-cell`.
|
|
15
|
+
|
|
16
|
+
**No lo uses** para:
|
|
17
|
+
|
|
18
|
+
- Un calendario normal: `sui-datepicker` ya pone LU, MA, MI, JU, VI, SÁ, DO.
|
|
19
|
+
- **Elegir días de la semana** (el horario del local o los turnos del repartidor): eso se toca,
|
|
20
|
+
y esto es solo texto. Va `sui-button-group` `multi`.
|
|
21
|
+
- El nombre de un día en una lista («Lunes»): texto normal.
|
|
22
|
+
|
|
23
|
+
## Qué variante usar
|
|
24
|
+
|
|
25
|
+
> **La guía del DS no tiene página para este componente** (vive dentro del datepicker). Todo es
|
|
26
|
+
> **propuesta, falta aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usa por dentro
|
|
29
|
+
> `sui-datepicker`.
|
|
30
|
+
|
|
31
|
+
| input | valor | cuándo | fuente |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| `label` | dos letras en mayúsculas | Lo normal, igual que el datepicker: `LU MA MI JU VI SÁ DO`. La semana arranca el lunes. | propuesta |
|
|
34
|
+
| `label` | una letra | No usar: «M» es martes y miércoles a la vez. | no usar |
|
|
35
|
+
| `label` | tres letras o más | No usar: «MIÉ» entra justo en 40 px, pero rompe el formato de dos letras del datepicker; «LUNES» ya no entra. | no usar |
|
|
36
|
+
|
|
37
|
+
Usos de hoy que rompen la regla: **0**.
|
|
38
|
+
|
|
39
|
+
## Tamaño en mobile y en web
|
|
40
|
+
|
|
41
|
+
**No tiene `size`.** Mide 40 × 40, igual que `sui-day-cell`, para que las columnas calcen. No se
|
|
42
|
+
toca: el tamaño solo importa para alinear.
|
|
43
|
+
|
|
44
|
+
| uso | mobile | web | fuente |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| cabecera de columna | 40 × 40 | 40 × 40 | medido |
|
|
47
|
+
|
|
48
|
+
```html
|
|
49
|
+
@for (d of ['LU','MA','MI','JU','VI','SÁ','DO']; track d) { <sui-day-label [label]="d" /> }
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
53
|
+
|
|
54
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
55
|
+
|---|---|---|
|
|
56
|
+
| todo el componente suelto (0 usos) | no hay calendarios propios | la cabecera de una semana de turnos armada con `sui-day-cell` |
|
|
57
|
+
| una letra o tres | ambiguo, o rompe el formato del datepicker | ninguno |
|
|
58
|
+
|
|
59
|
+
## API
|
|
60
|
+
|
|
61
|
+
<!-- api:inicio -->
|
|
62
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
63
|
+
|
|
64
|
+
| input | tipo | default |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `label` | `string` | — (requerido) |
|
|
67
|
+
|
|
68
|
+
Outputs: ninguno.
|
|
69
|
+
<!-- api:fin -->
|
|
70
|
+
|
|
71
|
+
## Trampas
|
|
72
|
+
|
|
73
|
+
- El host lleva `role="columnheader"`: tiene sentido dentro de un `role="grid"`; suelto, confunde
|
|
74
|
+
al lector de pantalla.
|
|
75
|
+
- Acepta cualquier texto, pero el ancho es fijo de 40 px: lo que no entra se corta.
|
|
76
|
+
|
|
77
|
+
## Ejemplo
|
|
78
|
+
|
|
79
|
+
```html
|
|
80
|
+
<sui-day-label label="LU" />
|
|
81
|
+
```
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-divider
|
|
3
|
+
selector: sui-divider
|
|
4
|
+
resumen: Línea de 1 px que separa bloques (horizontal) o datos en una fila (vertical)
|
|
5
|
+
alternativas: [sui-content-divider (línea con texto o botones encima, o el «o» entre dos opciones)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-divider
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Divider/Divider](https://sui-design-system.web.app/?path=/docs/atoms-divider-divider--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para separar con una línea:
|
|
15
|
+
|
|
16
|
+
- **horizontal**: bloques dentro de una card, filas de una lista, secciones de un formulario, el
|
|
17
|
+
subtotal del total.
|
|
18
|
+
- **vertical**: datos en una misma fila («4,7 | 25–35 min | Envío S/ 3.00»).
|
|
19
|
+
|
|
20
|
+
**No lo uses** para:
|
|
21
|
+
|
|
22
|
+
- Una línea con texto o botones encima (el «o» del login, la cabecera de un grupo):
|
|
23
|
+
`sui-content-divider`.
|
|
24
|
+
- Separar cosas que ya separa el espacio. Si el `gap` alcanza, la línea sobra.
|
|
25
|
+
- Dos acciones en texto: el canon del alert es el punto medio «·», no una línea.
|
|
26
|
+
|
|
27
|
+
**Toda línea de separación es `<sui-divider>`**, no un `<div>` con `height: 1px` y
|
|
28
|
+
`background: var(--sui-stroke-soft-200)`.
|
|
29
|
+
|
|
30
|
+
## Qué variante usar
|
|
31
|
+
|
|
32
|
+
> **La guía del DS llama «Divider» a lo que en SUI es `sui-content-divider`** (línea, línea con
|
|
33
|
+
> espacio, línea con texto, texto, texto con fondo y contenido al centro). Su variante «Line»
|
|
34
|
+
> («una línea horizontal simple», la default) es este componente. La guía no trae la vertical ni
|
|
35
|
+
> dice cuándo separar con línea y cuándo con espacio. Lo marcado «según la guía del DS» sale de
|
|
36
|
+
> ahí; el resto es **propuesta, falta aprobación**.
|
|
37
|
+
>
|
|
38
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **13 dividers en 10 pantallas**, todos
|
|
39
|
+
> horizontales, sin contar prototipos ni vitrinas (`master-preview`, `master-prototipos`,
|
|
40
|
+
> `mockup-sheets-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`,
|
|
41
|
+
> `dev-index`).
|
|
42
|
+
|
|
43
|
+
| orientation | cuándo | ejemplo real | fuente |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| `horizontal` (default) | Separa bloques o filas. El espacio arriba y abajo lo pone el `gap` del padre, no el divider. | `pages/driver/driver-dashboard/driver-dashboard.html:1124` (entre filas, `@if (!last)`) | según la guía del DS («Line») |
|
|
46
|
+
| `vertical` | Separa datos cortos en una sola fila. El padre necesita alto (si no, mide 16 px). | — (sin usos) | propuesta, falta aprobación |
|
|
47
|
+
|
|
48
|
+
**Corregido el 03-10-2026:** las 26 líneas hechas a mano (mi-negocio, checkout, carrito, billetera y movimientos) ya son `sui-divider`. Seis conservan un `margin` propio porque sus vecinos se separan con margen y no con el `gap` del padre; pasarlo al `gap` es un cambio aparte.
|
|
49
|
+
|
|
50
|
+
El «o» del login y del registro también pasó a `sui-content-divider type="text-line"`.
|
|
51
|
+
|
|
52
|
+
## No usar: por qué no hoy y cuándo sí
|
|
53
|
+
|
|
54
|
+
Nada: las dos orientaciones tienen caso. La vertical no tiene usos hoy, pero el caso existe
|
|
55
|
+
(la fila de nota, tiempo y envío de un local).
|
|
56
|
+
|
|
57
|
+
## Tamaño en mobile y en web
|
|
58
|
+
|
|
59
|
+
Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
|
|
60
|
+
(desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
|
|
61
|
+
en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
|
|
62
|
+
de la app.
|
|
63
|
+
|
|
64
|
+
**No aplica**: es 1 px en las dos plataformas. Lo que cambia por plataforma es el `gap` del padre,
|
|
65
|
+
que separa los bloques (la regla de spacing de la app: 20/16/12 según el breakpoint).
|
|
66
|
+
|
|
67
|
+
## API
|
|
68
|
+
|
|
69
|
+
<!-- api:inicio -->
|
|
70
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
71
|
+
|
|
72
|
+
| input | tipo | default |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
|
|
75
|
+
|
|
76
|
+
Outputs: ninguno.
|
|
77
|
+
<!-- api:fin -->
|
|
78
|
+
|
|
79
|
+
## Trampas
|
|
80
|
+
|
|
81
|
+
- **No tiene margen**: el espacio sale del `gap` del padre. Un divider entre dos bloques sin
|
|
82
|
+
`gap` queda pegado.
|
|
83
|
+
- **El vertical mide `height: 100%`**: dentro de un padre sin alto queda en 16 px. En un flex,
|
|
84
|
+
`align-items: center` + alto en el padre.
|
|
85
|
+
- Es `display: block` (horizontal) e `inline-block` (vertical).
|
|
86
|
+
- Lleva `role="separator"` y `aria-orientation`. Va **entre** filas (`@if (!last)`), no uno por
|
|
87
|
+
fila: el último sobra.
|
|
88
|
+
|
|
89
|
+
## Ejemplo
|
|
90
|
+
|
|
91
|
+
```html
|
|
92
|
+
<!-- Entre filas de una lista -->
|
|
93
|
+
@for (f of filas; track f.id; let last = $last) {
|
|
94
|
+
<app-fila [fila]="f" />
|
|
95
|
+
@if (!last) { <sui-divider /> }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
<!-- Datos en una fila -->
|
|
99
|
+
<div class="meta">
|
|
100
|
+
<span>4,7</span><sui-divider orientation="vertical" /><span>25–35 min</span>
|
|
101
|
+
</div>
|
|
102
|
+
```
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-drawer-footer
|
|
3
|
+
selector: sui-drawer-footer
|
|
4
|
+
resumen: Pie de un panel lateral con dos botones y un extra a la izquierda; hoy sin uso, los botones van en sui-modal-footer
|
|
5
|
+
alternativas: [sui-modal-footer (el canon de botones de toda la app), sui-filter-panel-footer (pie de un panel de filtros)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-drawer-footer
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Drawer/Drawer Footer](https://sui-design-system.web.app/?path=/docs/molecules-drawer-drawer-footer--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Hoy no se usa, y aunque aparezca el panel lateral, los botones van en `sui-modal-footer`.** El
|
|
15
|
+
canon de la app (CLAUDE.md, «Botones — composición y orden», 27-07-2026) dice que `sui-modal-footer`
|
|
16
|
+
legisla **todos** los grupos de botones, no solo los de modales. El drawer-footer pone los botones
|
|
17
|
+
en el mismo orden (secundario a la izquierda, primario a la derecha), pero le faltan dos cosas que
|
|
18
|
+
el canon exige:
|
|
19
|
+
|
|
20
|
+
- **No tiene `buttonSize`**: los botones quedan en 40 px. El canon pide `large` (48) en modales.
|
|
21
|
+
- **No admite `color: 'error'`** en el primario (lo ignora): no sirve para confirmar algo destructivo.
|
|
22
|
+
|
|
23
|
+
**No lo uses** para el pie de un modal, un sheet o un formulario: `sui-modal-footer`.
|
|
24
|
+
|
|
25
|
+
Regla corta: **cualquier par de botones → sui-modal-footer.**
|
|
26
|
+
|
|
27
|
+
## Qué variante usar
|
|
28
|
+
|
|
29
|
+
> **Lo que dice la guía del DS**: el drawer es «un panel que sale desde el borde de la pantalla» y
|
|
30
|
+
> su pie es un contenedor libre. No trae tipos ni do/don't.
|
|
31
|
+
>
|
|
32
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`): **0 usos**.
|
|
33
|
+
> `sui-modal-footer` se usa en los modales de toda la app.
|
|
34
|
+
|
|
35
|
+
### `type` — qué va a la izquierda de los botones
|
|
36
|
+
|
|
37
|
+
Cada tipo tiene su equivalente en `sui-modal-footer`, cuyo slot izquierdo admite lo mismo:
|
|
38
|
+
|
|
39
|
+
| type | qué dibuja | equivalente canon | fuente |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| `stretch` (default) | Dos botones 50/50 a todo el ancho. | `sui-modal-footer [stretch]="true"` | canon (CLAUDE.md, botones) |
|
|
42
|
+
| `basic` | Botones a la derecha. | `sui-modal-footer` | canon (CLAUDE.md, botones) |
|
|
43
|
+
| `checkbox` | Un checkbox con texto a la izquierda («No volver a mostrar»). | `sui-checkbox-label` en el slot izquierdo | canon (CLAUDE.md, botones: el slot izquierdo admite checkbox) |
|
|
44
|
+
| `toggle` | Un switch con texto a la izquierda. | `sui-switch-label` en el slot izquierdo | canon (CLAUDE.md, botones) |
|
|
45
|
+
| `stepper` | Puntos del paso actual. | `sui-stepper variant="dot"` en el slot izquierdo | canon (CLAUDE.md, botones) |
|
|
46
|
+
| `link-button` | Una tercera acción como enlace. | `sui-link-button` en el slot izquierdo | canon (CLAUDE.md, botones: la tercera acción es un link-button) |
|
|
47
|
+
|
|
48
|
+
### Botones
|
|
49
|
+
|
|
50
|
+
| input | regla | fuente |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `primaryButton` | Con el verbo de lo que hace («Guardar», «Aplicar filtros»); el default es «Continuar». | según el código |
|
|
53
|
+
| `secondaryButton` | El default es «Cancelar»; `null` para un solo botón. | según el código |
|
|
54
|
+
| `disabled` (en la config) | Primario deshabilitado mientras falta un dato. | propuesta, falta aprobación |
|
|
55
|
+
| `color` (en la config) | **No sirve**: el primario es siempre naranja. | según el código |
|
|
56
|
+
|
|
57
|
+
Usos de hoy que rompen las reglas: **0** (no se usa).
|
|
58
|
+
|
|
59
|
+
## Tamaño en mobile y en web
|
|
60
|
+
|
|
61
|
+
**No tiene tamaño**: los botones miden **40 px**, sin input para cambiarlos. En mobile el canon de
|
|
62
|
+
modales pide 48. El pie mide 80 px de alto.
|
|
63
|
+
|
|
64
|
+
| uso | mobile | web | fuente |
|
|
65
|
+
|---|---|---|---|
|
|
66
|
+
| par de botones | `sui-modal-footer` (botones `large`, 48) | `sui-modal-footer` | canon (CLAUDE.md, botones: size `large` en todos los modales) |
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<sui-modal-footer secondaryButton="Cancelar" primaryButton="Guardar" [stretch]="bp.isMobile()" … />
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
73
|
+
|
|
74
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
75
|
+
|---|---|---|
|
|
76
|
+
| el componente entero | `sui-modal-footer` hace lo mismo con tamaño 48 y color de error | ninguno mientras el modal-footer exista; si el DS suma un panel lateral, usa también modal-footer |
|
|
77
|
+
|
|
78
|
+
## API
|
|
79
|
+
|
|
80
|
+
<!-- api:inicio -->
|
|
81
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
82
|
+
|
|
83
|
+
| input | tipo | default |
|
|
84
|
+
|---|---|---|
|
|
85
|
+
| `type` | `'stretch' \| 'basic' \| 'checkbox' \| 'toggle' \| 'stepper' \| 'link-button'` | `'stretch'` |
|
|
86
|
+
| `primaryButton` | `SuiFooterButtonConfig \| string` | `'Continuar'` |
|
|
87
|
+
| `secondaryButton` | `SuiFooterButtonConfig \| string \| null` | `'Cancelar'` |
|
|
88
|
+
| `checkboxLabel` | `string` | `''` |
|
|
89
|
+
| `checkboxActive` · model, `[(checkboxActive)]` | `boolean` | `false` |
|
|
90
|
+
| `toggleLabel` | `string` | `''` |
|
|
91
|
+
| `toggleActive` · model, `[(toggleActive)]` | `boolean` | `false` |
|
|
92
|
+
| `stepper` | `{ current: number; total: number } \| null` | `null` |
|
|
93
|
+
| `link` | `SuiLinkConfig \| string \| null` | `null` |
|
|
94
|
+
|
|
95
|
+
| output | payload |
|
|
96
|
+
|---|---|
|
|
97
|
+
| `primaryClick` | `Event` |
|
|
98
|
+
| `secondaryClick` | `Event` |
|
|
99
|
+
| `linkClick` | `MouseEvent` |
|
|
100
|
+
<!-- api:fin -->
|
|
101
|
+
|
|
102
|
+
```ts
|
|
103
|
+
type SuiDrawerFooterType = 'stretch' | 'basic' | 'checkbox' | 'toggle' | 'stepper' | 'link-button';
|
|
104
|
+
interface SuiFooterButtonConfig { label: string; disabled?: boolean; color?: 'primary' | 'error'; }
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Trampas
|
|
108
|
+
|
|
109
|
+
- **Defaults en español** (desde 03-10-2026; antes «Continue» / «Cancel»): sin `primaryButton` dice
|
|
110
|
+
«Continuar» y sin `secondaryButton` dice «Cancelar». Para un solo botón pasa
|
|
111
|
+
`[secondaryButton]="null"`.
|
|
112
|
+
- **`color: 'error'` se ignora**: el primario está fijo en `primary`.
|
|
113
|
+
- **Sin tamaño**: botones de 40 px.
|
|
114
|
+
- `stepper` usa `{ current, total }` con `current` desde 0, y dibuja sus propios puntos (no es
|
|
115
|
+
`sui-stepper`).
|
|
116
|
+
- `checkboxActive` y `toggleActive` son `model`: `[(checkboxActive)]`.
|
|
117
|
+
- El borde de arriba ya viene puesto: no le sumes otro.
|
|
118
|
+
|
|
119
|
+
## Ejemplo
|
|
120
|
+
|
|
121
|
+
```html
|
|
122
|
+
<!-- Lo que va en la app -->
|
|
123
|
+
<sui-modal-footer
|
|
124
|
+
secondaryButton="Cancelar"
|
|
125
|
+
[primaryButton]="{ label: 'Guardar' }"
|
|
126
|
+
(secondaryClick)="cerrar()" (primaryClick)="guardar()" />
|
|
127
|
+
```
|