@ajuarezso/sui-design-system 0.20.0 → 0.22.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 +75 -80
- package/docs/sui-accordion/README.md +171 -0
- package/docs/sui-activity-feed/README.md +155 -0
- package/docs/sui-activity-filter/README.md +100 -0
- package/docs/sui-alert/README.md +13 -0
- package/docs/sui-badge/README.md +17 -0
- package/docs/sui-banner/README.md +190 -0
- package/docs/sui-breadcrumb-item/README.md +96 -0
- package/docs/sui-breadcrumbs/README.md +122 -0
- package/docs/sui-button/README.md +36 -0
- package/docs/sui-card/README.md +168 -0
- package/docs/sui-chart-legend/README.md +140 -0
- package/docs/sui-chart-legend-dot/README.md +118 -0
- package/docs/sui-checkbox-card/README.md +150 -0
- package/docs/sui-command-menu-footer/README.md +100 -0
- package/docs/sui-command-menu-item/README.md +140 -0
- package/docs/sui-command-menu-search/README.md +105 -0
- package/docs/sui-compact-select/README.md +130 -0
- package/docs/sui-compact-select-for-input/README.md +120 -0
- package/docs/sui-content-card/README.md +147 -0
- package/docs/sui-content-label/README.md +148 -0
- package/docs/sui-counter-input/README.md +148 -0
- package/docs/sui-date-selector/README.md +98 -0
- package/docs/sui-datepicker/README.md +197 -0
- package/docs/sui-day-cell/README.md +118 -0
- package/docs/sui-day-label/README.md +81 -0
- package/docs/sui-drawer-footer/README.md +127 -0
- package/docs/sui-drawer-header/README.md +140 -0
- package/docs/sui-dropdown-caption/README.md +92 -0
- package/docs/sui-dropdown-item/README.md +163 -0
- package/docs/sui-dropdown-menu/README.md +196 -0
- package/docs/sui-dropdown-search/README.md +113 -0
- package/docs/sui-empty-state/README.md +145 -0
- package/docs/sui-file-upload/README.md +154 -0
- package/docs/sui-file-upload-card/README.md +129 -0
- package/docs/sui-filter/README.md +181 -0
- package/docs/sui-href/README.md +85 -0
- package/docs/sui-image-upload/README.md +200 -0
- package/docs/sui-image-upload-profile/README.md +145 -0
- package/docs/sui-img-retry/README.md +107 -0
- package/docs/sui-inline-input/README.md +104 -0
- package/docs/sui-inline-select/README.md +101 -0
- package/docs/sui-input/README.md +247 -0
- package/docs/sui-integration-switch/README.md +142 -0
- package/docs/sui-modal/README.md +238 -0
- package/docs/sui-modal-footer/README.md +178 -0
- package/docs/sui-modal-header/README.md +115 -0
- package/docs/sui-modal-sheet/README.md +170 -0
- package/docs/sui-notification/README.md +179 -0
- package/docs/sui-notification-footer/README.md +98 -0
- package/docs/sui-notification-tab-menu/README.md +112 -0
- package/docs/sui-otp-input/README.md +116 -0
- package/docs/sui-page-header/README.md +123 -0
- package/docs/sui-pagination/README.md +146 -0
- package/docs/sui-password-strength/README.md +99 -0
- package/docs/sui-period-range/README.md +93 -0
- package/docs/sui-popover/README.md +178 -0
- package/docs/sui-product-card/README.md +173 -0
- package/docs/sui-radio-card/README.md +160 -0
- package/docs/sui-rating/README.md +7 -6
- package/docs/sui-rich-editor/README.md +114 -0
- package/docs/sui-segmented-control/README.md +3 -0
- package/docs/sui-select/README.md +183 -0
- package/docs/sui-sidebar/README.md +217 -0
- package/docs/sui-stepper/README.md +166 -0
- package/docs/sui-store-card/README.md +147 -0
- package/docs/sui-switch-card/README.md +149 -0
- package/docs/sui-switch-label/README.md +3 -0
- package/docs/sui-tab-chips/README.md +188 -0
- package/docs/sui-tab-menu-horizontal/README.md +142 -0
- package/docs/sui-tab-menu-vertical/README.md +136 -0
- package/docs/sui-table/README.md +264 -0
- package/docs/sui-tag-input/README.md +123 -0
- package/docs/sui-textarea/README.md +160 -0
- package/docs/sui-time-picker/README.md +240 -0
- package/docs/sui-toast/README.md +190 -0
- package/docs/sui-tooltip/README.md +201 -0
- package/docs/sui-topbar/README.md +153 -0
- package/docs/sui-topbar-button/README.md +95 -0
- package/docs/sui-topbar-item/README.md +97 -0
- package/docs/sui-topbar-user/README.md +83 -0
- package/fesm2022/ajuarezso-sui-design-system.mjs +291 -246
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +208 -50
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-tooltip
|
|
3
|
+
selector: "[suiTooltip], [suiTooltipLarge]"
|
|
4
|
+
resumen: Directiva que muestra una ayuda corta al pasar el mouse o al enfocar un elemento; solo web, no sirve con el dedo
|
|
5
|
+
alternativas: [sui-form-hint (ayuda visible bajo un campo), sui-modal-sheet (explicación que se abre al tocar, en mobile), sui-popover (panel que señala algo y pide una acción)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-tooltip
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Tooltip](https://sui-design-system.web.app/?path=/docs/molecules-tooltip--docs)
|
|
11
|
+
|
|
12
|
+
Es una **directiva**, no una etiqueta: se pone sobre el elemento que explica
|
|
13
|
+
(`<button suiTooltip="Editar">`). El globo lo dibuja `sui-tooltip-panel` en el overlay del CDK.
|
|
14
|
+
|
|
15
|
+
## Cuándo usarlo / cuándo no
|
|
16
|
+
|
|
17
|
+
**Úsalo** en **web** para dar contexto a algo que se puede tocar o enfocar: el nombre de un botón
|
|
18
|
+
de solo ícono («Editar», «Exportar»), o qué significa un término al lado de un dato («Tarifa de
|
|
19
|
+
servicio»). Es un extra: la pantalla tiene que entenderse sin él.
|
|
20
|
+
|
|
21
|
+
**No lo uses** para:
|
|
22
|
+
|
|
23
|
+
- **Mobile.** No hay hover: la directiva solo escucha `mouseenter` y `focus`. Con el dedo depende de
|
|
24
|
+
cómo el navegador imite el mouse: a veces abre, se cierra al hacer scroll y no se cierra al tocar
|
|
25
|
+
afuera. En las pantallas del cliente y del repartidor, la explicación va **visible** (una línea bajo
|
|
26
|
+
el dato, `sui-form-hint`) o en un `sui-modal-sheet` que se abre al tocar el ícono.
|
|
27
|
+
- Información que hace falta para decidir (un precio, una condición): eso se escribe en la pantalla.
|
|
28
|
+
- Un elemento que no se puede enfocar (`<svg>`, `<span>`): con teclado nunca aparece. El host tiene
|
|
29
|
+
que ser un botón.
|
|
30
|
+
- Algo que pide una acción («Siguiente», «Entendido»): eso es `sui-popover`.
|
|
31
|
+
|
|
32
|
+
## Qué variante usar
|
|
33
|
+
|
|
34
|
+
> La guía del DS dice para qué es y cómo se llaman sus tamaños, pero no cuándo va cada uno. Lo
|
|
35
|
+
> marcado «según la guía del DS» sale de su texto o su código publicado; el resto es **propuesta**.
|
|
36
|
+
>
|
|
37
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin prototipos ni vitrinas): **6 tooltips**
|
|
38
|
+
> en 6 archivos — 2 `suiTooltip` de texto en el panel del local y 4 `suiTooltipLarge` en el flujo de
|
|
39
|
+
> compra del cliente.
|
|
40
|
+
|
|
41
|
+
### Lo que sí dice la guía del DS
|
|
42
|
+
|
|
43
|
+
- **Para qué es**: agrega contexto a elementos **interactivos** y aparece al pasar el mouse o con el
|
|
44
|
+
**foco del teclado**. Por eso no sirve con el dedo.
|
|
45
|
+
- **Tres tamaños**, con nombres corridos un paso respecto a SUI (tabla abajo).
|
|
46
|
+
- **Default**: tema `dark` y tamaño intermedio. SUI arranca en tema `light`.
|
|
47
|
+
- La flecha siempre está; la posición sigue al espacio disponible.
|
|
48
|
+
|
|
49
|
+
### `size` (input `suiTooltipSize`) — equivalencia con la guía
|
|
50
|
+
|
|
51
|
+
| SUI | guía | qué es | cuándo | fuente |
|
|
52
|
+
|---|---|---|---|---|
|
|
53
|
+
| `small` (24 px de alto, texto 12) | `xsmall` | texto de una línea, chico | El nombre de un ícono en una tabla o barra densa. | escala según la guía del DS · cuándo: propuesta |
|
|
54
|
+
| `medium` (34 px, texto 14) — default SUI | `small` (default de la guía) | texto de una línea | Lo normal: una frase corta que explica. | escala según la guía del DS · cuándo: propuesta |
|
|
55
|
+
| `large` (280 px, título + descripción + ícono) | `medium` | contenido rico | Explicar un término con título y una o dos frases. Se activa solo al usar `[suiTooltipLarge]`. | escala según la guía del DS · cuándo: propuesta |
|
|
56
|
+
| `xlarge` (320 px) | — | rico, más ancho | No usar hoy. Extensión de SUI. **Cuándo sí:** una explicación rica que en 280 px queda en más de cuatro líneas. | propuesta |
|
|
57
|
+
|
|
58
|
+
### Contenido: `suiTooltip` o `suiTooltipLarge`
|
|
59
|
+
|
|
60
|
+
| input | cuándo | ejemplo real de la app | fuente |
|
|
61
|
+
|---|---|---|---|
|
|
62
|
+
| `suiTooltip="…"` | Una frase, sin punto final. | `components/customer-segments/customer-segments.html:8` («Ingresos por tipo de cliente») | propuesta |
|
|
63
|
+
| `[suiTooltipLarge]="{ title, description, icon }"` | Un término que necesita título y explicación. | `core/service-fee.ts:33` («Tarifa de servicio») | propuesta |
|
|
64
|
+
| `suiTooltipLarge.dismissible: true` | No usar hoy: lo deja abierto hasta tocar la X o Escape, que es lo que hace un popover. **Cuándo sí:** en web, una explicación larga que la persona lee con calma mientras mueve el mouse. | `core/service-fee.ts:39` (hoy en `true`, en pantallas solo de mobile) | propuesta |
|
|
65
|
+
|
|
66
|
+
### `theme`, `position` y el resto
|
|
67
|
+
|
|
68
|
+
| prop | valor | cuándo | fuente |
|
|
69
|
+
|---|---|---|---|
|
|
70
|
+
| `theme` | `auto` | **Siempre.** Oscuro sobre la app en claro (lo que pide la guía) y claro sobre la app en oscuro. | propuesta (la guía: `dark` por default) |
|
|
71
|
+
| `theme` | `dark` | Igual que `auto` en modo claro, pero no se invierte en modo oscuro. Hoy lo usan los 4 del cliente. | según la guía del DS (default) |
|
|
72
|
+
| `theme` | `light` (default SUI) | No usar hoy: sobre una página clara parece una card más. **Cuándo sí:** ya lo da `auto` en modo oscuro. | propuesta |
|
|
73
|
+
| `position` | `top` (default) | Siempre que haya espacio. Si no lo hay, el CDK lo da vuelta solo. | propuesta |
|
|
74
|
+
| `position` | `right` · `left` | Íconos de una barra lateral angosta (el sidebar colapsado). | propuesta |
|
|
75
|
+
| `position` | `bottom` · `*-start` · `*-end` | Un elemento pegado al borde de arriba o a un costado de la pantalla. | propuesta |
|
|
76
|
+
| `delay` | `200` (default) | Siempre: evita que se abra al cruzar con el mouse. | propuesta |
|
|
77
|
+
| `delay` | otro valor | No usar hoy. **Cuándo sí:** ninguno previsto. | propuesta |
|
|
78
|
+
| `disabled` | `true` | Cuando lo que dice ya está a la vista (el sidebar expandido muestra el nombre). | propuesta |
|
|
79
|
+
| `showArrow` | `true` (default) | Siempre: la flecha dice de qué elemento habla. | según la guía del DS |
|
|
80
|
+
| `showArrow` | `false` | No usar hoy. **Cuándo sí:** sobre un punto de un gráfico, donde la flecha tapa el dato. | propuesta |
|
|
81
|
+
|
|
82
|
+
### Usos de hoy que rompen la regla
|
|
83
|
+
|
|
84
|
+
- **4 tooltips en pantallas que solo existen en el celular** (la explicación de la tarifa de
|
|
85
|
+
servicio del cliente): `pages/customer/cart/cart.html:177`, `pages/customer/checkout/checkout.html:366`,
|
|
86
|
+
`pages/customer/confirmation/confirmation.html:188`, `pages/customer/order-tracking/order-tracking.html:684`.
|
|
87
|
+
Rompen la guía (hover o foco). Pasarían a un `sui-modal-sheet` al tocar el ícono, con el mismo
|
|
88
|
+
texto de `core/service-fee.ts`.
|
|
89
|
+
- **2 tooltips sobre un `<svg>` que no se puede enfocar** (y con `#a3a3a3` suelto):
|
|
90
|
+
`components/customer-segments/customer-segments.html:8`, `components/product-categories/product-categories.html:8`.
|
|
91
|
+
Ni el teclado ni el dedo llegan. El host pasaría a un botón de solo ícono con `aria-label`.
|
|
92
|
+
|
|
93
|
+
## Tamaño en mobile y en web
|
|
94
|
+
|
|
95
|
+
| uso | mobile | web | fuente |
|
|
96
|
+
|---|---|---|---|
|
|
97
|
+
| nombre de un ícono | no aplica: el ícono lleva el nombre escrito o `aria-label` | `small` | propuesta |
|
|
98
|
+
| frase que explica | no aplica: el texto va visible bajo el dato (`sui-form-hint`) | `medium` | propuesta |
|
|
99
|
+
| explicación con título | no aplica: `sui-modal-sheet` al tocar el ícono | `large` (automático con `[suiTooltipLarge]`) | propuesta |
|
|
100
|
+
|
|
101
|
+
En pantallas que se usan en los dos (panel del local, super admin), el tooltip se apaga en mobile
|
|
102
|
+
y la ayuda se muestra de otra forma:
|
|
103
|
+
|
|
104
|
+
```html
|
|
105
|
+
<button class="info" type="button" aria-label="Qué es la tarifa de servicio"
|
|
106
|
+
[suiTooltipLarge]="tarifa" theme="auto" [disabled]="bp.isMobile()"
|
|
107
|
+
(click)="bp.isMobile() && abrirExplicacion()">
|
|
108
|
+
<sui-icon name="information-line" [size]="16" />
|
|
109
|
+
</button>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
113
|
+
|
|
114
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
115
|
+
|---|---|---|
|
|
116
|
+
| cualquier tooltip en mobile | no hay hover; con el dedo abre de casualidad | nunca: texto visible o un sheet |
|
|
117
|
+
| `suiTooltipSize="xlarge"` | 280 px alcanzan para lo que hay | una explicación rica que en 280 px pasa de cuatro líneas |
|
|
118
|
+
| `dismissible: true` | queda abierto como un popover | en web, una explicación larga para leer con calma |
|
|
119
|
+
| `theme="light"` | sobre página clara parece una card | ya lo da `auto` en modo oscuro |
|
|
120
|
+
| `showArrow=false` | la flecha dice de qué habla | sobre un punto de un gráfico |
|
|
121
|
+
| `delay` distinto de 200 | se abriría al cruzar con el mouse | ninguno previsto |
|
|
122
|
+
|
|
123
|
+
## API
|
|
124
|
+
|
|
125
|
+
<!-- api:inicio -->
|
|
126
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
127
|
+
|
|
128
|
+
### `[suiTooltip], [suiTooltipLarge]`
|
|
129
|
+
|
|
130
|
+
| input | tipo | default |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| `suiTooltip` | `string` | `''` |
|
|
133
|
+
| `suiTooltipLarge` | `SuiTooltipLargeData \| null` | `null` |
|
|
134
|
+
| `position` | `'top' \| 'top-start' \| 'top-end' \| 'right' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left'` | `'top'` |
|
|
135
|
+
| `suiTooltipSize` (propiedad `size`) | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
136
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'light'` |
|
|
137
|
+
| `delay` | `number` | `200` |
|
|
138
|
+
| `disabled` | `boolean` | `false` |
|
|
139
|
+
| `showArrow` | `boolean` | `true` |
|
|
140
|
+
|
|
141
|
+
Outputs: ninguno.
|
|
142
|
+
|
|
143
|
+
### `sui-tooltip-panel`
|
|
144
|
+
|
|
145
|
+
| input | tipo | default |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| `text` | `string` | `''` |
|
|
148
|
+
| `position` | `'top' \| 'top-start' \| 'top-end' \| 'right' \| 'bottom' \| 'bottom-start' \| 'bottom-end' \| 'left'` | `'top'` |
|
|
149
|
+
| `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
150
|
+
| `theme` | `'light' \| 'dark'` | `'light'` |
|
|
151
|
+
| `showArrow` | `boolean` | `true` |
|
|
152
|
+
| `title` | `string \| null` | `null` |
|
|
153
|
+
| `description` | `string \| null` | `null` |
|
|
154
|
+
| `icon` | `string \| null` | `null` |
|
|
155
|
+
| `dismissible` | `boolean` | `false` |
|
|
156
|
+
|
|
157
|
+
| output | payload |
|
|
158
|
+
|---|---|
|
|
159
|
+
| `dismissed` | `void` |
|
|
160
|
+
<!-- api:fin -->
|
|
161
|
+
|
|
162
|
+
```ts
|
|
163
|
+
interface SuiTooltipLargeData {
|
|
164
|
+
title: string;
|
|
165
|
+
description?: string;
|
|
166
|
+
icon?: string; // RemixIcon sin el prefijo ri-
|
|
167
|
+
dismissible?: boolean; // true = se queda abierto hasta la X o Escape
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`SuiTooltipPanel` (`sui-tooltip-panel`) es el globo que monta la directiva; también se exporta, pero
|
|
172
|
+
no se usa directo en pantallas.
|
|
173
|
+
|
|
174
|
+
## Trampas
|
|
175
|
+
|
|
176
|
+
- **El tamaño se pasa como `suiTooltipSize`**, no como `size`: así no choca con el `size` del
|
|
177
|
+
componente que lo lleva (`<sui-button size="small" suiTooltip="…">`).
|
|
178
|
+
- **`position`, `theme`, `delay` y `disabled` sí se llaman así, sin prefijo**: si el host es un
|
|
179
|
+
componente con un input del mismo nombre (`disabled` de `sui-button`), el valor llega a los dos.
|
|
180
|
+
- **`suiTooltipSize="large"` con `suiTooltip` de texto dibuja una caja vacía**: el tamaño rico solo
|
|
181
|
+
lee `suiTooltipLarge`. Con `[suiTooltipLarge]` el tamaño pasa a `large` solo.
|
|
182
|
+
- **Defaults distintos a la guía**: tema `light` (la guía, `dark`) y nombres de tamaño corridos un paso.
|
|
183
|
+
- Se cierra al hacer scroll en cualquier contenedor y con Escape. Con `dismissible`, no se cierra al
|
|
184
|
+
sacar el mouse.
|
|
185
|
+
- Pone `aria-describedby` en el host y le borra el `title` nativo (si no, saldría además el globo
|
|
186
|
+
gris del navegador).
|
|
187
|
+
- En `dark`, el ícono del tooltip rico usa un gris fijo del `.scss`, no un token.
|
|
188
|
+
|
|
189
|
+
## Ejemplo
|
|
190
|
+
|
|
191
|
+
```html
|
|
192
|
+
<!-- Nombre de un botón de solo ícono, en web -->
|
|
193
|
+
<sui-compact-button icon="download-2-line" ariaLabel="Exportar" suiTooltip="Exportar" theme="auto" />
|
|
194
|
+
|
|
195
|
+
<!-- Término con explicación, en web -->
|
|
196
|
+
<button type="button" aria-label="Qué es la tarifa de servicio"
|
|
197
|
+
[suiTooltipLarge]="{ title: 'Tarifa de servicio', description: 'Nos ayuda a mantener la plataforma funcionando.', icon: 'information-line' }"
|
|
198
|
+
theme="auto">
|
|
199
|
+
<sui-icon name="information-line" [size]="16" />
|
|
200
|
+
</button>
|
|
201
|
+
```
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-topbar
|
|
3
|
+
selector: sui-topbar
|
|
4
|
+
resumen: Barra de navegación horizontal de escritorio — logo, secciones, buscador, íconos de acción y el chip de la cuenta
|
|
5
|
+
alternativas: [sui-sidebar (la navegación de los roles de la app, con cajón en mobile), sui-page-header (el título de UNA pantalla, sin navegación), sui-topbar-item / sui-topbar-button / sui-topbar-user (las piezas sueltas, para una cabecera armada a mano)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-topbar
|
|
9
|
+
|
|
10
|
+
Story: [Organisms/Topbar](https://sui-design-system.web.app/?path=/docs/organisms-topbar--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para una **web de escritorio** que navega por arriba en vez de por una columna:
|
|
15
|
+
una landing con secciones, un panel interno con pocas secciones y mucho ancho para datos.
|
|
16
|
+
Compone las tres piezas de la familia (`sui-topbar-item`, `sui-topbar-button`,
|
|
17
|
+
`sui-topbar-user`) y el atajo con `sui-kbd`.
|
|
18
|
+
|
|
19
|
+
**No lo uses** para:
|
|
20
|
+
|
|
21
|
+
- La navegación de los roles de la app (empresa, cliente, repartidor, super admin): es
|
|
22
|
+
`sui-sidebar`, y en el teléfono la barra inferior. Hoy la topbar tiene **0 usos** en la app.
|
|
23
|
+
- El título de una pantalla con sus acciones: `sui-page-header`.
|
|
24
|
+
- Nada que se vea en un teléfono: el componente no tiene versión mobile (ver «Tamaño»).
|
|
25
|
+
|
|
26
|
+
Regla corta: **navegación de la app → sidebar · título de pantalla → page header · web de escritorio
|
|
27
|
+
navegada por arriba → topbar.**
|
|
28
|
+
|
|
29
|
+
## Qué variante usar
|
|
30
|
+
|
|
31
|
+
> **La guía del DS no tiene página de la topbar.** El componente sale del Figma de SUI (Topbar
|
|
32
|
+
> [Navigation], frame 3814:25274, cuatro ejemplos: con y sin íconos, con buscador abierto o en
|
|
33
|
+
> botón). Sin uso en la app, **todo lo de abajo es propuesta, falta aprobación**, salvo lo que el
|
|
34
|
+
> componente ya fija.
|
|
35
|
+
>
|
|
36
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: `sui-topbar`, `sui-topbar-item` y
|
|
37
|
+
> `sui-topbar-user` tienen 0 usos; `sui-topbar-button`, 1 en la vitrina de variantes.
|
|
38
|
+
|
|
39
|
+
| decisión | opción | cuándo | fuente |
|
|
40
|
+
|---|---|---|---|
|
|
41
|
+
| items | sin `icon` | El caso normal: 3-6 secciones con nombre corto. | propuesta, falta aprobación |
|
|
42
|
+
| items | con `icon` | Si **todos** llevan ícono. Mezclar con y sin se lee desordenado. | propuesta, falta aprobación |
|
|
43
|
+
| item con `rightIcon: 'arrow-down-s-line'` | — | Un «Más ⌄» que abre un menú. El menú lo pones tú (`sui-dropdown-menu`) al escuchar `(itemClicked)`. | propuesta, falta aprobación |
|
|
44
|
+
| `search` | objeto con `placeholder` | Buscador abierto de 232 px cuando buscar es la acción principal. | Figma (Type=Default) |
|
|
45
|
+
| `search` | `{ compact: true }` | Ícono de lupa en la zona de acciones; tú abres el buscador real (`sui-modal` o una paleta de comandos) en `(searchClicked)`. | Figma (Type=With Icon) |
|
|
46
|
+
| `actions` | 1-3 íconos | Avisos, ayuda, acciones rápidas. `dot: true` = hay algo nuevo. | propuesta, falta aprobación |
|
|
47
|
+
| `user` | config | El chip abre el menú de la cuenta: pásale `[userOpen]` mientras el menú está abierto. | Figma |
|
|
48
|
+
| `accent` | `brand` (default) | Siempre. `information` es el azul del Figma original. | canon del DS (accent = marca) |
|
|
49
|
+
|
|
50
|
+
## Tamaño en mobile y en web
|
|
51
|
+
|
|
52
|
+
La topbar **no tiene `size`** ni ningún breakpoint. Mide 80 de alto (20 + 40 + 20), con
|
|
53
|
+
`padding: 20px 44px` fijo, el buscador abierto en 232 fijos y la navegación con scroll lateral
|
|
54
|
+
oculto si no entra.
|
|
55
|
+
|
|
56
|
+
| uso | mobile | web | fuente |
|
|
57
|
+
|---|---|---|---|
|
|
58
|
+
| navegación de una web de escritorio | **no usar** | `sui-topbar` | propuesta, falta aprobación |
|
|
59
|
+
|
|
60
|
+
**Qué pasa en mobile:** nada se adapta. Los 44 px laterales se comen el ancho, los items se
|
|
61
|
+
esconden detrás de un scroll lateral sin pista visual, el buscador no se achica y no hay
|
|
62
|
+
`safe-area-inset-top` (en la app nativa queda debajo del notch). En mobile se usa el patrón de la
|
|
63
|
+
app: barra inferior + cajón `sui-sidebar`. Si algún día hace falta topbar en el teléfono, primero
|
|
64
|
+
hay que agregarle al componente un modo mobile (menú hamburguesa, buscador en botón, safe area).
|
|
65
|
+
|
|
66
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
67
|
+
|
|
68
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
69
|
+
|---|---|---|
|
|
70
|
+
| `sui-topbar` entero | la app navega con sidebar + barra inferior | una landing o un panel solo de escritorio (un tablero para pantalla grande en el local) |
|
|
71
|
+
| `accent="information"` | el activo es naranja de marca | nunca en esta app |
|
|
72
|
+
| `badge` «NEW» en un item | un «nuevo» que nunca se apaga se vuelve ruido | anunciar una sección recién lanzada, y se quita a las dos semanas |
|
|
73
|
+
|
|
74
|
+
## API
|
|
75
|
+
|
|
76
|
+
<!-- api:inicio -->
|
|
77
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
78
|
+
|
|
79
|
+
| input | tipo | default |
|
|
80
|
+
|---|---|---|
|
|
81
|
+
| `items` | `SuiTopbarEntry[]` | `[]` |
|
|
82
|
+
| `activeValue` | `string \| null` | `null` |
|
|
83
|
+
| `accent` | `'brand' \| 'information'` | `'brand'` |
|
|
84
|
+
| `search` | `SuiTopbarSearchConfig \| boolean \| null` | `false` |
|
|
85
|
+
| `searchValue` · model, `[(searchValue)]` | `string` | `''` |
|
|
86
|
+
| `actions` | `SuiTopbarAction[]` | `[]` |
|
|
87
|
+
| `user` | `SuiTopbarUserConfig \| string \| null` | `null` |
|
|
88
|
+
| `userOpen` | `boolean` | `false` |
|
|
89
|
+
|
|
90
|
+
| output | payload |
|
|
91
|
+
|---|---|
|
|
92
|
+
| `itemClicked` | `SuiTopbarEntry` |
|
|
93
|
+
| `actionClicked` | `SuiTopbarAction` |
|
|
94
|
+
| `userClicked` | `void` |
|
|
95
|
+
| `searchClicked` | `void` |
|
|
96
|
+
| `searchSubmitted` | `string` |
|
|
97
|
+
<!-- api:fin -->
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
interface SuiTopbarEntry {
|
|
101
|
+
value: string; // lo emite (itemClicked) y se compara con activeValue
|
|
102
|
+
label: string;
|
|
103
|
+
icon?: string; // RemixIcon izquierdo
|
|
104
|
+
rightIcon?: string; // típico 'arrow-down-s-line'
|
|
105
|
+
badge?: SuiBadgeConfig | string; // «NEW»
|
|
106
|
+
count?: number; // número rojo
|
|
107
|
+
href?: string; // con href se dibuja <a>; sin href, <button>
|
|
108
|
+
target?: string;
|
|
109
|
+
}
|
|
110
|
+
interface SuiTopbarAction { value: string; icon: string; ariaLabel?: string; dot?: boolean; }
|
|
111
|
+
interface SuiTopbarSearchConfig { placeholder?: string; shortcut?: string; compact?: boolean; }
|
|
112
|
+
interface SuiTopbarUserConfig { name?: string; avatar?: SuiAvatarConfig | string; verified?: boolean; }
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Slot: `<ng-content select="[topbar-logo]">` — el logo (una `<img>` directa se normaliza a 40×40 redonda).
|
|
116
|
+
|
|
117
|
+
## Trampas
|
|
118
|
+
|
|
119
|
+
- **No navega sola.** Los items no usan `routerLink`: el activo lo dice `activeValue` y tú navegas
|
|
120
|
+
en `(itemClicked)`. Excepción: con `href` el item es un `<a>` que, si la ruta es interna, navega
|
|
121
|
+
por el router (SPA) con el clic principal. Es una diferencia deliberada con `sui-sidebar`, que sí
|
|
122
|
+
usa `routerLink`.
|
|
123
|
+
- `activeValue` es **una igualdad exacta** con `value`, no un prefijo de ruta: en `/pedidos/123`
|
|
124
|
+
tienes que calcular tú que el activo es `'pedidos'`.
|
|
125
|
+
- Si `actions[].ariaLabel` falta, el lector de pantalla lee el `value` (`'notifications'`): pásalo
|
|
126
|
+
siempre en español.
|
|
127
|
+
- El buscador no busca: expone `[(searchValue)]` y `(searchSubmitted)` con Enter. El placeholder
|
|
128
|
+
por defecto es «Buscar...» (en `sui-sidebar` es «Search...»).
|
|
129
|
+
- El chip de usuario no abre ningún menú: emite `(userClicked)` y solo cambia de aspecto con
|
|
130
|
+
`userOpen`.
|
|
131
|
+
- El host lleva `role="banner"`: una sola por página.
|
|
132
|
+
|
|
133
|
+
## Ejemplo
|
|
134
|
+
|
|
135
|
+
```html
|
|
136
|
+
<sui-topbar
|
|
137
|
+
[items]="[
|
|
138
|
+
{ value: 'tablero', label: 'Tablero' },
|
|
139
|
+
{ value: 'pedidos', label: 'Pedidos', count: pendientes() },
|
|
140
|
+
{ value: 'mas', label: 'Más', rightIcon: 'arrow-down-s-line' }
|
|
141
|
+
]"
|
|
142
|
+
[activeValue]="seccion()"
|
|
143
|
+
[search]="{ placeholder: 'Buscar pedidos', shortcut: '⌘K' }"
|
|
144
|
+
[(searchValue)]="busqueda"
|
|
145
|
+
[actions]="[{ value: 'avisos', icon: 'notification-3-line', ariaLabel: 'Avisos', dot: hayAvisos() }]"
|
|
146
|
+
[user]="{ name: usuario().nombre, avatar: usuario().avatarUrl }"
|
|
147
|
+
[userOpen]="menuCuenta()"
|
|
148
|
+
(itemClicked)="ir($event.value)"
|
|
149
|
+
(actionClicked)="abrirAvisos()"
|
|
150
|
+
(userClicked)="menuCuenta.set(!menuCuenta())">
|
|
151
|
+
<img topbar-logo src="assets/app-icon.png" alt="Master Pedidos" />
|
|
152
|
+
</sui-topbar>
|
|
153
|
+
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-topbar-button
|
|
3
|
+
selector: sui-topbar-button
|
|
4
|
+
resumen: Botón de solo ícono de 40×40 para la barra superior, con punto rojo de «hay algo nuevo»
|
|
5
|
+
alternativas: [sui-button con onlyIcon (un botón de ícono en cualquier otro lugar), sui-compact-button (ícono chico de 20-28 en filas y barras apretadas), sui-topbar (la barra completa, que ya lo compone)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-topbar-button
|
|
9
|
+
|
|
10
|
+
Story: [Organisms/Topbar](https://sui-design-system.web.app/?path=/docs/organisms-topbar--docs) —
|
|
11
|
+
no tiene story propia: se ve en la página de la topbar, en la story «Icon Button — estados».
|
|
12
|
+
|
|
13
|
+
## Cuándo usarlo / cuándo no
|
|
14
|
+
|
|
15
|
+
**Úsalo** para los íconos de acción **de una barra superior**: avisos, ayuda, acciones rápidas.
|
|
16
|
+
Dentro de `sui-topbar` no se escribe a mano: sale de `[actions]`. Suelto sirve para una cabecera
|
|
17
|
+
armada a mano que quiera verse como la topbar.
|
|
18
|
+
|
|
19
|
+
**No lo uses** para:
|
|
20
|
+
|
|
21
|
+
- Un botón de ícono en una card, una fila o un formulario: `sui-button` con `onlyIcon`, o
|
|
22
|
+
`sui-compact-button` si el espacio es chico.
|
|
23
|
+
- Una acción con texto: no lo tiene.
|
|
24
|
+
|
|
25
|
+
## Qué variante usar
|
|
26
|
+
|
|
27
|
+
> **La guía del DS no tiene página de este botón.** Sale del Figma de SUI (Topbar Item Button
|
|
28
|
+
> [Topbar], set 3814:25156: Default, Hover, Active). Uso medido el 03-10-2026: **0 usos** en la
|
|
29
|
+
> app, 1 en la vitrina de variantes (`master-preview/_guia-variantes`). Lo de abajo es
|
|
30
|
+
> **propuesta, falta aprobación**.
|
|
31
|
+
|
|
32
|
+
| prop | cuándo | fuente |
|
|
33
|
+
|---|---|---|
|
|
34
|
+
| `dot` | Hay algo nuevo detrás del ícono (avisos sin leer). Se apaga cuando la persona lo abre. Si el número importa, no alcanza: va un contador en otro lado. | propuesta, falta aprobación |
|
|
35
|
+
| `active` | Mientras el panel que abre el botón está abierto (pinta el ícono naranja y `aria-pressed`). | Figma (State=Active) |
|
|
36
|
+
| `accent` | `brand` (default). `information` es el azul del Figma original: no usar. | canon del DS (accent = marca) |
|
|
37
|
+
|
|
38
|
+
## Tamaño en mobile y en web
|
|
39
|
+
|
|
40
|
+
**No tiene `size`**: mide siempre 40×40 (padding 10 + ícono de 20), radio 10. En mobile 40 es el
|
|
41
|
+
mínimo táctil aceptable, pero el botón vive en la topbar, que hoy es solo de escritorio (ver
|
|
42
|
+
`sui-topbar`).
|
|
43
|
+
|
|
44
|
+
| uso | mobile | web | fuente |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| ícono de la barra superior | no usar (no hay topbar en mobile) | 40×40 | propuesta, falta aprobación |
|
|
47
|
+
|
|
48
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
49
|
+
|
|
50
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `sui-topbar-button` (0 usos) | las barras de la app tienen sus íconos propios | si se unifica la barra superior del admin con la del DS |
|
|
53
|
+
| `accent="information"` | el activo es naranja de marca | nunca en esta app |
|
|
54
|
+
|
|
55
|
+
## API
|
|
56
|
+
|
|
57
|
+
<!-- api:inicio -->
|
|
58
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
59
|
+
|
|
60
|
+
| input | tipo | default |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| `icon` | `string` | — (requerido) |
|
|
63
|
+
| `ariaLabel` | `string` | — (requerido) |
|
|
64
|
+
| `dot` | `boolean` | `false` |
|
|
65
|
+
| `active` | `boolean` | `false` |
|
|
66
|
+
| `accent` | `'brand' \| 'information'` | `'brand'` |
|
|
67
|
+
|
|
68
|
+
| output | payload |
|
|
69
|
+
|---|---|
|
|
70
|
+
| `clicked` | `void` |
|
|
71
|
+
<!-- api:fin -->
|
|
72
|
+
|
|
73
|
+
`icon` es el nombre RemixIcon sin `ri-`.
|
|
74
|
+
|
|
75
|
+
## Trampas
|
|
76
|
+
|
|
77
|
+
- **`ariaLabel` es obligatorio** (a diferencia de `sui-button`, que no tiene ese input). En
|
|
78
|
+
español: «Avisos», no `notifications`.
|
|
79
|
+
- El evento es `(clicked)`. Un `(click)` en el host también llega, pero no es la API.
|
|
80
|
+
- No es un `sui-compact-button`: mide 40 (no 24) y su radio es 10 (no 6). No los mezcles en la
|
|
81
|
+
misma barra.
|
|
82
|
+
- El punto rojo (4×4, con aro blanco) va arriba a la derecha y es solo visual: no lo lee el lector
|
|
83
|
+
de pantalla. Si importa, dilo en `ariaLabel` («Avisos, hay nuevos»).
|
|
84
|
+
- Ya trae el arreglo de iOS para el `:active` pegado.
|
|
85
|
+
|
|
86
|
+
## Ejemplo
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<sui-topbar-button
|
|
90
|
+
icon="notification-3-line"
|
|
91
|
+
ariaLabel="Avisos"
|
|
92
|
+
[dot]="hayAvisos()"
|
|
93
|
+
[active]="panelAvisos()"
|
|
94
|
+
(clicked)="panelAvisos.set(!panelAvisos())" />
|
|
95
|
+
```
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-topbar-item
|
|
3
|
+
selector: sui-topbar-item
|
|
4
|
+
resumen: Una sección de la navegación horizontal — texto, ícono opcional, badge o contador — con estado activo
|
|
5
|
+
alternativas: [sui-topbar (la barra completa: lo compone desde [items]), sui-tab-menu-horizontal (pestañas dentro de UNA pantalla), sui-tab-chips (filtros), sui-link-button (un link suelto en un texto)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-topbar-item
|
|
9
|
+
|
|
10
|
+
Story: [Organisms/Topbar](https://sui-design-system.web.app/?path=/docs/organisms-topbar--docs) —
|
|
11
|
+
no tiene story propia: se ve en la página de la topbar, en la story «Topbar Item — estados».
|
|
12
|
+
|
|
13
|
+
## Cuándo usarlo / cuándo no
|
|
14
|
+
|
|
15
|
+
**Úsalo** como cada sección de una navegación horizontal de escritorio. Dentro de `sui-topbar`
|
|
16
|
+
no se escribe a mano: sale de `[items]`. Suelto sirve para armar una barra propia que se vea
|
|
17
|
+
igual.
|
|
18
|
+
|
|
19
|
+
**No lo uses** para:
|
|
20
|
+
|
|
21
|
+
- Pestañas que cambian el contenido de la misma pantalla: `sui-tab-menu-horizontal`.
|
|
22
|
+
- Filtros que se prenden y apagan: `sui-tab-chips`.
|
|
23
|
+
- Navegación de los roles de la app: `sui-sidebar`.
|
|
24
|
+
|
|
25
|
+
## Qué variante usar
|
|
26
|
+
|
|
27
|
+
> **La guía del DS no tiene página de este item.** Sale del Figma de SUI (Topbar Items [Topbar],
|
|
28
|
+
> set 3802:24588: Default, Hover, Active). Uso medido el 03-10-2026: **0 usos** en la app. Lo de
|
|
29
|
+
> abajo es **propuesta, falta aprobación**.
|
|
30
|
+
|
|
31
|
+
| prop | cuándo | fuente |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| solo `label` | El caso normal. Una o dos palabras, sentence case. | propuesta, falta aprobación |
|
|
34
|
+
| `icon` | Si **todos** los items de la barra lo llevan. | propuesta, falta aprobación |
|
|
35
|
+
| `rightIcon: 'arrow-down-s-line'` | El item abre un menú («Más ⌄»). El menú lo pones tú. | Figma |
|
|
36
|
+
| `count` | Pendientes que piden acción («3» pedidos por aceptar). Número rojo. | Figma (notification=true) |
|
|
37
|
+
| `badge` | Un «Nuevo» temporal en una sección recién lanzada. String = badge naranja `light` `small`. | Figma (badge=true) |
|
|
38
|
+
| `href` | El item es un link: con ruta interna navega por el router; con `target="_blank"` abre otra pestaña con `rel` seguro. | propuesta, falta aprobación |
|
|
39
|
+
| sin `href` | Es un `<button>`: navegas tú en `(clicked)`. | propuesta, falta aprobación |
|
|
40
|
+
| `active` | La sección actual (fondo gris, texto oscuro, ícono naranja y `aria-current="page"`). Uno solo por barra. | Figma (State=Active) |
|
|
41
|
+
|
|
42
|
+
## Tamaño en mobile y en web
|
|
43
|
+
|
|
44
|
+
**No tiene `size`**: alto 36 (padding 8 + línea de 20), texto 14/500, íconos de 20. Vive en la
|
|
45
|
+
topbar, que hoy es solo de escritorio.
|
|
46
|
+
|
|
47
|
+
| uso | mobile | web | fuente |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| sección de la barra superior | no usar (no hay topbar en mobile) | tamaño único | propuesta, falta aprobación |
|
|
50
|
+
|
|
51
|
+
En mobile, 36 de alto queda por debajo del área táctil cómoda (44): si algún día se usa ahí, la
|
|
52
|
+
barra tendría que darle más aire.
|
|
53
|
+
|
|
54
|
+
## API
|
|
55
|
+
|
|
56
|
+
<!-- api:inicio -->
|
|
57
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
58
|
+
|
|
59
|
+
| input | tipo | default |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `label` | `string` | — (requerido) |
|
|
62
|
+
| `icon` | `string \| null` | `null` |
|
|
63
|
+
| `rightIcon` | `string \| null` | `null` |
|
|
64
|
+
| `badge` | `SuiBadgeConfig \| string \| null` | `null` |
|
|
65
|
+
| `count` | `number \| null` | `null` |
|
|
66
|
+
| `active` | `boolean` | `false` |
|
|
67
|
+
| `accent` | `'brand' \| 'information'` | `'brand'` |
|
|
68
|
+
| `href` | `string \| null` | `null` |
|
|
69
|
+
| `target` | `string \| null` | `null` |
|
|
70
|
+
|
|
71
|
+
| output | payload |
|
|
72
|
+
|---|---|
|
|
73
|
+
| `clicked` | `void` |
|
|
74
|
+
<!-- api:fin -->
|
|
75
|
+
|
|
76
|
+
`SuiTopbarAccent` (`'brand' | 'information'`) se exporta desde este archivo y lo usan también
|
|
77
|
+
`sui-topbar` y `sui-topbar-button`.
|
|
78
|
+
|
|
79
|
+
## Trampas
|
|
80
|
+
|
|
81
|
+
- `count` en `0` **se muestra** («0» rojo): solo `null` lo oculta. Pasa `pendientes() || null`.
|
|
82
|
+
- `badge` en string toma naranja `light` `small`; para otro color, el objeto `SuiBadgeConfig`.
|
|
83
|
+
- `active` no se calcula solo: ni por ruta ni por `href`. Lo decides tú.
|
|
84
|
+
- Con `href`, `(clicked)` igual se emite: no navegues dos veces.
|
|
85
|
+
- `accent="information"` es el azul del Figma original: en esta app no se usa.
|
|
86
|
+
- Ya trae el arreglo de iOS para el `:active` pegado.
|
|
87
|
+
|
|
88
|
+
## Ejemplo
|
|
89
|
+
|
|
90
|
+
```html
|
|
91
|
+
<nav class="mi-barra">
|
|
92
|
+
<sui-topbar-item label="Tablero" [active]="seccion() === 'tablero'" (clicked)="ir('tablero')" />
|
|
93
|
+
<sui-topbar-item label="Pedidos" [count]="pendientes() || null"
|
|
94
|
+
[active]="seccion() === 'pedidos'" (clicked)="ir('pedidos')" />
|
|
95
|
+
<sui-topbar-item label="Más" rightIcon="arrow-down-s-line" (clicked)="abrirMenu()" />
|
|
96
|
+
</nav>
|
|
97
|
+
```
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-topbar-user
|
|
3
|
+
selector: sui-topbar-user
|
|
4
|
+
resumen: Chip de la cuenta en la barra superior — avatar, nombre y flecha — que abre el menú de la cuenta
|
|
5
|
+
alternativas: [sui-topbar (la barra completa: lo compone desde [user]), el perfil del pie de sui-sidebar (la cuenta en la navegación lateral), sui-avatar (solo la foto, sin nombre ni menú)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-topbar-user
|
|
9
|
+
|
|
10
|
+
Story: [Organisms/Topbar](https://sui-design-system.web.app/?path=/docs/organisms-topbar--docs) —
|
|
11
|
+
no tiene story propia: se ve en la página de la topbar, en la story «User Chip — estados».
|
|
12
|
+
|
|
13
|
+
## Cuándo usarlo / cuándo no
|
|
14
|
+
|
|
15
|
+
**Úsalo** a la derecha de una barra superior para la **cuenta de quien mira**: su foto, su
|
|
16
|
+
nombre y un menú (perfil, cambiar de rol, salir). Dentro de `sui-topbar` sale de `[user]`.
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- Mostrar a **otra** persona (el cliente de un pedido, el repartidor asignado): `sui-avatar` con
|
|
21
|
+
su nombre al lado. El chip es un botón con flecha: promete un menú.
|
|
22
|
+
- La cuenta dentro de la navegación lateral: ya va en `profile` de `sui-sidebar`.
|
|
23
|
+
|
|
24
|
+
## Qué variante usar
|
|
25
|
+
|
|
26
|
+
> **La guía del DS no tiene página de este chip.** Sale del Figma de SUI (User Profile [Topbar],
|
|
27
|
+
> set 3814:24667: Default, Hover, Active). Uso medido el 03-10-2026: **0 usos** en la app. Lo de
|
|
28
|
+
> abajo es **propuesta, falta aprobación**, salvo lo que es canon de la app.
|
|
29
|
+
|
|
30
|
+
| prop | cuándo | fuente |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `avatar` (string) | La URL de la foto. Siempre de `avatarUrl`, nunca de `photoURL`. | canon (CLAUDE.md, «Fotos de otra persona») |
|
|
33
|
+
| `avatar` (objeto) | Sin foto: `{ initials, color }` para que las iniciales tengan contraste. | propuesta, falta aprobación |
|
|
34
|
+
| `name` | El nombre corto («Sophia», no el correo). Vacío = chip solo con la foto, para barras angostas. | Figma (name=false) |
|
|
35
|
+
| `verified` | No usar hoy: la app no verifica cuentas de personas. | propuesta, falta aprobación |
|
|
36
|
+
| `open` | Mientras el menú de la cuenta está abierto (flecha hacia arriba, `aria-expanded`). | Figma (State=Active) |
|
|
37
|
+
|
|
38
|
+
## Tamaño en mobile y en web
|
|
39
|
+
|
|
40
|
+
**No tiene `size`**: alto 40 (avatar 32 + 4 arriba y abajo), radio 10, nombre 14/500. Vive en la
|
|
41
|
+
topbar, que hoy es solo de escritorio.
|
|
42
|
+
|
|
43
|
+
| uso | mobile | web | fuente |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| cuenta en la barra superior | no usar (en mobile la cuenta va en el cajón del sidebar) | con nombre | propuesta, falta aprobación |
|
|
46
|
+
|
|
47
|
+
## API
|
|
48
|
+
|
|
49
|
+
<!-- api:inicio -->
|
|
50
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
51
|
+
|
|
52
|
+
| input | tipo | default |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `name` | `string` | `''` |
|
|
55
|
+
| `avatar` | `SuiAvatarConfig \| string \| null` | `null` |
|
|
56
|
+
| `verified` | `boolean` | `false` |
|
|
57
|
+
| `open` | `boolean` | `false` |
|
|
58
|
+
|
|
59
|
+
| output | payload |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `clicked` | `void` |
|
|
62
|
+
<!-- api:fin -->
|
|
63
|
+
|
|
64
|
+
## Trampas
|
|
65
|
+
|
|
66
|
+
- **No abre ningún menú.** Emite `(clicked)` y lleva `aria-haspopup="menu"`: el menú
|
|
67
|
+
(`sui-dropdown-menu`) lo pones tú y le pasas `[open]` mientras está abierto.
|
|
68
|
+
- Sin `avatar` (o con `null`) igual dibuja el avatar con la silueta genérica gris: pasa al menos
|
|
69
|
+
las iniciales.
|
|
70
|
+
- El nombre no se corta: uno largo empuja el resto de la barra. Usa el nombre de pila.
|
|
71
|
+
- La foto de Google (`lh3.googleusercontent.com`) solo carga con las cookies de su dueño; en la
|
|
72
|
+
barra de quien mira funciona, pero sigue siendo regla usar `avatarUrl`.
|
|
73
|
+
- Ya trae el arreglo de iOS para el `:active` pegado.
|
|
74
|
+
|
|
75
|
+
## Ejemplo
|
|
76
|
+
|
|
77
|
+
```html
|
|
78
|
+
<sui-topbar-user
|
|
79
|
+
[name]="usuario().nombre"
|
|
80
|
+
[avatar]="usuario().avatarUrl || { initials: usuario().iniciales, color: 'orange' }"
|
|
81
|
+
[open]="menuCuenta()"
|
|
82
|
+
(clicked)="menuCuenta.set(!menuCuenta())" />
|
|
83
|
+
```
|