@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,154 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-file-upload
|
|
3
|
+
selector: sui-file-upload
|
|
4
|
+
resumen: Área para arrastrar o elegir archivos que no son una foto (PDF, Excel, CSV)
|
|
5
|
+
alternativas: [sui-image-upload (una sola imagen con vista previa: logo, portada, comprobante), sui-image-upload-profile (foto de perfil con botones Subir/Cambiar/Eliminar), sui-file-upload-card (el archivo ya elegido, con su progreso)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-file-upload
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Upload/File Upload](https://sui-design-system.web.app/?path=/docs/molecules-upload-file-upload--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para subir **documentos**: un PDF, un Excel, un CSV, o varios archivos a la vez. La
|
|
15
|
+
persona arrastra el archivo o toca para buscarlo.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- **Una imagen** (logo, portada, foto del producto, captura del Yape): `sui-image-upload`, que
|
|
20
|
+
muestra la vista previa y se integra con el recortador y el compresor de la app.
|
|
21
|
+
- Una foto de perfil con botones: `sui-image-upload-profile`.
|
|
22
|
+
- Mostrar el archivo que ya se eligió: va `sui-file-upload-card` debajo.
|
|
23
|
+
|
|
24
|
+
Regla corta: **foto → image-upload · documento o varios archivos → file-upload · el archivo ya
|
|
25
|
+
elegido → file-upload-card.**
|
|
26
|
+
|
|
27
|
+
## Qué variante usar
|
|
28
|
+
|
|
29
|
+
> **Lo que dice la guía del DS** (página del file upload): es la forma de **arrastrar y soltar, o
|
|
30
|
+
> buscar en el equipo**, para subir un archivo. Su ejemplo arma el texto así: una línea que invita
|
|
31
|
+
> («Elige un archivo o arrástralo aquí»), una línea con **formatos y tamaño máximo** («JPEG, PNG,
|
|
32
|
+
> PDF y MP4, hasta 50 MB») y el botón **«Buscar archivo»**. Trae aparte el ícono por tipo de
|
|
33
|
+
> archivo (en SUI, `sui-file-icon`). No dice cuándo usar cada tamaño. El resto es **propuesta,
|
|
34
|
+
> falta aprobación**.
|
|
35
|
+
>
|
|
36
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Hoy todo lo que se sube es
|
|
37
|
+
> imagen y va con `sui-image-upload` (13) o con un `<input type="file">` a mano (3: `renewal-modal`,
|
|
38
|
+
> `add-product` y la miniatura de `option-image`; ver el README de `sui-image-upload`).
|
|
39
|
+
|
|
40
|
+
### Textos: `title`, `subtitle`, `browseLabel`
|
|
41
|
+
|
|
42
|
+
| input | cuándo | fuente |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `title` | Qué se sube, en la voz de la persona: «Sube tu carta en PDF», «Arrastra tu Excel aquí». Si se omite, sale «Arrastra y suelta el archivo aquí». | guía (línea que invita) |
|
|
45
|
+
| `subtitle` | **Formatos y tamaño máximo**, siempre: «PDF o Excel, hasta 10 MB». El default «o haz clic para seleccionar» no dice nada que el área no diga. | guía (formatos y tamaño) |
|
|
46
|
+
| `browseLabel` | El default ya es «Buscar archivo»; se pasa solo para otro texto («Elegir foto»). | guía (el botón) · el texto es propuesta |
|
|
47
|
+
|
|
48
|
+
### `accept`, `multiple`, `maxSize`
|
|
49
|
+
|
|
50
|
+
| input | cuándo | fuente |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `accept` | Siempre, con lo mismo que dice el `subtitle`: `".pdf,.xlsx,.csv"`. Si el texto y el filtro no coinciden, la persona elige un archivo que se rechaza. | propuesta |
|
|
53
|
+
| `multiple` | Varios archivos del mismo tipo (las boletas del mes). Con `multiple` cada archivo va en su `sui-file-upload-card`. | propuesta |
|
|
54
|
+
| `maxSize` | Siempre, en **bytes** (`10 * 1024 * 1024`), y el mismo número en el `subtitle`. | propuesta |
|
|
55
|
+
|
|
56
|
+
### `size`
|
|
57
|
+
|
|
58
|
+
| valor | padding | cuándo | fuente |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| `small` | 24 | En mobile y dentro de un modal o una card. | propuesta |
|
|
61
|
+
| `medium` (default) | 32 | En web, en una página o un modal ancho. | guía (es el único tamaño que muestra) |
|
|
62
|
+
| `large` | 40 | Cuando subir el archivo es lo único de la pantalla (importar la carta). | propuesta |
|
|
63
|
+
| `xlarge` | 48 | No usar: más aire no ayuda a soltar el archivo. | no usar |
|
|
64
|
+
|
|
65
|
+
### Estados: `error`, `errorMessage`, `disabled`
|
|
66
|
+
|
|
67
|
+
| input | cuándo | fuente |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| `error` + `errorMessage` | El archivo se subió y el servidor lo rechazó («El PDF está protegido con clave»). Lo de tamaño y tipo ya lo avisa solo. | propuesta |
|
|
70
|
+
| `disabled` | Mientras se sube, o si ya se llegó al máximo de archivos. | propuesta |
|
|
71
|
+
|
|
72
|
+
Usos de hoy que rompen la regla: **0** (no hay file-upload).
|
|
73
|
+
|
|
74
|
+
## Tamaño en mobile y en web
|
|
75
|
+
|
|
76
|
+
En mobile se toca con el dedo: lo que se toca mide **44 px o más**. Aquí **toda el área se toca**
|
|
77
|
+
(abre el selector), así que pasa en cualquier tamaño; en el celular no se arrastra, por eso va
|
|
78
|
+
más compacta. En pantallas de los dos, con el servicio de breakpoints de la app (`bp`, en
|
|
79
|
+
`services/breakpoints.service.ts`).
|
|
80
|
+
|
|
81
|
+
| uso | mobile | web | fuente |
|
|
82
|
+
|---|---|---|---|
|
|
83
|
+
| subir un documento en un formulario o modal | `small` | `medium` | propuesta |
|
|
84
|
+
| subir es lo único de la pantalla | `medium` | `large` | propuesta |
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<sui-file-upload [size]="bp.isMobile() ? 'small' : 'medium'"
|
|
88
|
+
title="Sube tu carta en PDF" subtitle="PDF, hasta 10 MB"
|
|
89
|
+
accept=".pdf" [maxSize]="10 * 1024 * 1024" (filesSelected)="subir($event)" />
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Llena el ancho del contenedor (antes 400 fijo; extensión SUI, 03-10-2026). El botón «Buscar
|
|
93
|
+
archivo» mide 32 px (`xsmall`) en todos los tamaños: solo, en mobile **no
|
|
94
|
+
llegaría**; pasa porque el área entera también abre el selector.
|
|
95
|
+
|
|
96
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
97
|
+
|
|
98
|
+
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
|
|
99
|
+
en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
|
|
100
|
+
|
|
101
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| todo el componente (0 usos) | todo lo que se sube hoy es una imagen | la carta del local en PDF o Excel para cargarla, la ficha RUC, los documentos del repartidor escaneados en PDF |
|
|
104
|
+
| `multiple` | no hay subidas de varios archivos | las boletas del mes de un gasto, varias fotos de un reclamo |
|
|
105
|
+
| `size="xlarge"` | más aire no ayuda | ninguno |
|
|
106
|
+
| para imágenes | no muestra la vista previa ni pasa por el recortador | — |
|
|
107
|
+
|
|
108
|
+
## API
|
|
109
|
+
|
|
110
|
+
<!-- api:inicio -->
|
|
111
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
112
|
+
|
|
113
|
+
| input | tipo | default |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| `accept` | `string` | `''` |
|
|
116
|
+
| `multiple` | `boolean` | `false` |
|
|
117
|
+
| `maxSize` | `number` | `0` |
|
|
118
|
+
| `title` | `string \| null` | `null` |
|
|
119
|
+
| `subtitle` | `string \| null` | `null` |
|
|
120
|
+
| `browseLabel` | `string` | `'Buscar archivo'` |
|
|
121
|
+
| `disabled` | `boolean` | `false` |
|
|
122
|
+
| `error` | `boolean` | `false` |
|
|
123
|
+
| `errorMessage` | `string \| null` | `null` |
|
|
124
|
+
| `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
125
|
+
|
|
126
|
+
| output | payload |
|
|
127
|
+
|---|---|
|
|
128
|
+
| `filesSelected` | `File[]` |
|
|
129
|
+
| `errorEvent` | `string` |
|
|
130
|
+
<!-- api:fin -->
|
|
131
|
+
|
|
132
|
+
## Trampas
|
|
133
|
+
|
|
134
|
+
- `browseLabel` dice «Buscar archivo» por defecto (antes «Browse File»).
|
|
135
|
+
- **Llena el ancho del contenedor** desde el 03-10-2026 (antes medía 400 fijo y había que forzar
|
|
136
|
+
`style="width: 100%"`). Las pantallas que lo dejaban en 400 en un contenedor ancho ahora se
|
|
137
|
+
estiran; para un ancho fijo, se lo pone el consumer al host.
|
|
138
|
+
- **`maxSize` va en bytes**, no en MB. `0` = sin límite.
|
|
139
|
+
- **Emite solo los archivos válidos**: si de tres uno pesa de más, `filesSelected` trae dos y
|
|
140
|
+
`errorEvent` avisa del tercero (con el texto ya armado: «"x.pdf" supera el tamaño máximo (10.0 MB)»).
|
|
141
|
+
- Sin `multiple`, aunque se suelten varios, **emite solo el primero**.
|
|
142
|
+
- `accept` filtra al elegir **y** al soltar, por extensión (`.pdf`) o por tipo (`image/*`).
|
|
143
|
+
- El error interno queda pegado hasta el próximo intento válido; `errorMessage` gana sobre él.
|
|
144
|
+
- **No sube nada**: entrega los `File` y la subida (y el progreso en `sui-file-upload-card`) la
|
|
145
|
+
hace quien lo usa.
|
|
146
|
+
- El atributo `title` del host se borra solo (no sale el tooltip gris del navegador).
|
|
147
|
+
|
|
148
|
+
## Ejemplo
|
|
149
|
+
|
|
150
|
+
```html
|
|
151
|
+
<sui-file-upload title="Sube tu carta en PDF o Excel" subtitle="PDF o Excel, hasta 10 MB"
|
|
152
|
+
browseLabel="Buscar archivo" accept=".pdf,.xlsx" [maxSize]="10 * 1024 * 1024"
|
|
153
|
+
(filesSelected)="subirCarta($event)" (errorEvent)="avisar($event)" />
|
|
154
|
+
```
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-file-upload-card
|
|
3
|
+
selector: sui-file-upload-card
|
|
4
|
+
resumen: La fila de un archivo que se está subiendo, con su progreso, listo o error para reintentar
|
|
5
|
+
alternativas: [sui-file-upload (el área para elegir el archivo), sui-image-upload (una imagen: muestra la vista previa en vez de la fila), sui-file-icon (un archivo en una lista, sin subida)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-file-upload-card
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Upload/File Upload Card](https://sui-design-system.web.app/?path=/docs/molecules-upload-file-upload-card--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** debajo de un `sui-file-upload`, una fila por archivo, para mostrar **cómo va la subida**:
|
|
15
|
+
subiendo con su barra, listo, o falló con «Reintentar».
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Una imagen: `sui-image-upload` muestra la vista previa, que dice más que un nombre de archivo.
|
|
20
|
+
- Una lista de archivos ya guardados (sin subida): `sui-file-icon` en una fila normal.
|
|
21
|
+
- Un progreso que no es de un archivo: `sui-progress-bar`.
|
|
22
|
+
|
|
23
|
+
## Qué variante usar
|
|
24
|
+
|
|
25
|
+
> **La guía del DS no tiene página para este componente** (su página del file upload solo muestra
|
|
26
|
+
> el área y el ícono por tipo). Todo es **propuesta, falta aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Las subidas de hoy son de
|
|
29
|
+
> imágenes y avisan con el `subtitle` del image-upload («Procesando…») o lo deshabilitan.
|
|
30
|
+
|
|
31
|
+
### `state`
|
|
32
|
+
|
|
33
|
+
| valor | cuándo | qué muestra | fuente |
|
|
34
|
+
|---|---|---|---|
|
|
35
|
+
| `in-progress` (default) | Mientras sube. Va con `progress`. | barra azul, ícono de carga, X para cancelar | propuesta |
|
|
36
|
+
| `success` | Subió. | check verde, tacho para quitar | propuesta |
|
|
37
|
+
| `error` | Falló. Va con `statusText` que diga por qué. | ícono rojo, «Reintentar», tacho | propuesta |
|
|
38
|
+
|
|
39
|
+
### Textos y datos
|
|
40
|
+
|
|
41
|
+
| input | cuándo | fuente |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `file` | El nombre real del archivo (`'carta-octubre.pdf'`). La extensión da el ícono y el color. | propuesta |
|
|
44
|
+
| `description` | **Siempre** se pasa: el default es un texto de ejemplo («0 KB de 120 KB»). Subiendo: «1,2 MB de 3,4 MB»; listo: «3,4 MB». | propuesta |
|
|
45
|
+
| `progress` | 0–100, solo en `in-progress`. | propuesta |
|
|
46
|
+
| `statusText` | Los defaults ya están en español («Subiendo…», «Completado», «Falló»); en error, mejor el motivo: «Se cortó la conexión». | propuesta |
|
|
47
|
+
| `showStatus=false` | Solo en `success`, cuando el check sobra porque la lista ya dice «Archivos subidos». | propuesta |
|
|
48
|
+
| `retryLabel` | El default ya es «Reintentar». | propuesta |
|
|
49
|
+
|
|
50
|
+
Usos de hoy que rompen la regla: **0**.
|
|
51
|
+
|
|
52
|
+
## Tamaño en mobile y en web
|
|
53
|
+
|
|
54
|
+
**No tiene `size`.** Llena el ancho del contenedor (antes 400 fijo) y la X o el tacho de la derecha
|
|
55
|
+
es un `sui-compact-button` `2xlarge` de **32 px** (Figma: 24), que con el aire de la tarjeta (16 de
|
|
56
|
+
padding, 72 de alto mínimo) se toca bien con el dedo. «Reintentar» sigue siendo un link de 20 px de
|
|
57
|
+
alto: en mobile conviene que la fila entera también reintente.
|
|
58
|
+
|
|
59
|
+
| pieza | mobile | web | fuente |
|
|
60
|
+
|---|---|---|---|
|
|
61
|
+
| ancho | el del contenedor | el del contenedor | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
62
|
+
| X / tacho | 32 px | 32 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
63
|
+
| «Reintentar» | link de 20 px — **no llega** | link | medido |
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<sui-file-upload-card [file]="a.nombre" [state]="a.estado" [progress]="a.pct"
|
|
67
|
+
[description]="a.peso" (actionClicked)="quitar(a)" (retryClicked)="reintentar(a)" />
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
71
|
+
|
|
72
|
+
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
|
|
73
|
+
en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
|
|
74
|
+
|
|
75
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| todo el componente (0 usos) | todo lo que se sube es una imagen y se ve con su vista previa | junto a `sui-file-upload`: la carta en PDF, varias boletas de un gasto, documentos del repartidor |
|
|
78
|
+
| para imágenes | la vista previa dice más que el nombre del archivo | — |
|
|
79
|
+
|
|
80
|
+
## API
|
|
81
|
+
|
|
82
|
+
<!-- api:inicio -->
|
|
83
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
84
|
+
|
|
85
|
+
| input | tipo | default |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `file` | `SuiFileUploadCardFile \| string` | `'file.pdf'` |
|
|
88
|
+
| `description` | `string` | `'0 KB de 120 KB'` |
|
|
89
|
+
| `state` | `'in-progress' \| 'success' \| 'error'` | `'in-progress'` |
|
|
90
|
+
| `progress` | `number` | `10` |
|
|
91
|
+
| `statusText` | `string \| null` | `null` |
|
|
92
|
+
| `showStatus` | `boolean` | `true` |
|
|
93
|
+
| `cancelLabel` | `string` | `'Cancelar subida'` |
|
|
94
|
+
| `removeLabel` | `string` | `'Quitar archivo'` |
|
|
95
|
+
| `progressLabel` | `string` | `'Progreso de la subida'` |
|
|
96
|
+
| `retryLabel` | `string` | `'Reintentar'` |
|
|
97
|
+
|
|
98
|
+
| output | payload |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `actionClicked` | `void` |
|
|
101
|
+
| `retryClicked` | `void` |
|
|
102
|
+
<!-- api:fin -->
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
interface SuiFileUploadCardFile { filename: string; extension?: string; }
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Trampas
|
|
109
|
+
|
|
110
|
+
- Los textos de fábrica están en español desde el 03-10-2026: «0 KB de 120 KB», «Subiendo…»,
|
|
111
|
+
«Completado», «Falló», «Reintentar», y para el lector de pantalla «Cancelar subida», «Quitar
|
|
112
|
+
archivo» y «Progreso de la subida» (estos tres, con `cancelLabel`, `removeLabel` y
|
|
113
|
+
`progressLabel`).
|
|
114
|
+
- Llena el ancho del contenedor, igual que `sui-file-upload` (antes 400 fijo).
|
|
115
|
+
- **`progress` arranca en 10**, no en 0.
|
|
116
|
+
- **`actionClicked` significa dos cosas**: cancelar mientras sube y quitar cuando terminó. Quien lo
|
|
117
|
+
usa mira `state` para saber cuál.
|
|
118
|
+
- La barra de progreso es azul, no naranja.
|
|
119
|
+
- No sube nada: refleja el estado que le pasan.
|
|
120
|
+
|
|
121
|
+
## Ejemplo
|
|
122
|
+
|
|
123
|
+
```html
|
|
124
|
+
<sui-file-upload-card file="carta-octubre.pdf" state="in-progress" [progress]="45"
|
|
125
|
+
description="1,2 MB de 2,6 MB" statusText="Subiendo…" />
|
|
126
|
+
<sui-file-upload-card file="carta-octubre.pdf" state="error" description="2,6 MB"
|
|
127
|
+
statusText="Se cortó la conexión" retryLabel="Reintentar"
|
|
128
|
+
(retryClicked)="reintentar()" (actionClicked)="quitar()" />
|
|
129
|
+
```
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-flag
|
|
3
|
+
selector: sui-flag
|
|
4
|
+
resumen: La bandera circular de un país
|
|
5
|
+
alternativas: [sui-emoji (un emoji con emoción), sui-icon (un ícono funcional)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-flag
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Flag](https://sui-design-system.web.app/?path=/docs/atoms-flag--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** cuando el **país** es un dato que la persona elige o tiene que reconocer: el prefijo
|
|
15
|
+
de un teléfono, la nacionalidad, un selector de país.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para decorar: en una app que funciona solo en Perú, una bandera sola no le dice
|
|
18
|
+
nada a nadie.
|
|
19
|
+
|
|
20
|
+
## Qué variante usar
|
|
21
|
+
|
|
22
|
+
> **La guía del DS no tiene este componente.** Todo es **propuesta, falta aprobación**.
|
|
23
|
+
>
|
|
24
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usan por dentro
|
|
25
|
+
> `sui-select`, `sui-compact-select`, `sui-inline-select`, `sui-dropdown-item`, `sui-tag` y
|
|
26
|
+
> `sui-command-menu-item`.
|
|
27
|
+
|
|
28
|
+
### `size`
|
|
29
|
+
|
|
30
|
+
| valor | px | cuándo | fuente |
|
|
31
|
+
|---|---|---|---|
|
|
32
|
+
| `xs` | 16 | Dentro de un select o un tag (así lo usa el DS). | propuesta |
|
|
33
|
+
| `sm` | 20 | El prefijo de un teléfono. | propuesta |
|
|
34
|
+
| `md` (default) | 24 | Fila de una lista. | propuesta |
|
|
35
|
+
| `lg` | 32 | Dentro de una card. | propuesta |
|
|
36
|
+
| `xl` | 48 | No usar hoy. | propuesta |
|
|
37
|
+
| `full` | 100 % | Llena su caja (la caja manda). | propuesta |
|
|
38
|
+
|
|
39
|
+
### `name` y `ariaLabel`
|
|
40
|
+
|
|
41
|
+
| input | cuándo | fuente |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `name` | El slug en inglés y en kebab-case: `peru`, `venezuela`, `united-states`. Son 262. | propuesta |
|
|
44
|
+
| `ariaLabel` | El nombre del país en español, si no está escrito al lado. Sin él, es decorativa. | propuesta |
|
|
45
|
+
|
|
46
|
+
Usos de hoy que rompen la regla: **0**.
|
|
47
|
+
|
|
48
|
+
## Tamaño en mobile y en web
|
|
49
|
+
|
|
50
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
51
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
52
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
53
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
54
|
+
|
|
55
|
+
| uso | mobile | web |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| prefijo de un teléfono | `sm` (20) | `xs` (16) |
|
|
58
|
+
| fila de una lista | `md` (24) | `sm` (20) |
|
|
59
|
+
|
|
60
|
+
```html
|
|
61
|
+
<sui-flag name="peru" [size]="bp.isMobile() ? 'sm' : 'xs'" ariaLabel="Perú" />
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
La bandera no se toca: el área táctil es la del select que la contiene.
|
|
65
|
+
|
|
66
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
67
|
+
|
|
68
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| todo el componente (0 usos directos) | la app es solo Perú | la nacionalidad del repartidor que se registra con carné de extranjería, o el prefijo del teléfono si se abre a otro país |
|
|
71
|
+
| `size` `xl` | sin caso | una pantalla de elegir país |
|
|
72
|
+
|
|
73
|
+
## API
|
|
74
|
+
|
|
75
|
+
<!-- api:inicio -->
|
|
76
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
77
|
+
|
|
78
|
+
| input | tipo | default |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `name` | `SuiFlagName` | — (requerido) |
|
|
81
|
+
| `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'full'` | `'md'` |
|
|
82
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
83
|
+
|
|
84
|
+
Outputs: ninguno.
|
|
85
|
+
<!-- api:fin -->
|
|
86
|
+
|
|
87
|
+
## Trampas
|
|
88
|
+
|
|
89
|
+
- **Los SVG no vienen en el paquete npm.** Se piden a `assets/flags/<pais>.svg` (ruta relativa):
|
|
90
|
+
la app tiene que tener la carpeta copiada en `src/assets/flags/` (hoy la tiene, 262 archivos).
|
|
91
|
+
- **Ya es circular**: el círculo está dentro del SVG. No le pongas `border-radius`.
|
|
92
|
+
- **El nombre va en inglés** y con las grafías del set (`slovania`, `mauritus`, `taijikistan`):
|
|
93
|
+
copia el slug de `SUI_FLAG_NAMES`, no lo escribas de memoria.
|
|
94
|
+
|
|
95
|
+
## Ejemplo
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<sui-flag name="peru" size="sm" ariaLabel="Perú" />
|
|
99
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-form-hint
|
|
3
|
+
selector: sui-form-hint
|
|
4
|
+
resumen: Una línea de ayuda o de error debajo de un campo o de un grupo de controles
|
|
5
|
+
alternativas: [el hint propio de sui-input / sui-select / sui-textarea (campo de texto), sui-alert (un aviso de la pantalla o algo que salió bien), sui-tooltip (ayuda escondida tras un toque), sui-form-label (el rótulo de arriba)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-form-hint
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Form/Form Hint](https://sui-design-system.web.app/?path=/docs/atoms-form-form-hint--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para una línea debajo de un campo o grupo **que no trae la suya**: cómo se llena
|
|
15
|
+
(«Como aparece en tu DNI.»), un contador («120/200»), o qué falló («Selecciona un método de
|
|
16
|
+
pago»). Va pegado al control que explica.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **Debajo de un `sui-input`, `sui-select` o `sui-textarea`**: tienen `[hint]` y `[errorMessage]`.
|
|
21
|
+
- Algo que salió bien («Link disponible»): `sui-alert` `success`. El hint no tiene variante positiva.
|
|
22
|
+
- Un párrafo o algo con un link: `sui-alert`.
|
|
23
|
+
- El subtítulo de una sección o de una card: eso es texto de la sección (`sui-page-header`,
|
|
24
|
+
`paragraph-xs` en `--sui-text-sub-600`), no ayuda de un campo.
|
|
25
|
+
|
|
26
|
+
Regla corta: **ayuda o error de un control sin hint propio → form-hint · campo de texto → su `[hint]` · éxito o párrafo → alert.**
|
|
27
|
+
|
|
28
|
+
## Qué variante usar
|
|
29
|
+
|
|
30
|
+
> **La guía del DS lo define como información o guía «debajo de inputs, selects y textareas»** y
|
|
31
|
+
> trae tres estados: normal, deshabilitado y con error (`hasError`). El ícono es una pieza aparte
|
|
32
|
+
> y opcional. No da reglas de largo ni de copy.
|
|
33
|
+
>
|
|
34
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
35
|
+
> **36 usos en 18 archivos**: 11 `error`, 25 `neutral` (24 por default y 1 explícito), 0
|
|
36
|
+
> `disabled`; 2 con `icon` propio (`information-line`). Hay además **al menos 14 hints escritos a
|
|
37
|
+
> mano** con clases propias (`__form-hint`, `__hint`).
|
|
38
|
+
|
|
39
|
+
### `variant`
|
|
40
|
+
|
|
41
|
+
| variant | cuándo | fuente |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `neutral` (default) | Ayuda: cómo se llena, formato, contador. Sin ícono por defecto. | según la guía del DS |
|
|
44
|
+
| `error` | Qué falló y cómo arreglarlo, después de intentar seguir. Trae ícono. | según la guía del DS (`hasError`) |
|
|
45
|
+
| `disabled` | El campo de arriba está deshabilitado; el hint se apaga con él. | según la guía del DS |
|
|
46
|
+
|
|
47
|
+
### `message` e `icon`
|
|
48
|
+
|
|
49
|
+
| qué | regla | fuente |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| `message` | Hasta 8 palabras (mediana 6). Si no cabe, es un `sui-alert`. Con punto final si es una oración. | canon (`docs/CANON-SUI.md` §5.4) |
|
|
52
|
+
| `icon` sin pasar | El de la variante (ninguno en `neutral`, info en `error` y `disabled`). | según la guía del DS (ícono opcional); default de SUI |
|
|
53
|
+
| `icon="…"` en `neutral` | Solo cuando la ayuda es una advertencia que conviene notar («No reconocimos el distrito…»). | propuesta, falta aprobación (2 usos hoy) |
|
|
54
|
+
| `[icon]="null"` | Quita el ícono también en `error`. No usar: el error necesita algo más que el color. | propuesta, falta aprobación |
|
|
55
|
+
|
|
56
|
+
**Usos de hoy que rompen las reglas:**
|
|
57
|
+
|
|
58
|
+
- **8 debajo de un campo que ya tiene `[hint]` / `[errorMessage]` → pasar al campo:**
|
|
59
|
+
`pages/driver-onboarding/step-info/step-info.html:50` («Como aparece en tu DNI.»), `:71`, `:92`;
|
|
60
|
+
`pages/driver-onboarding/step-vehicle/step-vehicle.html:56`, `:69`; y los errores bajo
|
|
61
|
+
`sui-select` de `pages/customer-onboarding/step-address/step-address.html:82`, `:100`, `:119`.
|
|
62
|
+
Bien usado, en cambio, `step-vehicle.html:43`: el error de un grupo de `sui-radio-card`.
|
|
63
|
+
- **4 como subtítulo de una sección, no de un campo:** `pages/schedule/schedule.html:17`
|
|
64
|
+
(«Pausa tu sucursal…», bajo el título de la card), `:61`, `pages/drivers/drivers.html:29`,
|
|
65
|
+
`pages/driver/driver-schedule/driver-schedule.html:94`.
|
|
66
|
+
- **12 de más de 8 palabras** (4 son los subtítulos de arriba) → acortar, o `sui-alert` si de
|
|
67
|
+
verdad hace falta todo: `pages/super-admin/master-users/master-users.html:66` (26 palabras),
|
|
68
|
+
`pages/orders/orders.html:587` (23), `pages/driver/driver-order-detail/driver-order-detail.html:834` (23),
|
|
69
|
+
`pages/envios/envios.html:399` (15).
|
|
70
|
+
- **Al menos 14 hints a mano** con clases propias. Ejemplos: `pages/discounts/discounts.html:196`
|
|
71
|
+
(`discounts__form-hint`), `components/settings-panel/settings-panel.html:93`,
|
|
72
|
+
`pages/promociones/promociones.html:180`.
|
|
73
|
+
|
|
74
|
+
## Tamaño en mobile y en web
|
|
75
|
+
|
|
76
|
+
| uso | mobile | web |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| ayuda o error | 12 px (no hay `size`) | 12 px |
|
|
79
|
+
|
|
80
|
+
Es texto que no se toca: el mismo tamaño en las dos plataformas está bien.
|
|
81
|
+
|
|
82
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
83
|
+
|
|
84
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| `variant="disabled"` (0 usos) | ningún grupo con form-hint se deshabilita | un grupo de opciones que se apaga según otra elección («Horario propio» apagado) |
|
|
87
|
+
| `[icon]="null"` en `error` | el error se distingue por color y por ícono; sin ícono queda solo el rojo | nunca en `error`; en `neutral` ya viene sin ícono |
|
|
88
|
+
|
|
89
|
+
## API
|
|
90
|
+
|
|
91
|
+
<!-- api:inicio -->
|
|
92
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
93
|
+
|
|
94
|
+
| input | tipo | default |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `message` | `string \| null` | `null` |
|
|
97
|
+
| `variant` | `'neutral' \| 'error' \| 'disabled'` | `'neutral'` |
|
|
98
|
+
| `icon` | `string \| null \| undefined` | `undefined` |
|
|
99
|
+
|
|
100
|
+
Outputs: ninguno.
|
|
101
|
+
<!-- api:fin -->
|
|
102
|
+
|
|
103
|
+
## Trampas
|
|
104
|
+
|
|
105
|
+
- **`icon` tiene tres estados**: sin pasar = el de la variante; `null` = sin ícono; `"mail-line"` =
|
|
106
|
+
ese. Un string vacío no está contemplado.
|
|
107
|
+
- **`neutral` no trae ícono.** Si quieres uno, pásalo.
|
|
108
|
+
- **No hay `success` ni `warning`** (se quitaron el 22-07-2026) ni `size` (era un no-op). Si las ves
|
|
109
|
+
en un ejemplo, es una versión vieja.
|
|
110
|
+
- **Sin `message` no ocupa lugar**: no hace falta envolverlo en `@if`.
|
|
111
|
+
- En `error` el ícono es `information-fill` en rojo, no `error-warning-line`.
|
|
112
|
+
- Letra fija de 12/16 px; el ícono mide 16 px y se alinea con la primera línea.
|
|
113
|
+
|
|
114
|
+
## Ejemplo
|
|
115
|
+
|
|
116
|
+
```html
|
|
117
|
+
<!-- Grupo sin hint propio -->
|
|
118
|
+
<sui-form-label label="Método de pago" [required]="true" />
|
|
119
|
+
<sui-radio-group [(ngModel)]="metodo">…</sui-radio-group>
|
|
120
|
+
<sui-form-hint variant="error" [message]="intento() && !metodo ? 'Selecciona un método de pago' : null" />
|
|
121
|
+
|
|
122
|
+
<!-- Contador -->
|
|
123
|
+
<sui-form-hint [message]="comentario().length + '/200'" />
|
|
124
|
+
```
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-form-label
|
|
3
|
+
selector: sui-form-label
|
|
4
|
+
resumen: Rótulo de un campo o de un grupo de controles que no traen el suyo (asterisco, opcional, ayuda y link)
|
|
5
|
+
alternativas: [el label propio de sui-input / sui-select / sui-textarea (campo de texto), sui-checkbox-label / sui-radio-label / sui-switch-label (un control con su texto), sui-page-header o sui-content-label (título de sección), sui-form-hint (la ayuda debajo)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-form-label
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Form/Form Label](https://sui-design-system.web.app/?path=/docs/atoms-form-form-label--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para titular un campo **que no tiene label propio**: un grupo de `sui-radio-card`
|
|
15
|
+
(«¿Cómo quieres recibir tu pedido?»), un bloque de casillas («Permisos»), un `sui-image-upload`
|
|
16
|
+
(«Logo»), el punto en el mapa («Tu punto en el mapa»), una fila de chips.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **Encima de un `sui-input`, `sui-select` o `sui-textarea`**: esos ya dibujan su label, asterisco,
|
|
21
|
+
sublabel y tooltip con `[label]`, `[required]`, `[sublabel]`, `[tooltip]`. Ponerle uno afuera
|
|
22
|
+
duplica la pieza y pierde el `for`.
|
|
23
|
+
- El texto de un solo checkbox, radio o switch: `sui-checkbox-label`, `sui-radio-label`,
|
|
24
|
+
`sui-switch-label`.
|
|
25
|
+
- Un título de sección o de card («Datos personales»): `sui-page-header`, `sui-content-label` o
|
|
26
|
+
un heading.
|
|
27
|
+
- Una explicación larga: va debajo, en `sui-form-hint`.
|
|
28
|
+
|
|
29
|
+
Regla corta: **campo de texto → su propio `[label]` · grupo o control sin label → form-label · sección → heading.**
|
|
30
|
+
|
|
31
|
+
## Qué variante usar
|
|
32
|
+
|
|
33
|
+
> **La guía del DS dice que el label «da contexto a lo que la persona ingresa»** y trae tres
|
|
34
|
+
> piezas: el label, el asterisco (campo obligatorio) y el sub (texto complementario). Su ejemplo
|
|
35
|
+
> es «Last Name*(Optional)»: el opcional va **entre paréntesis** en el sub. Tiene un solo tamaño y
|
|
36
|
+
> un estado deshabilitado. Info (tooltip) y el link de la derecha vienen del Figma del componente.
|
|
37
|
+
>
|
|
38
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
39
|
+
> **37 usos en 13 archivos**: 13 con `required`, 5 con `sublabel="Opcional"`, 2 con `link`
|
|
40
|
+
> («Cambiar»), 0 con `tooltip`, 0 con `disabled`; 6 con `size="medium"` explícito, el resto en el
|
|
41
|
+
> default (`medium`).
|
|
42
|
+
|
|
43
|
+
### Las piezas
|
|
44
|
+
|
|
45
|
+
| prop | cuándo | fuente |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `label` | Siempre. Una a tres palabras, sentence case, sin dos puntos ni punto final. | según la guía del DS (pieza); largo y forma según `docs/CANON-SUI.md` §5.4 |
|
|
48
|
+
| `required` | Campo obligatorio: asterisco **rojo** (`state-error-base`). | según la guía del DS (asterisco = obligatorio); el color es canon (`docs/CANON-SUI.md` §4: excepción documentada) |
|
|
49
|
+
| `sublabel` | «(Opcional)» en un formulario donde casi todo es obligatorio. Nunca el «opcional» dentro del `label`. | según la guía del DS (ejemplo «(Optional)») |
|
|
50
|
+
| `tooltip` | Ayuda corta que no cabe en la pantalla y no hace falta para llenar el campo. Si hace falta, va visible en `sui-form-hint`. | propuesta, falta aprobación |
|
|
51
|
+
| `link` | Una acción sobre el campo, a la derecha: «Cambiar» (el distrito). | propuesta (ya es práctica de la app: 2 usos) |
|
|
52
|
+
| `disabled` | El campo de abajo está deshabilitado. | según la guía del DS |
|
|
53
|
+
| `for` | Siempre que el control de abajo tenga `id`. | propuesta, falta aprobación |
|
|
54
|
+
|
|
55
|
+
### `size`
|
|
56
|
+
|
|
57
|
+
| size | cuándo | fuente |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `medium` (default) | Lo normal. | según la guía del DS (único tamaño) |
|
|
60
|
+
| `small` | Es **idéntico** a `medium` (mismo CSS). No aporta. | — |
|
|
61
|
+
| `xsmall` | Junto a un campo `xsmall` en una tabla o filtro denso (12 px). | propuesta, falta aprobación |
|
|
62
|
+
|
|
63
|
+
La regla de controles grandes del dueño (28-09-2026) no aplica aquí: el `size` del label es
|
|
64
|
+
tipografía, no área táctil.
|
|
65
|
+
|
|
66
|
+
**Usos de hoy que rompen las reglas:**
|
|
67
|
+
|
|
68
|
+
- **8 encima de un campo que ya trae su label → pasar a `[label]` del campo:**
|
|
69
|
+
`pages/driver-onboarding/step-info/step-info.html:37` («Nombre completo»), `:56`, `:77`;
|
|
70
|
+
`pages/customer-onboarding/step-address/step-address.html:70` («Departamento», sobre
|
|
71
|
+
`sui-select`), `:87`, `:106`; `pages/driver-onboarding/step-vehicle/step-vehicle.html:49`, `:62`.
|
|
72
|
+
En esos mismos campos el `sui-form-hint` de abajo también es el `[hint]` del input.
|
|
73
|
+
- **5 con `sublabel="Opcional"` sin paréntesis** → se lee «ImagenOpcional» (1 px de separación).
|
|
74
|
+
Pasar a «(Opcional)»: `components/add-product-modal/add-product-modal.html:42`, `:195`;
|
|
75
|
+
`pages/promociones/promociones.html:200`; `pages/business-onboarding/step-info/step-info.html:41`, `:54`.
|
|
76
|
+
- **2 con «(opcional)» dentro del label → `sublabel`:** `pages/driver-onboarding/step-vehicle/step-vehicle.html:49`
|
|
77
|
+
(«Placa del vehículo (opcional)») y `:62`.
|
|
78
|
+
- **2 como título de sección → heading o `sui-content-label`:** `pages/customer/checkout/checkout.html:187`
|
|
79
|
+
(«Datos personales») y `:35` («Recoges en el local»).
|
|
80
|
+
- **5 con el número de paso dentro del label** («1. Imagen del banner»…«5. Comprobante de pago»):
|
|
81
|
+
`pages/promociones/promociones.html:179`, `:200`, `:210`, `:230`, `:264`. Los pasos van en un
|
|
82
|
+
`sui-stepper` o en el título de la sección; el label queda «Imagen del banner». Además `:200`
|
|
83
|
+
(«2. Descripción») está encima de un `sui-textarea`, que ya trae su `[label]`.
|
|
84
|
+
- **1 en Title Case:** `pages/drivers/drivers.html:28` («Modo de Asignación» → «Modo de asignación»).
|
|
85
|
+
- **3 con un switch armado a mano al lado → `sui-switch-label`:** `pages/discounts/discounts.html:195`,
|
|
86
|
+
`:299`; `components/add-product-modal/add-product-modal.html:195`.
|
|
87
|
+
|
|
88
|
+
## Tamaño en mobile y en web
|
|
89
|
+
|
|
90
|
+
| uso | mobile | web |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| rótulo de un grupo o control | `medium` (14 px) | `medium` (14 px) |
|
|
93
|
+
| junto a un campo `xsmall` en una tabla o filtro denso | no aplica | `xsmall` (12 px) |
|
|
94
|
+
|
|
95
|
+
No necesita `bp`: es texto, no se toca. Lo único tocable es el `link` («Cambiar»), un
|
|
96
|
+
`sui-link-button` de 12 px **sin tamaño para mobile**: su área táctil es la del texto. Si en
|
|
97
|
+
mobile esa acción importa, conviene un botón aparte.
|
|
98
|
+
|
|
99
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
100
|
+
|
|
101
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `size="small"` | dibuja igual que `medium` | nunca, hasta que el DS lo diferencie |
|
|
104
|
+
| `tooltip` (0 usos) | toda la ayuda que hoy existe hace falta para llenar el campo, y va visible | un dato de contexto que la mayoría no necesita («¿Por qué pedimos tu DNI?») |
|
|
105
|
+
| `disabled` (0 usos) | ningún grupo con form-label se deshabilita | un grupo de opciones que depende de otra elección previa |
|
|
106
|
+
|
|
107
|
+
## API
|
|
108
|
+
|
|
109
|
+
<!-- api:inicio -->
|
|
110
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
111
|
+
|
|
112
|
+
| input | tipo | default |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| `label` | `string` | — (requerido) |
|
|
115
|
+
| `sublabel` | `string \| null` | `null` |
|
|
116
|
+
| `required` | `boolean` | `false` |
|
|
117
|
+
| `tooltip` | `string \| null` | `null` |
|
|
118
|
+
| `link` | `SuiLinkConfig \| string \| null` | `null` |
|
|
119
|
+
| `size` | `'xsmall' \| 'small' \| 'medium'` | `'medium'` |
|
|
120
|
+
| `disabled` | `boolean` | `false` |
|
|
121
|
+
| `for` | `string \| null` | `null` |
|
|
122
|
+
|
|
123
|
+
| output | payload |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `linkClick` | `MouseEvent` |
|
|
126
|
+
<!-- api:fin -->
|
|
127
|
+
|
|
128
|
+
## Trampas
|
|
129
|
+
|
|
130
|
+
- **`small` y `medium` se ven igual** (los dos 14 px). Solo `xsmall` cambia (12 px), y solo la letra.
|
|
131
|
+
- **El sublabel no pone paréntesis**: escribe «(Opcional)» con paréntesis o queda pegado al label
|
|
132
|
+
(el espacio entre piezas es de 1 px).
|
|
133
|
+
- **El asterisco es rojo**, no el naranja de marca (la guía lo pinta con el primario).
|
|
134
|
+
- Los ejes del Figma se llaman distinto aquí: «Info» es `tooltip` y «Button» es `link`.
|
|
135
|
+
- `link` como string emite `linkClick`; como objeto con `href` es un `<a>` real (con `_blank` agrega
|
|
136
|
+
`rel="noopener noreferrer"`). Se pinta en gris, empujado a la derecha.
|
|
137
|
+
- El ícono de info es gris muy claro a propósito (baja jerarquía); se oscurece al pasar el mouse.
|
|
138
|
+
|
|
139
|
+
## Ejemplo
|
|
140
|
+
|
|
141
|
+
```html
|
|
142
|
+
<!-- Grupo de opciones sin label propio -->
|
|
143
|
+
<sui-form-label label="Método de pago" [required]="true" />
|
|
144
|
+
<sui-radio-group [(ngModel)]="metodo">…</sui-radio-group>
|
|
145
|
+
|
|
146
|
+
<!-- Campo de texto: el label va en el propio input, no en un form-label -->
|
|
147
|
+
<sui-input label="Placa del vehículo" sublabel="(Opcional)" [(value)]="placa" />
|
|
148
|
+
```
|