@ajuarezso/sui-design-system 0.25.0 → 0.25.2

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 (120) 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/fesm2022/ajuarezso-sui-design-system.mjs +216 -227
  118. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  119. package/package.json +1 -1
  120. package/types/ajuarezso-sui-design-system.d.ts +68 -45
@@ -29,9 +29,10 @@ Regla corta: **local en un listado del cliente → store-card · local en un pan
29
29
  > (`deliveryText`, `distanceText`) desde que la tarjeta y el checkout cobraban distinto.
30
30
  >
31
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`,
32
+ > store-cards en 2 archivos**: favoritos del cliente (`pages/customer/favorites/favorites.html:117`,
33
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
34
+ > (`pages/super-admin/master-approvals/master-approvals.html:31`, en vista previa). Líneas
35
+ > revisadas el 06-10-2026. El inicio del
35
36
  > cliente arma sus filas de locales con clases propias.
36
37
 
37
38
  ### Los estados (salen de `store`)
@@ -56,8 +57,10 @@ Regla corta: **local en un listado del cliente → store-card · local en un pan
56
57
  | `(ratingClicked)` | La nota abre las opiniones y la info del local (`StoreRatingsModalService`). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
57
58
  | `disableLink` | La tarjeta no navega (una vitrina, una lámina, una vista previa). | según el código |
58
59
 
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`).
60
+ **Usos de hoy que rompen las reglas:** 1. Favoritos pasa `small` en la computadora
61
+ (`pages/customer/favorites/favorites.html:117`, `[size]="bp.isMobile() ? 'large' : 'small'"`): con
62
+ D16 va `medium` (ver «Por dispositivo»). A mirar: la cola de aprobación no pasa `deliveryText`
63
+ (deduce el envío del `deliveryType`).
61
64
 
62
65
  ## Tamaño en mobile y en web
63
66
 
@@ -77,12 +80,32 @@ El ancho lo da el contenedor. El `size` cambia **el corazón de favorito**, en l
77
80
  | nota (abre las opiniones) | `large`: se ve igual (≈ 38) y se toca en 44 de alto con un `::before` invisible que no se estira a los lados (no pisa la columna de al lado) | ≈ 38: padding 4 × 2 + etiqueta de 10 px + gap 2 + valor de 13 px, con el `line-height` heredado | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono (área) · medido del `.scss` (alto visible) |
78
81
 
79
82
  ```html
80
- <sui-store-card [store]="local" [size]="bp.isMobile() ? 'large' : 'medium'" />
83
+ <sui-store-card [store]="local" [size]="bp.sizeControl()" />
81
84
  ```
82
85
 
83
- `medium` (40) es el de la computadora (D16); la tablet va como el teléfono, porque se toca. **Favoritos no pasa `size`**
84
- (`pages/customer/favorites/favorites.html`): en el teléfono el corazón queda en 36 hasta que la
85
- app le pase `[size]="bp.isMobile() ? 'large' : 'medium'"` (cambio de la app, no del DS).
86
+ `medium` (40) es el de la computadora (D16); la tablet va como el teléfono, porque se toca.
87
+ **Favoritos pasa `small` en la computadora** (`pages/customer/favorites/favorites.html:117`,
88
+ `[size]="bp.isMobile() ? 'large' : 'small'"`): el corazón queda en 36 y en un iPad de 768 o más
89
+ también, porque `isMobile()` no mira el puntero. Va `[size]="bp.sizeControl()"` (cambio de la app,
90
+ no del DS).
91
+
92
+ ### Por dispositivo (D16)
93
+
94
+ El corazón y la nota se tocan: la tarjeta sigue la fila «lo que se toca». Fuente: D16, dueño
95
+ 05-10-2026 (tabla por componente: «el default del componente es `small`: hay que pasar `size`»).
96
+
97
+ | dispositivo | size | nota |
98
+ |---|---|---|
99
+ | celular chico (< 380) | `large` (interino) | D16 pide `medium` con área de 44, pero el DS todavía no estira el corazón de 40 a 44: hasta que lo haga, se queda `large` |
100
+ | celular (380–767) | `large` | corazón de 44 y la nota tocable en 44 de alto |
101
+ | tablet táctil (`pointer: coarse`) | `large` | se toca igual que el teléfono |
102
+ | computadora (`pointer: fine`) | `medium` | corazón de 40; nunca `small` (el default) |
103
+
104
+ En el ultrawide, igual que en la computadora: el espacio extra va a más columnas en la grilla, no
105
+ a una tarjeta más grande.
106
+
107
+ En master-pedidos: `[size]="bp.sizeControl()"` (`large` en todo celular y pantalla táctil,
108
+ `medium` en la computadora).
86
109
 
87
110
  ## «No usar»: por qué no hoy y cuándo sí
88
111
 
@@ -139,11 +162,51 @@ app le pase `[size]="bp.isMobile() ? 'large' : 'medium'"` (cambio de la app, no
139
162
  - Los íconos usan `color="var(--sui-primary-base, #fa7319)"`: el hex es respaldo, no se repite
140
163
  afuera.
141
164
 
165
+ ## Bien y mal
166
+
167
+ Corazón en la computadora
168
+
169
+ ```html
170
+ <!-- ❌ mal: small (36) en la computadora y en el iPad; D16 pide medium y large (pages/customer/favorites/favorites.html:117) -->
171
+ <sui-store-card [size]="bp.isMobile() ? 'large' : 'small'" [store]="fav" [isFavorite]="true" />
172
+ ```
173
+
174
+ ```html
175
+ <!-- ✅ bien -->
176
+ <sui-store-card [size]="bp.sizeControl()" [store]="fav" [isFavorite]="true" />
177
+ ```
178
+
179
+ Envío y distancia en un listado nuevo
180
+
181
+ ```html
182
+ <!-- ❌ mal: sin deliveryText la tarjeta deduce el envío del deliveryType y puede cobrar distinto que el checkout (mismo patrón que pages/super-admin/master-approvals/master-approvals.html:31, a mirar) -->
183
+ <sui-store-card [store]="local" [size]="bp.sizeControl()" />
184
+ ```
185
+
186
+ ```html
187
+ <!-- ✅ bien: el texto llega escrito; null quita la columna -->
188
+ <sui-store-card [store]="local" [size]="bp.sizeControl()"
189
+ [deliveryText]="envioDeLaTarjeta(local)" [distanceText]="distanciaDeLaTarjeta(local)" />
190
+ ```
191
+
192
+ Tarjeta en una vitrina
193
+
194
+ ```html
195
+ <!-- ❌ mal: sin disableLink la tarjeta navega a /cliente/restaurante/:id desde una lámina -->
196
+ <sui-store-card [store]="local" [size]="bp.sizeControl()" />
197
+ ```
198
+
199
+ ```html
200
+ <!-- ✅ bien -->
201
+ <sui-store-card [store]="local" [size]="bp.sizeControl()" [disableLink]="true" />
202
+ ```
203
+
142
204
  ## Ejemplo
143
205
 
144
206
  ```html
145
207
  <sui-store-card
146
208
  [store]="local"
209
+ [size]="bp.sizeControl()"
147
210
  [isFavorite]="true"
148
211
  [deliveryText]="envioDeLaTarjeta(local)"
149
212
  [distanceText]="distanciaDeLaTarjeta(local)"
@@ -51,8 +51,8 @@ Regla corta: **se aplica ya → switch · se confirma después → checkbox · d
51
51
 
52
52
  | size | px | cuándo | fuente |
53
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) |
54
+ | `xlarge` | 48 × 28 | Celular y tablet táctil: `bp.tactil() ? 'xlarge' : 'large'`. 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»); la tablet: D16, dueño 05-10-2026 |
55
+ | `large` | 40 × 24 | Computadora. | canon (aprobado por el dueño, 28-09-2026); confirmado en D16, dueño 06-10-2026 |
56
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
57
 
58
58
  ### La etiqueta dice lo que hace, no el estado
@@ -85,18 +85,39 @@ de la tabla), `pages/super-admin/master-settings/master-settings.html:105`, los
85
85
 
86
86
  ## Tamaño en mobile y en web
87
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` |
88
+ | uso | mobile | web | fuente |
89
+ |---|---|---|---|
90
+ | switch en una fila, tabla o tarjeta | `xlarge` (48 × 28) | `large` (40 × 24) | canon (aprobado por el dueño, 28-09-2026); web confirmado en D16, dueño 06-10-2026 |
91
+ | switch que es la acción principal de la tarjeta (ofertas de Central) | `xlarge` | `xlarge` | canon (aprobado por el dueño, 28-09-2026). Excepción previa a D16: la tabla de D16 pone `large` en la computadora y no la menciona. Pendiente de confirmar |
92
92
 
93
93
  ```html
94
- <sui-switch [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
94
+ <sui-switch [size]="bp.tactil() ? 'xlarge' : 'large'" … />
95
95
  ```
96
96
 
97
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
98
  va `sui-switch-label`, que hace tocable todo el bloque.
99
99
 
100
+ ### Por dispositivo (D16)
101
+
102
+ Fila de `switch` en la tabla de D16 (dueño, 05-10-2026; computadora resuelta el 06-10-2026): se
103
+ toca, y en la computadora va **un paso menos que en el celular**, sin bajar a `medium`.
104
+
105
+ | dispositivo | size | nota |
106
+ |---|---|---|
107
+ | celular chico (< 380 px) | `xlarge` (48 × 28) | la fila que lo contiene da los 44 de alto |
108
+ | celular (380–767 px) | `xlarge` (48 × 28) | |
109
+ | tablet táctil (`pointer: coarse`) | `xlarge` (48 × 28) | se toca con el dedo, aunque mida más de 767 |
110
+ | computadora (`pointer: fine`) | `large` (40 × 24) | un paso menos que el celular (dueño, 06-10-2026) |
111
+
112
+ Ultrawide (≥ 1920 px): igual que la computadora, `large`. `medium` no se usa en ningún dispositivo
113
+ (ver «No usar»).
114
+
115
+ En master-pedidos: `[size]="bp.tactil() ? 'xlarge' : 'large'"`, la misma expresión que
116
+ `sui-switch-label`. La fila de D16 nombra `bp.controlSize()`, que es lo que usan los 25 switches de
117
+ hoy, pero ese helper mira solo el ancho (`isMobile()`, ≤ 767): en un iPad de 768 o más da `large`.
118
+ `bp.tactil()` también mira el puntero y da lo que pide la tabla. Si `controlSize()` pasa a mirar
119
+ `tactil()`, los 25 quedan bien sin tocar las pantallas.
120
+
100
121
  ## «No usar»: por qué no hoy y cuándo sí
101
122
 
102
123
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -138,14 +159,64 @@ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
138
159
  enfocable. `tabindex="-1"` en el host no sirve: el binding del componente lo pisa.
139
160
  - Ya trae el arreglo de iOS para el `:active` pegado.
140
161
 
162
+ ## Bien y mal
163
+
164
+ Interruptor con su texto al lado
165
+
166
+ ```html
167
+ <!-- ❌ mal: texto armado a mano y sin size, queda en medium (pages/drivers/drivers.html:58) -->
168
+ <label class="drivers__autoconfirm">
169
+ <div class="drivers__autoconfirm-text">
170
+ <span class="drivers__autoconfirm-title">Aceptar pedidos automáticamente</span>
171
+ <span class="drivers__autoconfirm-desc">El pedido salta la confirmación y pasa directo a buscar repartidor (como los locales administrados).</span>
172
+ </div>
173
+ <sui-switch [checked]="autoConfirm()" (checkedChange)="setAutoConfirm($event)" />
174
+ </label>
175
+ ```
176
+
177
+ ```html
178
+ <!-- ✅ bien -->
179
+ <sui-switch-label [size]="bp.tactil() ? 'xlarge' : 'large'" [flip]="true"
180
+ label="Aceptar pedidos automáticamente"
181
+ description="El pedido salta la confirmación y pasa directo a buscar repartidor (como los locales administrados)."
182
+ [active]="autoConfirm()" (activeChange)="setAutoConfirm($event)" />
183
+ ```
184
+
185
+ Estado de un empleado en su tarjeta
186
+
187
+ ```html
188
+ <!-- ❌ mal: large fijo en el teléfono y una etiqueta que cambia con el estado (pages/employees/employees.html:99) -->
189
+ <sui-switch size="large" [checked]="employee.status === 'Activo'" (checkedChange)="toggleStatus(employee.id)" />
190
+ <span class="employees__toggle-label">{{ employee.status }}</span>
191
+ ```
192
+
193
+ ```html
194
+ <!-- ✅ bien -->
195
+ <sui-switch-label [size]="bp.tactil() ? 'xlarge' : 'large'" label="Empleado activo"
196
+ [active]="employee.status === 'Activo'" (activeChange)="toggleStatus(employee.id)" />
197
+ ```
198
+
199
+ Pelado sin nombre accesible
200
+
201
+ ```html
202
+ <!-- ❌ mal: sin aria-label el lector de pantalla dice «interruptor» y nada más -->
203
+ <sui-switch [size]="bp.tactil() ? 'xlarge' : 'large'" [checked]="oferta.activo" (checkedChange)="prender(oferta, $event)" />
204
+ ```
205
+
206
+ ```html
207
+ <!-- ✅ bien -->
208
+ <sui-switch [size]="bp.tactil() ? 'xlarge' : 'large'" [checked]="oferta.activo"
209
+ [attr.aria-label]="'Prender ' + oferta.titulo" (checkedChange)="prender(oferta, $event)" />
210
+ ```
211
+
141
212
  ## Ejemplo
142
213
 
143
214
  ```html
144
215
  <!-- Pelado en una tarjeta que ya tiene su título -->
145
- <sui-switch [size]="bp.controlSize()" [checked]="oferta.activo" [disabled]="guardando()"
216
+ <sui-switch [size]="bp.tactil() ? 'xlarge' : 'large'" [checked]="oferta.activo" [disabled]="guardando()"
146
217
  [attr.aria-label]="'Prender ' + oferta.titulo" (checkedChange)="prender(oferta, $event)" />
147
218
 
148
219
  <!-- Con texto: sui-switch-label -->
149
- <sui-switch-label [size]="bp.controlSize()" label="Recibir pedidos" [flip]="true"
220
+ <sui-switch-label [size]="bp.tactil() ? 'xlarge' : 'large'" label="Recibir pedidos" [flip]="true"
150
221
  [(active)]="abierto" />
151
222
  ```
@@ -62,13 +62,15 @@ Regla corta: **ajuste con peso, al toque → switch-card · lista de ajustes →
62
62
  | size | cuándo | fuente |
63
63
  |---|---|---|
64
64
  | `xlarge` (48 × 28) | Mobile, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
65
- | `large` (40 × 24) | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
65
+ | `large` (40 × 24) | Computadora, vía `bp.controlSize()`. Un paso menos que el celular; no baja a `medium`. | canon (aprobado por el dueño, 28-09-2026); confirmado en D16, dueño 06-10-2026 |
66
66
  | `medium` (default) | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
67
67
 
68
- **Usos de hoy que rompen las reglas: 0.** Los 10 que se guardaban con un botón (métodos de pago
69
- de mi-negocio y 5 ajustes de master-settings) pasaron a `sui-checkbox-card`, y el de
70
- `pages/notifications/notifications.html:59` («Sonidos de la app») ya lleva `bp.controlSize()`,
71
- los dos el 03-10-2026.
68
+ **Usos de hoy que rompen las reglas: 1** (medido el 06-10-2026, 22 switch-cards en 11 archivos).
69
+ `pages/super-admin/master-categorias/master-categorias.html:170` («Chapa «Beta»») va con
70
+ `size="large"` fijo: en el teléfono queda un paso chico. Va `[size]="bp.controlSize()"`. Los 10 que
71
+ se guardaban con un botón (métodos de pago de mi-negocio y 5 ajustes de master-settings) pasaron a
72
+ `sui-checkbox-card`, y el de `pages/notifications/notifications.html:59` («Sonidos de la app») ya
73
+ lleva `bp.controlSize()`, los dos el 03-10-2026.
72
74
 
73
75
  ## Tamaño en mobile y en web
74
76
 
@@ -84,6 +86,22 @@ borde) y 54 px la más chica (`basic`, sin descripción, `medium`). Llega al pis
84
86
  <sui-switch-card [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
85
87
  ```
86
88
 
89
+ ### Por dispositivo (D16)
90
+
91
+ Fuente: D16, dueño 05-10-2026, con la fila de checkbox, radio y switch resuelta el 06-10-2026.
92
+
93
+ | dispositivo | size | nota |
94
+ |---|---|---|
95
+ | celular chico (< 380) | `xlarge` | la card entera ya pasa de 44; el size solo agranda el interruptor |
96
+ | celular (380–767) | `xlarge` | |
97
+ | tablet táctil (`pointer: coarse`) | `xlarge` | `bp.controlSize()` mira solo el ancho: un iPad de 768 o más recibe `large` hasta que el helper mire el puntero |
98
+ | computadora (`pointer: fine`) | `large` | un paso menos que el celular; no baja a `medium` (D16, dueño 06-10-2026) |
99
+
100
+ Ultrawide: igual que la computadora (`large`).
101
+
102
+ En master-pedidos: `[size]="bp.controlSize()"` (`xlarge` hasta 767 px, `large` desde ahí). La
103
+ expresión exacta de D16, con la tablet, es `bp.tactil() ? 'xlarge' : 'large'`.
104
+
87
105
  ## «No usar»: por qué no hoy y cuándo sí
88
106
 
89
107
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -91,7 +109,7 @@ borde) y 54 px la más chica (`basic`, sin descripción, `medium`). Llega al pis
91
109
  | `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`) |
92
110
  | `type="avatar"` (0 usos) | no se prende ni apaga a una persona | prender o apagar a un repartidor de tu flota |
93
111
  | `type="brand"` / `"company"` / `"card-provider"` (0 usos) | no hay integraciones | casi nunca: una integración es `sui-integration-switch` |
94
- | `size="medium"` | el interruptor de 32 × 20 se pierde en el teléfono | una tabla densa solo de desktop |
112
+ | `size="medium"` | el interruptor de 32 × 20 se pierde en el teléfono | no hay: en la computadora va `large` (D16, dueño 06-10-2026) |
95
113
 
96
114
  ## API
97
115
 
@@ -135,6 +153,52 @@ Slot: `[sui-switch-card-leading]` (el ícono o el logo). Implementa `ControlValu
135
153
  - El interruptor siempre va a la derecha (no hay `flip`).
136
154
  - `badge` con string sale **azul `light` `small`** (en `sui-switch-label` sale naranja).
137
155
 
156
+ ## Bien y mal
157
+
158
+ Tamaño fijo
159
+
160
+ ```html
161
+ <!-- ❌ mal: large fijo; en el teléfono el interruptor queda un paso chico (pages/super-admin/master-categorias/master-categorias.html:170) -->
162
+ <sui-switch-card type="basic" size="large" label="Chapa «Beta»"
163
+ [checked]="!!e.etiqueta" (checkedChange)="editar('etiqueta', $event ? 'Beta' : '')" />
164
+ ```
165
+
166
+ ```html
167
+ <!-- ✅ bien -->
168
+ <sui-switch-card type="basic" [size]="bp.controlSize()" label="Chapa «Beta»"
169
+ [checked]="!!e.etiqueta" (checkedChange)="editar('etiqueta', $event ? 'Beta' : '')" />
170
+ ```
171
+
172
+ Interruptor que no se mueve
173
+
174
+ ```html
175
+ <!-- ❌ mal: es controlada; sin checkedChange el toque no cambia nada -->
176
+ <sui-switch-card type="basic" [size]="bp.controlSize()" label="Estoy trabajando"
177
+ [checked]="isAvailable()" />
178
+ ```
179
+
180
+ ```html
181
+ <!-- ✅ bien (como pages/driver/driver-dashboard/driver-dashboard.html:211) -->
182
+ <sui-switch-card type="basic" [size]="bp.controlSize()" label="Estoy trabajando"
183
+ [checked]="isAvailable()" (checkedChange)="onAvailabilityChange($event)" />
184
+ ```
185
+
186
+ Ícono del ajuste
187
+
188
+ ```html
189
+ <!-- ❌ mal: el ícono no se proyecta con slot=; left-icon queda con el círculo vacío -->
190
+ <sui-switch-card type="left-icon" [size]="bp.controlSize()" label="Notificaciones" [checked]="push()" (checkedChange)="cambiarPush($event)">
191
+ <sui-icon slot="leading" name="notification-3-line" [size]="20" />
192
+ </sui-switch-card>
193
+ ```
194
+
195
+ ```html
196
+ <!-- ✅ bien -->
197
+ <sui-switch-card type="left-icon" [size]="bp.controlSize()" label="Notificaciones" [checked]="push()" (checkedChange)="cambiarPush($event)">
198
+ <sui-icon sui-switch-card-leading name="notification-3-line" [size]="20" />
199
+ </sui-switch-card>
200
+ ```
201
+
138
202
  ## Ejemplo
139
203
 
140
204
  ```html
@@ -34,9 +34,9 @@ Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · s
34
34
  > **5 usos en 4 archivos**, todos con `description`. Desde el 03-10-2026, 3 con `flip` (los
35
35
  > ajustes del producto en `add-product-modal` y la analítica de `privacidad`) y 2 sin él porque
36
36
  > viven dentro de un formulario (el horario de una categoría en `products`, «Cerrar por hoy» en
37
- > `central-inicio`). Tamaños: 2 `ctrlSize()`
38
- > (`large`/`xlarge`), 1 `xlarge` fijo, 2 sin `size` (`medium`). Hay **19 `sui-switch` con el texto
39
- > armado a mano** y 1 nativo que deberían ser este componente.
37
+ > `central-inicio`). Tamaños (revisado el 06-10-2026): 2 `ctrlSize()` (`large`/`xlarge`), 1
38
+ > `bp.isMobile() ? '2xlarge' : 'xlarge'` («Cerrar por hoy»), 2 sin `size` (`medium`). Hay **19
39
+ > `sui-switch` con el texto armado a mano** y 1 nativo que deberían ser este componente.
40
40
 
41
41
  ### Las piezas
42
42
 
@@ -54,13 +54,14 @@ Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · s
54
54
 
55
55
  | size | cuándo | fuente |
56
56
  |---|---|---|
57
- | `xlarge` | Mobile, vía `bp.controlSize()`; y cuando el ajuste es la acción principal de la pantalla («Cerrar por hoy» en Central). | canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
58
- | `large` | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
57
+ | `xlarge` | Celular y tablet táctil: `[size]="bp.tactil() ? 'xlarge' : 'large'"`. Con descripción la fila pasa los 44 sola. En la computadora, solo si el ajuste es la acción principal de la pantalla («Cerrar por hoy» en Central): excepción previa a D16, pendiente de confirmar. | celular y tablet: D16 (fila de checkbox, radio y switch, dueño 05-10-2026); computadora: canon (aprobado por el dueño, 28-09-2026: «componentes grandes») |
58
+ | `large` | Computadora. | canon (aprobado por el dueño, 28-09-2026); confirmado en D16, dueño 06-10-2026 |
59
+ | `2xlarge` | Existe: la misma fila de `xlarge` con `min-height: 44px`. En qué dispositivo va está **pendiente** (ver «Por dispositivo»). | el size: canon (dueño, 04-10-2026: piso táctil 44 en el teléfono); su uso: pendiente |
59
60
  | `medium` (default) | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
60
61
 
61
62
  **Usos de hoy que rompen las reglas:**
62
63
 
63
- - **2 en `medium`:** `pages/products/products.html:301` («Horario propio
64
+ - **2 en `medium`:** `pages/products/products.html:303` («Horario propio
64
65
  para esta categoría») y `pages/public/privacidad/privacidad.html:132` («Permitir analítica de uso»).
65
66
  - **19 `sui-switch` con texto a mano + 1 nativo** que deberían ser este componente: el detalle
66
67
  está en el README de `sui-switch`. Ejemplos: `pages/discounts/discounts.html:207`,
@@ -70,11 +71,11 @@ Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · s
70
71
 
71
72
  | uso | mobile | web | fuente |
72
73
  |---|---|---|---|
73
- | fila de ajustes | `2xlarge` (fila de 44 como mínimo, switch 48 × 28) | `large` (40 × 24) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
74
- | ajuste que es la acción principal de la pantalla («Cerrar por hoy») | `2xlarge` | `xlarge` | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
74
+ | fila de ajustes | `xlarge` (switch 48 × 28; con descripción la fila pasa los 44) | `large` (40 × 24) | D16 (fila de checkbox, radio y switch, dueño 05-10-2026; computadora 06-10-2026) |
75
+ | ajuste que es la acción principal de la pantalla («Cerrar por hoy») | `xlarge` | `xlarge` | mobile: D16. Web `xlarge`: excepción previa a D16 (canon, dueño 28-09-2026), que pone `large` en la computadora y no la menciona. Pendiente de confirmar |
75
76
 
76
77
  ```html
77
- <sui-switch-label [size]="bp.isMobile() ? '2xlarge' : 'large'" … />
78
+ <sui-switch-label [size]="bp.tactil() ? 'xlarge' : 'large'" … />
78
79
  ```
79
80
 
80
81
  | size | switch | label | descripción | alto de la fila sin descripción |
@@ -85,13 +86,35 @@ Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · s
85
86
  | `2xlarge` | 48 × 28 | 16/24 | 12/16 | **44** (`min-height`) |
86
87
 
87
88
  El bloque entero se toca, así que con descripción la fila pasa los 44 px sola. Sin descripción
88
- `xlarge` mide 28: en el teléfono va `2xlarge` (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono), que es la misma fila con
89
- `min-height: 44px` y todo centrado en vertical. `2xlarge` no es un size del switch: el switch
90
- interno se queda en `xlarge`.
89
+ `xlarge` mide 28. `2xlarge` es la misma fila con `min-height: 44px` y todo centrado en vertical
90
+ (canon, dueño 04-10-2026: piso táctil 44 en el teléfono). `2xlarge` no es un size del switch: el
91
+ switch interno se queda en `xlarge`.
91
92
 
92
93
  En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el label va en 16/24; sublabel y
93
94
  descripción se quedan en 12.
94
95
 
96
+ ### Por dispositivo (D16)
97
+
98
+ | dispositivo | size | nota |
99
+ |---|---|---|
100
+ | celular chico (< 380 px) | `xlarge` (switch 48 × 28) | con descripción la fila pasa los 44; sin descripción mide 28 (ver pendiente) |
101
+ | celular (380–767 px) | `xlarge` | igual |
102
+ | tablet táctil (`pointer: coarse`) | `xlarge` | se toca con el dedo, aunque mida más de 767 |
103
+ | computadora (`pointer: fine`) | `large` | un paso menos que el celular; no baja a `medium` (D16, dueño 06-10-2026) |
104
+
105
+ Ultrawide (≥ 1920 px): igual que la computadora (`large`).
106
+
107
+ **Pendiente: `2xlarge` en la fila sin descripción.** El canon del 04-10-2026 pide una fila de 44 en
108
+ el teléfono, y en este componente eso es `2xlarge`. La fila de D16 (05-10 y 06-10-2026) dice
109
+ `xlarge` para toda la familia y no nombra `2xlarge`. Con descripción no chocan: `xlarge` ya pasa
110
+ los 44, y los 5 usos de hoy la tienen. Sin descripción, `xlarge` deja la fila en 28 y D16 no dice
111
+ si sube a `2xlarge`. Lo decide el dueño; hasta entonces va `xlarge` y, si el ajuste no tiene
112
+ descripción, conviene escribirle una.
113
+
114
+ En master-pedidos: `[size]="bp.tactil() ? 'xlarge' : 'large'"`. La fila de D16 nombra
115
+ `bp.controlSize()`, pero ese helper mira solo el ancho (`isMobile()`, ≤ 767): en un iPad de 768 o
116
+ más da `large`. `bp.tactil()` también mira el puntero y da lo que pide la tabla.
117
+
95
118
  ## «No usar»: por qué no hoy y cuándo sí
96
119
 
97
120
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -139,11 +162,65 @@ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
139
162
  - El switch de adentro es el tab stop y toma su nombre del `label` y su descripción de la
140
163
  `description` (`aria-labelledby` / `aria-describedby`) (revisión 04-10-2026).
141
164
 
165
+ ## Bien y mal
166
+
167
+ Ajuste en una página que también se abre en el teléfono
168
+
169
+ ```html
170
+ <!-- ❌ mal: sin size queda en medium, switch de 32 × 20 (pages/public/privacidad/privacidad.html:132) -->
171
+ <sui-switch-label [flip]="true" label="Permitir analítica de uso"
172
+ description="Se puede activar o desactivar en cualquier momento. Nada de lo que escribes sale de tu dispositivo."
173
+ [active]="analiticaActiva()" (activeChange)="cambiarAnalitica($event)" />
174
+ ```
175
+
176
+ ```html
177
+ <!-- ✅ bien -->
178
+ <sui-switch-label [size]="bp.tactil() ? 'xlarge' : 'large'" [flip]="true" label="Permitir analítica de uso"
179
+ description="Se puede activar o desactivar en cualquier momento. Nada de lo que escribes sale de tu dispositivo."
180
+ [active]="analiticaActiva()" (activeChange)="cambiarAnalitica($event)" />
181
+ ```
182
+
183
+ Ajuste dentro de un modal con formulario
184
+
185
+ ```html
186
+ <!-- ❌ mal: sin size queda en medium en el teléfono y en la computadora (pages/products/products.html:303) -->
187
+ <sui-switch-label
188
+ label="Horario propio para esta categoría"
189
+ description="Fuera de ese horario, sus productos se ven atenuados y no se pueden agregar al carrito. Sin horario propio, la categoría está disponible siempre."
190
+ [active]="categoryScheduleEnabled()"
191
+ [disabled]="categoryScheduleSaving()"
192
+ (activeChange)="categoryScheduleEnabled.set($event)" />
193
+ ```
194
+
195
+ ```html
196
+ <!-- ✅ bien: sin flip, porque vive dentro de un formulario -->
197
+ <sui-switch-label
198
+ [size]="bp.tactil() ? 'xlarge' : 'large'"
199
+ label="Horario propio para esta categoría"
200
+ description="Fuera de ese horario, sus productos se ven atenuados y no se pueden agregar al carrito. Sin horario propio, la categoría está disponible siempre."
201
+ [active]="categoryScheduleEnabled()"
202
+ [disabled]="categoryScheduleSaving()"
203
+ (activeChange)="categoryScheduleEnabled.set($event)" />
204
+ ```
205
+
206
+ Link sin descripción
207
+
208
+ ```html
209
+ <!-- ❌ mal: link solo se dibuja con description; «Qué se mide» no aparece -->
210
+ <sui-switch-label label="Permitir analítica de uso" link="Qué se mide" [(active)]="analitica" />
211
+ ```
212
+
213
+ ```html
214
+ <!-- ✅ bien -->
215
+ <sui-switch-label [size]="bp.tactil() ? 'xlarge' : 'large'" label="Permitir analítica de uso"
216
+ description="Nada de lo que escribes sale de tu dispositivo." link="Qué se mide" [(active)]="analitica" />
217
+ ```
218
+
142
219
  ## Ejemplo
143
220
 
144
221
  ```html
145
222
  <sui-switch-label
146
- [size]="bp.controlSize()"
223
+ [size]="bp.tactil() ? 'xlarge' : 'large'"
147
224
  [flip]="true"
148
225
  label="Recibir pedidos"
149
226
  description="Desactívalo para cerrar un rato sin tocar el horario."
@@ -41,11 +41,12 @@ secciones → tab menu.**
41
41
  > **La guía del DS no tiene este componente**: es una extensión de SUI (la «cat nav» de las apps de
42
42
  > delivery). Las reglas marcadas canon están aprobadas; lo que sigue en propuesta espera decisión.
43
43
  >
44
- > Uso medido el 04-10-2026 en `master-pedidos/src/app` (sin `master-preview`, `master-prototipos`,
44
+ > Uso medido el 06-10-2026 en `master-pedidos/src/app` (sin `master-preview`, `master-prototipos`,
45
45
  > `mockup-sheets-*`, `dx/*`, `master-rutina`, `master-medico`, `dev-index`):
46
- > **42 usos en 29 archivos `.html`** (incluye `master-ejercicios`). `[sticky]="true"`: 2 (la carta
46
+ > **44 usos en 31 archivos `.html`** (incluye `master-ejercicios`). `[sticky]="true"`: 2 (la carta
47
47
  > del local y `master-ejercicios`). `count`: 5 listas (cifra del 03-10). `[(value)]`: 2; el resto
48
- > `[value]` + `(valueChange)`. `autoScroll`: 0. `size`: 20, todos `bp.isMobile() ? 'large' : 'medium'`.
48
+ > `[value]` + `(valueChange)`. `autoScroll`: 0. `size`: los 44 lo pasan, 43 con `bp.sizeChips()` y 1
49
+ > con `sizeRango()` (`master-overview`, ver «Por dispositivo»).
49
50
 
50
51
  ### Para qué se usa (el contenido de los chips)
51
52
 
@@ -103,13 +104,16 @@ secciones → tab menu.**
103
104
  las franjas de abajo y se parece más a un filtro.
104
105
  - **1 con el número dentro del texto:** `pages/notifications/notifications.ts:194`
105
106
  (`No leídas (3)` → `count: 3`).
106
- - **22 sin tamaño por dispositivo.** Los 20 que ya lo tienen (`bp.isMobile() ? 'large' : 'medium'`)
107
- entraron el 03-10-2026; los 22 que faltan son casi todos del super admin y de la central. Con D16
108
- (05-10-2026) el par es `bp.isMobile() ? 'xlarge' : 'medium'`, y ningún chip queda en `small`.
107
+ - **Resuelto el 06-10-2026: el tamaño por dispositivo.** Con D16 (05-10-2026) el size es
108
+ `bp.sizeChips()` (`xlarge` en lo táctil, `medium` en la computadora) y ningún chip queda en
109
+ `small`. De los 44 usos medidos (misma exclusión de arriba), 43 pasan `bp.sizeChips()` y el otro
110
+ es la excepción de `master-overview` (ver «Por dispositivo»). Fuera de la medición, la guía del
111
+ super admin tiene 13 sin `size` (quedan en `medium`):
112
+ `pages/super-admin/master-preview/_guia-moleculas/navegacion.ts` (11) y `fechas.ts:52`, `:119`.
109
113
 
110
114
  ## Tamaño en mobile y en web
111
115
 
112
- `size` está publicado desde la 0.20.0; la app usa la 0.22.0.
116
+ `size` está publicado desde la 0.20.0; la app usa la 0.24.1.
113
117
 
114
118
  Alto del chip: `small` 32 px (`height: 32px`) · `medium` 36 px (el de siempre, default; sin alto
115
119
  fijo: 8 + 8 de padding + `line-height: normal` + 2 de borde, 36 medido en Storybook con Satoshi) ·
@@ -130,9 +134,31 @@ toca (canon, dueño, 05-10-2026, D16).
130
134
  | filtros en la cabecera de una tabla | — | `medium` | canon (dueño, 05-10-2026, D16): nada en `small` |
131
135
 
132
136
  ```html
133
- <sui-tab-chips [chips]="filtros" [(value)]="filtro" [size]="bp.isMobile() ? 'xlarge' : 'medium'" />
137
+ <sui-tab-chips [chips]="filtros" [(value)]="filtro" [size]="bp.sizeChips()" />
134
138
  ```
135
139
 
140
+ ### Por dispositivo (D16)
141
+
142
+ Fila de `tab-chips` en la tabla de D16 (dueño, 05-10-2026): se toca, así que va grande en todo lo
143
+ táctil y `medium` en la computadora.
144
+
145
+ | dispositivo | size | nota |
146
+ |---|---|---|
147
+ | celular chico (< 380 px) | `xlarge` (44) | D16 pide `medium` con área tocable de 44, pero el DS todavía no estira el área de los `medium` (36). Hasta que lo haga, se queda el grande |
148
+ | celular (380–767 px) | `xlarge` (44) | el size que llega al piso de 44 |
149
+ | tablet táctil (`pointer: coarse`) | `xlarge` (44) | se toca con el dedo, aunque mida más de 767 |
150
+ | computadora (`pointer: fine`) | `medium` (36) | también en filtros de tablas; `small` no se usa |
151
+
152
+ Ultrawide (≥ 1920 px): igual que la computadora, `medium`. `large` (40) no sale de ningún
153
+ dispositivo: no llega a 44.
154
+
155
+ En master-pedidos: `[size]="bp.sizeChips()"`.
156
+
157
+ Excepción que hay hoy: `pages/super-admin/master-overview/master-overview.ts:165` (`sizeRango()`)
158
+ pasa `medium` en el teléfono porque los cinco períodos en `xlarge` no entran en los 398 px de un
159
+ celular de 430. Deja el chip en 36, debajo del piso de 44, aunque la fila se desliza. Pendiente de
160
+ confirmar con el dueño; no se copia a otras pantallas.
161
+
136
162
  ## Pista de scroll (canon, aprobado por el dueño el 05-10-2026)
137
163
 
138
164
  Desde la **0.24.0**. La barra de scroll está oculta, así que con chips que no entran no se notaba
@@ -217,15 +243,59 @@ type SuiTabChipsSize = 'small' | 'medium' | 'large' | 'xlarge';
217
243
  - **El chip activo es oscuro** (`bg-strong-950`), no naranja: es el estilo del componente, no se
218
244
  cambia por pantalla.
219
245
 
246
+ ## Bien y mal
247
+
248
+ El número de pendientes
249
+
250
+ ```html
251
+ <!-- ❌ mal: el número va dentro del label (armado en pages/notifications/notifications.ts:194) -->
252
+ <sui-tab-chips [size]="bp.sizeChips()" [(value)]="tab"
253
+ [chips]="[{ value: 'todas', label: 'Todas' }, { value: 'no_leidas', label: 'No leídas (3)' }]" />
254
+ ```
255
+
256
+ ```html
257
+ <!-- ✅ bien -->
258
+ <sui-tab-chips [size]="bp.sizeChips()" [(value)]="tab"
259
+ [chips]="[{ value: 'todas', label: 'Todas' }, { value: 'no_leidas', label: 'No leídas', count: 3 }]" />
260
+ ```
261
+
262
+ Dos modos de la misma vista
263
+
264
+ ```html
265
+ <!-- ❌ mal: 2 opciones excluyentes de la misma vista; no es un filtro (pages/super-admin/master-semanas/master-semanas.html:80) -->
266
+ <sui-tab-chips [size]="bp.sizeChips()" [chips]="vistas" [value]="vista()"
267
+ (valueChange)="vista.set($any($event))" />
268
+ ```
269
+
270
+ ```html
271
+ <!-- ✅ bien -->
272
+ <sui-segmented-control [size]="bp.tactil() ? '2xlarge' : 'medium'" [tabs]="vistas" [(active)]="vista" />
273
+ ```
274
+
275
+ Chips de sugerencia junto a un texto libre (los chips con su propio signal y «Otro motivo» primero en `chipsMotivo`)
276
+
277
+ ```html
278
+ <!-- ❌ mal: chips y textarea comparten el signal; cada tecla rebota al primer chip -->
279
+ <sui-tab-chips [size]="bp.sizeChips()" [chips]="motivos" [(value)]="motivo" />
280
+ <sui-textarea label="Motivo" [(value)]="motivo" />
281
+ ```
282
+
283
+ ```html
284
+ <!-- ✅ bien -->
285
+ <sui-tab-chips [size]="bp.sizeChips()" [chips]="chipsMotivo" [value]="chip()" (valueChange)="elegirChip($event)" />
286
+ <sui-textarea label="Motivo" [(value)]="motivo" />
287
+ ```
288
+
220
289
  ## Ejemplo
221
290
 
222
291
  ```html
223
292
  <!-- Filtro de estado: «Todos» primero -->
224
293
  <sui-tab-chips
294
+ [size]="bp.sizeChips()"
225
295
  [chips]="[{ value: 'todos', label: 'Todos' }, { value: 'activos', label: 'Activos' },
226
296
  { value: 'entregados', label: 'Entregados' }, { value: 'cancelados', label: 'Cancelados' }]"
227
297
  [(value)]="filtro" />
228
298
 
229
299
  <!-- Categorías de la carta -->
230
- <sui-tab-chips [chips]="categorias()" [value]="categoria()" (valueChange)="irA($event)" [sticky]="true" />
300
+ <sui-tab-chips [size]="bp.sizeChips()" [chips]="categorias()" [value]="categoria()" (valueChange)="irA($event)" [sticky]="true" />
231
301
  ```