@ajuarezso/sui-design-system 0.25.0 → 0.25.2

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 (120) hide show
  1. package/docs/sui-accordion/README.md +83 -9
  2. package/docs/sui-activity-feed/README.md +55 -1
  3. package/docs/sui-activity-filter/README.md +50 -1
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +57 -3
  6. package/docs/sui-avatar/README.md +66 -6
  7. package/docs/sui-avatar-group/README.md +64 -2
  8. package/docs/sui-badge/README.md +79 -11
  9. package/docs/sui-banner/README.md +70 -5
  10. package/docs/sui-brand-logo/README.md +77 -14
  11. package/docs/sui-breadcrumb-item/README.md +51 -0
  12. package/docs/sui-breadcrumbs/README.md +48 -0
  13. package/docs/sui-button/README.md +68 -6
  14. package/docs/sui-button-group/README.md +70 -5
  15. package/docs/sui-button-group-item/README.md +68 -4
  16. package/docs/sui-card/README.md +97 -10
  17. package/docs/sui-chart-legend/README.md +53 -0
  18. package/docs/sui-chart-legend-dot/README.md +49 -0
  19. package/docs/sui-checkbox/README.md +106 -26
  20. package/docs/sui-checkbox-card/README.md +58 -2
  21. package/docs/sui-checkbox-label/README.md +89 -23
  22. package/docs/sui-circular-progress-bar/README.md +63 -5
  23. package/docs/sui-color-dot/README.md +61 -5
  24. package/docs/sui-color-picker/README.md +62 -4
  25. package/docs/sui-command-menu-footer/README.md +49 -0
  26. package/docs/sui-command-menu-item/README.md +63 -4
  27. package/docs/sui-command-menu-search/README.md +58 -4
  28. package/docs/sui-compact-avatar-group/README.md +61 -4
  29. package/docs/sui-compact-button/README.md +112 -28
  30. package/docs/sui-compact-select/README.md +58 -4
  31. package/docs/sui-compact-select-for-input/README.md +69 -5
  32. package/docs/sui-content-card/README.md +63 -2
  33. package/docs/sui-content-divider/README.md +49 -1
  34. package/docs/sui-content-label/README.md +83 -4
  35. package/docs/sui-counter-input/README.md +91 -7
  36. package/docs/sui-date-selector/README.md +61 -3
  37. package/docs/sui-datepicker/README.md +72 -5
  38. package/docs/sui-day-cell/README.md +60 -3
  39. package/docs/sui-day-label/README.md +52 -3
  40. package/docs/sui-divider/README.md +57 -5
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +60 -3
  43. package/docs/sui-dropdown-caption/README.md +53 -1
  44. package/docs/sui-dropdown-item/README.md +72 -6
  45. package/docs/sui-dropdown-menu/README.md +74 -5
  46. package/docs/sui-dropdown-search/README.md +57 -1
  47. package/docs/sui-emoji/README.md +82 -18
  48. package/docs/sui-empty-state/README.md +68 -4
  49. package/docs/sui-fancy-button/README.md +59 -1
  50. package/docs/sui-file-icon/README.md +56 -1
  51. package/docs/sui-file-upload/README.md +69 -9
  52. package/docs/sui-file-upload-card/README.md +53 -2
  53. package/docs/sui-filter/README.md +74 -5
  54. package/docs/sui-flag/README.md +62 -1
  55. package/docs/sui-form-hint/README.md +54 -5
  56. package/docs/sui-form-label/README.md +53 -1
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +69 -4
  59. package/docs/sui-image-upload/README.md +70 -3
  60. package/docs/sui-image-upload-profile/README.md +58 -0
  61. package/docs/sui-img-retry/README.md +49 -0
  62. package/docs/sui-inline-input/README.md +61 -3
  63. package/docs/sui-inline-select/README.md +60 -0
  64. package/docs/sui-input/README.md +77 -14
  65. package/docs/sui-integration-switch/README.md +69 -2
  66. package/docs/sui-kbd/README.md +71 -7
  67. package/docs/sui-key-icon/README.md +65 -6
  68. package/docs/sui-link-button/README.md +79 -13
  69. package/docs/sui-logo/README.md +74 -4
  70. package/docs/sui-modal/README.md +61 -2
  71. package/docs/sui-modal-footer/README.md +83 -9
  72. package/docs/sui-modal-header/README.md +56 -0
  73. package/docs/sui-modal-sheet/README.md +72 -10
  74. package/docs/sui-notification/README.md +71 -1
  75. package/docs/sui-notification-footer/README.md +51 -1
  76. package/docs/sui-notification-tab-menu/README.md +57 -1
  77. package/docs/sui-otp-input/README.md +67 -6
  78. package/docs/sui-page-header/README.md +83 -15
  79. package/docs/sui-pagination/README.md +60 -0
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +66 -7
  82. package/docs/sui-period-range/README.md +65 -6
  83. package/docs/sui-popover/README.md +73 -7
  84. package/docs/sui-product-card/README.md +76 -8
  85. package/docs/sui-progress-bar/README.md +72 -8
  86. package/docs/sui-progress-bar-label/README.md +69 -12
  87. package/docs/sui-radio/README.md +83 -6
  88. package/docs/sui-radio-card/README.md +58 -4
  89. package/docs/sui-radio-label/README.md +86 -19
  90. package/docs/sui-rating/README.md +81 -14
  91. package/docs/sui-rich-editor/README.md +45 -0
  92. package/docs/sui-segmented-control/README.md +83 -14
  93. package/docs/sui-select/README.md +72 -3
  94. package/docs/sui-sidebar/README.md +64 -9
  95. package/docs/sui-slider/README.md +68 -1
  96. package/docs/sui-social-button/README.md +63 -3
  97. package/docs/sui-status-badge/README.md +64 -6
  98. package/docs/sui-stepper/README.md +57 -0
  99. package/docs/sui-store-card/README.md +71 -8
  100. package/docs/sui-switch/README.md +80 -9
  101. package/docs/sui-switch-card/README.md +70 -6
  102. package/docs/sui-switch-label/README.md +90 -13
  103. package/docs/sui-tab-chips/README.md +79 -9
  104. package/docs/sui-tab-menu-horizontal/README.md +62 -1
  105. package/docs/sui-tab-menu-vertical/README.md +56 -3
  106. package/docs/sui-table/README.md +68 -7
  107. package/docs/sui-tag/README.md +75 -4
  108. package/docs/sui-tag-input/README.md +71 -7
  109. package/docs/sui-textarea/README.md +78 -11
  110. package/docs/sui-time-picker/README.md +70 -7
  111. package/docs/sui-toast/README.md +65 -5
  112. package/docs/sui-tooltip/README.md +61 -4
  113. package/docs/sui-topbar/README.md +57 -3
  114. package/docs/sui-topbar-button/README.md +57 -3
  115. package/docs/sui-topbar-item/README.md +61 -0
  116. package/docs/sui-topbar-user/README.md +56 -0
  117. package/fesm2022/ajuarezso-sui-design-system.mjs +216 -227
  118. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  119. package/package.json +1 -1
  120. package/types/ajuarezso-sui-design-system.d.ts +68 -45
@@ -77,7 +77,7 @@ Regla corta: **etiqueta, número o estado con muchos valores → badge · comple
77
77
  fijos y los ternarios legibles en el template; el resto de los 77 dinámicos, que salen de
78
78
  funciones o campos, no):
79
79
 
80
- - **5 casos.** «Pendiente» en `red`: `pages/super-admin/super-admin.html:626`. «Pendiente» en
80
+ - **5 casos.** «Pendiente» en `red`: `pages/super-admin/super-admin.html:637`. «Pendiente» en
81
81
  `yellow` (ausente): `pages/super-admin/master-gastos/master-gastos.html:67` y `:115`. «No cuadra»
82
82
  en `yellow`: `pages/super-admin/master-gastos/master-gastos.html:60` y `:129`. Los cinco pasan a
83
83
  `orange`.
@@ -117,7 +117,7 @@ un paso más fuerte con texto **oscuro**; `filled` = fondo saturado con texto bl
117
117
 
118
118
  - **16 `light` → `lighter`** (salvo que estén sobre superficie teñida; no se verificó
119
119
  renderizado). Ejemplos: `pages/super-admin/master-drivers/master-drivers.html:781`, `:783`, `:785`,
120
- `pages/super-admin/master-users/master-user-sheet.html:44`, `pages/reports/reports.html:215`.
120
+ `pages/super-admin/master-users/master-user-sheet.html:44`, `pages/reports/reports.html:217`.
121
121
  - **1 `filled` como metadato → `lighter`:** `pages/customer/profile/profile.html:122` («Por defecto»).
122
122
  A discutir: `pages/public/pricing/pricing.html:37` (el «Popular» del plan destacado).
123
123
  - **1 `lighter` sobre superficie oscura → `dark`:** `pages/mi-negocio/mi-negocio.html:89` («Mes gratis»).
@@ -126,8 +126,7 @@ un paso más fuerte con texto **oscuro**; `filled` = fondo saturado con texto bl
126
126
 
127
127
  | eje | valor | cuándo | fuente |
128
128
  |---|---|---|---|
129
- | `size` | `small` (default, 16 px) | Lo normal. **Va en MAYÚSCULAS.** | según la guía del DS (mayúsculas y default) |
130
- | `size` | `small` | No usar: es chico (D16). Hasta el 05-10-2026 era el normal de web, en mayúsculas. | canon (dueño, 05-10-2026, D16); reemplaza la regla del 03-10-2026 |
129
+ | `size` | `small` (default, 16 px) | **No usar**: es chico (D16). Es el default del componente, así que hay que pasar `size` siempre. Va en MAYÚSCULAS (eso sí es de la guía). Hasta el 05-10-2026 era el normal de web. | D16, dueño 05-10-2026 (reemplaza la regla del 03-10-2026) · mayúsculas y default: según la guía del DS |
131
130
  | `size` | `medium` (20 px) | **Lo normal en la computadora, la tablet y el celular chico** (el badge no se toca), sin mayúsculas. En el celular, `large` o `xlarge` (ver «Tamaño»). | canon (dueño, 05-10-2026, D16); antes, canon del 03-10-2026 solo para nombres, montos y títulos grandes |
132
131
  | `type` | `number` | **Números**: queda cuadrado/circular. | según la guía del DS |
133
132
  | `type` | `number` | Va con `filled` cuando el conteo pide acción. | canon (aprobado por el dueño, 03-10-2026) |
@@ -179,14 +178,45 @@ canon (dueño, 04-10-2026):** el badge mantiene su escala propia 12 / 14 / 16 (`
179
178
  | junto a un título o un monto | `xlarge` (28) | `medium` (20) | canon (dueño, 05-10-2026, P1 b) |
180
179
  | conteo (`type="number"`) | `large` (24) | `medium` (20) | canon (dueño, 05-10-2026, P1 b); web `medium`: canon (dueño, 05-10-2026, D16) · antes de migrar, ver en captura que el contador de 24 no tape el ícono de la barra inferior |
181
180
 
182
- Patrón (`bp` = `BreakpointsService`, mobile hasta 767 px). Medido el 04-10-2026: solo 6 de los
183
- 214 badges de la app lo aplican (`pages/customer/cart/cart.html:71`,
184
- `pages/customer/order-history/order-history.html:176`…); el resto va con `size` fijo:
181
+ Patrón (`bp` = `BreakpointsService`). Medido el 06-10-2026 en `master-pedidos/src/app` (sin
182
+ `master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `master-rutina`, `master-medico`
183
+ ni `dev-index`): 211 de los 228 badges ya van con `bp.sizeBadge()`. Quedan **17 fijos**:
184
+
185
+ - **2 en `small`**, el conteo de la barra inferior: `components/glass-tab-bar/glass-tab-bar.html:16`
186
+ y `:33` (pendiente de ver en captura que el de 24 no tape el ícono).
187
+ - **15 en `medium`**, que en el celular no suben (van a `large`, o a `xlarge` si están junto a un
188
+ título o un monto, según la tabla de arriba):
189
+ `components/product-categories/product-categories.html:17` y `:52`,
190
+ `components/total-sales/total-sales.html:20`, `components/metrics-cards/metrics-cards.html:15`,
191
+ `pages/products/products.html:61`, `pages/customers/customers.html:16`,
192
+ `pages/discounts/discounts.html:20`,
193
+ `pages/super-admin/master-semanas/master-semanas.html:26`, `:40`, `:52` y `:64`,
194
+ `pages/overview/components/overview-visitors/overview-visitors.html:11`,
195
+ `pages/overview/components/overview-conversion/overview-conversion.html:11`,
196
+ `pages/overview/components/overview-sales/overview-sales.html:11` y
197
+ `pages/reports/reports.html:40`.
185
198
 
186
199
  ```html
187
- <sui-badge [size]="bp.isMobile() ? 'large' : 'medium'" …/>
200
+ <sui-badge [size]="bp.sizeBadge()" …/>
188
201
  ```
189
202
 
203
+ ### Por dispositivo (D16)
204
+
205
+ El badge no se toca: sube **solo en el celular de 380 px o más**. Fuente: D16, dueño 05-10-2026.
206
+
207
+ | dispositivo | size | nota |
208
+ |---|---|---|
209
+ | celular chico (< 380) | `medium` | no se toca: no sube aunque sea un celular |
210
+ | celular (380–767) | `large` (`xlarge` junto a un título o un monto) | un paso más que en la computadora |
211
+ | tablet táctil (`pointer: coarse`) | `medium` | no se toca: el puntero no cambia nada |
212
+ | computadora (`pointer: fine`) | `medium` | nunca `small`; `medium` va sin MAYÚSCULAS |
213
+
214
+ En el ultrawide, igual que en la computadora.
215
+
216
+ En master-pedidos: `[size]="bp.sizeBadge()"` (`large` en el celular, `medium` en el resto). Junto
217
+ a un título o un monto, donde el celular va en `xlarge`, el helper no alcanza (solo devuelve
218
+ `large` o `medium`): `[size]="bp.celular() ? 'xlarge' : 'medium'"`.
219
+
190
220
  ## API
191
221
 
192
222
  <!-- api:inicio -->
@@ -233,15 +263,53 @@ interface SuiBadgeConfig {
233
263
  - `disabled` no baja la opacidad: pinta todo en los grises de deshabilitado.
234
264
  - El host lleva `role="status"`: el lector de pantalla anuncia los cambios.
235
265
 
266
+ ## Bien y mal
267
+
268
+ Estado pendiente
269
+
270
+ ```html
271
+ <!-- ❌ mal: red es error; «Pendiente» pide atención (pages/super-admin/super-admin.html:637) -->
272
+ <sui-badge variant="lighter" color="red" [size]="bp.sizeBadge()">Pendiente</sui-badge>
273
+ ```
274
+
275
+ ```html
276
+ <!-- ✅ bien -->
277
+ <sui-badge color="orange" [size]="bp.sizeBadge()">Pendiente</sui-badge>
278
+ ```
279
+
280
+ Categoría en una lista
281
+
282
+ ```html
283
+ <!-- ❌ mal: light es solo para una superficie ya teñida; en una lista va lighter (pages/reports/reports.html:217) -->
284
+ <sui-badge variant="light" color="gray" [size]="bp.sizeBadge()">{{ product.category }}</sui-badge>
285
+ ```
286
+
287
+ ```html
288
+ <!-- ✅ bien -->
289
+ <sui-badge color="gray" [size]="bp.sizeBadge()">{{ product.category }}</sui-badge>
290
+ ```
291
+
292
+ Metadato al lado de un nombre
293
+
294
+ ```html
295
+ <!-- ❌ mal: filled es para un conteo que pide acción o encima de una foto; «Por defecto» es un metadato sin carga, va gray lighter (pages/customer/profile/profile.html:122) -->
296
+ <sui-badge variant="filled" color="orange" [size]="bp.sizeBadge()">Por defecto</sui-badge>
297
+ ```
298
+
299
+ ```html
300
+ <!-- ✅ bien -->
301
+ <sui-badge color="gray" [size]="bp.sizeBadge()">Por defecto</sui-badge>
302
+ ```
303
+
236
304
  ## Ejemplo
237
305
 
238
306
  ```html
239
307
  <!-- Metadato en una lista: lighter (default) -->
240
- <sui-badge color="green">Conectado</sui-badge>
308
+ <sui-badge color="green" [size]="bp.sizeBadge()">Conectado</sui-badge>
241
309
 
242
310
  <!-- Estado vivo -->
243
- <sui-badge color="green" type="with-dot">Abierto</sui-badge>
311
+ <sui-badge color="green" type="with-dot" [size]="bp.sizeBadge()">Abierto</sui-badge>
244
312
 
245
313
  <!-- Conteo que pide acción -->
246
- <sui-badge color="orange" variant="filled" type="number">3</sui-badge>
314
+ <sui-badge color="orange" variant="filled" type="number" [size]="bp.sizeBadge()">3</sui-badge>
247
315
  ```
@@ -119,19 +119,37 @@ El banner **no tiene `size`**: mide 44 px de alto en web, centrado; en mobile (
119
119
  | uso | mobile | web | fuente |
120
120
  |---|---|---|---|
121
121
  | la barra | 44 px mínimo, crece si el texto envuelve | 44 px fijos, una línea | según el componente |
122
- | el link de acción | `large` (24 px) | `medium` (20 px) | propuesta, falta aprobación |
122
+ | el link de acción | **pendiente (P8)**: `medium` con el área de 44 en la barra (a, recomendada) o `large` (b) | `medium` (20 px) | web: D16, dueño 05-10-2026 · mobile: pendiente P8 (antes decía `large` como propuesta) |
123
123
  | la X de cerrar | se ve de 24 px; **se toca en 44 × 44** | se ve de 24; se toca en 40 × 40 | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono (antes 40, pedido del dueño 03-10-2026): área táctil invisible, extensión SUI |
124
124
 
125
125
  ```html
126
126
  <sui-banner variant="warning" variantStyle="lighter" title="Tu plan vence en 3 días"
127
127
  description="Renueva para seguir recibiendo pedidos">
128
- <sui-link-button slot="action" variant="modifiable" [underline]="true"
129
- [size]="bp.isMobile() ? 'large' : 'medium'" (clicked)="renovar()">Renovar plan</sui-link-button>
128
+ <sui-link-button slot="action" variant="modifiable" [underline]="true" (clicked)="renovar()">Renovar plan</sui-link-button>
130
129
  </sui-banner>
131
130
  ```
132
131
 
133
- `size="large"` del link-button ya está publicado (la app usa 0.22.0). Hoy el link del banner de la
134
- suscripción (`subscription-banner.html:10`) sigue con `medium` en las dos.
132
+ `size="large"` del link-button ya está publicado (la app usa 0.24.1), pero mientras P8 siga
133
+ pendiente el link queda en su default (`medium`), que es como está hoy el de la suscripción
134
+ (`subscription-banner.html:10`).
135
+
136
+ ### Por dispositivo (D16)
137
+
138
+ La barra **no tiene `size`**: su alto lo decide el ancho (≤ 767 px envuelve con mínimo de 44; más
139
+ ancho, 44 fijos en una línea). Lo único que cambia por dispositivo es el link del slot `action`, que
140
+ sigue la fila de `link-button` de D16.
141
+
142
+ | dispositivo | size | nota |
143
+ |---|---|---|
144
+ | celular chico (< 380) | link `medium` | la barra envuelve; la X se toca en 44 × 44 |
145
+ | celular (380–767) | link **pendiente (P8)** | la barra envuelve; la X se toca en 44 × 44. Ningún size del link llega a 44 por sí solo |
146
+ | tablet táctil (`pointer: coarse`) | link **pendiente (P8)** | con ≥ 768 px la barra va en una línea y la X se toca en 40 × 40: el área de 44 sale con `max-width: 767px`, no con el puntero (el mixin `sui-tactil` está propuesto, sin aprobar) |
147
+ | computadora (`pointer: fine`) | link `medium` | 44 px fijos, una línea; X en 40 × 40 |
148
+
149
+ Ultrawide: igual que la computadora; el banner ya ocupa todo el ancho de su contenedor.
150
+
151
+ En master-pedidos: el banner no lleva `[size]`; el link va sin `[size]` (su default `medium`)
152
+ hasta que se decida P8. No hay helper en `BreakpointsService` para el link.
135
153
 
136
154
  ## «No usar»: por qué no hoy y cuándo sí
137
155
 
@@ -188,6 +206,53 @@ y `[slot=action]` (el link).
188
206
  - En mobile, una pantalla con modal a pantalla completa tapa el banner: el de la suscripción se
189
207
  esconde con `uiOverlay.fullscreenOpen()` para no quedar encima.
190
208
 
209
+ ## Bien y mal
210
+
211
+ **Aviso de un pedido, no de toda la app**
212
+
213
+ ```html
214
+ <!-- ❌ mal: es el cobro de UN pedido, dentro de su detalle (driver-order-detail.html:410) -->
215
+ <sui-banner [variant]="pagaElLocal() ? 'error' : 'info'" variantStyle="filled"
216
+ [title]="quienPagaTitulo()" [description]="cobro" />
217
+ ```
218
+
219
+ ```html
220
+ <!-- ✅ bien -->
221
+ <sui-alert [variant]="pagaElLocal() ? 'error' : 'info'" [variantStyle]="pagaElLocal() ? 'filled' : 'lighter'"
222
+ [title]="quienPagaTitulo()" [description]="cobro" />
223
+ ```
224
+
225
+ **Plan por vencer: acompaña, no grita**
226
+
227
+ ```html
228
+ <!-- ❌ mal: `light` no se usa hoy; el aviso que acompaña es `lighter` (subscription-banner.html:7) -->
229
+ <sui-banner [variant]="isDanger() ? 'error' : 'warning'"
230
+ [variantStyle]="isDanger() ? 'filled' : 'light'" [title]="bannerTitle()" />
231
+ ```
232
+
233
+ ```html
234
+ <!-- ✅ bien -->
235
+ <sui-banner [variant]="isDanger() ? 'error' : 'warning'"
236
+ [variantStyle]="isDanger() ? 'filled' : 'lighter'" [title]="bannerTitle()" />
237
+ ```
238
+
239
+ **Modo de toda la app hecho a mano**
240
+
241
+ ```html
242
+ <!-- ❌ mal: barra propia con #fff y un <button> suelto (impersonation-banner.ts:17) -->
243
+ <div class="imp" role="status">
244
+ <span class="imp__text">Estás administrando <strong>{{ t.name }}</strong> como super admin</span>
245
+ <button type="button" class="imp__exit" (click)="exit()">Salir</button>
246
+ </div>
247
+ ```
248
+
249
+ ```html
250
+ <!-- ✅ bien -->
251
+ <sui-banner variant="warning" variantStyle="filled" [title]="'Estás administrando ' + t.name + ' como super admin'">
252
+ <sui-link-button slot="action" variant="modifiable" [underline]="true" (clicked)="exit()">Salir</sui-link-button>
253
+ </sui-banner>
254
+ ```
255
+
191
256
  ## Ejemplo
192
257
 
193
258
  ```html
@@ -58,10 +58,10 @@ Regla corta: **la marca es lo que se muestra → brand-logo · es un ícono más
58
58
  |---|---|---|---|
59
59
  | `xs` | 16 | Dentro de un texto o de un tag. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
60
60
  | `sm` | 20 | Dentro de un botón (lo usa `sui-social-button`). | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
61
- | `md` (default) | 24 | Fila de una lista. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
62
- | `lg` | 32 | Tarjeta de contacto (el tamaño del Figma). | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
61
+ | `md` (default) | 24 | Fila de una lista o tarjeta de contacto, en la computadora, la tablet y el celular chico (ver «Por dispositivo (D16)»). | canon (aprobado por el dueño, 05-10-2026, bloque B1) · por dispositivo: D16, dueño 05-10-2026 |
62
+ | `lg` | 32 | Tarjeta de contacto o fila en el celular (380–767), un paso arriba del `md` de la computadora; es el tamaño del Figma. También el logo con `href` en la computadora (propuesta). | canon (aprobado por el dueño, 05-10-2026, bloque B1) · por dispositivo: D16, dueño 05-10-2026 |
63
63
  | `xl` | 40 | Tarjeta grande. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
64
- | `2xl` | 48 | Lo pide `sui-content-label` en tamaño grande. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
64
+ | `2xl` | 48 | Lo pide `sui-content-label` en tamaño grande. Y el logo con `href` en todo lo táctil: es el único que llega a 44. | canon (aprobado por el dueño, 05-10-2026, bloque B1) · con `href`: canon (dueño, 04-10-2026) |
65
65
 
66
66
  ### `href`, `target`, `rel`, `disabled`, `ariaLabel`
67
67
 
@@ -75,19 +75,19 @@ Usos de hoy que rompen la regla: **0**.
75
75
 
76
76
  ## Tamaño en mobile y en web
77
77
 
78
- En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
79
- pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
80
- breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
81
- el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**, salvo lo
82
- marcado canon.
78
+ En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. Se elige
79
+ siempre con el servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`),
80
+ también en las pantallas que solo existen en el celular (cliente, repartidor): con D16 el celular
81
+ chico y la tablet llevan el valor de web en lo que no se toca (D16, dueño 05-10-2026). Todo es
82
+ **propuesta**, salvo lo marcado canon.
83
83
 
84
84
  | uso | mobile | web | fuente |
85
85
  |---|---|---|---|
86
86
  | tarjeta de contacto, fila | `lg` (32) | `md` (24) | canon (dueño, 05-10-2026, P1 b) |
87
- | como link (con `href`, se toca) | `2xl` (48) | `lg` (32) | mobile: canon (decisión del dueño 04-10-2026, piso táctil 44: `2xl` es el único size que llega) · web: propuesta |
87
+ | como link (con `href`, se toca) | `2xl` (48), también en la tablet táctil | `lg` (32) | mobile: canon (decisión del dueño 04-10-2026, piso táctil 44: `2xl` es el único size que llega) · tablet: D16, dueño 05-10-2026 (lo que se toca) · web: propuesta |
88
88
 
89
89
  ```html
90
- <sui-brand-logo company="instagram" [size]="bp.isMobile() ? '2xl' : 'lg'" [href]="url" target="_blank"
90
+ <sui-brand-logo company="instagram" [size]="bp.tactil() ? '2xl' : 'lg'" [href]="url" target="_blank"
91
91
  ariaLabel="Síguenos en Instagram" />
92
92
  ```
93
93
 
@@ -95,6 +95,25 @@ Con `href` el logo **es** el área táctil: en mobile tiene que medir 44 px o m
95
95
  tamaño que llega es `2xl` (48). Si se quiere un logo de 32 px tocable, el link va en un
96
96
  contenedor de 44 px.
97
97
 
98
+ ### Por dispositivo (D16)
99
+
100
+ Sin `href` no se toca: sigue la fila de `brand-logo` de D16 (sube un paso solo en el celular). Con
101
+ `href` se toca: va `2xl` en todo lo táctil.
102
+
103
+ | dispositivo | size | nota |
104
+ |---|---|---|
105
+ | celular chico (< 380) | `md` · con `href`: `2xl` | lo que no se toca va con el valor de web; el link no tiene otro size que llegue a 44 |
106
+ | celular (380–767) | `lg` · con `href`: `2xl` | el valor de mobile de la tabla de arriba |
107
+ | tablet táctil (`pointer: coarse`) | `md` · con `href`: `2xl` | se toca con el dedo: el link también pide 44 |
108
+ | computadora (`pointer: fine`) | `md` · con `href`: `lg` | el `lg` del link en la computadora sigue siendo propuesta |
109
+
110
+ Ultrawide: igual que la computadora.
111
+
112
+ En master-pedidos (no hay helper propio): `[size]="bp.celular() ? 'lg' : 'md'"` sin `href`;
113
+ `[size]="bp.tactil() ? '2xl' : 'lg'"` con `href`. Los size de la fila son los de «tarjeta de
114
+ contacto, fila»: en otro uso (`xs` en un texto, `xl` en una tarjeta grande) se sube un paso igual,
115
+ solo en `bp.celular()`.
116
+
98
117
  ## «No usar»: por qué no hoy y cuándo sí
99
118
 
100
119
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -132,13 +151,57 @@ Outputs: ninguno.
132
151
  - Con `href` y `disabled` a la vez, no se vuelve link.
133
152
  - El `aria-label` por defecto es «Logo de <Marca>» (en español desde el 04-10-2026); con `href` pasa uno que diga adónde lleva.
134
153
 
154
+ ## Bien y mal
155
+
156
+ **Logo que lleva a la red del negocio**
157
+
158
+ ```html
159
+ <!-- ❌ mal: con `href` el logo ES el área táctil, y `lg` (32) no llega a 44 en el celular -->
160
+ <sui-brand-logo company="instagram" size="lg" [href]="url" target="_blank"
161
+ ariaLabel="Síguenos en Instagram" />
162
+ ```
163
+
164
+ ```html
165
+ <!-- ✅ bien -->
166
+ <sui-brand-logo company="instagram" [size]="bp.tactil() ? '2xl' : 'lg'" [href]="url" target="_blank"
167
+ ariaLabel="Síguenos en Instagram" />
168
+ ```
169
+
170
+ **Entrar con Google**
171
+
172
+ ```html
173
+ <!-- ❌ mal: botón armado a mano con el logo adentro -->
174
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()">
175
+ <sui-brand-logo company="google" size="sm" /> Continuar con Google
176
+ </sui-button>
177
+ ```
178
+
179
+ ```html
180
+ <!-- ✅ bien -->
181
+ <sui-social-button brand="google" variantStyle="stroke" [size]="bp.sizeControl()" label="Continuar con Google" />
182
+ ```
183
+
184
+ **WhatsApp como un ícono más del botón**
185
+
186
+ ```html
187
+ <!-- ❌ mal: dentro de un botón la marca no es el contenido, y el <img> no toma el color del texto -->
188
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()">
189
+ <sui-brand-logo company="whatsapp" size="sm" /> Escríbenos
190
+ </sui-button>
191
+ ```
192
+
193
+ ```html
194
+ <!-- ✅ bien -->
195
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()" leftIcon="whatsapp-line">Escríbenos</sui-button>
196
+ ```
197
+
135
198
  ## Ejemplo
136
199
 
137
200
  ```html
138
- <!-- Tarjeta de soporte -->
139
- <sui-brand-logo company="whatsapp" size="lg" />
201
+ <!-- Tarjeta de soporte: no se toca, sube un paso solo en el celular -->
202
+ <sui-brand-logo company="whatsapp" [size]="bp.celular() ? 'lg' : 'md'" />
140
203
 
141
- <!-- Red del negocio, como link -->
142
- <sui-brand-logo company="instagram" size="2xl" [href]="tenant.instagramUrl" target="_blank"
204
+ <!-- Red del negocio, como link: se toca, 2xl en todo lo táctil -->
205
+ <sui-brand-logo company="instagram" [size]="bp.tactil() ? '2xl' : 'lg'" [href]="tenant.instagramUrl" target="_blank"
143
206
  ariaLabel="Síguenos en Instagram" />
144
207
  ```
@@ -52,6 +52,17 @@ no se usa en mobile.
52
52
  @if (!bp.isMobile()) { <sui-breadcrumbs [items]="ruta()" /> }
53
53
  ```
54
54
 
55
+ ### Por dispositivo (D16)
56
+
57
+ No aplica: no tiene `size` y mide 20 px fijos en todo dispositivo. Ni la miga ni `sui-breadcrumbs`
58
+ se ocultan solos (no tienen `@media` ni lógica para eso): **lo decide la pantalla que usa la ruta**,
59
+ con su propio `@if (!bp.isMobile())`. Con eso no se muestra en el celular chico ni en el celular, y
60
+ sí en la computadora y el ultrawide. En la tablet táctil con 768 px o más `bp.isMobile()` es falso, la
61
+ ruta se muestra y la miga de 20 px no llega al piso de 44 de lo táctil: no hay size que lo arregle y
62
+ queda sin decidir, igual que en `sui-breadcrumbs`.
63
+
64
+ En master-pedidos: sin `[size]`; la pantalla envuelve `sui-breadcrumbs` en `@if (!bp.isMobile())`.
65
+
55
66
  ## «No usar»: por qué no hoy y cuándo sí
56
67
 
57
68
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -85,6 +96,46 @@ no se usa en mobile.
85
96
  `SuiBreadcrumbEntry`. No son lo mismo.
86
97
  - No trae separador: el separador lo pone `sui-breadcrumbs`.
87
98
 
99
+ ## Bien y mal
100
+
101
+ **Ruta armada a mano**
102
+
103
+ ```html
104
+ <!-- ❌ mal: separador propio y activo a mano; sui-breadcrumbs ya hace las dos cosas -->
105
+ <sui-breadcrumb-item label="Productos" href="/empresa/productos" />
106
+ <sui-icon name="arrow-right-s-line" />
107
+ <sui-breadcrumb-item label="Hamburguesas" [active]="true" />
108
+ ```
109
+
110
+ ```html
111
+ <!-- ✅ bien -->
112
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: 'Hamburguesas' }]" />
113
+ ```
114
+
115
+ **Inicio solo con el ícono**
116
+
117
+ ```html
118
+ <!-- ❌ mal: sin texto ni `ariaLabel`, el lector de pantalla no dice adónde lleva -->
119
+ <sui-breadcrumb-item icon="home-5-line" href="/empresa/inicio" />
120
+ ```
121
+
122
+ ```html
123
+ <!-- ✅ bien -->
124
+ <sui-breadcrumb-item icon="home-5-line" ariaLabel="Inicio" href="/empresa/inicio" />
125
+ ```
126
+
127
+ **Navegar dos veces**
128
+
129
+ ```html
130
+ <!-- ❌ mal: con `href` el clic ya navega y además emite `clicked` -->
131
+ <sui-breadcrumb-item label="Productos" href="/empresa/productos" (clicked)="router.navigateByUrl('/empresa/productos')" />
132
+ ```
133
+
134
+ ```html
135
+ <!-- ✅ bien -->
136
+ <sui-breadcrumb-item label="Productos" href="/empresa/productos" />
137
+ ```
138
+
88
139
  ## Ejemplo
89
140
 
90
141
  ```html
@@ -67,6 +67,16 @@ Alto fijo de **20 px** (texto 14, ícono 20), sin `size`. **No tiene tamaño par
67
67
  }
68
68
  ```
69
69
 
70
+ ### Por dispositivo (D16)
71
+
72
+ No aplica: no tiene `size` y sus migas miden 20 px fijos (texto 14, ícono 20) en todo dispositivo;
73
+ lo que cambia por dispositivo es si se muestra, no su tamaño. En el celular chico y el celular no se
74
+ usa (flecha de volver); en la computadora y el ultrawide va tal cual. En la tablet táctil con 768 px o
75
+ más `bp.isMobile()` es falso y la ruta se muestra, con migas de 20 px que no llegan al piso de 44 de
76
+ lo táctil: no hay size que lo arregle y no está decidido si se oculta también ahí.
77
+
78
+ En master-pedidos: sin `[size]`; se muestra con `@if (!bp.isMobile())`.
79
+
70
80
  ## «No usar»: por qué no hoy y cuándo sí
71
81
 
72
82
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -111,6 +121,44 @@ type SuiBreadcrumbDivider = 'arrow' | 'slash' | 'dot';
111
121
  - El host dice `aria-label="Ruta de navegación"` (hasta el 03-10-2026, «Breadcrumb») y no se puede cambiar.
112
122
  - `SuiBreadcrumbEntry` (los datos) no es `SuiBreadcrumbItem` (el componente de cada miga).
113
123
 
124
+ ## Bien y mal
125
+
126
+ **Ruta en el celular**
127
+
128
+ ```html
129
+ <!-- ❌ mal: en 390 px la fila se corta y compite con el título -->
130
+ <sui-breadcrumbs [items]="ruta()" />
131
+ ```
132
+
133
+ ```html
134
+ <!-- ✅ bien -->
135
+ @if (!bp.isMobile()) { <sui-breadcrumbs [items]="ruta()" /> }
136
+ ```
137
+
138
+ **El nombre del nivel**
139
+
140
+ ```html
141
+ <!-- ❌ mal: un id nunca es el nombre de nada -->
142
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: producto.id }]" />
143
+ ```
144
+
145
+ ```html
146
+ <!-- ✅ bien -->
147
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: producto.name }]" />
148
+ ```
149
+
150
+ **Navegar dos veces**
151
+
152
+ ```html
153
+ <!-- ❌ mal: los ítems con `href` ya navegan; `navigate` sale igual y vuelve a navegar -->
154
+ <sui-breadcrumbs [items]="ruta()" (navigate)="router.navigateByUrl($event.href ?? '')" />
155
+ ```
156
+
157
+ ```html
158
+ <!-- ✅ bien: con `href`, sin `(navigate)` -->
159
+ <sui-breadcrumbs [items]="ruta()" />
160
+ ```
161
+
114
162
  ## Ejemplo
115
163
 
116
164
  ```html
@@ -103,8 +103,9 @@ Uso medido el 04-10-2026: 123 `large`, 93 `small`, 58 `medium` (5 por default),
103
103
  | `2xsmall` (28) | No usar: es chico. Las acciones de ícono en tablas van en `medium` `onlyIcon`; si de verdad no entra, `sui-compact-button`. | escala según la guía del DS; no usarlo: canon (dueño, 05-10-2026, D16), reemplaza el «cuándo» del bloque B13 |
104
104
  | `xlarge` (52) | Extensión de SUI. Sin uso hoy. | canon (aprobado por el dueño, 03-10-2026) |
105
105
 
106
- En la app el patrón responsive ya es `[size]="bp.isMobile() ? 'large' : 'medium'"` (o
107
- `bp.controlSize()`).
106
+ En la app el patrón responsive es `[size]="bp.sizeControl()"`: `large` en el celular y la tablet
107
+ táctil, `medium` en la computadora (D16, dueño 05-10-2026). **No uses `bp.controlSize()` en un
108
+ botón**: es el de checkbox/radio/switch y da `large` en la computadora. Ver «Por dispositivo (D16)».
108
109
 
109
110
  ## «No usar»: por qué no hoy y cuándo sí
110
111
 
@@ -138,11 +139,15 @@ en la acción principal. En la computadora, `medium` (40); la tablet va como el
138
139
  | acción en una tabla | — (no hay tablas en mobile) | `medium` (40) | canon (dueño, 05-10-2026, D16), antes `2xsmall` (03-10-2026) |
139
140
  | CTA de landing | `xlarge` (52) | `large` (48) | propuesta, falta aprobación |
140
141
 
141
- Patrón (`bp` = `BreakpointsService`, mobile hasta 767 px). Medido el 04-10-2026: 9 `sui-button` con este
142
- par exacto y 30 con algún tamaño por `bp`; en toda la app hay 142 `[size]` con este mismo par:
142
+ Patrón (`bp` = `BreakpointsService`). Medido el 06-10-2026 en `master-pedidos/src/app`, sin
143
+ prototipos ni vitrinas: 399 de 412 `sui-button` ya van con `bp.sizeControl()`; quedan 5 con
144
+ `sizeAccionesCard()` de `master-drivers.ts:243` (`bp.isMobile()` solo: deja la tablet en `medium`),
145
+ 1 con `bp.controlSize()` (`checkout.html:392`), 1 en `small` (`notifications.html:50`), 2 sin
146
+ `size` y 4 en `large` fijo (2 en el footer de `copy-text-dialog`, donde va bien; `cart.html:190` y
147
+ `master-orders.html:662` no son footer de modal y en la computadora irían en `medium`):
143
148
 
144
149
  ```html
145
- <sui-button [size]="bp.isMobile() ? 'large' : 'medium'" …/>
150
+ <sui-button [size]="bp.sizeControl()" …/>
146
151
  ```
147
152
 
148
153
  ### Piso táctil de 44 en el teléfono (canon, dueño 04-10-2026)
@@ -181,6 +186,23 @@ Vale para todos los componentes que tienen `size` `large` / `xlarge`:
181
186
  En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el botón ya usa Label/Medium 16/24
182
187
  en esos dos tamaños.
183
188
 
189
+ ### Por dispositivo (D16)
190
+
191
+ Fila `button` de la tabla D16 (dueño, 05-10-2026). Se toca, así que va por tipo de puntero además
192
+ del ancho.
193
+
194
+ | dispositivo | size | nota |
195
+ |---|---|---|
196
+ | celular chico (< 380 px) | `large` (48) | D16 pide `medium` con área tocable de 44; mientras el DS no estire el área de los `medium`, va `large` (interino) |
197
+ | celular (380–767 px) | `large` (48) | |
198
+ | tablet táctil (`pointer: coarse`) | `large` (48) | también se toca con el dedo: Apple pide 44 pt en el iPad |
199
+ | computadora (`pointer: fine`) | `medium` (40) | también en tablas, filas y cabeceras; `small`, `xsmall` y `2xsmall` no se usan |
200
+
201
+ Footer de modal: `large` en todos (D2). Ultrawide (≥ 1920 px): igual que la computadora, `medium`;
202
+ el espacio extra va a ancho y columnas, no a botones más grandes.
203
+
204
+ En master-pedidos: `[size]="bp.sizeControl()"`.
205
+
184
206
  ## API
185
207
 
186
208
  <!-- api:inicio -->
@@ -236,6 +258,46 @@ interface SuiFooterButtonConfig {
236
258
  disabled propio desde afuera.
237
259
  - Ya trae el arreglo de iOS para el `:active` pegado (`touchstart`/`touchend`): no lo agregues.
238
260
 
261
+ ## Bien y mal
262
+
263
+ **Botón de ícono en una cabecera**
264
+
265
+ ```html
266
+ <!-- ❌ mal: small (36) no llega a 44 en el teléfono y en la computadora va medium (pages/notifications/notifications.html:50) -->
267
+ <sui-button variant="stroke" color="neutral" size="small" [onlyIcon]="true" leftIcon="check-double-line"
268
+ aria-label="Marcar todas como leídas" (click)="markAllAsRead()" />
269
+ ```
270
+
271
+ ```html
272
+ <!-- ✅ bien -->
273
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()" [onlyIcon]="true" leftIcon="check-double-line"
274
+ aria-label="Marcar todas como leídas" (click)="markAllAsRead()" />
275
+ ```
276
+
277
+ **El helper equivocado para el tamaño**
278
+
279
+ ```html
280
+ <!-- ❌ mal: controlSize() es de checkbox/radio/switch y da large en la computadora (pages/customer/checkout/checkout.html:392) -->
281
+ <sui-button [size]="bp.controlSize()" (click)="applyCoupon()">Aplicar</sui-button>
282
+ ```
283
+
284
+ ```html
285
+ <!-- ✅ bien: large en celular y tablet táctil, medium en la computadora -->
286
+ <sui-button [size]="bp.sizeControl()" (click)="applyCoupon()">Aplicar</sui-button>
287
+ ```
288
+
289
+ **El botón que abre una confirmación de borrar**
290
+
291
+ ```html
292
+ <!-- ❌ mal: filled error es para confirmar; este solo abre el modal (pages/empresa/about/about.html:46, igual en repartidor/about) -->
293
+ <sui-button variant="filled" color="error" [size]="bp.sizeControl()" (click)="openDeleteModal()">Eliminar mi cuenta</sui-button>
294
+ ```
295
+
296
+ ```html
297
+ <!-- ✅ bien: stroke error abre; el filled error queda para el «Sí, eliminar» del modal -->
298
+ <sui-button variant="stroke" color="error" [size]="bp.sizeControl()" (click)="openDeleteModal()">Eliminar mi cuenta</sui-button>
299
+ ```
300
+
239
301
  ## Ejemplo
240
302
 
241
303
  ```html
@@ -249,6 +311,6 @@ interface SuiFooterButtonConfig {
249
311
  </sui-button>
250
312
 
251
313
  <!-- Solo ícono -->
252
- <sui-button variant="ghost" color="neutral" [size]="bp.isMobile() ? 'large' : 'medium'" leftIcon="pencil-line" [onlyIcon]="true"
314
+ <sui-button variant="ghost" color="neutral" [size]="bp.sizeControl()" leftIcon="pencil-line" [onlyIcon]="true"
253
315
  aria-label="Editar" (click)="editar()" />
254
316
  ```