@ajuarezso/sui-design-system 0.21.0 → 0.23.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.
Files changed (114) hide show
  1. package/docs/INDEX.md +30 -35
  2. package/docs/sui-accordion/README.md +171 -0
  3. package/docs/sui-activity-feed/README.md +154 -0
  4. package/docs/sui-activity-filter/README.md +100 -0
  5. package/docs/sui-alert/README.md +28 -19
  6. package/docs/sui-app-store-badge/README.md +5 -4
  7. package/docs/sui-avatar/README.md +16 -16
  8. package/docs/sui-avatar-group/README.md +4 -4
  9. package/docs/sui-badge/README.md +27 -9
  10. package/docs/sui-banner/README.md +10 -9
  11. package/docs/sui-brand-logo/README.md +3 -3
  12. package/docs/sui-breadcrumbs/README.md +1 -1
  13. package/docs/sui-button/README.md +64 -21
  14. package/docs/sui-button-group/README.md +6 -4
  15. package/docs/sui-button-group-item/README.md +3 -3
  16. package/docs/sui-card/README.md +17 -19
  17. package/docs/sui-chart-legend/README.md +8 -7
  18. package/docs/sui-checkbox/README.md +11 -6
  19. package/docs/sui-checkbox-card/README.md +24 -19
  20. package/docs/sui-checkbox-label/README.md +32 -10
  21. package/docs/sui-circular-progress-bar/README.md +2 -0
  22. package/docs/sui-color-dot/README.md +1 -1
  23. package/docs/sui-color-picker/README.md +22 -7
  24. package/docs/sui-command-menu-footer/README.md +100 -0
  25. package/docs/sui-command-menu-item/README.md +140 -0
  26. package/docs/sui-command-menu-search/README.md +105 -0
  27. package/docs/sui-compact-avatar-group/README.md +4 -3
  28. package/docs/sui-compact-button/README.md +41 -44
  29. package/docs/sui-compact-select/README.md +12 -5
  30. package/docs/sui-compact-select-for-input/README.md +5 -2
  31. package/docs/sui-content-card/README.md +6 -5
  32. package/docs/sui-content-divider/README.md +4 -4
  33. package/docs/sui-content-label/README.md +11 -6
  34. package/docs/sui-counter-input/README.md +21 -17
  35. package/docs/sui-date-selector/README.md +16 -12
  36. package/docs/sui-datepicker/README.md +46 -28
  37. package/docs/sui-day-cell/README.md +17 -8
  38. package/docs/sui-day-label/README.md +2 -2
  39. package/docs/sui-divider/README.md +5 -5
  40. package/docs/sui-drawer-footer/README.md +19 -5
  41. package/docs/sui-dropdown-caption/README.md +92 -0
  42. package/docs/sui-dropdown-item/README.md +163 -0
  43. package/docs/sui-dropdown-menu/README.md +196 -0
  44. package/docs/sui-dropdown-search/README.md +113 -0
  45. package/docs/sui-emoji/README.md +6 -6
  46. package/docs/sui-empty-state/README.md +13 -23
  47. package/docs/sui-fancy-button/README.md +24 -18
  48. package/docs/sui-file-icon/README.md +1 -1
  49. package/docs/sui-file-upload/README.md +3 -0
  50. package/docs/sui-file-upload-card/README.md +8 -7
  51. package/docs/sui-filter/README.md +181 -0
  52. package/docs/sui-flag/README.md +3 -2
  53. package/docs/sui-form-hint/README.md +12 -8
  54. package/docs/sui-form-label/README.md +11 -16
  55. package/docs/sui-href/README.md +85 -0
  56. package/docs/sui-icon/README.md +4 -3
  57. package/docs/sui-image-upload/README.md +28 -16
  58. package/docs/sui-img-retry/README.md +107 -0
  59. package/docs/sui-inline-input/README.md +7 -6
  60. package/docs/sui-inline-select/README.md +8 -5
  61. package/docs/sui-input/README.md +27 -33
  62. package/docs/sui-integration-switch/README.md +14 -7
  63. package/docs/sui-kbd/README.md +4 -4
  64. package/docs/sui-key-icon/README.md +6 -2
  65. package/docs/sui-link-button/README.md +21 -17
  66. package/docs/sui-modal/README.md +238 -0
  67. package/docs/sui-modal-footer/README.md +178 -0
  68. package/docs/sui-modal-header/README.md +115 -0
  69. package/docs/sui-modal-sheet/README.md +170 -0
  70. package/docs/sui-notification/README.md +8 -6
  71. package/docs/sui-notification-footer/README.md +2 -2
  72. package/docs/sui-notification-tab-menu/README.md +5 -3
  73. package/docs/sui-page-header/README.md +123 -0
  74. package/docs/sui-pagination/README.md +8 -5
  75. package/docs/sui-password-strength/README.md +1 -1
  76. package/docs/sui-period-range/README.md +18 -14
  77. package/docs/sui-popover/README.md +13 -7
  78. package/docs/sui-product-card/README.md +14 -10
  79. package/docs/sui-progress-bar/README.md +4 -2
  80. package/docs/sui-progress-bar-label/README.md +2 -0
  81. package/docs/sui-radio/README.md +14 -7
  82. package/docs/sui-radio-card/README.md +12 -12
  83. package/docs/sui-radio-label/README.md +36 -11
  84. package/docs/sui-rating/README.md +28 -9
  85. package/docs/sui-rich-editor/README.md +3 -3
  86. package/docs/sui-segmented-control/README.md +33 -19
  87. package/docs/sui-select/README.md +40 -33
  88. package/docs/sui-sidebar/README.md +216 -0
  89. package/docs/sui-slider/README.md +7 -0
  90. package/docs/sui-social-button/README.md +24 -11
  91. package/docs/sui-status-badge/README.md +7 -3
  92. package/docs/sui-stepper/README.md +30 -17
  93. package/docs/sui-store-card/README.md +9 -4
  94. package/docs/sui-switch/README.md +16 -11
  95. package/docs/sui-switch-card/README.md +18 -16
  96. package/docs/sui-switch-label/README.md +25 -11
  97. package/docs/sui-tab-chips/README.md +56 -39
  98. package/docs/sui-tab-menu-horizontal/README.md +19 -11
  99. package/docs/sui-tab-menu-vertical/README.md +10 -5
  100. package/docs/sui-table/README.md +264 -0
  101. package/docs/sui-tag/README.md +25 -11
  102. package/docs/sui-tag-input/README.md +25 -12
  103. package/docs/sui-textarea/README.md +23 -20
  104. package/docs/sui-time-picker/README.md +39 -30
  105. package/docs/sui-toast/README.md +27 -22
  106. package/docs/sui-tooltip/README.md +14 -17
  107. package/docs/sui-topbar/README.md +153 -0
  108. package/docs/sui-topbar-button/README.md +95 -0
  109. package/docs/sui-topbar-item/README.md +97 -0
  110. package/docs/sui-topbar-user/README.md +83 -0
  111. package/fesm2022/ajuarezso-sui-design-system.mjs +1076 -242
  112. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  113. package/package.json +1 -1
  114. package/types/ajuarezso-sui-design-system.d.ts +616 -280
@@ -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-28 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)]
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` o `sui-button-group`.
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. Así que la tabla de variantes sigue siendo **propuesta, falta
32
- > aprobación**, salvo lo que ya es canon de SUI por `sui-modal-footer`.
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 es un link, no un `sui-button`** (ver `sui-alert`). Hoy hay 5
49
- `sui-button` proyectados en alerts.
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:204` («Continuar») | ya es canon (sui-modal-footer) |
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:175` («Ver seguimiento») | ya es canon (sui-modal-footer) |
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:132` («Sí», confirma cancelar) | canon (aprobado por el dueño, 03-10-2026) |
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:515` («WhatsApp») · `:567` («Abrir mapa») | canon (aprobado por el dueño, 03-10-2026) |
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 romperían la propuesta** (sin prototipos):
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:133` («Cambiar plan»), `pages/customer/cart/cart.html:33`
72
- («Quitar no disponibles»), `pages/customer/order-tracking/order-tracking.html:737` («Cancelar
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:41`, `pages/mi-negocio/mi-negocio.html:381`, `cart.html:33`,
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:714`
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 de hoy: 123 `large`, 91 `small`, 60 `medium`, 50 `xsmall`, 29 `2xsmall`, 44 dinámicos.
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 dentro de un alert o banner teñido, donde `stroke` se ve pesado |
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,59 @@ 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: 40 px como mínimo y 48 en la acción principal. En web, 28–40.
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 | `medium` (40) | `small` (36) / `xsmall` (32) | canon (aprobado por el dueño, 03-10-2026) |
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 (la app ya lo usa en 27 lugares; `bp` = `BreakpointsService`, mobile hasta 767 px):
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
+
163
+ ### Regla de tamaños para todo el DS (aprobada por el dueño, 03-10-2026)
164
+
165
+ Vale para todos los componentes que tienen `size` `large` / `xlarge`:
166
+
167
+ - **Alto, padding y área táctil crecen en cada paso.**
168
+ - **El texto sube un solo escalón: hasta `medium` va en 14 px; `large` y `xlarge` van en 16 px.**
169
+ Labels, botones, chips, tabs e ítems usan `--sui-type-label-md-*`; valores y placeholders de
170
+ campos, `--sui-type-paragraph-md-*`. El line-height acompaña (24). Siempre con token (un
171
+ fallback `var(--token, 16px)` está bien), nunca px sueltos.
172
+ - **El texto secundario chico no cambia**: hints, contadores, sublabels y captions de 12.
173
+ - **Los íconos se quedan en 20.**
174
+ - Si la línea de 24 movería el alto medido, se baja el padding para que el alto total quede igual.
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.
178
+
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
180
+ en esos dos tamaños.
181
+
142
182
  ## API
143
183
 
144
184
  <!-- api:inicio -->
@@ -177,6 +217,9 @@ interface SuiFooterButtonConfig {
177
217
  - **No es un `<button>` nativo.** El host es `<sui-button role="button">`. `type="submit"`
178
218
  funciona porque intercepta el clic y llama a `form.requestSubmit()` del `<form>` más cercano;
179
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.
180
223
  - **El output no existe**: aquí es `(click)`. En `sui-link-button`, `sui-compact-button`,
181
224
  `sui-fancy-button` y `sui-social-button` es `(clicked)`.
182
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'"`, 27 usos hoy en `master-pedidos` (16 `large`/`small`,
86
- 9 `large`/`medium`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
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 tiene que ser ancha (los 7 días repartidos en todo el ancho, no apretados a
104
- la izquierda). Si las opciones no entran ni en `medium`, va una lista de `sui-checkbox`.
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'"`, 27 usos hoy en `master-pedidos` (16 `large`/`small`,
42
- 9 `large`/`medium`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
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
@@ -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**. Variantes: 227 `default` explícito, 24 sin
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 cards en 6 archivos con `gap` puesto en la clase del `sui-card`**, que no llega a los hijos
79
- del cuerpo: `pages/central/central-inicio/central-inicio.html:36` (×6),
80
- `pages/super-admin/master-semanas/master-semanas.html:21` (×4),
81
- `pages/central/central-ingresos/central-ingresos.html:36` (×3), `pages/invoices/invoices.html:19`
82
- (×2), `pages/driver/driver-history/driver-history.html:17` (×2) y
83
- `pages/driver/driver-wallet/driver-wallet.html:154` (ahí además el `flex-direction: row` del host
84
- no pone el badge al lado del monto: el cuerpo es un solo hijo).
85
- - **3 cards tocables armadas a mano** (`(click)` o `routerLink` sin `[interactive]`): sin foco, sin
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:226`).
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:59` y `:80`.
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:264` y `:401`,
66
- `pages/reports/reports.ts:338` y `:381`, `core/utils/chart-barras-repartidores.ts:166`. Si nadie
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
- <sui-chart-legend [orientation]="bp.isMobile() ? 'horizontal' : 'vertical'" [items]="metodos()" />
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:225` y `:294` (permisos: «Gestionar productos»…),
73
- `components/option-sections-manager/option-sections-manager.html:188` (categorías) y `:210`
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
- - **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.
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») ya es canon desde el README de `sui-switch-label`.
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 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **3
35
- > checkbox-cards en 2 archivos**, los 3 `left-icon` con ícono y descripción (formas de entrega en
36
- > mi-negocio y en locales administrados). 2 con `bp.controlSize()`, 1 sin `size`. Hay **5
37
- > `sui-switch-card` que deberían ser este componente** (los métodos de pago de mi-negocio).
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 (los 3 de hoy) |
44
- | `basic` | Ver «No usar». | propuesta |
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`, `company` | Ver «No usar». El logo lo proyectas tú con `slot="leading"`. | propuesta |
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 (los 3 de hoy) |
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
- - **1 sin `size`**: `pages/super-admin/master-administrados/master-administrados.html:172`.
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 (≥ 72 con descripción): llega al piso de 44 sola. El `size`
78
- cambia solo la casilla.
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"` / `"company"` / `"card-provider"` (0 usos) | no hay integraciones ni tarjetas | prender varias integraciones a la vez (logo proyectado), varias sucursales de un local |
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. **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.
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 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 |
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:225` y `:294`
57
- (permisos), `components/option-sections-manager/option-sections-manager.html:188` y `:210`.
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 | `xlarge` (casilla 28, label 16/24) | `large` (casilla 24, label 16/24) | canon (aprobado por el dueño, 03-10-2026) |
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.controlSize()" label="Recordar mi dirección" [(active)]="recordar" />
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
- - **No tiene `size`**: la casilla siempre mide 20 px.
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:289` elige el color de una variante con
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 |