@ajuarezso/sui-design-system 0.22.0 → 0.23.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 (99) hide show
  1. package/docs/INDEX.md +8 -8
  2. package/docs/sui-accordion/README.md +2 -2
  3. package/docs/sui-activity-feed/README.md +1 -2
  4. package/docs/sui-alert/README.md +28 -19
  5. package/docs/sui-app-store-badge/README.md +5 -4
  6. package/docs/sui-avatar/README.md +16 -16
  7. package/docs/sui-avatar-group/README.md +4 -4
  8. package/docs/sui-badge/README.md +27 -9
  9. package/docs/sui-banner/README.md +10 -9
  10. package/docs/sui-brand-logo/README.md +3 -3
  11. package/docs/sui-breadcrumbs/README.md +1 -1
  12. package/docs/sui-button/README.md +48 -24
  13. package/docs/sui-button-group/README.md +6 -4
  14. package/docs/sui-button-group-item/README.md +3 -3
  15. package/docs/sui-card/README.md +17 -19
  16. package/docs/sui-chart-legend/README.md +8 -7
  17. package/docs/sui-checkbox/README.md +11 -6
  18. package/docs/sui-checkbox-card/README.md +24 -19
  19. package/docs/sui-checkbox-label/README.md +32 -10
  20. package/docs/sui-circular-progress-bar/README.md +2 -0
  21. package/docs/sui-color-dot/README.md +1 -1
  22. package/docs/sui-color-picker/README.md +22 -7
  23. package/docs/sui-command-menu-footer/README.md +8 -8
  24. package/docs/sui-command-menu-search/README.md +2 -2
  25. package/docs/sui-compact-avatar-group/README.md +4 -3
  26. package/docs/sui-compact-button/README.md +41 -44
  27. package/docs/sui-compact-select/README.md +9 -5
  28. package/docs/sui-compact-select-for-input/README.md +2 -2
  29. package/docs/sui-content-card/README.md +6 -5
  30. package/docs/sui-content-divider/README.md +4 -4
  31. package/docs/sui-content-label/README.md +11 -6
  32. package/docs/sui-counter-input/README.md +19 -18
  33. package/docs/sui-date-selector/README.md +16 -12
  34. package/docs/sui-datepicker/README.md +46 -32
  35. package/docs/sui-day-cell/README.md +17 -8
  36. package/docs/sui-day-label/README.md +2 -2
  37. package/docs/sui-divider/README.md +5 -5
  38. package/docs/sui-drawer-footer/README.md +19 -5
  39. package/docs/sui-dropdown-search/README.md +3 -3
  40. package/docs/sui-emoji/README.md +6 -6
  41. package/docs/sui-empty-state/README.md +13 -23
  42. package/docs/sui-fancy-button/README.md +24 -18
  43. package/docs/sui-file-icon/README.md +1 -1
  44. package/docs/sui-file-upload/README.md +3 -0
  45. package/docs/sui-file-upload-card/README.md +8 -7
  46. package/docs/sui-filter/README.md +5 -5
  47. package/docs/sui-flag/README.md +3 -2
  48. package/docs/sui-form-hint/README.md +12 -8
  49. package/docs/sui-form-label/README.md +11 -16
  50. package/docs/sui-icon/README.md +4 -3
  51. package/docs/sui-image-upload/README.md +28 -16
  52. package/docs/sui-inline-input/README.md +7 -6
  53. package/docs/sui-inline-select/README.md +8 -5
  54. package/docs/sui-input/README.md +26 -35
  55. package/docs/sui-integration-switch/README.md +14 -7
  56. package/docs/sui-kbd/README.md +4 -4
  57. package/docs/sui-key-icon/README.md +6 -2
  58. package/docs/sui-link-button/README.md +21 -17
  59. package/docs/sui-modal-footer/README.md +1 -1
  60. package/docs/sui-notification/README.md +8 -6
  61. package/docs/sui-notification-footer/README.md +2 -2
  62. package/docs/sui-notification-tab-menu/README.md +5 -3
  63. package/docs/sui-pagination/README.md +8 -5
  64. package/docs/sui-password-strength/README.md +1 -1
  65. package/docs/sui-period-range/README.md +18 -14
  66. package/docs/sui-popover/README.md +13 -7
  67. package/docs/sui-product-card/README.md +14 -10
  68. package/docs/sui-progress-bar/README.md +4 -2
  69. package/docs/sui-progress-bar-label/README.md +2 -0
  70. package/docs/sui-radio/README.md +14 -7
  71. package/docs/sui-radio-card/README.md +12 -12
  72. package/docs/sui-radio-label/README.md +36 -11
  73. package/docs/sui-rating/README.md +28 -9
  74. package/docs/sui-rich-editor/README.md +3 -3
  75. package/docs/sui-segmented-control/README.md +32 -21
  76. package/docs/sui-select/README.md +35 -31
  77. package/docs/sui-sidebar/README.md +1 -2
  78. package/docs/sui-slider/README.md +7 -0
  79. package/docs/sui-social-button/README.md +24 -11
  80. package/docs/sui-status-badge/README.md +7 -3
  81. package/docs/sui-stepper/README.md +30 -17
  82. package/docs/sui-store-card/README.md +9 -4
  83. package/docs/sui-switch/README.md +16 -11
  84. package/docs/sui-switch-card/README.md +18 -16
  85. package/docs/sui-switch-label/README.md +22 -11
  86. package/docs/sui-tab-chips/README.md +55 -41
  87. package/docs/sui-tab-menu-horizontal/README.md +19 -11
  88. package/docs/sui-tab-menu-vertical/README.md +10 -5
  89. package/docs/sui-tag/README.md +25 -11
  90. package/docs/sui-tag-input/README.md +24 -14
  91. package/docs/sui-textarea/README.md +21 -21
  92. package/docs/sui-time-picker/README.md +38 -32
  93. package/docs/sui-toast/README.md +27 -22
  94. package/docs/sui-tooltip/README.md +14 -17
  95. package/docs/sui-topbar-button/README.md +2 -2
  96. package/fesm2022/ajuarezso-sui-design-system.mjs +1071 -240
  97. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  98. package/package.json +1 -1
  99. package/types/ajuarezso-sui-design-system.d.ts +601 -267
@@ -26,7 +26,8 @@ Vehículo → Listo»).
26
26
  - Secciones que se visitan en cualquier orden: `sui-tab-menu-horizontal`.
27
27
  - Un solo paso: no hay nada que indicar.
28
28
 
29
- Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-bar · secciones sin orden → tab menu.**
29
+ Regla corta (propuesta, falta aprobación): **pasos con nombre y orden → stepper · porcentaje →
30
+ progress-bar · secciones sin orden → tab menu.**
30
31
 
31
32
  ## Qué variante usar
32
33
 
@@ -35,9 +36,11 @@ Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-b
35
36
  > procesos secuenciales». El **vertical**, el mismo indicador «para layouts diversos», con una
36
37
  > flecha en el paso activo. Estados de cada paso: `default`, `active`, `completed`. No trae do/don't.
37
38
  >
38
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
39
- > **7 usos en 7 archivos**, los 7 en los onboardings: todos `variant="horizontal"`, sin `size`
40
- > (`small`), sin `interactive`, de 2 o 3 pasos.
39
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`):
40
+ > **8 usos en 8 archivos**. 7 en los onboardings: todos `variant="horizontal"`, sin `size`
41
+ > (`small`), sin `interactive`, de 2 o 3 pasos. 1 en el home del cliente:
42
+ > `pages/customer/store-browser/store-browser.html:214`, `variant="dot"`, `size="medium"`,
43
+ > `[interactive]="true"` (paginador de los rubros, desde el 03-10-2026).
41
44
 
42
45
  ### `variant`
43
46
 
@@ -45,7 +48,7 @@ Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-b
45
48
  |---|---|---|---|
46
49
  | `horizontal` (default) | Flujo de **2 a 4 pasos** con nombre, arriba del contenido del paso. Mobile y web. | `pages/driver-onboarding/step-info/step-info.html:3` («Datos → Vehículo → Listo») | según la guía del DS (procesos secuenciales); el límite de pasos es propuesta |
47
50
  | `vertical` | Flujo de **5+ pasos** en web, en una columna al costado del formulario. | (sin uso) | según la guía del DS (la pieza existe); el cuándo es propuesta |
48
- | `dot` | Pantallas que se pasan de a una sin nombre: carrusel de bienvenida, fotos. | (sin uso) | según la guía del DS (puntos de carrusel) |
51
+ | `dot` | Pantallas que se pasan de a una sin nombre: carrusel de bienvenida, fotos. | `pages/customer/store-browser/store-browser.html:214` (páginas de rubros del home) | según la guía del DS (puntos de carrusel) |
49
52
 
50
53
  ### `size`
51
54
 
@@ -53,7 +56,7 @@ Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-b
53
56
  |---|---|---|---|
54
57
  | `small` (default) | punto de 8 · indicador de 20 · texto 14 | Web. | según la guía del DS (`small` es su default) |
55
58
  | `xsmall` | solo el punto: 4 px. Horizontal y vertical quedan igual que `small`. | Puntos sobre una foto o un banner chico, donde 8 px tapan. | según la guía del DS (el tamaño existe); el cuándo es propuesta |
56
- | `medium` | punto de 10 · indicador de 24 · texto 16 · card vertical de 44 | Mobile. **Está en el repo del DS (03-10-2026), no en la versión publicada 0.19.0.** | canon (dueño: tamaño por plataforma, 03-10-2026) |
59
+ | `medium` | punto de 10 · indicador de 24 · texto 16 · card vertical de 44 | Mobile. Publicado desde la 0.20.0 (la app usa la 0.22.0). | canon (dueño: tamaño por plataforma, 03-10-2026) |
57
60
 
58
61
  ### Estado de cada paso (`currentStep`, `errorStep`)
59
62
 
@@ -70,7 +73,7 @@ Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-b
70
73
  | valor | cuándo | fuente |
71
74
  |---|---|---|
72
75
  | `false` (default) | Los onboardings: se avanza con el botón «Continuar», no tocando el paso. | propuesta, falta aprobación |
73
- | `true` | Solo si los pasos hechos se pueden **volver a editar** y en web (el área tocable es chica, ver Tamaño). | propuesta, falta aprobación |
76
+ | `true` | Los puntos de un carrusel (en el teléfono se tocan en 44 de alto, ver Tamaño), o pasos hechos que se pueden **volver a editar** en web (el horizontal mide 24 de alto). | propuesta, falta aprobación |
74
77
 
75
78
  ### `steps`, `count`, `ariaLabel`
76
79
 
@@ -82,11 +85,14 @@ Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-b
82
85
 
83
86
  **Usos de hoy que rompen las reglas:**
84
87
 
85
- - **0 de variante o estado**: los 7 son horizontales de 2 o 3 pasos, y `step-complete` usa
88
+ - **0 de variante o estado** en los onboardings: los 7 son horizontales de 2 o 3 pasos, y `step-complete` usa
86
89
  `currentStep = stepLabels.length` para marcar todo hecho (`pages/driver-onboarding/step-complete/step-complete.html:3`).
87
- - **7 sin tamaño por plataforma** (el `medium` todavía no está publicado): los onboardings se hacen
88
- en el teléfono. Cuando se publique, `[size]="bp.isMobile() ? 'medium' : 'small'"`. Ejemplos:
90
+ - **7 sin tamaño por plataforma** (`medium` ya está publicado): los onboardings se hacen en el
91
+ teléfono y van con `[size]="bp.isMobile() ? 'medium' : 'small'"`. Ejemplos:
89
92
  `pages/customer-onboarding/step-phone/step-phone.html:3`, `pages/business-onboarding/step-info/step-info.html:3`.
93
+ - **A discutir, 1 `interactive` en mobile:** `pages/customer/store-browser/store-browser.html:214`
94
+ usa los puntos `medium` como paginador tocable en el home del cliente. Desde el 04-10-2026 cada
95
+ punto se toca en 22 × 44 en el teléfono (ver Tamaño); el dibujo sigue de 10 × 10.
90
96
 
91
97
  ## Tamaño en mobile y en web
92
98
 
@@ -94,25 +100,29 @@ Regla corta: **pasos con nombre y orden → stepper · porcentaje → progress-b
94
100
  |---|---|---|---|
95
101
  | horizontal arriba de un paso | `medium` (indicador 24, texto 16) | `small` (indicador 20, texto 14) | canon (dueño: tamaño por plataforma, 03-10-2026) |
96
102
  | vertical al costado | no se usa (no entra al lado del formulario) | `small` | propuesta, falta aprobación |
97
- | puntos de carrusel | `medium` (10) | `small` (8) | propuesta, falta aprobación |
103
+ | puntos de carrusel | `medium` (10, se toca en 22 × 44) | `small` (8) | tamaño: propuesta, falta aprobación · área de 44: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
98
104
 
99
105
  ```html
100
106
  <sui-stepper [steps]="pasos" [currentStep]="paso - 1" [size]="bp.isMobile() ? 'medium' : 'small'" />
101
107
  ```
102
108
 
103
- Sin `interactive` el tamaño solo afecta lo que se lee. Con `interactive`, **ningún tamaño llega a
104
- 44 px tocables** en horizontal (24 de alto con `medium`) ni en puntos (10 px): por eso
105
- `interactive` queda para web. La card vertical `medium` sí llega a 44.
109
+ Sin `interactive` el tamaño solo afecta lo que se lee. Con `interactive`, en el teléfono
110
+ (≤ 767 px) **los puntos se tocan en 44 de alto** (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono): un `::before` invisible
111
+ los estira a 44 de alto y, de ancho, hasta la mitad del espacio con el vecino, para que dos áreas
112
+ nunca se pisen: `medium` 22 × 44, `small` 18 × 44, `xsmall` 10 × 44. El dibujo no cambia. No se
113
+ agregó un size que separe los puntos: cambiaría el paginador, y lo que faltaba era alto. El
114
+ horizontal sigue en 24 de alto con `medium`: con `interactive` queda para web. La card vertical `medium` sí llega a 44 (padding 10 + 24 + padding 10).
115
+ Alto de cada pieza: horizontal `small` 20 y `medium` 24 (el indicador; la línea del texto mide lo
116
+ mismo) · puntos 4 / 8 / 10 · card vertical `small` 36 (8 + 20 + 8) y `medium` 44.
106
117
 
107
118
  ## «No usar»: por qué no hoy y cuándo sí
108
119
 
109
120
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
110
121
  |---|---|---|
111
122
  | `vertical` | ningún flujo tiene 5+ pasos | un alta de local completa en web (datos, carta, horario, pagos, repartidores) |
112
- | `dot` | ningún carrusel usa el componente | un carrusel de bienvenida o de fotos del producto |
113
123
  | `xsmall` | no hay puntos sobre fotos | puntos sobre el banner del carrusel del home |
114
124
  | `errorStep` | ningún flujo muestra dónde se cortó | el estado de una solicitud de repartidor rechazada en el paso «Documentos» |
115
- | `interactive` | en los onboardings se avanza con el botón | un formulario largo en web donde se vuelve a corregir un paso hecho |
125
+ | `interactive` | en los onboardings se avanza con el botón (el único uso, en el home del cliente, está a discutir arriba) | un formulario largo en web donde se vuelve a corregir un paso hecho |
116
126
 
117
127
  ## API
118
128
 
@@ -140,7 +150,7 @@ interface SuiStepperItem {
140
150
  label?: string; // sin label sale «Paso N»
141
151
  }
142
152
  type SuiStepperVariant = 'dot' | 'horizontal' | 'vertical';
143
- type SuiStepperSize = 'small' | 'xsmall' | 'medium'; // medium: repo del DS, no en 0.19.0
153
+ type SuiStepperSize = 'small' | 'xsmall' | 'medium'; // medium: extensión SUI (03-10-2026)
144
154
  ```
145
155
 
146
156
  ## Trampas
@@ -152,6 +162,9 @@ type SuiStepperSize = 'small' | 'xsmall' | 'medium'; // medium: repo del DS, n
152
162
  - **El horizontal hace `flex-wrap`**: con muchos pasos o nombres largos baja a otra línea en vez de
153
163
  cortarse. Con 4+ pasos en mobile, revisa a 390 px.
154
164
  - **`stepClick` solo sale con `interactive`**; sin él los pasos son `div` y no responden.
165
+ - **Rol del host (04-10-2026):** sin `interactive` es `role="list"` con hijos `listitem`; con
166
+ `interactive` los pasos son `<button>` (no pueden ser `listitem`), así que el host pasa a
167
+ `role="group"` con su `ariaLabel`. El paso actual lleva `aria-current="step"` en los dos casos.
155
168
  - `errorStep` gana sobre `currentStep`: los anteriores quedan hechos y los siguientes por hacer.
156
169
  - El activo usa `--sui-primary-base`, que en la app es naranja.
157
170
 
@@ -68,17 +68,22 @@ El ancho lo da el contenedor. El `size` cambia **el corazón de favorito**, en l
68
68
  |---|---|---|---|
69
69
  | `small` (default) | 36 × 36 | 18 | lo que había en el DS |
70
70
  | `medium` | 40 × 40 | 20 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
71
+ | `large` | 44 × 44 | 20 | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono. Size nuevo del 04-10-2026; además la nota se toca en 44 de alto |
71
72
 
72
73
  | uso | mobile | web | fuente |
73
74
  |---|---|---|---|
74
75
  | tarjeta | ancho completo | celda de una grilla de 2–3 columnas (≥ 300 de ancho) | lo que hay en la app |
75
- | corazón de favorito | `medium` (40) | `small` (36) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
76
- | nota (abre las opiniones) | el alto de su columna (~40) | ~40 | lo que hay en el DS |
76
+ | corazón de favorito | `large` (44) | `small` (36) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
77
+ | 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) |
77
78
 
78
79
  ```html
79
- <sui-store-card [store]="local" [size]="bp.isMobile() ? 'medium' : 'small'" />
80
+ <sui-store-card [store]="local" [size]="bp.isMobile() ? 'large' : 'small'" />
80
81
  ```
81
82
 
83
+ `medium` (40) queda para quien ya lo usa: no llega al piso de 44. **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' : 'small'"` (cambio de la app, no del DS).
86
+
82
87
  ## «No usar»: por qué no hoy y cuándo sí
83
88
 
84
89
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -97,7 +102,7 @@ El ancho lo da el contenedor. El `size` cambia **el corazón de favorito**, en l
97
102
  | `isFavorite` | `boolean` | `false` |
98
103
  | `disableLink` | `boolean` | `false` |
99
104
  | `linkBase` | `string` | `'/cliente/restaurante'` |
100
- | `size` | `'small' \| 'medium'` | `'small'` |
105
+ | `size` | `'small' \| 'medium' \| 'large'` | `'small'` |
101
106
  | `deliveryText` | `string \| null` | `undefined` |
102
107
  | `distanceText` | `string \| null` | `undefined` |
103
108
 
@@ -22,7 +22,7 @@ propio título (día de la semana, tarjeta de la oferta).
22
22
  descripción y el toque en toda la fila.
23
23
  - Un valor de formulario que se confirma con «Guardar»: `sui-checkbox`. (Excepción aceptada hoy:
24
24
  los formularios de producto y de planes usan switch para «disponible»/«activo» aunque se guarden
25
- después; es el patrón que la persona reconoce.)
25
+ después; es el patrón que la persona reconoce. Propuesta, falta aprobación.)
26
26
  - Algo destructivo o que no se deshace: el switch promete que se puede volver atrás al toque.
27
27
  - Elegir entre dos modos con nombre: `sui-segmented-control` si se aplica al instante (cuadrícula /
28
28
  lista); `sui-radio-card` si se guarda después («Por distancia» / «Precio único» en ajustes).
@@ -64,24 +64,24 @@ Regla corta: **se aplica ya → switch · se confirma después → checkbox · d
64
64
  **Usos de hoy que rompen las reglas:**
65
65
 
66
66
  - **19 switches con su texto armado a mano → `sui-switch-label`.** Ejemplos:
67
- `pages/discounts/discounts.html:198` («Un uso por cliente», con `sui-form-label` + `<span>`),
67
+ `pages/discounts/discounts.html:207` («Un uso por cliente», con `sui-form-label` + `<span>`),
68
68
  `pages/drivers/drivers.html:58` («Aceptar pedidos automáticamente»),
69
- `pages/super-admin/master-plans/master-plans.html:90` («Plan activo», y 8 más en ese archivo).
70
- El resto: `discounts.html:302`, `pages/super-admin/master-map-overview/master-map-overview.html:67`,
71
- `pages/schedule/schedule.html:46`, `components/add-product-modal/add-product-modal.html:196`, `:255`, `:280`,
72
- `components/option-sections-manager/option-sections-manager.html:107`, `:123`.
69
+ `pages/super-admin/master-plans/master-plans.html:92` («Plan activo», y 8 más en ese archivo).
70
+ El resto: `discounts.html:319`, `pages/super-admin/master-map-overview/master-map-overview.html:67`,
71
+ `pages/schedule/schedule.html:46`, `components/add-product-modal/add-product-modal.html:205`, `:264`, `:289`,
72
+ `components/option-sections-manager/option-sections-manager.html:107`, `:125`.
73
73
  - **3 con la etiqueta que repite el estado** («Disponible» / «No disponible», «Activo»):
74
- `components/option-sections-manager/option-sections-manager.html:143`,
75
- `components/add-product-modal/add-product-modal.html:303`, `pages/employees/employees.html:99`.
74
+ `components/option-sections-manager/option-sections-manager.html:145`,
75
+ `components/add-product-modal/add-product-modal.html:312`, `pages/employees/employees.html:99`.
76
76
  - **2 en `medium` (sin `size`):** `pages/drivers/drivers.html:58`,
77
77
  `pages/super-admin/master-map-overview/master-map-overview.html:67`.
78
78
  - **1 nativo dibujado como switch:** `components/settings-panel/settings-panel.html:97`
79
79
  («Notificaciones Push») → `sui-switch-label`.
80
80
 
81
- Bien pelados (el texto vive en la fila o la tabla): `pages/discounts/discounts.html:96` (columna
82
- de la tabla), `pages/super-admin/master-settings/master-settings.html:103`, los días de
81
+ Bien pelados (el texto vive en la fila o la tabla): `pages/discounts/discounts.html:98` (columna
82
+ de la tabla), `pages/super-admin/master-settings/master-settings.html:105`, los días de
83
83
  `components/weekly-schedule-editor/weekly-schedule-editor.html:5` y
84
- `pages/driver/driver-schedule/driver-schedule.html:108`, `pages/central/central-ofertas/central-ofertas.html:19`.
84
+ `pages/driver/driver-schedule/driver-schedule.html:106`, `pages/central/central-ofertas/central-ofertas.html:19`.
85
85
 
86
86
  ## Tamaño en mobile y en web
87
87
 
@@ -114,6 +114,7 @@ va `sui-switch-label`, que hace tocable todo el bloque.
114
114
  | `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
115
115
  | `checked` | `boolean` | `false` |
116
116
  | `disabled` | `boolean` | `false` |
117
+ | `focusable` | `boolean` | `true` |
117
118
 
118
119
  | output | payload |
119
120
  |---|---|
@@ -131,6 +132,10 @@ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
131
132
  mezcles las dos formas.
132
133
  - `disabled` no baja la opacidad: cambia el color y achica el círculo. Un `opacity` encima lo duplica.
133
134
  - No tiene `aria-label`: pelado, pásalo con `[attr.aria-label]` (como en `central-ofertas`).
135
+ Dentro de `sui-switch-label`, `sui-switch-card`, `sui-integration-switch` y el toggle de
136
+ `sui-content-label` ya toma el nombre del texto con `aria-labelledby` (revisión 04-10-2026).
137
+ - **`[focusable]="false"` lo saca del Tab** (tabindex -1), para cuando un padre es el control
138
+ enfocable. `tabindex="-1"` en el host no sirve: el binding del componente lo pisa.
134
139
  - Ya trae el arreglo de iOS para el `:active` pegado.
135
140
 
136
141
  ## Ejemplo
@@ -17,7 +17,8 @@ su propia tarjeta: «Notificaciones», «Ubicación siempre», «Recibir pedidos
17
17
 
18
18
  **No lo uses** para:
19
19
 
20
- - Algo que se confirma después con «Guardar»: `sui-checkbox-card` (canon del switch-label).
20
+ - Algo que se confirma después con «Guardar»: `sui-checkbox-card` (según la guía del DS: el switch
21
+ es «para prender o apagar un ajuste de forma inmediata»).
21
22
  - Una lista larga de ajustes parecidos: `sui-switch-label` con `flip`, uno por fila.
22
23
  - Una integración con otro servicio (logo + «Administrar»): `sui-integration-switch`.
23
24
  - Algo destructivo o que no se deshace: un botón con confirmación.
@@ -30,16 +31,16 @@ Regla corta: **ajuste con peso, al toque → switch-card · lista de ajustes →
30
31
  > **La guía del DS no tiene página de la switch card.** De la guía sale lo del switch que lleva
31
32
  > adentro: **«para prender o apagar un ajuste de forma inmediata»**.
32
33
  >
33
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **26
34
- > switch-cards en 8 archivos**. Tipos: 19 `left-icon` (los 19 con el ícono proyectado), 7 `basic`
35
- > (5 de ellos sin `type`). Tamaños: 20 `bp.controlSize()`, 6 sin `size`. 10 viven en formularios
36
- > que se guardan con un botón.
34
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **16
35
+ > switch-cards en 8 archivos**. Tipos: 14 `left-icon` (los 14 con el ícono proyectado), 2 `basic`.
36
+ > Tamaños: los 16 con `bp.controlSize()`. Ninguna vive ya en un formulario que se guarda con un
37
+ > botón: las 10 que lo hacían pasaron a `sui-checkbox-card` el 03-10-2026.
37
38
 
38
39
  ### `type` (el leading)
39
40
 
40
41
  | type | cuándo | fuente |
41
42
  |---|---|---|
42
- | `left-icon` + ícono proyectado | Lo normal: `<sui-icon sui-switch-card-leading name="…" [size]="20" />`. | propuesta (19 de 26) |
43
+ | `left-icon` + ícono proyectado | Lo normal: `<sui-icon sui-switch-card-leading name="…" [size]="20" />`. | propuesta (14 de 16) |
43
44
  | `left-icon` + `emoji` | Ver «No usar». | propuesta |
44
45
  | `basic` | El ajuste es EL tema de la pantalla y no necesita ícono («Disponible» en el inicio del repartidor, «Disponibilidad automática»). | propuesta |
45
46
  | `avatar` (`imageUrl`) | Ver «No usar». | propuesta |
@@ -64,19 +65,16 @@ Regla corta: **ajuste con peso, al toque → switch-card · lista de ajustes →
64
65
  | `large` (40 × 24) | Desktop, vía `bp.controlSize()`. | canon (aprobado por el dueño, 28-09-2026) |
65
66
  | `medium` (default) | No usar en pantallas nuevas. | canon (aprobado por el dueño, 28-09-2026) |
66
67
 
67
- **Usos de hoy que rompen las reglas:**
68
-
69
- - **10 switch-cards en formularios que se guardan con un botón** (van `sui-checkbox-card`): los 5
70
- métodos de pago de `pages/mi-negocio/mi-negocio.html:1181`–`:1217` («Guardar cambios») y 5 de
71
- `pages/super-admin/master-settings/master-settings.html` (`:36` «Pausar los pedidos», `:179`,
72
- `:336`, `:342`, `:349`, cada uno con su «Guardar…» abajo).
73
- - **6 sin `size`**: los 5 de `master-settings` de arriba y `pages/notifications/notifications.html:59`
74
- («Sonidos de la app»).
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.
75
72
 
76
73
  ## Tamaño en mobile y en web
77
74
 
78
- La card entera se toca (≥ 72 con descripción): llega al piso de 44 sola. El `size` cambia solo el
79
- interruptor.
75
+ La card entera se toca: 74 px con descripción (16 + 40 + 16 de padding y contenido, más 2 de
76
+ borde) y 54 px la más chica (`basic`, sin descripción, `medium`). Llega al piso de 44 sola. El
77
+ `size` cambia solo el interruptor.
80
78
 
81
79
  | uso | mobile | web |
82
80
  |---|---|---|
@@ -130,6 +128,10 @@ Slot: `[sui-switch-card-leading]` (el ícono o el logo). Implementa `ControlValu
130
128
  - `avatar` siempre dibuja un `sui-avatar` con `imageUrl` (si falla, las iniciales del `label`): no usa lo
131
129
  proyectado. `card-provider`, `brand` y `company` leen `imageUrl` y, sin ella, usan lo proyectado.
132
130
  - Toda la card togglea; el toque sobre el propio switch no cuenta doble.
131
+ - **Teclado**: el único tab stop es el switch de la derecha, con nombre = `label` y descripción =
132
+ `description` (`aria-labelledby` / `aria-describedby`). Espacio y Enter emiten
133
+ `checkedChange` **una vez** (revisión 04-10-2026); antes emitían dos (el switch y, por burbujeo, la card),
134
+ y en formulario el valor se revertía.
133
135
  - El interruptor siempre va a la derecha (no hay `flip`).
134
136
  - `badge` con string sale **azul `light` `small`** (en `sui-switch-label` sale naranja).
135
137
 
@@ -47,7 +47,7 @@ Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · s
47
47
  | `sublabel` | Precisión corta entre paréntesis: «(beta)». | según la guía del DS |
48
48
  | `badge` | Solo novedad. Con string sale naranja `light`: pasa el objeto. | según la guía del DS (pieza «NEW»); el color es propuesta |
49
49
  | `link` | «Saber más» que no toca el interruptor. Solo se ve con `description`. | según la guía del DS |
50
- | `flip` | Interruptor a la **derecha** en listas de ajustes: el texto se lee primero y el control queda bajo el pulgar, como en iOS y Android (es lo que hacen a mano `drivers.html:58`, `discounts.html:198`, `schedule.html:46`). Sin `flip` (izquierda) dentro de un formulario, alineado con las casillas o los switches del resto del form. | canon (aprobado por el dueño, 03-10-2026) |
50
+ | `flip` | Interruptor a la **derecha** en listas de ajustes: el texto se lee primero y el control queda bajo el pulgar, como en iOS y Android (es lo que hacen a mano `drivers.html:58`, `discounts.html:207`, `schedule.html:46`). Sin `flip` (izquierda) dentro de un formulario, alineado con las casillas o los switches del resto del form. | canon (aprobado por el dueño, 03-10-2026) |
51
51
  | `disabled` | Mientras se guarda el cambio o cuando no aplica. | según la guía del DS |
52
52
 
53
53
  ### `size`
@@ -60,25 +60,34 @@ Regla corta: **ajuste con texto → este · ajuste con peso → switch-card · s
60
60
 
61
61
  **Usos de hoy que rompen las reglas:**
62
62
 
63
- - **2 en `medium`:** `pages/products/products.html:300` («Horario propio
63
+ - **2 en `medium`:** `pages/products/products.html:301` («Horario propio
64
64
  para esta categoría») y `pages/public/privacidad/privacidad.html:132` («Permitir analítica de uso»).
65
65
  - **19 `sui-switch` con texto a mano + 1 nativo** que deberían ser este componente: el detalle
66
- está en el README de `sui-switch`. Ejemplos: `pages/discounts/discounts.html:198`,
66
+ está en el README de `sui-switch`. Ejemplos: `pages/discounts/discounts.html:207`,
67
67
  `pages/drivers/drivers.html:58`, `components/settings-panel/settings-panel.html:97`.
68
68
 
69
69
  ## Tamaño en mobile y en web
70
70
 
71
- | uso | mobile | web |
72
- |---|---|---|
73
- | fila de ajustes | `xlarge` (48 × 28) | `large` (40 × 24) |
74
- | ajuste que es la acción principal de la pantalla («Cerrar por hoy») | `xlarge` | `xlarge` |
71
+ | uso | mobile | web | fuente |
72
+ |---|---|---|---|
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 |
75
75
 
76
76
  ```html
77
- <sui-switch-label [size]="bp.controlSize()" … /> <!-- isMobile() ? 'xlarge' : 'large' -->
77
+ <sui-switch-label [size]="bp.isMobile() ? '2xlarge' : 'large'" … />
78
78
  ```
79
79
 
80
- El bloque entero se toca, así que con descripción la fila pasa los 44 px sola. Sin descripción,
81
- dale a la fila un alto mínimo de 44 px.
80
+ | size | switch | label | descripción | alto de la fila sin descripción |
81
+ |---|---|---|---|---|
82
+ | `medium` (default, Figma) | 32 × 20 | 14/20 | 12/16 | 20 |
83
+ | `large` | 40 × 24 | 16/24 | 12/16 | 24 |
84
+ | `xlarge` | 48 × 28 | 16/24 | 12/16 | 28 |
85
+ | `2xlarge` | 48 × 28 | 16/24 | 12/16 | **44** (`min-height`) |
86
+
87
+ 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`.
82
91
 
83
92
  En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el label va en 16/24; sublabel y
84
93
  descripción se quedan en 12.
@@ -101,7 +110,7 @@ descripción se quedan en 12.
101
110
  | `label` | `string` | `''` |
102
111
  | `sublabel` | `string \| null` | `null` |
103
112
  | `description` | `string \| null` | `null` |
104
- | `size` | `'medium' \| 'large' \| 'xlarge'` | `'medium'` |
113
+ | `size` | `'medium' \| 'large' \| 'xlarge' \| '2xlarge'` | `'medium'` |
105
114
  | `badge` | `SuiBadgeConfig \| string \| null` | `null` |
106
115
  | `link` | `SuiLinkConfig \| string \| null` | `null` |
107
116
  | `flip` | `boolean` | `false` |
@@ -127,6 +136,8 @@ Implementa `ControlValueAccessor` (`[(ngModel)]`, `formControlName`).
127
136
  - Deshabilitado baja todo el bloque a 0.5 de opacidad **además** del gris propio del switch.
128
137
  - El badge con string sale naranja; en `sui-switch-card` el default es azul.
129
138
  - `flip` usa CSS `order`: el orden de lectura no cambia.
139
+ - El switch de adentro es el tab stop y toma su nombre del `label` y su descripción de la
140
+ `description` (`aria-labelledby` / `aria-describedby`) (revisión 04-10-2026).
130
141
 
131
142
  ## Ejemplo
132
143
 
@@ -13,8 +13,9 @@ Story: [Molecules/Tabs/Tab Chips](https://sui-design-system.web.app/?path=/docs/
13
13
 
14
14
  **Úsalo** para:
15
15
 
16
- - **Filtrar una lista** por estado, período, rol o zona: «Todos · Activos · Entregados · Cancelados»,
17
- «Hoy · 7 días · 30 días», los meses de la central.
16
+ - **Filtrar una lista** por estado, período, rol o zona con **5 o más opciones**, o con opciones que
17
+ no caben y se deslizan: «Todos · Pendientes · En camino · Entregados · Cancelados», los meses de la
18
+ central.
18
19
  - **Saltar entre categorías** de un catálogo que viene de la base («Hamburguesas · Pizzas ·
19
20
  Bebidas»), con `sticky` en la carta del local.
20
21
 
@@ -22,35 +23,38 @@ Sirve cuando las opciones son muchas, cambian según los datos o no caben y tien
22
23
 
23
24
  **No lo uses** para:
24
25
 
25
- - **2 a 4 modos de la misma vista** (por semana / día vs día): `sui-segmented-control`.
26
+ - **2 a 4 opciones excluyentes**, sean modos de la vista (por semana / día vs día) o un período o
27
+ filtro fijo («Hoy · 7 días · 30 días»): `sui-segmented-control`. **Período o filtro con 2 a 4 opciones excluyentes → `sui-segmented-control`; con 5 o más, o si no caben y tienen que deslizarse → `sui-tab-chips`** (canon, dueño 04-10-2026).
26
28
  - **Secciones de contenido distinto** (Ventas · Productos · Repartidores): `sui-tab-menu-horizontal`.
27
29
  - **Elegir un valor que se guarda** con un botón (radio de visibilidad, motivo de rechazo,
28
- sumar o descontar): `sui-radio-card` o `sui-segmented-control`. El tab-chips **siempre tiene uno
29
- elegido** y no puede quedar vacío (ver Trampas).
30
+ sumar o descontar): `sui-radio-card`. (`sui-segmented-control` no sirve para esto: su README lo
31
+ deja para opciones que se aplican en el momento.) El tab-chips **siempre tiene uno elegido** y no
32
+ puede quedar vacío (ver Trampas).
30
33
  - Un chip que la persona quita: `sui-tag`.
31
34
 
32
- Regla corta (la misma del README de `sui-segmented-control`, 03-10-2026): **2-4 modos de la misma
33
- vista → segmented · secciones → tab menu · filtros o categorías → tab-chips.**
35
+ Regla corta (canon, dueño 04-10-2026; la misma del README de `sui-segmented-control`): **2-4
36
+ opciones excluyentes (modo, período o filtro) → segmented · 5+ o que deslizan → tab-chips ·
37
+ secciones → tab menu.**
34
38
 
35
39
  ## Qué variante usar
36
40
 
37
41
  > **La guía del DS no tiene este componente**: es una extensión de SUI (la «cat nav» de las apps de
38
42
  > delivery). Todo lo que sigue es propuesta salvo lo marcado como canon.
39
43
  >
40
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (sin `master-preview`, `master-prototipos`,
41
- > `mockup-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`):
42
- > **41 usos en 28 archivos `.html`**. `[sticky]="true"`: 1 (carta del local). `count`: 5 listas.
43
- > `[(value)]`: 2; el resto `[value]` + `(valueChange)`. `autoScroll`: 0. `size`: 0 (no existe en
44
- > la versión publicada).
44
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app` (sin `master-preview`, `master-prototipos`,
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
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'`.
45
49
 
46
50
  ### Para qué se usa (el contenido de los chips)
47
51
 
48
52
  | caso | cuándo | ejemplo real de la app | fuente |
49
53
  |---|---|---|---|
50
54
  | filtro de estado | La lista es la misma; los chips la recortan. «Todos» va primero y es el elegido por defecto. | `pages/envios/envios.html:98` («Todos · Activos · Entregados · Cancelados») · `pages/orders/orders.html:64` | propuesta, falta aprobación |
51
- | filtro de período | Rango de fechas de un reporte o gráfico. | `pages/super-admin/master-earnings/master-earnings.html:11` · `pages/central/central-gastos/central-gastos.html:10` (meses) | propuesta, falta aprobación |
55
+ | filtro de período | Rango de fechas de un reporte o gráfico **con 5 o más opciones** (los meses). Con 2 a 4 («Hoy · 7 días · 30 días») va `sui-segmented-control`. | `pages/central/central-gastos/central-gastos.html:10` (meses) | canon (dueño, 04-10-2026) |
52
56
  | categorías del catálogo | Saltar a una categoría de la carta; con `sticky` y `autoScroll`. | `pages/customer/restaurant-menu/restaurant-menu.html:226` | propuesta, falta aprobación |
53
- | sugerencias rápidas | **No.** Un motivo frecuente que completa un texto no es una selección: el chip elige el primero solo. Si se usa, el primer chip es el neutro («Otro motivo») y el texto lleva su propio signal. | `pages/super-admin/master-orders/master-orders.html:898` (bien resuelto) | propuesta, falta aprobación |
57
+ | sugerencias rápidas | **No.** Un motivo frecuente que completa un texto no es una selección: el chip elige el primero solo. Si se usa, el primer chip es el neutro («Otro motivo») y el texto lleva su propio signal. | `pages/super-admin/master-orders/master-orders.html:900` (bien resuelto) | propuesta, falta aprobación |
54
58
 
55
59
  ### `sticky`
56
60
 
@@ -77,50 +81,54 @@ vista → segmented · secciones → tab menu · filtros o categorías → tab-c
77
81
 
78
82
  **Usos de hoy que rompen las reglas:**
79
83
 
80
- - **3 con un bug real: el motivo escrito a mano rebota al primer chip.** En los modales de rechazo
81
- del super admin, los chips y el textarea comparten el mismo signal. Cada tecla deja un texto que
82
- no es ningún chip; el componente vuelve al primero y lo emite, así que el textarea se reescribe con
83
- «El comprobante no se lee». No se puede escribir un motivo propio, y al abrir el modal ya hay un
84
- motivo elegido sin que nadie lo toque. `pages/super-admin/master-drivers/master-drivers.html:652`,
85
- `:924` y `:1002`. Es el mismo bug que se arregló en `master-orders` el 01-09-2026 (signal propio
86
- para los chips y «Otro motivo» primero).
84
+ - **Resuelto el 03-10-2026: el motivo escrito a mano rebotaba al primer chip.** En los modales de
85
+ rechazo del super admin (`pages/super-admin/master-drivers/master-drivers.html:657`, `:933` y
86
+ `:1012`) los chips y el textarea compartían el signal. Ahora los chips llevan el suyo
87
+ (`master-drivers/motivo-con-chips.ts`, «Otro motivo» primero), igual que `master-orders` desde el
88
+ 01-09-2026.
87
89
  - **4 son secciones de contenido distinto** (→ `sui-tab-menu-horizontal` en web; en mobile, a
88
90
  discutir porque el tab menu no se desliza, ver su README): `pages/products/products.html:6`
89
91
  («Categorías · Productos · Secciones reutilizables»), `pages/promociones/promociones.html:7`
90
92
  («Carrusel pagado · Push notifications»), `pages/super-admin/master-drivers/master-drivers.html:16`,
91
- `pages/reports/reports.html:98` («Ventas · Productos · Repartidores · Clientes»).
93
+ `pages/reports/reports.html:99` («Ventas · Productos · Repartidores · Clientes»).
92
94
  - **2 son modos de la misma vista** (→ `sui-segmented-control`):
93
- `pages/super-admin/master-semanas/master-semanas.html:67` (3 métricas del mismo gráfico) y `:72`
95
+ `pages/super-admin/master-semanas/master-semanas.html:75` (3 métricas del mismo gráfico) y `:80`
94
96
  («Por semana · Día vs día»).
95
- - **4 eligen un valor de un formulario** (→ `sui-radio-card` o `sui-segmented-control`):
96
- `components/option-sections-manager/option-sections-manager.html:175` (a qué se aplica),
97
- `pages/super-admin/master-drivers/master-drivers.html:98` («Sumar · Descontar»),
98
- `pages/mi-negocio/mi-negocio.html:938` (radio de visibilidad) y `:973` (tiempo para confirmar).
99
- A discutir: `pages/customer/checkout/checkout.html:468` (día del pedido programado), que filtra
97
+ - **4 eligen un valor de un formulario** (→ `sui-radio-card`; `sui-segmented-control` solo si se
98
+ aplica en el momento, sin botón «Guardar»):
99
+ `components/option-sections-manager/option-sections-manager.html:177` (a qué se aplica),
100
+ `pages/super-admin/master-drivers/master-drivers.html:99` («Sumar · Descontar»),
101
+ `pages/mi-negocio/mi-negocio.html:952` (radio de visibilidad) y `:988` (tiempo para confirmar).
102
+ A discutir: `pages/customer/checkout/checkout.html:460` (día del pedido programado), que filtra
100
103
  las franjas de abajo y se parece más a un filtro.
101
- - **1 con el número dentro del texto:** `pages/notifications/notifications.ts:191`
104
+ - **1 con el número dentro del texto:** `pages/notifications/notifications.ts:194`
102
105
  (`No leídas (3)` → `count: 3`).
103
- - **41 sin tamaño por plataforma** (el input todavía no está publicado): cuando se publique, los de
104
- pantallas del cliente y del repartidor pasan a `large`.
106
+ - **22 sin tamaño por plataforma.** 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.
105
108
 
106
109
  ## Tamaño en mobile y en web
107
110
 
108
- > `size` está **en el repo del DS (03-10-2026) y no en la versión publicada 0.19.0**. Hasta que se
109
- > publique, todos miden lo de `medium`.
111
+ `size` está publicado desde la 0.20.0; la app usa la 0.22.0.
110
112
 
111
- Alto del chip: `small` 32 px · `medium` 36 px (el de siempre, default) · `large` 40 px. `small` y
112
- `medium` con texto de 14 px; cambia el alto y el aire lateral. El scroller suma 12 px arriba y abajo.
113
+ Alto del chip: `small` 32 px (`height: 32px`) · `medium` 36 px (el de siempre, default; sin alto
114
+ fijo: 8 + 8 de padding + `line-height: normal` + 2 de borde, 36 medido en Storybook con Satoshi) ·
115
+ `large` 40 px (`height: 40px`, con `border-box`) · `xlarge` 44 px (`height: 44px`, padding lateral 18).
116
+ `small` y `medium` con texto de 14 px; cambia el alto y el aire lateral. El scroller suma 12 px arriba
117
+ y abajo, pero ese aire es del `<nav>`, no del botón: tocar ahí no elige el chip.
113
118
 
114
- En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el chip `large` va en 16/24 y sigue
115
- midiendo 40. El número del contador se queda en 12.
119
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el chip va en 16/24. El número del
120
+ contador mide 11 px en `small` y `medium`, y 12 px (pastilla de 20) en `large` y `xlarge`.
121
+
122
+ **Área táctil: 44 px en `xlarge`**, el piso del teléfono (canon del dueño, 04-10-2026: piso táctil
123
+ 44 en el teléfono). `large` (40) queda para pantallas que ya lo usan y para tablet.
116
124
 
117
125
  | uso | mobile | web | fuente |
118
126
  |---|---|---|---|
119
- | filtros y categorías | `large` (40; con el aire del scroller llega a 44+ de área táctil) | `medium` | canon (dueño: tamaño por plataforma, 03-10-2026) |
127
+ | filtros y categorías | `xlarge` (44) | `medium` | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; tamaño por plataforma, 03-10-2026 |
120
128
  | filtros densos en la cabecera de una tabla | — | `small` | propuesta, falta aprobación |
121
129
 
122
130
  ```html
123
- <sui-tab-chips [chips]="filtros" [(value)]="filtro" [size]="bp.isMobile() ? 'large' : 'medium'" />
131
+ <sui-tab-chips [chips]="filtros" [(value)]="filtro" [size]="bp.isMobile() ? 'xlarge' : 'medium'" />
124
132
  ```
125
133
 
126
134
  ## «No usar»: por qué no hoy y cuándo sí
@@ -141,7 +149,7 @@ midiendo 40. El número del contador se queda en 12.
141
149
  | `chips` | `readonly (string \| SuiTabChipItem)[]` | — (requerido) |
142
150
  | `value` · model, `[(value)]` | `string` | `''` |
143
151
  | `sticky` | `boolean` | `false` |
144
- | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` |
152
+ | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
145
153
  | `autoScroll` | `boolean` | `true` |
146
154
 
147
155
  Outputs: ninguno.
@@ -153,7 +161,7 @@ interface SuiTabChipItem {
153
161
  label: string;
154
162
  count?: number; // 0 o undefined no se dibuja
155
163
  }
156
- type SuiTabChipsSize = 'small' | 'medium' | 'large'; // repo del DS, no en 0.19.0
164
+ type SuiTabChipsSize = 'small' | 'medium' | 'large';
157
165
  ```
158
166
 
159
167
  ## Trampas
@@ -165,6 +173,12 @@ type SuiTabChipsSize = 'small' | 'medium' | 'large'; // repo del DS, no en 0.1
165
173
  - **`value` es `string`.** Para números (km, minutos) hay que convertir en los dos sentidos
166
174
  (`radioEfectivo() + ''` y `+$event`).
167
175
  - **Lleva `role="tablist"`** aunque se use como filtro: el lector de pantalla lo anuncia como pestañas.
176
+ - **Teclado (04-10-2026):** un solo tab stop (el chip activo). ← → mueven el foco entre chips con
177
+ vuelta al inicio, Home/End van al primero/último, y Enter/Espacio elige. Las flechas **no**
178
+ seleccionan (activación manual): cada filtro recarga datos y no se dispara una carga por chip
179
+ recorrido. Al salir del grupo, el tab stop vuelve al chip activo.
180
+ - **La cuenta va en el nombre accesible** («Pendientes, 3»): el número visible sigue
181
+ `aria-hidden` para que no se lea dos veces.
168
182
  - **No tiene padding lateral propio**: lo pone la pantalla. Sí trae 12 px arriba y abajo.
169
183
  - **`sticky` cambia el host a `display: contents`**: las clases que le pongas al host dejan de
170
184
  pintar caja (márgenes, anchos). Pon el estilo en un contenedor.
@@ -49,18 +49,19 @@ segmented · secciones → tab menu · filtros → tab-chips.**
49
49
 
50
50
  ### `size`
51
51
 
52
- | size | cuándo | fuente |
53
- |---|---|---|
54
- | `medium` (default) | El único que cambia algo: **ninguno**. El input existe pero no tiene estilos; los cuatro valores se ven igual. No lo pases. | según el código (`sui-tab-menu-horizontal.scss`: no hay reglas por tamaño) |
55
- | `small` · `large` · `xlarge` | No usar: no hacen nada. | según el código |
52
+ Los cuatro valores (`small`, `medium`, `large`, `xlarge`) cambian el alto de la franja y el texto
53
+ desde el 03-10-2026 (`sui-tab-menu-horizontal.scss`, bloque «Tamaños»). Cuándo usar cada uno: ver
54
+ «Tamaño en mobile y en web».
56
55
 
57
56
  **Usos de hoy que rompen las reglas:**
58
57
 
59
58
  - **0** en este componente. Los casos que deberían ser tab menu y hoy son `sui-tab-chips` están en el
60
59
  README de `sui-tab-chips` (4: `pages/products/products.html:6`, `pages/promociones/promociones.html:7`,
61
- `pages/super-admin/master-drivers/master-drivers.html:16`, `pages/reports/reports.html:98`).
62
- - **A verificar en mobile:** el uso actual es del modal del local, que el cliente abre en el
63
- teléfono. La pestaña mide 20 px de alto tocable (ver Tamaño).
60
+ `pages/super-admin/master-drivers/master-drivers.html:16`, `pages/reports/reports.html:99`).
61
+ - **A discutir, 1 sin tamaño por plataforma:** el único uso
62
+ (`components/store-ratings-modal/store-ratings-modal.html:43`) es del modal del local, que el
63
+ cliente abre en el teléfono, y no pasa `size`: mide 48 px tocables (`medium`). Llega a 44, pero la
64
+ propuesta de abajo pide `large` en mobile.
64
65
 
65
66
  ## Tamaño en mobile y en web
66
67
 
@@ -69,10 +70,13 @@ Cada pestaña ocupa **todo el alto de la franja**, así que lo tocable es la fra
69
70
 
70
71
  | size | franja tocable (+ 2 de bordes) | texto | ícono | gap | fuente |
71
72
  |---|---|---|---|---|---|
72
- | `small` | 40 | `label-sm` 14/20 | 20 | 20 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
73
- | `medium` (default) | 48 | `label-sm` 14/20 | 20 | 24 | Figma |
74
- | `large` | 52 | `label-md` 16/24 | 20 | 24 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
75
- | `xlarge` | 56 | `label-md` 16/24 | 24 | 28 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
73
+ | `small` | 40 (10 + 20 + 10) | `label-sm` 14/20 | 20 | 20 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
74
+ | `medium` (default) | 48 (14 + 20 + 14) | `label-sm` 14/20 | 20 | 24 | Figma |
75
+ | `large` | 52 (14 + 24 + 14) | `label-md` 16/24 | 20 | 24 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
76
+ | `xlarge` | 56 (16 + 24 + 16) | `label-md` 16/24 | 24 | 28 | canon (aprobado por el dueño, 03-10-2026): extensión SUI |
77
+
78
+ El alto sale del `padding` vertical del botón más el `line-height` del texto. A lo ancho, lo tocable
79
+ es solo el texto: el `gap` entre pestañas no responde.
76
80
 
77
81
  | uso | mobile | web | fuente |
78
82
  |---|---|---|---|
@@ -128,6 +132,10 @@ interface SuiTabMenuHorizontalItem<T = string> {
128
132
  que Figma pone en el contenedor ahora va dentro de cada pestaña. Si algo de afuera le pone
129
133
  padding al `.sui-tab-menu-horizontal__track`, la franja crece al doble.
130
134
  - **Emite dos veces**: `tabChange` y `activeChange`. Con `[(active)]` no hace falta `(tabChange)`.
135
+ - **Teclado (04-10-2026):** un solo tab stop (la pestaña activa). ← → mueven el foco **y activan**
136
+ (patrón de tablist con activación automática), con vuelta al inicio y saltando las deshabilitadas;
137
+ Home/End a los extremos. Cada flecha emite `tabChange`. No hay `aria-controls`: el `tabpanel` lo
138
+ arma quien lo usa.
131
139
  - **Trae bordes arriba y abajo** (`stroke-soft-200`) y fondo blanco: no lo metas en una card que ya
132
140
  tiene borde, o quedan dos líneas.
133
141
  - El ícono de la pestaña activa es `strong-950`, no naranja; en el tab menu vertical es naranja.