@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
@@ -45,9 +45,9 @@ de cambios de una versión.
45
45
 
46
46
  | valor | cuándo | ejemplo real de la app | fuente |
47
47
  |---|---|---|---|
48
- | `[leftIcon]="false"` | el caso normal: el título se explica solo | `pages/envios/envios.html:412` («Más detalles (opcional)») | propuesta |
48
+ | `[leftIcon]="false"` | el caso normal: el título se explica solo | `pages/envios/envios.html:413` («Más detalles (opcional)») | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
49
49
  | `true` (default, `question-line`) | **solo** si el título es una pregunta de ayuda | `pages/driver/driver-profile/driver-profile.html:156` («¿Por qué no me llegan pedidos?») | propuesta |
50
- | un nombre de ícono | el ícono dice de qué es la sección y hay varias juntas | `pages/notifications/notifications.html:72` (`settings-3-line`) | propuesta |
50
+ | un nombre de ícono | el ícono dice de qué es la sección y hay varias juntas | `pages/notifications/notifications.html:72` (`settings-3-line`) | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
51
51
 
52
52
  Hoy: 16 en `false`, 2 con el default (las dos son preguntas de ayuda) y 1 con ícono propio. El
53
53
  default del componente es el caso raro: **casi siempre hay que apagarlo**.
@@ -61,13 +61,14 @@ son preguntas y van sin ícono; las dos de ayuda dentro de la app, con. Elegir u
61
61
  | qué | cuándo | fuente |
62
62
  |---|---|---|
63
63
  | `description` | **una respuesta corta en texto** (FAQ): aparece al abrir, alineada con el título | según el Figma del DS |
64
- | contenido proyectado | cualquier otra cosa: campos, listas, cards, tablas | propuesta |
64
+ | contenido proyectado | cualquier otra cosa: campos, listas, cards, tablas | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
65
65
 
66
- **A revisar:** 4 accordions pasan un **resumen** en `description` (`resumenReto()`,
67
- `resumenVotaciones()`, `resumenDetalles()`…) que, por cómo funciona el componente, **solo se ve
68
- con el accordion abierto**. Si la idea era ver el resumen cerrado, hoy no se ve:
69
- `pages/driver/driver-dashboard/driver-dashboard.html:287` y `:486`,
70
- `pages/envios/envios.html:412`, `pages/customer/mandadito/mandadito.html:188`.
66
+ **A revisar:** 2 accordions pasan un **resumen** en `description` (`resumenDetallesEnvio()`,
67
+ `resumenDetalles()`) que, por cómo funciona el componente, **solo se ve con el accordion
68
+ abierto**. Si la idea era ver el resumen cerrado, hoy no se ve:
69
+ `pages/envios/envios.html:413` y `pages/customer/mandadito/mandadito.html:189`. Los dos del
70
+ dashboard del repartidor («Votaciones» y «Reto semanal») ya pasaron su resumen al `badge`
71
+ (05-10-2026), que sí se ve cerrado.
71
72
 
72
73
  ### `lazy` — cuándo diferir el contenido
73
74
 
@@ -79,15 +80,15 @@ con el accordion abierto**. Si la idea era ver el resumen cerrado, hoy no se ve:
79
80
 
80
81
  **Usos de hoy que no hacen lo que parecen:** 4 accordions usan `<ng-template suiAccordionContent>`
81
82
  **sin** `[lazy]="true"`, y sin `lazy` el template se crea al cargar igual que el contenido plano:
82
- `pages/envios/envios.html:418` y `:743`, `pages/customer/order-tracking/order-tracking.html:590`,
83
- `pages/customer/mandadito/mandadito.html:194`. Les falta `[lazy]="true"`.
83
+ `pages/envios/envios.html:413` y `:756`, `pages/customer/order-tracking/order-tracking.html:611`,
84
+ `pages/customer/mandadito/mandadito.html:189`. Les falta `[lazy]="true"`.
84
85
 
85
86
  ### `flipIcon` y `badge`
86
87
 
87
88
  | input | cuándo | fuente |
88
89
  |---|---|---|
89
90
  | `flipIcon="on"` | listas largas donde el «+» a la izquierda se escanea mejor que a la derecha. 0 usos hoy | según el Figma del DS (la variante existe) |
90
- | `badge` | marcar una sección como nueva o actualizada («Nuevo»). Extensión de SUI; 0 usos hoy | propuesta |
91
+ | `badge` | marcar una sección como nueva o actualizada («Nuevo»), o dejar a la vista con la fila cerrada un estado de una o dos palabras («Sin reto», «3 de 10»). Extensión de SUI; 2 usos hoy, los dos del segundo tipo: `pages/driver/driver-dashboard/driver-dashboard.html:332` y `:516` | «Nuevo»: canon (aprobado por el dueño, 05-10-2026, bloque B9) · estado con la fila cerrada: pedido del dueño, 05-10-2026 (`core/resumen-acordeones-repartidor.ts`) |
91
92
 
92
93
  ## Tamaño en mobile y en web
93
94
 
@@ -100,6 +101,35 @@ cómoda en mobile.
100
101
  | fila | ancho completo, 48 px | igual | componente |
101
102
  | texto | Label/Small 14 y Paragraph/Small 14 | igual | según el Figma del DS |
102
103
 
104
+ ### Por dispositivo (D16)
105
+
106
+ La fila no tiene `size`: mide 48 en todos los dispositivos, que ya pasa los 44 del dedo en el
107
+ celular y la tablet, y en la computadora no estorba. Lo único con tamaño es el **`badge`**, que
108
+ no se toca y sigue la fila de `badge` de D16. El accordion lo pinta en `small` si no le pasas
109
+ `size` (también con el atajo `badge="Nuevo"`), y D16 no deja nada en `small`:
110
+
111
+ | dispositivo | size del `badge` | nota |
112
+ |---|---|---|
113
+ | celular chico (< 380) | `medium` | lo que no se toca no sube en el celular chico |
114
+ | celular (380–767) | `large` | un paso más que en la computadora (P1 b). No `xlarge`: ver abajo |
115
+ | tablet táctil | `medium` | |
116
+ | computadora | `medium` | `medium` va sin MAYÚSCULAS |
117
+
118
+ Ultrawide: igual que la computadora. Fuente: D16, dueño 05-10-2026.
119
+
120
+ **Por qué `large` y no `xlarge` en el celular**, aunque el badge va en la fila del título
121
+ (`.sui-accordion__title-row`): la excepción «`xlarge` junto a un título» de D16 es para un título
122
+ de encabezado o un monto: según el README de `sui-badge`, en el celular el badge va al lado de
123
+ textos de 16. El título del accordion es
124
+ Label/Small 14/20, el mismo nivel que una fila de lista: un `xlarge` (28, texto 16) tendría letra
125
+ más grande que el título que acompaña, y `large` (24, texto 14) lo iguala. Es una lectura de D16,
126
+ no una decisión aparte del dueño; si se quiere `xlarge` aquí, lo decide él. `bp.sizeBadge()` ya da
127
+ `large`/`medium`, así que no hace falta otra expresión.
128
+
129
+ En master-pedidos: `[badge]="{ label: 'Nuevo', size: bp.sizeBadge() }"`. Hoy los dos badges del
130
+ dashboard del repartidor salen en `medium` fijo (`core/resumen-acordeones-repartidor.ts:19`):
131
+ en el celular les falta subir a `large`.
132
+
103
133
  ## API
104
134
 
105
135
  <!-- api:inicio -->
@@ -150,6 +180,50 @@ Slots: contenido plano (o con el atributo `sui-accordion-body`) y el template
150
180
  contenido cambia de alto estando abierto, acompaña.
151
181
  - El host borra el atributo `title` nativo (sin tooltip gris del navegador).
152
182
 
183
+ ## Bien y mal
184
+
185
+ Contenido diferido
186
+
187
+ ```html
188
+ <!-- ❌ mal: el template sin [lazy] se crea al cargar igual (pages/envios/envios.html:756) -->
189
+ <sui-accordion [title]="tituloDetalle(e)" [leftIcon]="false" [(open)]="detalleAbierto">
190
+ <ng-template suiAccordionContent>…</ng-template>
191
+ </sui-accordion>
192
+ ```
193
+
194
+ ```html
195
+ <!-- ✅ bien -->
196
+ <sui-accordion [title]="tituloDetalle(e)" [leftIcon]="false" [lazy]="true" [(open)]="detalleAbierto">
197
+ <ng-template suiAccordionContent>…</ng-template>
198
+ </sui-accordion>
199
+ ```
200
+
201
+ Resumen de la fila cerrada
202
+
203
+ ```html
204
+ <!-- ❌ mal: description solo se ve abierto; cerrado, el resumen no aparece (pages/envios/envios.html:413) -->
205
+ <sui-accordion title="Más detalles (opcional)" [description]="resumenDetallesEnvio()"
206
+ [leftIcon]="false" />
207
+ ```
208
+
209
+ ```html
210
+ <!-- ✅ bien: lo que tiene que verse cerrado va en el título, como en master-orders.html:673 -->
211
+ <sui-accordion [title]="'Más detalles · ' + resumenDetallesEnvio()" [leftIcon]="false" />
212
+ ```
213
+
214
+ Badge en la fila
215
+
216
+ ```html
217
+ <!-- ❌ mal: el atajo de string sale en small, y D16 no deja nada en small -->
218
+ <sui-accordion title="Reto semanal" badge="Nuevo" [leftIcon]="false" />
219
+ ```
220
+
221
+ ```html
222
+ <!-- ✅ bien -->
223
+ <sui-accordion title="Reto semanal" [badge]="{ label: 'Nuevo', size: bp.sizeBadge() }"
224
+ [leftIcon]="false" />
225
+ ```
226
+
153
227
  ## Ejemplo
154
228
 
155
229
  ```html
@@ -29,28 +29,28 @@ Regla corta: **quién hizo qué → activity feed · avisos para mí → notific
29
29
 
30
30
  > **La guía del DS no tiene página del activity feed.** El componente sale del Figma de SUI
31
31
  > (Activity Feed [1.1], frame 166035:46833). Uso medido el 03-10-2026 en `master-pedidos/src/app`:
32
- > **0 usos**. Todo lo de abajo es **propuesta, falta aprobación**.
32
+ > **0 usos**. Lo marcado canon está aprobado; lo que sigue en **propuesta** espera decisión.
33
33
 
34
34
  El tipo de fila lo decide `type` de cada item (una unión discriminada): lo que cuelga debajo de
35
35
  la línea de texto.
36
36
 
37
37
  | `type` | cuándo | ejemplo posible en la app | fuente |
38
38
  |---|---|---|---|
39
- | `default` | La acción se entiende sola con la línea. Es el caso normal. | «Ana aprobó la recarga de Luis» | propuesta, falta aprobación |
40
- | `file` | La acción dejó archivos que se pueden bajar. | «Luis subió su comprobante de Yape» | propuesta, falta aprobación |
41
- | `comment` | La acción fue escribir algo y el texto importa. | «El local dejó una nota en el pedido» | propuesta, falta aprobación |
42
- | `avatar-group` | La acción involucró a varias personas. | «Se asignaron 3 repartidores a la zona» | propuesta, falta aprobación |
43
- | `tasks` | La acción tuvo un resultado por partes (hechas, pendientes, con error). | «Se importó la carta: 40 productos, 2 con error» | propuesta, falta aprobación |
39
+ | `default` | La acción se entiende sola con la línea. Es el caso normal. | «Ana aprobó la recarga de Luis» | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
40
+ | `file` | La acción dejó archivos que se pueden bajar. | «Luis subió su comprobante de Yape» | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
41
+ | `comment` | La acción fue escribir algo y el texto importa. | «El local dejó una nota en el pedido» | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
42
+ | `avatar-group` | La acción involucró a varias personas. | «Se asignaron 3 repartidores a la zona» | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
43
+ | `tasks` | La acción tuvo un resultado por partes (hechas, pendientes, con error). | «Se importó la carta: 40 productos, 2 con error» | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
44
44
 
45
45
  | pieza del item | regla | fuente |
46
46
  |---|---|---|
47
- | leading | `avatar` cuando lo hizo una persona; `icon` cuando lo hizo el sistema (una Cloud Function, un cobro automático). | propuesta, falta aprobación |
47
+ | leading | `avatar` cuando lo hizo una persona; `icon` cuando lo hizo el sistema (una Cloud Function, un cobro automático). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
48
48
  | `avatar.src` | La foto de **otra** persona va denormalizada y pasada por `fotoDeStorage()`, nunca la URL de Google. | canon (CLAUDE.md, «Fotos de otra persona») |
49
49
  | `avatar.color` | Para iniciales sin foto, `color` del set de SUI. `bgColor` solo como escape: no ajusta el color del texto. | canon del componente |
50
50
  | `userName` / `target` | Nombres, nunca IDs. | canon (CLAUDE.md, «Pasada de UX/UI»: un identificador nunca es el título de nada) |
51
- | `verb` | En pasado y en minúscula: «aprobó», «subió». | propuesta, falta aprobación |
52
- | `timestamp` | Relativo y corto: «hace 4 min», «ayer». Lo formateas tú. | propuesta, falta aprobación |
53
- | `showAction` | `false` salvo que haya un menú real detrás de los tres puntos. | propuesta, falta aprobación |
51
+ | `verb` | En pasado y en minúscula: «aprobó», «subió». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
52
+ | `timestamp` | Relativo y corto: «hace 4 min», «ayer». Lo formateas tú. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
53
+ | `showAction` | `false` salvo que haya un menú real detrás de los tres puntos. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
54
54
 
55
55
  **Carga:** un historial crece sin techo. Se pide por páginas con cursor (`getCollectionPage`
56
56
  ordenado por fecha) y un «Cargar más» al final, nunca la colección entera. Canon
@@ -69,6 +69,16 @@ de texto **envuelve** (`flex-wrap`), así que en mobile un «Ana aprobó la reca
69
69
  En táctil, el botón de tres puntos y la descarga miden 20 y 28: por debajo del área cómoda. Si
70
70
  el feed va en mobile con acciones, esa es la primera mejora que pide el componente.
71
71
 
72
+ ### Por dispositivo (D16)
73
+
74
+ No aplica: el feed **no tiene `size`** y nada en él cambia por dispositivo (avatar o ícono de 32,
75
+ texto 14/20). Si va o no en el celular y la tablet táctil sigue **pendiente** (P59: antes hay que
76
+ decidir si el feed es solo de web), porque los tres puntos (20) y la descarga (28) no llegan a 44.
77
+ Lo que va alrededor sí sigue D16: el «Cargar más» es un `sui-button` con
78
+ `[size]="bp.sizeControl()"`. El avatar del leading lo fija el feed en 32 (`SuiActivityAvatarRef`
79
+ no tiene `size`), así que no sube un paso en el celular como pide D16 para `avatar`: cambiarlo es
80
+ código del DS.
81
+
72
82
  ## «No usar»: por qué no hoy y cuándo sí
73
83
 
74
84
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -130,13 +140,57 @@ interface SuiActivityTask { state: 'success' | 'warning' | 'pending' | 'error';
130
140
  - No hay estado vacío ni de carga: cuando `items` está vacío no se ve nada. Usa `sui-empty-state`
131
141
  afuera, y un skeleton mientras llega la primera página.
132
142
 
143
+ ## Bien y mal
144
+
145
+ Historial vacío
146
+
147
+ ```html
148
+ <!-- ❌ mal: con items vacío el feed no pinta nada y queda un hueco (Trampas) -->
149
+ <sui-activity-feed [items]="historial()" />
150
+ ```
151
+
152
+ ```html
153
+ <!-- ✅ bien -->
154
+ @if (historial().length) {
155
+ <sui-activity-feed [items]="historial()" />
156
+ } @else {
157
+ <sui-empty-state title="Todavía no hay actividad" />
158
+ }
159
+ ```
160
+
161
+ Descargar un archivo
162
+
163
+ ```html
164
+ <!-- ❌ mal: file.href no lo lee la plantilla; sin (fileDownload) el chip no baja nada -->
165
+ <sui-activity-feed [items]="comprobantes()" />
166
+ ```
167
+
168
+ ```html
169
+ <!-- ✅ bien -->
170
+ <sui-activity-feed [items]="comprobantes()" (fileDownload)="descargar($event.file)" />
171
+ ```
172
+
173
+ Menú de los tres puntos
174
+
175
+ ```html
176
+ <!-- ❌ mal: los outputs hacen stopPropagation; el (click) del padre no se entera -->
177
+ <div (click)="abrirMenu()">
178
+ <sui-activity-feed [items]="historial()" />
179
+ </div>
180
+ ```
181
+
182
+ ```html
183
+ <!-- ✅ bien -->
184
+ <sui-activity-feed [items]="historial()" (action)="abrirMenu($event.item)" />
185
+ ```
186
+
133
187
  ## Ejemplo
134
188
 
135
189
  ```html
136
190
  <sui-card>
137
191
  <sui-activity-feed [items]="historial()" (fileDownload)="descargar($event.file)" />
138
192
  @if (hayMas()) {
139
- <sui-button variant="stroke" color="neutral" [size]="bp.isMobile() ? 'large' : 'small'"
193
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()"
140
194
  (click)="cargarMas()">Cargar más</sui-button>
141
195
  }
142
196
  </sui-card>
@@ -28,16 +28,16 @@ Regla corta: **filtros del activity feed → activity filter · cualquier otra l
28
28
 
29
29
  > **La guía del DS no tiene página de este filtro.** Sale del Figma de SUI (Activity Feed Selected
30
30
  > Filter [1.1], frame 165967:3881: Default, Hover, Active). Uso medido el 03-10-2026 en
31
- > `master-pedidos/src/app`: **0 usos**. Lo de abajo es **propuesta, falta aprobación**.
31
+ > `master-pedidos/src/app`: **0 usos**. Lo marcado canon está aprobado; lo que sigue en **propuesta** espera decisión.
32
32
 
33
33
  | prop | cuándo | fuente |
34
34
  |---|---|---|
35
35
  | `active` | El filtro que está aplicado (fondo naranja al 10 %, texto e ícono naranja). | Figma (State=Active) |
36
- | `icon` | Un ícono que diga el tipo: `file-list-2-line` archivos, `chat-3-line` comentarios, `task-line` tareas. | propuesta, falta aprobación |
37
- | `icon` en `null` | «Todos»: el chip que limpia el filtro va sin ícono. | propuesta, falta aprobación |
36
+ | `icon` | Un ícono que diga el tipo: `file-list-2-line` archivos, `chat-3-line` comentarios, `task-line` tareas. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
37
+ | `icon` en `null` | «Todos»: el chip que limpia el filtro va sin ícono. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
38
38
  | `disabled` | Un tipo que no tiene ninguna actividad en el rango elegido. Mejor que esconderlo: la fila no salta. | propuesta, falta aprobación (el disabled no está en el Figma) |
39
39
 
40
- ¿Uno o varios a la vez? El componente no lo decide. Propuesta: **uno a la vez, con «Todos»**,
40
+ ¿Uno o varios a la vez? El componente no lo decide. Canon (aprobado por el dueño, 05-10-2026, bloque B8): **uno a la vez, con «Todos»**,
41
41
  igual que `sui-tab-chips`; así nadie se queda con un historial vacío por combinar filtros.
42
42
 
43
43
  ## Tamaño en mobile y en web
@@ -46,10 +46,19 @@ igual que `sui-tab-chips`; así nadie se queda con un historial vacío por combi
46
46
 
47
47
  | uso | mobile | web | fuente |
48
48
  |---|---|---|---|
49
- | filtros del activity feed | no usar: 30 no llega al dedo; usar `sui-tab-chips` en `large` | `sui-activity-filter` | propuesta, falta aprobación |
49
+ | filtros del activity feed | no usar: 30 no llega al dedo; usar `sui-tab-chips` en `xlarge` (44). Vale también para la tablet táctil | `sui-activity-filter` | canon (aprobado por el dueño, 05-10-2026, bloque B13) · tablet: D16, dueño 05-10-2026 |
50
50
 
51
51
  La fila de chips la arma la pantalla: el componente no trae contenedor ni scroll lateral.
52
52
 
53
+ ### Por dispositivo (D16)
54
+
55
+ No aplica: no tiene `size` (mide 30 en todos lados), así que D16 no le elige tamaño sino **si
56
+ va**. Con 30 no llega a los 44 del dedo: en el celular (también el chico) y en la tablet táctil
57
+ va `sui-tab-chips`, con los sizes de su fila de D16 (B13); en la computadora y el ultrawide, este
58
+ chip. Fuente: D16, dueño 05-10-2026.
59
+
60
+ En master-pedidos: `@if (bp.tactil()) { <sui-tab-chips [size]="bp.sizeChips()" …/> } @else { <sui-activity-filter …> }`.
61
+
53
62
  ## «No usar»: por qué no hoy y cuándo sí
54
63
 
55
64
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -88,6 +97,46 @@ Slot: `<ng-content>` (el texto del chip).
88
97
  - El foco usa un `outline` de 2 px naranja, no el doble anillo de los inputs del DS.
89
98
  - Ya trae el arreglo de iOS para el `:active` pegado.
90
99
 
100
+ ## Bien y mal
101
+
102
+ Escuchar el toque
103
+
104
+ ```html
105
+ <!-- ❌ mal: con (click) el filtro no responde a Enter ni Espacio (Trampas) -->
106
+ <sui-activity-filter icon="chat-3-line" (click)="filtro.set('comentarios')">Comentarios</sui-activity-filter>
107
+ ```
108
+
109
+ ```html
110
+ <!-- ✅ bien -->
111
+ <sui-activity-filter icon="chat-3-line" [active]="filtro() === 'comentarios'" (clicked)="filtro.set('comentarios')">Comentarios</sui-activity-filter>
112
+ ```
113
+
114
+ El chip «Todos»
115
+
116
+ ```html
117
+ <!-- ❌ mal: sin icon sale el de archivos por defecto -->
118
+ <sui-activity-filter [active]="filtro() === 'todos'" (clicked)="filtro.set('todos')">Todos</sui-activity-filter>
119
+ ```
120
+
121
+ ```html
122
+ <!-- ✅ bien -->
123
+ <sui-activity-filter [icon]="null" [active]="filtro() === 'todos'" (clicked)="filtro.set('todos')">Todos</sui-activity-filter>
124
+ ```
125
+
126
+ En el celular o la tablet
127
+
128
+ ```html
129
+ <!-- ❌ mal: 30 de alto no llega al dedo (B13 y D16) -->
130
+ <sui-activity-filter icon="task-line" (clicked)="filtro.set('tareas')">Tareas</sui-activity-filter>
131
+ ```
132
+
133
+ ```html
134
+ <!-- ✅ bien -->
135
+ @if (bp.tactil()) {
136
+ <sui-tab-chips [chips]="filtros" [(value)]="filtro" [size]="bp.sizeChips()" />
137
+ } @else { … }
138
+ ```
139
+
91
140
  ## Ejemplo
92
141
 
93
142
  ```html
@@ -152,6 +152,16 @@ en mobile es el ancho: ocupa toda la columna.
152
152
  | la X de cerrar (`dismissible`) | se ve de 16 px en `xsmall`, 20 en `small`, 24 en `large`, 28 en `xlarge`; **se toca en 44 × 44** (`::before` invisible; en `xsmall`/`small` el alert mide 32/36 y recorta el área a su alto, y a la izquierda solo crece 4 para no pisar las acciones inline) | se ve igual, sin área extra | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
153
153
  | las acciones (`actions[]`) | link de 20 px de alto en `large`/`xlarge`, 16 en `small`/`xsmall` | igual | según el componente |
154
154
 
155
+ ### Por dispositivo (D16)
156
+
157
+ No aplica: el `size` del alert lo elige el **contenido** (con descripción `large`, de una línea
158
+ `small`, dentro de un campo `xsmall`), no el dispositivo, y es el mismo en el celular, la tablet
159
+ y la computadora. Por eso no hay helper de `bp`: se escribe el literal. Queda **pendiente** si
160
+ `small`/`xsmall` chocan con el «nada en `small`» de D16: la hoja de decisiones las dejó fuera
161
+ porque ahí el `size` cambia el layout, no la escala. También queda pendiente el área de 44 de la
162
+ X en la **tablet táctil**: hoy se prende solo con `max-width: 767px`, y el arreglo (mixin
163
+ `sui-tactil` con `pointer: coarse`) espera el sí del dueño.
164
+
155
165
 
156
166
  ## API
157
167
 
@@ -219,6 +229,50 @@ Slot: `<ng-content select="[slot=action]">` — legado; solo se usa si `actions`
219
229
  - El slot de acción usa `slot=`; los de badge y button usan `data-slot=`.
220
230
  - El host borra el atributo `title` nativo (no aparece el tooltip gris del navegador).
221
231
 
232
+ ## Bien y mal
233
+
234
+ Aviso con descripción
235
+
236
+ ```html
237
+ <!-- ❌ mal: en small la descripción no se pinta (pages/super-admin/master-settings/master-settings.html:635) -->
238
+ <sui-alert size="small" title="Todavía no guardaste ninguna escala"
239
+ description="Estos son los niveles que trae la app." />
240
+ ```
241
+
242
+ ```html
243
+ <!-- ✅ bien -->
244
+ <sui-alert size="large" title="Todavía no guardaste ninguna escala"
245
+ description="Estos son los niveles que trae la app." />
246
+ ```
247
+
248
+ Aviso que solo informa
249
+
250
+ ```html
251
+ <!-- ❌ mal: filled compite con el botón principal y no frena nada (pages/driver/driver-earnings/driver-earnings.html:16) -->
252
+ <sui-alert variantStyle="filled" variant="info" title="Cobras por cada entrega"
253
+ description="Esto es lo que llevas ganado por las entregas que completaste." />
254
+ ```
255
+
256
+ ```html
257
+ <!-- ✅ bien -->
258
+ <sui-alert variant="info" title="Cobras por cada entrega"
259
+ description="Esto es lo que llevas ganado por las entregas que completaste." />
260
+ ```
261
+
262
+ Una sola acción
263
+
264
+ ```html
265
+ <!-- ❌ mal: la primera acción va subrayada y esta no (pages/notifications/notifications.ts:200) -->
266
+ <sui-alert variant="info" title="Activa las notificaciones"
267
+ [actions]="[{ label: 'Activar', onClick: activar }]" />
268
+ ```
269
+
270
+ ```html
271
+ <!-- ✅ bien -->
272
+ <sui-alert variant="info" title="Activa las notificaciones"
273
+ [actions]="[{ label: 'Activar', onClick: activar, underline: true }]" />
274
+ ```
275
+
222
276
  ## Ejemplo
223
277
 
224
278
  ```html
@@ -25,7 +25,7 @@ Google Play, en ese orden.
25
25
  ## Qué variante usar
26
26
 
27
27
  > **La guía del DS no tiene página para este componente.** Todo lo de abajo es **canon (aprobado
28
- > por el dueño, 03-10-2026)** o propuesta. Los sellos son los oficiales de cada tienda (cada una
28
+ > por el dueño, 03-10-2026 o 05-10-2026)** o propuesta. Los sellos son los oficiales de cada tienda (cada una
29
29
  > pide usar el suyo tal cual, sin recolorear ni tocar el logo).
30
30
  >
31
31
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: 10 sellos en 4 archivos, sin contar
@@ -55,12 +55,12 @@ Google Play, en ese orden.
55
55
 
56
56
  | prop | cuándo | fuente |
57
57
  |---|---|---|
58
- | `height` (40, default) | 40 en desktop y en el footer. El ancho sale solo de la proporción de cada sello. | propuesta |
58
+ | `height` (40, default) | 40 en web; el footer en mobile va a 44. El ancho sale solo de la proporción de cada sello. | canon (aprobado por el dueño, 05-10-2026, bloque B13) |
59
59
  | `height` 48 | En el hero de una landing en mobile, si los sellos son el CTA principal. Los dos sellos siempre a la misma altura. | propuesta |
60
- | `href` | Siempre: el link de la ficha de la tienda (`apps.apple.com/pe/app/master-pedidos/…`, `play.google.com/store/apps/details?id=com.masterpedidos.app`). Sin `href` el sello no es un link. | propuesta (es la práctica de los 10 usos de hoy) |
61
- | `target="_blank"` | Siempre que hay `href`: el `rel="noopener"` se aplica solo en ese caso. | propuesta |
62
- | `ariaLabel` | Siempre, en español: «Descargar Master Pedidos en App Store». Sin él, el texto alternativo es genérico («Descargar en App Store», en español desde el 04-10-2026). | propuesta |
63
- | `disabled` | Sin caso: si la app no está en una tienda, no se muestra su sello. | propuesta |
60
+ | `href` | Siempre: el link de la ficha de la tienda (`apps.apple.com/pe/app/master-pedidos/…`, `play.google.com/store/apps/details?id=com.masterpedidos.app`). Sin `href` el sello no es un link. | canon (aprobado por el dueño, 05-10-2026, bloque B10) (es la práctica de los 10 usos de hoy) |
61
+ | `target="_blank"` | Siempre que hay `href`: el `rel="noopener"` se aplica solo en ese caso. | canon (aprobado por el dueño, 05-10-2026, bloque B10) |
62
+ | `ariaLabel` | Siempre, en español: «Descargar Master Pedidos en App Store». Sin él, el texto alternativo es genérico («Descargar en App Store», en español desde el 04-10-2026). | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
63
+ | `disabled` | Sin caso: si la app no está en una tienda, no se muestra su sello. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
64
64
 
65
65
  ## Tamaño en mobile y en web
66
66
 
@@ -74,16 +74,26 @@ Regla del dueño, 03-10-2026.
74
74
  | uso | mobile | web | fuente |
75
75
  |---|---|---|---|
76
76
  | hero de una landing, cuando los sellos son el CTA | `[height]="48"` | `[height]="40"` | propuesta |
77
- | footer de las landings, «Descarga la app» | `[height]="44"` | `[height]="40"` (default) | propuesta |
77
+ | footer de las landings, «Descarga la app» | `[height]="44"` | `[height]="40"` (default) | mobile: canon (decisión del dueño 04-10-2026, piso táctil 44) · web: propuesta |
78
78
 
79
79
  ```html
80
- <sui-app-store-badge company="app-store" [height]="bp.isMobile() ? 48 : 40" href="…" target="_blank"
80
+ <sui-app-store-badge company="app-store" [height]="bp.tactil() ? 48 : 40" href="…" target="_blank"
81
81
  ariaLabel="Descargar Master Pedidos en App Store" />
82
82
  ```
83
83
 
84
84
  Los dos sellos siempre a la misma altura. Hoy los 10 usan la altura default (40) también en mobile:
85
85
  quedan 4 px por debajo de los 44.
86
86
 
87
+ ### Por dispositivo (D16)
88
+
89
+ **No tiene `size`**: el alto va en px por `[height]`, así que no hay escala que repartir por
90
+ dispositivo. Lo que sí aplica es la regla de lo que se toca: el sello es un link, y en toda
91
+ pantalla táctil (celular, celular chico y tablet con `pointer: coarse`) va a **44 o más**; en la
92
+ computadora, 40. En el ultrawide, igual que en la computadora. Por eso la condición es
93
+ `bp.tactil()` y no `bp.isMobile()`: con `isMobile` el iPad se queda en 40.
94
+
95
+ En master-pedidos: `[height]="bp.tactil() ? 44 : 40"` (footer) · `[height]="bp.tactil() ? 48 : 40"` (hero, propuesta).
96
+
87
97
  ## «No usar»: por qué no hoy y cuándo sí
88
98
 
89
99
  Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
@@ -126,13 +136,57 @@ Outputs: ninguno.
126
136
  - `height` escala el sello entero; no le pongas `width` desde afuera o se deforma.
127
137
  - El hover baja la opacidad a 0.85, como recomienda Apple; no hay estado activo propio de las tiendas.
128
138
 
139
+ ## Bien y mal
140
+
141
+ Texto para el lector de pantalla
142
+
143
+ ```html
144
+ <!-- ❌ mal: alt genérico, no dice qué app (components/landing-footer/landing-footer.html:18) -->
145
+ <sui-app-store-badge company="app-store" appearance="alternative" href="…" target="_blank"
146
+ ariaLabel="Descargar en App Store" />
147
+ ```
148
+
149
+ ```html
150
+ <!-- ✅ bien -->
151
+ <sui-app-store-badge company="app-store" appearance="alternative" [height]="bp.tactil() ? 44 : 40"
152
+ href="…" target="_blank" ariaLabel="Descargar Master Pedidos en App Store" />
153
+ ```
154
+
155
+ Alto en una pantalla táctil
156
+
157
+ ```html
158
+ <!-- ❌ mal: sin [height] queda en 40 también en el celular, 4 px bajo el piso de 44 (pages/public/landing-customers/landing-customers.html:32) -->
159
+ <sui-app-store-badge company="google-play" appearance="preferred" href="…" target="_blank"
160
+ ariaLabel="Descargar Master Pedidos en Google Play" />
161
+ ```
162
+
163
+ ```html
164
+ <!-- ✅ bien: 44 es el piso táctil; en el hero, 48 si se aprueba esa propuesta -->
165
+ <sui-app-store-badge company="google-play" appearance="preferred" [height]="bp.tactil() ? 44 : 40"
166
+ href="…" target="_blank" ariaLabel="Descargar Master Pedidos en Google Play" />
167
+ ```
168
+
169
+ Sello que no lleva a ningún lado
170
+
171
+ ```html
172
+ <!-- ❌ mal: sin href pinta solo la imagen, sin foco ni clic (ver «Trampas») -->
173
+ <sui-app-store-badge company="app-store" ariaLabel="Descargar Master Pedidos en App Store" />
174
+ ```
175
+
176
+ ```html
177
+ <!-- ✅ bien -->
178
+ <sui-app-store-badge company="app-store" [height]="bp.tactil() ? 44 : 40"
179
+ href="https://apps.apple.com/pe/app/master-pedidos/id6764676191"
180
+ target="_blank" ariaLabel="Descargar Master Pedidos en App Store" />
181
+ ```
182
+
129
183
  ## Ejemplo
130
184
 
131
185
  ```html
132
- <sui-app-store-badge company="app-store"
186
+ <sui-app-store-badge company="app-store" [height]="bp.tactil() ? 44 : 40"
133
187
  href="https://apps.apple.com/pe/app/master-pedidos/id6764676191" target="_blank"
134
188
  ariaLabel="Descargar Master Pedidos en App Store" />
135
- <sui-app-store-badge company="google-play"
189
+ <sui-app-store-badge company="google-play" [height]="bp.tactil() ? 44 : 40"
136
190
  href="https://play.google.com/store/apps/details?id=com.masterpedidos.app" target="_blank"
137
191
  ariaLabel="Descargar Master Pedidos en Google Play" />
138
192
  ```