@ajuarezso/sui-design-system 0.25.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/sui-accordion/README.md +83 -9
- package/docs/sui-activity-feed/README.md +55 -1
- package/docs/sui-activity-filter/README.md +50 -1
- package/docs/sui-alert/README.md +54 -0
- package/docs/sui-app-store-badge/README.md +57 -3
- package/docs/sui-avatar/README.md +66 -6
- package/docs/sui-avatar-group/README.md +64 -2
- package/docs/sui-badge/README.md +79 -11
- package/docs/sui-banner/README.md +70 -5
- package/docs/sui-brand-logo/README.md +77 -14
- package/docs/sui-breadcrumb-item/README.md +51 -0
- package/docs/sui-breadcrumbs/README.md +48 -0
- package/docs/sui-button/README.md +68 -6
- package/docs/sui-button-group/README.md +70 -5
- package/docs/sui-button-group-item/README.md +68 -4
- package/docs/sui-card/README.md +97 -10
- package/docs/sui-chart-legend/README.md +53 -0
- package/docs/sui-chart-legend-dot/README.md +49 -0
- package/docs/sui-checkbox/README.md +106 -26
- package/docs/sui-checkbox-card/README.md +58 -2
- package/docs/sui-checkbox-label/README.md +89 -23
- package/docs/sui-circular-progress-bar/README.md +63 -5
- package/docs/sui-color-dot/README.md +61 -5
- package/docs/sui-color-picker/README.md +62 -4
- package/docs/sui-command-menu-footer/README.md +49 -0
- package/docs/sui-command-menu-item/README.md +63 -4
- package/docs/sui-command-menu-search/README.md +58 -4
- package/docs/sui-compact-avatar-group/README.md +61 -4
- package/docs/sui-compact-button/README.md +112 -28
- package/docs/sui-compact-select/README.md +58 -4
- package/docs/sui-compact-select-for-input/README.md +69 -5
- package/docs/sui-content-card/README.md +63 -2
- package/docs/sui-content-divider/README.md +49 -1
- package/docs/sui-content-label/README.md +83 -4
- package/docs/sui-counter-input/README.md +91 -7
- package/docs/sui-date-selector/README.md +61 -3
- package/docs/sui-datepicker/README.md +72 -5
- package/docs/sui-day-cell/README.md +60 -3
- package/docs/sui-day-label/README.md +52 -3
- package/docs/sui-divider/README.md +57 -5
- package/docs/sui-drawer-footer/README.md +63 -2
- package/docs/sui-drawer-header/README.md +60 -3
- package/docs/sui-dropdown-caption/README.md +53 -1
- package/docs/sui-dropdown-item/README.md +72 -6
- package/docs/sui-dropdown-menu/README.md +74 -5
- package/docs/sui-dropdown-search/README.md +57 -1
- package/docs/sui-emoji/README.md +82 -18
- package/docs/sui-empty-state/README.md +68 -4
- package/docs/sui-fancy-button/README.md +59 -1
- package/docs/sui-file-icon/README.md +56 -1
- package/docs/sui-file-upload/README.md +69 -9
- package/docs/sui-file-upload-card/README.md +53 -2
- package/docs/sui-filter/README.md +74 -5
- package/docs/sui-flag/README.md +62 -1
- package/docs/sui-form-hint/README.md +54 -5
- package/docs/sui-form-label/README.md +53 -1
- package/docs/sui-href/README.md +47 -0
- package/docs/sui-icon/README.md +69 -4
- package/docs/sui-image-upload/README.md +70 -3
- package/docs/sui-image-upload-profile/README.md +58 -0
- package/docs/sui-img-retry/README.md +49 -0
- package/docs/sui-inline-input/README.md +61 -3
- package/docs/sui-inline-select/README.md +60 -0
- package/docs/sui-input/README.md +77 -14
- package/docs/sui-integration-switch/README.md +69 -2
- package/docs/sui-kbd/README.md +71 -7
- package/docs/sui-key-icon/README.md +65 -6
- package/docs/sui-link-button/README.md +79 -13
- package/docs/sui-logo/README.md +74 -4
- package/docs/sui-modal/README.md +61 -2
- package/docs/sui-modal-footer/README.md +83 -9
- package/docs/sui-modal-header/README.md +56 -0
- package/docs/sui-modal-sheet/README.md +72 -10
- package/docs/sui-notification/README.md +71 -1
- package/docs/sui-notification-footer/README.md +51 -1
- package/docs/sui-notification-tab-menu/README.md +57 -1
- package/docs/sui-otp-input/README.md +67 -6
- package/docs/sui-page-header/README.md +83 -15
- package/docs/sui-pagination/README.md +60 -0
- package/docs/sui-password-strength/README.md +50 -1
- package/docs/sui-payment-icon/README.md +66 -7
- package/docs/sui-period-range/README.md +65 -6
- package/docs/sui-popover/README.md +73 -7
- package/docs/sui-product-card/README.md +76 -8
- package/docs/sui-progress-bar/README.md +72 -8
- package/docs/sui-progress-bar-label/README.md +69 -12
- package/docs/sui-radio/README.md +83 -6
- package/docs/sui-radio-card/README.md +58 -4
- package/docs/sui-radio-label/README.md +86 -19
- package/docs/sui-rating/README.md +81 -14
- package/docs/sui-rich-editor/README.md +45 -0
- package/docs/sui-segmented-control/README.md +83 -14
- package/docs/sui-select/README.md +72 -3
- package/docs/sui-sidebar/README.md +64 -9
- package/docs/sui-slider/README.md +68 -1
- package/docs/sui-social-button/README.md +63 -3
- package/docs/sui-status-badge/README.md +64 -6
- package/docs/sui-stepper/README.md +57 -0
- package/docs/sui-store-card/README.md +71 -8
- package/docs/sui-switch/README.md +80 -9
- package/docs/sui-switch-card/README.md +70 -6
- package/docs/sui-switch-label/README.md +90 -13
- package/docs/sui-tab-chips/README.md +79 -9
- package/docs/sui-tab-menu-horizontal/README.md +62 -1
- package/docs/sui-tab-menu-vertical/README.md +56 -3
- package/docs/sui-table/README.md +68 -7
- package/docs/sui-tag/README.md +75 -4
- package/docs/sui-tag-input/README.md +71 -7
- package/docs/sui-textarea/README.md +78 -11
- package/docs/sui-time-picker/README.md +70 -7
- package/docs/sui-toast/README.md +65 -5
- package/docs/sui-tooltip/README.md +61 -4
- package/docs/sui-topbar/README.md +57 -3
- package/docs/sui-topbar-button/README.md +57 -3
- package/docs/sui-topbar-item/README.md +61 -0
- package/docs/sui-topbar-user/README.md +56 -0
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +19 -19
|
@@ -110,14 +110,36 @@ y las opciones de la lista; el alto no cambia (las opciones bajan 2 de padding p
|
|
|
110
110
|
| uso | mobile | web | fuente |
|
|
111
111
|
|---|---|---|---|
|
|
112
112
|
| campo de formulario | `large` (48) | `medium` (40) | mobile `large`: canon (decisión del dueño 04-10-2026, piso táctil 44: `medium` 40 no llega y `large` 48 es el primer size que sí) · web `medium`: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
113
|
-
| filtro de una barra | `large` (48) | `medium` (40) | mobile `large`: canon (decisión del dueño 04-10-2026, piso táctil 44: `large` 48 es el primer size que llega) · web `medium`: canon (dueño, 05-10-2026, D16) (
|
|
113
|
+
| filtro de una barra | `large` (48) | `medium` (40) | mobile `large`: canon (decisión del dueño 04-10-2026, piso táctil 44: `large` 48 es el primer size que llega) · web `medium`: canon (dueño, 05-10-2026, D16) (el `small` de `pages/orders/orders.html:257` ya se migró a `bp.sizeControl()`) |
|
|
114
114
|
| dentro de una tabla | no aplica | `medium` (40) | canon (dueño, 05-10-2026, D16): nada en `xsmall` (la guía del DS lo usa en tablas densas) |
|
|
115
115
|
| `xlarge` (52) | no usar | no usar | canon (aprobado por el dueño, 05-10-2026, bloque B6): queda más alto que el botón `large` del footer |
|
|
116
116
|
|
|
117
117
|
```html
|
|
118
|
-
<sui-select [size]="bp.
|
|
118
|
+
<sui-select [size]="bp.sizeControl()" label="Distrito" … /> <!-- bp = BreakpointsService · D16, dueño 05-10-2026 -->
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
+
### Por dispositivo (D16)
|
|
122
|
+
|
|
123
|
+
Fila `select` de la tabla D16 (dueño, 05-10-2026): se decide por el tipo de puntero además del ancho.
|
|
124
|
+
|
|
125
|
+
| dispositivo | size | nota |
|
|
126
|
+
|---|---|---|
|
|
127
|
+
| celular chico (< 380 px) | `large` (48) | interino: D16 pide `medium` con área tocable de 44; hasta que el DS la estire, se queda el grande (nota ¹ de D16) |
|
|
128
|
+
| celular (380–767 px) | `large` (48) | el primer size que llega al piso táctil de 44 |
|
|
129
|
+
| tablet táctil (`pointer: coarse`) | `large` (48) | Apple pide 44 pt también en iPad; con `bp.isMobile()` el iPad quedaba en `medium` 40 |
|
|
130
|
+
| computadora (`pointer: fine`) | `medium` (40) | también en filtros de barra y dentro de tablas; nunca `small` ni `xsmall` |
|
|
131
|
+
|
|
132
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`. El espacio extra va a ancho máximo y columnas, no a un campo más alto.
|
|
133
|
+
|
|
134
|
+
En master-pedidos: `[size]="bp.sizeControl()"`. Re-medido el 06-10-2026: 52 de 56 `<sui-select>` ya lo usan. Faltan 4:
|
|
135
|
+
|
|
136
|
+
- `pages/driver/driver-dashboard/driver-dashboard.html:1507`: `size="large"` fijo por pedido del dueño (22-09-2026),
|
|
137
|
+
pendiente de confirmar si D16 lo reemplaza.
|
|
138
|
+
- `pages/super-admin/master-preview/master-preview.html:807` y `:813`: sin `size`, salen en `medium` (el default) en
|
|
139
|
+
todos los dispositivos. Es la vitrina del super admin.
|
|
140
|
+
- `pages/super-admin/master-preview/_ruta-pedido/ruta-pedido.html:12`: sin `size`, sale en `medium`. Es la pantalla de
|
|
141
|
+
diagnóstico `/dx/ruta-pedido` (auditor de rutas del super admin), no una vitrina.
|
|
142
|
+
|
|
121
143
|
## «No usar»: por qué no hoy y cuándo sí
|
|
122
144
|
|
|
123
145
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -176,12 +198,59 @@ decoración propia del campo (gana sobre ícono, imagen y bandera).
|
|
|
176
198
|
label, con el placeholder), apunta al listbox abierto (`aria-controls`) y anuncia la opción
|
|
177
199
|
resaltada con las flechas (`aria-activedescendant`). Hint y error van en `aria-describedby`.
|
|
178
200
|
|
|
201
|
+
## Bien y mal
|
|
202
|
+
|
|
203
|
+
**Filtro de período con 3 opciones**
|
|
204
|
+
|
|
205
|
+
```html
|
|
206
|
+
<!-- ❌ mal: 3 opciones excluyentes que se aplican al tocar, escondidas en un menú (pages/discounts/discounts.html:49) -->
|
|
207
|
+
<sui-select [size]="bp.sizeControl()" placeholder="Período"
|
|
208
|
+
[options]="periodOptions" [value]="selectedPeriod()"
|
|
209
|
+
(valueChange)="selectedPeriod.set($event ?? '7days')" />
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```html
|
|
213
|
+
<!-- ✅ bien: 2 a 4 opciones excluyentes → sui-segmented-control (canon, dueño 04-10-2026) -->
|
|
214
|
+
<sui-segmented-control [size]="bp.tactil() ? '2xlarge' : 'medium'"
|
|
215
|
+
[tabs]="periodos" [(active)]="periodo" />
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**El valor que vuelve del select**
|
|
219
|
+
|
|
220
|
+
```html
|
|
221
|
+
<!-- ❌ mal: `$any` es un `any` disfrazado y además deja pasar el `null` (pages/super-admin/super-admin.html:317) -->
|
|
222
|
+
<sui-select [size]="bp.sizeControl()" label="Plan" placeholder="Elige…"
|
|
223
|
+
[options]="planSelectOptions()" [value]="subPlan()"
|
|
224
|
+
(valueChange)="subPlan.set($any($event))" />
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
```html
|
|
228
|
+
<!-- ✅ bien: opciones tipadas (SuiSelectOption<string>[]) y el null resuelto en el template -->
|
|
229
|
+
<sui-select [size]="bp.sizeControl()" label="Plan" placeholder="Elige…"
|
|
230
|
+
[options]="planSelectOptions()" [value]="subPlan()"
|
|
231
|
+
(valueChange)="subPlan.set($event ?? 'crecimiento')" />
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**El size por dispositivo**
|
|
235
|
+
|
|
236
|
+
```html
|
|
237
|
+
<!-- ❌ mal: solo mira el ancho; el iPad (≥ 768, táctil) recibe `medium` 40, bajo el piso de 44 -->
|
|
238
|
+
<sui-select [size]="bp.isMobile() ? 'large' : 'medium'" label="Distrito"
|
|
239
|
+
placeholder="Elige el distrito" [options]="distritos()" />
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
```html
|
|
243
|
+
<!-- ✅ bien: el helper de D16 (`large` en celular y tablet táctil, `medium` en la computadora) -->
|
|
244
|
+
<sui-select [size]="bp.sizeControl()" label="Distrito"
|
|
245
|
+
placeholder="Elige el distrito" [options]="distritos()" />
|
|
246
|
+
```
|
|
247
|
+
|
|
179
248
|
## Ejemplo
|
|
180
249
|
|
|
181
250
|
```html
|
|
182
251
|
<sui-select label="Distrito" [required]="true" placeholder="Elige tu distrito"
|
|
183
252
|
[options]="distritos()" [disabled]="!provinciaId()"
|
|
184
253
|
[error]="intentado() && !distritoId()" errorMessage="Elige tu distrito"
|
|
185
|
-
[size]="bp.
|
|
254
|
+
[size]="bp.sizeControl()"
|
|
186
255
|
[value]="distritoId()" (valueChange)="distritoId.set($event ?? '')" />
|
|
187
256
|
```
|
|
@@ -44,11 +44,11 @@ Regla corta: **navegación del rol → sidebar · secciones de una pantalla →
|
|
|
44
44
|
| `brand` | `{ name: 'Master Pedidos', subtitle: '<Rol>', logo: 'assets/app-icon.png', fallback: 'M' }`. En empresa, el nombre del local. | práctica de la app (4 de 4) |
|
|
45
45
|
| `showHeaderButton` + `headerButtonActive` + panel `[header-panel]` | El botón del header abre el **cambio de rol** (o de negocio/sucursal en empresa). El panel se proyecta con `<div header-panel>` y adentro van `sui-dropdown-item mode="option" size="large"`. El cliente lo muestra solo en mobile. | práctica de la app (4 de 4) |
|
|
46
46
|
| tres secciones con rótulo | `items` + `itemsLabel` (lo de todos los días), `secondaryItems` + `secondaryItemsLabel` (dinero o crecimiento), `supportingItems` + `supportingItemsLabel` (cuenta, administración: va anclado abajo). Rótulos en sentence case: «Operación», «Dinero», «Cuenta». | práctica de la app (4 de 4) |
|
|
47
|
-
| `activeRoute` |
|
|
47
|
+
| `activeRoute` | No hace falta si los items de navegación llevan `route`: el `<a>` usa `routerLinkActive` y marca por prefijo (`/cliente/pedidos/123` deja «Mis pedidos» activo). `activeRoute` solo marca items **sin** `route`, y por `value` exacto (`activeRoute="pedidos"`), para demos sin router (`sui-sidebar.ts:369-412`). Los 4 layouts pasan `[activeRoute]="currentUrl()"`, pero no cambia nada: todos sus items de navegación tienen `route` y la URL nunca es igual al `value` de un item-acción. | comportamiento del `.ts` · práctica de la app (4 de 4 lo pasan, sin efecto) |
|
|
48
48
|
| `profile` | Nombre + `avatarUrl` (nunca `photoURL`) + correo. | canon (CLAUDE.md, «Fotos de otra persona»: el campo correcto es `avatarUrl`) |
|
|
49
49
|
| cerrar sesión | Hoy **ningún** item usa `action: 'logout'`: el cierre real vive en el selector de rol y el «salir» del panel solo cambia de rol (`components/sidebar/sidebar.ts:367`). Los 4 layouts dejan `(logoutClicked)` conectado por si se agrega. | práctica de la app |
|
|
50
|
-
| `[(mobileOpen)]` + `closeOnItemClick` | Siempre los dos. Más `cerrarAlNavegar(...)` en el constructor del layout (ver Trampas). | canon (CANON-SUI §1.1) |
|
|
51
|
-
| `search` | `{
|
|
50
|
+
| `[(mobileOpen)]` + `closeOnItemClick` | Siempre los dos (`closeOnItemClick` ya es `true` por defecto; los 4 layouts lo pasan explícito). Más `cerrarAlNavegar(...)` en el constructor del layout (ver Trampas). | canon (CANON-SUI §1.1) |
|
|
51
|
+
| `search` | `{ shortcut: '⌘K' }` (el placeholder por defecto ya es «Buscar…», con elipsis) y el layout **filtra** los items con `searchValue` (el componente no filtra). | buscador: práctica de la app (4 de 4) · `shortcut: '⌘K'`: práctica de la app (3 de 4; el cliente no lo pasa, `layouts/customer/customer-layout.html:12`) · la elipsis «…»: canon (CANON-SUI, copy); los 4 layouts todavía pasan «Buscar...» (ver «Bien y mal») |
|
|
52
52
|
| `indicatorColor` | Default `brand` (naranja). No se cambia. | canon del DS (accent = marca) |
|
|
53
53
|
| `collapsed` | Solo el cliente lo usa, con un item «colapsar», y **solo en web**: `[collapsed]="colapsado() && !bp.isMobile()"`. | práctica de la app (1 uso) |
|
|
54
54
|
|
|
@@ -87,6 +87,16 @@ con el fondo, con Escape, al tocar un item (`closeOnItemClick`) y —por el help
|
|
|
87
87
|
al terminar cualquier navegación. Cerrado queda `inert` y `aria-hidden`: el foco no se mete.
|
|
88
88
|
Respeta las safe areas de arriba, izquierda y abajo.
|
|
89
89
|
|
|
90
|
+
### Por dispositivo (D16)
|
|
91
|
+
|
|
92
|
+
El sidebar **no tiene `size`**: D16 (dueño, 05-10-2026) no le da un tamaño que pasar. El alto de los items lo pone el DS por
|
|
93
|
+
ancho: 52 en el cajón (≤ 767 px, `padding: 14px` + ícono 24) y 36 en la columna (> 767 px). Hueco conocido: una tablet táctil
|
|
94
|
+
(iPad, ≥ 768 px y `pointer: coarse`) recibe la columna con items de 36, bajo el piso de 44 que D16 pide para lo que se toca.
|
|
95
|
+
Queda **pendiente del DS** (el mixin `sui-tactil` de la propuesta de D16, que todavía espera el sí del dueño); desde la app no
|
|
96
|
+
se corrige.
|
|
97
|
+
|
|
98
|
+
En master-pedidos: no se pasa `size`; lo único que depende del dispositivo es `[collapsed]="colapsado() && !bp.isMobile()"`.
|
|
99
|
+
|
|
90
100
|
## «No usar»: por qué no hoy y cuándo sí
|
|
91
101
|
|
|
92
102
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -170,16 +180,62 @@ Slots: `[header-panel]` (debajo del header: el switcher), `[feature-card]` (al f
|
|
|
170
180
|
filtra los items (`master-layout.ts:125`). Su placeholder por defecto es «Buscar…» (en español desde el 04-10-2026).
|
|
171
181
|
- **`collapsed` no mira el viewport.** Con `collapsed` en `true`, el cajón de mobile también sale
|
|
172
182
|
de 80 px. Condiciónalo: `[collapsed]="colapsado() && !bp.isMobile()"`.
|
|
173
|
-
- Un item con `route`
|
|
174
|
-
`
|
|
175
|
-
|
|
176
|
-
|
|
183
|
+
- Un item con `route` (y sin `action`) queda activo **solo** por `routerLinkActive`, por prefijo:
|
|
184
|
+
`isItemActive()` devuelve `false` para todo item con `route` (`sui-sidebar.ts:411`), así que
|
|
185
|
+
`activeRoute` no lo toca. Un item sin `route` solo por `activeRoute`, y por `value` exacto
|
|
186
|
+
(`sui-sidebar.ts:379`): pasarle la URL actual no lo marca nunca.
|
|
187
|
+
- Cualquier `action` (no solo `'logout'`) anula el `route`: el item se pinta como `<button>`, no navega y
|
|
188
|
+
tampoco se marca activo (tiene `route`, así que `isItemActive()` da `false`, y no hay `routerLinkActive`).
|
|
177
189
|
- El `title` nativo del host se borra (sin tooltip gris); en colapsado el tooltip va en cada item.
|
|
178
190
|
- El cajón tiene `z-index: 300` sobre la barra inferior (200). Mientras está abierto el layout
|
|
179
191
|
esconde la barra (`customer-layout.ts:66`); si armas un layout nuevo, haz lo mismo.
|
|
180
192
|
- El comentario de cabecera del `.ts` todavía dice 240 px; el ancho real es 272 (`sui-sidebar.scss:50`).
|
|
181
193
|
- Los items ya traen el arreglo de iOS del `:active` pegado: no lo agregues.
|
|
182
194
|
|
|
195
|
+
## Bien y mal
|
|
196
|
+
|
|
197
|
+
**El buscador**
|
|
198
|
+
|
|
199
|
+
```html
|
|
200
|
+
<!-- ❌ mal: tres puntos sueltos en vez de elipsis. Así en components/sidebar/sidebar.html:48, layouts/driver/driver-layout.html:9 y layouts/master/master-layout.html:10; layouts/customer/customer-layout.html:12 pasa el mismo «Buscar...» sin `shortcut` -->
|
|
201
|
+
<sui-sidebar [search]="{ placeholder: 'Buscar...', shortcut: '⌘K' }"
|
|
202
|
+
[(searchValue)]="busqueda" [items]="items()" />
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```html
|
|
206
|
+
<!-- ✅ bien: sin placeholder sale «Buscar…»; el layout filtra `items()` con `busqueda` -->
|
|
207
|
+
<sui-sidebar [search]="{ shortcut: '⌘K' }"
|
|
208
|
+
[(searchValue)]="busqueda" [items]="items()" />
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
**Colapsar**
|
|
212
|
+
|
|
213
|
+
```html
|
|
214
|
+
<!-- ❌ mal: `collapsed` no mira el viewport; el cajón de mobile también sale de 80 px, solo íconos -->
|
|
215
|
+
<sui-sidebar [collapsed]="colapsado()" [items]="items()" [(mobileOpen)]="menuAbierto" />
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
```html
|
|
219
|
+
<!-- ✅ bien: se colapsa solo en web (layouts/customer/customer-layout.html:7) -->
|
|
220
|
+
<sui-sidebar [collapsed]="colapsado() && !bp.isMobile()" [items]="items()" [(mobileOpen)]="menuAbierto" />
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**El item activo**
|
|
224
|
+
|
|
225
|
+
```ts
|
|
226
|
+
// ❌ mal: navegar con `action` + `(itemClicked)` y `router.navigate`. El item se pinta como `<button>`,
|
|
227
|
+
// no como `<a routerLink>`, y nunca queda activo: sin `route`, `activeRoute` solo lo marca si es igual
|
|
228
|
+
// a su `value` (`sui-sidebar.ts:379`), y `[activeRoute]="currentUrl()"` nunca lo es
|
|
229
|
+
{ value: 'pedidos', label: 'Mis pedidos', icon: 'time-line', action: 'ir-a-pedidos' }
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
```ts
|
|
233
|
+
// ✅ bien: con `route` (y sin `action`) el item es un `<a routerLink>` y `routerLinkActive` lo marca por
|
|
234
|
+
// prefijo: `/cliente/pedidos/123` deja «Mis pedidos» activo sin pasar `activeRoute`
|
|
235
|
+
// (layouts/customer/customer-layout.ts:287)
|
|
236
|
+
{ value: 'pedidos', label: 'Mis pedidos', icon: 'time-line', route: '/cliente/pedidos' }
|
|
237
|
+
```
|
|
238
|
+
|
|
183
239
|
## Ejemplo
|
|
184
240
|
|
|
185
241
|
```html
|
|
@@ -188,12 +244,11 @@ Slots: `[header-panel]` (debajo del header: el switcher), `[feature-card]` (al f
|
|
|
188
244
|
[showHeaderButton]="true"
|
|
189
245
|
[headerButtonActive]="switcherOpen()"
|
|
190
246
|
(headerButtonClicked)="switcherOpen.set(!switcherOpen())"
|
|
191
|
-
[search]="{
|
|
247
|
+
[search]="{ shortcut: '⌘K' }"
|
|
192
248
|
[(searchValue)]="busqueda"
|
|
193
249
|
itemsLabel="Operación" [items]="items()"
|
|
194
250
|
secondaryItemsLabel="Dinero" [secondaryItems]="itemsDinero()"
|
|
195
251
|
supportingItemsLabel="Cuenta" [supportingItems]="itemsCuenta()"
|
|
196
|
-
[activeRoute]="currentUrl()"
|
|
197
252
|
[profile]="perfil()"
|
|
198
253
|
[(mobileOpen)]="menuAbierto"
|
|
199
254
|
[closeOnItemClick]="true"
|
|
@@ -73,7 +73,8 @@ va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
|
|
|
73
73
|
| slider con label (radio de cobertura, filtro de precio) | `large` (manija 24, riel 8) | `medium` (manija 16, riel 6) | canon (aprobado por el dueño, 03-10-2026) |
|
|
74
74
|
|
|
75
75
|
```html
|
|
76
|
-
|
|
76
|
+
<!-- D16, dueño 05-10-2026: `large` en todo lo táctil, `medium` con mouse -->
|
|
77
|
+
<sui-slider [size]="(bp.isMobile() || bp.toque()) ? 'large' : 'medium'" label="Radio de cobertura" amount="12 km"
|
|
77
78
|
[min]="1" [max]="15" [(value)]="radioKm" />
|
|
78
79
|
```
|
|
79
80
|
|
|
@@ -82,6 +83,24 @@ manija. Igual la barra mide menos de 44: el slider necesita aire arriba y abajo
|
|
|
82
83
|
manija en 0 o en 100 sobresale media manija (12 px en `large`) del borde de la barra: el
|
|
83
84
|
contenedor tiene que tener margen lateral.
|
|
84
85
|
|
|
86
|
+
### Por dispositivo (D16)
|
|
87
|
+
|
|
88
|
+
Fila `slider` de la tabla D16 (dueño, 05-10-2026). A diferencia del botón o el campo, el slider **no** tiene la excepción
|
|
89
|
+
«`medium` + área 44» en el celular chico: va `large` en todo lo que se toca.
|
|
90
|
+
|
|
91
|
+
| dispositivo | size | nota |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| celular chico (< 380 px) | `large` | manija 24, riel 8; con `medium` la manija de 16 es difícil de agarrar |
|
|
94
|
+
| celular (380–767 px) | `large` | |
|
|
95
|
+
| tablet táctil (`pointer: coarse`) | `large` | también se arrastra con el dedo |
|
|
96
|
+
| computadora (`pointer: fine`) | `medium` | manija 16, riel 6 (el de la guía del DS) |
|
|
97
|
+
|
|
98
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`.
|
|
99
|
+
|
|
100
|
+
En master-pedidos: `[size]="(bp.isMobile() || bp.toque()) ? 'large' : 'medium'"`. No hay helper propio. Hoy da lo mismo que
|
|
101
|
+
`bp.tactil()`, pero el servicio anuncia que `tactil` dejará fuera al celular chico cuando el DS estire el área de los
|
|
102
|
+
`medium`, y el slider tiene que seguir en `large` ahí.
|
|
103
|
+
|
|
85
104
|
## «No usar»: por qué no hoy y cuándo sí
|
|
86
105
|
|
|
87
106
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -138,10 +157,58 @@ Implementa `ControlValueAccessor` **solo para `single`**.
|
|
|
138
157
|
El lector lee el valor con su unidad: en single, el texto de `amount` («12 km»); en range (o sin
|
|
139
158
|
`amount`), el número + `unit`. En range cada manija se anuncia «<label>, mínimo» / «…, máximo».
|
|
140
159
|
|
|
160
|
+
## Bien y mal
|
|
161
|
+
|
|
162
|
+
**El valor arriba y flotando a la vez**
|
|
163
|
+
|
|
164
|
+
```html
|
|
165
|
+
<!-- ❌ mal: `amount` muestra «12 km» y el tooltip repite «12» sin unidad (components/driver-coverage-modal/driver-coverage-modal.html:83) -->
|
|
166
|
+
<sui-slider label="Radio de cobertura" [amount]="radiusKm() + ' km'"
|
|
167
|
+
[min]="minKm" [max]="maxKm" [tooltip]="true"
|
|
168
|
+
[value]="radiusKm()" (valueChange)="onRadiusChange($event)" />
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<!-- ✅ bien: con `amount`, sin tooltip -->
|
|
173
|
+
<sui-slider [size]="(bp.isMobile() || bp.toque()) ? 'large' : 'medium'"
|
|
174
|
+
label="Radio de cobertura" [amount]="radiusKm() + ' km'" [min]="minKm" [max]="maxKm"
|
|
175
|
+
[value]="radiusKm()" (valueChange)="onRadiusChange($event)" />
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
**El size en una pantalla del repartidor**
|
|
179
|
+
|
|
180
|
+
```html
|
|
181
|
+
<!-- ❌ mal: sin `size` sale `medium` (manija 16) en el teléfono (components/driver-coverage-modal/driver-coverage-modal.html:83) -->
|
|
182
|
+
<sui-slider label="Radio de cobertura" [amount]="radiusKm() + ' km'" [min]="minKm" [max]="maxKm"
|
|
183
|
+
[value]="radiusKm()" (valueChange)="onRadiusChange($event)" />
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
```html
|
|
187
|
+
<!-- ✅ bien: D16, `large` en todo lo táctil -->
|
|
188
|
+
<sui-slider [size]="(bp.isMobile() || bp.toque()) ? 'large' : 'medium'"
|
|
189
|
+
label="Radio de cobertura" [amount]="radiusKm() + ' km'" [min]="minKm" [max]="maxKm"
|
|
190
|
+
[value]="radiusKm()" (valueChange)="onRadiusChange($event)" />
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Un mínimo y un máximo**
|
|
194
|
+
|
|
195
|
+
```html
|
|
196
|
+
<!-- ❌ mal: dos sliders sueltos para un rango; nada impide que el mínimo pase al máximo -->
|
|
197
|
+
<sui-slider label="Precio mínimo" [min]="0" [max]="100" [(value)]="precioMin" />
|
|
198
|
+
<sui-slider label="Precio máximo" [min]="0" [max]="100" [(value)]="precioMax" />
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
```html
|
|
202
|
+
<!-- ✅ bien: una barra con dos manijas -->
|
|
203
|
+
<sui-slider type="range" label="Precio" [amount]="'S/ ' + precioMin() + ' – S/ ' + precioMax()"
|
|
204
|
+
[min]="0" [max]="100" [(minValue)]="precioMin" [(maxValue)]="precioMax" />
|
|
205
|
+
```
|
|
206
|
+
|
|
141
207
|
## Ejemplo
|
|
142
208
|
|
|
143
209
|
```html
|
|
144
210
|
<sui-slider
|
|
211
|
+
[size]="(bp.isMobile() || bp.toque()) ? 'large' : 'medium'"
|
|
145
212
|
label="Radio de cobertura"
|
|
146
213
|
[amount]="radioKm() + ' km'"
|
|
147
214
|
[min]="1" [max]="15" [step]="1"
|
|
@@ -98,7 +98,7 @@ con mouse, va un tamaño más chico. La app ya lo resuelve con `BreakpointsServi
|
|
|
98
98
|
|
|
99
99
|
```html
|
|
100
100
|
<sui-social-button brand="google" variantStyle="stroke" style="width: 100%"
|
|
101
|
-
[size]="bp.
|
|
101
|
+
[size]="bp.sizeControl()" (clicked)="loginGoogle()" /> <!-- D16, dueño 05-10-2026 -->
|
|
102
102
|
```
|
|
103
103
|
|
|
104
104
|
**Ancho completo**: `width: 100%` en el host estira el botón (arreglado en el DS el 03-10-2026 con
|
|
@@ -111,6 +111,23 @@ estira nunca. El host sigue siendo `inline-flex`: para el ancho completo va `wid
|
|
|
111
111
|
No se estira el alto con CSS desde afuera: el logo y el padding no escalan. Para el teléfono va
|
|
112
112
|
`size="large"`.
|
|
113
113
|
|
|
114
|
+
### Por dispositivo (D16)
|
|
115
|
+
|
|
116
|
+
Fila `social-button` de la tabla D16 (dueño, 05-10-2026), la misma que `sui-button`.
|
|
117
|
+
|
|
118
|
+
| dispositivo | size | nota |
|
|
119
|
+
|---|---|---|
|
|
120
|
+
| celular chico (< 380 px) | `large` (48) | interino: D16 pide `medium` con área tocable de 44; hasta que el DS la estire, se queda el grande (nota ¹ de D16) |
|
|
121
|
+
| celular (380–767 px) | `large` (48) | ancho completo, del mismo alto que el CTA de al lado |
|
|
122
|
+
| tablet táctil (`pointer: coarse`) | `large` (48) | con `bp.isMobile()` el iPad quedaba en `medium` 40 |
|
|
123
|
+
| computadora (`pointer: fine`) | `medium` (40) | |
|
|
124
|
+
|
|
125
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`; el formulario de login no se ensancha.
|
|
126
|
+
|
|
127
|
+
En master-pedidos: `[size]="bp.sizeControl()"`, el mismo helper que `sui-button` (devuelve `'large' | 'medium'`, los dos
|
|
128
|
+
sizes que tiene el componente). Hoy los 5 usos van con `bp.isMobile() ? 'large' : 'medium'`
|
|
129
|
+
(`pages/auth/login/login.html:39` y `:50`, `pages/auth/register/register.html:86`, `:87` y `:94`): se migran.
|
|
130
|
+
|
|
114
131
|
## «No usar»: por qué no hoy y cuándo sí
|
|
115
132
|
|
|
116
133
|
Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
|
|
@@ -160,12 +177,55 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
|
|
|
160
177
|
- El output es `(clicked)`.
|
|
161
178
|
- Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
|
|
162
179
|
|
|
180
|
+
## Bien y mal
|
|
181
|
+
|
|
182
|
+
**Google sin estilo**
|
|
183
|
+
|
|
184
|
+
```html
|
|
185
|
+
<!-- ❌ mal: `variantStyle` arranca en `filled` y el botón de Google sale rojo lleno -->
|
|
186
|
+
<sui-social-button brand="google" [size]="bp.sizeControl()" (clicked)="entrarConGoogle()" />
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```html
|
|
190
|
+
<!-- ✅ bien: Google en blanco con logo a color -->
|
|
191
|
+
<sui-social-button brand="google" variantStyle="stroke" [size]="bp.sizeControl()" (clicked)="entrarConGoogle()" />
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
**La fila de marcas en el registro**
|
|
195
|
+
|
|
196
|
+
```html
|
|
197
|
+
<!-- ❌ mal: solo ícono y dos marcas sin login, deshabilitadas de adorno (pages/auth/register/register.html:86-94) -->
|
|
198
|
+
<sui-social-button brand="x-twitter" variantStyle="stroke" [onlyIcon]="true" [disabled]="true" />
|
|
199
|
+
<sui-social-button brand="google" variantStyle="stroke" [onlyIcon]="true" (clicked)="onGoogleRegister()" />
|
|
200
|
+
<sui-social-button brand="linkedin" variantStyle="stroke" [onlyIcon]="true" [disabled]="true" />
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
```html
|
|
204
|
+
<!-- ✅ bien: lo mismo que el login, con texto y solo las marcas que tienen login -->
|
|
205
|
+
<sui-social-button brand="google" variantStyle="stroke" [size]="bp.sizeControl()"
|
|
206
|
+
style="width: 100%" [loading]="loading()" (clicked)="onGoogleRegister()" />
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
**El size por dispositivo**
|
|
210
|
+
|
|
211
|
+
```html
|
|
212
|
+
<!-- ❌ mal: solo mira el ancho; en el iPad (≥ 768, táctil) queda en `medium` 40 (pages/auth/login/login.html:39) -->
|
|
213
|
+
<sui-social-button brand="google" variantStyle="stroke"
|
|
214
|
+
[size]="bp.isMobile() ? 'large' : 'medium'" (clicked)="entrarConGoogle()" />
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
```html
|
|
218
|
+
<!-- ✅ bien: el helper de D16 -->
|
|
219
|
+
<sui-social-button brand="google" variantStyle="stroke"
|
|
220
|
+
[size]="bp.sizeControl()" (clicked)="entrarConGoogle()" />
|
|
221
|
+
```
|
|
222
|
+
|
|
163
223
|
## Ejemplo
|
|
164
224
|
|
|
165
225
|
```html
|
|
166
226
|
<!-- Login: Google en blanco, Apple negro lleno, los dos con texto -->
|
|
167
|
-
<sui-social-button brand="google" variantStyle="stroke" [loading]="cargandoGoogle()"
|
|
227
|
+
<sui-social-button brand="google" variantStyle="stroke" [size]="bp.sizeControl()" [loading]="cargandoGoogle()"
|
|
168
228
|
[disabled]="procesando()" (clicked)="entrarConGoogle()" />
|
|
169
|
-
<sui-social-button brand="apple" variantStyle="filled" [loading]="cargandoApple()"
|
|
229
|
+
<sui-social-button brand="apple" variantStyle="filled" [size]="bp.sizeControl()" [loading]="cargandoApple()"
|
|
170
230
|
[disabled]="procesando()" (clicked)="entrarConApple()" />
|
|
171
231
|
```
|
|
@@ -103,8 +103,10 @@ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026)
|
|
|
103
103
|
380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
|
|
104
104
|
computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
|
|
105
105
|
(< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
|
|
106
|
-
`xsmall`**, salvo lo que el componente solo tiene en chico.
|
|
107
|
-
`
|
|
106
|
+
`xsmall`**, salvo lo que el componente solo tiene en chico. En la app, `BreakpointsService` ya
|
|
107
|
+
separa el celular chico (`bp.celularChico()`, < 380 px), el celular (`bp.celular()`, 380–767) y la
|
|
108
|
+
pantalla táctil (`bp.toque()`); `bp.isMobile()` sola (≤ 767 px) mete al celular chico con el
|
|
109
|
+
celular, y para lo que no se toca eso está mal.
|
|
108
110
|
|
|
109
111
|
| size | alto | texto | ícono (caja) | punto |
|
|
110
112
|
|---|---|---|---|---|
|
|
@@ -121,14 +123,32 @@ escala de badge (12/14/16) se mantiene. No es táctil: no tiene foco ni output.
|
|
|
121
123
|
| uso | mobile | web | fuente |
|
|
122
124
|
|---|---|---|---|
|
|
123
125
|
| Estado en una fila, card o tabla | `large` (28) | `medium` (24) | canon (dueño, 05-10-2026, P1 b); el tamaño es extensión SUI aprobada (03-10-2026) |
|
|
124
|
-
| Estado principal de una pantalla de detalle (el pedido que se mira) | `xlarge` (32) | `medium` (24) |
|
|
126
|
+
| Estado principal de una pantalla de detalle (el pedido que se mira) | `xlarge` (32) | `medium` (24) | D16, dueño 05-10-2026 (tabla por componente: «`xlarge` en el detalle»); el tamaño es extensión SUI aprobada (03-10-2026) |
|
|
125
127
|
|
|
126
128
|
```html
|
|
127
|
-
<sui-status-badge status="completed" appearance="light" [size]="bp.
|
|
129
|
+
<sui-status-badge status="completed" appearance="light" [size]="bp.celular() ? 'large' : 'medium'">Entregado</sui-status-badge>
|
|
128
130
|
```
|
|
129
131
|
|
|
130
132
|
No se agranda con CSS en la pantalla: se pasa `size`.
|
|
131
133
|
|
|
134
|
+
### Por dispositivo (D16)
|
|
135
|
+
|
|
136
|
+
El status-badge no se toca: sube **solo en el celular de 380 px o más**. Fuente: D16, dueño
|
|
137
|
+
05-10-2026.
|
|
138
|
+
|
|
139
|
+
| dispositivo | size | nota |
|
|
140
|
+
|---|---|---|
|
|
141
|
+
| celular chico (< 380) | `medium` | no se toca: no sube aunque sea un celular |
|
|
142
|
+
| celular (380–767) | `large` (`xlarge` en el detalle) | un paso más que en la computadora |
|
|
143
|
+
| tablet táctil (`pointer: coarse`) | `medium` | no se toca: el puntero no cambia nada |
|
|
144
|
+
| computadora (`pointer: fine`) | `medium` | es el más chico que tiene; no hay `small` |
|
|
145
|
+
|
|
146
|
+
En el ultrawide, igual que en la computadora.
|
|
147
|
+
|
|
148
|
+
En master-pedidos no hay helper propio: `[size]="bp.celular() ? 'large' : 'medium'"` (es lo mismo
|
|
149
|
+
que devuelve `bp.sizeBadge()`, y los dos valores existen aquí). En el detalle:
|
|
150
|
+
`[size]="bp.celular() ? 'xlarge' : 'medium'"`.
|
|
151
|
+
|
|
132
152
|
## API
|
|
133
153
|
|
|
134
154
|
<!-- api:inicio -->
|
|
@@ -160,12 +180,50 @@ Slot: `<ng-content>` (el texto).
|
|
|
160
180
|
distintos a propósito.
|
|
161
181
|
- El host lleva `role="status"`: el lector de pantalla anuncia los cambios.
|
|
162
182
|
|
|
183
|
+
## Bien y mal
|
|
184
|
+
|
|
185
|
+
Distintivo del local
|
|
186
|
+
|
|
187
|
+
```html
|
|
188
|
+
<!-- ❌ mal: no es un trámite; pending con ícono propio se lee «algo avanza» (así estaba pages/customer/restaurant-menu/restaurant-menu.html hasta el 03-10-2026) -->
|
|
189
|
+
<sui-status-badge status="pending" icon="vip-crown-2-fill" appearance="light">Local exclusivo</sui-status-badge>
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
```html
|
|
193
|
+
<!-- ✅ bien: categoría o distinción → sui-badge (pink = destacado) -->
|
|
194
|
+
<sui-badge color="pink" type="left-icon" [size]="bp.sizeBadge()"><sui-icon data-slot="start" name="vip-crown-2-fill" [size]="16" />Local exclusivo</sui-badge>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
Estado del pedido
|
|
198
|
+
|
|
199
|
+
```html
|
|
200
|
+
<!-- ❌ mal: el pedido tiene más de cuatro estados (preparando, en camino…); «En camino» no es el final de un ciclo -->
|
|
201
|
+
<sui-status-badge status="information">En camino</sui-status-badge>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
```html
|
|
205
|
+
<!-- ✅ bien -->
|
|
206
|
+
<sui-badge color="blue" [size]="bp.sizeBadge()">En camino</sui-badge>
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Punto en una tabla densa
|
|
210
|
+
|
|
211
|
+
```html
|
|
212
|
+
<!-- ❌ mal: con light el fondo ya dice el color, el punto repite; y sin status sale verde (completed) -->
|
|
213
|
+
<sui-status-badge appearance="light" [withDot]="true">Desactivado</sui-status-badge>
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
```html
|
|
217
|
+
<!-- ✅ bien -->
|
|
218
|
+
<sui-status-badge status="disabled" [withDot]="true" [size]="bp.celular() ? 'large' : 'medium'">Desactivado</sui-status-badge>
|
|
219
|
+
```
|
|
220
|
+
|
|
163
221
|
## Ejemplo
|
|
164
222
|
|
|
165
223
|
```html
|
|
166
224
|
<!-- En una tabla de recargas: stroke (default) -->
|
|
167
|
-
<sui-status-badge status="pending">En revisión</sui-status-badge>
|
|
225
|
+
<sui-status-badge status="pending" [size]="bp.celular() ? 'large' : 'medium'">En revisión</sui-status-badge>
|
|
168
226
|
|
|
169
227
|
<!-- El estado es el dato principal de la card -->
|
|
170
|
-
<sui-status-badge status="failed" appearance="light">Rechazada</sui-status-badge>
|
|
228
|
+
<sui-status-badge status="failed" appearance="light" [size]="bp.celular() ? 'large' : 'medium'">Rechazada</sui-status-badge>
|
|
171
229
|
```
|
|
@@ -115,6 +115,23 @@ horizontal sigue en 24 de alto con `medium`: con `interactive` queda para web. L
|
|
|
115
115
|
Alto de cada pieza: horizontal `small` 20 y `medium` 24 (el indicador; la línea del texto mide lo
|
|
116
116
|
mismo) · puntos 4 / 8 / 10 · card vertical `small` 36 (8 + 20 + 8) y `medium` 44.
|
|
117
117
|
|
|
118
|
+
### Por dispositivo (D16)
|
|
119
|
+
|
|
120
|
+
`medium` es el size más grande del stepper, así que no cambia por dispositivo: va `medium` en
|
|
121
|
+
todos. Fuente: D16, dueño 05-10-2026 (tabla por componente).
|
|
122
|
+
|
|
123
|
+
| dispositivo | size | nota |
|
|
124
|
+
|---|---|---|
|
|
125
|
+
| celular chico (< 380) | `medium` | con `interactive`, los puntos se tocan en 22 × 44 |
|
|
126
|
+
| celular (380–767) | `medium` | no sube un paso: no hay uno más grande |
|
|
127
|
+
| tablet táctil (`pointer: coarse`) | `medium` | el área de 44 de los puntos hoy se prende solo hasta 767 px: en un iPad de 768 o más los puntos `interactive` se tocan en 10 × 10 |
|
|
128
|
+
| computadora (`pointer: fine`) | `medium` | nunca `small` (el default): hay que pasar `size` |
|
|
129
|
+
|
|
130
|
+
En el ultrawide, igual que en la computadora. `xsmall` solo para puntos sobre una foto o un banner
|
|
131
|
+
chico (ver `size`).
|
|
132
|
+
|
|
133
|
+
En master-pedidos: `size="medium"` fijo, sin helper (no depende del dispositivo).
|
|
134
|
+
|
|
118
135
|
## «No usar»: por qué no hoy y cuándo sí
|
|
119
136
|
|
|
120
137
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -168,6 +185,46 @@ type SuiStepperSize = 'small' | 'xsmall' | 'medium'; // medium: extensión SUI
|
|
|
168
185
|
- `errorStep` gana sobre `currentStep`: los anteriores quedan hechos y los siguientes por hacer.
|
|
169
186
|
- El activo usa `--sui-primary-base`, que en la app es naranja.
|
|
170
187
|
|
|
188
|
+
## Bien y mal
|
|
189
|
+
|
|
190
|
+
Stepper de un onboarding
|
|
191
|
+
|
|
192
|
+
```html
|
|
193
|
+
<!-- ❌ mal: sin size queda small, el default chico (pages/customer-onboarding/step-phone/step-phone.html:3 y los otros 6 onboardings) -->
|
|
194
|
+
<sui-stepper variant="horizontal" [steps]="stepLabels" [currentStep]="currentStep - 1" />
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<!-- ✅ bien -->
|
|
199
|
+
<sui-stepper variant="horizontal" [steps]="stepLabels" [currentStep]="currentStep - 1" size="medium" />
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Paso actual numerado desde 1
|
|
203
|
+
|
|
204
|
+
```html
|
|
205
|
+
<!-- ❌ mal: currentStep arranca en 0; con el número de la app marca como hecho el paso en pantalla -->
|
|
206
|
+
<sui-stepper [steps]="stepLabels" [currentStep]="currentStep" size="medium" />
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
```html
|
|
210
|
+
<!-- ✅ bien -->
|
|
211
|
+
<sui-stepper [steps]="stepLabels" [currentStep]="currentStep - 1" size="medium" />
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
Puntos que llevan a una página
|
|
215
|
+
|
|
216
|
+
```html
|
|
217
|
+
<!-- ❌ mal: sin interactive los puntos son div y stepClick nunca sale -->
|
|
218
|
+
<sui-stepper variant="dot" size="medium" [count]="paginas().length"
|
|
219
|
+
[currentStep]="pagina()" (stepClick)="irAPagina($event)" />
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
```html
|
|
223
|
+
<!-- ✅ bien (como pages/customer/store-browser/store-browser.html:214) -->
|
|
224
|
+
<sui-stepper variant="dot" size="medium" [count]="paginas().length" [currentStep]="pagina()"
|
|
225
|
+
[interactive]="true" ariaLabel="Páginas de rubros" (stepClick)="irAPagina($event)" />
|
|
226
|
+
```
|
|
227
|
+
|
|
171
228
|
## Ejemplo
|
|
172
229
|
|
|
173
230
|
```html
|