@ajuarezso/sui-design-system 0.22.0 → 0.23.1
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 +8 -8
- package/docs/sui-accordion/README.md +2 -2
- package/docs/sui-activity-feed/README.md +1 -2
- package/docs/sui-alert/README.md +28 -19
- package/docs/sui-app-store-badge/README.md +5 -4
- package/docs/sui-avatar/README.md +16 -16
- package/docs/sui-avatar-group/README.md +4 -4
- package/docs/sui-badge/README.md +27 -9
- package/docs/sui-banner/README.md +10 -9
- package/docs/sui-brand-logo/README.md +3 -3
- package/docs/sui-breadcrumbs/README.md +1 -1
- package/docs/sui-button/README.md +48 -24
- package/docs/sui-button-group/README.md +6 -4
- package/docs/sui-button-group-item/README.md +3 -3
- package/docs/sui-card/README.md +17 -19
- package/docs/sui-chart-legend/README.md +8 -7
- package/docs/sui-checkbox/README.md +11 -6
- package/docs/sui-checkbox-card/README.md +24 -19
- package/docs/sui-checkbox-label/README.md +32 -10
- package/docs/sui-circular-progress-bar/README.md +2 -0
- package/docs/sui-color-dot/README.md +1 -1
- package/docs/sui-color-picker/README.md +22 -7
- package/docs/sui-command-menu-footer/README.md +8 -8
- package/docs/sui-command-menu-search/README.md +2 -2
- package/docs/sui-compact-avatar-group/README.md +4 -3
- package/docs/sui-compact-button/README.md +41 -44
- package/docs/sui-compact-select/README.md +9 -5
- package/docs/sui-compact-select-for-input/README.md +2 -2
- package/docs/sui-content-card/README.md +6 -5
- package/docs/sui-content-divider/README.md +4 -4
- package/docs/sui-content-label/README.md +11 -6
- package/docs/sui-counter-input/README.md +19 -18
- package/docs/sui-date-selector/README.md +16 -12
- package/docs/sui-datepicker/README.md +46 -32
- package/docs/sui-day-cell/README.md +17 -8
- package/docs/sui-day-label/README.md +2 -2
- package/docs/sui-divider/README.md +5 -5
- package/docs/sui-drawer-footer/README.md +19 -5
- package/docs/sui-dropdown-search/README.md +3 -3
- package/docs/sui-emoji/README.md +6 -6
- package/docs/sui-empty-state/README.md +13 -23
- package/docs/sui-fancy-button/README.md +24 -18
- package/docs/sui-file-icon/README.md +1 -1
- package/docs/sui-file-upload/README.md +3 -0
- package/docs/sui-file-upload-card/README.md +8 -7
- package/docs/sui-filter/README.md +5 -5
- package/docs/sui-flag/README.md +3 -2
- package/docs/sui-form-hint/README.md +12 -8
- package/docs/sui-form-label/README.md +11 -16
- package/docs/sui-icon/README.md +4 -3
- package/docs/sui-image-upload/README.md +28 -16
- package/docs/sui-inline-input/README.md +7 -6
- package/docs/sui-inline-select/README.md +8 -5
- package/docs/sui-input/README.md +26 -35
- package/docs/sui-integration-switch/README.md +14 -7
- package/docs/sui-kbd/README.md +4 -4
- package/docs/sui-key-icon/README.md +6 -2
- package/docs/sui-link-button/README.md +21 -17
- package/docs/sui-modal-footer/README.md +1 -1
- package/docs/sui-notification/README.md +8 -6
- package/docs/sui-notification-footer/README.md +2 -2
- package/docs/sui-notification-tab-menu/README.md +5 -3
- package/docs/sui-pagination/README.md +8 -5
- package/docs/sui-password-strength/README.md +1 -1
- package/docs/sui-period-range/README.md +18 -14
- package/docs/sui-popover/README.md +13 -7
- package/docs/sui-product-card/README.md +14 -10
- package/docs/sui-progress-bar/README.md +4 -2
- package/docs/sui-progress-bar-label/README.md +2 -0
- package/docs/sui-radio/README.md +14 -7
- package/docs/sui-radio-card/README.md +12 -12
- package/docs/sui-radio-label/README.md +36 -11
- package/docs/sui-rating/README.md +28 -9
- package/docs/sui-rich-editor/README.md +3 -3
- package/docs/sui-segmented-control/README.md +32 -21
- package/docs/sui-select/README.md +35 -31
- package/docs/sui-sidebar/README.md +1 -2
- package/docs/sui-slider/README.md +7 -0
- package/docs/sui-social-button/README.md +24 -11
- package/docs/sui-status-badge/README.md +7 -3
- package/docs/sui-stepper/README.md +30 -17
- package/docs/sui-store-card/README.md +9 -4
- package/docs/sui-switch/README.md +16 -11
- package/docs/sui-switch-card/README.md +18 -16
- package/docs/sui-switch-label/README.md +22 -11
- package/docs/sui-tab-chips/README.md +55 -41
- package/docs/sui-tab-menu-horizontal/README.md +19 -11
- package/docs/sui-tab-menu-vertical/README.md +10 -5
- package/docs/sui-tag/README.md +25 -11
- package/docs/sui-tag-input/README.md +24 -14
- package/docs/sui-textarea/README.md +21 -21
- package/docs/sui-time-picker/README.md +38 -32
- package/docs/sui-toast/README.md +27 -22
- package/docs/sui-tooltip/README.md +14 -17
- package/docs/sui-topbar-button/README.md +2 -2
- package/fesm2022/ajuarezso-sui-design-system.mjs +1071 -240
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +601 -267
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: sui-button
|
|
3
3
|
selector: sui-button
|
|
4
4
|
resumen: Botón base para que la persona dispare una acción
|
|
5
|
-
alternativas: [sui-link-button (acción que se lee como texto), sui-compact-button (ícono de 20-
|
|
5
|
+
alternativas: [sui-link-button (acción que se lee como texto), sui-compact-button (ícono de 20-40 px en filas y barras), sui-fancy-button (el CTA héroe), sui-social-button (entrar con Google/Apple), sui-button-group (opciones que se ven como un solo control)]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# sui-button
|
|
@@ -18,7 +18,7 @@ una fila o barra apretada (`sui-compact-button`), es login con una marca (`sui-s
|
|
|
18
18
|
**No lo uses** para:
|
|
19
19
|
|
|
20
20
|
- Navegar sin acción: un `<a>` o `sui-link-button` con `href`.
|
|
21
|
-
- Prender/apagar algo: `sui-switch
|
|
21
|
+
- Prender/apagar algo: `sui-switch`. Elegir varias opciones cortas a la vez: `sui-button-group`.
|
|
22
22
|
- Mostrar carga: **no tiene `loading`**. Pon un spinner en `[data-slot=start]` y `disabled`.
|
|
23
23
|
|
|
24
24
|
## Qué variante usar
|
|
@@ -28,8 +28,9 @@ El botón tiene dos ejes: `variant` (el peso: cuánto llama la atención) y `col
|
|
|
28
28
|
|
|
29
29
|
> **La guía del DS no dice cuándo usar cada variante ni cada color.** Su página del botón
|
|
30
30
|
> muestra las 12 combinaciones, los tamaños, el estado deshabilitado y la API; no trae
|
|
31
|
-
> do/don't ni jerarquía.
|
|
32
|
-
>
|
|
31
|
+
> do/don't ni jerarquía. La tabla de variantes de abajo es **canon (aprobado por el dueño,
|
|
32
|
+
> 03-10-2026)** sobre la base que ya fijaba `sui-modal-footer`; solo `ghost` `primary` queda a
|
|
33
|
+
> discutir.
|
|
33
34
|
>
|
|
34
35
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: 397 botones, sin contar prototipos ni
|
|
35
36
|
> vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `master-rutina`,
|
|
@@ -45,8 +46,9 @@ El botón tiene dos ejes: `variant` (el peso: cuánto llama la atención) y `col
|
|
|
45
46
|
- **Hermanos**: `sui-link-button` es la acción que se integra en un texto; `sui-compact-button`,
|
|
46
47
|
la de cuando falta espacio; `sui-button-group`, botones pegados en una sola línea;
|
|
47
48
|
`sui-fancy-button`, el mismo botón con un acabado más vistoso.
|
|
48
|
-
- **Dentro de un alert la acción
|
|
49
|
-
`sui-
|
|
49
|
+
- **Dentro de un alert la acción va en `actions[]` del alert** (links), nunca un `sui-button`
|
|
50
|
+
proyectado, tampoco `lighter` (canon, dueño 04-10-2026; ver `sui-alert`). Hoy hay 5 `sui-button`
|
|
51
|
+
proyectados en alerts por migrar.
|
|
50
52
|
|
|
51
53
|
La base de la jerarquía no se inventa: la fija **`sui-modal-footer`**, que ya está en el DS y la
|
|
52
54
|
usa toda la app. Ahí el secundario está fijo en `stroke` + `neutral`, el primario es `filled`, y
|
|
@@ -55,23 +57,23 @@ cualquier grupo de botones.
|
|
|
55
57
|
|
|
56
58
|
| variant + color | cuándo | ejemplo real de la app | fuente |
|
|
57
59
|
|---|---|---|---|
|
|
58
|
-
| `filled` `primary` (default) | **La** acción principal del grupo. Una sola por grupo visible: dos `filled` juntos = ninguno es principal. | `pages/orders/orders.html:236` («Aceptar pedido») · `pages/customer/cart/cart.html:
|
|
59
|
-
| `stroke` `neutral` | Toda acción secundaria: Cancelar, Volver, Editar, Ver detalle. Va a la izquierda del primario. | `pages/orders/orders.html:320` («Encargarme yo») · `pages/envios/envios.html:
|
|
60
|
-
| `filled` `error` | **Confirmar** algo destructivo: el último paso, dentro de la confirmación. Nunca el botón que abre la confirmación. | `pages/customer/order-history/order-history.html:
|
|
60
|
+
| `filled` `primary` (default) | **La** acción principal del grupo. Una sola por grupo visible: dos `filled` juntos = ninguno es principal. | `pages/orders/orders.html:236` («Aceptar pedido») · `pages/customer/cart/cart.html:196` («Continuar») | ya es canon (sui-modal-footer) |
|
|
61
|
+
| `stroke` `neutral` | Toda acción secundaria: Cancelar, Volver, Editar, Ver detalle. Va a la izquierda del primario. | `pages/orders/orders.html:320` («Encargarme yo») · `pages/envios/envios.html:177` («Ver seguimiento») | ya es canon (sui-modal-footer) |
|
|
62
|
+
| `filled` `error` | **Confirmar** algo destructivo: el último paso, dentro de la confirmación. Nunca el botón que abre la confirmación. | `pages/customer/order-history/order-history.html:133` («Sí», confirma cancelar) | canon (aprobado por el dueño, 03-10-2026) |
|
|
61
63
|
| `stroke` `error` | **Abrir** una acción destructiva (lleva a la confirmación) o el «Rechazar» de un par Aprobar/Rechazar. | `pages/customer/about/about.html:76` («Eliminar cuenta») · `pages/super-admin/master-approvals/master-approvals.html:99` («Rechazar») | canon (aprobado por el dueño, 03-10-2026) |
|
|
62
|
-
| `ghost` `neutral` / `ghost` `error` | Acción terciaria sin caja: íconos de editar/borrar en filas, «Cerrar», acciones de baja jerarquía en zonas densas. | `pages/super-admin/master-gastos/master-gastos.html:80` (editar) · `pages/customer/cart/cart.html:107` («Vaciar carrito») | canon (aprobado por el dueño, 03-10-2026) |
|
|
63
|
-
| `filled` `neutral` | Salir a otra app: WhatsApp, abrir el mapa. Es la práctica de hoy (21 usos, 13 de WhatsApp), no un principio: **falta criterio**. | `pages/driver/driver-order-detail/driver-order-detail.html:
|
|
64
|
+
| `ghost` `neutral` / `ghost` `error` | Acción terciaria sin caja: íconos de editar/borrar en filas, «Cerrar», acciones de baja jerarquía en zonas densas. Vale igual en `sui-compact-button`. | `pages/super-admin/master-gastos/master-gastos.html:80` (editar) · `pages/customer/cart/cart.html:107` («Vaciar carrito») | canon (aprobado por el dueño, 03-10-2026) · ghost en filas también en compact-button: canon (dueño, 04-10-2026) |
|
|
65
|
+
| `filled` `neutral` | Salir a otra app: WhatsApp, abrir el mapa. Es la práctica de hoy (21 usos, 13 de WhatsApp), no un principio: **falta criterio**. | `pages/driver/driver-order-detail/driver-order-detail.html:534` («WhatsApp») · `:589` («Abrir mapa») | canon (aprobado por el dueño, 03-10-2026) |
|
|
64
66
|
| `ghost` `primary` | «Ver todas», «Reporte», «Detalles» en la cabecera de una card. **A discutir**: se pisa con `sui-link-button`, que según la guía es la acción que se lee como texto. | `pages/overview/components/overview-sales/overview-sales.html:5` | a discutir |
|
|
65
67
|
| `stroke` `primary` | No usar. El secundario siempre es neutral. | — | canon (aprobado por el dueño, 03-10-2026) |
|
|
66
68
|
| `lighter` (cualquier color) | No usar en botones nuevos. En `neutral` su fondo (`bg-weak-50`) es **el mismo que el de `disabled`**: se lee como apagado. Lo existente pasa a `stroke` (secundaria) o `ghost` (terciaria). | — | canon (aprobado por el dueño, 03-10-2026) |
|
|
67
69
|
|
|
68
|
-
**Usos de hoy que
|
|
70
|
+
**Usos de hoy que rompen el canon** (sin prototipos):
|
|
69
71
|
|
|
70
72
|
- **13 `lighter` → `stroke` o `ghost`** (7 `neutral`, 5 `error`, 1 `primary`). Ejemplos:
|
|
71
|
-
`pages/mi-negocio/mi-negocio.html:
|
|
72
|
-
(«Quitar no disponibles»), `pages/customer/order-tracking/order-tracking.html:
|
|
73
|
+
`pages/mi-negocio/mi-negocio.html:135` («Cambiar plan»), `pages/customer/cart/cart.html:31`
|
|
74
|
+
(«Quitar no disponibles»), `pages/customer/order-tracking/order-tracking.html:740` («Cancelar
|
|
73
75
|
pedido», `lighter error` → `stroke error`). 4 de los 13 son los que viven dentro de un alert
|
|
74
|
-
(`pages/overview/overview.html:
|
|
76
|
+
(`pages/overview/overview.html:39`, `pages/mi-negocio/mi-negocio.html:383`, `cart.html:31`,
|
|
75
77
|
`pages/role-selector/role-selector.html:59`): ahí la salida correcta es `actions[]` del alert.
|
|
76
78
|
- **7 `stroke primary` → `stroke neutral`.** Ejemplos: `pages/customer/checkout/checkout.html:117`
|
|
77
79
|
(«Agregar dirección de entrega»), `pages/customer/profile/profile.html:131`,
|
|
@@ -80,7 +82,7 @@ cualquier grupo de botones.
|
|
|
80
82
|
`pages/empresa/about/about.html:46` y `pages/repartidor/about/about.html:46` («Eliminar mi cuenta»
|
|
81
83
|
abre un modal → `stroke error`, como ya lo hace `pages/customer/about/about.html:76`);
|
|
82
84
|
`pages/driver/driver-dashboard/driver-dashboard.html:139` («Recargar S/ X para pagar»: urgente,
|
|
83
|
-
no destructivo → `filled primary`); `pages/super-admin/master-settings/master-settings.html:
|
|
85
|
+
no destructivo → `filled primary`); `pages/super-admin/master-settings/master-settings.html:725`
|
|
84
86
|
(«Salir» → `stroke neutral`). A discutir: `driver-dashboard.html:144` («Acepto y pago S/ X» de una
|
|
85
87
|
multa) — es dinero que sale, pero no borra nada.
|
|
86
88
|
- **7 `ghost primary` a discutir** (si se decide que son links): `components/product-categories/product-categories.html:17`,
|
|
@@ -91,7 +93,7 @@ cualquier grupo de botones.
|
|
|
91
93
|
|
|
92
94
|
### `size`
|
|
93
95
|
|
|
94
|
-
Uso
|
|
96
|
+
Uso medido el 04-10-2026: 123 `large`, 93 `small`, 58 `medium` (5 por default), 50 `xsmall`, 29 `2xsmall`, 44 dinámicos.
|
|
95
97
|
|
|
96
98
|
| size | cuándo | fuente |
|
|
97
99
|
|---|---|---|
|
|
@@ -112,7 +114,7 @@ flujo nuevo cae en la columna de la derecha, se usa (aprobado por el dueño, 03-
|
|
|
112
114
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
113
115
|
|---|---|---|
|
|
114
116
|
| `stroke` `primary` | el secundario es neutral; dos naranjas compiten por ser el principal | landings con dos CTA de marca sobre fondo oscuro |
|
|
115
|
-
| `lighter` (los 3 colores) | en `neutral` tiene el mismo fondo que `disabled`: parece apagado | botones
|
|
117
|
+
| `lighter` (los 3 colores) | en `neutral` tiene el mismo fondo que `disabled`: parece apagado | botones sobre un banner o una superficie teñida, donde `stroke` se ve pesado. **Dentro de un alert, nunca**: ahí van `actions[]` (canon, dueño 04-10-2026) |
|
|
116
118
|
| `ghost` `primary` | lo hace mejor `sui-link-button` `primary` («Ver todas») | una acción con ícono en una barra de herramientas donde todo va sin caja |
|
|
117
119
|
| `sui-social-button` Facebook, X, LinkedIn, GitHub, Dropbox | no hay login con esas cuentas | «Continuar con Facebook» o botones de compartir en redes |
|
|
118
120
|
| `sui-social-button` `onlyIcon` | Apple exige el texto en su botón de login | una fila de «compartir en» fuera del login |
|
|
@@ -124,21 +126,40 @@ flujo nuevo cae en la columna de la derecha, se usa (aprobado por el dueño, 03-
|
|
|
124
126
|
|
|
125
127
|
## Tamaño en mobile y en web
|
|
126
128
|
|
|
127
|
-
En mobile se toca con el dedo:
|
|
129
|
+
En mobile se toca con el dedo: **44 px como mínimo** (piso táctil, canon del dueño 04-10-2026) y 48
|
|
130
|
+
en la acción principal. En web, 28–40.
|
|
128
131
|
|
|
129
132
|
| uso | mobile | web | fuente |
|
|
130
133
|
|---|---|---|---|
|
|
131
134
|
| acción principal de la pantalla o footer de modal | `large` (48) | `medium` (40) | canon (aprobado por el dueño, 03-10-2026) (footer de modal siempre `large`) |
|
|
132
|
-
| acción dentro de una card o una fila | `
|
|
135
|
+
| acción dentro de una card o una fila | `large` (48) | `small` (36) / `xsmall` (32) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — antes `medium` (40), que no llega |
|
|
133
136
|
| acción en una tabla densa | — (no hay tablas en mobile) | `2xsmall` (28) | canon (aprobado por el dueño, 03-10-2026) |
|
|
134
137
|
| CTA de landing | `xlarge` (52) | `large` (48) | propuesta, falta aprobación |
|
|
135
138
|
|
|
136
|
-
Patrón (
|
|
139
|
+
Patrón (`bp` = `BreakpointsService`, mobile hasta 767 px). Medido el 04-10-2026: 9 `sui-button` con este
|
|
140
|
+
par exacto y 30 con algún tamaño por `bp`; en toda la app hay 142 `[size]` con este mismo par:
|
|
137
141
|
|
|
138
142
|
```html
|
|
139
143
|
<sui-button [size]="bp.isMobile() ? 'large' : 'medium'" …/>
|
|
140
144
|
```
|
|
141
145
|
|
|
146
|
+
### Piso táctil de 44 en el teléfono (canon, dueño 04-10-2026)
|
|
147
|
+
|
|
148
|
+
Todo lo que se toca con el dedo mide **44 px como mínimo en el teléfono** (≤767 px). Cómo se
|
|
149
|
+
cumple, sin cambiar nada de los sizes que ya existen:
|
|
150
|
+
|
|
151
|
+
- **Componente cuyo size mayor no llega a 44 → se le crea el size siguiente** de su escala:
|
|
152
|
+
`xlarge` si el tope era `large` (tab-chips 44), `2xlarge` si ya existía `xlarge`
|
|
153
|
+
(segmented-control 44, checkbox/radio/switch-label con fila de 44, rating 44), `5xlarge` en
|
|
154
|
+
compact-button (44). Los «botones con otro acabado» siguen a `sui-button`: fancy-button y
|
|
155
|
+
social-button suman `large` (48). El size nuevo sigue la regla de tamaños de abajo.
|
|
156
|
+
- **X de cierre y controles chicos** (X de alert, banner, toast, notification, content-card y tag;
|
|
157
|
+
puntos del stepper; lápiz/tacho de image-upload; clear y ojo de sui-input): el dibujo no cambia,
|
|
158
|
+
se amplía el **área** con un `::before` invisible de 44 solo en ≤767 px, sin pisar al vecino
|
|
159
|
+
(donde no entra a lo ancho, como los puntos del stepper, se agranda solo el alto).
|
|
160
|
+
- Un size existente que no llega (p. ej. `sui-button` `medium` 40) **no se agranda**: en el
|
|
161
|
+
teléfono se usa el size que sí llega.
|
|
162
|
+
|
|
142
163
|
### Regla de tamaños para todo el DS (aprobada por el dueño, 03-10-2026)
|
|
143
164
|
|
|
144
165
|
Vale para todos los componentes que tienen `size` `large` / `xlarge`:
|
|
@@ -151,9 +172,9 @@ Vale para todos los componentes que tienen `size` `large` / `xlarge`:
|
|
|
151
172
|
- **El texto secundario chico no cambia**: hints, contadores, sublabels y captions de 12.
|
|
152
173
|
- **Los íconos se quedan en 20.**
|
|
153
174
|
- Si la línea de 24 movería el alto medido, se baja el padding para que el alto total quede igual.
|
|
154
|
-
-
|
|
155
|
-
|
|
156
|
-
|
|
175
|
+
- **Excepción (canon, dueño 04-10-2026):** `sui-badge` mantiene su escala propia 12 / 14 / 16
|
|
176
|
+
(14 en `large`, 16 en `xlarge`), y los chips cuya escala arranca en 12 (`sui-tag`,
|
|
177
|
+
`sui-status-badge`) la siguen.
|
|
157
178
|
|
|
158
179
|
En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el botón ya usa Label/Medium 16/24
|
|
159
180
|
en esos dos tamaños.
|
|
@@ -196,6 +217,9 @@ interface SuiFooterButtonConfig {
|
|
|
196
217
|
- **No es un `<button>` nativo.** El host es `<sui-button role="button">`. `type="submit"`
|
|
197
218
|
funciona porque intercepta el clic y llama a `form.requestSubmit()` del `<form>` más cercano;
|
|
198
219
|
fuera de un `<form>` no hace nada.
|
|
220
|
+
- **Teclado como un `<button>` nativo** (desde el 04-10-2026): Enter dispara el `(click)` al
|
|
221
|
+
bajar la tecla y Espacio al soltarla, una sola vez aunque se mantenga apretada, y Espacio ya no
|
|
222
|
+
scrollea la página. Antes, con `type="button"` (el default), ninguna de las dos hacía nada.
|
|
199
223
|
- **El output no existe**: aquí es `(click)`. En `sui-link-button`, `sui-compact-button`,
|
|
200
224
|
`sui-fancy-button` y `sui-social-button` es `(clicked)`.
|
|
201
225
|
- **La prop de peso se llama distinto en cada hermano:** `variant` aquí, `variantStyle` en
|
|
@@ -82,8 +82,8 @@ atención de un local (L M M J V S D), filtros que se suman en una barra.
|
|
|
82
82
|
En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
|
|
83
83
|
va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
|
|
84
84
|
(`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px):
|
|
85
|
-
`[size]="bp.isMobile() ? 'large' : 'small'"
|
|
86
|
-
|
|
85
|
+
`[size]="bp.isMobile() ? 'large' : 'small'"`. Medido el 04-10-2026 en `master-pedidos`: 166 `[size]`
|
|
86
|
+
con `bp` (142 `large`/`medium`, 22 `large`/`small`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
|
|
87
87
|
|
|
88
88
|
Desde el 03-10-2026 el grupo tiene `large` (48) y `medium` (40), la misma escala de `sui-button`,
|
|
89
89
|
así que el par es el de toda la app.
|
|
@@ -100,8 +100,10 @@ así que el par es el de toda la app.
|
|
|
100
100
|
[size]="bp.isMobile() ? 'large' : 'small'" />
|
|
101
101
|
```
|
|
102
102
|
|
|
103
|
-
En mobile, cada opción
|
|
104
|
-
|
|
103
|
+
En mobile, cada opción va ancha (los 7 días repartidos en todo el ancho, no apretados a la
|
|
104
|
+
izquierda) — propuesta, falta aprobación. **El componente no lo hace solo**: el host es
|
|
105
|
+
`inline-flex` y no hay un input de ancho completo, así que hoy lo tendría que resolver quien lo usa
|
|
106
|
+
con CSS. Si las opciones no entran ni en `medium`, va una lista de `sui-checkbox`.
|
|
105
107
|
|
|
106
108
|
## «No usar»: por qué no hoy y cuándo sí
|
|
107
109
|
|
|
@@ -38,8 +38,8 @@ apagar algo suelto está `sui-switch`; para una acción, `sui-button`.
|
|
|
38
38
|
En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
|
|
39
39
|
va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
|
|
40
40
|
(`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px):
|
|
41
|
-
`[size]="bp.isMobile() ? 'large' : 'small'"
|
|
42
|
-
|
|
41
|
+
`[size]="bp.isMobile() ? 'large' : 'small'"`. Medido el 04-10-2026 en `master-pedidos`: 166 `[size]`
|
|
42
|
+
con `bp` (142 `large`/`medium`, 22 `large`/`small`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
|
|
43
43
|
|
|
44
44
|
El tamaño lo pone el grupo: es el mismo `size` de `sui-button-group` (ver su README).
|
|
45
45
|
|
|
@@ -84,7 +84,7 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
|
|
|
84
84
|
mandan el `MouseEvent`.
|
|
85
85
|
- **`active` no se prende solo al tocarlo**: el ítem solo avisa; quien lo usa (normalmente el grupo)
|
|
86
86
|
tiene que cambiar `active`.
|
|
87
|
-
- Los íconos miden 20 en `small` y `xsmall`, y 16 en `2xsmall`.
|
|
87
|
+
- Los íconos miden 20 en `large`, `medium`, `small` y `xsmall`, y 16 en `2xsmall`.
|
|
88
88
|
- Suelto no recibe las puntas redondeadas del grupo: esas reglas dependen de los atributos
|
|
89
89
|
`data-sui-first` y `data-sui-last` que pone `sui-button-group`.
|
|
90
90
|
- Es un `<button type="button">` con `aria-pressed`: el lector de pantalla lo anuncia como botón de
|
package/docs/sui-card/README.md
CHANGED
|
@@ -35,10 +35,11 @@ selección.**
|
|
|
35
35
|
>
|
|
36
36
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin `master-preview`,
|
|
37
37
|
> `master-prototipos`, `mockup-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`,
|
|
38
|
-
> `master-ejercicios`): **253 cards en 79 archivos
|
|
38
|
+
> `master-ejercicios`): **253 cards en 79 archivos** (254 en 80 si solo se excluyen `master-preview`,
|
|
39
|
+
> `master-prototipos`, `mockup-sheets-`, `dx/`, `master-rutina`, `master-medico` y `dev-index`). Variantes: 227 `default` explícito, 24 sin
|
|
39
40
|
> `variant` (también default), 2 `elevated`, 0 `flat`. Tamaños: 95 `small`, 123 `medium`
|
|
40
41
|
> explícito + 21 sin `size`, 14 `large`, 0 `xlarge`. 9 con `[interactive]`. Slots: 23
|
|
41
|
-
> `sui-card-header`, 11 `sui-card-footer`, 4 `sui-card-media`.
|
|
42
|
+
> `sui-card-header`, 11 `sui-card-footer`, 4 `sui-card-media`. Al 04-10-2026 son 12 con `[interactive]`.
|
|
42
43
|
|
|
43
44
|
### `variant`
|
|
44
45
|
|
|
@@ -73,30 +74,27 @@ selección.**
|
|
|
73
74
|
| `[sui-card-media]` | Gráfico, mapa o foto de borde a borde, al final. Si después va un footer, la media deja de comerse el borde inferior. | propuesta |
|
|
74
75
|
| `[sui-card-footer]` | La acción de la card o un resumen. Si son dos botones, siguen el orden de `sui-modal-footer` (secundario a la izquierda, primario a la derecha). | canon (orden de botones, CLAUDE.md) |
|
|
75
76
|
|
|
76
|
-
**Usos de hoy que rompen las reglas
|
|
77
|
+
**Usos de hoy que rompen las reglas** (revisado el 04-10-2026):
|
|
77
78
|
|
|
78
|
-
- **18
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
`pages/
|
|
84
|
-
|
|
85
|
-
-
|
|
86
|
-
hover y sin el arreglo de iOS. `pages/super-admin/master-users/master-users.html:156` (con
|
|
87
|
-
`role="button"` y `touchstart` a mano), `pages/super-admin/master-settings/master-settings.html:601`,
|
|
88
|
-
`pages/driver/driver-dashboard/driver-dashboard.html:990`.
|
|
79
|
+
- **Los 18 `gap` puestos en la clase del `sui-card`** (central-inicio, master-semanas,
|
|
80
|
+
central-ingresos, invoices, driver-history, driver-wallet) ya van con un wrapper `…-body` propio
|
|
81
|
+
desde el 03-10-2026 (commit `103f76fa` de la app). Quedan 0.
|
|
82
|
+
- **3 cards tocables con `[interactive]` y además `(keydown.enter)`**: la card ya dispara el click
|
|
83
|
+
con Enter, así que el handler corre **dos veces** (ver Trampas).
|
|
84
|
+
`pages/super-admin/master-users/master-users.html:156`,
|
|
85
|
+
`pages/super-admin/master-settings/master-settings.html:611` (con `routerLink`) y
|
|
86
|
+
`pages/driver/driver-dashboard/driver-dashboard.html:990`. Se borra el `(keydown.enter)`.
|
|
89
87
|
|
|
90
88
|
## Tamaño en mobile y en web
|
|
91
89
|
|
|
92
90
|
El `size` de la card es su padding, no un área táctil: no tiene que llegar a 44. Lo que importa en
|
|
93
91
|
mobile es no perder ancho.
|
|
94
92
|
|
|
95
|
-
| uso | mobile | web |
|
|
96
|
-
|
|
97
|
-
| sección, KPI, gráfico | `small` (16) | `medium` (20) |
|
|
98
|
-
| sección principal de un reporte | `small` | `large` (24) |
|
|
99
|
-
| fila de lista tocable | `small` | `small` |
|
|
93
|
+
| uso | mobile | web | fuente |
|
|
94
|
+
|---|---|---|---|
|
|
95
|
+
| sección, KPI, gráfico | `small` (16) | `medium` (20) | propuesta, falta aprobación |
|
|
96
|
+
| sección principal de un reporte | `small` | `large` (24) | propuesta, falta aprobación |
|
|
97
|
+
| fila de lista tocable | `small` | `small` | propuesta, falta aprobación |
|
|
100
98
|
|
|
101
99
|
```html
|
|
102
100
|
<sui-card [size]="bp.isMobile() ? 'small' : 'medium'"> … </sui-card>
|
|
@@ -21,7 +21,7 @@ igual en el celular, sin tocar nada.
|
|
|
21
21
|
(`legend: {…}`), que es interactiva. Esta no tiene clic.
|
|
22
22
|
- Un estado o una categoría que no viene de un gráfico: `sui-badge` o `sui-status-badge`.
|
|
23
23
|
- Esconder los números en un tooltip: en el celular no hay hover (así lo hizo bien
|
|
24
|
-
`pages/super-admin/master-drivers/master-drivers.html:
|
|
24
|
+
`pages/super-admin/master-drivers/master-drivers.html:228`).
|
|
25
25
|
|
|
26
26
|
## Qué variante usar
|
|
27
27
|
|
|
@@ -39,7 +39,7 @@ igual en el celular, sin tocar nada.
|
|
|
39
39
|
| `color` | sin pasar | **Lo normal** en categorías sin bien ni mal (canales, métodos de pago, distritos): el componente reparte azul, naranja, rojo, verde… en orden. | según el componente (orden) · cuándo: propuesta |
|
|
40
40
|
| `color` | el del estado | Cuando la serie **es un estado**: entregados `green`, cancelados `red`, pendientes `orange`. Mismo significado que en `sui-badge`. | canon (colores con significado del badge) |
|
|
41
41
|
| `customColor` | el color que ya usa el gráfico | Solo cuando el gráfico tiene su propia paleta y el punto tiene que coincidir. Va el mismo valor en los dos lados. | propuesta |
|
|
42
|
-
| `value` | número o texto | Cuando el número importa para leer el gráfico: «42», «S/ 1,200», «38 %». | propuesta |
|
|
42
|
+
| `value` | número o texto | Cuando el número importa para leer el gráfico: «42», «S/ 1,200.00», «38 %». | propuesta |
|
|
43
43
|
| `disabled` | `true` | Una serie sin datos en el período: se ve, apagada, para que no parezca que falta. | propuesta |
|
|
44
44
|
|
|
45
45
|
Los 12 valores de `color`, uno por uno y con su regla, están en el README de `sui-chart-legend-dot`.
|
|
@@ -60,10 +60,10 @@ Para que el gráfico y la leyenda pinten **el mismo color**, ECharts recibe la p
|
|
|
60
60
|
con `customColor` o la paleta del DS: `components/marketing-channels/marketing-channels.html:10`,
|
|
61
61
|
`components/customer-segments/customer-segments.html:26`,
|
|
62
62
|
`pages/overview/components/overview-retention/overview-retention.html:12`,
|
|
63
|
-
`pages/reports/reports.html:
|
|
63
|
+
`pages/reports/reports.html:60` y `:81`.
|
|
64
64
|
- **A discutir — 9 gráficos con la leyenda de ECharts**: `pages/super-admin/master-semanas/master-semanas.ts:187`
|
|
65
|
-
(y `:248`, `:288`, `:335`), `pages/super-admin/master-overview/master-overview.ts:
|
|
66
|
-
`pages/reports/reports.ts:
|
|
65
|
+
(y `:248`, `:288`, `:335`), `pages/super-admin/master-overview/master-overview.ts:266` y `:403`,
|
|
66
|
+
`pages/reports/reports.ts:339` y `:382`, `core/utils/chart-barras-repartidores.ts:166`. Si nadie
|
|
67
67
|
apaga series tocándolas, pasarían a `sui-chart-legend` (fuente, tamaño y color del DS en vez de
|
|
68
68
|
`#525252` y 12 px puestos a mano). `pages/reports/` tiene además la leyenda a mano: hay dos
|
|
69
69
|
leyendas para el mismo gráfico.
|
|
@@ -79,7 +79,8 @@ para el dedo; lo que cambia por plataforma es la orientación.
|
|
|
79
79
|
| junto a una dona | `vertical`, **debajo** de la dona | `vertical`, a la derecha | propuesta |
|
|
80
80
|
|
|
81
81
|
```html
|
|
82
|
-
|
|
82
|
+
<!-- Junto a una dona: vertical en las dos; el layout la pone debajo en mobile y a la derecha en web -->
|
|
83
|
+
<sui-chart-legend orientation="vertical" [items]="metodos()" />
|
|
83
84
|
```
|
|
84
85
|
|
|
85
86
|
El texto de 12 px queda chico en mobile y el componente no tiene un tamaño mayor: no se cambia aquí.
|
|
@@ -120,7 +121,7 @@ interface SuiChartLegendItem {
|
|
|
120
121
|
del gráfico: si ECharts usa otra paleta, el punto y la barra no coinciden. Usa
|
|
121
122
|
`SUI_CHART_LEGEND_HEX` en el gráfico o pasa el color.
|
|
122
123
|
- El orden automático empieza en **azul**, no en el naranja de la marca.
|
|
123
|
-
- `value` sale a 4 px del nombre, en negro (el nombre va en gris): el formato («S/ 1,200», «38 %») lo arma quien la usa.
|
|
124
|
+
- `value` sale a 4 px del nombre, en negro (el nombre va en gris): el formato («S/ 1,200.00», «38 %») lo arma quien la usa.
|
|
124
125
|
- Host con `role="list"` y cada item `role="listitem"`; el punto es decorativo.
|
|
125
126
|
- `items` es obligatorio.
|
|
126
127
|
|
|
@@ -69,14 +69,15 @@ Regla: **`[size]="bp.controlSize()"`** en toda pantalla. Así ya están los 5 us
|
|
|
69
69
|
**Usos de hoy que rompen la regla de componente:**
|
|
70
70
|
|
|
71
71
|
- **4 `sui-checkbox` envueltos en un `<label>` hecho a mano con su texto → `sui-checkbox-label`.**
|
|
72
|
-
`pages/settings/team/team.html:
|
|
73
|
-
`components/option-sections-manager/option-sections-manager.html:
|
|
74
|
-
(productos).
|
|
72
|
+
`pages/settings/team/team.html:228` y `:301` (permisos: «Gestionar productos»…),
|
|
73
|
+
`components/option-sections-manager/option-sections-manager.html:191` (categorías) y `:214`
|
|
74
|
+
(productos). Además, tocar el texto no marca nada: un `<label>` solo activa controles nativos
|
|
75
|
+
y `sui-checkbox` no lo es, así que hoy solo responde la casilla.
|
|
75
76
|
- **1 checkbox nativo → `sui-checkbox-label`:** `pages/sales-channels/facebook/facebook.html:69`
|
|
76
77
|
(«Qué se sincroniza»).
|
|
77
|
-
- **
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
- **Al migrar, pásale el tamaño:** `sui-checkbox-label` tiene `size` (`medium` 20, `large` 24,
|
|
79
|
+
`xlarge` 28) desde el 03-10-2026. Con `[size]="bp.controlSize()"` los 4 de arriba siguen en
|
|
80
|
+
24/28 px; sin él caen a 20.
|
|
80
81
|
- El de `components/product-detail-view/product-detail-view.html:204` está bien pelado: la fila
|
|
81
82
|
es propia (foto, nombre, precio) y es la fila la que recibe el clic.
|
|
82
83
|
|
|
@@ -118,6 +119,7 @@ cae en la columna de la derecha, se usa.
|
|
|
118
119
|
| `checked` · model, `[(checked)]` | `boolean` | `false` |
|
|
119
120
|
| `indeterminate` | `boolean` | `false` |
|
|
120
121
|
| `disabled` | `boolean` | `false` |
|
|
122
|
+
| `focusable` | `boolean` | `true` |
|
|
121
123
|
|
|
122
124
|
Outputs: ninguno.
|
|
123
125
|
<!-- api:fin -->
|
|
@@ -133,6 +135,9 @@ Implementa `ControlValueAccessor`: funciona con `[(ngModel)]` y `formControlName
|
|
|
133
135
|
se ve el guion aunque cambie `checked`.
|
|
134
136
|
- El relleno marcado es el `primary` del proyecto (naranja), no el azul del Figma de origen.
|
|
135
137
|
- Espacio **y** Enter lo marcan (un checkbox nativo solo responde a Espacio).
|
|
138
|
+
- **`[focusable]="false"` lo saca del Tab** (tabindex -1). Es para cuando un padre ya es el
|
|
139
|
+
control enfocable y la casilla solo dibuja el estado (`sui-checkbox-card` lo usa). Poner
|
|
140
|
+
`tabindex="-1"` en el host no sirve: el binding del componente lo pisa (revisión 04-10-2026).
|
|
136
141
|
- El tilde es un SVG dibujado a mano: no se cambia el ícono.
|
|
137
142
|
- Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
|
|
138
143
|
|
|
@@ -29,28 +29,33 @@ una → radio-card.**
|
|
|
29
29
|
|
|
30
30
|
> **La guía del DS no tiene página de la checkbox card.** De la guía sale solo lo del checkbox que
|
|
31
31
|
> lleva adentro: **«para selecciones simples y múltiples»**. La frontera con el switch («se
|
|
32
|
-
> confirma después con Guardar → checkbox»)
|
|
32
|
+
> confirma después con Guardar → checkbox») sale de la misma guía: el switch es «para prender o
|
|
33
|
+
> apagar un ajuste de forma inmediata».
|
|
33
34
|
>
|
|
34
|
-
> Uso medido el
|
|
35
|
-
> checkbox-cards en
|
|
36
|
-
> mi-negocio y en locales administrados
|
|
37
|
-
>
|
|
35
|
+
> Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **13
|
|
36
|
+
> checkbox-cards en 3 archivos**, todas con `bp.controlSize()`. Tipos: 6 `left-icon` (formas de
|
|
37
|
+
> entrega en mi-negocio y en locales administrados; efectivo, transferencia y tarjeta en los
|
|
38
|
+
> métodos de pago), 5 `basic` (los ajustes con «Guardar…» de
|
|
39
|
+
> `pages/super-admin/master-settings/master-settings.html`) y 2 `company` (Yape y Plin, con la
|
|
40
|
+
> inicial en `slot="leading"`). Las 10 de métodos de pago y de master-settings eran
|
|
41
|
+
> `sui-switch-card` hasta el 03-10-2026.
|
|
38
42
|
|
|
39
43
|
### `type` (el leading)
|
|
40
44
|
|
|
41
45
|
| type | cuándo | fuente |
|
|
42
46
|
|---|---|---|
|
|
43
|
-
| `left-icon` (`icon`, `emoji` o `iconSrc`) | Lo normal: un ícono que dice de qué va la opción. | propuesta (
|
|
44
|
-
| `basic` |
|
|
47
|
+
| `left-icon` (`icon`, `emoji` o `iconSrc`) | Lo normal: un ícono que dice de qué va la opción. | propuesta (6 de hoy) |
|
|
48
|
+
| `basic` | Un ajuste o una opción de texto que se guarda con un botón y no necesita ícono («Pausar los pedidos» en master-settings). | propuesta (5 de hoy) |
|
|
49
|
+
| `company` | Un medio de pago o servicio con su logo redondo (Yape, Plin). El logo lo proyectas tú con `slot="leading"`. | propuesta (2 de hoy) |
|
|
45
50
|
| `avatar` (`imageUrl`) | Ver «No usar». | propuesta |
|
|
46
|
-
| `card-provider`, `brand
|
|
51
|
+
| `card-provider`, `brand` | Ver «No usar». El logo lo proyectas tú con `slot="leading"`. | propuesta |
|
|
47
52
|
|
|
48
53
|
### Las piezas
|
|
49
54
|
|
|
50
55
|
| prop | cuándo | fuente |
|
|
51
56
|
|---|---|---|
|
|
52
57
|
| `label` | Siempre. El nombre de la opción: «Delivery». | propuesta |
|
|
53
|
-
| `description` | Lo que significa elegirla: «Llevas los pedidos a la dirección del cliente». | propuesta (
|
|
58
|
+
| `description` | Lo que significa elegirla: «Llevas los pedidos a la dirección del cliente». | propuesta (8 de hoy) |
|
|
54
59
|
| `sublabel` | Precisión corta entre paréntesis. | propuesta |
|
|
55
60
|
| `badge` | Marca una opción frente a las otras («Nuevo»). Con string sale azul `light`. | propuesta |
|
|
56
61
|
| `indeterminate` | Una casilla que resume a otras («Todos los días» con algunos marcados). | propuesta |
|
|
@@ -65,17 +70,15 @@ una → radio-card.**
|
|
|
65
70
|
| `large` | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
66
71
|
| `medium` (default), `small` | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
|
|
67
72
|
|
|
68
|
-
**Usos de hoy que rompen las reglas
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
- **5 `sui-switch-card` que se guardan con «Guardar cambios»** y por lo tanto van aquí: los métodos
|
|
72
|
-
de pago de `pages/mi-negocio/mi-negocio.html:1181`, `:1190`, `:1199`, `:1208`, `:1217`
|
|
73
|
-
(«Puedes seleccionar varias», dice la misma pantalla).
|
|
73
|
+
**Usos de hoy que rompen las reglas: 0.** El que iba sin `size`
|
|
74
|
+
(`pages/super-admin/master-administrados/master-administrados.html:172`) y los switch-cards que se
|
|
75
|
+
guardaban con un botón se corrigieron el 03-10-2026.
|
|
74
76
|
|
|
75
77
|
## Tamaño en mobile y en web
|
|
76
78
|
|
|
77
|
-
La card entera es el área táctil
|
|
78
|
-
|
|
79
|
+
La card entera es el área táctil: 74 px con descripción (16 + 40 + 16 de padding y contenido,
|
|
80
|
+
más 2 de borde) y 54 px la más chica (`basic`, sin descripción, `medium`). Llega al piso de 44
|
|
81
|
+
sola. El `size` cambia solo la casilla.
|
|
79
82
|
|
|
80
83
|
| uso | mobile | web |
|
|
81
84
|
|---|---|---|
|
|
@@ -89,9 +92,8 @@ cambia solo la casilla.
|
|
|
89
92
|
|
|
90
93
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
91
94
|
|---|---|---|
|
|
92
|
-
| `type="basic"` (0 usos) | las opciones de hoy llevan ícono | opciones de texto que se suman (los días de atención, los tamaños de un producto) |
|
|
93
95
|
| `type="avatar"` (0 usos) | no se elige gente de a varios | elegir a varios repartidores para mandarles un aviso |
|
|
94
|
-
| `type="brand"` / `"
|
|
96
|
+
| `type="brand"` / `"card-provider"` (0 usos) | no hay integraciones ni tarjetas | prender varias integraciones a la vez (logo proyectado), aceptar varias marcas de tarjeta |
|
|
95
97
|
| `size="medium"` / `"small"` | la casilla se pierde en el teléfono | una tabla densa solo de desktop |
|
|
96
98
|
|
|
97
99
|
## API
|
|
@@ -135,6 +137,9 @@ Slot: `[slot=leading]` (solo para `card-provider`, `brand` y `company`). Impleme
|
|
|
135
137
|
- El leading de 40 × 40 ya trae `box-sizing: border-box` (el proyecto no tiene reset global): si
|
|
136
138
|
proyectas una imagen con padding o borde propios, ponle `box-sizing` tú.
|
|
137
139
|
- `badge` con string sale **azul `light` `small`**.
|
|
140
|
+
- **El host es el único control** (role checkbox, tab stop, Espacio y Enter): la casilla de la
|
|
141
|
+
derecha solo dibuja el estado, va oculta al lector y fuera del Tab (`[focusable]="false"`).
|
|
142
|
+
Hasta el 04-10-2026 quedaba enfocable con `aria-hidden` y ahí Espacio no marcaba nada.
|
|
138
143
|
|
|
139
144
|
## Ejemplo
|
|
140
145
|
|
|
@@ -13,9 +13,8 @@ Story: [Atoms/Checkbox, Radio & Switch/Checkbox Label](https://sui-design-system
|
|
|
13
13
|
|
|
14
14
|
**Úsalo** para toda casilla que tiene texto al lado: «Acepto los términos», cada permiso de un
|
|
15
15
|
miembro del equipo, cada categoría de una lista. Toda la fila es clicable y se enchufa a un
|
|
16
|
-
formulario.
|
|
17
|
-
|
|
18
|
-
`sui-checkbox-card` es la salida grande.
|
|
16
|
+
formulario. En mobile va con `[size]="bp.controlSize()"` (casilla de 28 px), como los demás
|
|
17
|
+
controles.
|
|
19
18
|
|
|
20
19
|
**No lo uses** para:
|
|
21
20
|
|
|
@@ -49,12 +48,12 @@ Regla corta: **casilla con texto → este · casilla sin texto → `sui-checkbox
|
|
|
49
48
|
| `flip` | No usar en formularios: la casilla va a la izquierda, como en la guía. | propuesta, falta aprobación |
|
|
50
49
|
| `indeterminate` | El «seleccionar todo» de un grupo, cuando hay algunas marcadas. Hoy no usar (ver abajo). | propuesta, falta aprobación |
|
|
51
50
|
| `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
|
|
51
|
+
| `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 se quedan en 12/16 (canon, dueño 04-10-2026); 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
52
|
|
|
54
53
|
**Usos de hoy que deberían ser este componente (5):**
|
|
55
54
|
|
|
56
|
-
- **4 `sui-checkbox` + `<label>` a mano:** `pages/settings/team/team.html:
|
|
57
|
-
(permisos), `components/option-sections-manager/option-sections-manager.html:
|
|
55
|
+
- **4 `sui-checkbox` + `<label>` a mano:** `pages/settings/team/team.html:228` y `:301`
|
|
56
|
+
(permisos), `components/option-sections-manager/option-sections-manager.html:191` y `:214`.
|
|
58
57
|
- **1 nativo:** `pages/sales-channels/facebook/facebook.html:69`.
|
|
59
58
|
|
|
60
59
|
**Antes de migrarlos:** los 4 de `sui-checkbox` hoy están en 24/28 px (`bp.controlSize()`,
|
|
@@ -71,17 +70,36 @@ dueño, 28-09-2026).
|
|
|
71
70
|
|
|
72
71
|
| uso | mobile | web | fuente |
|
|
73
72
|
|---|---|---|---|
|
|
74
|
-
| casilla con texto en un formulario | `
|
|
73
|
+
| casilla con texto en un formulario | `2xlarge` (fila de 44 como mínimo, casilla 28, label 16/24) | `large` (casilla 24, label 16/24) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; web: canon (aprobado por el dueño, 03-10-2026) |
|
|
75
74
|
| lista densa de desktop (tabla, filtros) | — | `medium` (casilla 20, label 14/20) | propuesta, falta aprobación |
|
|
76
75
|
|
|
77
76
|
```html
|
|
78
|
-
<sui-checkbox-label [size]="bp.
|
|
77
|
+
<sui-checkbox-label [size]="bp.isMobile() ? '2xlarge' : 'large'" label="Recordar mi dirección" [(active)]="recordar" />
|
|
79
78
|
```
|
|
80
79
|
|
|
80
|
+
| size | casilla | label | sublabel / descripción | alto de la fila sin descripción |
|
|
81
|
+
|---|---|---|---|---|
|
|
82
|
+
| `medium` (default, Figma) | 20 | 14/20 | 12/16 | 20 |
|
|
83
|
+
| `large` | 24 | 16/24 | 12/16 | 24 |
|
|
84
|
+
| `xlarge` | 28 | 16/24 | 12/16 | 28 |
|
|
85
|
+
| `2xlarge` | 28 | 16/24 | 12/16 | **44** (`min-height`) |
|
|
86
|
+
|
|
87
|
+
`2xlarge` (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono) es la fila del teléfono: misma casilla de 28 y mismo label que `xlarge`,
|
|
88
|
+
pero la fila mide 44 como mínimo con todo centrado en vertical, y el texto secundario se queda en 12
|
|
89
|
+
(regla del 03-10). Con descripción la fila ya pasa de 44 y vuelve a alinearse arriba.
|
|
90
|
+
|
|
81
91
|
Toda la fila se toca (el host recibe el click), así que el área táctil es la fila entera, no solo
|
|
82
92
|
la casilla. Con `xlarge` el contenido baja 2 px para que la línea del label (24) quede centrada
|
|
83
93
|
con la casilla (28).
|
|
84
94
|
|
|
95
|
+
Sin descripción, la fila en `xlarge` mide 28 px (lo que mide la casilla): en el teléfono va
|
|
96
|
+
`2xlarge`, que la lleva a 44. Con descripción llega sola: 2 + 24 (label) + 4 + 16 (descripción) = 46 px
|
|
97
|
+
en `xlarge` y en `2xlarge`.
|
|
98
|
+
|
|
99
|
+
**Regla de tamaños aplicada (canon, dueño 04-10-2026):** en `large` y `xlarge` el label sube a
|
|
100
|
+
16/24 y el sublabel y la descripción se quedan en 12/16, igual que `sui-switch-label`. Antes subían
|
|
101
|
+
a 14/20. El badge y el link siguen creciendo con el size.
|
|
102
|
+
|
|
85
103
|
## «No usar»: por qué no hoy y cuándo sí
|
|
86
104
|
|
|
87
105
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -103,7 +121,7 @@ con la casilla (28).
|
|
|
103
121
|
| `description` | `string \| null` | `null` |
|
|
104
122
|
| `badge` | `SuiBadgeConfig \| string \| null` | `null` |
|
|
105
123
|
| `link` | `SuiLinkConfig \| string \| null` | `null` |
|
|
106
|
-
| `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
124
|
+
| `size` | `'medium' \| 'large' \| 'xlarge' \| '2xlarge'` | `'medium'` |
|
|
107
125
|
| `flip` | `boolean` | `false` |
|
|
108
126
|
| `disabled` | `boolean` | `false` |
|
|
109
127
|
| `indeterminate` | `boolean` | `false` |
|
|
@@ -119,7 +137,8 @@ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
|
|
|
119
137
|
## Trampas
|
|
120
138
|
|
|
121
139
|
- **El estado se llama `active`, no `checked`.** `[(checked)]` aquí no existe.
|
|
122
|
-
-
|
|
140
|
+
- **`size` arranca en `medium`** (casilla de 20 px): sin `[size]="bp.controlSize()"` queda chica
|
|
141
|
+
en el teléfono.
|
|
123
142
|
- **`link` solo se dibuja si hay `description`.** Sin descripción desaparece sin avisar.
|
|
124
143
|
- **`description` cambia el label de peso** (regular → medio) y abre el bloque en columna.
|
|
125
144
|
- El badge con string sale **naranja `light`**; en `sui-checkbox-card` el default es azul.
|
|
@@ -127,6 +146,9 @@ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
|
|
|
127
146
|
- `link` con `href` es un `<a>` real; con `target: '_blank'` agrega `rel="noopener noreferrer"`.
|
|
128
147
|
Sin `href`, emite `linkClick` y no marca la casilla.
|
|
129
148
|
- `flip` cambia el orden con CSS `order`: el lector de pantalla y el Tab siguen viendo la casilla primero.
|
|
149
|
+
- La casilla de adentro es el tab stop y toma su nombre del `label` y su descripción de la
|
|
150
|
+
`description` (`aria-labelledby` / `aria-describedby`) (revisión 04-10-2026). Antes el lector decía
|
|
151
|
+
«casilla, no marcada» sin el texto.
|
|
130
152
|
- Deshabilitado baja la opacidad del bloque a 0.5 (convención del proyecto).
|
|
131
153
|
|
|
132
154
|
## Ejemplo
|
|
@@ -120,6 +120,8 @@ Outputs: ninguno.
|
|
|
120
120
|
- El default de SUI es **64**; el de la guía, **80**.
|
|
121
121
|
- El porcentaje se redondea a entero.
|
|
122
122
|
- El azul es `--sui-state-information-base`, no el naranja de `--sui-primary-base`.
|
|
123
|
+
- Sin `ariaLabel` se anuncia «Progreso» (04-10-2026: antes quedaba sin nombre). Pasa uno que diga
|
|
124
|
+
qué avanza («Perfil completado»).
|
|
123
125
|
|
|
124
126
|
## Ejemplo
|
|
125
127
|
|
|
@@ -32,7 +32,7 @@ un `<button role="radio">`: se toca.
|
|
|
32
32
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**, sin contar prototipos ni
|
|
33
33
|
> vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
|
|
34
34
|
> `master-rutina`, `master-medico`, `master-ejercicios`, `dev-index`). Candidato:
|
|
35
|
-
> `components/add-product-modal/add-product-modal.html:
|
|
35
|
+
> `components/add-product-modal/add-product-modal.html:302` elige el color de una variante con
|
|
36
36
|
> `<input type="color">`, que abre un selector distinto en iOS, Android y escritorio.
|
|
37
37
|
|
|
38
38
|
| propiedad | valor | cuándo | fuente |
|