@ajuarezso/sui-design-system 0.24.1 → 0.25.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.
Files changed (120) hide show
  1. package/docs/sui-accordion/README.md +85 -11
  2. package/docs/sui-activity-feed/README.md +65 -11
  3. package/docs/sui-activity-filter/README.md +54 -5
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +64 -10
  6. package/docs/sui-avatar/README.md +92 -29
  7. package/docs/sui-avatar-group/README.md +75 -9
  8. package/docs/sui-badge/README.md +85 -17
  9. package/docs/sui-banner/README.md +85 -20
  10. package/docs/sui-brand-logo/README.md +95 -31
  11. package/docs/sui-breadcrumb-item/README.md +54 -3
  12. package/docs/sui-breadcrumbs/README.md +54 -6
  13. package/docs/sui-button/README.md +76 -12
  14. package/docs/sui-button-group/README.md +91 -23
  15. package/docs/sui-button-group-item/README.md +81 -14
  16. package/docs/sui-card/README.md +105 -18
  17. package/docs/sui-chart-legend/README.md +63 -10
  18. package/docs/sui-chart-legend-dot/README.md +59 -10
  19. package/docs/sui-checkbox/README.md +109 -29
  20. package/docs/sui-checkbox-card/README.md +70 -14
  21. package/docs/sui-checkbox-label/README.md +92 -26
  22. package/docs/sui-circular-progress-bar/README.md +80 -19
  23. package/docs/sui-color-dot/README.md +72 -12
  24. package/docs/sui-color-picker/README.md +71 -13
  25. package/docs/sui-command-menu-footer/README.md +50 -1
  26. package/docs/sui-command-menu-item/README.md +74 -14
  27. package/docs/sui-command-menu-search/README.md +58 -3
  28. package/docs/sui-compact-avatar-group/README.md +73 -13
  29. package/docs/sui-compact-button/README.md +123 -34
  30. package/docs/sui-compact-select/README.md +61 -7
  31. package/docs/sui-compact-select-for-input/README.md +70 -6
  32. package/docs/sui-content-card/README.md +75 -14
  33. package/docs/sui-content-divider/README.md +67 -16
  34. package/docs/sui-content-label/README.md +99 -20
  35. package/docs/sui-counter-input/README.md +102 -18
  36. package/docs/sui-date-selector/README.md +69 -11
  37. package/docs/sui-datepicker/README.md +85 -18
  38. package/docs/sui-day-cell/README.md +75 -17
  39. package/docs/sui-day-label/README.md +56 -7
  40. package/docs/sui-divider/README.md +64 -9
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +69 -12
  43. package/docs/sui-dropdown-caption/README.md +58 -6
  44. package/docs/sui-dropdown-item/README.md +75 -9
  45. package/docs/sui-dropdown-menu/README.md +83 -14
  46. package/docs/sui-dropdown-search/README.md +60 -4
  47. package/docs/sui-emoji/README.md +94 -30
  48. package/docs/sui-empty-state/README.md +71 -7
  49. package/docs/sui-fancy-button/README.md +74 -14
  50. package/docs/sui-file-icon/README.md +70 -12
  51. package/docs/sui-file-upload/README.md +77 -17
  52. package/docs/sui-file-upload-card/README.md +64 -12
  53. package/docs/sui-filter/README.md +83 -14
  54. package/docs/sui-flag/README.md +73 -8
  55. package/docs/sui-form-hint/README.md +56 -7
  56. package/docs/sui-form-label/README.md +57 -5
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +86 -18
  59. package/docs/sui-image-upload/README.md +90 -22
  60. package/docs/sui-image-upload-profile/README.md +70 -11
  61. package/docs/sui-img-retry/README.md +50 -1
  62. package/docs/sui-inline-input/README.md +67 -9
  63. package/docs/sui-inline-select/README.md +62 -2
  64. package/docs/sui-input/README.md +90 -27
  65. package/docs/sui-integration-switch/README.md +84 -17
  66. package/docs/sui-kbd/README.md +73 -9
  67. package/docs/sui-key-icon/README.md +85 -23
  68. package/docs/sui-link-button/README.md +96 -27
  69. package/docs/sui-logo/README.md +93 -22
  70. package/docs/sui-modal/README.md +72 -13
  71. package/docs/sui-modal-footer/README.md +86 -12
  72. package/docs/sui-modal-header/README.md +57 -1
  73. package/docs/sui-modal-sheet/README.md +74 -12
  74. package/docs/sui-notification/README.md +81 -11
  75. package/docs/sui-notification-footer/README.md +55 -5
  76. package/docs/sui-notification-tab-menu/README.md +61 -5
  77. package/docs/sui-otp-input/README.md +70 -9
  78. package/docs/sui-page-header/README.md +89 -19
  79. package/docs/sui-pagination/README.md +73 -13
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +80 -18
  82. package/docs/sui-period-range/README.md +70 -11
  83. package/docs/sui-popover/README.md +81 -15
  84. package/docs/sui-product-card/README.md +89 -21
  85. package/docs/sui-progress-bar/README.md +82 -15
  86. package/docs/sui-progress-bar-label/README.md +79 -18
  87. package/docs/sui-radio/README.md +84 -7
  88. package/docs/sui-radio-card/README.md +70 -16
  89. package/docs/sui-radio-label/README.md +89 -22
  90. package/docs/sui-rating/README.md +101 -31
  91. package/docs/sui-rich-editor/README.md +47 -2
  92. package/docs/sui-segmented-control/README.md +90 -21
  93. package/docs/sui-select/README.md +80 -11
  94. package/docs/sui-sidebar/README.md +71 -16
  95. package/docs/sui-slider/README.md +75 -8
  96. package/docs/sui-social-button/README.md +71 -11
  97. package/docs/sui-status-badge/README.md +75 -14
  98. package/docs/sui-stepper/README.md +75 -18
  99. package/docs/sui-store-card/README.md +85 -22
  100. package/docs/sui-switch/README.md +82 -11
  101. package/docs/sui-switch-card/README.md +80 -16
  102. package/docs/sui-switch-label/README.md +91 -14
  103. package/docs/sui-tab-chips/README.md +93 -21
  104. package/docs/sui-tab-menu-horizontal/README.md +68 -7
  105. package/docs/sui-tab-menu-vertical/README.md +64 -11
  106. package/docs/sui-table/README.md +77 -16
  107. package/docs/sui-tag/README.md +86 -12
  108. package/docs/sui-tag-input/README.md +77 -13
  109. package/docs/sui-textarea/README.md +84 -17
  110. package/docs/sui-time-picker/README.md +96 -33
  111. package/docs/sui-toast/README.md +81 -20
  112. package/docs/sui-tooltip/README.md +80 -22
  113. package/docs/sui-topbar/README.md +64 -10
  114. package/docs/sui-topbar-button/README.md +61 -7
  115. package/docs/sui-topbar-item/README.md +68 -7
  116. package/docs/sui-topbar-user/README.md +61 -5
  117. package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
  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 +7 -3
@@ -29,7 +29,7 @@ Regla corta: **es alguien → avatar · es una cosa → key-icon · son varios
29
29
 
30
30
  > **La guía del DS dice qué es y qué opciones tiene, no cuándo usar cada una.** Lo marcado
31
31
  > «según la guía del DS» sale de su texto o de su código publicado; lo marcado «canon» ya es
32
- > regla escrita del proyecto (`CLAUDE.md`); el resto es **propuesta, falta aprobación**.
32
+ > regla escrita del proyecto (`CLAUDE.md`) o lo aprobó el dueño; el resto es **propuesta, falta aprobación**.
33
33
  >
34
34
  > Uso medido el 04-10-2026 en `master-pedidos/src/app`: 55 avatares en los templates, sin contar
35
35
  > prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`,
@@ -58,21 +58,21 @@ la foto falla al cargar, cae sola a las iniciales.
58
58
  |---|---|---|
59
59
  | foto (`src`) | Siempre que exista. Si es la foto **de otra persona**, es su `avatarUrl` de nuestro Storage, denormalizada en el documento por la Cloud Function y filtrada por `fotoDeStorage()`. **Nunca `photoURL` de Google**: solo carga en el navegador del dueño de esa cuenta. | canon (`CLAUDE.md`, «Fotos de otra persona») |
60
60
  | `initials` | Sin foto. Pasa el **nombre completo**: el componente saca las iniciales. | según la guía del DS |
61
- | `icon` | Solo para «todavía no hay nadie»: pedido sin repartidor (`e-bike-2-line`), envío sin destinatario (`user-3-line`). Va con `color="gray"`. Extensión de SUI. | propuesta |
61
+ | `icon` | Solo para «todavía no hay nadie»: pedido sin repartidor (`e-bike-2-line`), envío sin destinatario (`user-3-line`). Va con `color="gray"`. Extensión de SUI. | canon (aprobado por el dueño, 05-10-2026, bloque B3) |
62
62
  | silueta | Cae sola cuando no hay ni nombre. No se pide a propósito. | según la guía del DS |
63
63
 
64
64
  ### `size`
65
65
 
66
66
  | size | px | cuándo | ejemplo real de la app | fuente |
67
67
  |---|---|---|---|---|
68
- | `xs` | 20 | Pegado a un texto en la misma línea. | `components/sidebar/sidebar.html:77` (selector de local) · `pages/envios/envios.html:250` | propuesta |
69
- | `sm` | 24 | Chips y filas compactas. | `pages/driver/driver-dashboard/driver-dashboard.html:1047` (quién tomó el pedido) | propuesta |
70
- | `md` (default SUI) | 32 | Filas de listas y tablas. | `pages/super-admin/master-orders/master-orders.html:197` | propuesta |
71
- | `lg` | 40 | La tarjeta de una persona o de un local. | `pages/customer/order-tracking/order-tracking.html:348` (tu repartidor) | propuesta |
72
- | `xl` | 48 | Cabecera de un panel. | `pages/driver/driver-dashboard/driver-dashboard.html:19` (tu foto) | propuesta |
73
- | `2xl` | 56 | Cabecera de una ficha. | `pages/super-admin/master-users/master-user-sheet.html:21` | propuesta |
74
- | `3xl` | 64 | Tu propia foto al registrarte. | `pages/driver-onboarding/step-info/step-info.html:31` | propuesta |
75
- | `4xl` / `5xl` | 72 / 80 | No usar hoy (ver «No usar»). | — | propuesta |
68
+ | `xs` | 20 | Pegado a un texto en la misma línea. | `components/sidebar/sidebar.html:77` (selector de local) · `pages/envios/envios.html:250` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
69
+ | `sm` | 24 | Chips y filas compactas. | `pages/driver/driver-dashboard/driver-dashboard.html:1047` (quién tomó el pedido) | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
70
+ | `md` (default SUI) | 32 | Filas de listas y tablas. | `pages/super-admin/master-orders/master-orders.html:197` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
71
+ | `lg` | 40 | La tarjeta de una persona o de un local. | `pages/customer/order-tracking/order-tracking.html:348` (tu repartidor) | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
72
+ | `xl` | 48 | Cabecera de un panel. | `pages/driver/driver-dashboard/driver-dashboard.html:19` (tu foto) | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
73
+ | `2xl` | 56 | Cabecera de una ficha. | `pages/super-admin/master-users/master-user-sheet.html:21` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
74
+ | `3xl` | 64 | Tu propia foto al registrarte. | `pages/driver-onboarding/step-info/step-info.html:31` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
75
+ | `4xl` / `5xl` | 72 / 80 | No usar hoy (ver «No usar»). | — | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
76
76
 
77
77
  Hasta `md` (32 px) se ve **una** inicial; desde `lg` (40 px), dos. Es del Figma: en chico dos
78
78
  letras no entran.
@@ -113,11 +113,11 @@ logueada sigue en el default.
113
113
 
114
114
  | status | cuándo | fuente |
115
115
  |---|---|---|
116
- | `online` | Conectado **ahora** (repartidor en línea). No significa «cuenta activa». | propuesta (el valor es de la guía) |
117
- | `away` | En pausa: conectado pero sin recibir pedidos. | propuesta (el valor es de la guía) |
118
- | `busy` | Ocupado: ya lleva un pedido. | propuesta (el valor es de la guía) |
119
- | `offline` | Desconectado. Si en esa lista todos estarían `offline` casi siempre, mejor sin punto. | propuesta (el valor es de la guía) |
120
- | `company` | Repartidor propio de un local: el logo del local abajo (con `companyLogoSrc`). | propuesta (la guía lo muestra como «con logo de marca») |
116
+ | `online` | Conectado **ahora** (repartidor en línea). No significa «cuenta activa». | canon (aprobado por el dueño, 05-10-2026, bloque B2) (el valor es de la guía) |
117
+ | `away` | En pausa: conectado pero sin recibir pedidos. | canon (aprobado por el dueño, 05-10-2026, bloque B2) (el valor es de la guía) |
118
+ | `busy` | Ocupado: ya lleva un pedido. | canon (aprobado por el dueño, 05-10-2026, bloque B2) (el valor es de la guía) |
119
+ | `offline` | Desconectado. Si en esa lista todos estarían `offline` casi siempre, mejor sin punto. | canon (aprobado por el dueño, 05-10-2026, bloque B2) (el valor es de la guía) |
120
+ | `company` | Repartidor propio de un local: el logo del local abajo (con `companyLogoSrc`). | canon (aprobado por el dueño, 05-10-2026, bloque B2) (la guía lo muestra como «con logo de marca») |
121
121
 
122
122
  **Usos de hoy que rompen la regla: 2.** Los dos usan el punto para el **estado de la cuenta**,
123
123
  no para la presencia: `pages/settings/team/team.html:99` (activo/pendiente/inactivo →
@@ -128,9 +128,9 @@ online/away/offline, mapeo en `pages/settings/team/team.ts:99`) y `pages/employe
128
128
 
129
129
  | topBadge | cuándo | fuente |
130
130
  |---|---|---|
131
- | `verified` | Identidad revisada (repartidor aprobado). | propuesta (la guía muestra un sello de verificado arriba) |
132
- | `notification` | Tiene algo sin leer. | propuesta (el punto rojo arriba es de la guía) |
133
- | `favorite`, `pin`, `add`, `remove` | No usar hoy (ver «No usar»). | propuesta |
131
+ | `verified` | Identidad revisada (repartidor aprobado). | canon (aprobado por el dueño, 05-10-2026, bloque B2) (la guía muestra un sello de verificado arriba) |
132
+ | `notification` | Tiene algo sin leer. | canon (aprobado por el dueño, 05-10-2026, bloque B2) (el punto rojo arriba es de la guía) |
133
+ | `favorite`, `pin`, `add`, `remove` | No usar hoy (ver «No usar»). | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
134
134
 
135
135
  Hoy no hay ningún `topBadge` en la app.
136
136
 
@@ -138,10 +138,10 @@ Hoy no hay ningún `topBadge` en la app.
138
138
 
139
139
  | input | cuándo | fuente |
140
140
  |---|---|---|
141
- | `alt` | **Siempre** el nombre de quien es. Con foto va en el `<img>`; con iniciales, ícono o silueta el host pasa a `role="img"` con `aria-label` = `alt` (desde el 04-10-2026; antes el lector leía la letra suelta). Sin `alt`, el lector no dice nada. | propuesta |
142
- | `companyLogoSrc` | Solo con `status="company"`. | propuesta |
143
- | `memojiSrc`, `illustrationSrc` | No usar hoy. | propuesta |
144
- | `bgColor` | No usar (ver abajo). | propuesta |
141
+ | `alt` | **Siempre** el nombre de quien es. Con foto va en el `<img>`; con iniciales, ícono o silueta el host pasa a `role="img"` con `aria-label` = `alt` (desde el 04-10-2026; antes el lector leía la letra suelta). Sin `alt`, el lector no dice nada. | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
142
+ | `companyLogoSrc` | Solo con `status="company"`. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
143
+ | `memojiSrc`, `illustrationSrc` | No usar hoy. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
144
+ | `bgColor` | No usar (ver abajo). | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
145
145
 
146
146
  **Usos de hoy sin `alt`: 9** (más uno decorativo que está bien sin él,
147
147
  `pages/super-admin/master-orders/master-orders.html:586`). Ejemplos:
@@ -168,7 +168,10 @@ disfrazado. Todos pasaron a `color` por rol.
168
168
  En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
169
169
  pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
170
170
  breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
171
- el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
171
+ el celular (cliente, repartidor) va directo el valor de mobile. No se toca, así que la tablet va
172
+ con el valor de web, y el celular chico (< 380 px) también (D16).
173
+ Es **canon (dueño, 05-10-2026, P1 b)**: un paso más grande en el celular que en computadora, y
174
+ se migra todo ahora, no solo al tocar cada pantalla.
172
175
 
173
176
  | uso | mobile | web |
174
177
  |---|---|---|
@@ -178,12 +181,32 @@ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propue
178
181
  | cabecera de una ficha | `3xl` (64) | `2xl` (56) |
179
182
 
180
183
  ```html
181
- <sui-avatar [size]="bp.isMobile() ? 'lg' : 'md'" color="blue" [initials]="c.nombre" [alt]="c.nombre" />
184
+ <sui-avatar [size]="bp.sizeAvatar('md')" color="blue" [initials]="c.nombre" [alt]="c.nombre" />
182
185
  ```
183
186
 
184
187
  El avatar no se toca solo: si la fila o la card es tocable, el área táctil (44 px o más) la da
185
- la fila, no el avatar. Hoy **ningún** avatar cambia de tamaño por breakpoint; las pantallas del
186
- cliente y del repartidor usan `lg` en las tarjetas, un paso por debajo de esta tabla.
188
+ la fila, no el avatar. Medido el 06-10-2026: 56 de los 57 avatares de la app ya van con
189
+ `bp.sizeAvatar(…)`; el único fijo es `pages/driver-onboarding/step-info/step-info.html:31`
190
+ (`3xl`, tu foto al registrarte).
191
+
192
+ ### Por dispositivo (D16)
193
+
194
+ El avatar no se toca: sube un paso **solo en el celular de 380 px o más**. Fuente: D16, dueño
195
+ 05-10-2026 (P1 b).
196
+
197
+ | dispositivo | size | nota |
198
+ |---|---|---|
199
+ | celular chico (< 380) | valor «web» (`md` en una fila) | no se toca: no sube aunque sea un celular |
200
+ | celular (380–767) | valor «mobile» (`lg` en una fila) | un paso más que en la computadora |
201
+ | tablet táctil (`pointer: coarse`) | valor «web» (`md` en una fila) | no se toca: el puntero no cambia nada |
202
+ | computadora (`pointer: fine`) | valor «web» (`md` en una fila) | |
203
+
204
+ En el ultrawide, igual que en la computadora: el espacio extra va a más columnas, no a avatares
205
+ más grandes.
206
+
207
+ En master-pedidos: `[size]="bp.sizeAvatar('md')"` — recibe el valor de la computadora y en el
208
+ celular devuelve el siguiente de la escala, con tope en `3xl` (no sube a `4xl`/`5xl`). No uses
209
+ `bp.isMobile() ? 'lg' : 'md'`: `isMobile` incluye el celular chico, que va con el valor de web.
187
210
 
188
211
  ## «No usar»: por qué no hoy y cuándo sí
189
212
 
@@ -249,15 +272,55 @@ interface SuiAvatarConfig {
249
272
  - **No tiene `title`, ni output, ni es clickeable.** Para tocarlo, envuélvelo en un botón o en
250
273
  la card que ya lo es.
251
274
 
275
+ ## Bien y mal
276
+
277
+ Estado de la cuenta de un empleado
278
+
279
+ ```html
280
+ <!-- ❌ mal: el punto es presencia (conectado ahora), no «cuenta activa»; y sin alt (pages/employees/employees.html:70) -->
281
+ <sui-avatar [size]="bp.sizeAvatar('lg')" color="orange" [initials]="employee.initials"
282
+ [status]="employee.status === 'Activo' ? 'online' : 'offline'" />
283
+ ```
284
+
285
+ ```html
286
+ <!-- ✅ bien -->
287
+ <sui-avatar [size]="bp.sizeAvatar('lg')" color="orange" [initials]="employee.initials" [alt]="employee.name" />
288
+ <sui-badge [size]="bp.sizeBadge()" color="green">Activo</sui-badge>
289
+ ```
290
+
291
+ Repartidor en una fila
292
+
293
+ ```html
294
+ <!-- ❌ mal: sin alt, el lector de pantalla no dice quién es; y en una fila (aquí, el ranking de rendimiento) la tabla de tamaños pide md en web, no lg (pages/super-admin/master-drivers/master-drivers.html:256) -->
295
+ <sui-avatar [size]="bp.sizeAvatar('lg')" color="green" [initials]="iniciales(d.nombre)" />
296
+ ```
297
+
298
+ ```html
299
+ <!-- ✅ bien -->
300
+ <sui-avatar [size]="bp.sizeAvatar('md')" color="green" [initials]="iniciales(d.nombre)" [alt]="d.nombre" />
301
+ ```
302
+
303
+ Color de una persona
304
+
305
+ ```html
306
+ <!-- ❌ mal: el color sale del vehículo, no del rol. El conductor queda blue, que es el color de cliente, y el motorizado purple, que no dice ningún rol. Los dos son postulantes a repartidor: green. Y falta el alt (pages/super-admin/master-solicitudes/master-solicitudes.html:24) -->
307
+ <sui-avatar [size]="bp.sizeAvatar('md')" [color]="f.tipo === 'conductor' ? 'blue' : 'purple'" [initials]="iniciales(f.nombre)" />
308
+ ```
309
+
310
+ ```html
311
+ <!-- ✅ bien -->
312
+ <sui-avatar [size]="bp.sizeAvatar('md')" color="green" [initials]="iniciales(f.nombre)" [alt]="f.nombre" />
313
+ ```
314
+
252
315
  ## Ejemplo
253
316
 
254
317
  ```html
255
318
  <!-- Tu repartidor, en la tarjeta del seguimiento -->
256
- <sui-avatar size="lg" color="green" [src]="driverPhotoUrl()" [initials]="driverName" [alt]="driverName" />
319
+ <sui-avatar [size]="bp.sizeAvatar('lg')" color="green" [src]="driverPhotoUrl()" [initials]="driverName" [alt]="driverName" />
257
320
 
258
321
  <!-- El local, en una fila -->
259
- <sui-avatar size="md" color="orange" [src]="tenantLogo" [initials]="tenantName" [alt]="tenantName" />
322
+ <sui-avatar [size]="bp.sizeAvatar('md')" color="orange" [src]="tenantLogo" [initials]="tenantName" [alt]="tenantName" />
260
323
 
261
324
  <!-- Todavía sin repartidor -->
262
- <sui-avatar size="md" color="gray" icon="e-bike-2-line" alt="Sin repartidor" />
325
+ <sui-avatar [size]="bp.sizeAvatar('md')" color="gray" icon="e-bike-2-line" alt="Sin repartidor" />
263
326
  ```
@@ -23,7 +23,8 @@ conectados en una zona. Cada persona se ve chica; el grupo es lo que cuenta.
23
23
  ## Qué variante usar
24
24
 
25
25
  > **La guía del DS dice qué es y sus tamaños, no cuándo usarlo.** Lo marcado «según la guía
26
- > del DS» sale de su texto o de su código; el resto es **propuesta, falta aprobación**.
26
+ > del DS» sale de su texto o de su código; lo marcado «canon» ya lo aprobó el dueño; el resto es
27
+ > **propuesta, falta aprobación**.
27
28
  >
28
29
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. En el DS no lo
29
30
  > monta ningún componente: `sui-table` solo lo nombra como contenido que se proyecta en una celda.
@@ -39,11 +40,11 @@ conectados en una zona. Cada persona se ve chica; el grupo es lo que cuenta.
39
40
 
40
41
  | input | valor | cuándo | fuente |
41
42
  |---|---|---|---|
42
- | `size` | `sm` (24) | Dentro de una fila: «los que tomaron pedidos hoy». | propuesta |
43
- | `size` | `md` (32, default SUI) | La card del equipo de un local. | propuesta |
44
- | `size` | `lg` (40) | La cabecera de un panel (repartidores en la zona). | propuesta |
45
- | `size` | `xs`, `xl` a `5xl` | No usar hoy: en `xs` el «+N» no se lee; desde `xl` ya no es un resumen. | propuesta |
46
- | `max` | `3` | Tres visibles y el «+N», como el ejemplo de la guía. El default de SUI es `4`. | propuesta |
43
+ | `size` | `sm` (24) | Dentro de una fila: «los que tomaron pedidos hoy». | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
44
+ | `size` | `md` (32, default SUI) | La card del equipo de un local. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
45
+ | `size` | `lg` (40) | La cabecera de un panel (repartidores en la zona). | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
46
+ | `size` | `xs`, `xl` a `5xl` | No usar hoy: en `xs` el «+N» no se lee; desde `xl` ya no es un resumen. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
47
+ | `max` | `3` | Tres visibles y el «+N», como el ejemplo de la guía. El default de SUI es `4`. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
47
48
  | `items` | — | Cada item es `{ src, initials, color, alt }`. Las reglas de foto y color son las de `sui-avatar`: la foto de otra persona es su `avatarUrl` de Storage, y el `color` va **siempre** explícito por rol (sin `color` el item cae a `slate`). | canon (`CLAUDE.md`, «Fotos de otra persona») · canon (aprobado por el dueño, 03-10-2026: naranja local, verde repartidor, azul cliente) |
48
49
 
49
50
  Usos de hoy que rompen la regla: **0** (no hay usos).
@@ -53,7 +54,10 @@ Usos de hoy que rompen la regla: **0** (no hay usos).
53
54
  En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
54
55
  pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
55
56
  breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
56
- el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
57
+ el celular (cliente, repartidor) va directo el valor de mobile. No se toca, así que la tablet va
58
+ con el valor de web, y el celular chico (< 380 px) también (D16).
59
+ Es **canon (dueño, 05-10-2026, P1 b)**: un paso más grande en el celular que en computadora, y
60
+ se migra todo ahora, no solo al tocar cada pantalla.
57
61
 
58
62
  | uso | mobile | web |
59
63
  |---|---|---|
@@ -61,9 +65,29 @@ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propue
61
65
  | dentro de una card | `lg` (40) | `md` (32) |
62
66
 
63
67
  ```html
64
- <sui-avatar-group [size]="bp.isMobile() ? 'md' : 'sm'" [max]="3" [items]="equipo" />
68
+ <sui-avatar-group [size]="bp.sizeAvatar('sm')" [max]="3" [items]="equipo" />
65
69
  ```
66
70
 
71
+ ### Por dispositivo (D16)
72
+
73
+ El grupo no se toca: sigue la misma regla que `sui-avatar` y sube un paso **solo en el celular
74
+ de 380 px o más**. Fuente: D16, dueño 05-10-2026 (P1 b).
75
+
76
+ | dispositivo | size | nota |
77
+ |---|---|---|
78
+ | celular chico (< 380) | valor «web» (`sm` en una fila, `md` en una card) | no se toca: no sube aunque sea un celular |
79
+ | celular (380–767) | valor «mobile» (`md` en una fila, `lg` en una card) | un paso más que en la computadora |
80
+ | tablet táctil (`pointer: coarse`) | valor «web» | no se toca: el puntero no cambia nada |
81
+ | computadora (`pointer: fine`) | valor «web» | |
82
+
83
+ En el ultrawide, igual que en la computadora.
84
+
85
+ En master-pedidos: `[size]="bp.sizeAvatar('sm')"` (fila) · `[size]="bp.sizeAvatar('md')"` (card).
86
+ No hay un helper propio del grupo: `sizeAvatar` sirve porque usa la misma escala (`SuiAvatarSize`).
87
+ No uses `bp.isMobile() ? 'md' : 'sm'`: `isMobile` incluye el celular chico, que va con el valor
88
+ de web. Ojo: con `bp.sizeAvatar('lg')` (cabecera de un panel) el celular sale en `xl`, que arriba
89
+ está en «no usar» — pendiente de decidir si la cabecera se queda en `lg` también en el celular.
90
+
67
91
  ## «No usar»: por qué no hoy y cuándo sí
68
92
 
69
93
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -103,10 +127,52 @@ interface SuiAvatarGroupItem {
103
127
  - El solape cambia con el tamaño (−4 px en `xs`/`sm`, −16 px desde `2xl`): en `lg` las iniciales
104
128
  de dos letras quedan tapadas a medias.
105
129
 
130
+ ## Bien y mal
131
+
132
+ Hoy no hay usos en la app (0 el 06-10-2026): los pares salen de las reglas de arriba.
133
+
134
+ Color de cada persona
135
+
136
+ ```html
137
+ <!-- ❌ mal: items sin color caen a slate y no dicen el rol (ver «size y max») -->
138
+ <sui-avatar-group [size]="bp.sizeAvatar('md')" [max]="3"
139
+ [items]="[{ initials: 'Carlos Mamani', alt: 'Carlos Mamani' }, { initials: 'Ana Torres', alt: 'Ana Torres' }]" />
140
+ ```
141
+
142
+ ```html
143
+ <!-- ✅ bien -->
144
+ <sui-avatar-group [size]="bp.sizeAvatar('md')" [max]="3"
145
+ [items]="[{ initials: 'Carlos Mamani', color: 'green', alt: 'Carlos Mamani' }, { initials: 'Ana Torres', color: 'green', alt: 'Ana Torres' }]" />
146
+ ```
147
+
148
+ Grupo dentro de una fila
149
+
150
+ ```html
151
+ <!-- ❌ mal: en xs (20 px) el «+N» no se lee, y sin [max] salen 4 en vez de 3 -->
152
+ <sui-avatar-group size="xs" [items]="equipo" />
153
+ ```
154
+
155
+ ```html
156
+ <!-- ✅ bien -->
157
+ <sui-avatar-group [size]="bp.sizeAvatar('sm')" [max]="3" [items]="equipo" />
158
+ ```
159
+
160
+ Tamaño fijo en una pantalla que se ve en los dos
161
+
162
+ ```html
163
+ <!-- ❌ mal: md fijo en el panel; en el celular queda un paso por debajo (D16) -->
164
+ <sui-avatar-group size="md" [max]="3" [items]="equipo" />
165
+ ```
166
+
167
+ ```html
168
+ <!-- ✅ bien -->
169
+ <sui-avatar-group [size]="bp.sizeAvatar('md')" [max]="3" [items]="equipo" />
170
+ ```
171
+
106
172
  ## Ejemplo
107
173
 
108
174
  ```html
109
- <sui-avatar-group size="md" [max]="3" [items]="[
175
+ <sui-avatar-group [size]="bp.sizeAvatar('md')" [max]="3" [items]="[
110
176
  { initials: 'Carlos Mamani', color: 'green', alt: 'Carlos Mamani' },
111
177
  { src: repartidor2.avatarUrl, initials: repartidor2.nombre, color: 'green', alt: repartidor2.nombre },
112
178
  { initials: 'Luis Huamán', color: 'green', alt: 'Luis Huamán' },
@@ -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,9 +126,8 @@ 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` | Una o dos palabras, justamente por las mayúsculas. | canon (aprobado por el dueño, 03-10-2026) |
131
- | `size` | `medium` (20 px) | Texto que no debe ir en mayúsculas (nombres, montos) o un badge que acompaña un título grande. | canon (aprobado por el dueño, 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 |
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) |
134
133
  | `type` | `with-dot` | Un estado **vivo** que cambia solo (abierto, en línea, en curso). La guía lo muestra pero no dice cuándo. | canon (aprobado por el dueño, 03-10-2026) |
@@ -156,7 +155,7 @@ pedidos con muchos estados (`pages/orders/orders.html:113`) se quedan como badge
156
155
 
157
156
  ## Tamaño en mobile y en web
158
157
 
159
- En mobile el badge se lee de más lejos y al lado de textos de 16 px; en web va más chico.
158
+ En mobile el badge se lee de más lejos y al lado de textos de 16 px; en la computadora, la tablet y el celular chico va `medium`, un paso más chico (P1 b), y nunca `small` (D16).
160
159
  `large` (24) y `xlarge` (28) son extensión SUI del 03-10-2026.
161
160
 
162
161
  | size | alto | texto | ícono del slot |
@@ -175,18 +174,49 @@ canon (dueño, 04-10-2026):** el badge mantiene su escala propia 12 / 14 / 16 (`
175
174
 
176
175
  | uso | mobile | web | fuente |
177
176
  |---|---|---|---|
178
- | estado en una lista o card | `large` (24) | `small` (16, mayúsculas) | canon (aprobado por el dueño, 03-10-2026) |
179
- | junto a un título o un monto | `xlarge` (28) | `medium` (20) | propuesta, falta aprobación |
180
- | conteo (`type="number"`) | `large` (24) | `small` (16) | propuesta, falta aprobación |
181
-
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:
177
+ | estado en una lista o card | `large` (24) | `medium` (20) | mobile: canon (aprobado por el dueño, 03-10-2026) · web: canon (dueño, 05-10-2026, D16), antes `small` (03-10-2026) · un paso de diferencia: canon (dueño, 05-10-2026, P1 b) |
178
+ | junto a un título o un monto | `xlarge` (28) | `medium` (20) | canon (dueño, 05-10-2026, P1 b) |
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 |
180
+
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' : 'small'" …/>
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
  ```
@@ -44,7 +44,7 @@ puesto.
44
44
 
45
45
  > La guía del DS dice **para qué** es el banner, pero no cuándo va cada relleno ni cada tipo. Lo
46
46
  > marcado «según la guía del DS» sale de su texto o de sus ejemplos publicados; lo marcado
47
- > «canon» ya lo aprobó el dueño en el README de `sui-alert`; el resto es **propuesta** y falta su ok.
47
+ > «canon» ya lo aprobó el dueño (en el README de `sui-alert` o el 05-10-2026); el resto es **propuesta** y falta su ok.
48
48
  >
49
49
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`, sin contar prototipos ni vitrinas
50
50
  > (`master-preview`, `master-prototipos`, `mockup-*`, `dx/*`, `_guia-*`, `master-rutina`,
@@ -67,10 +67,10 @@ Los mismos cinco tipos que `sui-alert`, con el mismo significado.
67
67
 
68
68
  | variant | cuándo | ejemplo real de la app | fuente |
69
69
  |---|---|---|---|
70
- | `info` (default) | Un dato de toda la app que conviene saber y no pide nada: hay una versión nueva, estás viendo datos de prueba. | (sin uso hoy) | propuesta (sigue la regla canon del alert) |
71
- | `success` | Un estado bueno que dura y afecta a todo: «Tu local ya está publicado». Si es la confirmación de un clic, es toast. | (sin uso hoy) | propuesta (sigue la regla canon del alert) |
72
- | `warning` | Hay que hacer algo pronto o lo que hagas tiene consecuencia para toda la cuenta: el plan vence, estás administrando un local que no es tuyo. | `components/subscription-banner/subscription-banner.html:5` («Tu plan vence en 3 días») · candidato: `components/impersonation-banner/impersonation-banner.ts:17` | propuesta (sigue la regla canon del alert) |
73
- | `error` | Algo ya pasó y afecta a toda la cuenta. | `components/subscription-banner/subscription-banner.html:5` («Tu plan venció») | propuesta (sigue la regla canon del alert) |
70
+ | `info` (default) | Un dato de toda la app que conviene saber y no pide nada: hay una versión nueva, estás viendo datos de prueba. | (sin uso hoy) | canon (aprobado por el dueño, 05-10-2026, bloque B3) (sigue la regla canon del alert) |
71
+ | `success` | Un estado bueno que dura y afecta a todo: «Tu local ya está publicado». Si es la confirmación de un clic, es toast. | (sin uso hoy) | canon (aprobado por el dueño, 05-10-2026, bloque B3) (sigue la regla canon del alert) |
72
+ | `warning` | Hay que hacer algo pronto o lo que hagas tiene consecuencia para toda la cuenta: el plan vence, estás administrando un local que no es tuyo. | `components/subscription-banner/subscription-banner.html:5` («Tu plan vence en 3 días») · candidato: `components/impersonation-banner/impersonation-banner.ts:17` | canon (aprobado por el dueño, 05-10-2026, bloque B3) (sigue la regla canon del alert) |
73
+ | `error` | Algo ya pasó y afecta a toda la cuenta. | `components/subscription-banner/subscription-banner.html:5` («Tu plan venció») | canon (aprobado por el dueño, 05-10-2026, bloque B3) (sigue la regla canon del alert) |
74
74
  | `feature` | Novedad que alcanza a toda la app. **Aquí es gris**, no morado como en el alert. | (sin uso hoy) | canon (decisión documentada en el `.ts`, recogida en el README del alert) |
75
75
 
76
76
  ### `variantStyle` — el peso visual
@@ -79,20 +79,20 @@ Misma pregunta que en el alert: **¿este aviso tiene que ganarle a todo lo demá
79
79
 
80
80
  | variantStyle | cuándo | ejemplo real de la app | fuente |
81
81
  |---|---|---|---|
82
- | `lighter` | El aviso **acompaña**: hay que tenerlo presente, pero se puede seguir trabajando. Es el caso normal. | `subscription-banner.html:7` en el caso «vence en N días» (hoy en `light`) | propuesta |
83
- | `filled` (default de la guía) | Hay que **actuar ya**, o la app está en un **modo que cambia lo que haces**: el plan venció, estás administrando otro local. Uno a la vez. | `subscription-banner.html:7` («Tu plan venció») | propuesta |
84
- | `light` | No usar hoy, como en el alert. **Cuándo sí:** un banner dentro de una zona ya teñida, donde `lighter` se pierde. | — | propuesta |
85
- | `stroke` (default SUI) | No usar hoy: un banner blanco con borde se confunde con la barra superior. **Cuándo sí:** arriba de una pantalla a sangre (un mapa o una foto), donde la banda blanca sí se distingue. | — | propuesta |
82
+ | `lighter` | El aviso **acompaña**: hay que tenerlo presente, pero se puede seguir trabajando. Es el caso normal. | `subscription-banner.html:7` en el caso «vence en N días» (hoy en `light`) | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
83
+ | `filled` (default de la guía) | Hay que **actuar ya**, o la app está en un **modo que cambia lo que haces**: el plan venció, estás administrando otro local. Uno a la vez. | `subscription-banner.html:7` («Tu plan venció») | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
84
+ | `light` | No usar hoy, como en el alert. **Cuándo sí:** un banner dentro de una zona ya teñida, donde `lighter` se pierde. | — | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
85
+ | `stroke` (default SUI) | No usar hoy: un banner blanco con borde se confunde con la barra superior. **Cuándo sí:** arriba de una pantalla a sangre (un mapa o una foto), donde la banda blanca sí se distingue. | — | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
86
86
 
87
87
  ### `dismissible`, `showIcon`, acción y título
88
88
 
89
89
  | prop | valor | cuándo | fuente |
90
90
  |---|---|---|---|
91
- | `dismissible` | `true` | Solo si el aviso se puede ignorar sin problema (versión nueva, novedad). La guía lo muestra en todos sus ejemplos. | según la guía del DS (que exista) · propuesta (cuándo) |
92
- | `dismissible` | `false` (default) | Todo `filled` y todo aviso que tiene que seguir ahí: plan vencido, administrando otro local. Cerrarlo no arregla nada. | propuesta |
93
- | `showIcon` | `true` (default) | Siempre: el ícono es la mitad del significado del tipo. | propuesta |
94
- | `showIcon` | `false` | No usar hoy. **Cuándo sí:** cuando se proyecta un avatar o logo en `slot="icon"` (ver abajo), que ya ocupa ese lugar. | propuesta |
95
- | `slot="icon"` | avatar o logo | Reemplaza al ícono del tipo: el logo del local que estás administrando. | propuesta |
91
+ | `dismissible` | `true` | Solo si el aviso se puede ignorar sin problema (versión nueva, novedad). La guía lo muestra en todos sus ejemplos. | según la guía del DS (que exista) · canon (aprobado por el dueño, 05-10-2026, bloque B8) (cuándo) |
92
+ | `dismissible` | `false` (default) | Todo `filled` y todo aviso que tiene que seguir ahí: plan vencido, administrando otro local. Cerrarlo no arregla nada. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
93
+ | `showIcon` | `true` (default) | Siempre: el ícono es la mitad del significado del tipo. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
94
+ | `showIcon` | `false` | No usar hoy. **Cuándo sí:** cuando se proyecta un avatar o logo en `slot="icon"` (ver abajo), que ya ocupa ese lugar. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
95
+ | `slot="icon"` | avatar o logo | Reemplaza al ícono del tipo: el logo del local que estás administrando. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
96
96
  | `slot="action"` | **un** `sui-link-button` `variant="modifiable"` con `[underline]="true"` | La única acción del banner: «Renovar plan», «Salir», «Actualizar». Nunca un `sui-button`, nunca dos. | según la guía del DS |
97
97
  | `title` | frase corta | Lo que pasa, en sentence case y sin punto final. | canon (copy de la app) |
98
98
  | `description` | complemento | Qué hacer o hasta cuándo. Una línea en web; en mobile se envuelve. | según la guía del DS (una línea) |
@@ -106,7 +106,7 @@ Misma pregunta que en el alert: **¿este aviso tiene que ganarle a todo lo demá
106
106
  - **Barra hecha a mano que es un banner — 1:** `components/impersonation-banner/impersonation-banner.ts:17`
107
107
  («Estás administrando … como super admin» + botón «Salir»), con `#fff` y `rgb()` sueltos. Pasaría a
108
108
  `<sui-banner variant="warning" variantStyle="filled">` con un link «Salir».
109
- - **Romperían la propuesta — 1 `light` → `lighter`:** `components/subscription-banner/subscription-banner.html:7`
109
+ - **Rompe el canon (aprobado por el dueño, 05-10-2026, bloque B2) — 1 `light` → `lighter`:** `components/subscription-banner/subscription-banner.html:7`
110
110
  (el caso «vence en N días»).
111
111
  - No confundir: `components/upgrade-banner/` (6 pantallas) se llama «banner» pero es un aviso dentro
112
112
  de una sección; su destino es `sui-alert`, ya anotado en `docs/CANON-SUI.md`.
@@ -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