@ajuarezso/sui-design-system 0.19.0 → 0.20.0
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/INDEX.md +136 -0
- package/docs/sui-alert/README.md +216 -0
- package/docs/sui-app-store-badge/README.md +137 -0
- package/docs/sui-avatar/README.md +263 -0
- package/docs/sui-avatar-group/README.md +115 -0
- package/docs/sui-badge/README.md +212 -0
- package/docs/sui-brand-logo/README.md +143 -0
- package/docs/sui-button/README.md +192 -0
- package/docs/sui-button-group/README.md +178 -0
- package/docs/sui-button-group-item/README.md +102 -0
- package/docs/sui-checkbox/README.md +147 -0
- package/docs/sui-checkbox-label/README.md +143 -0
- package/docs/sui-circular-progress-bar/README.md +131 -0
- package/docs/sui-color-dot/README.md +112 -0
- package/docs/sui-color-picker/README.md +124 -0
- package/docs/sui-compact-avatar-group/README.md +103 -0
- package/docs/sui-compact-button/README.md +190 -0
- package/docs/sui-content-divider/README.md +124 -0
- package/docs/sui-divider/README.md +102 -0
- package/docs/sui-emoji/README.md +138 -0
- package/docs/sui-fancy-button/README.md +148 -0
- package/docs/sui-file-icon/README.md +103 -0
- package/docs/sui-flag/README.md +99 -0
- package/docs/sui-form-hint/README.md +124 -0
- package/docs/sui-form-label/README.md +148 -0
- package/docs/sui-icon/README.md +135 -0
- package/docs/sui-kbd/README.md +97 -0
- package/docs/sui-key-icon/README.md +125 -0
- package/docs/sui-link-button/README.md +221 -0
- package/docs/sui-logo/README.md +152 -0
- package/docs/sui-payment-icon/README.md +98 -0
- package/docs/sui-progress-bar/README.md +132 -0
- package/docs/sui-progress-bar-label/README.md +143 -0
- package/docs/sui-radio/README.md +134 -0
- package/docs/sui-radio-label/README.md +137 -0
- package/docs/sui-rating/README.md +198 -0
- package/docs/sui-segmented-control/README.md +144 -0
- package/docs/sui-slider/README.md +143 -0
- package/docs/sui-social-button/README.md +158 -0
- package/docs/sui-status-badge/README.md +164 -0
- package/docs/sui-switch/README.md +146 -0
- package/docs/sui-switch-label/README.md +139 -0
- package/docs/sui-tag/README.md +145 -0
- package/fesm2022/ajuarezso-sui-design-system.mjs +193 -48
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +166 -27
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-avatar
|
|
3
|
+
selector: sui-avatar
|
|
4
|
+
resumen: La cara de alguien (o el logo de un local) en un círculo, con iniciales cuando no hay foto
|
|
5
|
+
alternativas: [sui-avatar-group (varias personas apiladas), sui-compact-avatar-group (varias personas en una celda de tabla), sui-key-icon (un ícono en círculo que no es nadie), sui-image-upload-profile (subir o cambiar la foto)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-avatar
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Avatar/Avatar](https://sui-design-system.web.app/?path=/docs/atoms-avatar-avatar--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para mostrar **quién es**: un cliente, un repartidor, un local, un miembro del equipo.
|
|
15
|
+
Lleva la foto si la hay y, si no, las iniciales del nombre.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Un ícono en un círculo que no representa a nadie (un candado, un check, un reloj): eso es
|
|
20
|
+
`sui-key-icon`.
|
|
21
|
+
- Subir o cambiar la foto: `sui-image-upload-profile`.
|
|
22
|
+
- Varias personas juntas: `sui-avatar-group` o `sui-compact-avatar-group`.
|
|
23
|
+
- Decir el estado de una cuenta (activa, pendiente, bloqueada): eso es un `sui-badge` o
|
|
24
|
+
`sui-status-badge` al lado del nombre, no el punto de `status`.
|
|
25
|
+
|
|
26
|
+
Regla corta: **es alguien → avatar · es una cosa → key-icon · son varios → avatar-group.**
|
|
27
|
+
|
|
28
|
+
## Qué variante usar
|
|
29
|
+
|
|
30
|
+
> **La guía del DS dice qué es y qué opciones tiene, no cuándo usar cada una.** Lo marcado
|
|
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**.
|
|
33
|
+
>
|
|
34
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: 55 avatares en 25 archivos, sin contar
|
|
35
|
+
> prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`,
|
|
36
|
+
> `master-rutina`, `master-medico`, `dev-index`). Tamaños: 23 `lg`, 19 `md`, 5 `sm`, 3 `xs`,
|
|
37
|
+
> 3 `xl`, 1 `2xl`, 1 `3xl`. Colores: 34 `orange`, 7 `blue`, 7 con `bgColor`, 3 `green`,
|
|
38
|
+
> 1 `purple`, 1 `gray`, 1 `slate`, 1 dinámico. 34 traen `src`.
|
|
39
|
+
|
|
40
|
+
### Lo que sí dice la guía del DS
|
|
41
|
+
|
|
42
|
+
- **Para qué es**: una imagen que representa a una persona o a una organización.
|
|
43
|
+
- **Tamaños**: 80, 72, 64, 56, 48, 40, 32, 24 y 20 px; el default de la guía es 80 (en SUI,
|
|
44
|
+
`md` = 32).
|
|
45
|
+
- **Colores**: solo seis, `gray` (default), `yellow`, `blue`, `sky`, `purple` y `red`. Son el
|
|
46
|
+
fondo de las iniciales. `orange`, `green`, `pink`, `teal` y `slate` son **extensiones de SUI**.
|
|
47
|
+
- **Texto**: las iniciales van en MAYÚSCULAS.
|
|
48
|
+
- **Placeholder**: sin contenido sale una silueta (de persona o de empresa).
|
|
49
|
+
- **Indicadores**: el estado (`online`, `offline`, `busy`, `away`) y el logo de la empresa van
|
|
50
|
+
**abajo** a la derecha; la notificación (punto rojo) y el sello de verificado van **arriba**.
|
|
51
|
+
|
|
52
|
+
### Contenido: qué se muestra
|
|
53
|
+
|
|
54
|
+
La cascada es fija: `src` → `memojiSrc` → `illustrationSrc` → `initials` → `icon` → silueta. Si
|
|
55
|
+
la foto falla al cargar, cae sola a las iniciales.
|
|
56
|
+
|
|
57
|
+
| contenido | cuándo | fuente |
|
|
58
|
+
|---|---|---|
|
|
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
|
+
| `initials` | Sin foto. Pasa el **nombre completo**: el componente saca las iniciales. | según la guía del DS |
|
|
61
|
+
| `icon` | Solo para «todavía no hay nadie»: pedido sin repartidor (`e-bike-2-line`), envío sin destinatario (`user-3-line`). Va con `color="gray"`. Extensión de SUI. | propuesta |
|
|
62
|
+
| silueta | Cae sola cuando no hay ni nombre. No se pide a propósito. | según la guía del DS |
|
|
63
|
+
|
|
64
|
+
### `size`
|
|
65
|
+
|
|
66
|
+
| size | px | cuándo | ejemplo real de la app | fuente |
|
|
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:249` | propuesta |
|
|
69
|
+
| `sm` | 24 | Chips y filas compactas. | `pages/driver/driver-dashboard/driver-dashboard.html:1046` (quién tomó el pedido) | propuesta |
|
|
70
|
+
| `md` (default SUI) | 32 | Filas de listas y tablas. | `pages/super-admin/master-orders/master-orders.html:197` | propuesta |
|
|
71
|
+
| `lg` | 40 | La tarjeta de una persona o de un local. | `pages/customer/order-tracking/order-tracking.html:348` (tu repartidor) | propuesta |
|
|
72
|
+
| `xl` | 48 | Cabecera de un panel. | `pages/driver/driver-dashboard/driver-dashboard.html:19` (tu foto) | propuesta |
|
|
73
|
+
| `2xl` | 56 | Cabecera de una ficha. | `pages/super-admin/master-users/master-user-sheet.html:21` | propuesta |
|
|
74
|
+
| `3xl` | 64 | Tu propia foto al registrarte. | `pages/driver-onboarding/step-info/step-info.html:31` | propuesta |
|
|
75
|
+
| `4xl` / `5xl` | 72 / 80 | No usar hoy (ver «No usar»). | — | propuesta |
|
|
76
|
+
|
|
77
|
+
Hasta `md` (32 px) se ve **una** inicial; desde `lg` (40 px), dos. Es del Figma: en chico dos
|
|
78
|
+
letras no entran.
|
|
79
|
+
|
|
80
|
+
### `color` — solo se ve cuando no hay foto
|
|
81
|
+
|
|
82
|
+
La guía no le da significado al color. En Master Pedidos dice **qué rol** tiene la persona, para
|
|
83
|
+
que en una pantalla con cliente, local y repartidor juntos (el detalle de un pedido) se distingan
|
|
84
|
+
sin leer el nombre.
|
|
85
|
+
|
|
86
|
+
| color | cuándo | fuente |
|
|
87
|
+
|---|---|---|
|
|
88
|
+
| `orange` | Locales (y la gente del local: su equipo y sus empleados). Extensión de SUI. | canon (aprobado por el dueño, 03-10-2026) |
|
|
89
|
+
| `green` | Repartidores, también el propio repartidor en su app. Extensión de SUI. | canon (aprobado por el dueño, 03-10-2026) |
|
|
90
|
+
| `blue` | Clientes y destinatarios, también quien firma una reseña de cliente. | canon (aprobado por el dueño, 03-10-2026) |
|
|
91
|
+
| `gray` (default de la guía) | «Todavía nadie», con `icon` (pedido sin repartidor, envío sin destinatario). | canon (aprobado por el dueño, 03-10-2026) |
|
|
92
|
+
| `slate` (default SUI) | No hace falta en la app: todo avatar tiene un rol o es «todavía nadie». | consecuencia del canon de arriba |
|
|
93
|
+
| `purple`, `sky`, `yellow`, `pink`, `teal`, `red` | No se usan para personas: un quinto color no diría ningún rol. | consecuencia del canon de arriba |
|
|
94
|
+
|
|
95
|
+
Reglas que van con la tabla:
|
|
96
|
+
|
|
97
|
+
- **Un mismo rol en una lista no cambia de color por persona.** Las reseñas de `ratings-detail`
|
|
98
|
+
ya no llevan un color por id: van azules (cliente) o verdes (repartidor) según quién opina.
|
|
99
|
+
- **El color sale del rol de quien se muestra, no de la pantalla.** El logo del local en la app
|
|
100
|
+
del repartidor sigue siendo `orange`; el repartidor en el seguimiento del cliente, `green`.
|
|
101
|
+
- **Un componente que muestra a «alguien» que cambia según quién lo usa** recibe el color del que
|
|
102
|
+
lo llama, no lo fija adentro (`ratings-detail` con `entityColor` / `autoresColor`,
|
|
103
|
+
`rate-entity-card` con `color`).
|
|
104
|
+
- **`bgColor` con un hex no se usa para personas**: era un color por nombre que no decía nada.
|
|
105
|
+
- **Las configs (`SuiAvatarConfig`) llevan el `color` explícito**: `sui-content-card` cae a
|
|
106
|
+
`orange` y `sui-content-label` a `slate`, así que confiar en el default pinta mal a la mitad.
|
|
107
|
+
|
|
108
|
+
Aplicado en toda la app (fuera de `master-preview`, prototipos, mockups y `/dx`) el 03-10-2026.
|
|
109
|
+
Pendiente: el perfil de los sidebars (`SuiSidebarProfile`) no acepta `color`, así que la persona
|
|
110
|
+
logueada sigue en el default.
|
|
111
|
+
|
|
112
|
+
### `status` — el punto de abajo
|
|
113
|
+
|
|
114
|
+
| status | cuándo | fuente |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| `online` | Conectado **ahora** (repartidor en línea). No significa «cuenta activa». | propuesta (el valor es de la guía) |
|
|
117
|
+
| `away` | En pausa: conectado pero sin recibir pedidos. | propuesta (el valor es de la guía) |
|
|
118
|
+
| `busy` | Ocupado: ya lleva un pedido. | propuesta (el valor es de la guía) |
|
|
119
|
+
| `offline` | Desconectado. Si en esa lista todos estarían `offline` casi siempre, mejor sin punto. | propuesta (el valor es de la guía) |
|
|
120
|
+
| `company` | Repartidor propio de un local: el logo del local abajo (con `companyLogoSrc`). | propuesta (la guía lo muestra como «con logo de marca») |
|
|
121
|
+
|
|
122
|
+
**Usos de hoy que rompen la regla: 2.** Los dos usan el punto para el **estado de la cuenta**,
|
|
123
|
+
no para la presencia: `pages/settings/team/team.html:99` (activo/pendiente/inactivo →
|
|
124
|
+
online/away/offline, mapeo en `pages/settings/team/team.ts:99`) y `pages/employees/employees.html:70`
|
|
125
|
+
(«Activo» por pedidos recientes → `online`). Eso va en un `sui-badge` al lado del nombre.
|
|
126
|
+
|
|
127
|
+
### `topBadge` — la insignia de arriba
|
|
128
|
+
|
|
129
|
+
| topBadge | cuándo | fuente |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `verified` | Identidad revisada (repartidor aprobado). | propuesta (la guía muestra un sello de verificado arriba) |
|
|
132
|
+
| `notification` | Tiene algo sin leer. | propuesta (el punto rojo arriba es de la guía) |
|
|
133
|
+
| `favorite`, `pin`, `add`, `remove` | No usar hoy (ver «No usar»). | propuesta |
|
|
134
|
+
|
|
135
|
+
Hoy no hay ningún `topBadge` en la app.
|
|
136
|
+
|
|
137
|
+
### El resto de las propiedades
|
|
138
|
+
|
|
139
|
+
| input | cuándo | fuente |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| `alt` | **Siempre** el nombre de quien es. Sin `alt`, el lector de pantalla no dice nada. | propuesta |
|
|
142
|
+
| `companyLogoSrc` | Solo con `status="company"`. | propuesta |
|
|
143
|
+
| `memojiSrc`, `illustrationSrc` | No usar hoy. | propuesta |
|
|
144
|
+
| `bgColor` | No usar (ver abajo). | propuesta |
|
|
145
|
+
|
|
146
|
+
**Usos de hoy sin `alt`: 9** (más uno decorativo que está bien sin él,
|
|
147
|
+
`pages/super-admin/master-orders/master-orders.html:586`). Ejemplos:
|
|
148
|
+
`pages/super-admin/master-drivers/master-drivers.html:250`, `:770`, `pages/employees/employees.html:70`.
|
|
149
|
+
|
|
150
|
+
**`bgColor` en la app: 0** (eran 7 hasta el 03-10-2026). Los cinco con paleta saturada escrita a
|
|
151
|
+
mano (clientes, empleados, reporte de repartidores y equipo) rompían la rampa `*-200` del DS y
|
|
152
|
+
dejaban las iniciales sin contraste; los dos con `var(--sui-bg-weak-50)` eran un `slate`
|
|
153
|
+
disfrazado. Todos pasaron a `color` por rol.
|
|
154
|
+
|
|
155
|
+
### La foto de otra persona (regla del proyecto)
|
|
156
|
+
|
|
157
|
+
- **1 violación**: `core/services/orders.service.ts:403` hace `user?.avatarUrl ?? user?.photoURL`
|
|
158
|
+
sin filtrar y lo **congela** en el pedido (`driverPhotoUrl`), que es lo que ve el cliente en
|
|
159
|
+
`pages/customer/order-tracking/order-tracking.html:348`. Si el repartidor todavía tiene la de
|
|
160
|
+
Google, el cliente ve la foto rota para siempre.
|
|
161
|
+
- **A revisar** (pintan un `avatarUrl` de otra persona sin el filtro de `fotoMostrable` a la
|
|
162
|
+
vista): `pages/super-admin/master-drivers/master-drivers.html:706` (`r.foto`), `:770`
|
|
163
|
+
(`s.avatarUrl`) y `pages/drivers/add-driver/add-driver.html:73`.
|
|
164
|
+
- **Latente**: `pages/customers/customers.ts:280` arma `avatarUrl || photoURL`, pero la tabla
|
|
165
|
+
hoy no lo pinta.
|
|
166
|
+
|
|
167
|
+
## Tamaño en mobile y en web
|
|
168
|
+
|
|
169
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
170
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
171
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
172
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
173
|
+
|
|
174
|
+
| uso | mobile | web |
|
|
175
|
+
|---|---|---|
|
|
176
|
+
| pegado a un texto | `sm` (24) | `xs` (20) |
|
|
177
|
+
| fila de lista o tabla | `lg` (40) | `md` (32) |
|
|
178
|
+
| tarjeta de una persona o un local | `xl` (48) | `lg` (40) |
|
|
179
|
+
| cabecera de una ficha | `3xl` (64) | `2xl` (56) |
|
|
180
|
+
|
|
181
|
+
```html
|
|
182
|
+
<sui-avatar [size]="bp.isMobile() ? 'lg' : 'md'" color="blue" [initials]="c.nombre" [alt]="c.nombre" />
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
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
|
|
186
|
+
la fila, no el avatar. Hoy **ningún** avatar cambia de tamaño por breakpoint; las pantallas del
|
|
187
|
+
cliente y del repartidor usan `lg` en las tarjetas, un paso por debajo de esta tabla.
|
|
188
|
+
|
|
189
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
190
|
+
|
|
191
|
+
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo
|
|
192
|
+
cae en la columna de la derecha, se usa.
|
|
193
|
+
|
|
194
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| `size` `4xl`, `5xl` | ninguna pantalla muestra una foto tan grande | un perfil público del repartidor o del local con la foto como protagonista |
|
|
197
|
+
| `color` `red` | un círculo rojo se lee como error | ninguno previsto; se deja porque la guía lo tiene |
|
|
198
|
+
| `topBadge` `favorite`, `pin`, `add`, `remove` | no hay favoritos, fijados ni selección de personas con avatar | elegir varios repartidores para una zona (`add`/`remove`) o fijar un chat (`pin`) |
|
|
199
|
+
| `memojiSrc`, `illustrationSrc` | no hay memojis ni ilustraciones de personas | avatares ilustrados por defecto para quien no sube foto |
|
|
200
|
+
| `bgColor` | pinta colores fuera de la paleta y deja el texto sin contraste | una entidad con su color de marca guardado que tiene que verse igual en todas partes |
|
|
201
|
+
|
|
202
|
+
## API
|
|
203
|
+
|
|
204
|
+
<!-- api:inicio -->
|
|
205
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
206
|
+
|
|
207
|
+
| input | tipo | default |
|
|
208
|
+
|---|---|---|
|
|
209
|
+
| `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl' \| '3xl' \| '4xl' \| '5xl'` | `'md'` |
|
|
210
|
+
| `src` | `string \| null` | `null` |
|
|
211
|
+
| `alt` | `string` | `''` |
|
|
212
|
+
| `initials` | `string` | `''` |
|
|
213
|
+
| `color` | `'slate' \| 'gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'sky' \| 'pink' \| 'teal'` | `'slate'` |
|
|
214
|
+
| `status` | `'online' \| 'offline' \| 'away' \| 'busy' \| 'company' \| null` | `null` |
|
|
215
|
+
| `memojiSrc` | `string \| null` | `null` |
|
|
216
|
+
| `illustrationSrc` | `string \| null` | `null` |
|
|
217
|
+
| `icon` | `string \| null` | `null` |
|
|
218
|
+
| `companyLogoSrc` | `string \| null` | `null` |
|
|
219
|
+
| `topBadge` | `'verified' \| 'pin' \| 'favorite' \| 'add' \| 'remove' \| 'notification' \| null` | `null` |
|
|
220
|
+
| `bgColor` | `string \| null` | `null` |
|
|
221
|
+
|
|
222
|
+
Outputs: ninguno.
|
|
223
|
+
<!-- api:fin -->
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
// Lo reciben los componentes con avatar adentro (command-menu-item, content-label,
|
|
227
|
+
// dropdown-item, tag…). Un string suelto = src.
|
|
228
|
+
interface SuiAvatarConfig {
|
|
229
|
+
src?: string | null;
|
|
230
|
+
initials?: string;
|
|
231
|
+
color?: SuiAvatarColor;
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Trampas
|
|
236
|
+
|
|
237
|
+
- **`initials` recibe el nombre, no las iniciales.** «Rosa Quispe» → `RQ`; una sola palabra
|
|
238
|
+
(«Rosa») → `RO`. Si le pasas `"R"` ya cortado, en `lg` sale `R` sola.
|
|
239
|
+
- **Una letra hasta `md`, dos desde `lg`.** No es un bug: es el Figma.
|
|
240
|
+
- **El color no se ve si hay foto.** Solo pinta el fondo de las iniciales, del ícono y de la silueta.
|
|
241
|
+
- **`slate` (default de SUI) y `gray` (default de la guía) no son lo mismo**: `slate` es casi
|
|
242
|
+
blanco con texto gris; `gray` es gris claro con texto negro.
|
|
243
|
+
- **El avatar no cambia con el tema oscuro**: fondos y texto de las iniciales son fijos a propósito.
|
|
244
|
+
- **`bgColor` gana sobre `color`** pero no cambia el color del texto: con un fondo oscuro, las
|
|
245
|
+
iniciales quedan ilegibles.
|
|
246
|
+
- **`status` y `topBadge` miden el 40 % del avatar**: en `xs` casi no se ven.
|
|
247
|
+
- **`companyLogoSrc` solo se ve con `status="company"`.**
|
|
248
|
+
- **Si la foto falla, cae sola a las iniciales**, y si cambia el `src` lo vuelve a intentar.
|
|
249
|
+
- **No tiene `title`, ni output, ni es clickeable.** Para tocarlo, envuélvelo en un botón o en
|
|
250
|
+
la card que ya lo es.
|
|
251
|
+
|
|
252
|
+
## Ejemplo
|
|
253
|
+
|
|
254
|
+
```html
|
|
255
|
+
<!-- Tu repartidor, en la tarjeta del seguimiento -->
|
|
256
|
+
<sui-avatar size="lg" color="green" [src]="driverPhotoUrl()" [initials]="driverName" [alt]="driverName" />
|
|
257
|
+
|
|
258
|
+
<!-- El local, en una fila -->
|
|
259
|
+
<sui-avatar size="md" color="orange" [src]="tenantLogo" [initials]="tenantName" [alt]="tenantName" />
|
|
260
|
+
|
|
261
|
+
<!-- Todavía sin repartidor -->
|
|
262
|
+
<sui-avatar size="md" color="gray" icon="e-bike-2-line" alt="Sin repartidor" />
|
|
263
|
+
```
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-avatar-group
|
|
3
|
+
selector: sui-avatar-group
|
|
4
|
+
resumen: Varias personas apiladas en una fila, con «+N» cuando no entran todas
|
|
5
|
+
alternativas: [sui-compact-avatar-group (la versión en píldora, para celdas de tabla), sui-avatar (una sola persona)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-avatar-group
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Avatar/Avatar Group](https://sui-design-system.web.app/?path=/docs/atoms-avatar-avatar-group--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** cuando importa **cuántos y quiénes** a la vez: el equipo de un local, los repartidores
|
|
15
|
+
conectados en una zona. Cada persona se ve chica; el grupo es lo que cuenta.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Una sola persona: `sui-avatar`.
|
|
20
|
+
- Una celda de tabla o una fila muy baja: `sui-compact-avatar-group`, que ocupa menos alto.
|
|
21
|
+
- Una lista donde hay que leer el nombre de cada uno: ahí van filas con `sui-avatar` y el nombre.
|
|
22
|
+
|
|
23
|
+
## Qué variante usar
|
|
24
|
+
|
|
25
|
+
> **La guía del DS dice qué es y sus tamaños, no cuándo usarlo.** Lo marcado «según la guía
|
|
26
|
+
> del DS» sale de su texto o de su código; el resto es **propuesta, falta aprobación**.
|
|
27
|
+
>
|
|
28
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. El DS lo usa dentro
|
|
29
|
+
> de `sui-table`.
|
|
30
|
+
|
|
31
|
+
### Lo que sí dice la guía del DS
|
|
32
|
+
|
|
33
|
+
- **Para qué es**: dos o más avatares en una pila en línea.
|
|
34
|
+
- **Tamaños**: los mismos nueve del avatar (80 a 20 px); el default de la guía es 80.
|
|
35
|
+
- **El «+N»**: un círculo gris (`bg-weak-50`, texto `text-sub-600`) del mismo tamaño que los
|
|
36
|
+
avatares. Su ejemplo muestra **tres** avatares y el «+9».
|
|
37
|
+
|
|
38
|
+
### `size` y `max`
|
|
39
|
+
|
|
40
|
+
| input | valor | cuándo | fuente |
|
|
41
|
+
|---|---|---|---|
|
|
42
|
+
| `size` | `sm` (24) | Dentro de una fila: «los que tomaron pedidos hoy». | propuesta |
|
|
43
|
+
| `size` | `md` (32, default SUI) | La card del equipo de un local. | propuesta |
|
|
44
|
+
| `size` | `lg` (40) | La cabecera de un panel (repartidores en la zona). | propuesta |
|
|
45
|
+
| `size` | `xs`, `xl` a `5xl` | No usar hoy: en `xs` el «+N» no se lee; desde `xl` ya no es un resumen. | propuesta |
|
|
46
|
+
| `max` | `3` | Tres visibles y el «+N», como el ejemplo de la guía. El default de SUI es `4`. | propuesta |
|
|
47
|
+
| `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). | canon (`CLAUDE.md`, «Fotos de otra persona») |
|
|
48
|
+
|
|
49
|
+
Usos de hoy que rompen la regla: **0** (no hay usos).
|
|
50
|
+
|
|
51
|
+
## Tamaño en mobile y en web
|
|
52
|
+
|
|
53
|
+
En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
|
|
54
|
+
pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
|
|
55
|
+
breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
|
|
56
|
+
el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
|
|
57
|
+
|
|
58
|
+
| uso | mobile | web |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| dentro de una fila | `md` (32) | `sm` (24) |
|
|
61
|
+
| dentro de una card | `lg` (40) | `md` (32) |
|
|
62
|
+
|
|
63
|
+
```html
|
|
64
|
+
<sui-avatar-group [size]="bp.isMobile() ? 'md' : 'sm'" [max]="3" [items]="equipo" />
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
68
|
+
|
|
69
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| todo el componente (0 usos) | ninguna pantalla muestra varias personas juntas | el equipo de un local en su card, o los repartidores conectados en una zona del super admin |
|
|
72
|
+
| `size` `xs` y de `xl` para arriba | en 20 px el «+N» no se lee; desde 48 px el grupo deja de ser un resumen | ninguno previsto |
|
|
73
|
+
|
|
74
|
+
## API
|
|
75
|
+
|
|
76
|
+
<!-- api:inicio -->
|
|
77
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
78
|
+
|
|
79
|
+
| input | tipo | default |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl' \| '3xl' \| '4xl' \| '5xl'` | `'md'` |
|
|
82
|
+
| `items` | `readonly SuiAvatarGroupItem[]` | `[]` |
|
|
83
|
+
| `max` | `number` | `4` |
|
|
84
|
+
|
|
85
|
+
Outputs: ninguno.
|
|
86
|
+
<!-- api:fin -->
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
interface SuiAvatarGroupItem {
|
|
90
|
+
src?: string;
|
|
91
|
+
initials?: string;
|
|
92
|
+
color?: SuiAvatarColor;
|
|
93
|
+
alt?: string;
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Trampas
|
|
98
|
+
|
|
99
|
+
- **No recibe avatares proyectados**: los arma él desde `items`. Para un indicador
|
|
100
|
+
(`status`, `topBadge`) en una persona del grupo, no hay forma.
|
|
101
|
+
- **`max` cuenta avatares, no el total**: con 6 items y `max` 3 sale «+3».
|
|
102
|
+
- **El «+N» no es un botón**: no tiene output. Si tiene que abrir la lista completa, envuélvelo.
|
|
103
|
+
- El solape cambia con el tamaño (−4 px en `xs`/`sm`, −16 px desde `2xl`): en `lg` las iniciales
|
|
104
|
+
de dos letras quedan tapadas a medias.
|
|
105
|
+
|
|
106
|
+
## Ejemplo
|
|
107
|
+
|
|
108
|
+
```html
|
|
109
|
+
<sui-avatar-group size="md" [max]="3" [items]="[
|
|
110
|
+
{ initials: 'Carlos Mamani', color: 'green', alt: 'Carlos Mamani' },
|
|
111
|
+
{ src: repartidor2.avatarUrl, alt: repartidor2.nombre },
|
|
112
|
+
{ initials: 'Luis Huamán', color: 'green', alt: 'Luis Huamán' },
|
|
113
|
+
{ initials: 'Ana Torres', color: 'green', alt: 'Ana Torres' }
|
|
114
|
+
]" />
|
|
115
|
+
```
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-badge
|
|
3
|
+
selector: sui-badge
|
|
4
|
+
resumen: Etiqueta corta o número que clasifica algo sin competir con el contenido
|
|
5
|
+
alternativas: [sui-status-badge (estado de ciclo: completado, pendiente, fallido, deshabilitado), sui-tag (chip que se puede quitar), sui-alert (mensaje que tiene que envolver)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-badge
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Badge/Badge](https://sui-design-system.web.app/?path=/docs/atoms-badge-badge--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para marcar algo con una o dos palabras o un número: una categoría, un conteo
|
|
15
|
+
(«3 pendientes»), «Nuevo», «Agotado», un metadato al lado de un nombre.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- **Un estado de ciclo** (completado, pendiente, fallido, deshabilitado) que sale de un campo
|
|
20
|
+
`status`: eso es `sui-status-badge`, que trae el color y el ícono resueltos por el estado. La
|
|
21
|
+
guía del DS admite el badge para estados en general; lo que se acota al status-badge son esos
|
|
22
|
+
cuatro (ver «`sui-badge` o `sui-status-badge`» abajo).
|
|
23
|
+
- Un chip que la persona puede quitar (filtro aplicado): `sui-tag`.
|
|
24
|
+
- Un botón: no tiene output ni foco, y lleva `role="status"`.
|
|
25
|
+
- Un texto que tiene que envolver en varias líneas: eso es un `sui-alert`.
|
|
26
|
+
|
|
27
|
+
Regla corta: **etiqueta, número o estado con muchos valores → badge · completado/pendiente/fallido/deshabilitado → status-badge · se puede quitar → tag.**
|
|
28
|
+
|
|
29
|
+
## Qué variante usar
|
|
30
|
+
|
|
31
|
+
> **La guía del DS no dice cuándo usar cada relleno.** Su página del badge muestra los cuatro
|
|
32
|
+
> rellenos, los colores, los tamaños y la API, sin do/don't ni jerarquía. Lo marcado
|
|
33
|
+
> «según la guía del DS» sale de su texto, de sus ejemplos o de su código publicado; el resto
|
|
34
|
+
> sigue siendo **canon (aprobado por el dueño, 03-10-2026)**.
|
|
35
|
+
>
|
|
36
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: 210 badges, sin contar prototipos ni
|
|
37
|
+
> vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `master-rutina`,
|
|
38
|
+
> `master-medico`, `dev-index`). Rellenos: 184 `lighter`, 16 `light`, 7 `filled`, 2 `stroke`,
|
|
39
|
+
> 1 `dark`. Colores: 77 dinámicos, 42 `orange`, 28 `gray`, 27 `red`, 23 `green`, 7 `purple`,
|
|
40
|
+
> 3 `blue`, 3 `yellow`.
|
|
41
|
+
|
|
42
|
+
### Lo que sí dice la guía del DS
|
|
43
|
+
|
|
44
|
+
- **Para qué es**: un texto corto con estilo propio para que se lea como **metadato del
|
|
45
|
+
contexto**: un estado, una categoría u otro dato al margen. Ojo: la guía **sí admite el badge
|
|
46
|
+
para estados**.
|
|
47
|
+
- **El status-badge** es para resaltar el estado de algo en poco espacio, y trae cuatro estados
|
|
48
|
+
fijos: completado, pendiente, fallido y deshabilitado (SUI le suma `information`).
|
|
49
|
+
- **El tag** es para categorizar y etiquetar contenido (y se puede quitar).
|
|
50
|
+
- **Números**: la forma cuadrada (en SUI, `type="number"`) es la indicada para mostrar números.
|
|
51
|
+
- **`small` va en MAYÚSCULAS**: está en su código, no es un detalle de SUI.
|
|
52
|
+
- **Cada color es un estado de la paleta.** El badge no pinta con el tono crudo: cada `color`
|
|
53
|
+
apunta a un token de estado, y SUI hace lo mismo (`$sui-badge-colors` en `sui-badge.scss`,
|
|
54
|
+
tokens `--sui-state-*`). Es la única pista de significado que da la guía, y viene del nombre
|
|
55
|
+
de los tokens, no de un texto que lo explique.
|
|
56
|
+
- **Default**: la guía arranca en `filled`; SUI, en `lighter`. Es un default, no una
|
|
57
|
+
recomendación de uso.
|
|
58
|
+
|
|
59
|
+
### `color` — qué significa cada uno
|
|
60
|
+
|
|
61
|
+
| color | estado de la paleta | cuándo | fuente |
|
|
62
|
+
|---|---|---|---|
|
|
63
|
+
| `gray` (default) | faded | Neutro, apagado, inactivo, sin carga. | según la guía del DS (nombre del estado) |
|
|
64
|
+
| `blue` | information | Dato informativo. | según la guía del DS (nombre del estado) |
|
|
65
|
+
| `orange` | warning | Pendiente o pide atención. | según la guía del DS (nombre del estado) |
|
|
66
|
+
| `red` | error | Problema, rechazado, terminado mal. | según la guía del DS (nombre del estado) |
|
|
67
|
+
| `green` | success | Bien, activo, aprobado, pagado. | según la guía del DS (nombre del estado) |
|
|
68
|
+
| `yellow` | away | Ausente o en pausa temporal. **No** es «advertencia»: eso es `orange`. | según la guía del DS (nombre del estado) |
|
|
69
|
+
| `purple` | feature | Novedad o función en prueba. | según la guía del DS (nombre del estado) |
|
|
70
|
+
| `sky` | verified | Verificado. | según la guía del DS (nombre del estado) |
|
|
71
|
+
| `pink` | highlighted | Destacado. | según la guía del DS (nombre del estado) |
|
|
72
|
+
| `teal` | stable | Estable. | según la guía del DS (nombre del estado) |
|
|
73
|
+
| (categorías) | — | Una categoría sin carga de bien/mal va en `gray`. Si tiene que distinguirse de otras en la misma fila, el color cuyo estado le calce (`purple` para lo nuevo, `pink` para lo destacado). | canon (aprobado por el dueño, 03-10-2026) |
|
|
74
|
+
|
|
75
|
+
**Usos de hoy que rompen la guía** (estado con el color de otro estado; se evaluaron los colores
|
|
76
|
+
fijos y los ternarios legibles en el template; el resto de los 77 dinámicos, que salen de
|
|
77
|
+
funciones o campos, no):
|
|
78
|
+
|
|
79
|
+
- **5 casos.** «Pendiente» en `red`: `pages/super-admin/super-admin.html:617`. «Pendiente» en
|
|
80
|
+
`yellow` (ausente): `pages/super-admin/master-gastos/master-gastos.html:67` y `:115`. «No cuadra»
|
|
81
|
+
en `yellow`: `pages/super-admin/master-gastos/master-gastos.html:60` y `:129`. Los cinco pasan a
|
|
82
|
+
`orange`.
|
|
83
|
+
- Sin evaluar: `pages/super-admin/master-drivers/master-drivers.html:201` (`yellow` con un texto
|
|
84
|
+
que viene de datos).
|
|
85
|
+
|
|
86
|
+
**Usos de hoy que romperían la propuesta de categorías** (categoría pintada con color de estado):
|
|
87
|
+
|
|
88
|
+
- **15 casos.** «Por delivery» en `green` y «Sueldo fijo» en `blue`: `pages/drivers/drivers.html:135`,
|
|
89
|
+
`:137`, `:256`, `:258`. «Primer pedido» en `orange`: `pages/driver/driver-order-detail/driver-order-detail.html:463`,
|
|
90
|
+
`pages/super-admin/master-orders/master-orders.html:205` y `:505`. El plan en `purple`:
|
|
91
|
+
`pages/super-admin/super-admin.html:116`, `:252`, `pages/super-admin/master-earnings/master-earnings.html:95`.
|
|
92
|
+
«Envío» y «Mandadito» en `purple`: `pages/super-admin/master-orders/master-orders.html:83` y `:87`.
|
|
93
|
+
«Compartida» en `purple`: `components/add-product-modal/add-product-modal.html:234`.
|
|
94
|
+
- **Mismo dato, dos colores:** «Administrado» es `orange` en `pages/super-admin/super-admin.html:104`
|
|
95
|
+
y `purple` en `pages/super-admin/master-orders/master-orders.html:534`.
|
|
96
|
+
- **A discutir: 12 rótulos de sección en `orange`** en las landings y precios
|
|
97
|
+
(`pages/public/landing-business/landing-business.html:86`, `pages/public/landing-customers/landing-customers.html:94`,
|
|
98
|
+
`pages/public/pricing/pricing.html:10`…). Son el naranja de marca de SUI, no una advertencia,
|
|
99
|
+
pero por la paleta se leen como «warning».
|
|
100
|
+
|
|
101
|
+
### `variant` — el relleno
|
|
102
|
+
|
|
103
|
+
Aquí `variant` es el **relleno** (en `sui-alert` esa misma palabra es el tipo de mensaje). Cómo
|
|
104
|
+
pinta cada uno (`.scss`): `lighter` = fondo pálido con texto del color **base**; `light` = fondo
|
|
105
|
+
un paso más fuerte con texto **oscuro**; `filled` = fondo saturado con texto blanco.
|
|
106
|
+
|
|
107
|
+
| variant | cuándo | ejemplo real de la app | fuente |
|
|
108
|
+
|---|---|---|---|
|
|
109
|
+
| `lighter` (default SUI) | Todo badge en listas, cards, tablas y cabeceras sobre fondo claro. Se lee sin robar la vista. | `pages/drivers/drivers.html:279` («Fuera») · `components/settings-panel/settings-panel.html:164` («Conectado») | canon (aprobado por el dueño, 03-10-2026) |
|
|
110
|
+
| `filled` (default de la guía) | Solo dos casos: (1) **un conteo que pide acción** (pendientes, notificaciones), y (2) un badge **encima de una foto**, donde un fondo pálido se pierde. | `components/glass-tab-bar/glass-tab-bar.html:13` (conteo del tab) · `components/product-detail-view/product-detail-view.html:40` («Agotado» sobre la foto) | canon (aprobado por el dueño, 03-10-2026) |
|
|
111
|
+
| `light` | Solo sobre una **superficie ya teñida** (dentro de un alert `lighter`, una card de color), donde el `lighter` se confunde con el fondo. | (sin uso correcto hoy) | canon (aprobado por el dueño, 03-10-2026) |
|
|
112
|
+
| `stroke` | Metadato **neutro** (`gray`) que convive con badges de color en la misma fila y no debe leerse como estado: «Obligatorio», «12 secciones». | `components/product-detail-view/product-detail-view.html:93` («Obligatorio») · `pages/settings/team/team.html:136` | canon (aprobado por el dueño, 03-10-2026) |
|
|
113
|
+
| `dark` | Solo sobre una **superficie oscura** (card negra, foto oscura). Extensión de SUI: la guía no lo tiene. | `pages/mi-negocio/mi-negocio.html:92` (precio sobre la card negra del plan) | canon (aprobado por el dueño, 03-10-2026) |
|
|
114
|
+
|
|
115
|
+
**Usos de hoy que romperían la propuesta:**
|
|
116
|
+
|
|
117
|
+
- **16 `light` → `lighter`** (salvo que estén sobre superficie teñida; no se verificó
|
|
118
|
+
renderizado). Ejemplos: `pages/super-admin/master-drivers/master-drivers.html:781`, `:783`, `:785`,
|
|
119
|
+
`pages/super-admin/master-users/master-user-sheet.html:44`, `pages/reports/reports.html:215`.
|
|
120
|
+
- **1 `filled` como metadato → `lighter`:** `pages/customer/profile/profile.html:122` («Por defecto»).
|
|
121
|
+
A discutir: `pages/public/pricing/pricing.html:37` (el «Popular» del plan destacado).
|
|
122
|
+
- **1 `lighter` sobre superficie oscura → `dark`:** `pages/mi-negocio/mi-negocio.html:87` («Mes gratis»).
|
|
123
|
+
|
|
124
|
+
### `size` y `type`
|
|
125
|
+
|
|
126
|
+
| eje | valor | cuándo | fuente |
|
|
127
|
+
|---|---|---|---|
|
|
128
|
+
| `size` | `small` (default, 16 px) | Lo normal. **Va en MAYÚSCULAS.** | según la guía del DS (mayúsculas y default) |
|
|
129
|
+
| `size` | `small` | Una o dos palabras, justamente por las mayúsculas. | canon (aprobado por el dueño, 03-10-2026) |
|
|
130
|
+
| `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) |
|
|
131
|
+
| `type` | `number` | **Números**: queda cuadrado/circular. | según la guía del DS |
|
|
132
|
+
| `type` | `number` | Va con `filled` cuando el conteo pide acción. | canon (aprobado por el dueño, 03-10-2026) |
|
|
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) |
|
|
134
|
+
| `type` | `left-icon` / `right-icon` | Cuando hay ícono. Sin este `type` el padding queda mal aunque proyectes el ícono. | canon (aprobado por el dueño, 03-10-2026) |
|
|
135
|
+
|
|
136
|
+
Usos de hoy que rompen la regla de números: **0**. Los badges con solo un número ya llevan
|
|
137
|
+
`type="number"` (`components/glass-tab-bar/glass-tab-bar.html:13`, `:27`,
|
|
138
|
+
`pages/driver/driver-earnings/driver-earnings.html:216`); los demás con interpolación son
|
|
139
|
+
porcentajes o texto.
|
|
140
|
+
|
|
141
|
+
### `sui-badge` o `sui-status-badge`
|
|
142
|
+
|
|
143
|
+
| caso | componente | fuente |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| El estado cae en completado / pendiente / fallido / deshabilitado | `sui-status-badge` | canon (aprobado por el dueño, 03-10-2026) (la guía define esos estados para el status-badge, pero no le prohíbe estados al badge) |
|
|
146
|
+
| Estado con más valores que esos (los de un pedido: preparando, en camino…) o una categoría | `sui-badge` | canon (aprobado por el dueño, 03-10-2026) |
|
|
147
|
+
|
|
148
|
+
Candidatos de hoy: **17 badges con un estado de ciclo escrito a mano** («Pendiente», «Aprobado»,
|
|
149
|
+
«Rechazado», «En revisión», «Pagado», «Anulado»). Ejemplos: `pages/super-admin/master-drivers/master-drivers.html:781`,
|
|
150
|
+
`pages/driver/driver-profile/driver-profile.html:83`, `pages/central/central-gastos/central-gastos.html:57`.
|
|
151
|
+
Además hay **40 ligados a un campo `status`/`estado`** que hay que mirar uno por uno: los de
|
|
152
|
+
dos valores (`pages/invoices/invoices.html:50` pagado/reembolsado,
|
|
153
|
+
`pages/super-admin/master-gastos/master-gastos.html:67` confirmado/pendiente) son candidatos; los de
|
|
154
|
+
pedidos con muchos estados (`pages/orders/orders.html:113`) se quedan como badge.
|
|
155
|
+
|
|
156
|
+
## API
|
|
157
|
+
|
|
158
|
+
<!-- api:inicio -->
|
|
159
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
160
|
+
|
|
161
|
+
| input | tipo | default |
|
|
162
|
+
|---|---|---|
|
|
163
|
+
| `color` | `'gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'sky' \| 'pink' \| 'teal'` | `'gray'` |
|
|
164
|
+
| `variant` | `'filled' \| 'light' \| 'lighter' \| 'stroke' \| 'dark'` | `'lighter'` |
|
|
165
|
+
| `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'small'` |
|
|
166
|
+
| `type` | `'basic' \| 'with-dot' \| 'left-icon' \| 'right-icon' \| 'number'` | `'basic'` |
|
|
167
|
+
| `disabled` | `boolean` | `false` |
|
|
168
|
+
|
|
169
|
+
Outputs: ninguno.
|
|
170
|
+
<!-- api:fin -->
|
|
171
|
+
|
|
172
|
+
Slots: `<ng-content>` (el texto), `[data-slot=start]`, `[data-slot=end]`.
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
// Lo reciben los componentes con badge embebido (checkbox-label, switch-label,
|
|
176
|
+
// integration-switch, checkbox-card, radio-card, switch-card).
|
|
177
|
+
interface SuiBadgeConfig {
|
|
178
|
+
label: string;
|
|
179
|
+
color?: SuiBadgeColor;
|
|
180
|
+
variant?: SuiBadgeVariant;
|
|
181
|
+
size?: SuiBadgeSize;
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Trampas
|
|
186
|
+
|
|
187
|
+
- **`variant` aquí es el relleno**; en `sui-alert` y `sui-banner` `variant` es el tipo de
|
|
188
|
+
mensaje y el relleno se llama `variantStyle`. En `sui-status-badge` el relleno es `appearance`
|
|
189
|
+
y en `sui-tag` es `tagStyle`.
|
|
190
|
+
- **`size="small"` fuerza MAYÚSCULAS** (`text-transform: uppercase`). «Pendiente» sale «PENDIENTE».
|
|
191
|
+
`medium` no.
|
|
192
|
+
- **El default es `lighter`, no `filled`** (la guía del DS arranca en `filled`), y el color default es `gray`.
|
|
193
|
+
- En `lighter` el texto es del color **base**; en `light` es del tono **oscuro**. Por eso no son
|
|
194
|
+
intercambiables aunque se parezcan.
|
|
195
|
+
- Los slots usan **`data-slot=`**, no `slot=` (alert y banner sí usan `slot=`).
|
|
196
|
+
- Proyectar un ícono no basta: hace falta `type="left-icon"` o `"right-icon"`.
|
|
197
|
+
- El punto de `with-dot` mide 4 px; el de `sui-status-badge` mide 6 px. Son distintos a propósito.
|
|
198
|
+
- `disabled` no baja la opacidad: pinta todo en los grises de deshabilitado.
|
|
199
|
+
- El host lleva `role="status"`: el lector de pantalla anuncia los cambios.
|
|
200
|
+
|
|
201
|
+
## Ejemplo
|
|
202
|
+
|
|
203
|
+
```html
|
|
204
|
+
<!-- Metadato en una lista: lighter (default) -->
|
|
205
|
+
<sui-badge color="green">Conectado</sui-badge>
|
|
206
|
+
|
|
207
|
+
<!-- Estado vivo -->
|
|
208
|
+
<sui-badge color="green" type="with-dot">Abierto</sui-badge>
|
|
209
|
+
|
|
210
|
+
<!-- Conteo que pide acción -->
|
|
211
|
+
<sui-badge color="orange" variant="filled" type="number">3</sui-badge>
|
|
212
|
+
```
|