@ajuarezso/sui-design-system 0.24.1 → 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 +85 -11
- package/docs/sui-activity-feed/README.md +65 -11
- package/docs/sui-activity-filter/README.md +54 -5
- package/docs/sui-alert/README.md +54 -0
- package/docs/sui-app-store-badge/README.md +64 -10
- package/docs/sui-avatar/README.md +92 -29
- package/docs/sui-avatar-group/README.md +75 -9
- package/docs/sui-badge/README.md +85 -17
- package/docs/sui-banner/README.md +85 -20
- package/docs/sui-brand-logo/README.md +95 -31
- package/docs/sui-breadcrumb-item/README.md +54 -3
- package/docs/sui-breadcrumbs/README.md +54 -6
- package/docs/sui-button/README.md +76 -12
- package/docs/sui-button-group/README.md +91 -23
- package/docs/sui-button-group-item/README.md +81 -14
- package/docs/sui-card/README.md +105 -18
- package/docs/sui-chart-legend/README.md +63 -10
- package/docs/sui-chart-legend-dot/README.md +59 -10
- package/docs/sui-checkbox/README.md +109 -29
- package/docs/sui-checkbox-card/README.md +70 -14
- package/docs/sui-checkbox-label/README.md +92 -26
- package/docs/sui-circular-progress-bar/README.md +80 -19
- package/docs/sui-color-dot/README.md +72 -12
- package/docs/sui-color-picker/README.md +71 -13
- package/docs/sui-command-menu-footer/README.md +50 -1
- package/docs/sui-command-menu-item/README.md +74 -14
- package/docs/sui-command-menu-search/README.md +58 -3
- package/docs/sui-compact-avatar-group/README.md +73 -13
- package/docs/sui-compact-button/README.md +123 -34
- package/docs/sui-compact-select/README.md +61 -7
- package/docs/sui-compact-select-for-input/README.md +70 -6
- package/docs/sui-content-card/README.md +75 -14
- package/docs/sui-content-divider/README.md +67 -16
- package/docs/sui-content-label/README.md +99 -20
- package/docs/sui-counter-input/README.md +102 -18
- package/docs/sui-date-selector/README.md +69 -11
- package/docs/sui-datepicker/README.md +85 -18
- package/docs/sui-day-cell/README.md +75 -17
- package/docs/sui-day-label/README.md +56 -7
- package/docs/sui-divider/README.md +64 -9
- package/docs/sui-drawer-footer/README.md +63 -2
- package/docs/sui-drawer-header/README.md +69 -12
- package/docs/sui-dropdown-caption/README.md +58 -6
- package/docs/sui-dropdown-item/README.md +75 -9
- package/docs/sui-dropdown-menu/README.md +83 -14
- package/docs/sui-dropdown-search/README.md +60 -4
- package/docs/sui-emoji/README.md +94 -30
- package/docs/sui-empty-state/README.md +71 -7
- package/docs/sui-fancy-button/README.md +74 -14
- package/docs/sui-file-icon/README.md +70 -12
- package/docs/sui-file-upload/README.md +77 -17
- package/docs/sui-file-upload-card/README.md +64 -12
- package/docs/sui-filter/README.md +83 -14
- package/docs/sui-flag/README.md +73 -8
- package/docs/sui-form-hint/README.md +56 -7
- package/docs/sui-form-label/README.md +57 -5
- package/docs/sui-href/README.md +47 -0
- package/docs/sui-icon/README.md +86 -18
- package/docs/sui-image-upload/README.md +90 -22
- package/docs/sui-image-upload-profile/README.md +70 -11
- package/docs/sui-img-retry/README.md +50 -1
- package/docs/sui-inline-input/README.md +67 -9
- package/docs/sui-inline-select/README.md +62 -2
- package/docs/sui-input/README.md +90 -27
- package/docs/sui-integration-switch/README.md +84 -17
- package/docs/sui-kbd/README.md +73 -9
- package/docs/sui-key-icon/README.md +85 -23
- package/docs/sui-link-button/README.md +96 -27
- package/docs/sui-logo/README.md +93 -22
- package/docs/sui-modal/README.md +72 -13
- package/docs/sui-modal-footer/README.md +86 -12
- package/docs/sui-modal-header/README.md +57 -1
- package/docs/sui-modal-sheet/README.md +74 -12
- package/docs/sui-notification/README.md +81 -11
- package/docs/sui-notification-footer/README.md +55 -5
- package/docs/sui-notification-tab-menu/README.md +61 -5
- package/docs/sui-otp-input/README.md +70 -9
- package/docs/sui-page-header/README.md +89 -19
- package/docs/sui-pagination/README.md +73 -13
- package/docs/sui-password-strength/README.md +50 -1
- package/docs/sui-payment-icon/README.md +80 -18
- package/docs/sui-period-range/README.md +70 -11
- package/docs/sui-popover/README.md +81 -15
- package/docs/sui-product-card/README.md +89 -21
- package/docs/sui-progress-bar/README.md +82 -15
- package/docs/sui-progress-bar-label/README.md +79 -18
- package/docs/sui-radio/README.md +84 -7
- package/docs/sui-radio-card/README.md +70 -16
- package/docs/sui-radio-label/README.md +89 -22
- package/docs/sui-rating/README.md +101 -31
- package/docs/sui-rich-editor/README.md +47 -2
- package/docs/sui-segmented-control/README.md +90 -21
- package/docs/sui-select/README.md +80 -11
- package/docs/sui-sidebar/README.md +71 -16
- package/docs/sui-slider/README.md +75 -8
- package/docs/sui-social-button/README.md +71 -11
- package/docs/sui-status-badge/README.md +75 -14
- package/docs/sui-stepper/README.md +75 -18
- package/docs/sui-store-card/README.md +85 -22
- package/docs/sui-switch/README.md +82 -11
- package/docs/sui-switch-card/README.md +80 -16
- package/docs/sui-switch-label/README.md +91 -14
- package/docs/sui-tab-chips/README.md +93 -21
- package/docs/sui-tab-menu-horizontal/README.md +68 -7
- package/docs/sui-tab-menu-vertical/README.md +64 -11
- package/docs/sui-table/README.md +77 -16
- package/docs/sui-tag/README.md +86 -12
- package/docs/sui-tag-input/README.md +77 -13
- package/docs/sui-textarea/README.md +84 -17
- package/docs/sui-time-picker/README.md +96 -33
- package/docs/sui-toast/README.md +81 -20
- package/docs/sui-tooltip/README.md +80 -22
- package/docs/sui-topbar/README.md +64 -10
- package/docs/sui-topbar-button/README.md +61 -7
- package/docs/sui-topbar-item/README.md +68 -7
- package/docs/sui-topbar-user/README.md +61 -5
- package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +7 -3
|
@@ -29,8 +29,8 @@ dice qué mide y cuánto.
|
|
|
29
29
|
> y trae cuatro colores (`blue` default, `red`, `orange`, `green`), una sola altura, `value` y
|
|
30
30
|
> `max`. No dice cuándo usar cada color. Cada color apunta a un token de estado
|
|
31
31
|
> (`--sui-state-*`), igual que el badge: de ahí sale su significado, que es el mismo que el del
|
|
32
|
-
> badge aprobado. Lo marcado «según la guía del DS» sale de ahí;
|
|
33
|
-
>
|
|
32
|
+
> badge aprobado. Lo marcado «según la guía del DS» sale de ahí; lo marcado canon está
|
|
33
|
+
> aprobado; lo que sigue en propuesta espera decisión.
|
|
34
34
|
>
|
|
35
35
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **2 barras peladas en 1 pantalla**
|
|
36
36
|
> (`overview-visitors`), sin contar prototipos ni vitrinas (`master-preview`,
|
|
@@ -45,7 +45,7 @@ dice qué mide y cuánto.
|
|
|
45
45
|
| `green` | `success` | Se cumplió o va bien. | Meta cumplida, saldo alto | según la guía del DS (token) · propuesta (cuándo) |
|
|
46
46
|
| `orange` | `warning` | Va en curso y pide atención. | Saldo bajando, meta del día a medias | según la guía del DS (token) · propuesta (cuándo) |
|
|
47
47
|
| `red` | `error` | Se perdió o se acabó. | Meta perdida, saldo agotado | según la guía del DS (token) · propuesta (cuándo) |
|
|
48
|
-
| `purple` | `feature` | **No usar** (ver abajo). Extensión SUI. | — |
|
|
48
|
+
| `purple` | `feature` | **No usar** (ver abajo). Extensión SUI. | — | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
|
|
49
49
|
|
|
50
50
|
**Ojo con el naranja**: en este proyecto el `orange` de estado (`--sui-state-warning-base`) es
|
|
51
51
|
el mismo `#fa7319` de la marca. Una barra naranja sin un juicio detrás se lee como «marca», no
|
|
@@ -55,17 +55,17 @@ como «atención».
|
|
|
55
55
|
|
|
56
56
|
| size | alto | cuándo | fuente |
|
|
57
57
|
|---|---|---|---|
|
|
58
|
-
| `small` | 4 px |
|
|
59
|
-
| `medium` (default) | 6 px |
|
|
60
|
-
| `large` | 8 px |
|
|
58
|
+
| `small` | 4 px | Pendiente (P10). Era la barra de web en una card densa; D16 no deja nada en `small`, pero la opción recomendada de P10 (a) deja el saldo del repartidor en `small` como excepción escrita (decidido el 20-09-2026). | propuesta, espera P10 |
|
|
59
|
+
| `medium` (default) | 6 px | Computadora, tablet y celular chico. Es la única altura de la guía. | según la guía del DS · D16, dueño 05-10-2026 (cuándo) |
|
|
60
|
+
| `large` | 8 px | Celular de 380 px o más: lo normal y la barra principal (descarga, meta del día). | propuesta (P10 a), pendiente |
|
|
61
61
|
| `xlarge` | 10 px | **No usar** (ver abajo). | propuesta, falta aprobación |
|
|
62
62
|
|
|
63
63
|
### `value` y `ariaLabel`
|
|
64
64
|
|
|
65
65
|
| propiedad | regla | fuente |
|
|
66
66
|
|---|---|---|
|
|
67
|
-
| `value` | Siempre de 0 a 100. Si el dato viene como fracción (0,6) o como «3 de 5», se convierte antes. |
|
|
68
|
-
| `ariaLabel` | **
|
|
67
|
+
| `value` | Siempre de 0 a 100. Si el dato viene como fracción (0,6) o como «3 de 5», se convierte antes. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
68
|
+
| `ariaLabel` o `ariaLabelledby` | **Uno de los dos es obligatorio** en la barra pelada: sin título visible, el lector de pantalla no sabe qué mide. `ariaLabelledby` apunta al id de un texto que ya se ve. | canon (aprobado por el dueño, 05-10-2026, bloque B13) |
|
|
69
69
|
|
|
70
70
|
**Usos de hoy que rompen la regla — a discutir, 2:**
|
|
71
71
|
`pages/overview/components/overview-visitors/overview-visitors.html:22` y `:45` pintan en
|
|
@@ -81,24 +81,52 @@ regla va `blue`, o mejor un gráfico. Tampoco llevan `ariaLabel`.
|
|
|
81
81
|
|
|
82
82
|
## Tamaño en mobile y en web
|
|
83
83
|
|
|
84
|
-
Criterio de la app: **
|
|
85
|
-
(
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026), que reemplaza al
|
|
85
|
+
«tamaño por plataforma» del 03-10-2026 (mobile grande, web chico). La columna «mobile» es el celular de
|
|
86
|
+
380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
|
|
87
|
+
computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
|
|
88
|
+
(< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
|
|
89
|
+
`xsmall`**, salvo lo que el componente solo tiene en chico. En la app, `BreakpointsService` ya
|
|
90
|
+
tiene las señales de D16: `celular()` (380–767 px), `celularChico()`, `toque()` y `tactil()`.
|
|
88
91
|
|
|
89
92
|
| uso | mobile | web | fuente |
|
|
90
93
|
|---|---|---|---|
|
|
91
|
-
| Dentro de una fila o card densa |
|
|
92
|
-
| Lo normal, y la barra que es lo principal (descarga, meta del día) | `large` (8) | `medium` (6) |
|
|
94
|
+
| Dentro de una fila o card densa | pendiente (P10) | `medium` (6) | web: D16, dueño 05-10-2026 · mobile: espera P10 (la excepción del saldo en `small` vive en `sui-progress-bar-label`) |
|
|
95
|
+
| Lo normal, y la barra que es lo principal (descarga, meta del día) | `large` (8): propuesta (P10 a), pendiente | `medium` (6) | web: D16, dueño 05-10-2026 · mobile: espera P10 |
|
|
93
96
|
|
|
94
97
|
```ts
|
|
95
98
|
readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
|
|
96
99
|
```
|
|
97
100
|
|
|
101
|
+
Si P10 se cierra en (a) o (c):
|
|
102
|
+
|
|
98
103
|
```html
|
|
99
|
-
<sui-progress-bar [value]="progreso()" [size]="bp.
|
|
104
|
+
<sui-progress-bar [value]="progreso()" [size]="bp.celular() ? 'large' : 'medium'" ariaLabel="Subiendo la foto" />
|
|
100
105
|
```
|
|
101
106
|
|
|
107
|
+
Va `bp.celular()` y no `bp.isMobile()`: `isMobile()` también incluye el celular chico, que en lo que
|
|
108
|
+
no se toca lleva el valor de web (D16, dueño 05-10-2026).
|
|
109
|
+
|
|
110
|
+
### Por dispositivo (D16)
|
|
111
|
+
|
|
112
|
+
No se toca: sube un paso solo en el celular de 380 px o más (P1 b). El celular chico y la tablet
|
|
113
|
+
van con el valor de la computadora.
|
|
114
|
+
|
|
115
|
+
| dispositivo | size | nota |
|
|
116
|
+
|---|---|---|
|
|
117
|
+
| celular chico (< 380 px) | `medium` (6) | valor «web» |
|
|
118
|
+
| celular (380–767 px) | `large` (8): propuesta (P10 a), pendiente | valor «mobile»: un paso más que la computadora, si P10 lo confirma |
|
|
119
|
+
| tablet táctil (`pointer: coarse`) | `medium` (6) | no se toca, no necesita crecer |
|
|
120
|
+
| computadora (`pointer: fine`) | `medium` (6) | |
|
|
121
|
+
|
|
122
|
+
Ultrawide (≥ 1920 px): igual que la computadora; el espacio extra va a ancho, no a una barra más gruesa.
|
|
123
|
+
|
|
124
|
+
**Pendiente (P10):** el valor del celular y si `small` queda como excepción del saldo del
|
|
125
|
+
repartidor (20-09-2026). Decide el dueño.
|
|
126
|
+
|
|
127
|
+
En master-pedidos: no hay helper. Si P10 confirma `large` en el celular,
|
|
128
|
+
`[size]="bp.celular() ? 'large' : 'medium'"`.
|
|
129
|
+
|
|
102
130
|
## API
|
|
103
131
|
|
|
104
132
|
<!-- api:inicio -->
|
|
@@ -126,6 +154,45 @@ Outputs: ninguno.
|
|
|
126
154
|
`prefers-reduced-motion`. Nombre: `ariaLabel`, o `ariaLabelledby` (id de un texto visible), y si
|
|
127
155
|
no hay ninguno se llama «Progreso» (04-10-2026: antes quedaba sin nombre).
|
|
128
156
|
|
|
157
|
+
## Bien y mal
|
|
158
|
+
|
|
159
|
+
Barra pelada sin nombre
|
|
160
|
+
|
|
161
|
+
```html
|
|
162
|
+
<!-- ❌ mal: sin ariaLabel el lector anuncia «Progreso» y no qué mide (pages/overview/components/overview-visitors/overview-visitors.html:22) -->
|
|
163
|
+
<sui-progress-bar [value]="device.percentage" color="orange" />
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<!-- ✅ bien: el color sigue igual; si pasa a blue espera P9 -->
|
|
168
|
+
<sui-progress-bar [value]="device.percentage" color="orange" [ariaLabel]="'Visitas desde ' + device.name" />
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
El valor como fracción
|
|
172
|
+
|
|
173
|
+
```html
|
|
174
|
+
<!-- ❌ mal: value es de 0 a 100; 0.6 pinta casi vacía -->
|
|
175
|
+
<sui-progress-bar [value]="b.progreso" ariaLabel="Meta del día" />
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```html
|
|
179
|
+
<!-- ✅ bien -->
|
|
180
|
+
<sui-progress-bar [value]="b.progreso * 100" ariaLabel="Meta del día" />
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Título y número armados a mano
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<!-- ❌ mal: el texto va suelto, con otra tipografía y otro espaciado -->
|
|
187
|
+
<p class="subida__texto">Subiendo la foto · {{ progreso() }} %</p>
|
|
188
|
+
<sui-progress-bar [value]="progreso()" />
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
```html
|
|
192
|
+
<!-- ✅ bien -->
|
|
193
|
+
<sui-progress-bar-label title="Subiendo la foto" [value]="progreso()" />
|
|
194
|
+
```
|
|
195
|
+
|
|
129
196
|
## Ejemplo
|
|
130
197
|
|
|
131
198
|
```html
|
|
@@ -27,7 +27,8 @@ descripción y link, con el espaciado del DS.
|
|
|
27
27
|
> **La guía del DS no tiene una página propia para esto**: son los ejemplos «With Label» y
|
|
28
28
|
> «Advanced» de la página de la barra de progreso (título + «80%», y debajo un link
|
|
29
29
|
> «Upgrade» con una descripción). No dice cuándo usar cada forma. Lo marcado «según la guía del
|
|
30
|
-
> DS» sale de esos ejemplos;
|
|
30
|
+
> DS» sale de esos ejemplos; lo marcado canon está aprobado; lo que sigue en
|
|
31
|
+
> propuesta espera decisión.
|
|
31
32
|
>
|
|
32
33
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **4 en 3 pantallas** (la descarga del
|
|
33
34
|
> OTA, el saldo y la meta del día en el dashboard del repartidor, el saldo en la billetera), sin
|
|
@@ -41,20 +42,20 @@ que mide** (blue neutro, green cumplido, orange pide atención, red perdido o ag
|
|
|
41
42
|
| propiedad | valor | cuándo | ejemplo real | fuente |
|
|
42
43
|
|---|---|---|---|---|
|
|
43
44
|
| `type` | `on-top` (default) | Título y número arriba, barra abajo. Lo normal. | Las 4 de la app | según la guía del DS («With Label») |
|
|
44
|
-
| `type` | `on-right` | Sin título: barra y número en una línea, dentro de una fila que ya dice qué mide a la izquierda. | Pedidos por distrito en una tabla |
|
|
45
|
+
| `type` | `on-right` | Sin título: barra y número en una línea, dentro de una fila que ya dice qué mide a la izquierda. | Pedidos por distrito en una tabla | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
45
46
|
| `title` | texto | Qué mide, en sentence case, sin punto: «Saldo restante», «Meta del día». | `pages/driver/driver-wallet/driver-wallet.html:43` | según la guía del DS |
|
|
46
47
|
| `percentage` | `true` (default) | El porcentaje es la unidad que importa (una descarga). | `components/ota-update/ota-update.html:132` | según la guía del DS («80%») |
|
|
47
|
-
| `percentage` | texto | Hay una unidad real: entregas, soles. «3 de 5 entregas», «S/ 12.40 de S/ 20.00». | `pages/driver/driver-dashboard/driver-dashboard.html:
|
|
48
|
-
| `percentage` | `false` | El número ya está escrito al lado, o no significa nada. | — |
|
|
48
|
+
| `percentage` | texto | Hay una unidad real: entregas, soles. «3 de 5 entregas», «S/ 12.40 de S/ 20.00». | `pages/driver/driver-dashboard/driver-dashboard.html:539` | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
49
|
+
| `percentage` | `false` | El número ya está escrito al lado, o no significa nada. | — | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
49
50
|
| `showBottom` + `description` | texto | Qué está pasando o qué hacer mientras avanza: «No cierres la app, estamos dejando todo listo.» | `components/ota-update/ota-update.html:132` | según la guía del DS («Advanced») |
|
|
50
|
-
| `link` | texto o `{ label, href }` | La acción que resuelve lo que la barra avisa: «Recargar» cuando el saldo está en rojo. Va con `showBottom`. | — (sin usos) | según la guía del DS («Upgrade») ·
|
|
51
|
-
| `ariaLabel` | texto | Lo que mide, si el título no alcanza («Saldo restante sobre el saldo de cortesía»). | `pages/driver/driver-dashboard/driver-dashboard.html:
|
|
51
|
+
| `link` | texto o `{ label, href }` | La acción que resuelve lo que la barra avisa: «Recargar» cuando el saldo está en rojo. Va con `showBottom`. | — (sin usos) | según la guía del DS («Upgrade») · canon (aprobado por el dueño, 05-10-2026, bloque B9) (cuándo) |
|
|
52
|
+
| `ariaLabel` | texto | Lo que mide, si el título no alcanza («Saldo restante sobre el saldo de cortesía»). | `pages/driver/driver-dashboard/driver-dashboard.html:282` | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
|
|
52
53
|
|
|
53
54
|
**Usos de hoy que rompen la regla — a discutir, 1:**
|
|
54
55
|
`components/ota-update/ota-update.html:132` pinta la descarga en `orange`. Una descarga es avance
|
|
55
56
|
neutro: con la regla de color va `blue`. En la app el naranja se lee como la marca, así que puede
|
|
56
57
|
ser una decisión de marca y no un error: decide el dueño. Las de saldo y meta (`driver-wallet:43`,
|
|
57
|
-
`driver-dashboard:
|
|
58
|
+
`driver-dashboard:282` y `:539`) ya pintan verde, naranja y rojo según el estado: cumplen.
|
|
58
59
|
|
|
59
60
|
## No usar: por qué no hoy y cuándo sí
|
|
60
61
|
|
|
@@ -65,28 +66,57 @@ ser una decisión de marca y no un error: decide el dueño. Las de saldo y meta
|
|
|
65
66
|
|
|
66
67
|
## Tamaño en mobile y en web
|
|
67
68
|
|
|
68
|
-
Criterio de la app: **
|
|
69
|
-
(
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026), que reemplaza al
|
|
70
|
+
«tamaño por plataforma» del 03-10-2026 (mobile grande, web chico). La columna «mobile» es el celular de
|
|
71
|
+
380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
|
|
72
|
+
computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
|
|
73
|
+
(< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
|
|
74
|
+
`xsmall`**, salvo lo que el componente solo tiene en chico. En la app, `BreakpointsService` ya
|
|
75
|
+
tiene las señales de D16: `celular()` (380–767 px), `celularChico()`, `toque()` y `tactil()`.
|
|
72
76
|
|
|
73
77
|
El `size` solo cambia la barra; el título y el número no cambian de tamaño.
|
|
74
78
|
|
|
75
79
|
| uso | mobile | web | fuente |
|
|
76
80
|
|---|---|---|---|
|
|
77
|
-
| Dentro de una card o fila densa (saldo en el dashboard) |
|
|
78
|
-
| Lo normal, y la barra que es lo principal (descarga, meta del día) | `large` (8) | `medium` (6) |
|
|
81
|
+
| Dentro de una card o fila densa (saldo en el dashboard) | pendiente (P10) | pendiente (P10) | P10 sigue abierta. D16 no deja nada en `small`, pero la opción recomendada de P10 (a) deja el saldo del repartidor en `small` como excepción escrita (decidido el 20-09-2026, ver el comentario de `pages/driver/driver-dashboard/driver-dashboard.html:279`). Decide el dueño |
|
|
82
|
+
| Lo normal, y la barra que es lo principal (descarga, meta del día) | `large` (8): propuesta (P10 a), pendiente | `medium` (6) | web: D16, dueño 05-10-2026 · mobile: espera P10 |
|
|
79
83
|
|
|
80
84
|
```ts
|
|
81
85
|
readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
|
|
82
86
|
```
|
|
83
87
|
|
|
88
|
+
Si P10 se cierra en (a) o (c), la barra normal va así (la meta del día, no el saldo):
|
|
89
|
+
|
|
84
90
|
```html
|
|
85
|
-
<sui-progress-bar-label title="
|
|
86
|
-
[size]="bp.
|
|
91
|
+
<sui-progress-bar-label title="Meta del día" [value]="metaPercent()"
|
|
92
|
+
[size]="bp.celular() ? 'large' : 'medium'" [color]="metaColor()" />
|
|
87
93
|
```
|
|
88
94
|
|
|
89
|
-
Hoy las 4 de la app tienen un size fijo para
|
|
95
|
+
Hoy las 4 de la app tienen un size fijo para todos los dispositivos, y una va en `small`
|
|
96
|
+
(`pages/driver/driver-dashboard/driver-dashboard.html:284`, el saldo, desde el 20-09-2026). Si se
|
|
97
|
+
queda como excepción o sube a `medium` / `large` espera P10.
|
|
98
|
+
|
|
99
|
+
### Por dispositivo (D16)
|
|
100
|
+
|
|
101
|
+
No se toca: sube un paso solo en el celular de 380 px o más (P1 b). El celular chico y la tablet
|
|
102
|
+
van con el valor de la computadora. El size solo cambia la barra; el título y el número no se mueven.
|
|
103
|
+
|
|
104
|
+
| dispositivo | size | nota |
|
|
105
|
+
|---|---|---|
|
|
106
|
+
| celular chico (< 380 px) | `medium` (barra de 6) | valor «web» |
|
|
107
|
+
| celular (380–767 px) | `large` (barra de 8): propuesta (P10 a), pendiente | valor «mobile»: un paso más que la computadora, si P10 lo confirma |
|
|
108
|
+
| tablet táctil (`pointer: coarse`) | `medium` (barra de 6) | no se toca, no necesita crecer |
|
|
109
|
+
| computadora (`pointer: fine`) | `medium` (barra de 6) | |
|
|
110
|
+
|
|
111
|
+
Ultrawide (≥ 1920 px): igual que la computadora.
|
|
112
|
+
|
|
113
|
+
**Pendiente (P10): el saldo del repartidor.** Va en `small` en todos los dispositivos desde el
|
|
114
|
+
20-09-2026. La opción recomendada de P10 (a) lo deja así como excepción escrita; la (c) lo sube.
|
|
115
|
+
Hasta que el dueño decida, esta tabla no se le aplica.
|
|
116
|
+
|
|
117
|
+
En master-pedidos: no hay helper. Si P10 confirma `large` en el celular,
|
|
118
|
+
`[size]="bp.celular() ? 'large' : 'medium'"` (y no `bp.isMobile()`, que también agranda la barra en
|
|
119
|
+
el celular chico).
|
|
90
120
|
|
|
91
121
|
## API
|
|
92
122
|
|
|
@@ -126,6 +156,37 @@ Output: `(linkClick)`. Con `link` de texto el `<a>` no navega y solo emite; con
|
|
|
126
156
|
- El `title` visible nombra la barra (`aria-labelledby`, 04-10-2026); sin título (`on-right`) y sin
|
|
127
157
|
`ariaLabel` se anuncia «Progreso».
|
|
128
158
|
|
|
159
|
+
## Bien y mal
|
|
160
|
+
|
|
161
|
+
El saldo en `small` de `pages/driver/driver-dashboard/driver-dashboard.html:284` no va aquí como
|
|
162
|
+
❌: es la excepción del 20-09-2026 que P10 (a) propone escribir, y decide el dueño.
|
|
163
|
+
|
|
164
|
+
La acción que no aparece
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<!-- ❌ mal: sin showBottom no se dibujan ni la descripción ni el link -->
|
|
168
|
+
<sui-progress-bar-label title="Saldo restante" [value]="18" color="red"
|
|
169
|
+
link="Recargar" description="para seguir recibiendo pedidos" (linkClick)="abrirRecarga()" />
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
```html
|
|
173
|
+
<!-- ✅ bien -->
|
|
174
|
+
<sui-progress-bar-label title="Saldo restante" [value]="18" color="red" [showBottom]="true"
|
|
175
|
+
link="Recargar" description="para seguir recibiendo pedidos" (linkClick)="abrirRecarga()" />
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Título en una barra `on-right`
|
|
179
|
+
|
|
180
|
+
```html
|
|
181
|
+
<!-- ❌ mal: on-right ignora title; el lector anuncia «Progreso» -->
|
|
182
|
+
<sui-progress-bar-label type="on-right" title="Pedidos en Lince" [value]="72" />
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<!-- ✅ bien: el nombre lo pone la fila; la barra lo recibe en ariaLabel -->
|
|
187
|
+
<sui-progress-bar-label type="on-right" [value]="72" ariaLabel="Pedidos en Lince" />
|
|
188
|
+
```
|
|
189
|
+
|
|
129
190
|
## Ejemplo
|
|
130
191
|
|
|
131
192
|
```html
|
|
@@ -134,8 +195,8 @@ Output: `(linkClick)`. Con `link` de texto el `<a>` no navega y solo emite; con
|
|
|
134
195
|
title="Meta del día"
|
|
135
196
|
[value]="hechas / meta * 100"
|
|
136
197
|
[percentage]="hechas + ' de ' + meta + ' entregas'"
|
|
137
|
-
[color]="perdida ? 'red' : cumplida ? 'green' : 'orange'"
|
|
138
|
-
|
|
198
|
+
[color]="perdida ? 'red' : cumplida ? 'green' : 'orange'" />
|
|
199
|
+
<!-- size: medium (default); el valor del celular espera P10 -->
|
|
139
200
|
|
|
140
201
|
<!-- Saldo en rojo, con la acción que lo resuelve -->
|
|
141
202
|
<sui-progress-bar-label
|
package/docs/sui-radio/README.md
CHANGED
|
@@ -43,7 +43,7 @@ Regla corta: **lista densa de texto → radio-label · con peso o en el teléfon
|
|
|
43
43
|
| qué | cuándo | fuente |
|
|
44
44
|
|---|---|---|
|
|
45
45
|
| dentro de `sui-radio-group` + `[value]` | Siempre que haya más de una opción. El grupo hace la exclusión y se enchufa a `[(ngModel)]`. | según la guía del DS (es un radio group) |
|
|
46
|
-
| suelto con `[(standaloneChecked)]` | Solo cuando la exclusión la hace la fila o el padre (la fila de opciones del detalle de producto). **Suelto, al tocarlo se desmarca** como un checkbox. |
|
|
46
|
+
| suelto con `[(standaloneChecked)]` | Solo cuando la exclusión la hace la fila o el padre (la fila de opciones del detalle de producto). **Suelto, al tocarlo se desmarca** como un checkbox. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
47
47
|
| `disabled` | La opción existe pero no aplica ahora (una variante agotada). | según la guía del DS |
|
|
48
48
|
|
|
49
49
|
### `size`
|
|
@@ -52,18 +52,17 @@ Regla corta: **lista densa de texto → radio-label · con peso o en el teléfon
|
|
|
52
52
|
|---|---|---|---|
|
|
53
53
|
| `xlarge` | 28 | Mobile, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
|
|
54
54
|
| `large` | 24 | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
55
|
-
| `medium` (default) | 20 | Solo dentro de un componente que fija su escala (detalle de producto). Es el único tamaño de la guía. | según la guía del DS (único tamaño); el «cuándo» es
|
|
55
|
+
| `medium` (default) | 20 | Solo dentro de un componente que fija su escala en chico; hoy ningún padre lo hace (el detalle de producto recibe `xlarge` / `large`, ver «Por dispositivo»). Es el único tamaño de la guía. | según la guía del DS (único tamaño); el «cuándo» es canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
56
56
|
|
|
57
57
|
**Usos de hoy que rompen la regla:**
|
|
58
58
|
|
|
59
59
|
- **1 radio nativo → `sui-radio-card type="basic"`:**
|
|
60
|
-
`pages/driver/driver-order-detail/driver-order-detail.html:
|
|
60
|
+
`pages/driver/driver-order-detail/driver-order-detail.html:874` (motivos de cancelación del
|
|
61
61
|
repartidor, el mismo caso del ejemplo de la guía). La pantalla hermana del local ya lo resolvió
|
|
62
62
|
así: `pages/orders/orders.html:567`.
|
|
63
|
-
- **
|
|
64
|
-
(categoría por defecto
|
|
65
|
-
|
|
66
|
-
un `sui-radio-group` con `[ngModel]`.
|
|
63
|
+
- **Resuelto el 04-10-2026:** el suelto que se podía desincronizar en `master-settings.html`
|
|
64
|
+
(categoría por defecto, con `[standaloneChecked]` + `$event && …`) se quitó junto con el «por
|
|
65
|
+
defecto», que nadie leía (commit `62ee5d60` de master-pedidos). El error queda como par en «Bien y mal».
|
|
67
66
|
|
|
68
67
|
## Tamaño en mobile y en web
|
|
69
68
|
|
|
@@ -78,6 +77,27 @@ Regla corta: **lista densa de texto → radio-label · con peso o en el teléfon
|
|
|
78
77
|
|
|
79
78
|
El más grande mide 28 px: el área táctil de 44 px la tiene que dar la fila.
|
|
80
79
|
|
|
80
|
+
### Por dispositivo (D16)
|
|
81
|
+
|
|
82
|
+
Fila de `radio` en la tabla de D16 (dueño, 05-10-2026; computadora resuelta el 06-10-2026): se
|
|
83
|
+
toca, y en la computadora va **un paso menos que en el celular**, sin bajar a `medium`.
|
|
84
|
+
|
|
85
|
+
| dispositivo | size | nota |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| celular chico (< 380 px) | `xlarge` (28) | la fila que lo contiene da los 44 de alto |
|
|
88
|
+
| celular (380–767 px) | `xlarge` (28) | |
|
|
89
|
+
| tablet táctil (`pointer: coarse`) | `xlarge` (28) | `bp.controlSize()` hoy mira solo el ancho (≤ 767): en un iPad de 768 o más da `large`. Pendiente que el helper mire el puntero |
|
|
90
|
+
| computadora (`pointer: fine`) | `large` (24) | un paso menos que el celular (dueño, 06-10-2026) |
|
|
91
|
+
|
|
92
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `large`. `medium` solo cuando un padre fija la
|
|
93
|
+
escala en chico, y hoy ninguna pantalla lo hace: el detalle de producto
|
|
94
|
+
(`components/product-detail-view/product-detail-view.html:202`) recibe el `size` de quien lo
|
|
95
|
+
monta, y los dos que lo montan le pasan `xlarge` / `large` (`pages/customer/restaurant-menu/restaurant-menu.html:457`
|
|
96
|
+
con `bp.controlSize()` y `components/add-product-modal/add-product-modal.html:360` con
|
|
97
|
+
`ctrlSize()`, el mismo corte).
|
|
98
|
+
|
|
99
|
+
En master-pedidos: `[size]="bp.controlSize()"`.
|
|
100
|
+
|
|
81
101
|
## «No usar»: por qué no hoy y cuándo sí
|
|
82
102
|
|
|
83
103
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -130,6 +150,63 @@ y proyecta los radios (`sui-radio`, `sui-radio-label`, `sui-radio-card`).
|
|
|
130
150
|
- Sin marcar, en foco, el círculo se pinta del color de marca: viene del Figma, no es un error.
|
|
131
151
|
- No dibuja texto ni `aria-label`: pelado, pon el texto en un `<label>` o usa `sui-radio-label`.
|
|
132
152
|
|
|
153
|
+
## Bien y mal
|
|
154
|
+
|
|
155
|
+
Motivos de cancelación
|
|
156
|
+
|
|
157
|
+
```html
|
|
158
|
+
<!-- ❌ mal: radio nativo con <label> a mano (pages/driver/driver-order-detail/driver-order-detail.html:874) -->
|
|
159
|
+
<label class="ts__modal-reason">
|
|
160
|
+
<input type="radio" name="driverCancelReason" [value]="reason" (change)="cancelReasonSelected.set(reason)" />
|
|
161
|
+
<span>{{ reason }}</span>
|
|
162
|
+
</label>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
```html
|
|
166
|
+
<!-- ✅ bien: opción que se toca en el teléfono → radio-card en una columna, como la pantalla
|
|
167
|
+
hermana del local (pages/orders/orders.html:567). Dentro de sui-radio-group sin más, las
|
|
168
|
+
tarjetas quedan en fila (su host es inline-flex): si se usa el grupo, darle
|
|
169
|
+
flex-direction: column desde afuera (ver Trampas) -->
|
|
170
|
+
<div class="motivos" role="radiogroup" aria-label="Motivo de cancelación">
|
|
171
|
+
@for (reason of CANCEL_REASONS; track reason) {
|
|
172
|
+
<sui-radio-card [size]="bp.controlSize()" type="basic" [value]="reason" [label]="reason"
|
|
173
|
+
[checked]="cancelReasonSelected() === reason" (selected)="cancelReasonSelected.set(reason)" />
|
|
174
|
+
}
|
|
175
|
+
</div>
|
|
176
|
+
<!-- .motivos { display: flex; flex-direction: column; gap: 8px; } -->
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Elegir uno de una lista
|
|
180
|
+
|
|
181
|
+
```html
|
|
182
|
+
<!-- ❌ mal: sueltos con standaloneChecked; al tocar el elegido se apaga y el padre no se entera (se quitó de master-settings.html el 04-10-2026) -->
|
|
183
|
+
@for (cat of categorias; track cat.id) {
|
|
184
|
+
<sui-radio [size]="bp.controlSize()" [standaloneChecked]="cat.id === porDefecto()"
|
|
185
|
+
(standaloneCheckedChange)="$event && porDefecto.set(cat.id)" />
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
```html
|
|
190
|
+
<!-- ✅ bien: el grupo hace la exclusión -->
|
|
191
|
+
<sui-radio-group [ngModel]="porDefecto()" (ngModelChange)="porDefecto.set($event)">
|
|
192
|
+
@for (cat of categorias; track cat.id) {
|
|
193
|
+
<sui-radio [size]="bp.controlSize()" [value]="cat.id" [attr.aria-label]="cat.nombre" />
|
|
194
|
+
}
|
|
195
|
+
</sui-radio-group>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Círculo pelado en una tabla
|
|
199
|
+
|
|
200
|
+
```html
|
|
201
|
+
<!-- ❌ mal: el radio no dibuja texto ni aria-label; el lector solo dice «botón de opción» -->
|
|
202
|
+
<sui-radio [size]="bp.controlSize()" [value]="cat.id" />
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```html
|
|
206
|
+
<!-- ✅ bien -->
|
|
207
|
+
<sui-radio [size]="bp.controlSize()" [value]="cat.id" [attr.aria-label]="'Por defecto: ' + cat.nombre" />
|
|
208
|
+
```
|
|
209
|
+
|
|
133
210
|
## Ejemplo
|
|
134
211
|
|
|
135
212
|
```html
|
|
@@ -41,25 +41,25 @@ checkbox-card.**
|
|
|
41
41
|
|
|
42
42
|
| type | cuándo | fuente |
|
|
43
43
|
|---|---|---|
|
|
44
|
-
| `left-icon` con `icon` | Lo normal: un ícono Remix que dice de qué va la opción (`truck-line` Delivery, `store-2-line` Recojo). |
|
|
45
|
-
| `left-icon` con `iconSrc` | Emoji animado cuando la elección es de las grandes del rol (el vehículo del repartidor, el rol al registrarse, el tipo de mandadito). Los emojis van de `assets/emojis/` o `FLUENT_EMOJI_ANIM`. |
|
|
46
|
-
| `left-icon` con `emoji` | Lo mismo con un nombre de `SuiEmoji` en vez de una URL. Hoy 0 usos; vale igual. |
|
|
47
|
-
| `basic` | Opciones de texto puro: motivos de cancelación, quién paga el envío, los premios de una meta. |
|
|
48
|
-
| `avatar` (`imageUrl`) | El logo redondo de un medio de pago (Yape, Plin, efectivo en el checkout). |
|
|
49
|
-
| `company` (`imageUrl`) | Elegir entre tus locales (cambiar de negocio en mi-negocio). |
|
|
50
|
-
| `brand`, `card-provider` | Ver «No usar». |
|
|
44
|
+
| `left-icon` con `icon` | Lo normal: un ícono Remix que dice de qué va la opción (`truck-line` Delivery, `store-2-line` Recojo). | canon (aprobado por el dueño, 05-10-2026, bloque B2) (práctica de la app) |
|
|
45
|
+
| `left-icon` con `iconSrc` | Emoji animado cuando la elección es de las grandes del rol (el vehículo del repartidor, el rol al registrarse, el tipo de mandadito). Los emojis van de `assets/emojis/` o `FLUENT_EMOJI_ANIM`. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
46
|
+
| `left-icon` con `emoji` | Lo mismo con un nombre de `SuiEmoji` en vez de una URL. Hoy 0 usos; vale igual. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
47
|
+
| `basic` | Opciones de texto puro: motivos de cancelación, quién paga el envío, los premios de una meta. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
48
|
+
| `avatar` (`imageUrl`) | El logo redondo de un medio de pago (Yape, Plin, efectivo en el checkout). | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
49
|
+
| `company` (`imageUrl`) | Elegir entre tus locales (cambiar de negocio en mi-negocio). | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
50
|
+
| `brand`, `card-provider` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
51
51
|
|
|
52
52
|
### Las piezas
|
|
53
53
|
|
|
54
54
|
| prop | cuándo | fuente |
|
|
55
55
|
|---|---|---|
|
|
56
|
-
| `value` (obligatorio) | Siempre, aunque no haya grupo. Es lo que emite `selected`. |
|
|
57
|
-
| `label` | Siempre. El nombre de la opción, corto: «Delivery», «Lo antes posible». |
|
|
58
|
-
| `description` | Casi siempre: la consecuencia de elegirla («Lo revisamos y te transferimos. Puede tardar unas horas.»). |
|
|
59
|
-
| `sublabel` | Una precisión corta entre paréntesis («(canal estable)», «(sin OTA)»). Nunca la explicación: eso es `description`. |
|
|
60
|
-
| `badge` | Marca una opción frente a las otras: «Por defecto». Con string sale azul `light`; pasa el objeto con el color que corresponda según el badge
|
|
61
|
-
| `disabled` | La opción existe pero hoy no se puede: di por qué en la `description` («El local está cerrado ahora»). |
|
|
62
|
-
| `checked` / `[(ngModel)]` / `sui-radio-group` | El estado: `[checked]` + `(selected)` sueltos (lo
|
|
56
|
+
| `value` (obligatorio) | Siempre, aunque no haya grupo. Es lo que emite `selected`. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
57
|
+
| `label` | Siempre. El nombre de la opción, corto: «Delivery», «Lo antes posible». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
58
|
+
| `description` | Casi siempre: la consecuencia de elegirla («Lo revisamos y te transferimos. Puede tardar unas horas.»). | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
59
|
+
| `sublabel` | Una precisión corta entre paréntesis («(canal estable)», «(sin OTA)»). Nunca la explicación: eso es `description`. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
60
|
+
| `badge` | Marca una opción frente a las otras: «Por defecto». Con string sale azul `light`; pasa el objeto con el color que corresponda según el badge. Si «Por defecto» va `gray` o con el azul de hoy espera P48. | propuesta, espera P48 |
|
|
61
|
+
| `disabled` | La opción existe pero hoy no se puede: di por qué en la `description` («El local está cerrado ahora»). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
|
|
62
|
+
| `checked` / `[(ngModel)]` / `sui-radio-group` | El estado: `[checked]` + `(selected)` sueltos (lo que más usa la app hoy), o `ngModel` con `name` (checkout), o dentro de un `sui-radio-group`. Cuál es el canon (grupo, o sueltos como lo normal) espera P49. | propuesta, espera P49 |
|
|
63
63
|
|
|
64
64
|
### `size` (el radio de adentro)
|
|
65
65
|
|
|
@@ -67,7 +67,7 @@ checkbox-card.**
|
|
|
67
67
|
|---|---|---|
|
|
68
68
|
| `xlarge` (28) | Mobile, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
|
|
69
69
|
| `large` (24) | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
|
|
70
|
-
| `medium` (20, default) | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
|
|
70
|
+
| `medium` (20, default) | No usar en pantallas nuevas, tampoco en la computadora. | canon (aprobado por el dueño, 28-09-2026) · D16, dueño 06-10-2026 |
|
|
71
71
|
|
|
72
72
|
**Usos de hoy que rompen las reglas: 0.** Los 5 que iban sin el size del breakpoint y el
|
|
73
73
|
`xlarge` fijo de `pages/customer/mandadito/mandadito.html:30` pasaron a `bp.controlSize()` el
|
|
@@ -92,13 +92,27 @@ sola. El `size` cambia solo el radio.
|
|
|
92
92
|
<sui-radio-card [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
+
### Por dispositivo (D16)
|
|
96
|
+
|
|
97
|
+
| dispositivo | size | nota |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| celular chico (< 380) | `xlarge` (radio 28) | la card entera ya pasa de 44; el size solo agranda el radio |
|
|
100
|
+
| celular (380–767) | `xlarge` (radio 28) | |
|
|
101
|
+
| tablet táctil (`pointer: coarse`) | `xlarge` (radio 28) | `bp.controlSize()` mira solo el ancho: un iPad de 768 o más recibe `large` hasta que el helper mire el puntero |
|
|
102
|
+
| computadora (`pointer: fine`) | `large` (radio 24) | un paso menos que el celular; no baja a `medium` (D16, dueño 06-10-2026) |
|
|
103
|
+
|
|
104
|
+
Ultrawide: igual que la computadora (`large`).
|
|
105
|
+
|
|
106
|
+
En master-pedidos: `[size]="bp.controlSize()"` (`xlarge` hasta 767 px, `large` desde ahí). La
|
|
107
|
+
expresión exacta de D16, con la tablet, es `bp.tactil() ? 'xlarge' : 'large'`.
|
|
108
|
+
|
|
95
109
|
## «No usar»: por qué no hoy y cuándo sí
|
|
96
110
|
|
|
97
111
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
98
112
|
|---|---|---|
|
|
99
113
|
| `type="brand"` (0 usos) | no hay servicios de terceros que elegir | elegir el canal por el que te contactamos (WhatsApp, correo) con su logo (`brand`) |
|
|
100
114
|
| `type="card-provider"` (0 usos) | no hay pago con tarjeta guardada | elegir una tarjeta guardada en el checkout, cuando entre Culqi / Niubiz |
|
|
101
|
-
| `size="medium"` | el radio de 20 se pierde en el teléfono |
|
|
115
|
+
| `size="medium"` | el radio de 20 se pierde en el teléfono | no hay: en la computadora va `large` (D16, dueño 06-10-2026) |
|
|
102
116
|
|
|
103
117
|
## API
|
|
104
118
|
|
|
@@ -142,12 +156,52 @@ Implementa `ControlValueAccessor` (el valor del form es el `value` elegido). Den
|
|
|
142
156
|
- Suelta (sin grupo), elegirla la marca pero **no desmarca a las otras**: el padre tiene que
|
|
143
157
|
bindear `[checked]` de todas a la misma señal. Suelta, además, **cada card es una parada de Tab
|
|
144
158
|
y no hay flechas**; dentro de `sui-radio-group` sí hay un solo tab stop y flechas (revisión 04-10-2026).
|
|
159
|
+
Cuál de las dos formas es el canon espera P49.
|
|
145
160
|
- `badge` con string sale **azul `light` `small`** (en `sui-content-label` sale naranja).
|
|
146
161
|
- `size` cambia solo el radio, no el padding ni el alto de la card.
|
|
147
162
|
|
|
163
|
+
## Bien y mal
|
|
164
|
+
|
|
165
|
+
Motivos de cancelación con un radio nativo
|
|
166
|
+
|
|
167
|
+
```html
|
|
168
|
+
<!-- ❌ mal: radio del navegador, sin tamaño ni foco del DS (pages/driver/driver-order-detail/driver-order-detail.html:874) -->
|
|
169
|
+
<label class="ts__modal-reason">
|
|
170
|
+
<input type="radio" name="driverCancelReason" [value]="reason"
|
|
171
|
+
[checked]="cancelReasonSelected() === reason" (change)="cancelReasonSelected.set(reason)" />
|
|
172
|
+
<span>{{ reason }}</span>
|
|
173
|
+
</label>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
```html
|
|
177
|
+
<!-- ✅ bien: igual que la pantalla hermana, pages/orders/orders.html:567 (sueltas con [checked]; si va en sui-radio-group espera P49) -->
|
|
178
|
+
<sui-radio-card type="basic" [size]="bp.controlSize()" [value]="reason" [label]="reason"
|
|
179
|
+
[checked]="cancelReasonSelected() === reason" (selected)="cancelReasonSelected.set(reason)" />
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Suelta, sin `[checked]`
|
|
183
|
+
|
|
184
|
+
```html
|
|
185
|
+
<!-- ❌ mal: elegir una no desmarca a las otras; quedan dos marcadas -->
|
|
186
|
+
<sui-radio-card [size]="bp.controlSize()" value="delivery" label="Delivery" (selected)="modo.set('delivery')" />
|
|
187
|
+
<sui-radio-card [size]="bp.controlSize()" value="pickup" label="Recojo en tienda" (selected)="modo.set('pickup')" />
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```html
|
|
191
|
+
<!-- ✅ bien: el grupo decide cuál está marcada (como pages/super-admin/master-settings/master-settings.html:438) -->
|
|
192
|
+
<sui-radio-group [ngModel]="modo()" (ngModelChange)="modo.set($event)">
|
|
193
|
+
<sui-radio-card [size]="bp.controlSize()" value="delivery" label="Delivery" />
|
|
194
|
+
<sui-radio-card [size]="bp.controlSize()" value="pickup" label="Recojo en tienda" />
|
|
195
|
+
</sui-radio-group>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Sueltas con `[checked]="modo() === '…'"` + `(selected)` también funciona (es lo que hace hoy casi
|
|
199
|
+
toda la app). Cuál de las dos es el canon espera P49.
|
|
200
|
+
|
|
148
201
|
## Ejemplo
|
|
149
202
|
|
|
150
203
|
```html
|
|
204
|
+
<!-- suelta con [checked], como casi toda la app; si va en sui-radio-group espera P49 -->
|
|
151
205
|
<sui-radio-card
|
|
152
206
|
[size]="bp.controlSize()"
|
|
153
207
|
type="left-icon"
|