@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.
- package/docs/sui-accordion/README.md +85 -11
- package/docs/sui-activity-feed/README.md +65 -11
- package/docs/sui-activity-filter/README.md +54 -5
- package/docs/sui-alert/README.md +54 -0
- package/docs/sui-app-store-badge/README.md +64 -10
- package/docs/sui-avatar/README.md +92 -29
- package/docs/sui-avatar-group/README.md +75 -9
- package/docs/sui-badge/README.md +85 -17
- package/docs/sui-banner/README.md +85 -20
- package/docs/sui-brand-logo/README.md +95 -31
- package/docs/sui-breadcrumb-item/README.md +54 -3
- package/docs/sui-breadcrumbs/README.md +54 -6
- package/docs/sui-button/README.md +76 -12
- package/docs/sui-button-group/README.md +91 -23
- package/docs/sui-button-group-item/README.md +81 -14
- package/docs/sui-card/README.md +105 -18
- package/docs/sui-chart-legend/README.md +63 -10
- package/docs/sui-chart-legend-dot/README.md +59 -10
- package/docs/sui-checkbox/README.md +109 -29
- package/docs/sui-checkbox-card/README.md +70 -14
- package/docs/sui-checkbox-label/README.md +92 -26
- package/docs/sui-circular-progress-bar/README.md +80 -19
- package/docs/sui-color-dot/README.md +72 -12
- package/docs/sui-color-picker/README.md +71 -13
- package/docs/sui-command-menu-footer/README.md +50 -1
- package/docs/sui-command-menu-item/README.md +74 -14
- package/docs/sui-command-menu-search/README.md +58 -3
- package/docs/sui-compact-avatar-group/README.md +73 -13
- package/docs/sui-compact-button/README.md +123 -34
- package/docs/sui-compact-select/README.md +61 -7
- package/docs/sui-compact-select-for-input/README.md +70 -6
- package/docs/sui-content-card/README.md +75 -14
- package/docs/sui-content-divider/README.md +67 -16
- package/docs/sui-content-label/README.md +99 -20
- package/docs/sui-counter-input/README.md +102 -18
- package/docs/sui-date-selector/README.md +69 -11
- package/docs/sui-datepicker/README.md +85 -18
- package/docs/sui-day-cell/README.md +75 -17
- package/docs/sui-day-label/README.md +56 -7
- package/docs/sui-divider/README.md +64 -9
- package/docs/sui-drawer-footer/README.md +63 -2
- package/docs/sui-drawer-header/README.md +69 -12
- package/docs/sui-dropdown-caption/README.md +58 -6
- package/docs/sui-dropdown-item/README.md +75 -9
- package/docs/sui-dropdown-menu/README.md +83 -14
- package/docs/sui-dropdown-search/README.md +60 -4
- package/docs/sui-emoji/README.md +94 -30
- package/docs/sui-empty-state/README.md +71 -7
- package/docs/sui-fancy-button/README.md +74 -14
- package/docs/sui-file-icon/README.md +70 -12
- package/docs/sui-file-upload/README.md +77 -17
- package/docs/sui-file-upload-card/README.md +64 -12
- package/docs/sui-filter/README.md +83 -14
- package/docs/sui-flag/README.md +73 -8
- package/docs/sui-form-hint/README.md +56 -7
- package/docs/sui-form-label/README.md +57 -5
- package/docs/sui-href/README.md +47 -0
- package/docs/sui-icon/README.md +86 -18
- package/docs/sui-image-upload/README.md +90 -22
- package/docs/sui-image-upload-profile/README.md +70 -11
- package/docs/sui-img-retry/README.md +50 -1
- package/docs/sui-inline-input/README.md +67 -9
- package/docs/sui-inline-select/README.md +62 -2
- package/docs/sui-input/README.md +90 -27
- package/docs/sui-integration-switch/README.md +84 -17
- package/docs/sui-kbd/README.md +73 -9
- package/docs/sui-key-icon/README.md +85 -23
- package/docs/sui-link-button/README.md +96 -27
- package/docs/sui-logo/README.md +93 -22
- package/docs/sui-modal/README.md +72 -13
- package/docs/sui-modal-footer/README.md +86 -12
- package/docs/sui-modal-header/README.md +57 -1
- package/docs/sui-modal-sheet/README.md +74 -12
- package/docs/sui-notification/README.md +81 -11
- package/docs/sui-notification-footer/README.md +55 -5
- package/docs/sui-notification-tab-menu/README.md +61 -5
- package/docs/sui-otp-input/README.md +70 -9
- package/docs/sui-page-header/README.md +89 -19
- package/docs/sui-pagination/README.md +73 -13
- package/docs/sui-password-strength/README.md +50 -1
- package/docs/sui-payment-icon/README.md +80 -18
- package/docs/sui-period-range/README.md +70 -11
- package/docs/sui-popover/README.md +81 -15
- package/docs/sui-product-card/README.md +89 -21
- package/docs/sui-progress-bar/README.md +82 -15
- package/docs/sui-progress-bar-label/README.md +79 -18
- package/docs/sui-radio/README.md +84 -7
- package/docs/sui-radio-card/README.md +70 -16
- package/docs/sui-radio-label/README.md +89 -22
- package/docs/sui-rating/README.md +101 -31
- package/docs/sui-rich-editor/README.md +47 -2
- package/docs/sui-segmented-control/README.md +90 -21
- package/docs/sui-select/README.md +80 -11
- package/docs/sui-sidebar/README.md +71 -16
- package/docs/sui-slider/README.md +75 -8
- package/docs/sui-social-button/README.md +71 -11
- package/docs/sui-status-badge/README.md +75 -14
- package/docs/sui-stepper/README.md +75 -18
- package/docs/sui-store-card/README.md +85 -22
- package/docs/sui-switch/README.md +82 -11
- package/docs/sui-switch-card/README.md +80 -16
- package/docs/sui-switch-label/README.md +91 -14
- package/docs/sui-tab-chips/README.md +93 -21
- package/docs/sui-tab-menu-horizontal/README.md +68 -7
- package/docs/sui-tab-menu-vertical/README.md +64 -11
- package/docs/sui-table/README.md +77 -16
- package/docs/sui-tag/README.md +86 -12
- package/docs/sui-tag-input/README.md +77 -13
- package/docs/sui-textarea/README.md +84 -17
- package/docs/sui-time-picker/README.md +96 -33
- package/docs/sui-toast/README.md +81 -20
- package/docs/sui-tooltip/README.md +80 -22
- package/docs/sui-topbar/README.md +64 -10
- package/docs/sui-topbar-button/README.md +61 -7
- package/docs/sui-topbar-item/README.md +68 -7
- package/docs/sui-topbar-user/README.md +61 -5
- package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- 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:
|
|
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`) |
|
|
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 |
|
|
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:**
|
|
67
|
-
`
|
|
68
|
-
|
|
69
|
-
`pages/
|
|
70
|
-
|
|
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:
|
|
83
|
-
`pages/customer/mandadito/mandadito.html:
|
|
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;
|
|
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**.
|
|
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» |
|
|
40
|
-
| `file` | La acción dejó archivos que se pueden bajar. | «Luis subió su comprobante de Yape» |
|
|
41
|
-
| `comment` | La acción fue escribir algo y el texto importa. | «El local dejó una nota en el pedido» |
|
|
42
|
-
| `avatar-group` | La acción involucró a varias personas. | «Se asignaron 3 repartidores a la zona» |
|
|
43
|
-
| `tasks` | La acción tuvo un resultado por partes (hechas, pendientes, con error). | «Se importó la carta: 40 productos, 2 con error» |
|
|
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). |
|
|
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ó». |
|
|
52
|
-
| `timestamp` | Relativo y corto: «hace 4 min», «ayer». Lo formateas tú. |
|
|
53
|
-
| `showAction` | `false` salvo que haya un menú real detrás de los tres puntos. |
|
|
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.
|
|
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
|
|
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. |
|
|
37
|
-
| `icon` en `null` | «Todos»: el chip que limpia el filtro va sin ícono. |
|
|
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.
|
|
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 `
|
|
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
|
package/docs/sui-alert/README.md
CHANGED
|
@@ -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
|
|
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. |
|
|
61
|
-
| `target="_blank"` | Siempre que hay `href`: el `rel="noopener"` se aplica solo en ese caso. |
|
|
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). |
|
|
63
|
-
| `disabled` | Sin caso: si la app no está en una tienda, no se muestra su sello. |
|
|
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.
|
|
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
|
```
|