@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.
Files changed (118) hide show
  1. package/docs/sui-accordion/README.md +83 -9
  2. package/docs/sui-activity-feed/README.md +55 -1
  3. package/docs/sui-activity-filter/README.md +50 -1
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +57 -3
  6. package/docs/sui-avatar/README.md +66 -6
  7. package/docs/sui-avatar-group/README.md +64 -2
  8. package/docs/sui-badge/README.md +79 -11
  9. package/docs/sui-banner/README.md +70 -5
  10. package/docs/sui-brand-logo/README.md +77 -14
  11. package/docs/sui-breadcrumb-item/README.md +51 -0
  12. package/docs/sui-breadcrumbs/README.md +48 -0
  13. package/docs/sui-button/README.md +68 -6
  14. package/docs/sui-button-group/README.md +70 -5
  15. package/docs/sui-button-group-item/README.md +68 -4
  16. package/docs/sui-card/README.md +97 -10
  17. package/docs/sui-chart-legend/README.md +53 -0
  18. package/docs/sui-chart-legend-dot/README.md +49 -0
  19. package/docs/sui-checkbox/README.md +106 -26
  20. package/docs/sui-checkbox-card/README.md +58 -2
  21. package/docs/sui-checkbox-label/README.md +89 -23
  22. package/docs/sui-circular-progress-bar/README.md +63 -5
  23. package/docs/sui-color-dot/README.md +61 -5
  24. package/docs/sui-color-picker/README.md +62 -4
  25. package/docs/sui-command-menu-footer/README.md +49 -0
  26. package/docs/sui-command-menu-item/README.md +63 -4
  27. package/docs/sui-command-menu-search/README.md +58 -4
  28. package/docs/sui-compact-avatar-group/README.md +61 -4
  29. package/docs/sui-compact-button/README.md +112 -28
  30. package/docs/sui-compact-select/README.md +58 -4
  31. package/docs/sui-compact-select-for-input/README.md +69 -5
  32. package/docs/sui-content-card/README.md +63 -2
  33. package/docs/sui-content-divider/README.md +49 -1
  34. package/docs/sui-content-label/README.md +83 -4
  35. package/docs/sui-counter-input/README.md +91 -7
  36. package/docs/sui-date-selector/README.md +61 -3
  37. package/docs/sui-datepicker/README.md +72 -5
  38. package/docs/sui-day-cell/README.md +60 -3
  39. package/docs/sui-day-label/README.md +52 -3
  40. package/docs/sui-divider/README.md +57 -5
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +60 -3
  43. package/docs/sui-dropdown-caption/README.md +53 -1
  44. package/docs/sui-dropdown-item/README.md +72 -6
  45. package/docs/sui-dropdown-menu/README.md +74 -5
  46. package/docs/sui-dropdown-search/README.md +57 -1
  47. package/docs/sui-emoji/README.md +82 -18
  48. package/docs/sui-empty-state/README.md +68 -4
  49. package/docs/sui-fancy-button/README.md +59 -1
  50. package/docs/sui-file-icon/README.md +56 -1
  51. package/docs/sui-file-upload/README.md +69 -9
  52. package/docs/sui-file-upload-card/README.md +53 -2
  53. package/docs/sui-filter/README.md +74 -5
  54. package/docs/sui-flag/README.md +62 -1
  55. package/docs/sui-form-hint/README.md +54 -5
  56. package/docs/sui-form-label/README.md +53 -1
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +69 -4
  59. package/docs/sui-image-upload/README.md +70 -3
  60. package/docs/sui-image-upload-profile/README.md +58 -0
  61. package/docs/sui-img-retry/README.md +49 -0
  62. package/docs/sui-inline-input/README.md +61 -3
  63. package/docs/sui-inline-select/README.md +60 -0
  64. package/docs/sui-input/README.md +77 -14
  65. package/docs/sui-integration-switch/README.md +69 -2
  66. package/docs/sui-kbd/README.md +71 -7
  67. package/docs/sui-key-icon/README.md +65 -6
  68. package/docs/sui-link-button/README.md +79 -13
  69. package/docs/sui-logo/README.md +74 -4
  70. package/docs/sui-modal/README.md +61 -2
  71. package/docs/sui-modal-footer/README.md +83 -9
  72. package/docs/sui-modal-header/README.md +56 -0
  73. package/docs/sui-modal-sheet/README.md +72 -10
  74. package/docs/sui-notification/README.md +71 -1
  75. package/docs/sui-notification-footer/README.md +51 -1
  76. package/docs/sui-notification-tab-menu/README.md +57 -1
  77. package/docs/sui-otp-input/README.md +67 -6
  78. package/docs/sui-page-header/README.md +83 -15
  79. package/docs/sui-pagination/README.md +60 -0
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +66 -7
  82. package/docs/sui-period-range/README.md +65 -6
  83. package/docs/sui-popover/README.md +73 -7
  84. package/docs/sui-product-card/README.md +76 -8
  85. package/docs/sui-progress-bar/README.md +72 -8
  86. package/docs/sui-progress-bar-label/README.md +69 -12
  87. package/docs/sui-radio/README.md +83 -6
  88. package/docs/sui-radio-card/README.md +58 -4
  89. package/docs/sui-radio-label/README.md +86 -19
  90. package/docs/sui-rating/README.md +81 -14
  91. package/docs/sui-rich-editor/README.md +45 -0
  92. package/docs/sui-segmented-control/README.md +83 -14
  93. package/docs/sui-select/README.md +72 -3
  94. package/docs/sui-sidebar/README.md +64 -9
  95. package/docs/sui-slider/README.md +68 -1
  96. package/docs/sui-social-button/README.md +63 -3
  97. package/docs/sui-status-badge/README.md +64 -6
  98. package/docs/sui-stepper/README.md +57 -0
  99. package/docs/sui-store-card/README.md +71 -8
  100. package/docs/sui-switch/README.md +80 -9
  101. package/docs/sui-switch-card/README.md +70 -6
  102. package/docs/sui-switch-label/README.md +90 -13
  103. package/docs/sui-tab-chips/README.md +79 -9
  104. package/docs/sui-tab-menu-horizontal/README.md +62 -1
  105. package/docs/sui-tab-menu-vertical/README.md +56 -3
  106. package/docs/sui-table/README.md +68 -7
  107. package/docs/sui-tag/README.md +75 -4
  108. package/docs/sui-tag-input/README.md +71 -7
  109. package/docs/sui-textarea/README.md +78 -11
  110. package/docs/sui-time-picker/README.md +70 -7
  111. package/docs/sui-toast/README.md +65 -5
  112. package/docs/sui-tooltip/README.md +61 -4
  113. package/docs/sui-topbar/README.md +57 -3
  114. package/docs/sui-topbar-button/README.md +57 -3
  115. package/docs/sui-topbar-item/README.md +61 -0
  116. package/docs/sui-topbar-user/README.md +56 -0
  117. package/package.json +1 -1
  118. package/types/ajuarezso-sui-design-system.d.ts +19 -19
@@ -35,11 +35,14 @@ Regla corta: **una línea → input · varias → textarea · de una lista → s
35
35
  > fecha y contador) sin do/don't. Lo marcado «según la guía del DS» sale de esos ejemplos; el
36
36
  > resto es canon (CLAUDE.md, CANON-SUI o aprobado por el dueño el 05-10-2026); lo que sigue en **propuesta** espera decisión.
37
37
  >
38
- > Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`, más
39
- > `master-ejercicios`): **195 usos en 61 archivos**. Tipos: 42 `text`, 36 sin `type` (`text`),
40
- > 34 `amount`, 21 `search`, 21 `number`, 18 `tel`, 10 `email`, 7 `date`, 3 `password-toggle`,
41
- > 2 `url`, 1 `datetime-local`. Tamaños: 88 `bp.isMobile() ? 'large' : 'medium'`, 77 sin `size`
42
- > (`medium`), 18 `large`, 3 `xlarge`, 3 `medium`, 1 `small`, 3 `bp.controlSize()`, 2 otros dinámicos.
38
+ > Uso medido el 06-10-2026 en `master-pedidos/src/app` @ `9f0e54c3` (misma exclusión que
39
+ > `sui-badge`, más `master-ejercicios`): **200 usos en 66 archivos** — 196 en 63 `.html` y 4 en
40
+ > templates inline de 3 `.ts` (`components/option-image/option-image.ts`, `pages/dx/modal-test/modal-test.ts`,
41
+ > `pages/dx/sandbox/sandbox.ts`). Tipos: 45 `text`, 35 sin `type` (`text`), 35 `amount`,
42
+ > 22 `search`, 22 `tel`, 18 `number`, 10 `email`, 7 `date`, 3 `password-toggle`, 2 `url`,
43
+ > 1 `datetime-local`. Tamaños, tras la migración a D16: 195 `bp.sizeControl()` (191 en `.html`
44
+ > y los 4 inline), 3 `xlarge` (los buscadores principales del cliente), 1 `bp.controlSize()` y
45
+ > 1 dinámico propio (`components/product-detail-view/product-detail-view.html:223`). Ninguno sin `size`.
43
46
 
44
47
  ### `type` — qué dato es
45
48
 
@@ -116,21 +119,39 @@ teléfono también va en 16 en todos los tamaños (antes se quedaba en 14 al lad
116
119
  |---|---|---|---|
117
120
  | campo de formulario | `large` (48), igual que el botón del footer | `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) |
118
121
  | buscador principal del cliente (home, carta, rubro) | `xlarge` (52) + `fullRadius` | `xlarge` + `fullRadius` | canon (aprobado por el dueño, 05-10-2026, bloque B1) (ya es práctica en las 3 pantallas) |
119
- | buscador o filtro de una lista del panel | `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) (hoy `pages/orders/orders.html:72` va en `small`: se migra) |
122
+ | buscador o filtro de una lista del panel | `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) (`pages/orders/orders.html:73` ya va con `bp.sizeControl()`; medido el 06-10-2026) |
120
123
  | campo dentro de una tabla o fila densa | no aplica | `medium` (40) | canon (dueño, 05-10-2026, D16): nada en `xsmall` (la guía del DS lo usa ahí) |
121
124
 
122
125
  ```html
123
- <sui-input [size]="bp.isMobile() ? 'large' : 'medium'" label="Teléfono" type="tel" … />
126
+ <sui-input [size]="bp.sizeControl()" label="Teléfono" type="tel" … />
124
127
  <!-- bp = BreakpointsService de la app -->
125
128
  ```
126
129
 
127
- No uses `bp.controlSize()` en campos: da `xlarge` (52) en mobile, más alto que el botón `large`
128
- del footer (3 usos hoy: `pages/customer/checkout/checkout.html:269`, `:384`,
129
- `pages/super-admin/master-sonidos-push/master-sonidos-push.html:43`). El texto sube solo a 16 px
130
- en mobile (evita el zoom de iOS): no hace falta pedirlo.
130
+ No uses `bp.controlSize()` en campos: es el de checkbox/radio/switch, da `xlarge` (52) en mobile,
131
+ más alto que el botón `large` del footer, y `large` en la computadora (1 uso hoy:
132
+ `pages/customer/checkout/checkout.html:385`, el cupón). El texto sube solo a 16 px en mobile (evita
133
+ el zoom de iOS): no hace falta pedirlo.
131
134
 
132
- Hoy: **88 usos** ya van con `bp.isMobile() ? 'large' : 'medium'`; **77 sin `size`** quedan en 40 px
133
- también en el teléfono (no alinea con el botón `large`).
135
+ Hoy (medido el 06-10-2026): **195 de los 200 usos** ya van con `bp.sizeControl()` (191 en `.html` y
136
+ 4 en templates inline de `.ts`); quedan los 3 buscadores principales en `xlarge` fijo (van bien), el cupón con `bp.controlSize()` y un dinámico propio.
137
+
138
+ ### Por dispositivo (D16)
139
+
140
+ Fila `input` de la tabla D16 (dueño, 05-10-2026). Se toca, así que va por tipo de puntero además
141
+ del ancho, igual que `sui-button`: campo y botón de al lado miden lo mismo en cada dispositivo.
142
+
143
+ | dispositivo | size | nota |
144
+ |---|---|---|
145
+ | celular chico (< 380 px) | `large` (48) | D16 pide `medium` con área tocable de 44; mientras el DS no estire el área de los `medium`, va `large` (interino) |
146
+ | celular (380–767 px) | `large` (48) | mismo alto que el botón `large` del footer |
147
+ | tablet táctil (`pointer: coarse`) | `large` (48) | también se toca con el dedo; `bp.isMobile()` la dejaba en `medium` |
148
+ | computadora (`pointer: fine`) | `medium` (40) | también filtros y campos dentro de tablas; `small` y `xsmall` no se usan |
149
+
150
+ Buscador principal del cliente (home, carta, rubro): `xlarge` (52) + `fullRadius` en todos los
151
+ dispositivos (B1). Ultrawide (≥ 1920 px): igual que la computadora, `medium`; el espacio extra va a
152
+ ancho y columnas, no a campos más altos.
153
+
154
+ En master-pedidos: `[size]="bp.sizeControl()"` · buscador principal: `size="xlarge"` + `[fullRadius]="true"`.
134
155
 
135
156
  ## «No usar»: por qué no hoy y cuándo sí
136
157
 
@@ -221,13 +242,55 @@ proyectados con `leadingControl` / `trailingControl`).
221
242
  - En el teléfono la X de limpiar y el ojo se ven de 12-20 px pero se tocan en 44 × 44 (área
222
243
  invisible, 04-10-2026).
223
244
 
245
+ ## Bien y mal
246
+
247
+ Tamaño del campo del cupón
248
+
249
+ ```html
250
+ <!-- ❌ mal: bp.controlSize() es de checkbox/radio/switch: xlarge en el celular y large en la computadora (pages/customer/checkout/checkout.html:385) -->
251
+ <sui-input [size]="bp.controlSize()" placeholder="Código de descuento" [(value)]="cupon" />
252
+ ```
253
+
254
+ ```html
255
+ <!-- ✅ bien (y el botón «Aplicar» de al lado, también con bp.sizeControl()) -->
256
+ <sui-input [size]="bp.sizeControl()" placeholder="Código de descuento" [(value)]="cupon" />
257
+ ```
258
+
259
+ DNI con el label afuera
260
+
261
+ ```html
262
+ <!-- ❌ mal: el label suelto no conoce el id del campo (su for no apunta a nada) y el DNI no es un número (pages/driver-onboarding/step-info/step-info.html:56 y :60) -->
263
+ <sui-form-label label="DNI" [required]="true" for="ob-dni" />
264
+ <sui-input [size]="bp.sizeControl()" type="number" inputmode="numeric" placeholder="74523618"
265
+ [maxlength]="8" [(value)]="dni" />
266
+ ```
267
+
268
+ ```html
269
+ <!-- ✅ bien -->
270
+ <sui-input label="DNI" [required]="true" type="text" inputmode="numeric" placeholder="74523618"
271
+ [maxlength]="8" hint="8 dígitos" [size]="bp.sizeControl()" [(value)]="dni" />
272
+ ```
273
+
274
+ Teléfono con espacios en el placeholder
275
+
276
+ ```html
277
+ <!-- ❌ mal: con [maxlength]="9", quien copia los espacios del placeholder llega al tope antes del último dígito (pages/mi-negocio/mi-negocio.html:689) -->
278
+ <sui-input [size]="bp.sizeControl()" type="tel" placeholder="987 654 321" [maxlength]="9" [(value)]="telefono" />
279
+ ```
280
+
281
+ ```html
282
+ <!-- ✅ bien -->
283
+ <sui-input label="Teléfono" type="tel" [maxlength]="9" autocomplete="tel" placeholder="987654321"
284
+ [size]="bp.sizeControl()" [(value)]="telefono" />
285
+ ```
286
+
224
287
  ## Ejemplo
225
288
 
226
289
  ```html
227
290
  <!-- Campo de formulario -->
228
291
  <sui-input label="Teléfono" [required]="true" type="tel" [maxlength]="9" autocomplete="tel"
229
292
  placeholder="987654321" hint="9 dígitos, empezando con 9"
230
- [size]="bp.isMobile() ? 'large' : 'medium'" [(value)]="telefono" />
293
+ [size]="bp.sizeControl()" [(value)]="telefono" />
231
294
 
232
295
  <!-- Monto -->
233
296
  <sui-input label="Monto de la compra" type="amount" prefix="S/" placeholder="0.00" [(value)]="monto" />
@@ -74,7 +74,7 @@ Regla corta: **servicio externo que se prende y se configura → integration-swi
74
74
  | layout | `vertical` | `horizontal` |
75
75
 
76
76
  ```html
77
- <sui-integration-switch [size]="bp.isMobile() ? 'large' : 'medium'"
77
+ <sui-integration-switch [size]="bp.sizeControl()"
78
78
  [type]="bp.isMobile() ? 'vertical' : 'horizontal'" … />
79
79
  ```
80
80
 
@@ -82,11 +82,33 @@ Regla corta: **servicio externo que se prende y se configura → integration-swi
82
82
  y a diferencia de `sui-switch-card`, tocar la tarjeta no prende nada: solo responde el
83
83
  interruptor. Para algo que se prende y apaga en el teléfono, `sui-switch-card` es la salida.
84
84
 
85
+ ### Por dispositivo (D16)
86
+
87
+ No está en la tabla D16 por componente: va como **lo que se toca**, porque el `size` solo agranda
88
+ «Administrar», que es un botón. Fuente: D16, dueño 05-10-2026.
89
+
90
+ | dispositivo | size | nota |
91
+ |---|---|---|
92
+ | celular chico (< 380) | `large` (44) | D16 pide `medium` con área tocable de 44; mientras el DS no estire el área de los `medium`, va `large` (interino) |
93
+ | celular (380–767) | `large` (44) | |
94
+ | tablet táctil (`pointer: coarse`) | `large` (44) | también se toca con el dedo: Apple pide 44 pt en el iPad |
95
+ | computadora (`pointer: fine`) | `medium` (38) | nunca más chico |
96
+
97
+ En el ultrawide, igual que en la computadora: el espacio extra va a más columnas, no a un
98
+ «Administrar» más grande.
99
+
100
+ D16 no alcanza al interruptor: es `sui-switch` `medium` fijo dentro del componente, aunque los
101
+ switches sueltos vayan en `xlarge`/`large`. El badge interno arranca en `small`: pásalo como objeto
102
+ con `size: bp.sizeBadge()`.
103
+
104
+ En master-pedidos: `[size]="bp.sizeControl()"`. El `type` sigue por ancho
105
+ (`bp.isMobile() ? 'vertical' : 'horizontal'`): es layout, no tamaño.
106
+
85
107
  ## «No usar»: por qué no hoy y cuándo sí
86
108
 
87
109
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
88
110
  |---|---|---|
89
- | todo el componente (0 usos) | no hay integraciones; además le falta tamaño para mobile | conectar Culqi / Izipay o WhatsApp Business desde el panel del local (web primero) |
111
+ | todo el componente (0 usos) | no hay integraciones (el tamaño para mobile ya existe: `large`, 04-10-2026) | conectar Culqi / Izipay o WhatsApp Business desde el panel del local (web primero) |
90
112
  | `vertical` · `list` | sin borde y en columna, el bloque se pierde | casi nunca: una sola integración destacada en una pantalla vacía |
91
113
 
92
114
  ## API
@@ -135,6 +157,51 @@ Slot: `[sui-integration-brand]` (reemplaza al logo). Implementa `ControlValueAcc
135
157
  El interruptor toma su nombre de ese título (y su descripción de `description`) con
136
158
  `aria-labelledby` (revisión 04-10-2026); antes el lector decía solo «interruptor».
137
159
 
160
+ ## Bien y mal
161
+
162
+ La app no tiene usos todavía: los pares salen de «Cuándo usarlo» y de «Trampas».
163
+
164
+ Un ajuste propio de la app
165
+
166
+ ```html
167
+ <!-- ❌ mal: avisar de pedidos nuevos es un ajuste de la app, no un servicio externo -->
168
+ <sui-integration-switch title="Notificaciones" brandIcon="notification-3-line"
169
+ [manage]="false" [active]="avisos()" (activeChange)="avisos.set($event)" />
170
+ ```
171
+
172
+ ```html
173
+ <!-- ✅ bien -->
174
+ <sui-switch-card label="Notificaciones" [size]="bp.controlSize()"
175
+ [checked]="avisos()" (checkedChange)="avisos.set($event)" />
176
+ ```
177
+
178
+ Servicio que solo se prende
179
+
180
+ ```html
181
+ <!-- ❌ mal: manage arranca en true y pinta «Administrar» aunque no haya nada que configurar -->
182
+ <sui-integration-switch title="Mapbox" brandIcon="map-2-line" [size]="bp.sizeControl()"
183
+ [active]="mapbox()" (activeChange)="mapbox.set($event)" />
184
+ ```
185
+
186
+ ```html
187
+ <!-- ✅ bien -->
188
+ <sui-integration-switch title="Mapbox" brandIcon="map-2-line" [manage]="false"
189
+ [active]="mapbox()" (activeChange)="mapbox.set($event)" />
190
+ ```
191
+
192
+ Integración nueva
193
+
194
+ ```html
195
+ <!-- ❌ mal: el string sale naranja light y en small, que D16 no usa -->
196
+ <sui-integration-switch title="Culqi" brandIcon="bank-card-line" badge="Nuevo" … />
197
+ ```
198
+
199
+ ```html
200
+ <!-- ✅ bien -->
201
+ <sui-integration-switch title="Culqi" brandIcon="bank-card-line" [size]="bp.sizeControl()"
202
+ [badge]="{ label: 'Nuevo', color: 'purple', size: bp.sizeBadge() }" … />
203
+ ```
204
+
138
205
  ## Ejemplo
139
206
 
140
207
  ```html
@@ -46,20 +46,44 @@ Usos de hoy que rompen la regla: **0**.
46
46
 
47
47
  ## Tamaño en mobile y en web
48
48
 
49
- No es táctil: es una tecla dibujada. En mobile no hay teclado físico, así que no se muestra; en
50
- web tiene un solo tamaño. Donde la pantalla existe en los dos (panel del local, super admin) se
51
- oculta con el servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`). Todo
52
- es **canon (aprobado por el dueño, 05-10-2026, bloque B7)**.
49
+ No es táctil: es una tecla dibujada. Donde se usa con el dedo no hay teclado físico, así que no se
50
+ muestra; con mouse tiene un solo tamaño. Donde la pantalla existe en los dos (panel del local,
51
+ super admin) se oculta con el servicio de breakpoints de la app (`bp`, en
52
+ `services/breakpoints.service.ts`). Que no vaya en mobile es **canon (aprobado por el dueño,
53
+ 05-10-2026, bloque B7)**; que la tablet táctil cuente como mobile sale de D16 (ver abajo).
53
54
 
54
- | uso | mobile | web |
55
+ | uso | mobile (celular y tablet táctil) | web (computadora) |
55
56
  |---|---|---|
56
57
  | atajo de teclado | no se muestra | tamaño único (20 px de alto) |
57
58
 
58
59
  ```html
59
- @if (!bp.isMobile()) { <sui-kbd>⌘K</sui-kbd> }
60
+ @if (!bp.tactil()) { <sui-kbd>⌘K</sui-kbd> }
60
61
  ```
61
62
 
62
- No tiene tamaños: en mobile no hay teclado físico, así que no se pinta.
63
+ No tiene tamaños: con el dedo no hay teclas, así que no se pinta.
64
+
65
+ ### Por dispositivo (D16)
66
+
67
+ El tamaño no aplica: `sui-kbd` no tiene `size` (20 px fijo). Lo que depende del dispositivo es
68
+ **si se muestra**, y eso no va por ancho sino por puntero, como D16: el iPad (768–1024 px,
69
+ `pointer: coarse`) da `bp.isMobile()` falso, y con `!bp.isMobile()` el ⌘K saldría en una pantalla
70
+ sin teclas.
71
+
72
+ | dispositivo | se muestra | nota |
73
+ |---|---|---|
74
+ | celular chico (< 380) | no | con el dedo no hay teclas |
75
+ | celular (380–767) | no | |
76
+ | tablet táctil (`pointer: coarse`) | no | misma razón que el celular: se usa con el dedo |
77
+ | computadora (`pointer: fine`) | sí, 20 px | |
78
+ | ultrawide | sí, 20 px | igual que la computadora |
79
+
80
+ **Pendiente**: el iPad con teclado físico. Con un teclado conectado los atajos sí funcionan, pero
81
+ la pantalla sigue siendo táctil y ni el ancho ni el puntero dicen si hay un teclado conectado;
82
+ falta que el dueño decida si se muestra ahí. Hasta entonces va oculto, que es el lado seguro: un atajo que falta no confunde, uno
83
+ que no se puede apretar sí.
84
+
85
+ En master-pedidos: `@if (!bp.tactil()) { <sui-kbd>⌘K</sui-kbd> }` (`tactil` = celular por ancho
86
+ o cualquier pantalla `pointer: coarse`). No uses `!bp.isMobile()`: deja pasar la tablet.
63
87
 
64
88
  ## «No usar»: por qué no hoy y cuándo sí
65
89
 
@@ -88,6 +112,46 @@ Slot: `<ng-content>` (el texto o el `sui-icon`).
88
112
  - El ícono de adentro va a 16 px y toma `text-sub-600` aunque le pongas otro color.
89
113
  - Mide 20 px de alto fijo: no crece con el texto de al lado.
90
114
 
115
+ ## Bien y mal
116
+
117
+ La app no lo usa directo: los pares salen de «Cuándo usarlo» y de «Trampas».
118
+
119
+ Flecha al pie de un menú
120
+
121
+ ```html
122
+ <!-- ❌ mal: subtle no se elige solo al poner un ícono; sale con el fondo blanco del texto -->
123
+ <sui-kbd><sui-icon name="arrow-up-line" [size]="16" /></sui-kbd>
124
+ ```
125
+
126
+ ```html
127
+ <!-- ✅ bien -->
128
+ <sui-kbd variant="subtle"><sui-icon name="arrow-up-line" [size]="16" /></sui-kbd>
129
+ ```
130
+
131
+ Atajo en una pantalla que también se ve en el celular
132
+
133
+ ```html
134
+ <!-- ❌ mal: con el dedo no hay teclas; con !bp.isMobile() el ⌘K igual sale en el iPad (768–1024, táctil) -->
135
+ @if (!bp.isMobile()) { <sui-kbd>⌘K</sui-kbd> }
136
+ ```
137
+
138
+ ```html
139
+ <!-- ✅ bien -->
140
+ @if (!bp.tactil()) { <sui-kbd>⌘K</sui-kbd> }
141
+ ```
142
+
143
+ Una etiqueta que no es una tecla
144
+
145
+ ```html
146
+ <!-- ❌ mal: no es un atajo; además sale en MAYÚSCULAS -->
147
+ <sui-kbd>Nuevo</sui-kbd>
148
+ ```
149
+
150
+ ```html
151
+ <!-- ✅ bien -->
152
+ <sui-badge color="purple" [size]="bp.sizeBadge()">Nuevo</sui-badge>
153
+ ```
154
+
91
155
  ## Ejemplo
92
156
 
93
157
  ```html
@@ -74,11 +74,10 @@ Se encontraron buscando reglas `*icon*` con `border-radius: 50%`, fondo y 32–6
74
74
 
75
75
  ## Tamaño en mobile y en web
76
76
 
77
- En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
78
- pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
79
- breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
80
- el celular (cliente, repartidor) va directo el valor de mobile. No se toca, así que la tablet va
81
- con el valor de web, y el celular chico (< 380 px) también (D16).
77
+ En mobile se lee con el celular en la mano, así que va más grande; en web, más chico. Se elige
78
+ con el servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`) también en
79
+ las pantallas que solo existen en el celular (cliente, repartidor): no se toca, así que la tablet
80
+ va con el valor de web, y el celular chico (< 380 px) también (D16, dueño 05-10-2026).
82
81
  Es **canon (dueño, 05-10-2026, P1 b)**: un paso más grande en el celular que en computadora, y
83
82
  se migra todo ahora, no solo al tocar cada pantalla.
84
83
 
@@ -89,9 +88,28 @@ se migra todo ahora, no solo al tocar cada pantalla.
89
88
  | resultado de un modal | `64` | `56` |
90
89
 
91
90
  ```html
92
- <sui-key-icon name="lock-line" styleVariant="lighter" color="red" [size]="bp.isMobile() ? 64 : 56" />
91
+ <sui-key-icon name="lock-line" styleVariant="lighter" color="red" [size]="bp.celular() ? 64 : 56" />
93
92
  ```
94
93
 
94
+ ### Por dispositivo (D16)
95
+
96
+ La key-icon no se toca: sube un paso **solo en el celular de 380 px o más**. Fuente: D16, dueño
97
+ 05-10-2026 (P1 b).
98
+
99
+ | dispositivo | size | nota |
100
+ |---|---|---|
101
+ | celular chico (< 380) | valor «web» (`32` fila · `40` card · `56` modal) | no se toca: no sube aunque sea un celular |
102
+ | celular (380–767) | valor «mobile» (`40` fila · `48` card · `64` modal) | un paso más que en la computadora |
103
+ | tablet táctil (`pointer: coarse`) | valor «web» (`32` · `40` · `56`) | no se toca: el puntero no cambia nada |
104
+ | computadora (`pointer: fine`) | valor «web» (`32` · `40` · `56`) | |
105
+
106
+ En el ultrawide, igual que en la computadora: el espacio extra va a más columnas, no a círculos
107
+ más grandes.
108
+
109
+ En master-pedidos no hay helper: `[size]="bp.celular() ? 40 : 32"` (fila),
110
+ `[size]="bp.celular() ? 48 : 40"` (card) o `[size]="bp.celular() ? 64 : 56"` (resultado de un
111
+ modal). No uses `bp.isMobile()`: incluye el celular chico, que va con el valor de web.
112
+
95
113
  ## «No usar»: por qué no hoy y cuándo sí
96
114
 
97
115
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -121,6 +139,47 @@ Outputs: ninguno.
121
139
  - **El default es `stroke` `gray`**: si quieres el círculo de color, pide `lighter` explícito.
122
140
  - `name` va sin `ri-`, como en `sui-icon`.
123
141
 
142
+ ## Bien y mal
143
+
144
+ Resultado de un modal: cuenta bloqueada
145
+
146
+ ```html
147
+ <!-- ❌ mal: círculo hecho a mano, 64 fijo y un ícono de 30 fuera de la escala (components/cuenta-bloqueada/cuenta-bloqueada.html:4) -->
148
+ <span class="cb__icono"><sui-icon name="lock-line" [size]="30" /></span>
149
+ ```
150
+
151
+ ```html
152
+ <!-- ✅ bien -->
153
+ <sui-key-icon name="lock-line" styleVariant="lighter" color="red" [size]="bp.celular() ? 64 : 56" />
154
+ ```
155
+
156
+ Resultado de un modal: calificación enviada
157
+
158
+ ```html
159
+ <!-- ❌ mal: el mismo círculo a mano, con los colores del estado en el SCSS (components/driver-rate-modal/driver-rate-modal.html:17) -->
160
+ <div class="drm__exito-icono" [class.drm__exito-icono--tibio]="!fueBueno()" aria-hidden="true">
161
+ <sui-icon [name]="fueBueno() ? 'check-line' : 'heart-3-line'" [size]="32" />
162
+ </div>
163
+ ```
164
+
165
+ ```html
166
+ <!-- ✅ bien -->
167
+ <sui-key-icon [name]="fueBueno() ? 'check-line' : 'heart-3-line'" styleVariant="lighter"
168
+ [color]="fueBueno() ? 'green' : 'blue'" [size]="bp.celular() ? 64 : 56" />
169
+ ```
170
+
171
+ Tamaño por dispositivo
172
+
173
+ ```html
174
+ <!-- ❌ mal: isMobile incluye el celular chico, que va con el valor de web (D16) -->
175
+ <sui-key-icon name="store-2-line" [size]="bp.isMobile() ? 40 : 32" />
176
+ ```
177
+
178
+ ```html
179
+ <!-- ✅ bien -->
180
+ <sui-key-icon name="store-2-line" [size]="bp.celular() ? 40 : 32" />
181
+ ```
182
+
124
183
  ## Ejemplo
125
184
 
126
185
  ```html
@@ -60,11 +60,11 @@ Es el reemplazo del `sui-button` `ghost` `primary`.
60
60
  **Usos de hoy que rompen la regla:**
61
61
 
62
62
  - **4 `error` que abren una destructiva grande → `sui-button` `stroke` `error`:**
63
- `pages/super-admin/master-orders/master-orders.html:425` («Cancelar pedido»),
63
+ `pages/super-admin/master-orders/master-orders.html:467` («Cancelar pedido»),
64
64
  `pages/orders/orders.html:233` («Rechazar pedido»), `pages/central/central-gastos/central-gastos.html:101`
65
- («Anular gasto») y `pages/driver/driver-order-detail/driver-order-detail.html:745` («Cancelar» el
65
+ («Anular gasto») y `pages/driver/driver-order-detail/driver-order-detail.html:774` («Cancelar» el
66
66
  pedido, en `large`; nuevo, medido el 04-10-2026).
67
- - A discutir: `pages/super-admin/master-orders/master-orders.html:430` («Liberar» en `gray`): es una
67
+ - A discutir: `pages/super-admin/master-orders/master-orders.html:472` («Liberar» en `gray`): es una
68
68
  acción de operación, no una salida de baja jerarquía.
69
69
 
70
70
  ### `size`
@@ -98,7 +98,7 @@ Los íconos son nombres RemixIcon sin el prefijo `ri-`. Miden 20 px en `large` y
98
98
  |---|---|---|
99
99
  | `true` | La acción existe pero ahora no se puede: mientras se guarda, mientras se procesa otra acción. Mejor que esconderla si la persona la espera en ese lugar. | cómo se ve: según la guía del DS · cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B8) |
100
100
 
101
- Ejemplos: `components/add-product-modal/add-product-modal.html:339` («Vista previa» mientras guarda),
101
+ Ejemplos: `components/add-product-modal/add-product-modal.html:341` («Vista previa» mientras guarda),
102
102
  `pages/orders/orders.html:233`.
103
103
 
104
104
  ### `href`, `target`, `rel`, `type`, `ariaLabel`
@@ -112,13 +112,13 @@ Ejemplos: `components/add-product-modal/add-product-modal.html:339` («Vista pre
112
112
 
113
113
  ## Tamaño en mobile y en web
114
114
 
115
- En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En la tablet
116
- (`pointer: coarse`) va igual que en el celular, porque también se toca; en la computadora
117
- (`pointer: fine`), `medium`; en el celular chico (< 380 px), `medium` a la vista sin bajar el área de 44.
115
+ En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En el celular y en
116
+ la tablet (`pointer: coarse`) el size está **pendiente (P8)**, porque ningún size del link llega a
117
+ 44; en la computadora (`pointer: fine`), `medium`; en el celular chico (< 380 px), `medium`.
118
118
  Nada en `small` ni `xsmall` (canon, dueño, 05-10-2026, D16; reemplaza al «tamaño por plataforma» del
119
119
  03-10-2026, que bajaba la web a `small`). Hoy la app lo resuelve con `BreakpointsService`
120
120
  (`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px): `[size]="bp.isMobile() ? 'large' : 'medium'"`,
121
- que todavía deja la tablet en `medium` (el helper de D16 está propuesto en la hoja de decisiones). Medido el 04-10-2026 en `master-pedidos`: 166 `[size]`
121
+ que es la propuesta sin aprobar de P8 (ver «Por dispositivo (D16)» abajo). Medido el 04-10-2026 en `master-pedidos`: 166 `[size]`
122
122
  con `bp` (142 `large`/`medium`, 22 `large`/`small`, 2 `medium`/`xsmall`); los 24 que bajan de `medium` se migran.
123
123
 
124
124
  | size | alto | texto | ícono |
@@ -146,10 +146,29 @@ táctil la pone el contenedor: la fila o el bloque donde vive tiene que medir 44
146
146
  dejar aire alrededor del link. `small` (16) no va en ningún lado (D16, 05-10-2026). Medido el 04-10-2026: los 4 de
147
147
  repartidor y cliente ya usan `[size]="bp.isMobile() ? 'medium' : 'small'"`
148
148
  (`pages/driver/driver-profile/driver-profile.html:258` y `:264`,
149
- `pages/driver/driver-dashboard/driver-dashboard.html:1092`,
149
+ `pages/driver/driver-dashboard/driver-dashboard.html:1210`,
150
150
  `pages/customer/order-history/order-history.html:412`). Quedan 2 `small` fijos, los dos del panel
151
- de la empresa: `pages/mi-negocio/mi-negocio.html:474` y
152
- `components/add-product-modal/add-product-modal.html:339`.
151
+ de la empresa: `pages/mi-negocio/mi-negocio.html:473` y
152
+ `components/add-product-modal/add-product-modal.html:341`.
153
+
154
+ ### Por dispositivo (D16)
155
+
156
+ Fila `link-button` de la tabla D16 (dueño, 05-10-2026). Se toca, pero ningún size llega a 44, así
157
+ que el tamaño en las pantallas táctiles espera P8.
158
+
159
+ | dispositivo | size | nota |
160
+ |---|---|---|
161
+ | celular chico (< 380) | `medium` | |
162
+ | celular (380–767) | pendiente (P8) | a) el contenedor (fila o card) llega a 44 y el link va `medium` (recomendada) · b) `large` (24) por legibilidad |
163
+ | tablet táctil (`pointer: coarse`) | pendiente (P8) | la misma pregunta: también se toca con el dedo |
164
+ | computadora (`pointer: fine`) | `medium` | también en filas y cabeceras; `small` no se usa |
165
+
166
+ En el ultrawide, igual que en la computadora. Dentro de un párrafo, el size del texto que lo rodea.
167
+
168
+ En master-pedidos no hay helper hasta que se decida P8: `size="medium"` en la computadora y en el
169
+ celular chico. No uses `bp.sizeControl()` (sería elegir la b) ni bajes a `small`. El
170
+ `[size]="bp.isMobile() ? 'large' : 'medium'"` que hoy lleva el link suelto es la propuesta sin
171
+ aprobar, y además deja el celular chico en `large`.
153
172
 
154
173
  ## «No usar»: por qué no hoy y cuándo sí
155
174
 
@@ -186,9 +205,10 @@ Slots: `<ng-content>` (el texto).
186
205
  ## Trampas
187
206
 
188
207
  - **El output es `(clicked)`**, no `(click)` como en `sui-button`. `(click)` sobre el host igual
189
- funciona porque el clic burbujea, pero hoy hay 6 usos así (`components/subscription-banner/subscription-banner.html:10`,
208
+ funciona porque el clic burbujea, pero hoy hay 8 usos así (`components/subscription-banner/subscription-banner.html:10`,
190
209
  `pages/super-admin/master-approvals/master-approvals.html:89`, `pages/central/central-gastos/central-gastos.html:101`,
191
- `pages/account-suspended/account-suspended.html:66` y `:70`, `pages/customer/viaje/viaje.html:216`).
210
+ `pages/account-suspended/account-suspended.html:66` y `:70`, `pages/customer/viaje/viaje.html:211`,
211
+ `pages/super-admin/master-solicitudes/master-solicitudes.html:47` y `:50`; medido el 06-10-2026).
192
212
  Usa `(clicked)`, que ya respeta `disabled`.
193
213
  - **`rel` arranca en `null`**, a diferencia de compact, fancy y social, que traen
194
214
  `'noopener noreferrer'`. Con `target="_blank"` hay que ponerlo a mano.
@@ -204,6 +224,52 @@ Slots: `<ng-content>` (el texto).
204
224
  toast local). No es la del paquete: un arreglo en el DS no le llega.
205
225
  - Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
206
226
 
227
+ ## Bien y mal
228
+
229
+ Cancelar un pedido
230
+
231
+ ```html
232
+ <!-- ❌ mal: error en link es para quitar algo menor; cancelar el pedido es una destructiva grande (pages/driver/driver-order-detail/driver-order-detail.html:774) -->
233
+ <sui-link-button variant="error" size="large" (clicked)="showCancelModal.set(true)">
234
+ Cancelar {{ comoSeLlama }}
235
+ </sui-link-button>
236
+ ```
237
+
238
+ ```html
239
+ <!-- ✅ bien -->
240
+ <sui-button variant="stroke" color="error" [size]="bp.sizeControl()" (click)="showCancelModal.set(true)">
241
+ Cancelar {{ comoSeLlama }}
242
+ </sui-button>
243
+ ```
244
+
245
+ Link al pie de una sección del panel
246
+
247
+ ```html
248
+ <!-- ❌ mal: small no se usa en ningún lado (D16); igual order-history.html:412 con 'medium' : 'small' (pages/mi-negocio/mi-negocio.html:473) -->
249
+ <sui-link-button variant="gray" size="small" rightIcon="arrow-right-s-line"
250
+ (clicked)="goToProducts()">Ir a Productos</sui-link-button>
251
+ ```
252
+
253
+ ```html
254
+ <!-- ✅ bien -->
255
+ <sui-link-button variant="gray" size="medium" rightIcon="arrow-right-s-line"
256
+ (clicked)="goToProducts()">Ir a Productos</sui-link-button>
257
+ ```
258
+
259
+ Acción que se deshabilita mientras procesa
260
+
261
+ ```html
262
+ <!-- ❌ mal: (click) escucha el host, no el output; (clicked) es el que respeta disabled (pages/super-admin/master-solicitudes/master-solicitudes.html:47) -->
263
+ <sui-link-button variant="gray" size="medium" [disabled]="ocupada() === f.id"
264
+ (click)="cambiar(f, 'nueva')">Reabrir</sui-link-button>
265
+ ```
266
+
267
+ ```html
268
+ <!-- ✅ bien -->
269
+ <sui-link-button variant="gray" size="medium" [disabled]="ocupada() === f.id"
270
+ (clicked)="cambiar(f, 'nueva')">Reabrir</sui-link-button>
271
+ ```
272
+
207
273
  ## Ejemplo
208
274
 
209
275
  ```html
@@ -86,10 +86,13 @@ sobran): `components/ota-update/ota-update.html:17`, `pages/role-selector/role-s
86
86
 
87
87
  ## Tamaño en mobile y en web
88
88
 
89
- En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
90
- pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
91
- breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
92
- el celular (cliente, repartidor) va directo el valor de mobile. Es **canon (aprobado por el dueño, 05-10-2026, bloque B1)**.
89
+ En el celular va un paso más grande que en la computadora: el logo no se toca, así que sigue la
90
+ regla de «lo que no se toca» (P1 b). Se elige siempre con el servicio de breakpoints de la app
91
+ (`bp`, en `services/breakpoints.service.ts`), **también en las pantallas que solo existen en el
92
+ celular** (cliente, repartidor): con D16 el celular chico (< 380) lleva el valor de web en la
93
+ pantalla de entrada, así que «mobile» ya no es un valor fijo para ellas (ver «Por dispositivo»).
94
+ En la tabla, «mobile» es el celular de 380 a 767 px y «web» la computadora. Es **canon (aprobado
95
+ por el dueño, 05-10-2026, bloque B1 y D16)**.
93
96
 
94
97
  | uso | mobile | web |
95
98
  |---|---|---|
@@ -104,6 +107,34 @@ el celular (cliente, repartidor) va directo el valor de mobile. Es **canon (apro
104
107
  En la barra no cambia el alto, cambia la forma: en mobile no entra la palabra. Es lo que ya hace
105
108
  `layouts/public/public-layout.html:4`–`:6`, con dos logos y CSS.
106
109
 
110
+ ### Por dispositivo (D16)
111
+
112
+ El logo **no se toca**, así que va como «lo que no se toca» de D16 (la misma fila que
113
+ `brand-logo`): sube un paso solo en el celular de 380 px o más; el celular chico, la tablet y la
114
+ computadora llevan el valor de web (con el matiz de la tablet de 600 a 767, abajo). En la
115
+ práctica solo cambia la pantalla de entrada: la barra cambia de forma por ancho (no de tamaño) y
116
+ la pantalla de marca va a 120 en todos.
117
+
118
+ La app distingue el celular **por ancho, no por puntero**: `bp.celular()` y `bp.isMobile()` son
119
+ `max-width: 767px`. Por eso la tablet táctil de 600 a 767 px (una Android chica en vertical) cae
120
+ del lado del celular, igual que con `bp.sizeBadge()`; la tablet «de web» empieza en 768.
121
+
122
+ | dispositivo | size | nota |
123
+ |---|---|---|
124
+ | celular chico (< 380) | entrada `xl` · barra `[markOnly]="true"` `lg` | valor de web en el tamaño; la palabra tampoco entra en la barra |
125
+ | celular (380–767) | entrada `2xl` · barra `[markOnly]="true"` `lg` | sube un paso (P1 b) |
126
+ | tablet táctil, 600–767 | entrada `2xl` · barra `[markOnly]="true"` `lg` | se lee como celular: la app separa por ancho, no por puntero |
127
+ | tablet táctil, 768–1024 | entrada `xl` · barra `horizontal` `lg` | no se toca: valor de web; desde 768 la palabra ya entra |
128
+ | computadora | entrada `xl` · barra `horizontal` `lg` | |
129
+
130
+ Ultrawide: igual que la computadora; el espacio extra no agranda el logo. La pantalla de marca
131
+ («Acerca de», actualización) es `stacked` `[height]="120"` en los cinco. Fuente: D16, dueño
132
+ 05-10-2026.
133
+
134
+ En master-pedidos: no hay helper. Entrada `[size]="bp.celular() ? '2xl' : 'xl'"`; barra
135
+ `size="lg" [markOnly]="bp.isMobile()"`. Se usa `bp.celular()` y no `bp.tactil()`: el logo no
136
+ se toca, la tablet desde 768 no sube.
137
+
107
138
  ## «No usar»: por qué no hoy y cuándo sí
108
139
 
109
140
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -139,6 +170,45 @@ Outputs: ninguno.
139
170
  - **No trae padding**: el `viewBox` es justo el dibujo. El aire lo pone quien lo usa.
140
171
  - **No es `sui-brand-logo`**: ese sirve logos de otras marcas como imágenes que no se pueden teñir.
141
172
 
173
+ ## Bien y mal
174
+
175
+ Un tamaño de la escala, no un alto a mano
176
+
177
+ ```html
178
+ <!-- ❌ mal: alto libre por debajo de 48 (components/ota-update/ota-update.html:17) -->
179
+ <sui-logo orientation="horizontal" [height]="40" />
180
+ ```
181
+
182
+ ```html
183
+ <!-- ✅ bien -->
184
+ <sui-logo size="xl" />
185
+ ```
186
+
187
+ El logo en el pie de la landing
188
+
189
+ ```html
190
+ <!-- ❌ mal: PNG suelto, no sigue al dibujo ni al tema (components/landing-footer/landing-footer.html:7) -->
191
+ <img src="assets/landing/logo-blanco.png" alt="Master Pedidos" width="150" height="53" />
192
+ ```
193
+
194
+ ```html
195
+ <!-- ✅ bien -->
196
+ <sui-logo size="2xl" markColor="var(--sui-static-white)" textColor="var(--sui-static-white)" />
197
+ ```
198
+
199
+ Selector de rol en el celular y en la computadora
200
+
201
+ ```html
202
+ <!-- ❌ mal: 2xl fijo y los colores que ya son el default (pages/role-selector/role-selector.html:10) -->
203
+ <sui-logo orientation="horizontal" size="2xl"
204
+ markColor="var(--sui-primary-base)" textColor="var(--sui-text-strong-950)" />
205
+ ```
206
+
207
+ ```html
208
+ <!-- ✅ bien -->
209
+ <sui-logo [size]="bp.celular() ? '2xl' : 'xl'" />
210
+ ```
211
+
142
212
  ## Ejemplo
143
213
 
144
214
  ```html