@ajuarezso/sui-design-system 0.18.10 → 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 +207 -52
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +177 -28
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-checkbox
|
|
3
|
+
selector: sui-checkbox
|
|
4
|
+
resumen: La casilla sola para marcar una o varias opciones, sin texto propio
|
|
5
|
+
alternativas: [sui-checkbox-label (casilla con su texto, el caso normal), sui-checkbox-card (cada opción es una tarjeta), sui-switch (prende algo que se aplica al instante), sui-radio (opciones excluyentes)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-checkbox
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Checkbox, Radio & Switch/Checkbox](https://sui-design-system.web.app/?path=/docs/atoms-checkbox-radio-switch-checkbox--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para marcar opciones que se suman (varias a la vez) y que se confirman después con
|
|
15
|
+
un botón: permisos de un miembro del equipo, categorías a las que se aplica algo, productos de
|
|
16
|
+
una lista. **Solo la casilla**: úsalo pelado cuando el texto vive en otra parte (una celda de
|
|
17
|
+
tabla, una fila propia con foto y precio, el «seleccionar todo» de una cabecera).
|
|
18
|
+
|
|
19
|
+
**No lo uses** para:
|
|
20
|
+
|
|
21
|
+
- **Una casilla con su texto al lado** (el caso de casi siempre): eso es `sui-checkbox-label`,
|
|
22
|
+
que trae el texto, la descripción y el clic en toda la fila. Armar `<label>` + `sui-checkbox`
|
|
23
|
+
+ `<span>` a mano es justo lo que ese componente evita.
|
|
24
|
+
- Prender o apagar algo que se aplica al instante (notificaciones, disponibilidad): `sui-switch`.
|
|
25
|
+
- Elegir una sola opción entre varias: `sui-radio` / `sui-radio-label`.
|
|
26
|
+
- Una opción que merece tarjeta (ícono, descripción, borde que se pinta): `sui-checkbox-card`.
|
|
27
|
+
|
|
28
|
+
Regla corta: **se suma y se confirma después → checkbox · se aplica ya → switch · una sola → radio.**
|
|
29
|
+
|
|
30
|
+
## Qué variante usar
|
|
31
|
+
|
|
32
|
+
> **La guía del DS dice para qué es, no qué tamaño usar.** Su página lo define como control de
|
|
33
|
+
> formulario «para selecciones simples y múltiples» y muestra deshabilitado, con label y con label
|
|
34
|
+
> avanzado (sublabel, badge, descripción y link). Lo marcado «según la guía del DS» sale de ahí;
|
|
35
|
+
> el resto es canon del dueño o propuesta.
|
|
36
|
+
>
|
|
37
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`, sin contar prototipos ni vitrinas
|
|
38
|
+
> (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`, `master-rutina`,
|
|
39
|
+
> `master-medico`, `dev-index`): **5 checkbox en 3 archivos**, todos con tamaño dinámico
|
|
40
|
+
> (`bp.controlSize()` / `ctrlSize()` = `large` en desktop, `xlarge` en mobile, y uno con el
|
|
41
|
+
> `size()` del padre). Más **1 `<input type="checkbox">` nativo** que debería ser este componente.
|
|
42
|
+
|
|
43
|
+
### Lo que sí dice la guía del DS
|
|
44
|
+
|
|
45
|
+
- **Para qué es**: selecciones simples y múltiples dentro de un formulario.
|
|
46
|
+
- **Deshabilitado**: existe deshabilitado sin marcar y deshabilitado marcado.
|
|
47
|
+
- **Con texto**: el texto al lado es parte del componente (en SUI, `sui-checkbox-label`).
|
|
48
|
+
- Los tamaños de la guía son dos (16 y 20 px). `large` (24) y `xlarge` (28) son extensión de SUI.
|
|
49
|
+
|
|
50
|
+
### Estado (`checked`, `indeterminate`, `disabled`)
|
|
51
|
+
|
|
52
|
+
| estado | cuándo | fuente |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| sin marcar / marcado | Lo normal. `[(checked)]` o `formControlName`. | según la guía del DS |
|
|
55
|
+
| `indeterminate` | Solo en el «seleccionar todo» de una lista cuando hay algunas marcadas y otras no. Se ve un guion. Hoy no usar (0 casos, ver abajo). | propuesta, falta aprobación |
|
|
56
|
+
| `disabled` | La opción existe pero hoy no se puede tocar (un producto agotado en las opciones de un plato). Decir por qué cerca. | según la guía del DS (existe); el «cuándo» es propuesta |
|
|
57
|
+
|
|
58
|
+
### `size`
|
|
59
|
+
|
|
60
|
+
| size | px | cuándo | fuente |
|
|
61
|
+
|---|---|---|---|
|
|
62
|
+
| `xlarge` | 28 | Mobile. Viene de `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
|
|
63
|
+
| `large` | 24 | Desktop. Viene de `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
64
|
+
| `medium` (default) | 20 | Solo dentro de un componente que ya fija su escala (la fila de opciones del detalle de producto recibe el `size` del padre). | propuesta, falta aprobación |
|
|
65
|
+
| `small` | 16 | No usar (ver abajo). | canon (aprobado por el dueño, 28-09-2026) |
|
|
66
|
+
|
|
67
|
+
Regla: **`[size]="bp.controlSize()"`** en toda pantalla. Así ya están los 5 usos de hoy.
|
|
68
|
+
|
|
69
|
+
**Usos de hoy que rompen la regla de componente:**
|
|
70
|
+
|
|
71
|
+
- **4 `sui-checkbox` envueltos en un `<label>` hecho a mano con su texto → `sui-checkbox-label`.**
|
|
72
|
+
`pages/settings/team/team.html:225` y `:294` (permisos: «Gestionar productos»…),
|
|
73
|
+
`components/option-sections-manager/option-sections-manager.html:188` (categorías) y `:210`
|
|
74
|
+
(productos).
|
|
75
|
+
- **1 checkbox nativo → `sui-checkbox-label`:** `pages/sales-channels/facebook/facebook.html:69`
|
|
76
|
+
(«Qué se sincroniza»).
|
|
77
|
+
- **Ojo antes de migrar:** `sui-checkbox-label` **no tiene `size`**; su casilla queda en 20 px.
|
|
78
|
+
Los 4 de arriba hoy están en 24/28 px. Migrarlos sin que el DS le sume `size` al label los
|
|
79
|
+
achica, contra la regla de controles grandes. Primero el `size` en el DS, después la migración.
|
|
80
|
+
- El de `components/product-detail-view/product-detail-view.html:204` está bien pelado: la fila
|
|
81
|
+
es propia (foto, nombre, precio) y es la fila la que recibe el clic.
|
|
82
|
+
|
|
83
|
+
## Tamaño en mobile y en web
|
|
84
|
+
|
|
85
|
+
En mobile se toca con el dedo: el control va grande y el área táctil (≥ 44 px) la da la fila
|
|
86
|
+
que lo contiene. En web va un escalón más chico.
|
|
87
|
+
|
|
88
|
+
| uso | mobile | web |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| casilla en una lista, tabla o fila de formulario | `xlarge` (28 px) | `large` (24 px) |
|
|
91
|
+
| dentro de un componente que fija su escala (fila de opciones del detalle de producto) | lo que pase el padre | lo que pase el padre |
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<sui-checkbox [size]="bp.controlSize()" … /> <!-- controlSize() = isMobile() ? 'xlarge' : 'large' -->
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
El más grande mide 28 px: ningún tamaño llega a 44 px por sí solo. La fila (o el `<label>` que
|
|
98
|
+
envuelve) tiene que medir al menos 44 px de alto para que el toque sea cómodo.
|
|
99
|
+
|
|
100
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
101
|
+
|
|
102
|
+
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo
|
|
103
|
+
cae en la columna de la derecha, se usa.
|
|
104
|
+
|
|
105
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
106
|
+
|---|---|---|
|
|
107
|
+
| `size="small"` (16 px) | en el teléfono se pierde y no llega al área táctil (el dueño pidió controles grandes) | una tabla densa solo de desktop con selección por fila (super admin), donde 24 px desalinea la fila |
|
|
108
|
+
| `indeterminate` (0 usos) | ninguna lista tiene «seleccionar todo» | el «seleccionar todo» de una lista de productos o pedidos con acciones en lote |
|
|
109
|
+
|
|
110
|
+
## API
|
|
111
|
+
|
|
112
|
+
<!-- api:inicio -->
|
|
113
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
114
|
+
|
|
115
|
+
| input | tipo | default |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
118
|
+
| `checked` · model, `[(checked)]` | `boolean` | `false` |
|
|
119
|
+
| `indeterminate` | `boolean` | `false` |
|
|
120
|
+
| `disabled` | `boolean` | `false` |
|
|
121
|
+
|
|
122
|
+
Outputs: ninguno.
|
|
123
|
+
<!-- api:fin -->
|
|
124
|
+
|
|
125
|
+
Implementa `ControlValueAccessor`: funciona con `[(ngModel)]` y `formControlName`. Sin slots.
|
|
126
|
+
|
|
127
|
+
## Trampas
|
|
128
|
+
|
|
129
|
+
- **No tiene `label`.** Para el texto está `sui-checkbox-label`. Y el host lleva `role="checkbox"`
|
|
130
|
+
sin `aria-label` propio: pelado, ponle `aria-label="…"` o un `<label>` que lo envuelva.
|
|
131
|
+
- **`checked` es model; `indeterminate` es input.** Hay `[(checked)]` pero no `[(indeterminate)]`,
|
|
132
|
+
y el componente **no limpia el guion solo** al tocarlo: mientras `indeterminate` siga en `true`
|
|
133
|
+
se ve el guion aunque cambie `checked`.
|
|
134
|
+
- El relleno marcado es el `primary` del proyecto (naranja), no el azul del Figma de origen.
|
|
135
|
+
- Espacio **y** Enter lo marcan (un checkbox nativo solo responde a Espacio).
|
|
136
|
+
- El tilde es un SVG dibujado a mano: no se cambia el ícono.
|
|
137
|
+
- Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
|
|
138
|
+
|
|
139
|
+
## Ejemplo
|
|
140
|
+
|
|
141
|
+
```html
|
|
142
|
+
<!-- Pelado, el texto vive en la fila (celda de tabla, fila propia) -->
|
|
143
|
+
<sui-checkbox [size]="bp.controlSize()" [(checked)]="seleccionado" aria-label="Elegir pedido" />
|
|
144
|
+
|
|
145
|
+
<!-- Con texto: usa sui-checkbox-label, no esto a mano -->
|
|
146
|
+
<sui-checkbox-label label="Gestionar productos" [(active)]="puedeProductos" />
|
|
147
|
+
```
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-checkbox-label
|
|
3
|
+
selector: sui-checkbox-label
|
|
4
|
+
resumen: Casilla con su texto (y opcionalmente descripción, badge y link) para opciones que se suman
|
|
5
|
+
alternativas: [sui-checkbox (la casilla sola, el texto vive en otra parte), sui-checkbox-card (cada opción es una tarjeta), sui-switch-label (se aplica al instante), sui-radio-label (una sola opción)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-checkbox-label
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Checkbox, Radio & Switch/Checkbox Label](https://sui-design-system.web.app/?path=/docs/atoms-checkbox-radio-switch-checkbox-label--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para toda casilla que tiene texto al lado: «Acepto los términos», cada permiso de un
|
|
15
|
+
miembro del equipo, cada categoría de una lista. Toda la fila es clicable y se enchufa a un
|
|
16
|
+
formulario. **Pendiente de decisión:** no tiene `size` (20 px), así que en una pantalla nueva de
|
|
17
|
+
mobile choca con la regla de controles grandes; hasta que el DS le sume `size`, en mobile
|
|
18
|
+
`sui-checkbox-card` es la salida grande.
|
|
19
|
+
|
|
20
|
+
**No lo uses** para:
|
|
21
|
+
|
|
22
|
+
- Prender algo que se aplica ya, sin botón de guardar: `sui-switch-label`.
|
|
23
|
+
- Elegir una sola opción: `sui-radio-label`.
|
|
24
|
+
- Opciones con peso propio (ícono o logo, descripción larga, borde): `sui-checkbox-card`.
|
|
25
|
+
- Listas de 10+ palabras sueltas (talles, etiquetas): se vuelve un muro; ahí va una grilla de
|
|
26
|
+
`sui-checkbox` pelados o chips, como los de la calificación del pedido.
|
|
27
|
+
|
|
28
|
+
Regla corta: **casilla con texto → este · casilla sin texto → `sui-checkbox` · opción con peso → card.**
|
|
29
|
+
|
|
30
|
+
## Qué variante usar
|
|
31
|
+
|
|
32
|
+
> **La guía del DS muestra las piezas, no cuándo usarlas.** Su ejemplo «con label avanzado»
|
|
33
|
+
> arma Label + (Sublabel) + badge «NEW» + descripción + Link Button, y la variante invertida
|
|
34
|
+
> (casilla a la derecha). No trae do/don't. Lo marcado «según la guía del DS» sale de ese ejemplo.
|
|
35
|
+
>
|
|
36
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas, misma lista
|
|
37
|
+
> de exclusión que `sui-badge`): **0 usos**. Hay **5 casillas armadas a mano** que deberían ser
|
|
38
|
+
> este componente (ver abajo).
|
|
39
|
+
|
|
40
|
+
### Las piezas
|
|
41
|
+
|
|
42
|
+
| prop | cuándo | fuente |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| `label` | Siempre. Qué se marca, en una a tres palabras («Gestionar productos»). | según la guía del DS (pieza); largo según `docs/CANON-SUI.md` §5.4 |
|
|
45
|
+
| `sublabel` | Una precisión corta entre paréntesis: «(opcional)», «(12)». Va con paréntesis en el texto: el componente no los pone. | según la guía del DS («Label(Sublabel)») |
|
|
46
|
+
| `description` | Cuando la opción necesita una frase que explique qué pasa si se marca («Recibe un correo cada vez que entra un pedido»). Pasa el label a peso medio. | según la guía del DS (pieza); el «cuándo» es propuesta |
|
|
47
|
+
| `badge` | Solo para algo **nuevo** («Nuevo», en `purple` como el badge de novedad). Con string sale naranja `light`: pásale el objeto. | según la guía del DS (pieza «NEW»); el color es propuesta |
|
|
48
|
+
| `link` | Un «Ver detalle» que abre más información sin marcar la casilla. **Solo se ve si hay `description`.** | según la guía del DS (pieza «Link Button») |
|
|
49
|
+
| `flip` | No usar en formularios: la casilla va a la izquierda, como en la guía. | propuesta, falta aprobación |
|
|
50
|
+
| `indeterminate` | El «seleccionar todo» de un grupo, cuando hay algunas marcadas. Hoy no usar (ver abajo). | propuesta, falta aprobación |
|
|
51
|
+
| `disabled` | La opción existe pero no se puede tocar ahora; decir por qué en la descripción. | según la guía del DS |
|
|
52
|
+
| `size` | `medium` (default, Figma): casilla 20, label 14/20. `large`: casilla 24, label 16/24. `xlarge`: casilla 28, label 16/24. En large y xlarge el sublabel y la descripción pasan a 14/20, el badge sin `size` propio sube a `medium` / `large` y el link a `medium`. Se usa con `[size]="bp.controlSize()"`. | `medium`: según la guía del DS · `large` / `xlarge`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
53
|
+
|
|
54
|
+
**Usos de hoy que deberían ser este componente (5):**
|
|
55
|
+
|
|
56
|
+
- **4 `sui-checkbox` + `<label>` a mano:** `pages/settings/team/team.html:225` y `:294`
|
|
57
|
+
(permisos), `components/option-sections-manager/option-sections-manager.html:188` y `:210`.
|
|
58
|
+
- **1 nativo:** `pages/sales-channels/facebook/facebook.html:69`.
|
|
59
|
+
|
|
60
|
+
**Antes de migrarlos:** los 4 de `sui-checkbox` hoy están en 24/28 px (`bp.controlSize()`,
|
|
61
|
+
regla de controles grandes del dueño, 28-09-2026). Desde el 03-10-2026 el label tiene `size`
|
|
62
|
+
(`large` 24 / `xlarge` 28): al migrar se le pasa `[size]="bp.controlSize()"` y no se achican.
|
|
63
|
+
|
|
64
|
+
## Tamaño en mobile y en web
|
|
65
|
+
|
|
66
|
+
En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
|
|
67
|
+
va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
|
|
68
|
+
(`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px); para controles,
|
|
69
|
+
`bp.controlSize()` devuelve `xlarge` en mobile y `large` en web (regla de controles grandes del
|
|
70
|
+
dueño, 28-09-2026).
|
|
71
|
+
|
|
72
|
+
| uso | mobile | web | fuente |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| casilla con texto en un formulario | `xlarge` (casilla 28, label 16/24) | `large` (casilla 24, label 16/24) | canon (aprobado por el dueño, 03-10-2026) |
|
|
75
|
+
| lista densa de desktop (tabla, filtros) | — | `medium` (casilla 20, label 14/20) | propuesta, falta aprobación |
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<sui-checkbox-label [size]="bp.controlSize()" label="Recordar mi dirección" [(active)]="recordar" />
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Toda la fila se toca (el host recibe el click), así que el área táctil es la fila entera, no solo
|
|
82
|
+
la casilla. Con `xlarge` el contenido baja 2 px para que la línea del label (24) quede centrada
|
|
83
|
+
con la casilla (28).
|
|
84
|
+
|
|
85
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
86
|
+
|
|
87
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| `flip` | en un formulario la casilla va a la izquierda; a la derecha se confunde con un switch | una lista de ajustes donde las demás filas son switches a la derecha y una sola es casilla |
|
|
90
|
+
| `badge` | ninguna opción marcable es nueva hoy | una opción recién agregada («Nuevo») en un formulario que el usuario ya conoce |
|
|
91
|
+
| `link` | ninguna opción necesita abrir detalle | «Acepto los términos» con su «Ver términos» (con `description`) |
|
|
92
|
+
| `indeterminate` | ninguna lista tiene «seleccionar todo» | el «Todos los permisos» arriba de la lista de permisos del equipo |
|
|
93
|
+
|
|
94
|
+
## API
|
|
95
|
+
|
|
96
|
+
<!-- api:inicio -->
|
|
97
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
98
|
+
|
|
99
|
+
| input | tipo | default |
|
|
100
|
+
|---|---|---|
|
|
101
|
+
| `label` | `string` | `''` |
|
|
102
|
+
| `sublabel` | `string \| null` | `null` |
|
|
103
|
+
| `description` | `string \| null` | `null` |
|
|
104
|
+
| `badge` | `SuiBadgeConfig \| string \| null` | `null` |
|
|
105
|
+
| `link` | `SuiLinkConfig \| string \| null` | `null` |
|
|
106
|
+
| `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
107
|
+
| `flip` | `boolean` | `false` |
|
|
108
|
+
| `disabled` | `boolean` | `false` |
|
|
109
|
+
| `indeterminate` | `boolean` | `false` |
|
|
110
|
+
| `active` · model, `[(active)]` | `boolean` | `false` |
|
|
111
|
+
|
|
112
|
+
| output | payload |
|
|
113
|
+
|---|---|
|
|
114
|
+
| `linkClick` | `MouseEvent` |
|
|
115
|
+
<!-- api:fin -->
|
|
116
|
+
|
|
117
|
+
Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
|
|
118
|
+
|
|
119
|
+
## Trampas
|
|
120
|
+
|
|
121
|
+
- **El estado se llama `active`, no `checked`.** `[(checked)]` aquí no existe.
|
|
122
|
+
- **No tiene `size`**: la casilla siempre mide 20 px.
|
|
123
|
+
- **`link` solo se dibuja si hay `description`.** Sin descripción desaparece sin avisar.
|
|
124
|
+
- **`description` cambia el label de peso** (regular → medio) y abre el bloque en columna.
|
|
125
|
+
- El badge con string sale **naranja `light`**; en `sui-checkbox-card` el default es azul.
|
|
126
|
+
Pasa `{ label, color, variant }` para que combinen.
|
|
127
|
+
- `link` con `href` es un `<a>` real; con `target: '_blank'` agrega `rel="noopener noreferrer"`.
|
|
128
|
+
Sin `href`, emite `linkClick` y no marca la casilla.
|
|
129
|
+
- `flip` cambia el orden con CSS `order`: el lector de pantalla y el Tab siguen viendo la casilla primero.
|
|
130
|
+
- Deshabilitado baja la opacidad del bloque a 0.5 (convención del proyecto).
|
|
131
|
+
|
|
132
|
+
## Ejemplo
|
|
133
|
+
|
|
134
|
+
```html
|
|
135
|
+
<sui-checkbox-label label="Gestionar productos" [(active)]="permisos.productos" />
|
|
136
|
+
|
|
137
|
+
<sui-checkbox-label
|
|
138
|
+
label="Avisarme por correo"
|
|
139
|
+
sublabel="(opcional)"
|
|
140
|
+
description="Te escribimos cuando entra un pedido nuevo."
|
|
141
|
+
[link]="{ label: 'Ver ejemplo', href: '/ayuda/correos', target: '_blank' }"
|
|
142
|
+
formControlName="avisoCorreo" />
|
|
143
|
+
```
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-circular-progress-bar
|
|
3
|
+
selector: sui-circular-progress-bar
|
|
4
|
+
resumen: El avance de algo en un anillo, para cuando cabe en un cuadrado al lado de un título
|
|
5
|
+
alternativas: [sui-progress-bar-label (barra con título y número, cuando hay ancho), sui-progress-bar (barra pelada)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-circular-progress-bar
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Progress/Circular Progress Bar](https://sui-design-system.web.app/?path=/docs/atoms-progress-circular-progress-bar--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** cuando el avance tiene que entrar en **un cuadrado al lado de un título**, como un
|
|
15
|
+
avatar: «Perfil 60 % completo» en el onboarding, los documentos al día de un repartidor, la meta
|
|
16
|
+
del día en una card chica.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- Un avance con título y descripción, si hay ancho: `sui-progress-bar-label` se lee más rápido.
|
|
21
|
+
- Varios avances en una lista: barras, que se comparan a simple vista; los anillos no.
|
|
22
|
+
- Una espera sin porcentaje: un spinner.
|
|
23
|
+
|
|
24
|
+
## Qué variante usar
|
|
25
|
+
|
|
26
|
+
> **En la guía del DS se llama «Progress Circle»** («un gráfico simple para mostrar qué tan
|
|
27
|
+
> completo está algo»). Trae cinco tamaños (80, 72, 64, 56 y 48; default 80), `value` y `max`,
|
|
28
|
+
> y **un solo color** (el primario del DS, que en SUI es el azul de información). No dice cuándo
|
|
29
|
+
> usar cada tamaño. Lo marcado «según la guía del DS» sale de ahí; el resto es **propuesta,
|
|
30
|
+
> falta aprobación**.
|
|
31
|
+
>
|
|
32
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**, sin contar prototipos ni
|
|
33
|
+
> vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
|
|
34
|
+
> `master-rutina`, `master-medico`, `master-ejercicios`, `dev-index`).
|
|
35
|
+
|
|
36
|
+
### `size`
|
|
37
|
+
|
|
38
|
+
| size | número al centro | cuándo | fuente |
|
|
39
|
+
|---|---|---|---|
|
|
40
|
+
| `48` | no (solo el anillo) | Junto a un texto que ya dice el porcentaje. | según la guía del DS |
|
|
41
|
+
| `56` | sí, 12 px | Web: en una fila o una card. | según la guía del DS (tamaño) · propuesta (cuándo) |
|
|
42
|
+
| `64` (default SUI) | sí, 14 px | Mobile: en una fila o una card. | según la guía del DS (tamaño) · propuesta (cuándo) |
|
|
43
|
+
| `72` | sí, 14 px | Web: lo principal de la pantalla. | según la guía del DS (tamaño) · propuesta (cuándo) |
|
|
44
|
+
| `80` (default de la guía) | sí, 14 px | Mobile: lo principal de la pantalla. | según la guía del DS (tamaño) · propuesta (cuándo) |
|
|
45
|
+
|
|
46
|
+
### `color` — misma regla que `sui-progress-bar`
|
|
47
|
+
|
|
48
|
+
| color | cuándo | fuente |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `blue` (default) | Avance neutro: perfil completado, pasos. | según la guía del DS (su único color) |
|
|
51
|
+
| `green` | Se cumplió o va bien: documentos al día. | propuesta, falta aprobación |
|
|
52
|
+
| `orange` | Va en curso y pide atención: meta del día a medias. | propuesta, falta aprobación |
|
|
53
|
+
| `red` | Se perdió o se acabó: meta perdida. | propuesta, falta aprobación |
|
|
54
|
+
| `purple` | **No usar** (ver abajo). | propuesta, falta aprobación |
|
|
55
|
+
|
|
56
|
+
### El resto
|
|
57
|
+
|
|
58
|
+
| propiedad | valor | cuándo | fuente |
|
|
59
|
+
|---|---|---|---|
|
|
60
|
+
| `number` | `true` (default) | Lo normal: el porcentaje al centro. | según la guía del DS |
|
|
61
|
+
| `number` | `false` | El texto de al lado ya dice el número. | propuesta, falta aprobación |
|
|
62
|
+
| `strokeWidth` | número | **No usar** (ver abajo). | propuesta, falta aprobación |
|
|
63
|
+
| `ariaLabel` | texto | Siempre: lo que mide («Perfil completado»). | propuesta, falta aprobación |
|
|
64
|
+
|
|
65
|
+
Usos de hoy que rompen la regla: **0** (no hay usos).
|
|
66
|
+
|
|
67
|
+
## No usar: por qué no hoy y cuándo sí
|
|
68
|
+
|
|
69
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| El componente entero (0 usos) | Los avances de hoy tienen ancho para una barra con título. | «Perfil 60 % completo» en el onboarding del repartidor o del local. |
|
|
72
|
+
| `color="purple"` | Extensión SUI sin caso, igual que en la barra. | El avance de una función en prueba. |
|
|
73
|
+
| `strokeWidth` | El grosor por tamaño ya sale de la guía (8 % del diámetro; 14 % en 48). | Ninguno: si hace falta otro grosor, se pide al DS. |
|
|
74
|
+
|
|
75
|
+
## Tamaño en mobile y en web
|
|
76
|
+
|
|
77
|
+
Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
|
|
78
|
+
(desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
|
|
79
|
+
en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
|
|
80
|
+
de la app.
|
|
81
|
+
|
|
82
|
+
| uso | mobile | web | fuente |
|
|
83
|
+
|---|---|---|---|
|
|
84
|
+
| Junto a un texto que ya dice el número | `48` | `48` | propuesta, falta aprobación |
|
|
85
|
+
| En una fila o card | `64` | `56` | propuesta, falta aprobación |
|
|
86
|
+
| Lo principal de la pantalla | `80` | `72` | propuesta, falta aprobación |
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<sui-circular-progress-bar [value]="60" [size]="bp.isMobile() ? 64 : 56" ariaLabel="Perfil completado" />
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`size` es un número: el ternario devuelve `64 : 56`, no `'64' : '56'`.
|
|
97
|
+
|
|
98
|
+
## API
|
|
99
|
+
|
|
100
|
+
<!-- api:inicio -->
|
|
101
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
102
|
+
|
|
103
|
+
| input | tipo | default |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `value` | `number` | `0` |
|
|
106
|
+
| `size` | `48 \| 56 \| 64 \| 72 \| 80` | `64` |
|
|
107
|
+
| `color` | `'blue' \| 'green' \| 'orange' \| 'red' \| 'purple'` | `'blue'` |
|
|
108
|
+
| `number` | `boolean` | `true` |
|
|
109
|
+
| `strokeWidth` | `number \| null` | `null` |
|
|
110
|
+
| `ariaLabel` | `string \| null` | `null` |
|
|
111
|
+
|
|
112
|
+
Outputs: ninguno.
|
|
113
|
+
<!-- api:fin -->
|
|
114
|
+
|
|
115
|
+
## Trampas
|
|
116
|
+
|
|
117
|
+
- **`size` es un número, no un texto**: `[size]="64"`, no `size="64"` (un string no tipa).
|
|
118
|
+
- **En 48 no hay número**, aunque `number` sea `true`.
|
|
119
|
+
- **No hay `max`**: `value` es un porcentaje de 0 a 100.
|
|
120
|
+
- El default de SUI es **64**; el de la guía, **80**.
|
|
121
|
+
- El porcentaje se redondea a entero.
|
|
122
|
+
- El azul es `--sui-state-information-base`, no el naranja de `--sui-primary-base`.
|
|
123
|
+
|
|
124
|
+
## Ejemplo
|
|
125
|
+
|
|
126
|
+
```html
|
|
127
|
+
<div class="perfil">
|
|
128
|
+
<sui-circular-progress-bar [value]="60" [size]="56" ariaLabel="Perfil completado" />
|
|
129
|
+
<span>Completa tu perfil para empezar a repartir</span>
|
|
130
|
+
</div>
|
|
131
|
+
```
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-color-dot
|
|
3
|
+
selector: sui-color-dot
|
|
4
|
+
resumen: Una opción de color para elegir (o mostrar el color elegido); no es un punto de estado
|
|
5
|
+
alternativas: [sui-color-picker (el selector completo, con hex propio), sui-badge type="with-dot" (punto de estado vivo), sui-status-badge withDot (punto de estado de un ciclo)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-color-dot
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Color/Color Dot](https://sui-design-system.web.app/?path=/docs/atoms-color-color-dot--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para que la persona **elija un color** de una fila de opciones, o para mostrar el color
|
|
15
|
+
que ya eligió: el color de una variante de producto («Rojo vino»), el color de una etiqueta. Es
|
|
16
|
+
un `<button role="radio">`: se toca.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- **Un estado** (en línea, abierto, pendiente): el color del dot es el color literal, sin
|
|
21
|
+
significado. Va `sui-badge type="with-dot"` o `sui-status-badge [withDot]="true"`, que pintan
|
|
22
|
+
con los tokens de estado.
|
|
23
|
+
- Un punto decorativo o una leyenda de gráfico: un `<span>` con el token del color.
|
|
24
|
+
- Elegir un color que no está en los 10: `sui-color-picker` (que usa este dot por dentro).
|
|
25
|
+
|
|
26
|
+
## Qué variante usar
|
|
27
|
+
|
|
28
|
+
> **En la guía del DS es la fila «Recommended Colors» del selector de color**: muestras para
|
|
29
|
+
> elegir un color recomendado. No dice cuándo usar cada estado. Lo marcado «según la guía del
|
|
30
|
+
> DS» sale de ahí; el resto es **propuesta, falta aprobación**.
|
|
31
|
+
>
|
|
32
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**, sin contar prototipos ni
|
|
33
|
+
> vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
|
|
34
|
+
> `master-rutina`, `master-medico`, `master-ejercicios`, `dev-index`). Candidato:
|
|
35
|
+
> `components/add-product-modal/add-product-modal.html:289` elige el color de una variante con
|
|
36
|
+
> `<input type="color">`, que abre un selector distinto en iOS, Android y escritorio.
|
|
37
|
+
|
|
38
|
+
| propiedad | valor | cuándo | fuente |
|
|
39
|
+
|---|---|---|---|
|
|
40
|
+
| `color` | los 10 (`gray`, `blue`, `orange`, `red`, `green`, `yellow`, `purple`, `sky`, `pink`, `teal`) | El color literal que se ofrece. **No significan nada**: son la paleta `-500`, no los tokens de estado del badge. Se ofrecen en ese orden. | según la guía del DS (colores recomendados) |
|
|
41
|
+
| `customHex` | `#rrggbb` | Un color exacto que no está en los 10 (el de una variante de producto). Pisa a `color`. | propuesta, falta aprobación |
|
|
42
|
+
| `state` | `default` | Opción disponible. | según la guía del DS |
|
|
43
|
+
| `state` | `selected` | El color elegido. Uno solo por fila; lo setea la pantalla. | según la guía del DS |
|
|
44
|
+
| `state` | `disabled` | Un color que no se puede elegir (agotado en esa variante). | propuesta, falta aprobación |
|
|
45
|
+
| `state` | `hover` | **No usar** (ver abajo). | propuesta, falta aprobación |
|
|
46
|
+
| `size` | `medium` (default) · `large` | `medium` 24 (Figma) en web; `large` 32 en mobile. En `large` el dot mide 22, 18 en hover y 16 seleccionado, con anillo de 24. | `medium`: según la guía del DS · `large`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
47
|
+
| `ariaLabel` | texto | El nombre del color para el lector de pantalla. Por default dice «Rojo», «Celeste»; con `customHex`, el hex. Con hex propio, pasar el nombre («Rojo vino»). | propuesta, falta aprobación |
|
|
48
|
+
|
|
49
|
+
Usos de hoy que rompen la regla: **0** (no hay usos).
|
|
50
|
+
|
|
51
|
+
## No usar: por qué no hoy y cuándo sí
|
|
52
|
+
|
|
53
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| El componente entero (0 usos) | La app no ofrece colores para elegir. | El color de una variante de producto en `add-product-modal`, en lugar del selector nativo. |
|
|
56
|
+
| `state="hover"` | El CSS ya lo pone al pasar el mouse. | Vitrinas y capturas del DS. |
|
|
57
|
+
|
|
58
|
+
## Tamaño en mobile y en web
|
|
59
|
+
|
|
60
|
+
Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
|
|
61
|
+
(desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
|
|
62
|
+
en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
|
|
63
|
+
de la app.
|
|
64
|
+
|
|
65
|
+
| uso | mobile | web | fuente |
|
|
66
|
+
|---|---|---|---|
|
|
67
|
+
| Cualquiera | `large` (32 × 32) | `medium` (24 × 24) | canon (aprobado por el dueño, 03-10-2026) |
|
|
68
|
+
| Separación entre dots | 12 px | 4 px | propuesta, falta aprobación |
|
|
69
|
+
|
|
70
|
+
```html
|
|
71
|
+
<sui-color-dot [color]="c" [size]="bp.isMobile() ? 'large' : 'medium'" [state]="c === elegido() ? 'selected' : 'default'" />
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
`large` mide 32, todavía por debajo de los 44 px del dedo: los 12 px de separación completan el
|
|
75
|
+
área para no tocar el vecino.
|
|
76
|
+
|
|
77
|
+
## API
|
|
78
|
+
|
|
79
|
+
<!-- api:inicio -->
|
|
80
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
81
|
+
|
|
82
|
+
| input | tipo | default |
|
|
83
|
+
|---|---|---|
|
|
84
|
+
| `color` | `'gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'sky' \| 'pink' \| 'teal'` | `'gray'` |
|
|
85
|
+
| `customHex` | `string \| null` | `null` |
|
|
86
|
+
| `state` | `'default' \| 'hover' \| 'selected' \| 'disabled'` | `'default'` |
|
|
87
|
+
| `size` | `'medium' \| 'large'` | `'medium'` |
|
|
88
|
+
| `ariaLabel` | `string` | `''` |
|
|
89
|
+
|
|
90
|
+
| output | payload |
|
|
91
|
+
|---|---|
|
|
92
|
+
| `clicked` | `void` |
|
|
93
|
+
<!-- api:fin -->
|
|
94
|
+
|
|
95
|
+
Output: `(clicked)`, solo si no está `disabled`. El dot no cambia su propio `state`: la pantalla
|
|
96
|
+
lo pasa a `selected`.
|
|
97
|
+
|
|
98
|
+
## Trampas
|
|
99
|
+
|
|
100
|
+
- **Es un botón**: dentro de otro botón o de un link, rompe el HTML y el foco.
|
|
101
|
+
- **El dot no se marca solo** al tocarlo: `(clicked)` avisa y la pantalla setea `state`.
|
|
102
|
+
- `disabled` pinta el dot gris claro, no el color atenuado.
|
|
103
|
+
- Con `customHex`, el `color` se ignora.
|
|
104
|
+
- `medium` mide 24 × 24 y `large` 32 × 32: los dos quedan por debajo de los 44 del dedo. En mobile va `large` con 12 px de separación entre dots.
|
|
105
|
+
|
|
106
|
+
## Ejemplo
|
|
107
|
+
|
|
108
|
+
```html
|
|
109
|
+
@for (c of colores; track c) {
|
|
110
|
+
<sui-color-dot [color]="c" [state]="c === elegido() ? 'selected' : 'default'" (clicked)="elegido.set(c)" />
|
|
111
|
+
}
|
|
112
|
+
```
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-color-picker
|
|
3
|
+
selector: sui-color-picker
|
|
4
|
+
resumen: Botón que abre un panel para elegir un color libre (espectro, matiz, hex) o uno de los recomendados
|
|
5
|
+
alternativas: [sui-color-dot (un punto de color, para armar una grilla propia), sui-select o sui-radio-card (el color es una categoría con nombre, no un color libre)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-color-picker
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Color/Color Picker](https://sui-design-system.web.app/?path=/docs/atoms-color-color-picker--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** cuando la persona tiene que **crear o elegir un color libre** y guardarlo como hex: el
|
|
15
|
+
color de una variante de producto («Rojo», «Azul marino» en una polera), el color de una etiqueta.
|
|
16
|
+
Se ve igual en iOS, Android y desktop porque no usa el selector del sistema.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- Elegir entre colores que son categorías con nombre (estados, tipos): `sui-select` o
|
|
21
|
+
`sui-radio-card`. El picker es para color **libre**.
|
|
22
|
+
- Una grilla fija de colores siempre visible, sin botón: arma la grilla con `sui-color-dot`.
|
|
23
|
+
- El selector nativo (`<input type="color">`): abre algo distinto en cada sistema.
|
|
24
|
+
|
|
25
|
+
Regla corta: **color libre que se guarda → color-picker · una de N categorías → select · grilla siempre a la vista → color-dot.**
|
|
26
|
+
|
|
27
|
+
## Qué variante usar
|
|
28
|
+
|
|
29
|
+
> **La guía del DS lo define para «elegir o crear colores específicos»** y lo muestra de dos
|
|
30
|
+
> formas: el panel a la vista y dentro de un popover con su botón («Pick Color»), con una
|
|
31
|
+
> sección de colores recomendados. No dice cuándo va cada pieza.
|
|
32
|
+
>
|
|
33
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
34
|
+
> **0 usos**. Hay **1 `<input type="color">` nativo** que es exactamente su caso.
|
|
35
|
+
|
|
36
|
+
### Las piezas
|
|
37
|
+
|
|
38
|
+
| prop | cuándo | fuente |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `value` | El hex guardado (`[(value)]`). Sin valor, el botón muestra el `placeholder`. | según la guía del DS (popover con botón) |
|
|
41
|
+
| `placeholder` | «Elegir color» (default). Cambiarlo solo si el campo dice qué color es («Color de la variante»). | propuesta, falta aprobación |
|
|
42
|
+
| `alpha` | **`false` por defecto en la app**: la base guarda 6 caracteres (`#rrggbb`). Con `true` (default del componente) puede emitir 8. | propuesta, falta aprobación |
|
|
43
|
+
| `colors` | Acotar los recomendados a los que tengan sentido para el caso. Default: los 10 de SUI. | según la guía del DS (sección «Recommended Colors») |
|
|
44
|
+
| `recommendedLabel` | «Colores recomendados» (default). | propuesta, falta aprobación |
|
|
45
|
+
| `presetsOnly` | Solo la grilla de recomendados, sin espectro ni hex: cuando el color tiene que salir de la paleta. | propuesta, falta aprobación |
|
|
46
|
+
| `eyedropper` | Dejar el default (`true`): solo aparece donde el navegador lo soporta (Chromium de escritorio). | propuesta, falta aprobación |
|
|
47
|
+
| `showFormatLabel` | `false`: el «Hex» con flecha es decorativo, no cambia de formato. | propuesta, falta aprobación |
|
|
48
|
+
| `disabled` | El campo existe pero no se puede tocar ahora. | propuesta, falta aprobación |
|
|
49
|
+
| `ariaLabel` | Siempre que el botón no tenga un label al lado que diga qué color es. | propuesta, falta aprobación |
|
|
50
|
+
|
|
51
|
+
**Usos de hoy que rompen la regla:**
|
|
52
|
+
|
|
53
|
+
- **1 nativo → `sui-color-picker` con `[alpha]="false"`:**
|
|
54
|
+
`components/add-product-modal/add-product-modal.html:293` (color de cada opción cuando el grupo
|
|
55
|
+
se muestra «como colores»; guarda `swatchHex` de 6 caracteres).
|
|
56
|
+
|
|
57
|
+
## Tamaño en mobile y en web
|
|
58
|
+
|
|
59
|
+
| uso | mobile | web |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| botón que abre el panel | 32 px de alto (no hay `size`) | 32 px |
|
|
62
|
+
|
|
63
|
+
**No tiene un tamaño grande para mobile.** El botón mide unos 32 px de alto y los puntos de
|
|
64
|
+
color del panel 24 px. En mobile funciona, pero queda debajo de los 44 px de área táctil.
|
|
65
|
+
Agrandarlo es una decisión del DS.
|
|
66
|
+
|
|
67
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
68
|
+
|
|
69
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `alpha` en `true` | el modelo de datos espera `#rrggbb`; con opacidad emite `#rrggbbaa` | un color de marca sobre imágenes donde la transparencia es parte del diseño (fondo de un banner) |
|
|
72
|
+
| `presetsOnly` | el único caso de hoy (colores de una variante) necesita colores libres | el color de una etiqueta interna con paleta cerrada |
|
|
73
|
+
| `showFormatLabel` en `true` | muestra «Hex» con una flecha que no hace nada | nunca, hasta que el DS soporte RGB o HSL |
|
|
74
|
+
|
|
75
|
+
## API
|
|
76
|
+
|
|
77
|
+
<!-- api:inicio -->
|
|
78
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
79
|
+
|
|
80
|
+
| input | tipo | default |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| `colors` | `readonly SuiColorDotColor[]` | `SUI_COLOR_DOT_COLORS` |
|
|
83
|
+
| `value` · model, `[(value)]` | `string \| null` | `null` |
|
|
84
|
+
| `placeholder` | `string` | `'Elegir color'` |
|
|
85
|
+
| `recommendedLabel` | `string` | `'Colores recomendados'` |
|
|
86
|
+
| `presetsOnly` | `boolean` | `false` |
|
|
87
|
+
| `alpha` | `boolean` | `true` |
|
|
88
|
+
| `eyedropper` | `boolean` | `true` |
|
|
89
|
+
| `showFormatLabel` | `boolean` | `true` |
|
|
90
|
+
| `disabled` | `boolean` | `false` |
|
|
91
|
+
| `ariaLabel` | `string` | `'Seleccionar color'` |
|
|
92
|
+
|
|
93
|
+
| output | payload |
|
|
94
|
+
|---|---|
|
|
95
|
+
| `change` | `string` |
|
|
96
|
+
<!-- api:fin -->
|
|
97
|
+
|
|
98
|
+
`SuiColorDotColor`: `'gray' | 'blue' | 'orange' | 'red' | 'green' | 'yellow' | 'purple' | 'sky' | 'pink' | 'teal'`.
|
|
99
|
+
|
|
100
|
+
## Trampas
|
|
101
|
+
|
|
102
|
+
- **`alpha` viene en `true`**: si la persona baja la opacidad, el valor pasa a 8 caracteres.
|
|
103
|
+
Pasa `[alpha]="false"` si lo guardas como `#rrggbb`.
|
|
104
|
+
- **El «Hex» con flecha es decorativo**: solo lee y emite hex.
|
|
105
|
+
- **El cuentagotas no aparece en iOS, Android, Safari ni Firefox**: no es un error.
|
|
106
|
+
- El hex escrito a mano se aplica al salir del campo o con Enter; si es inválido, vuelve al anterior
|
|
107
|
+
sin avisar.
|
|
108
|
+
- Acepta 3, 4, 6 u 8 caracteres con o sin `#`, y siempre emite con `#`.
|
|
109
|
+
- El botón muestra el nombre en español si el color es uno de los 10 («Naranja»); si no, el hex
|
|
110
|
+
en mayúsculas.
|
|
111
|
+
- Elegir un recomendado **cierra** el panel; arrastrar el espectro no.
|
|
112
|
+
- El panel vive en un overlay del CDK: escapa a cualquier `overflow: hidden` del contenedor.
|
|
113
|
+
- No implementa `ControlValueAccessor`: se usa con `[(value)]`.
|
|
114
|
+
|
|
115
|
+
## Ejemplo
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<sui-color-picker
|
|
119
|
+
[alpha]="false"
|
|
120
|
+
[showFormatLabel]="false"
|
|
121
|
+
placeholder="Color de la variante"
|
|
122
|
+
[value]="opcion.swatchHex ?? null"
|
|
123
|
+
(valueChange)="cambiarColor(opcion, $event)" />
|
|
124
|
+
```
|