@ajuarezso/sui-design-system 0.19.0 → 0.21.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.
Files changed (97) hide show
  1. package/docs/INDEX.md +136 -0
  2. package/docs/sui-alert/README.md +229 -0
  3. package/docs/sui-app-store-badge/README.md +137 -0
  4. package/docs/sui-avatar/README.md +263 -0
  5. package/docs/sui-avatar-group/README.md +115 -0
  6. package/docs/sui-badge/README.md +229 -0
  7. package/docs/sui-banner/README.md +190 -0
  8. package/docs/sui-brand-logo/README.md +143 -0
  9. package/docs/sui-breadcrumb-item/README.md +96 -0
  10. package/docs/sui-breadcrumbs/README.md +122 -0
  11. package/docs/sui-button/README.md +209 -0
  12. package/docs/sui-button-group/README.md +178 -0
  13. package/docs/sui-button-group-item/README.md +102 -0
  14. package/docs/sui-card/README.md +168 -0
  15. package/docs/sui-chart-legend/README.md +140 -0
  16. package/docs/sui-chart-legend-dot/README.md +118 -0
  17. package/docs/sui-checkbox/README.md +147 -0
  18. package/docs/sui-checkbox-card/README.md +150 -0
  19. package/docs/sui-checkbox-label/README.md +143 -0
  20. package/docs/sui-circular-progress-bar/README.md +131 -0
  21. package/docs/sui-color-dot/README.md +112 -0
  22. package/docs/sui-color-picker/README.md +124 -0
  23. package/docs/sui-compact-avatar-group/README.md +103 -0
  24. package/docs/sui-compact-button/README.md +190 -0
  25. package/docs/sui-compact-select/README.md +127 -0
  26. package/docs/sui-compact-select-for-input/README.md +117 -0
  27. package/docs/sui-content-card/README.md +147 -0
  28. package/docs/sui-content-divider/README.md +124 -0
  29. package/docs/sui-content-label/README.md +148 -0
  30. package/docs/sui-counter-input/README.md +145 -0
  31. package/docs/sui-date-selector/README.md +98 -0
  32. package/docs/sui-datepicker/README.md +193 -0
  33. package/docs/sui-day-cell/README.md +118 -0
  34. package/docs/sui-day-label/README.md +81 -0
  35. package/docs/sui-divider/README.md +102 -0
  36. package/docs/sui-drawer-footer/README.md +127 -0
  37. package/docs/sui-drawer-header/README.md +140 -0
  38. package/docs/sui-emoji/README.md +138 -0
  39. package/docs/sui-empty-state/README.md +145 -0
  40. package/docs/sui-fancy-button/README.md +148 -0
  41. package/docs/sui-file-icon/README.md +103 -0
  42. package/docs/sui-file-upload/README.md +154 -0
  43. package/docs/sui-file-upload-card/README.md +129 -0
  44. package/docs/sui-flag/README.md +99 -0
  45. package/docs/sui-form-hint/README.md +124 -0
  46. package/docs/sui-form-label/README.md +148 -0
  47. package/docs/sui-icon/README.md +135 -0
  48. package/docs/sui-image-upload/README.md +200 -0
  49. package/docs/sui-image-upload-profile/README.md +145 -0
  50. package/docs/sui-inline-input/README.md +104 -0
  51. package/docs/sui-inline-select/README.md +101 -0
  52. package/docs/sui-input/README.md +244 -0
  53. package/docs/sui-integration-switch/README.md +142 -0
  54. package/docs/sui-kbd/README.md +97 -0
  55. package/docs/sui-key-icon/README.md +125 -0
  56. package/docs/sui-link-button/README.md +221 -0
  57. package/docs/sui-logo/README.md +152 -0
  58. package/docs/sui-notification/README.md +179 -0
  59. package/docs/sui-notification-footer/README.md +98 -0
  60. package/docs/sui-notification-tab-menu/README.md +112 -0
  61. package/docs/sui-otp-input/README.md +116 -0
  62. package/docs/sui-pagination/README.md +146 -0
  63. package/docs/sui-password-strength/README.md +99 -0
  64. package/docs/sui-payment-icon/README.md +98 -0
  65. package/docs/sui-period-range/README.md +93 -0
  66. package/docs/sui-popover/README.md +178 -0
  67. package/docs/sui-product-card/README.md +173 -0
  68. package/docs/sui-progress-bar/README.md +132 -0
  69. package/docs/sui-progress-bar-label/README.md +143 -0
  70. package/docs/sui-radio/README.md +134 -0
  71. package/docs/sui-radio-card/README.md +160 -0
  72. package/docs/sui-radio-label/README.md +137 -0
  73. package/docs/sui-rating/README.md +199 -0
  74. package/docs/sui-rich-editor/README.md +114 -0
  75. package/docs/sui-segmented-control/README.md +144 -0
  76. package/docs/sui-select/README.md +180 -0
  77. package/docs/sui-slider/README.md +143 -0
  78. package/docs/sui-social-button/README.md +158 -0
  79. package/docs/sui-status-badge/README.md +164 -0
  80. package/docs/sui-stepper/README.md +166 -0
  81. package/docs/sui-store-card/README.md +147 -0
  82. package/docs/sui-switch/README.md +146 -0
  83. package/docs/sui-switch-card/README.md +149 -0
  84. package/docs/sui-switch-label/README.md +139 -0
  85. package/docs/sui-tab-chips/README.md +185 -0
  86. package/docs/sui-tab-menu-horizontal/README.md +142 -0
  87. package/docs/sui-tab-menu-vertical/README.md +136 -0
  88. package/docs/sui-tag/README.md +145 -0
  89. package/docs/sui-tag-input/README.md +120 -0
  90. package/docs/sui-textarea/README.md +157 -0
  91. package/docs/sui-time-picker/README.md +237 -0
  92. package/docs/sui-toast/README.md +190 -0
  93. package/docs/sui-tooltip/README.md +201 -0
  94. package/fesm2022/ajuarezso-sui-design-system.mjs +466 -279
  95. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  96. package/package.json +1 -1
  97. package/types/ajuarezso-sui-design-system.d.ts +367 -72
@@ -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,229 @@
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
+ ## Tamaño en mobile y en web
157
+
158
+ En mobile el badge se lee de más lejos y al lado de textos de 16 px; en web va más chico.
159
+ `large` (24) y `xlarge` (28) son extensión SUI del 03-10-2026.
160
+
161
+ | uso | mobile | web | fuente |
162
+ |---|---|---|---|
163
+ | estado en una lista o card | `large` (24) | `small` (16, mayúsculas) | canon (aprobado por el dueño, 03-10-2026) |
164
+ | junto a un título o un monto | `xlarge` (28) | `medium` (20) | propuesta, falta aprobación |
165
+ | conteo (`type="number"`) | `large` (24) | `small` (16) | propuesta, falta aprobación |
166
+
167
+ Patrón (la app ya lo usa en 27 lugares; `bp` = `BreakpointsService`, mobile hasta 767 px):
168
+
169
+ ```html
170
+ <sui-badge [size]="bp.isMobile() ? 'large' : 'small'" …/>
171
+ ```
172
+
173
+ ## API
174
+
175
+ <!-- api:inicio -->
176
+ <!-- generada: no editar a mano — `npm run docs` -->
177
+
178
+ | input | tipo | default |
179
+ |---|---|---|
180
+ | `color` | `'gray' \| 'blue' \| 'orange' \| 'red' \| 'green' \| 'yellow' \| 'purple' \| 'sky' \| 'pink' \| 'teal'` | `'gray'` |
181
+ | `variant` | `'filled' \| 'light' \| 'lighter' \| 'stroke' \| 'dark'` | `'lighter'` |
182
+ | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'small'` |
183
+ | `type` | `'basic' \| 'with-dot' \| 'left-icon' \| 'right-icon' \| 'number'` | `'basic'` |
184
+ | `disabled` | `boolean` | `false` |
185
+
186
+ Outputs: ninguno.
187
+ <!-- api:fin -->
188
+
189
+ Slots: `<ng-content>` (el texto), `[data-slot=start]`, `[data-slot=end]`.
190
+
191
+ ```ts
192
+ // Lo reciben los componentes con badge embebido (checkbox-label, switch-label,
193
+ // integration-switch, checkbox-card, radio-card, switch-card).
194
+ interface SuiBadgeConfig {
195
+ label: string;
196
+ color?: SuiBadgeColor;
197
+ variant?: SuiBadgeVariant;
198
+ size?: SuiBadgeSize;
199
+ }
200
+ ```
201
+
202
+ ## Trampas
203
+
204
+ - **`variant` aquí es el relleno**; en `sui-alert` y `sui-banner` `variant` es el tipo de
205
+ mensaje y el relleno se llama `variantStyle`. En `sui-status-badge` el relleno es `appearance`
206
+ y en `sui-tag` es `tagStyle`.
207
+ - **`size="small"` fuerza MAYÚSCULAS** (`text-transform: uppercase`). «Pendiente» sale «PENDIENTE».
208
+ `medium` no.
209
+ - **El default es `lighter`, no `filled`** (la guía del DS arranca en `filled`), y el color default es `gray`.
210
+ - En `lighter` el texto es del color **base**; en `light` es del tono **oscuro**. Por eso no son
211
+ intercambiables aunque se parezcan.
212
+ - Los slots usan **`data-slot=`**, no `slot=` (alert y banner sí usan `slot=`).
213
+ - Proyectar un ícono no basta: hace falta `type="left-icon"` o `"right-icon"`.
214
+ - El punto de `with-dot` mide 4 px; el de `sui-status-badge` mide 6 px. Son distintos a propósito.
215
+ - `disabled` no baja la opacidad: pinta todo en los grises de deshabilitado.
216
+ - El host lleva `role="status"`: el lector de pantalla anuncia los cambios.
217
+
218
+ ## Ejemplo
219
+
220
+ ```html
221
+ <!-- Metadato en una lista: lighter (default) -->
222
+ <sui-badge color="green">Conectado</sui-badge>
223
+
224
+ <!-- Estado vivo -->
225
+ <sui-badge color="green" type="with-dot">Abierto</sui-badge>
226
+
227
+ <!-- Conteo que pide acción -->
228
+ <sui-badge color="orange" variant="filled" type="number">3</sui-badge>
229
+ ```