@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
|
@@ -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. |
|
|
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` |
|
|
69
|
-
| `sm` | 24 | Chips y filas compactas. | `pages/driver/driver-dashboard/driver-dashboard.html:1047` (quién tomó el pedido) |
|
|
70
|
-
| `md` (default SUI) | 32 | Filas de listas y tablas. | `pages/super-admin/master-orders/master-orders.html:197` |
|
|
71
|
-
| `lg` | 40 | La tarjeta de una persona o de un local. | `pages/customer/order-tracking/order-tracking.html:348` (tu repartidor) |
|
|
72
|
-
| `xl` | 48 | Cabecera de un panel. | `pages/driver/driver-dashboard/driver-dashboard.html:19` (tu foto) |
|
|
73
|
-
| `2xl` | 56 | Cabecera de una ficha. | `pages/super-admin/master-users/master-user-sheet.html:21` |
|
|
74
|
-
| `3xl` | 64 | Tu propia foto al registrarte. | `pages/driver-onboarding/step-info/step-info.html:31` |
|
|
75
|
-
| `4xl` / `5xl` | 72 / 80 | No usar hoy (ver «No usar»). | — |
|
|
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». |
|
|
117
|
-
| `away` | En pausa: conectado pero sin recibir pedidos. |
|
|
118
|
-
| `busy` | Ocupado: ya lleva un pedido. |
|
|
119
|
-
| `offline` | Desconectado. Si en esa lista todos estarían `offline` casi siempre, mejor sin punto. |
|
|
120
|
-
| `company` | Repartidor propio de un local: el logo del local abajo (con `companyLogoSrc`). |
|
|
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). |
|
|
132
|
-
| `notification` | Tiene algo sin leer. |
|
|
133
|
-
| `favorite`, `pin`, `add`, `remove` | No usar hoy (ver «No usar»). |
|
|
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. |
|
|
142
|
-
| `companyLogoSrc` | Solo con `status="company"`. |
|
|
143
|
-
| `memojiSrc`, `illustrationSrc` | No usar hoy. |
|
|
144
|
-
| `bgColor` | No usar (ver abajo). |
|
|
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.
|
|
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.
|
|
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.
|
|
186
|
-
|
|
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
|
|
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». |
|
|
43
|
-
| `size` | `md` (32, default SUI) | La card del equipo de un local. |
|
|
44
|
-
| `size` | `lg` (40) | La cabecera de un panel (repartidores en la zona). |
|
|
45
|
-
| `size` | `xs`, `xl` a `5xl` | No usar hoy: en `xs` el «+N» no se lee; desde `xl` ya no es un resumen. |
|
|
46
|
-
| `max` | `3` | Tres visibles y el «+N», como el ejemplo de la guía. El default de SUI es `4`. |
|
|
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.
|
|
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.
|
|
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' },
|
package/docs/sui-badge/README.md
CHANGED
|
@@ -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:
|
|
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:
|
|
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) |
|
|
130
|
-
| `size` | `
|
|
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
|
|
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) | `
|
|
179
|
-
| junto a un título o un monto | `xlarge` (28) | `medium` (20) |
|
|
180
|
-
| conteo (`type="number"`) | `large` (24) | `
|
|
181
|
-
|
|
182
|
-
Patrón (`bp` = `BreakpointsService
|
|
183
|
-
|
|
184
|
-
`
|
|
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.
|
|
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
|
|
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) |
|
|
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) |
|
|
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` |
|
|
73
|
-
| `error` | Algo ya pasó y afecta a toda la cuenta. | `components/subscription-banner/subscription-banner.html:5` («Tu plan venció») |
|
|
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`) |
|
|
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ó») |
|
|
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. | — |
|
|
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. | — |
|
|
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) ·
|
|
92
|
-
| `dismissible` | `false` (default) | Todo `filled` y todo aviso que tiene que seguir ahí: plan vencido, administrando otro local. Cerrarlo no arregla nada. |
|
|
93
|
-
| `showIcon` | `true` (default) | Siempre: el ícono es la mitad del significado del tipo. |
|
|
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. |
|
|
95
|
-
| `slot="icon"` | avatar o logo | Reemplaza al ícono del tipo: el logo del local que estás administrando. |
|
|
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
|
-
- **
|
|
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 | `
|
|
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.
|
|
134
|
-
|
|
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
|