@ajuarezso/sui-design-system 0.19.0 → 0.20.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 +216 -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 +212 -0
- package/docs/sui-brand-logo/README.md +143 -0
- package/docs/sui-button/README.md +192 -0
- package/docs/sui-button-group/README.md +178 -0
- package/docs/sui-button-group-item/README.md +102 -0
- package/docs/sui-checkbox/README.md +147 -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-content-divider/README.md +124 -0
- package/docs/sui-divider/README.md +102 -0
- package/docs/sui-emoji/README.md +138 -0
- package/docs/sui-fancy-button/README.md +148 -0
- package/docs/sui-file-icon/README.md +103 -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-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-payment-icon/README.md +98 -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-label/README.md +137 -0
- package/docs/sui-rating/README.md +198 -0
- package/docs/sui-segmented-control/README.md +144 -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-switch/README.md +146 -0
- package/docs/sui-switch-label/README.md +139 -0
- package/docs/sui-tag/README.md +145 -0
- package/fesm2022/ajuarezso-sui-design-system.mjs +193 -48
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +166 -27
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-fancy-button
|
|
3
|
+
selector: sui-fancy-button
|
|
4
|
+
resumen: Botón con brillo y degradé para el CTA de una landing o campaña
|
|
5
|
+
alternativas: [sui-button (toda acción dentro de la app), sui-app-store-badge (descargar la app desde una landing)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-fancy-button
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Button/Fancy Button](https://sui-design-system.web.app/?path=/docs/atoms-button-fancy-button--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Hoy no se usa** (0 usos en la app). Es el mismo botón que `sui-button` con un acabado de
|
|
15
|
+
marketing: brillo arriba, borde interior claro y un anillo del color del botón.
|
|
16
|
+
|
|
17
|
+
**Cuándo sí, en un flujo nuevo**: el CTA principal de una landing (`/empresas`, `/repartidores`),
|
|
18
|
+
«Mejorar plan» o una campaña puntual. Uno por pantalla.
|
|
19
|
+
|
|
20
|
+
**No lo uses** para:
|
|
21
|
+
|
|
22
|
+
- **Cualquier acción dentro de la app**: `sui-button`. Al lado de botones normales, el fancy
|
|
23
|
+
compite con todo y rompe la jerarquía.
|
|
24
|
+
- **Una acción destructiva**: `sui-button` `color="error"`.
|
|
25
|
+
- **Descargar la app**: `sui-app-store-badge`.
|
|
26
|
+
|
|
27
|
+
## Qué variante usar
|
|
28
|
+
|
|
29
|
+
> **La guía del DS no dice cuándo usar cada tipo.** Su página lo presenta como «botones normales
|
|
30
|
+
> con una apariencia vistosa» y muestra los cuatro tipos, los tres tamaños, los íconos y el
|
|
31
|
+
> deshabilitado, sin do/don't. Todo el componente está en **«no usar» (canon, aprobado por el
|
|
32
|
+
> dueño, 03-10-2026)**; la tabla dice dónde iría cada tipo si aparece el caso.
|
|
33
|
+
>
|
|
34
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0** fancy-buttons, sin contar
|
|
35
|
+
> prototipos ni vitrinas.
|
|
36
|
+
|
|
37
|
+
### Lo que sí dice la guía del DS
|
|
38
|
+
|
|
39
|
+
- **Para qué es**: un botón normal con un acabado más vistoso.
|
|
40
|
+
- **Default**: `neutral` (negro) en la guía; **`primary` en SUI**.
|
|
41
|
+
- **Tamaños**: `medium` (40), `small` (36) y `xsmall` (32). No hay más grandes.
|
|
42
|
+
- **Hover**: el brillo se aclara, no se oscurece. `basic` pasa a fondo gris plano.
|
|
43
|
+
- **Deshabilitado**: fondo gris plano, sin brillo, sin anillo ni sombra, igual en los cuatro tipos.
|
|
44
|
+
|
|
45
|
+
### `type` (el relleno)
|
|
46
|
+
|
|
47
|
+
| type | dónde iría, en un flujo nuevo | ejemplo de copy | fuente |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| `primary` (default SUI) | El CTA principal de una landing o una campaña. Uno por pantalla. | «Empieza gratis», «Mejorar plan» | no usar hoy · cuándo sí: canon (aprobado por el dueño, 03-10-2026) |
|
|
50
|
+
| `neutral` (default de la guía) | El CTA de una landing sobre una sección clara donde el naranja ya se usó arriba. | «Ver planes» | no usar hoy (en la app va `sui-button`) · cuándo sí: propuesta |
|
|
51
|
+
| `basic` | El secundario al lado de un fancy `primary` en la misma landing. | «Saber más» | no usar hoy (en la app va `sui-button`) · cuándo sí: propuesta |
|
|
52
|
+
| `destructive` | Ninguno a la vista: una acción destructiva nunca es marketing. | — | no usar (en la app va `sui-button` `error`) · canon (aprobado por el dueño, 03-10-2026) |
|
|
53
|
+
|
|
54
|
+
### `size`
|
|
55
|
+
|
|
56
|
+
| size | cuándo | fuente |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| `medium` (40, default) | El CTA de la landing en desktop. | escala y default según la guía del DS · cuándo: propuesta |
|
|
59
|
+
| `small` (36) | Un CTA dentro de una card de la landing (la card de un plan). | escala según la guía del DS · cuándo: propuesta |
|
|
60
|
+
| `xsmall` (32) | Sin caso: en una landing el CTA nunca es tan chico. | escala según la guía del DS · cuándo: propuesta |
|
|
61
|
+
|
|
62
|
+
### Íconos y `disabled`
|
|
63
|
+
|
|
64
|
+
| prop | cuándo | fuente |
|
|
65
|
+
|---|---|---|
|
|
66
|
+
| `rightIcon` (`arrow-right-line`) | El CTA lleva a otra página: «Empieza gratis →». | propuesta |
|
|
67
|
+
| `leftIcon` | El ícono dice la acción (descargar, WhatsApp). | propuesta |
|
|
68
|
+
| `disabled` | Casi nunca: un CTA de marketing no se deshabilita, se esconde. | cómo se ve: según la guía del DS · cuándo: propuesta |
|
|
69
|
+
| `href` | El CTA navega (lo normal en una landing): pinta un `<a>`; `rel` ya viene en `'noopener noreferrer'`. | propuesta |
|
|
70
|
+
|
|
71
|
+
## Tamaño en mobile y en web
|
|
72
|
+
|
|
73
|
+
En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
|
|
74
|
+
va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
|
|
75
|
+
(`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px):
|
|
76
|
+
`[size]="bp.isMobile() ? 'large' : 'small'"`, 27 usos hoy en `master-pedidos` (16 `large`/`small`,
|
|
77
|
+
9 `large`/`medium`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
|
|
78
|
+
|
|
79
|
+
| uso | mobile | web | fuente |
|
|
80
|
+
|---|---|---|---|
|
|
81
|
+
| CTA principal de una landing | no usar fancy: `sui-button` `large` (48) | `medium` (40) | propuesta |
|
|
82
|
+
| CTA dentro de la card de un plan | no usar fancy: `sui-button` `large` | `small` (36) | propuesta |
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
@if (bp.isMobile()) {
|
|
86
|
+
<sui-button size="large">Empieza gratis</sui-button>
|
|
87
|
+
} @else {
|
|
88
|
+
<sui-fancy-button type="primary" size="medium">Empieza gratis</sui-fancy-button>
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**El fancy no tiene un tamaño táctil**: el más grande mide 40, por debajo de 44. En mobile el CTA
|
|
93
|
+
va con `sui-button` `large`. Hoy no hay usos (todo el componente está en «no usar»).
|
|
94
|
+
|
|
95
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
96
|
+
|
|
97
|
+
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
|
|
98
|
+
en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
|
|
99
|
+
|
|
100
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| `sui-fancy-button` (los 4 tipos) | Es estilo de marketing (brillo, degradé); en la app compite con todo | el CTA principal de una landing (`/empresas`, `/repartidores`), «Mejorar plan» o una campaña |
|
|
103
|
+
| `type="destructive"` | Una acción destructiva va con `sui-button` `error` | no se ve un caso: una destructiva no es marketing |
|
|
104
|
+
|
|
105
|
+
## API
|
|
106
|
+
|
|
107
|
+
<!-- api:inicio -->
|
|
108
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
109
|
+
|
|
110
|
+
| input | tipo | default |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| `type` | `'primary' \| 'neutral' \| 'basic' \| 'destructive'` | `'primary'` |
|
|
113
|
+
| `size` | `'medium' \| 'small' \| 'xsmall'` | `'medium'` |
|
|
114
|
+
| `leftIcon` | `string \| null` | `null` |
|
|
115
|
+
| `rightIcon` | `string \| null` | `null` |
|
|
116
|
+
| `disabled` | `boolean` | `false` |
|
|
117
|
+
| `href` | `string \| null` | `null` |
|
|
118
|
+
| `target` | `string \| null` | `null` |
|
|
119
|
+
| `rel` | `string \| null` | `'noopener noreferrer'` |
|
|
120
|
+
| `htmlType` | `'button' \| 'submit' \| 'reset'` | `'button'` |
|
|
121
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
122
|
+
|
|
123
|
+
| output | payload |
|
|
124
|
+
|---|---|
|
|
125
|
+
| `clicked` | `MouseEvent` |
|
|
126
|
+
<!-- api:fin -->
|
|
127
|
+
|
|
128
|
+
El clic se escucha con `(clicked)`. Slots: `<ng-content>` (el texto).
|
|
129
|
+
|
|
130
|
+
## Trampas
|
|
131
|
+
|
|
132
|
+
- **`type` es el relleno**, no el `type` HTML: ese se llama **`htmlType`**. `type="submit"` no
|
|
133
|
+
compila (no es un tipo válido) y no hace un submit.
|
|
134
|
+
- **El radio es 10 px, no pill.** Al lado de un `sui-button` (pill en SUI) se ven de dos familias.
|
|
135
|
+
- **No hay `large` ni `xlarge`**: el más grande mide 40. En mobile, donde el CTA de la app es de
|
|
136
|
+
48, un fancy queda más bajo.
|
|
137
|
+
- **El default es `primary`**; en la guía es `neutral`.
|
|
138
|
+
- El anillo del `neutral` es un hex crudo (`#242628`): no hay token para ese gris.
|
|
139
|
+
- Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
|
|
140
|
+
|
|
141
|
+
## Ejemplo
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<!-- Solo en una landing: el CTA principal -->
|
|
145
|
+
<sui-fancy-button type="primary" rightIcon="arrow-right-line" href="/auth/empresa/registro">
|
|
146
|
+
Empieza gratis
|
|
147
|
+
</sui-fancy-button>
|
|
148
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-file-icon
|
|
3
|
+
selector: sui-file-icon
|
|
4
|
+
resumen: El ícono de un archivo con su extensión (PDF, XLSX, JPG…) en el color de su tipo
|
|
5
|
+
alternativas: [sui-file-upload-card (el archivo que se está subiendo, con progreso), sui-icon (un ícono genérico de documento)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-file-icon
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Icon/File Icon](https://sui-design-system.web.app/?path=/docs/atoms-icon-file-icon--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** en una **lista de archivos**: comprobantes, documentos del repartidor, un reporte para
|
|
15
|
+
descargar. La etiqueta con la extensión le dice a la persona qué va a abrir.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Un archivo que se está subiendo: `sui-file-upload-card` (ya lo trae adentro).
|
|
20
|
+
- Una foto: si se puede ver, se muestra la miniatura.
|
|
21
|
+
- Un ícono de «documento» en general, sin archivo detrás: `sui-icon`.
|
|
22
|
+
|
|
23
|
+
## Qué variante usar
|
|
24
|
+
|
|
25
|
+
> **La guía del DS no tiene página para este componente.** Todo es **propuesta, falta
|
|
26
|
+
> aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usa por dentro
|
|
29
|
+
> `sui-file-upload-card`.
|
|
30
|
+
|
|
31
|
+
### `filename`, `extension`, `color`
|
|
32
|
+
|
|
33
|
+
| input | cuándo | fuente |
|
|
34
|
+
|---|---|---|
|
|
35
|
+
| `filename` | Siempre que haya nombre: saca la extensión y el color solo (`comprobante.pdf` → PDF en rojo). | propuesta |
|
|
36
|
+
| `extension` | Solo si el nombre no la trae (un archivo de Storage sin extensión). | propuesta |
|
|
37
|
+
| `color` | No usar: el color dice el tipo y forzarlo miente (un CSV en rojo parece PDF). | propuesta |
|
|
38
|
+
|
|
39
|
+
Colores automáticos: PDF rojo · Word y texto azul · Excel y CSV verde · PowerPoint naranja ·
|
|
40
|
+
imágenes rosa · video morado · audio celeste · comprimidos amarillo · el resto gris.
|
|
41
|
+
|
|
42
|
+
### `size`
|
|
43
|
+
|
|
44
|
+
| valor | px | cuándo | fuente |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| `medium` (default) | 40 | Lista de documentos. | propuesta |
|
|
47
|
+
| `xsmall` | 32 | Filas densas, tablas. | propuesta |
|
|
48
|
+
|
|
49
|
+
Usos de hoy que rompen la regla: **0**.
|
|
50
|
+
|
|
51
|
+
## Tamaño en mobile y en web
|
|
52
|
+
|
|
53
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
54
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
55
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
56
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
57
|
+
|
|
58
|
+
| uso | mobile | web |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| fila de una lista | `medium` (40) | `xsmall` (32) |
|
|
61
|
+
|
|
62
|
+
```html
|
|
63
|
+
<sui-file-icon [filename]="doc.nombre" [size]="bp.isMobile() ? 'medium' : 'xsmall'" />
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
El ícono no se toca: si la fila abre el archivo, la fila da los 44 px. `medium` es el tamaño más
|
|
67
|
+
grande que tiene.
|
|
68
|
+
|
|
69
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
70
|
+
|
|
71
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| todo el componente (0 usos directos) | no hay listas de archivos | los documentos del repartidor (DNI, licencia, SOAT) o un reporte para descargar en CSV |
|
|
74
|
+
| `color` | el color dice el tipo; forzarlo miente | ninguno: si la extensión no se reconoce, sale gris y está bien |
|
|
75
|
+
|
|
76
|
+
## API
|
|
77
|
+
|
|
78
|
+
<!-- api:inicio -->
|
|
79
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
80
|
+
|
|
81
|
+
| input | tipo | default |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| `filename` | `string` | `''` |
|
|
84
|
+
| `extension` | `string` | `''` |
|
|
85
|
+
| `size` | `'xsmall' \| 'medium'` | `'medium'` |
|
|
86
|
+
| `color` | `'red' \| 'orange' \| 'yellow' \| 'green' \| 'teal' \| 'blue' \| 'purple' \| 'pink' \| 'gray' \| ''` | `''` |
|
|
87
|
+
|
|
88
|
+
Outputs: ninguno.
|
|
89
|
+
<!-- api:fin -->
|
|
90
|
+
|
|
91
|
+
## Trampas
|
|
92
|
+
|
|
93
|
+
- **La extensión se corta a 4 letras** y va en mayúsculas: `.jpeg` → `JPEG`, `.numbers` → `NUMB`.
|
|
94
|
+
- **`extension` gana sobre `filename`.**
|
|
95
|
+
- **El nombre para el lector de pantalla está en inglés** («File: PDF») y no se puede cambiar.
|
|
96
|
+
- `size` es `xsmall` o `medium`: no hay `small` ni `large`.
|
|
97
|
+
|
|
98
|
+
## Ejemplo
|
|
99
|
+
|
|
100
|
+
```html
|
|
101
|
+
<sui-file-icon filename="comprobante-yape.pdf" />
|
|
102
|
+
<sui-file-icon filename="ventas-setiembre.csv" size="xsmall" />
|
|
103
|
+
```
|
|
@@ -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
|
+
```
|