@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.
- package/docs/INDEX.md +136 -0
- package/docs/sui-alert/README.md +229 -0
- package/docs/sui-app-store-badge/README.md +137 -0
- package/docs/sui-avatar/README.md +263 -0
- package/docs/sui-avatar-group/README.md +115 -0
- package/docs/sui-badge/README.md +229 -0
- package/docs/sui-banner/README.md +190 -0
- package/docs/sui-brand-logo/README.md +143 -0
- package/docs/sui-breadcrumb-item/README.md +96 -0
- package/docs/sui-breadcrumbs/README.md +122 -0
- package/docs/sui-button/README.md +209 -0
- package/docs/sui-button-group/README.md +178 -0
- package/docs/sui-button-group-item/README.md +102 -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/README.md +147 -0
- package/docs/sui-checkbox-card/README.md +150 -0
- package/docs/sui-checkbox-label/README.md +143 -0
- package/docs/sui-circular-progress-bar/README.md +131 -0
- package/docs/sui-color-dot/README.md +112 -0
- package/docs/sui-color-picker/README.md +124 -0
- package/docs/sui-compact-avatar-group/README.md +103 -0
- package/docs/sui-compact-button/README.md +190 -0
- package/docs/sui-compact-select/README.md +127 -0
- package/docs/sui-compact-select-for-input/README.md +117 -0
- package/docs/sui-content-card/README.md +147 -0
- package/docs/sui-content-divider/README.md +124 -0
- package/docs/sui-content-label/README.md +148 -0
- package/docs/sui-counter-input/README.md +145 -0
- package/docs/sui-date-selector/README.md +98 -0
- package/docs/sui-datepicker/README.md +193 -0
- package/docs/sui-day-cell/README.md +118 -0
- package/docs/sui-day-label/README.md +81 -0
- package/docs/sui-divider/README.md +102 -0
- package/docs/sui-drawer-footer/README.md +127 -0
- package/docs/sui-drawer-header/README.md +140 -0
- package/docs/sui-emoji/README.md +138 -0
- package/docs/sui-empty-state/README.md +145 -0
- package/docs/sui-fancy-button/README.md +148 -0
- package/docs/sui-file-icon/README.md +103 -0
- package/docs/sui-file-upload/README.md +154 -0
- package/docs/sui-file-upload-card/README.md +129 -0
- package/docs/sui-flag/README.md +99 -0
- package/docs/sui-form-hint/README.md +124 -0
- package/docs/sui-form-label/README.md +148 -0
- package/docs/sui-icon/README.md +135 -0
- package/docs/sui-image-upload/README.md +200 -0
- package/docs/sui-image-upload-profile/README.md +145 -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 +244 -0
- package/docs/sui-integration-switch/README.md +142 -0
- package/docs/sui-kbd/README.md +97 -0
- package/docs/sui-key-icon/README.md +125 -0
- package/docs/sui-link-button/README.md +221 -0
- package/docs/sui-logo/README.md +152 -0
- package/docs/sui-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-pagination/README.md +146 -0
- package/docs/sui-password-strength/README.md +99 -0
- package/docs/sui-payment-icon/README.md +98 -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-progress-bar/README.md +132 -0
- package/docs/sui-progress-bar-label/README.md +143 -0
- package/docs/sui-radio/README.md +134 -0
- package/docs/sui-radio-card/README.md +160 -0
- package/docs/sui-radio-label/README.md +137 -0
- package/docs/sui-rating/README.md +199 -0
- package/docs/sui-rich-editor/README.md +114 -0
- package/docs/sui-segmented-control/README.md +144 -0
- package/docs/sui-select/README.md +180 -0
- package/docs/sui-slider/README.md +143 -0
- package/docs/sui-social-button/README.md +158 -0
- package/docs/sui-status-badge/README.md +164 -0
- package/docs/sui-stepper/README.md +166 -0
- package/docs/sui-store-card/README.md +147 -0
- package/docs/sui-switch/README.md +146 -0
- package/docs/sui-switch-card/README.md +149 -0
- package/docs/sui-switch-label/README.md +139 -0
- package/docs/sui-tab-chips/README.md +185 -0
- package/docs/sui-tab-menu-horizontal/README.md +142 -0
- package/docs/sui-tab-menu-vertical/README.md +136 -0
- package/docs/sui-tag/README.md +145 -0
- package/docs/sui-tag-input/README.md +120 -0
- package/docs/sui-textarea/README.md +157 -0
- package/docs/sui-time-picker/README.md +237 -0
- package/docs/sui-toast/README.md +190 -0
- package/docs/sui-tooltip/README.md +201 -0
- package/fesm2022/ajuarezso-sui-design-system.mjs +466 -279
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +367 -72
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-stepper
|
|
3
|
+
selector: sui-stepper
|
|
4
|
+
resumen: Indica en qué paso de un flujo con orden está la persona, cuánto hizo y cuánto le falta
|
|
5
|
+
alternativas: [sui-progress-bar (importa el porcentaje, no los pasos), sui-pagination (páginas de una lista), sui-tab-menu-horizontal (secciones sin orden)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-stepper
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Stepper](https://sui-design-system.web.app/?path=/docs/molecules-stepper--docs)
|
|
11
|
+
|
|
12
|
+
Ojo: es el **indicador de pasos** de un proceso. El «− 1 +» de cantidad es otra cosa
|
|
13
|
+
(`sui-counter-input` o los botones del producto).
|
|
14
|
+
|
|
15
|
+
## Cuándo usarlo / cuándo no
|
|
16
|
+
|
|
17
|
+
**Úsalo** cuando un flujo tiene **pasos con nombre y orden** y ayuda saber cuántos faltan: el alta
|
|
18
|
+
del local («Tu local → Producto»), del cliente («Ubicación → Teléfono»), del repartidor («Datos →
|
|
19
|
+
Vehículo → Listo»).
|
|
20
|
+
|
|
21
|
+
**No lo uses** para:
|
|
22
|
+
|
|
23
|
+
- Un avance que es porcentaje (subida de un archivo, perfil completo al 70 %): `sui-progress-bar`.
|
|
24
|
+
- Un pedido en curso (preparando, en camino, entregado): ese seguimiento tiene su propia línea de
|
|
25
|
+
tiempo y estados que no son pasos que la persona completa.
|
|
26
|
+
- Secciones que se visitan en cualquier orden: `sui-tab-menu-horizontal`.
|
|
27
|
+
- Un solo paso: no hay nada que indicar.
|
|
28
|
+
|
|
29
|
+
Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-bar · secciones sin orden → tab menu.**
|
|
30
|
+
|
|
31
|
+
## Qué variante usar
|
|
32
|
+
|
|
33
|
+
> **Lo que dice la guía del DS**: tiene tres piezas. El **de puntos**, «muy mínimo, usado a menudo
|
|
34
|
+
> como puntos de carrusel», con tamaños `small` y `xsmall`. El **horizontal**, «una guía visual de
|
|
35
|
+
> procesos secuenciales». El **vertical**, el mismo indicador «para layouts diversos», con una
|
|
36
|
+
> flecha en el paso activo. Estados de cada paso: `default`, `active`, `completed`. No trae do/don't.
|
|
37
|
+
>
|
|
38
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
39
|
+
> **7 usos en 7 archivos**, los 7 en los onboardings: todos `variant="horizontal"`, sin `size`
|
|
40
|
+
> (`small`), sin `interactive`, de 2 o 3 pasos.
|
|
41
|
+
|
|
42
|
+
### `variant`
|
|
43
|
+
|
|
44
|
+
| variant | cuándo | ejemplo real de la app | fuente |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| `horizontal` (default) | Flujo de **2 a 4 pasos** con nombre, arriba del contenido del paso. Mobile y web. | `pages/driver-onboarding/step-info/step-info.html:3` («Datos → Vehículo → Listo») | según la guía del DS (procesos secuenciales); el límite de pasos es propuesta |
|
|
47
|
+
| `vertical` | Flujo de **5+ pasos** en web, en una columna al costado del formulario. | (sin uso) | según la guía del DS (la pieza existe); el cuándo es propuesta |
|
|
48
|
+
| `dot` | Pantallas que se pasan de a una sin nombre: carrusel de bienvenida, fotos. | (sin uso) | según la guía del DS (puntos de carrusel) |
|
|
49
|
+
|
|
50
|
+
### `size`
|
|
51
|
+
|
|
52
|
+
| size | qué cambia | cuándo | fuente |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| `small` (default) | punto de 8 · indicador de 20 · texto 14 | Web. | según la guía del DS (`small` es su default) |
|
|
55
|
+
| `xsmall` | solo el punto: 4 px. Horizontal y vertical quedan igual que `small`. | Puntos sobre una foto o un banner chico, donde 8 px tapan. | según la guía del DS (el tamaño existe); el cuándo es propuesta |
|
|
56
|
+
| `medium` | punto de 10 · indicador de 24 · texto 16 · card vertical de 44 | Mobile. **Está en el repo del DS (03-10-2026), no en la versión publicada 0.19.0.** | canon (dueño: tamaño por plataforma, 03-10-2026) |
|
|
57
|
+
|
|
58
|
+
### Estado de cada paso (`currentStep`, `errorStep`)
|
|
59
|
+
|
|
60
|
+
| estado | cómo se logra | cuándo | fuente |
|
|
61
|
+
|---|---|---|---|
|
|
62
|
+
| `completed` | índice menor que `currentStep` | pasos ya hechos (check verde) | según la guía del DS |
|
|
63
|
+
| `active` | índice igual a `currentStep` | el paso en pantalla | según la guía del DS |
|
|
64
|
+
| `default` | índice mayor que `currentStep` | lo que falta | según la guía del DS |
|
|
65
|
+
| todos `completed` | `currentStep` = cantidad de pasos | la pantalla final («Listo») | propuesta, falta aprobación |
|
|
66
|
+
| `error` | `errorStep` = índice | un flujo que se cortó en ese paso (pago rechazado, documento no aprobado). Extensión de SUI. | propuesta, falta aprobación |
|
|
67
|
+
|
|
68
|
+
### `interactive`
|
|
69
|
+
|
|
70
|
+
| valor | cuándo | fuente |
|
|
71
|
+
|---|---|---|
|
|
72
|
+
| `false` (default) | Los onboardings: se avanza con el botón «Continuar», no tocando el paso. | propuesta, falta aprobación |
|
|
73
|
+
| `true` | Solo si los pasos hechos se pueden **volver a editar** y en web (el área tocable es chica, ver Tamaño). | propuesta, falta aprobación |
|
|
74
|
+
|
|
75
|
+
### `steps`, `count`, `ariaLabel`
|
|
76
|
+
|
|
77
|
+
| input | cuándo | fuente |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `steps` | Siempre en `horizontal` y `vertical`, con `label` en cada uno. | propuesta, falta aprobación |
|
|
80
|
+
| `count` | Solo en `dot`, cuando los pasos no tienen nombre. Si pasas `steps`, `count` se ignora. | según el código |
|
|
81
|
+
| `ariaLabel` | Default «Progreso». Cámbialo si hay más de un stepper en la pantalla («Pasos del registro»). | propuesta, falta aprobación |
|
|
82
|
+
|
|
83
|
+
**Usos de hoy que rompen las reglas:**
|
|
84
|
+
|
|
85
|
+
- **0 de variante o estado**: los 7 son horizontales de 2 o 3 pasos, y `step-complete` usa
|
|
86
|
+
`currentStep = stepLabels.length` para marcar todo hecho (`pages/driver-onboarding/step-complete/step-complete.html:3`).
|
|
87
|
+
- **7 sin tamaño por plataforma** (el `medium` todavía no está publicado): los onboardings se hacen
|
|
88
|
+
en el teléfono. Cuando se publique, `[size]="bp.isMobile() ? 'medium' : 'small'"`. Ejemplos:
|
|
89
|
+
`pages/customer-onboarding/step-phone/step-phone.html:3`, `pages/business-onboarding/step-info/step-info.html:3`.
|
|
90
|
+
|
|
91
|
+
## Tamaño en mobile y en web
|
|
92
|
+
|
|
93
|
+
| uso | mobile | web | fuente |
|
|
94
|
+
|---|---|---|---|
|
|
95
|
+
| horizontal arriba de un paso | `medium` (indicador 24, texto 16) | `small` (indicador 20, texto 14) | canon (dueño: tamaño por plataforma, 03-10-2026) |
|
|
96
|
+
| vertical al costado | no se usa (no entra al lado del formulario) | `small` | propuesta, falta aprobación |
|
|
97
|
+
| puntos de carrusel | `medium` (10) | `small` (8) | propuesta, falta aprobación |
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<sui-stepper [steps]="pasos" [currentStep]="paso - 1" [size]="bp.isMobile() ? 'medium' : 'small'" />
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Sin `interactive` el tamaño solo afecta lo que se lee. Con `interactive`, **ningún tamaño llega a
|
|
104
|
+
44 px tocables** en horizontal (24 de alto con `medium`) ni en puntos (10 px): por eso
|
|
105
|
+
`interactive` queda para web. La card vertical `medium` sí llega a 44.
|
|
106
|
+
|
|
107
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
108
|
+
|
|
109
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
110
|
+
|---|---|---|
|
|
111
|
+
| `vertical` | ningún flujo tiene 5+ pasos | un alta de local completa en web (datos, carta, horario, pagos, repartidores) |
|
|
112
|
+
| `dot` | ningún carrusel usa el componente | un carrusel de bienvenida o de fotos del producto |
|
|
113
|
+
| `xsmall` | no hay puntos sobre fotos | puntos sobre el banner del carrusel del home |
|
|
114
|
+
| `errorStep` | ningún flujo muestra dónde se cortó | el estado de una solicitud de repartidor rechazada en el paso «Documentos» |
|
|
115
|
+
| `interactive` | en los onboardings se avanza con el botón | un formulario largo en web donde se vuelve a corregir un paso hecho |
|
|
116
|
+
|
|
117
|
+
## API
|
|
118
|
+
|
|
119
|
+
<!-- api:inicio -->
|
|
120
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
121
|
+
|
|
122
|
+
| input | tipo | default |
|
|
123
|
+
|---|---|---|
|
|
124
|
+
| `variant` | `'dot' \| 'horizontal' \| 'vertical'` | `'horizontal'` |
|
|
125
|
+
| `steps` | `SuiStepperItem[]` | `[]` |
|
|
126
|
+
| `count` | `number` | `0` |
|
|
127
|
+
| `currentStep` | `number` | `0` |
|
|
128
|
+
| `errorStep` | `number \| null` | `null` |
|
|
129
|
+
| `size` | `'small' \| 'xsmall' \| 'medium'` | `'small'` |
|
|
130
|
+
| `interactive` | `boolean` | `false` |
|
|
131
|
+
| `ariaLabel` | `string` | `'Progreso'` |
|
|
132
|
+
|
|
133
|
+
| output | payload |
|
|
134
|
+
|---|---|
|
|
135
|
+
| `stepClick` | `number` |
|
|
136
|
+
<!-- api:fin -->
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
interface SuiStepperItem {
|
|
140
|
+
label?: string; // sin label sale «Paso N»
|
|
141
|
+
}
|
|
142
|
+
type SuiStepperVariant = 'dot' | 'horizontal' | 'vertical';
|
|
143
|
+
type SuiStepperSize = 'small' | 'xsmall' | 'medium'; // medium: repo del DS, no en 0.19.0
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Trampas
|
|
147
|
+
|
|
148
|
+
- **`currentStep` arranca en 0.** La app numera los pasos desde 1: por eso los onboardings pasan
|
|
149
|
+
`currentStep - 1`.
|
|
150
|
+
- **Un paso sin `label` dice «Paso 2»** (hasta el 03-10-2026 decía «Step 2»).
|
|
151
|
+
- **`xsmall` solo achica los puntos**: en horizontal y vertical se ve igual que `small`.
|
|
152
|
+
- **El horizontal hace `flex-wrap`**: con muchos pasos o nombres largos baja a otra línea en vez de
|
|
153
|
+
cortarse. Con 4+ pasos en mobile, revisa a 390 px.
|
|
154
|
+
- **`stepClick` solo sale con `interactive`**; sin él los pasos son `div` y no responden.
|
|
155
|
+
- `errorStep` gana sobre `currentStep`: los anteriores quedan hechos y los siguientes por hacer.
|
|
156
|
+
- El activo usa `--sui-primary-base`, que en la app es naranja.
|
|
157
|
+
|
|
158
|
+
## Ejemplo
|
|
159
|
+
|
|
160
|
+
```html
|
|
161
|
+
<sui-stepper
|
|
162
|
+
variant="horizontal"
|
|
163
|
+
[steps]="[{ label: 'Datos' }, { label: 'Vehículo' }, { label: 'Listo' }]"
|
|
164
|
+
[currentStep]="1"
|
|
165
|
+
[size]="bp.isMobile() ? 'medium' : 'small'" />
|
|
166
|
+
```
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-store-card
|
|
3
|
+
selector: sui-store-card
|
|
4
|
+
resumen: Tarjeta de un local para los listados del cliente con portada, logo, abierto/cerrado, favorito, nota, ubicación, envío y distancia
|
|
5
|
+
alternativas: [sui-product-card (un producto, no un local), sui-content-card (un local en una fila de un panel, sin portada), sui-card (cualquier otro contenido)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-store-card
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Card/Store Card](https://sui-design-system.web.app/?path=/docs/molecules-card-store-card--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para un local en un listado que ve el cliente (favoritos) y para la vista previa de un
|
|
15
|
+
local que el super admin aprueba o que el dueño revisa antes de publicar.
|
|
16
|
+
|
|
17
|
+
**No lo uses** para:
|
|
18
|
+
|
|
19
|
+
- Un local en una tabla o un ranking de un panel: `sui-content-card` o una fila (sin portada).
|
|
20
|
+
- Un producto: `sui-product-card`.
|
|
21
|
+
- Fuera de la app de Master Pedidos: el link va fijo a `/cliente/restaurante/:id` (ver Trampas).
|
|
22
|
+
|
|
23
|
+
Regla corta: **local en un listado del cliente → store-card · local en un panel → content-card.**
|
|
24
|
+
|
|
25
|
+
## Qué variante usar
|
|
26
|
+
|
|
27
|
+
> **La guía del DS no tiene página de la store card.** Es un componente propio de SUI. Igual que
|
|
28
|
+
> la product card, **dibuja, no decide**: el texto del envío y de la distancia le llega escrito
|
|
29
|
+
> (`deliveryText`, `distanceText`) desde que la tarjeta y el checkout cobraban distinto.
|
|
30
|
+
>
|
|
31
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **2
|
|
32
|
+
> store-cards en 2 archivos**: favoritos del cliente (`pages/customer/favorites/favorites.html:121`,
|
|
33
|
+
> con `deliveryText` y `distanceText`) y la cola de aprobación
|
|
34
|
+
> (`pages/super-admin/master-approvals/master-approvals.html:32`, en vista previa). El inicio del
|
|
35
|
+
> cliente arma sus filas de locales con clases propias.
|
|
36
|
+
|
|
37
|
+
### Los estados (salen de `store`)
|
|
38
|
+
|
|
39
|
+
| estado | cuándo | fuente |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `isOpen: true` | Abierto: chip verde «Abierto». | propuesta |
|
|
42
|
+
| `isOpen: false` | Cerrado: chip «Cerrado» y la portada en gris; sigue abriendo la carta (se puede mirar). | propuesta |
|
|
43
|
+
| `isSuspended: true` | No se puede pedir: «No disponible», toda la tarjeta al 60 % y sin link. | propuesta |
|
|
44
|
+
| `isOwnerPreview` + `ownerPreviewStatus` | Vista previa: «Borrador», «En revisión» o «Rechazado»; sin corazón, sin nota ni distancia (solo ubicación y envío). | propuesta |
|
|
45
|
+
|
|
46
|
+
### Las piezas
|
|
47
|
+
|
|
48
|
+
| prop | cuándo | fuente |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `store` (obligatorio) | Siempre, con `SuiStoreCardData`. | propuesta |
|
|
51
|
+
| `deliveryText` string | **Siempre en pantallas nuevas**: el texto del envío calculado por la app (`StateService.computeDeliveryFee`). | propuesta (precedente: favoritos) |
|
|
52
|
+
| `deliveryText = null` | No hay envío que mostrar: la columna desaparece y el distrito deja de cortarse. | propuesta |
|
|
53
|
+
| `deliveryText` sin pasar | La tarjeta lo deduce de `deliveryType` (Gratis / Recojo / Courier / S/ X). Solo para no romper lo viejo. | propuesta |
|
|
54
|
+
| `distanceText` | Lo mismo para la distancia: un rango mientras es estimada («menos de 500 m»), el número cuando la ruta se midió («475 m»). `null` la quita. | propuesta |
|
|
55
|
+
| `isFavorite` + `(toggleFavorite)` | El corazón lleno o vacío; el padre guarda el favorito. | propuesta |
|
|
56
|
+
| `(ratingClicked)` | La nota abre las opiniones y la info del local (`StoreRatingsModalService`). | propuesta |
|
|
57
|
+
| `disableLink` | La tarjeta no navega (una vitrina, una lámina, una vista previa). | propuesta |
|
|
58
|
+
|
|
59
|
+
**Usos de hoy que rompen las reglas:** 0. A mirar: la cola de aprobación no pasa
|
|
60
|
+
`deliveryText` (deduce el envío del `deliveryType`).
|
|
61
|
+
|
|
62
|
+
## Tamaño en mobile y en web
|
|
63
|
+
|
|
64
|
+
El ancho lo da el contenedor. El `size` cambia **el corazón de favorito**, en la escala del
|
|
65
|
+
`sui-button`:
|
|
66
|
+
|
|
67
|
+
| size | corazón | glyph | fuente |
|
|
68
|
+
|---|---|---|---|
|
|
69
|
+
| `small` (default) | 36 × 36 | 18 | lo que había en el DS |
|
|
70
|
+
| `medium` | 40 × 40 | 20 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
|
|
71
|
+
|
|
72
|
+
| uso | mobile | web | fuente |
|
|
73
|
+
|---|---|---|---|
|
|
74
|
+
| tarjeta | ancho completo | celda de una grilla de 2–3 columnas (≥ 300 de ancho) | lo que hay en la app |
|
|
75
|
+
| corazón de favorito | `medium` (40) | `small` (36) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
|
|
76
|
+
| nota (abre las opiniones) | el alto de su columna (~40) | ~40 | lo que hay en el DS |
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<sui-store-card [store]="local" [size]="bp.isMobile() ? 'medium' : 'small'" />
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
83
|
+
|
|
84
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| `deliveryText` / `distanceText` sin pasar | la tarjeta deduciría un precio distinto del checkout | nunca en pantallas nuevas |
|
|
87
|
+
| la tarjeta en un ancho menor a ~300 | la fila de 4 datos se pisa | nunca: con menos ancho, pasa `null` a la distancia o al envío |
|
|
88
|
+
|
|
89
|
+
## API
|
|
90
|
+
|
|
91
|
+
<!-- api:inicio -->
|
|
92
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
93
|
+
|
|
94
|
+
| input | tipo | default |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `store` | `SuiStoreCardData` | — (requerido) |
|
|
97
|
+
| `isFavorite` | `boolean` | `false` |
|
|
98
|
+
| `disableLink` | `boolean` | `false` |
|
|
99
|
+
| `linkBase` | `string` | `'/cliente/restaurante'` |
|
|
100
|
+
| `size` | `'small' \| 'medium'` | `'small'` |
|
|
101
|
+
| `deliveryText` | `string \| null` | `undefined` |
|
|
102
|
+
| `distanceText` | `string \| null` | `undefined` |
|
|
103
|
+
|
|
104
|
+
| output | payload |
|
|
105
|
+
|---|---|
|
|
106
|
+
| `toggleFavorite` | `Event` |
|
|
107
|
+
| `ratingClicked` | `{ id: string; name: string; logoUrl: string \| null }` |
|
|
108
|
+
<!-- api:fin -->
|
|
109
|
+
|
|
110
|
+
`SuiStoreCardData`: `id`, `name` y opcionales `businessType`, `district`, `rating`,
|
|
111
|
+
`reviewCount`, `distanceKm`, `deliveryFee`, `deliveryType`, `offersPickup`, `isOpen`,
|
|
112
|
+
`isSuspended`, `isOwnerPreview`, `ownerPreviewStatus`, `ownerRejectionReason`,
|
|
113
|
+
`isOwnerApproved`, `logoUrl`, `coverUrl`.
|
|
114
|
+
|
|
115
|
+
## Trampas
|
|
116
|
+
|
|
117
|
+
- **El link va a `[linkBase, store.id]`** (`RouterLink` adentro). `linkBase` es
|
|
118
|
+
`'/cliente/restaurante'` por defecto (la ruta del cliente de Master Pedidos); otra app pasa la
|
|
119
|
+
suya. Para no navegar, `disableLink`.
|
|
120
|
+
- **Los botones (corazón, nota) viven dentro del `<a>`** de la tarjeta: un control interactivo
|
|
121
|
+
dentro de un link es HTML inválido. Cortan la propagación y el `preventDefault`, así que
|
|
122
|
+
funcionan; queda pendiente pasarla al patrón de `sui-product-card` (link estirado).
|
|
123
|
+
- **`null` y «no pasar» no son lo mismo** en `deliveryText` / `distanceText`: `null` quita la
|
|
124
|
+
columna, `undefined` la deduce.
|
|
125
|
+
- La nota sale como «4.62 (38)», con punto y hasta dos decimales; **sin opiniones dice «5.0
|
|
126
|
+
(0)»** a propósito (el cero se ve).
|
|
127
|
+
- `ownerRejectionReason` e `isOwnerApproved` están en la interfaz pero la tarjeta **no los
|
|
128
|
+
dibuja**: el motivo del rechazo y el aviso de «ya estás público» van afuera.
|
|
129
|
+
- Un `distanceText` largo («menos de 500 m») en una tarjeta angosta **parte en dos líneas** por
|
|
130
|
+
palabras (desde 03-10-2026; antes se salía de su columna). La columna no baja de 64 px; la nota
|
|
131
|
+
y el envío no se encogen, y el distrito se recorta con «…».
|
|
132
|
+
- La portada carga con `loading="lazy"` y reintenta sola (`suiImgRetry`); sin portada queda el
|
|
133
|
+
degradé oscuro.
|
|
134
|
+
- Los íconos usan `color="var(--sui-primary-base, #fa7319)"`: el hex es respaldo, no se repite
|
|
135
|
+
afuera.
|
|
136
|
+
|
|
137
|
+
## Ejemplo
|
|
138
|
+
|
|
139
|
+
```html
|
|
140
|
+
<sui-store-card
|
|
141
|
+
[store]="local"
|
|
142
|
+
[isFavorite]="true"
|
|
143
|
+
[deliveryText]="envioDeLaTarjeta(local)"
|
|
144
|
+
[distanceText]="distanciaDeLaTarjeta(local)"
|
|
145
|
+
(toggleFavorite)="quitarFavorito(local.id)"
|
|
146
|
+
(ratingClicked)="abrirOpiniones($event)" />
|
|
147
|
+
```
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-switch
|
|
3
|
+
selector: sui-switch
|
|
4
|
+
resumen: Interruptor solo para prender o apagar algo que se aplica al instante, sin texto propio
|
|
5
|
+
alternativas: [sui-switch-label (interruptor con su texto, el caso normal), sui-switch-card (cada ajuste es una tarjeta), sui-integration-switch (fila de integración con logo), sui-checkbox (valor que se confirma después con un botón)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-switch
|
|
9
|
+
|
|
10
|
+
Story: [Atoms/Checkbox, Radio & Switch/Switch](https://sui-design-system.web.app/?path=/docs/atoms-checkbox-radio-switch-switch--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para prender o apagar algo que **se aplica en el momento**, sin botón de guardar:
|
|
15
|
+
la disponibilidad de un producto, un cupón activo, un día del horario, una oferta. Pelado,
|
|
16
|
+
solo cuando el texto vive en otra parte: una celda de tabla con su cabecera, una fila con su
|
|
17
|
+
propio título (día de la semana, tarjeta de la oferta).
|
|
18
|
+
|
|
19
|
+
**No lo uses** para:
|
|
20
|
+
|
|
21
|
+
- **Un interruptor con su texto al lado** (casi siempre): `sui-switch-label`, que trae label,
|
|
22
|
+
descripción y el toque en toda la fila.
|
|
23
|
+
- Un valor de formulario que se confirma con «Guardar»: `sui-checkbox`. (Excepción aceptada hoy:
|
|
24
|
+
los formularios de producto y de planes usan switch para «disponible»/«activo» aunque se guarden
|
|
25
|
+
después; es el patrón que la persona reconoce.)
|
|
26
|
+
- Algo destructivo o que no se deshace: el switch promete que se puede volver atrás al toque.
|
|
27
|
+
- Elegir entre dos modos con nombre: `sui-segmented-control` si se aplica al instante (cuadrícula /
|
|
28
|
+
lista); `sui-radio-card` si se guarda después («Por distancia» / «Precio único» en ajustes).
|
|
29
|
+
|
|
30
|
+
Regla corta: **se aplica ya → switch · se confirma después → checkbox · dos modos con nombre → segmented (inmediato) o radio-card (se guarda).**
|
|
31
|
+
|
|
32
|
+
## Qué variante usar
|
|
33
|
+
|
|
34
|
+
> **La guía del DS lo define en una frase**: se usa «para prender o apagar un ajuste de forma
|
|
35
|
+
> inmediata». Muestra deshabilitado, con label y con label avanzado. No dice nada de tamaños.
|
|
36
|
+
>
|
|
37
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
|
|
38
|
+
> **29 switches en 13 archivos**. Tamaños: 25 `bp.controlSize()` / `ctrlSize()` (`large` en
|
|
39
|
+
> desktop, `xlarge` en mobile), 1 `xlarge` fijo, 1 `large` fijo y 2 sin `size` (`medium`, el
|
|
40
|
+
> default). Más **1 `<input type="checkbox">` dibujado como
|
|
41
|
+
> switch**.
|
|
42
|
+
|
|
43
|
+
### Estado (`checked`, `disabled`)
|
|
44
|
+
|
|
45
|
+
| estado | cuándo | fuente |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| prendido / apagado | `[(checked)]` o `[checked]` + `(checkedChange)`. | según la guía del DS |
|
|
48
|
+
| `disabled` | Mientras se guarda el cambio (`[disabled]="guardando()"`) o cuando no aplica. | según la guía del DS (existe); el «cuándo» ya es práctica de la app |
|
|
49
|
+
|
|
50
|
+
### `size`
|
|
51
|
+
|
|
52
|
+
| size | px | cuándo | fuente |
|
|
53
|
+
|---|---|---|---|
|
|
54
|
+
| `xlarge` | 48 × 28 | Mobile, vía `bp.controlSize()`. Y en tarjetas donde el switch es la acción principal (ofertas de Central). | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
|
|
55
|
+
| `large` | 40 × 24 | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
56
|
+
| `medium` (default) | 32 × 20 | No usar en pantallas nuevas (ver abajo). Es el único tamaño de la guía. | canon (aprobado por el dueño, 28-09-2026) |
|
|
57
|
+
|
|
58
|
+
### La etiqueta dice lo que hace, no el estado
|
|
59
|
+
|
|
60
|
+
| caso | regla | fuente |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| Texto al lado del switch | Dice **qué hace prenderlo** y no cambia con el estado: «Recibir pedidos», no «Sucursal en pausa». El estado ya lo dice el switch (y un badge si hace falta). | propuesta, falta aprobación (precedente escrito en `pages/schedule/schedule.html:31`) |
|
|
63
|
+
|
|
64
|
+
**Usos de hoy que rompen las reglas:**
|
|
65
|
+
|
|
66
|
+
- **19 switches con su texto armado a mano → `sui-switch-label`.** Ejemplos:
|
|
67
|
+
`pages/discounts/discounts.html:198` («Un uso por cliente», con `sui-form-label` + `<span>`),
|
|
68
|
+
`pages/drivers/drivers.html:58` («Aceptar pedidos automáticamente»),
|
|
69
|
+
`pages/super-admin/master-plans/master-plans.html:90` («Plan activo», y 8 más en ese archivo).
|
|
70
|
+
El resto: `discounts.html:302`, `pages/super-admin/master-map-overview/master-map-overview.html:67`,
|
|
71
|
+
`pages/schedule/schedule.html:46`, `components/add-product-modal/add-product-modal.html:196`, `:255`, `:280`,
|
|
72
|
+
`components/option-sections-manager/option-sections-manager.html:107`, `:123`.
|
|
73
|
+
- **3 con la etiqueta que repite el estado** («Disponible» / «No disponible», «Activo»):
|
|
74
|
+
`components/option-sections-manager/option-sections-manager.html:143`,
|
|
75
|
+
`components/add-product-modal/add-product-modal.html:303`, `pages/employees/employees.html:99`.
|
|
76
|
+
- **2 en `medium` (sin `size`):** `pages/drivers/drivers.html:58`,
|
|
77
|
+
`pages/super-admin/master-map-overview/master-map-overview.html:67`.
|
|
78
|
+
- **1 nativo dibujado como switch:** `components/settings-panel/settings-panel.html:97`
|
|
79
|
+
(«Notificaciones Push») → `sui-switch-label`.
|
|
80
|
+
|
|
81
|
+
Bien pelados (el texto vive en la fila o la tabla): `pages/discounts/discounts.html:96` (columna
|
|
82
|
+
de la tabla), `pages/super-admin/master-settings/master-settings.html:103`, los días de
|
|
83
|
+
`components/weekly-schedule-editor/weekly-schedule-editor.html:5` y
|
|
84
|
+
`pages/driver/driver-schedule/driver-schedule.html:108`, `pages/central/central-ofertas/central-ofertas.html:19`.
|
|
85
|
+
|
|
86
|
+
## Tamaño en mobile y en web
|
|
87
|
+
|
|
88
|
+
| uso | mobile | web |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| switch en una fila, tabla o tarjeta | `xlarge` (48 × 28) | `large` (40 × 24) |
|
|
91
|
+
| switch que es la acción principal de la tarjeta (ofertas de Central) | `xlarge` | `xlarge` |
|
|
92
|
+
|
|
93
|
+
```html
|
|
94
|
+
<sui-switch [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
El más grande mide 28 px de alto: el toque cómodo (≥ 44 px) lo da la fila; por eso con texto
|
|
98
|
+
va `sui-switch-label`, que hace tocable todo el bloque.
|
|
99
|
+
|
|
100
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
101
|
+
|
|
102
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
103
|
+
|---|---|---|
|
|
104
|
+
| `size="medium"` | en el teléfono se pierde (el dueño lo marcó en Central, 28-09-2026) | una tabla densa solo de desktop donde 24 px desalinea la fila |
|
|
105
|
+
| pelado con texto al lado | lo hace `sui-switch-label` con el toque en toda la fila | nunca; pelado solo si el texto vive en otra columna o en el título de la tarjeta |
|
|
106
|
+
|
|
107
|
+
## API
|
|
108
|
+
|
|
109
|
+
<!-- api:inicio -->
|
|
110
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
111
|
+
|
|
112
|
+
| input | tipo | default |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
115
|
+
| `checked` | `boolean` | `false` |
|
|
116
|
+
| `disabled` | `boolean` | `false` |
|
|
117
|
+
|
|
118
|
+
| output | payload |
|
|
119
|
+
|---|---|
|
|
120
|
+
| `checkedChange` | `boolean` |
|
|
121
|
+
<!-- api:fin -->
|
|
122
|
+
|
|
123
|
+
Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
|
|
124
|
+
|
|
125
|
+
## Trampas
|
|
126
|
+
|
|
127
|
+
- **Es controlado: no se mueve solo.** `[checked]` sin `(checkedChange)` ni `[(checked)]` = el
|
|
128
|
+
toque no hace nada visible. Es a propósito: el padre puede rechazar el cambio (abrir una
|
|
129
|
+
confirmación, revertir si falla el guardado).
|
|
130
|
+
- Con `formControlName` sí guarda su propio estado; a partir de ahí **ignora `[checked]`**. No
|
|
131
|
+
mezcles las dos formas.
|
|
132
|
+
- `disabled` no baja la opacidad: cambia el color y achica el círculo. Un `opacity` encima lo duplica.
|
|
133
|
+
- No tiene `aria-label`: pelado, pásalo con `[attr.aria-label]` (como en `central-ofertas`).
|
|
134
|
+
- Ya trae el arreglo de iOS para el `:active` pegado.
|
|
135
|
+
|
|
136
|
+
## Ejemplo
|
|
137
|
+
|
|
138
|
+
```html
|
|
139
|
+
<!-- Pelado en una tarjeta que ya tiene su título -->
|
|
140
|
+
<sui-switch [size]="bp.controlSize()" [checked]="oferta.activo" [disabled]="guardando()"
|
|
141
|
+
[attr.aria-label]="'Prender ' + oferta.titulo" (checkedChange)="prender(oferta, $event)" />
|
|
142
|
+
|
|
143
|
+
<!-- Con texto: sui-switch-label -->
|
|
144
|
+
<sui-switch-label [size]="bp.controlSize()" label="Recibir pedidos" [flip]="true"
|
|
145
|
+
[(active)]="abierto" />
|
|
146
|
+
```
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sui-switch-card
|
|
3
|
+
selector: sui-switch-card
|
|
4
|
+
resumen: Ajuste con tarjeta (ícono, título, descripción y el interruptor) que se aplica al instante
|
|
5
|
+
alternativas: [sui-switch-label (el mismo ajuste sin tarjeta, en una lista de ajustes), sui-integration-switch (una integración con logo y «Administrar»), sui-checkbox-card (varias opciones que se guardan con «Guardar»)]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# sui-switch-card
|
|
9
|
+
|
|
10
|
+
Story: [Molecules/Card/Switch Card](https://sui-design-system.web.app/?path=/docs/molecules-card-switch-card--docs)
|
|
11
|
+
|
|
12
|
+
## Cuándo usarlo / cuándo no
|
|
13
|
+
|
|
14
|
+
**Úsalo** para un ajuste que se prende o se apaga **al toque**, sin botón de guardar, y que merece
|
|
15
|
+
su propia tarjeta: «Notificaciones», «Ubicación siempre», «Recibir pedidos de la plataforma»,
|
|
16
|
+
«Repartidores propios», «Disponible».
|
|
17
|
+
|
|
18
|
+
**No lo uses** para:
|
|
19
|
+
|
|
20
|
+
- Algo que se confirma después con «Guardar»: `sui-checkbox-card` (canon del switch-label).
|
|
21
|
+
- Una lista larga de ajustes parecidos: `sui-switch-label` con `flip`, uno por fila.
|
|
22
|
+
- Una integración con otro servicio (logo + «Administrar»): `sui-integration-switch`.
|
|
23
|
+
- Algo destructivo o que no se deshace: un botón con confirmación.
|
|
24
|
+
|
|
25
|
+
Regla corta: **ajuste con peso, al toque → switch-card · lista de ajustes → switch-label con flip
|
|
26
|
+
· se guarda después → checkbox-card.**
|
|
27
|
+
|
|
28
|
+
## Qué variante usar
|
|
29
|
+
|
|
30
|
+
> **La guía del DS no tiene página de la switch card.** De la guía sale lo del switch que lleva
|
|
31
|
+
> adentro: **«para prender o apagar un ajuste de forma inmediata»**.
|
|
32
|
+
>
|
|
33
|
+
> Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **26
|
|
34
|
+
> switch-cards en 8 archivos**. Tipos: 19 `left-icon` (los 19 con el ícono proyectado), 7 `basic`
|
|
35
|
+
> (5 de ellos sin `type`). Tamaños: 20 `bp.controlSize()`, 6 sin `size`. 10 viven en formularios
|
|
36
|
+
> que se guardan con un botón.
|
|
37
|
+
|
|
38
|
+
### `type` (el leading)
|
|
39
|
+
|
|
40
|
+
| type | cuándo | fuente |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| `left-icon` + ícono proyectado | Lo normal: `<sui-icon sui-switch-card-leading name="…" [size]="20" />`. | propuesta (19 de 26) |
|
|
43
|
+
| `left-icon` + `emoji` | Ver «No usar». | propuesta |
|
|
44
|
+
| `basic` | El ajuste es EL tema de la pantalla y no necesita ícono («Disponible» en el inicio del repartidor, «Disponibilidad automática»). | propuesta |
|
|
45
|
+
| `avatar` (`imageUrl`) | Ver «No usar». | propuesta |
|
|
46
|
+
| `card-provider`, `brand`, `company` (`imageUrl` o proyectado) | Ver «No usar». | propuesta |
|
|
47
|
+
|
|
48
|
+
### Las piezas
|
|
49
|
+
|
|
50
|
+
| prop | cuándo | fuente |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| `label` | Siempre. Qué hace prenderlo, sin cambiar con el estado: «Notificaciones», no «Activadas / Desactivadas». | propuesta (misma regla que el switch-label) |
|
|
53
|
+
| `description` | La consecuencia o el estado real del permiso: «Push activado — recibes alertas cuando se te asigna un pedido.» | propuesta |
|
|
54
|
+
| `sublabel` | Precisión corta: «(beta)». | propuesta |
|
|
55
|
+
| `badge` | Solo novedad. Con string sale azul `light`. | propuesta |
|
|
56
|
+
| `disabled` | Mientras se guarda el cambio, o cuando no aplica (no puedes estar disponible sin saldo). | propuesta |
|
|
57
|
+
| `checked` + `(checkedChange)` | Siempre los dos: es controlada. | propuesta |
|
|
58
|
+
|
|
59
|
+
### `size` (el interruptor de adentro)
|
|
60
|
+
|
|
61
|
+
| size | cuándo | fuente |
|
|
62
|
+
|---|---|---|
|
|
63
|
+
| `xlarge` (48 × 28) | Mobile, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
|
|
64
|
+
| `large` (40 × 24) | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
65
|
+
| `medium` (default) | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
|
|
66
|
+
|
|
67
|
+
**Usos de hoy que rompen las reglas:**
|
|
68
|
+
|
|
69
|
+
- **10 switch-cards en formularios que se guardan con un botón** (van `sui-checkbox-card`): los 5
|
|
70
|
+
métodos de pago de `pages/mi-negocio/mi-negocio.html:1181`–`:1217` («Guardar cambios») y 5 de
|
|
71
|
+
`pages/super-admin/master-settings/master-settings.html` (`:36` «Pausar los pedidos», `:179`,
|
|
72
|
+
`:336`, `:342`, `:349`, cada uno con su «Guardar…» abajo).
|
|
73
|
+
- **6 sin `size`**: los 5 de `master-settings` de arriba y `pages/notifications/notifications.html:59`
|
|
74
|
+
(«Sonidos de la app»).
|
|
75
|
+
|
|
76
|
+
## Tamaño en mobile y en web
|
|
77
|
+
|
|
78
|
+
La card entera se toca (≥ 72 con descripción): llega al piso de 44 sola. El `size` cambia solo el
|
|
79
|
+
interruptor.
|
|
80
|
+
|
|
81
|
+
| uso | mobile | web |
|
|
82
|
+
|---|---|---|
|
|
83
|
+
| toda switch-card | `xlarge` (48 × 28) | `large` (40 × 24) |
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<sui-switch-card [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## «No usar»: por qué no hoy y cuándo sí
|
|
90
|
+
|
|
91
|
+
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| `emoji` (0 usos) | los ajustes de hoy llevan un ícono Remix | un ajuste de los grandes del rol que quiera el emoji animado del catálogo (`SuiEmoji`) |
|
|
94
|
+
| `type="avatar"` (0 usos) | no se prende ni apaga a una persona | prender o apagar a un repartidor de tu flota |
|
|
95
|
+
| `type="brand"` / `"company"` / `"card-provider"` (0 usos) | no hay integraciones | casi nunca: una integración es `sui-integration-switch` |
|
|
96
|
+
| `size="medium"` | el interruptor de 32 × 20 se pierde en el teléfono | una tabla densa solo de desktop |
|
|
97
|
+
|
|
98
|
+
## API
|
|
99
|
+
|
|
100
|
+
<!-- api:inicio -->
|
|
101
|
+
<!-- generada: no editar a mano — `npm run docs` -->
|
|
102
|
+
|
|
103
|
+
| input | tipo | default |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| `type` | `'basic' \| 'left-icon' \| 'avatar' \| 'card-provider' \| 'brand' \| 'company'` | `'basic'` |
|
|
106
|
+
| `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
|
|
107
|
+
| `label` | `string` | `''` |
|
|
108
|
+
| `sublabel` | `string \| null` | `null` |
|
|
109
|
+
| `description` | `string \| null` | `null` |
|
|
110
|
+
| `emoji` | `SuiEmojiName \| null` | `null` |
|
|
111
|
+
| `imageUrl` | `string \| null` | `null` |
|
|
112
|
+
| `badge` | `SuiBadgeConfig \| string \| null` | `null` |
|
|
113
|
+
| `checked` | `boolean` | `false` |
|
|
114
|
+
| `disabled` | `boolean` | `false` |
|
|
115
|
+
|
|
116
|
+
| output | payload |
|
|
117
|
+
|---|---|
|
|
118
|
+
| `checkedChange` | `boolean` |
|
|
119
|
+
<!-- api:fin -->
|
|
120
|
+
|
|
121
|
+
Slot: `[sui-switch-card-leading]` (el ícono o el logo). Implementa `ControlValueAccessor`.
|
|
122
|
+
|
|
123
|
+
## Trampas
|
|
124
|
+
|
|
125
|
+
- **Es controlada**: `checked` es input y `checkedChange` solo avisa. Si no actualizas tu señal,
|
|
126
|
+
el interruptor no se mueve (al revés que `sui-checkbox-card`).
|
|
127
|
+
- **`type="left-icon"` sin `emoji` ni nada proyectado deja el círculo vacío.** El ícono se
|
|
128
|
+
proyecta con el atributo **`sui-switch-card-leading`** (no `slot=`).
|
|
129
|
+
- No tiene `icon` como input (la radio y la checkbox card sí): el ícono siempre va proyectado.
|
|
130
|
+
- `avatar` siempre dibuja un `sui-avatar` con `imageUrl` (si falla, las iniciales del `label`): no usa lo
|
|
131
|
+
proyectado. `card-provider`, `brand` y `company` leen `imageUrl` y, sin ella, usan lo proyectado.
|
|
132
|
+
- Toda la card togglea; el toque sobre el propio switch no cuenta doble.
|
|
133
|
+
- El interruptor siempre va a la derecha (no hay `flip`).
|
|
134
|
+
- `badge` con string sale **azul `light` `small`** (en `sui-switch-label` sale naranja).
|
|
135
|
+
|
|
136
|
+
## Ejemplo
|
|
137
|
+
|
|
138
|
+
```html
|
|
139
|
+
<sui-switch-card
|
|
140
|
+
[size]="bp.controlSize()"
|
|
141
|
+
type="left-icon"
|
|
142
|
+
label="Ubicación siempre"
|
|
143
|
+
[description]="ubicacionTexto()"
|
|
144
|
+
[checked]="ubicacionSiempre()"
|
|
145
|
+
[disabled]="guardando()"
|
|
146
|
+
(checkedChange)="cambiarUbicacion($event)">
|
|
147
|
+
<sui-icon sui-switch-card-leading name="map-pin-line" [size]="20" />
|
|
148
|
+
</sui-switch-card>
|
|
149
|
+
```
|