@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
@@ -57,9 +57,9 @@ checkbox-card.**
57
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
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
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 (un «Por defecto» es `gray`). | propuesta |
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
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 normal en la app), o `ngModel` con `name` (checkout), o dentro de un `sui-radio-group`. | propuesta |
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 | una tabla densa solo de desktop |
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"
@@ -36,9 +36,9 @@ o con peso → radio-card · muchas → select.**
36
36
  > motivos («Spam», «Acoso», «Infringe las reglas»); el «avanzado» suma (Sublabel), badge «NEW»,
37
37
  > descripción, Link Button y la versión con el círculo a la derecha.
38
38
  >
39
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
40
- > **1 uso**, las franjas horarias del checkout, con `flip`. Más **1 radio nativo** de motivos
41
- > (ver abajo a qué componente va).
39
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`), revisado
40
+ > el 06-10-2026: **2 usos**, las franjas horarias del checkout (con `flip`) y los distritos de
41
+ > «Trabaja con nosotros». Más **1 radio nativo** de motivos (ver abajo a qué componente va).
42
42
 
43
43
  ### Las piezas
44
44
 
@@ -52,17 +52,21 @@ o con peso → radio-card · muchas → select.**
52
52
  | `link` | «Ver detalle» que no elige la opción. Solo se ve con `description`. | según la guía del DS |
53
53
  | `flip` | Círculo a la derecha en listas de opciones tipo hoja (sheet) y de ajustes, donde el texto es lo que se lee y el círculo es el indicador, como las franjas del checkout. En formularios, a la izquierda. | canon (aprobado por el dueño, 03-10-2026) |
54
54
  | `disabled` | La opción existe pero no aplica (franja ya llena). | según la guía del DS |
55
- | `size` | `medium` (default, Figma): círculo 20, label 14/20. `large`: círculo 24, label 16/24. `xlarge`: círculo 28, label 16/24. En large y xlarge el sublabel y la descripción se quedan en 12/16 (canon, dueño 04-10-2026); el badge sin `size` propio sube a `medium` / `large` y el link a `medium`. Se usa con `[size]="bp.controlSize()"`. | `medium`: según la guía del DS · `large` / `xlarge`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
55
+ | `size` | `medium` (default, Figma): círculo 20, label 14/20. `large`: círculo 24, label 16/24. `xlarge`: círculo 28, label 16/24. En large y xlarge el sublabel y la descripción se quedan en 12/16 (canon, dueño 04-10-2026); el badge sin `size` propio sube a `medium` / `large` y el link a `medium`. `2xlarge`: círculo 28 con la fila a 44 (su uso por dispositivo está pendiente, ver D16). Se usa con `[size]="bp.controlSize()"`. | `medium`: según la guía del DS · `large` / `xlarge`: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
56
56
 
57
57
  **Usos de hoy:**
58
58
 
59
- - **1 radio nativo de motivos:** `pages/driver/driver-order-detail/driver-order-detail.html:844`
59
+ - **1 radio nativo de motivos:** `pages/driver/driver-order-detail/driver-order-detail.html:874`
60
60
  (motivos de cancelación del repartidor). Por la pantalla hermana va a `sui-radio-card
61
61
  type="basic"` como `pages/orders/orders.html:567`, no a este componente.
62
- - El único uso actual, `pages/customer/checkout/checkout.html:473`, controla la selección con
63
- `[checked]` + `(selected)` por fila, sin `sui-radio-group`. Funciona porque el padre fija el
64
- estado, pero no se enchufa a un formulario. **Va sin `size`** (`medium`, círculo de 20 px) en
65
- una hoja del checkout del cliente, que se usa en el teléfono: rompe la tabla de abajo.
62
+ - `pages/customer/checkout/checkout.html:474` controla la selección con `[checked]` +
63
+ `(selected)` por fila, sin `sui-radio-group`. Funciona porque el padre fija el estado, pero no se
64
+ enchufa a un formulario. Va con `bp.isMobile() ? '2xlarge' : 'medium'`: en la computadora baja a
65
+ `medium`, que D16 ya no usa (va `large`, dueño 06-10-2026). El `2xlarge` del teléfono está
66
+ pendiente (ver D16).
67
+ - `pages/customer/trabaja/trabaja.html:150` va con `bp.isMobile() ? 'xlarge' : 'large'`, que es lo
68
+ mismo que `bp.controlSize()`: cumple la fila de D16. Sin descripción la fila mide 28 en el
69
+ teléfono, no 44; si pasa a `2xlarge` está pendiente (ver D16).
66
70
 
67
71
  ## Tamaño en mobile y en web
68
72
 
@@ -74,12 +78,12 @@ dueño, 28-09-2026).
74
78
 
75
79
  | uso | mobile | web | fuente |
76
80
  |---|---|---|---|
77
- | opciones de un formulario o una hoja (franjas horarias, método de entrega) | `2xlarge` (fila de 44 como mínimo, círculo 28, label 16/24) | `large` (círculo 24, label 16/24) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; web: canon (aprobado por el dueño, 03-10-2026) |
78
- | lista densa de desktop | — | `medium` (círculo 20, label 14/20) | propuesta, falta aprobación |
81
+ | opciones de un formulario o una hoja (franjas horarias, método de entrega) | `xlarge` (círculo 28, label 16/24; sin descripción la fila mide 28, no 44: `2xlarge` pendiente, ver D16) | `large` (círculo 24, label 16/24) | D16 (fila de checkbox, radio y switch; dueño 06-10-2026) |
82
+ | lista densa de desktop | — | `large` (círculo 24): no baja a `medium` | D16, dueño 06-10-2026 |
79
83
  | opciones con mucho contexto cada una | `sui-radio-card` con `bp.controlSize()` | `sui-radio-card` con `bp.controlSize()` | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
80
84
 
81
85
  ```html
82
- <sui-radio-label value="recojo" [size]="bp.isMobile() ? '2xlarge' : 'large'" label="Recojo en tienda" />
86
+ <sui-radio-label value="recojo" [size]="bp.controlSize()" label="Recojo en tienda" />
83
87
  ```
84
88
 
85
89
  | size | círculo | label | sublabel / descripción | alto de la fila sin descripción |
@@ -89,21 +93,42 @@ dueño, 28-09-2026).
89
93
  | `xlarge` | 28 | 16/24 | 12/16 | 28 |
90
94
  | `2xlarge` | 28 | 16/24 | 12/16 | **44** (`min-height`) |
91
95
 
92
- `2xlarge` (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono) es la fila del teléfono: mismo círculo de 28 y mismo label que `xlarge`,
93
- pero la fila mide 44 como mínimo con todo centrado en vertical, y el texto secundario se queda en 12
94
- (regla del 03-10). Con descripción la fila ya pasa de 44 y vuelve a alinearse arriba.
96
+ `2xlarge` (canon, dueño 04-10-2026: piso táctil 44 en el teléfono) tiene el mismo círculo de 28 y
97
+ el mismo label que `xlarge`, pero la fila mide 44 como mínimo con todo centrado en vertical, y el
98
+ texto secundario se queda en 12 (regla del 03-10). Con descripción la fila ya pasa de 44 y vuelve a
99
+ alinearse arriba. Si reemplaza a `xlarge` en el celular y la tablet está **pendiente** (ver D16).
95
100
 
96
101
  Toda la fila se toca (el host recibe el click). Con `xlarge` el contenido baja 2 px para que la
97
102
  línea del label (24) quede centrada con el círculo (28).
98
103
 
99
- Sin descripción, la fila en `xlarge` mide 28 px (lo que mide el círculo): en el teléfono va
100
- `2xlarge`, que la lleva a 44. Con descripción llega sola: 2 + 24 (label) + 4 + 16 (descripción) = 46 px
104
+ Sin descripción, la fila en `xlarge` mide 28 px (lo que mide el círculo):
105
+ `2xlarge` la lleva a 44 (pendiente, ver D16). Con descripción llega sola: 2 + 24 (label) + 4 + 16 (descripción) = 46 px
101
106
  en `xlarge` y en `2xlarge`.
102
107
 
103
108
  **Regla de tamaños aplicada (canon, dueño 04-10-2026):** en `large` y `xlarge` el label sube a
104
109
  16/24 y el sublabel y la descripción se quedan en 12/16, igual que `sui-switch-label`. Antes subían
105
110
  a 14/20. El badge y el link siguen creciendo con el size.
106
111
 
112
+ ### Por dispositivo (D16)
113
+
114
+ | dispositivo | size | nota |
115
+ |---|---|---|
116
+ | celular chico (< 380) | `xlarge` | círculo de 28 |
117
+ | celular (380–767) | `xlarge` | |
118
+ | 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 |
119
+ | computadora (`pointer: fine`) | `large` | un paso menos que el celular; no baja a `medium` (D16, dueño 06-10-2026) |
120
+
121
+ Ultrawide: igual que la computadora (`large`).
122
+
123
+ En master-pedidos: `[size]="bp.controlSize()"` (`xlarge` hasta 767 px, `large` desde ahí). La
124
+ expresión exacta de D16, con la tablet, es `bp.tactil() ? 'xlarge' : 'large'`.
125
+
126
+ **Pendiente: `2xlarge` en el celular y la tablet.** Sin descripción, `xlarge` deja la fila en 28 px,
127
+ por debajo del piso de 44. El dueño aprobó `2xlarge` el 04-10-2026 justo para eso (fila de 44), pero
128
+ la fila de D16 dice `xlarge` para toda la familia y ningún helper devuelve `2xlarge`. Falta que el
129
+ dueño decida si en este componente el celular y la tablet pasan a `2xlarge` (y que D16 y
130
+ `bp.controlSize()` lo recojan). Mientras no lo decida, manda la fila de D16: `xlarge`.
131
+
107
132
  ## «No usar»: por qué no hoy y cuándo sí
108
133
 
109
134
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -140,7 +165,8 @@ a 14/20. El badge y el link siguen creciendo con el size.
140
165
  - **No implementa `ControlValueAccessor`.** El formulario se engancha al `sui-radio-group`, no a
141
166
  cada opción. Sin grupo, se maneja con `[(checked)]`.
142
167
  - **`size` arranca en `medium`** (círculo de 20 px): sin `[size]="bp.controlSize()"` choca con la
143
- regla de controles grandes (dueño, 28-09-2026) en mobile.
168
+ regla de controles grandes (dueño, 28-09-2026) y con D16. Aun con `xlarge`, la fila sin
169
+ descripción queda en 28: si pasa a `2xlarge` está pendiente (ver D16).
144
170
  - **Tocar una opción ya elegida no la desmarca** (bien, es un radio). Tocar el link tampoco la elige.
145
171
  - **`link` solo se dibuja con `description`.**
146
172
  - El `sui-radio` de adentro no recibe clics (`pointer-events: none`): no le pongas handlers.
@@ -151,12 +177,53 @@ a 14/20. El badge y el link siguen creciendo con el size.
151
177
  - El badge con string sale naranja; en `sui-radio-card` el default es azul.
152
178
  - `flip` usa CSS `order`: el orden para lector de pantalla no cambia.
153
179
 
180
+ ## Bien y mal
181
+
182
+ Sin size
183
+
184
+ ```html
185
+ <!-- ❌ mal: sin size queda en medium, círculo de 20 en el teléfono y en la computadora -->
186
+ <sui-radio-label [value]="d" [label]="d" />
187
+ ```
188
+
189
+ ```html
190
+ <!-- ✅ bien -->
191
+ <sui-radio-label [size]="bp.controlSize()" [value]="d" [label]="d" />
192
+ ```
193
+
194
+ Franjas horarias en la computadora
195
+
196
+ ```html
197
+ <!-- ❌ mal: medium en la computadora; D16 no baja de large (pages/customer/checkout/checkout.html:474) -->
198
+ <sui-radio-label [size]="bp.isMobile() ? '2xlarge' : 'medium'" [value]="'' + f.inicioMs"
199
+ [label]="etiquetaFranja(f)" [flip]="true" [disabled]="!f.disponible" />
200
+ ```
201
+
202
+ ```html
203
+ <!-- ✅ bien (si el teléfono pasa a 2xlarge está pendiente, ver D16) -->
204
+ <sui-radio-label [size]="bp.controlSize()" [value]="'' + f.inicioMs"
205
+ [label]="etiquetaFranja(f)" [flip]="true" [disabled]="!f.disponible" />
206
+ ```
207
+
208
+ Link sin descripción
209
+
210
+ ```html
211
+ <!-- ❌ mal: link solo se dibuja con description; «Ver precios» no aparece -->
212
+ <sui-radio-label value="pro" label="Plan Pro" [link]="{ label: 'Ver precios', href: '/precios' }" />
213
+ ```
214
+
215
+ ```html
216
+ <!-- ✅ bien -->
217
+ <sui-radio-label [size]="bp.controlSize()" value="pro" label="Plan Pro"
218
+ description="Facturación mensual." [link]="{ label: 'Ver precios', href: '/precios' }" />
219
+ ```
220
+
154
221
  ## Ejemplo
155
222
 
156
223
  ```html
157
224
  <sui-radio-group [(ngModel)]="motivo" class="lista-vertical">
158
225
  @for (m of motivos; track m) {
159
- <sui-radio-label [value]="m" [label]="m" />
226
+ <sui-radio-label [size]="bp.controlSize()" [value]="m" [label]="m" />
160
227
  }
161
228
  </sui-radio-group>
162
229
  ```
@@ -50,7 +50,7 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
50
50
  | appearance | cuándo | ejemplo real | fuente |
51
51
  |---|---|---|---|
52
52
  | `inline` (default), `readonly` | **Mostrar** una nota: la fila de estrellas pelada. | `components/ratings-detail/ratings-detail.html:31` (la nota del local) | según la guía del DS (ejemplo «Rating Review») |
53
- | `inline`, interactivo | Pedir la nota en grande: en el teléfono con `size="2xlarge"` (estrellas de 32 en botones de 44 × 44); `xlarge` (28 tocables) queda para web. | `pages/customer/rate-order/rate-order.html:93` y `:167` (hoy en `xlarge`) | tamaño: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; el «cuándo inline vs bar» sigue como propuesta |
53
+ | `inline`, interactivo | Pedir la nota en grande: en el teléfono y la tablet con `size="2xlarge"` (estrellas de 32 en botones de 44 × 44); en la computadora, `medium`. | `pages/customer/rate-order/rate-order.html:95` y `:169` (hoy `2xlarge` / `xlarge`, cortado con `bp.isMobile()`) | teléfono: canon (dueño, 04-10-2026): piso táctil 44 · computadora: D16, dueño 05-10-2026 (antes `xlarge`) · el «cuándo inline vs bar» sigue como propuesta |
54
54
  | `bar` | **Pedir** una nota en el celular: con `size="2xlarge"` las celdas miden 64 × 44 (36 en los demás sizes). | `components/rate-entity-card/rate-entity-card.html:40` | según la guía del DS (ejemplo «Rating Bar») |
55
55
  | `cell` | **No usar** hoy (ver abajo). | — | según la guía del DS (ejemplo «Rating Cell») |
56
56
  | `bar-area` | **No usar** hoy (ver abajo). | — | según la guía del DS (ejemplo «Rating Bar With Textarea») |
@@ -68,9 +68,9 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
68
68
 
69
69
  | size | px | cuándo | fuente |
70
70
  |---|---|---|---|
71
- | `small` | 16 | Web: filas y listas (cada reseña, tablas, historial). | propuesta, falta aprobación |
72
- | `medium` (default) | 20 | Web: perfil, ficha, detalle. Mobile: filas y listas. | propuesta, falta aprobación |
73
- | `large` | 24 | Web: la nota grande de un resumen, la card de una calificación enviada. Mobile: perfil y ficha. | propuesta, falta aprobación |
71
+ | `small` | 16 | **No se usa**: es chico. Las filas y listas de la computadora (cada reseña, tablas, historial) van en `medium`. | D16, dueño 05-10-2026 (antes «web: filas y listas», propuesta) |
72
+ | `medium` (default) | 20 | Computadora, tablet y celular chico: filas, listas, perfil, ficha y detalle. | D16, dueño 05-10-2026 |
73
+ | `large` | 24 | Celular (380–767): filas, listas, perfil y ficha (un paso más que la computadora). Computadora: la nota grande de un resumen, la card de una calificación enviada. | celular: D16, dueño 05-10-2026 · resumen en la computadora: propuesta, falta aprobación |
74
74
  | `xlarge` | 28 | Extensión SUI. Mobile: la nota grande de un resumen. | propuesta, falta aprobación |
75
75
 
76
76
  ### El resto de las propiedades
@@ -98,8 +98,8 @@ lista cargada, que viene con tope. La fórmula depende de `n`: otro denominador
98
98
  `pages/super-admin/master-users/master-user-sheet.html:142`.
99
99
  - **1 rating usado como ícono** (`type="heart"` con `max=1` para los favoritos):
100
100
  `components/ratings-detail/ratings-detail.html:45`. Va `sui-icon name="heart-3-fill"`.
101
- - **A discutir, 2 `inline` interactivos de 28 px** como input:
102
- `pages/customer/rate-order/rate-order.html:93` y `:167`. Alternativa: `appearance="bar"`.
101
+ - **A discutir, 2 `inline` interactivos de 28 px en la computadora** (en el teléfono ya van en `2xlarge`) como input:
102
+ `pages/customer/rate-order/rate-order.html:95` y `:169`. Alternativa: `appearance="bar"`.
103
103
 
104
104
  ## No usar: por qué no hoy y cuándo sí
105
105
 
@@ -120,15 +120,16 @@ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026)
120
120
  380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
121
121
  computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
122
122
  (< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
123
- `xsmall`**, salvo lo que el componente solo tiene en chico. Hoy la app corta con
124
- `BreakpointsService.isMobile()` (≤ 767 px), que todavía no mira el puntero ni los 380 px.
123
+ `xsmall`**, salvo lo que el componente solo tiene en chico. En la app, `bp.isMobile()` mira solo el
124
+ ancho (≤ 767 px); `bp.celular()` (380–767) y `bp.tactil()` (celular o pantalla táctil) ya miran los
125
+ 380 px y el puntero: son las dos señales que usa este componente (ver «Por dispositivo (D16)»).
125
126
 
126
127
  | uso | mobile | web | fuente |
127
128
  |---|---|---|---|
128
- | Mostrar en una fila o lista | `medium` (20) | `small` (16) | propuesta, falta aprobación |
129
- | Mostrar en perfil o ficha | `large` (24) | `medium` (20) | propuesta, falta aprobación |
129
+ | Mostrar en una fila o lista | `large` (24) | `medium` (20) | D16, dueño 05-10-2026 (antes `medium` / `small`) |
130
+ | Mostrar en perfil o ficha | `large` (24) | `medium` (20) | D16, dueño 05-10-2026 |
130
131
  | La nota grande de un resumen | `xlarge` (28) | `large` (24) | propuesta, falta aprobación |
131
- | Pedir una nota | `2xlarge`: `inline` (estrellas de 32 en botones de 44 × 44) o `bar` (celdas de 64 × 44) | `bar` (64 × 36), o `inline` `large` con mouse | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; web: propuesta |
132
+ | Pedir una nota | `2xlarge`: `inline` (estrellas de 32 en botones de 44 × 44) o `bar` (celdas de 64 × 44) | `bar` (64 × 36), o `inline` `medium` con mouse | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: D16, dueño 05-10-2026 (lo que se toca va `medium` en la computadora; antes `large`, propuesta) |
132
133
 
133
134
  ```ts
134
135
  readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/breakpoints.service.ts
@@ -136,7 +137,7 @@ readonly bp = inject(BreakpointsService); // master-pedidos: src/app/services/br
136
137
 
137
138
  ```html
138
139
  <sui-rating [value]="local.rating" [readonly]="true" [halfStep]="true"
139
- [size]="bp.isMobile() ? 'medium' : 'small'" ariaLabel="Nota del local" />
140
+ [size]="bp.celular() ? 'large' : 'medium'" ariaLabel="Nota del local" />
140
141
  ```
141
142
 
142
143
  En `bar` el `size` no cuenta salvo `2xlarge` (celda de 44 de alto en vez de 36; íconos fijos de 20
@@ -157,6 +158,28 @@ nota de solo lectura sigue `medium`/`large`.
157
158
  (el botón es el ícono, sin padding) y `2xlarge` 44 px (32 + 6 + 6); `bar` 36 px (8 + 20 + 8 de cada
158
159
  celda) y en `2xlarge` 44 (12 + 20 + 12); `cell` 58 px (12 + 32 + 12 de padding y 2 de borde).
159
160
 
161
+ ### Por dispositivo (D16)
162
+
163
+ `rating` no está en la tabla por componente de D16 (dueño, 05-10-2026), así que va por la regla
164
+ general y tiene **dos filas según el modo**: mostrar una nota (`readonly`) es «lo que no se toca» y
165
+ pedirla es «lo que se toca».
166
+
167
+ | dispositivo | size | nota |
168
+ |---|---|---|
169
+ | celular chico (< 380 px) | mostrar `medium` · pedir `2xlarge` | D16 pide `medium` con área de 44 para pedir, pero solo `2xlarge` llega a 44: hasta que el DS estire el área (nota ¹ de D16), se queda el grande |
170
+ | celular (380–767 px) | mostrar `large` · pedir `2xlarge` | mostrar sube un paso (P1 b); pedir: `inline` 44 × 44 o `bar` 64 × 44 |
171
+ | tablet táctil (`pointer: coarse`) | mostrar `medium` · pedir `2xlarge` | se pide con el dedo: mismo piso de 44 que el celular |
172
+ | computadora (`pointer: fine`) | mostrar `medium` · pedir `medium` | en `bar` el `size` no cuenta salvo `2xlarge` (celdas de 36) |
173
+
174
+ Ultrawide (≥ 1920 px): igual que la computadora. `small` no se usa en ningún dispositivo. La nota
175
+ grande de un resumen va un paso arriba de esta tabla (`large` en la computadora, `xlarge` en el
176
+ celular), y eso sigue en propuesta.
177
+
178
+ En master-pedidos, sin helper propio:
179
+
180
+ - mostrar: `[size]="bp.celular() ? 'large' : 'medium'"` (resumen, en propuesta: `bp.celular() ? 'xlarge' : 'large'`)
181
+ - pedir: `[size]="bp.tactil() ? '2xlarge' : 'medium'"`
182
+
160
183
  ## API
161
184
 
162
185
  <!-- api:inicio -->
@@ -209,13 +232,57 @@ Implementa `ControlValueAccessor` sobre `value` (sirve con `formControlName`). `
209
232
  nativo), Home/End van a 1 y al máximo, sin vuelta. Cada flecha elige y emite `valueChange`. Si
210
233
  la pantalla ya escribe la nota al lado, ponle `aria-hidden="true"` para que no se lea dos veces.
211
234
 
235
+ ## Bien y mal
236
+
237
+ Lo favorito no es una nota
238
+
239
+ ```html
240
+ <!-- ❌ mal: un rating de un corazón como ícono (components/ratings-detail/ratings-detail.html:45) -->
241
+ <sui-rating type="heart" appearance="inline" [readonly]="true" [value]="1" [max]="1" />
242
+ ```
243
+
244
+ ```html
245
+ <!-- ✅ bien: ícono del mismo tamaño que las estrellas de al lado -->
246
+ <sui-icon name="heart-3-fill" [size]="bp.celular() ? 28 : 24" aria-hidden="true" />
247
+ ```
248
+
249
+ La nota grande de un resumen
250
+
251
+ ```html
252
+ <!-- ❌ mal: tamaños invertidos, más chico en el celular (components/ratings-detail/ratings-detail.html:34) -->
253
+ <sui-rating [value]="average()" [readonly]="true" [halfStep]="true"
254
+ [size]="bp.isMobile() ? 'large' : 'xlarge'" />
255
+ ```
256
+
257
+ ```html
258
+ <!-- ✅ bien: regla general de lo que no se toca, un paso más grande en el celular.
259
+ El paso extra del resumen (`xlarge` / `large`) sigue en propuesta, falta aprobación -->
260
+ <sui-rating [value]="average()" [readonly]="true" [halfStep]="true"
261
+ [size]="bp.celular() ? 'large' : 'medium'" />
262
+ ```
263
+
264
+ La nota en una fila o lista
265
+
266
+ ```html
267
+ <!-- ❌ mal: `small` fijo, 16 px también en el celular (pages/drivers/drivers.html:160, pages/customer/order-tracking/order-tracking.html:407) -->
268
+ <sui-rating type="star" size="small" [value]="driver.rating" [readonly]="true" [halfStep]="true" />
269
+ ```
270
+
271
+ ```html
272
+ <!-- ✅ bien -->
273
+ <sui-rating type="star" [size]="bp.celular() ? 'large' : 'medium'"
274
+ [value]="driver.rating" [readonly]="true" [halfStep]="true" />
275
+ ```
276
+
212
277
  ## Ejemplo
213
278
 
214
279
  ```html
215
280
  <!-- Mostrar la nota del local (promedio, desde el agregado) -->
216
281
  <span class="nota">{{ notaTexto }}</span>
217
- <sui-rating [value]="local.rating" [readonly]="true" [halfStep]="true" size="small" aria-hidden="true" />
282
+ <sui-rating [value]="local.rating" [readonly]="true" [halfStep]="true"
283
+ [size]="bp.celular() ? 'large' : 'medium'" aria-hidden="true" />
218
284
 
219
285
  <!-- Pedir la nota al repartidor -->
220
- <sui-rating appearance="bar" type="star" [(value)]="nota" ariaLabel="Califica al repartidor" />
286
+ <sui-rating appearance="bar" type="star" [size]="bp.tactil() ? '2xlarge' : 'medium'"
287
+ [(value)]="nota" ariaLabel="Califica al repartidor" />
221
288
  ```
@@ -47,6 +47,12 @@ Regla corta: **hoy, siempre `sui-textarea`.**
47
47
  **No tiene `size`.** Los botones de la barra son de 28 px: **no tiene tamaño suficiente para
48
48
  mobile**. Si alguna vez se usa, que sea en el panel web.
49
49
 
50
+ ### Por dispositivo (D16)
51
+
52
+ No aplica: no tiene input `size` y la barra mide 28 px en todos los dispositivos, así que no llega a
53
+ los 44 de D16 (dueño, 05-10-2026) en el celular ni en la tablet táctil. Solo en la computadora
54
+ (`pointer: fine`); en master-pedidos no hay nada que bindear.
55
+
50
56
  ## «No usar»: por qué no hoy y cuándo sí
51
57
 
52
58
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -106,6 +112,45 @@ Sub-componente: `sui-rich-editor-item` (cada botón de la barra).
106
112
  - Por default muestra solo la barra: sin `[editable]="true"` no hay dónde escribir.
107
113
  - El label de tamaño por default es técnico («14px»); el de título ya está en español («Título», 04-10-2026).
108
114
 
115
+ ## Bien y mal
116
+
117
+ Una descripción o una nota
118
+
119
+ ```html
120
+ <!-- ❌ mal: el texto se guarda y se muestra plano; la barra sobra y en el teléfono no se toca -->
121
+ <sui-rich-editor [editable]="true" placeholder="Describe el producto…" [(value)]="descripcion" />
122
+ ```
123
+
124
+ ```html
125
+ <!-- ✅ bien -->
126
+ <sui-textarea [size]="bp.sizeControl()" label="Descripción" [rows]="4"
127
+ placeholder="Describe el producto…" [(value)]="descripcion" />
128
+ ```
129
+
130
+ La barra entera esperando que todo funcione
131
+
132
+ ```html
133
+ <!-- ❌ mal: título, tamaño, enlace, comentario y mención solo emiten (action); nadie los resuelve -->
134
+ <sui-rich-editor [editable]="true" [(value)]="html" />
135
+ ```
136
+
137
+ ```html
138
+ <!-- ✅ bien: solo lo que el editor aplica solo -->
139
+ <sui-rich-editor layout="formatting" [showMore]="false" [editable]="true" [(value)]="html" />
140
+ ```
141
+
142
+ Un editor sin dónde escribir
143
+
144
+ ```html
145
+ <!-- ❌ mal: sin [editable]="true" solo se dibuja la barra -->
146
+ <sui-rich-editor layout="formatting" placeholder="Escribe la respuesta…" [(value)]="html" />
147
+ ```
148
+
149
+ ```html
150
+ <!-- ✅ bien -->
151
+ <sui-rich-editor layout="formatting" [editable]="true" placeholder="Escribe la respuesta…" [(value)]="html" />
152
+ ```
153
+
109
154
  ## Ejemplo
110
155
 
111
156
  ```html
@@ -34,13 +34,15 @@ tab-chips · secciones → tab menu.**
34
34
  >
35
35
  > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
36
36
  > **5 usos en 4 archivos**. Tamaños: 3 `small`, 1 `medium`, 1 sin `size` (`medium`). 1 con solo
37
- > íconos (vista cuadrícula / lista del catálogo).
37
+ > íconos (vista cuadrícula / lista del catálogo). El 06-10-2026 ya eran **9 usos en 7 archivos**
38
+ > (ver «Usos de hoy» abajo).
38
39
 
39
40
  ### `size`
40
41
 
41
42
  | size | cuándo | fuente |
42
43
  |---|---|---|
43
- | `xlarge` | Mobile: es el único que se acerca a los 44 px de área táctil (segmento de 40 px). | canon (dueño: «componentes grandes», 28-09-2026, y D16, 05-10-2026) |
44
+ | `2xlarge` | Celular y tablet táctil: el único que llega a 44 px por segmento. | canon (dueño, 04-10-2026: piso táctil 44 en el teléfono) y D16, dueño 05-10-2026 |
45
+ | `xlarge` | No se usa: 40 px no llega a 44 en el teléfono y sobra en la computadora. Ninguna pantalla de la app lo usa (medido el 06-10-2026; solo aparece en la vitrina `master-preview`). | D16, dueño 05-10-2026 (antes «mobile», 28-09-2026) |
44
46
  | `large` | No aporta: 32 px, chico para el dedo y grande para web. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
45
47
  | `medium` (default) | Computadora: junto a títulos o filtros, también solo íconos en una barra. | canon (dueño, 05-10-2026, D16); el valor exacto, canon (aprobado por el dueño, 05-10-2026, bloque B1) |
46
48
  | `small` | No usar: es chico. Los íconos de una barra (cuadrícula / lista) van en `medium`. | canon (dueño, 05-10-2026, D16) |
@@ -57,17 +59,21 @@ tab-chips · secciones → tab menu.**
57
59
  **Usos de hoy que rompen las reglas:**
58
60
 
59
61
  - **2 dentro de un borrador que se guarda después (a discutir):**
60
- `pages/super-admin/master-settings/master-settings.html:303` (modo de envío: «Por distancia» /
61
- «Precio único») y `:336` («Por calle» / «En línea recta»). La guía dice que se aplica de
62
+ `pages/super-admin/master-settings/master-settings.html:281` (modo de envío: «Por distancia» /
63
+ «Precio único») y `:314` («Por calle» / «En línea recta»). La guía dice que se aplica de
62
64
  inmediato; aquí la elección espera al «Guardar». Es trabajo de `sui-radio-card`.
63
- - **1 con textos largos, a verificar en mobile:** `pages/super-admin/master-roles/master-roles.html:47`
65
+ - **1 con textos largos, a verificar en mobile:** `pages/super-admin/master-roles/master-roles.html:48`
64
66
  («Administrador de ciudad» / «Jefe de operaciones»). Por ancho de texto quedan apretados cerca
65
67
  del borde a 390 px; no se midió en la pantalla real.
66
- - **2 en `small` con texto** (la propuesta deja `small` solo para íconos): `master-settings.html:303`
67
- y `:336`. El tercero en `small`, `pages/products/products.html:81`, está bien: solo íconos.
68
- - **5 sin tamaño por plataforma** (todos fijos): ninguno cambia a `xlarge` en mobile. Ejemplo:
69
- `pages/driver/driver-schedule/driver-schedule.html:30` (`size="medium"` en una pantalla del
70
- repartidor, que se usa en el teléfono).
68
+ - **2 en `small` con texto** (D16: `small` no se usa): `master-settings.html:281` y `:314`. El
69
+ tercero, `pages/products/products.html:83`, va en `small` en la computadora con solo íconos: con
70
+ D16 también pasa a `medium`.
71
+ - **Sin tamaño por dispositivo** (revisado el 06-10-2026): `master-roles.html:48` (sin `size`) y
72
+ `pages/super-admin/master-categorias/master-categorias.html:124` (`medium` fijo) se quedan en 28
73
+ en el teléfono; `master-settings.html:224` usa `tallaServicio()` (`master-settings.ts:452`), que
74
+ da `large` (32) en el teléfono. Los que cortan con `bp.isMobile()`
75
+ (`pages/driver/driver-schedule/driver-schedule.html:31`, `pages/overview/overview.html:45`,
76
+ `pages/driver/driver-dashboard/driver-dashboard.html:865`) dejan la tablet táctil en `medium`.
71
77
 
72
78
  ## Tamaño en mobile y en web
73
79
 
@@ -80,8 +86,8 @@ En large, xlarge y 2xlarge el texto sube a 16 px (regla del 03-10-2026): Label/M
80
86
  `large` el padding del segmento con texto bajó de 6 a 4 para que siga midiendo 32.
81
87
 
82
88
  **`2xlarge` es el size del teléfono**: 44 px por segmento, con texto o solo ícono (canon (dueño,
83
- 04-10-2026): piso táctil 44 en el teléfono). `xlarge` (40) no cambia y queda para las pantallas que
84
- ya lo usan.
89
+ 04-10-2026): piso táctil 44 en el teléfono). `xlarge` (40) no se usa: no llega a 44 y ninguna
90
+ pantalla de la app lo tiene.
85
91
 
86
92
  | uso | mobile | web | fuente |
87
93
  |---|---|---|---|
@@ -89,9 +95,27 @@ ya lo usan.
89
95
  | solo íconos en una barra (cuadrícula / lista) | `2xlarge` (44) | `medium` | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: canon (dueño, 05-10-2026, D16), antes `small` |
90
96
 
91
97
  ```html
92
- <sui-segmented-control [size]="bp.isMobile() ? '2xlarge' : 'medium'" … />
98
+ <sui-segmented-control [size]="bp.tactil() ? '2xlarge' : 'medium'" … />
93
99
  ```
94
100
 
101
+ ### Por dispositivo (D16)
102
+
103
+ Fila de `segmented-control` en la tabla de D16 (dueño, 05-10-2026): se toca, y el size que llega a
104
+ 44 es `2xlarge`.
105
+
106
+ | dispositivo | size | nota |
107
+ |---|---|---|
108
+ | celular chico (< 380 px) | `2xlarge` (44) | D16 pide `medium` con área de 44, pero el DS todavía no estira el área de los `medium` (nota ¹ de D16): hasta entonces se queda el grande |
109
+ | celular (380–767 px) | `2xlarge` (44) | con texto o solo íconos |
110
+ | tablet táctil (`pointer: coarse`) | `2xlarge` (44) | Apple pide 44 también en el iPad |
111
+ | computadora (`pointer: fine`) | `medium` (28) | también solo íconos en una barra; nunca `small` |
112
+
113
+ Ultrawide (≥ 1920 px): igual que la computadora, `medium`; el espacio extra va al `max-width`, no a
114
+ segmentos más altos.
115
+
116
+ En master-pedidos: `[size]="bp.tactil() ? '2xlarge' : 'medium'"`. No hay helper: `bp.sizeChips()`
117
+ llega a `xlarge` (40) y `bp.sizeControl()` a `large` (32), y ninguno de los dos da 44 aquí.
118
+
95
119
  ## «No usar»: por qué no hoy y cuándo sí
96
120
 
97
121
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -145,12 +169,57 @@ interface SuiSegmentedControlItem<T = string> {
145
169
  - Los tamaños son extensión de SUI: la guía tiene uno solo. Su versión redondeada (`Rounded`)
146
170
  no existe en SUI.
147
171
 
172
+ ## Bien y mal
173
+
174
+ Vista cuadrícula / lista
175
+
176
+ ```html
177
+ <!-- ❌ mal: `small` en la computadora; D16 no usa `small` (pages/products/products.html:83) -->
178
+ <sui-segmented-control [size]="bp.isMobile() ? '2xlarge' : 'small'"
179
+ [tabs]="viewToggleItems" [(active)]="viewMode" />
180
+ ```
181
+
182
+ ```html
183
+ <!-- ✅ bien -->
184
+ <sui-segmented-control [size]="bp.tactil() ? '2xlarge' : 'medium'"
185
+ [tabs]="viewToggleItems" [(active)]="viewMode" />
186
+ ```
187
+
188
+ Modo del servicio en el panel
189
+
190
+ ```html
191
+ <!-- ❌ mal: `large` (32) en el teléfono no llega a 44 (master-settings.html:224, tallaServicio en master-settings.ts:452) -->
192
+ <sui-segmented-control [size]="bp.isMobile() ? 'large' : 'medium'"
193
+ ariaLabel="Cómo se cobra la tarifa de servicio"
194
+ [tabs]="MODOS_SERVICIO" [active]="borrador().servicioModo" (tabChange)="setModoServicio($event)" />
195
+ ```
196
+
197
+ ```html
198
+ <!-- ✅ bien -->
199
+ <sui-segmented-control [size]="bp.tactil() ? '2xlarge' : 'medium'"
200
+ ariaLabel="Cómo se cobra la tarifa de servicio"
201
+ [tabs]="MODOS_SERVICIO" [active]="borrador().servicioModo" (tabChange)="setModoServicio($event)" />
202
+ ```
203
+
204
+ Rol a invitar
205
+
206
+ ```html
207
+ <!-- ❌ mal: sin `size` ni `ariaLabel`: 28 px también en el teléfono y el grupo sin nombre (pages/super-admin/master-roles/master-roles.html:48) -->
208
+ <sui-segmented-control [tabs]="rolesCiudad" [active]="rolStaff()" (activeChange)="rolStaff.set($any($event))" />
209
+ ```
210
+
211
+ ```html
212
+ <!-- ✅ bien -->
213
+ <sui-segmented-control [size]="bp.tactil() ? '2xlarge' : 'medium'" ariaLabel="Rol"
214
+ [tabs]="rolesCiudad" [active]="rolStaff()" (activeChange)="rolStaff.set($any($event))" />
215
+ ```
216
+
148
217
  ## Ejemplo
149
218
 
150
219
  ```html
151
220
  <div style="max-width: 320px">
152
221
  <sui-segmented-control
153
- [size]="bp.isMobile() ? '2xlarge' : 'medium'"
222
+ [size]="bp.tactil() ? '2xlarge' : 'medium'"
154
223
  [tabs]="[{ value: 'grid', label: 'Vista cuadrícula', icon: 'layout-grid-line', iconOnly: true },
155
224
  { value: 'list', label: 'Vista lista', icon: 'list-unordered', iconOnly: true }]"
156
225
  [(active)]="vista" />