@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
@@ -2,7 +2,7 @@
2
2
  name: sui-datepicker
3
3
  selector: sui-datepicker
4
4
  resumen: Calendario para elegir una fecha o un rango de fechas, en popover o en línea
5
- alternativas: [sui-input type="date" (una fecha suelta en un formulario: abre el selector del sistema), sui-tab-chips + sui-radio-label (día y franja de un pedido programado), sui-tab-chips o sui-select (períodos fijos: hoy, 7 días, 30 días)]
5
+ alternativas: [sui-input type="date" (una fecha suelta en un formulario: abre el selector del sistema), sui-tab-chips + sui-radio-label (día y franja de un pedido programado), sui-segmented-control (2 a 4 períodos fijos: hoy, 7 días, 30 días), sui-tab-chips (5 o más períodos fijos)]
6
6
  ---
7
7
 
8
8
  # sui-datepicker
@@ -23,8 +23,8 @@ un **calendario en línea** donde importa ver el mes entero (días con pedidos m
23
23
  - **El día y la hora de un pedido programado**: el checkout ya tiene su hoja (`sui-modal-sheet`
24
24
  con `sui-tab-chips` para el día y `sui-radio-label` con `flip` para la franja). Es la maqueta
25
25
  aprobada.
26
- - **Períodos fijos** («Hoy», «Últimos 7 días», «Este mes») sin rango libre: `sui-tab-chips`
27
- (super admin, ganancias del repartidor) o `sui-select` (resumen del local).
26
+ - **Períodos fijos** («Hoy», «Últimos 7 días», «Este mes») sin rango libre: `sui-segmented-control`
27
+ si son 2 a 4, `sui-tab-chips` si son 5 o más o se deslizan (canon, dueño 04-10-2026).
28
28
  - Una hora: `sui-time-picker`.
29
29
 
30
30
  Regla corta: **rango o calendario visible → datepicker · una fecha en un formulario → `sui-input
@@ -65,14 +65,14 @@ type="date"` · día + franja de entrega → la hoja del checkout.**
65
65
  | `min` / `max` | Siempre que haya un límite real: un cupón no vence en el pasado (`min` = hoy), un reporte no pasa de hoy (`max` = hoy). Los presets se recortan al límite. | propuesta |
66
66
  | `markedDates` | Días con algo: pedidos programados, gastos cargados. El punto es chico: dice «hay algo», no cuánto. | propuesta |
67
67
  | `presets` | Los 8 de fábrica están en español (Hoy, Últimos 7 días… Todo el tiempo). Recortarlos a los que la pantalla usa: un reporte del local no necesita «Últimos 12 meses» si no hay datos de hace un año. | propuesta |
68
- | `placeholder` | Lo que se elige, no «Seleccionar fecha»: «Elige el período», «Desde cuándo». | propuesta |
68
+ | `placeholder` | El default «Seleccionar fecha» ya está en español y se usa tal cual. Cambiarlo por lo que se elige («Elige el período», «Desde cuándo») es propuesta: hoy choca con esa regla. | default: canon (CANON-SUI §5.7) · cambiarlo: propuesta, falta aprobación |
69
69
  | `disabled` | Mientras carga lo que depende de la fecha. | propuesta |
70
70
 
71
71
  Usos de hoy que rompen la regla: **0** (no hay datepickers). Los 8 campos de fecha son fechas
72
- sueltas en formularios y ya usan `sui-input`: `pages/discounts/discounts.html:181` y `:285`
73
- («Válido hasta»), `pages/super-admin/super-admin.html:323`, `:329` y `:414`,
74
- `pages/super-admin/master-gastos/master-gastos.html:215`,
75
- `pages/central/central-gastos/central-gastos.html:115`, y `pages/promociones/promociones.html:336`
72
+ sueltas en formularios y ya usan `sui-input` (líneas del `type`, medidas el 04-10-2026):
73
+ `pages/discounts/discounts.html:189` y `:301` («Válido hasta»), `pages/super-admin/super-admin.html:324`,
74
+ `:330` y `:419`, `pages/super-admin/master-gastos/master-gastos.html:220`,
75
+ `pages/central/central-gastos/central-gastos.html:115`, y `pages/promociones/promociones.html:341`
76
76
  (`datetime-local`, «Programar»).
77
77
 
78
78
  **A decidir por el dueño** (la regla de arriba es la lectura plana; la contraria también se sostiene):
@@ -80,34 +80,41 @@ sueltas en formularios y ya usan `sui-input`: `pages/discounts/discounts.html:18
80
80
  | opción | a favor | en contra |
81
81
  |---|---|---|
82
82
  | fecha suelta → `sui-input type="date"` (la propuesta) | selector del sistema, 48 px, cero código nuevo, 0 cambios en la app | se ve distinto en iOS, Android y web; no marca días |
83
- | toda fecha → `sui-datepicker` | se ve igual en todos lados, con la marca | el popover de 368 px no es hoja en mobile, el trigger mide 40 px sin `size`, y los botones del footer están en inglés (ver Trampas) |
83
+ | toda fecha → `sui-datepicker` | se ve igual en todos lados, con la marca | el popover de 368 px no es hoja en mobile, el trigger mide 40 px si no se pasa `size="large"`, las celdas de día miden 40 y los presets 36 (ver «Tamaño») |
84
84
 
85
85
  ## Tamaño en mobile y en web
86
86
 
87
- En mobile se toca con el dedo: lo que se toca mide **44 px o más** (40 en los botones sueltos). En
88
- web, con mouse, puede ir más chico. En pantallas de los dos se elige con el servicio de breakpoints
87
+ En mobile se toca con el dedo: lo que se toca mide **44 px o más** (canon del dueño, 04-10-2026).
88
+ Para eso está **`xlarge`**: con los otros sizes las celdas de día (40) y los presets (36) no llegan.
89
+ En web, con mouse, puede ir más chico. En pantallas de los dos se elige con el servicio de breakpoints
89
90
  de la app (`bp`, en `services/breakpoints.service.ts`).
90
91
 
91
- Tiene `size` para el campo: `small` (36), `medium` (40, default, el de siempre) y **`large` (48)**,
92
- el mismo alto que `sui-input` y `sui-select` `large`. Con `large` **y siempre en mobile (≤ 767
93
- px)** el panel también crece: **flechas de mes de 40** y **Cancelar / Aplicar en `large` (48)**. En
94
- el teléfono el footer del rango pone el resumen «Rango: …» arriba y los dos botones abajo, 50/50.
95
-
96
- | pieza | web (`medium`) | `large` | mobile (cualquier size) | fuente |
97
- |---|---|---|---|---|
98
- | campo (trigger) | 40 | 48 | el del `size` | 40: medido · 36 y 48: canon (aprobado por el dueño, 03-10-2026), extensión SUI |
99
- | celda de día | 40 × 40, paso de 48 | igual | 40 × 40, paso de 44 | medido |
100
- | flechas de mes | 24 | 40 | 40 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
101
- | Cancelar / Aplicar | 36 | 48 | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
102
-
103
- En large y xlarge el texto sube a 16 px (regla del 03-10-2026): con `large`, la fecha del campo (y
104
- su placeholder) va en 16/24. El calendario no cambia: los días, el mes y el resumen del rango siguen
105
- en 14.
92
+ Tiene `size` para el campo: `small` (36), `medium` (40, default, el de siempre), **`large` (48)**,
93
+ el mismo alto que `sui-input` y `sui-select` `large`, y **`xlarge` (52)**, el de `sui-input` `xlarge`.
94
+ Con `large` **y siempre en mobile (≤ 767 px)** el panel también crece: **flechas de mes de 40** y
95
+ **Cancelar / Aplicar en `large` (48)**. Con **`xlarge`** todo lo que se toca llega a 44: **días de
96
+ 44 × 44** (`sui-day-cell` `large`, gap 4: 7 × 44 + 6 × 4 = 332, entra en 390), **flechas de mes de
97
+ 44** (`sui-date-selector` `large`, barra de 52) y **rangos predefinidos de 44** (`sui-period-range`
98
+ `large`). En el teléfono el footer del rango pone el resumen «Rango: …» arriba y los dos botones
99
+ abajo, 50/50.
100
+
101
+ | pieza | web (`medium`) | `large` | mobile (`small`–`large`) | **`xlarge`** | fuente |
102
+ |---|---|---|---|---|---|
103
+ | campo (trigger) | 40 | 48 | el del `size` | **52** | 40: medido · 36 y 48: canon (aprobado por el dueño, 03-10-2026), extensión SUI · 52: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
104
+ | celda de día | 40 × 40, paso de 48 | igual | 40 × 40, paso de 44 (**no llega a 44**) | **44 × 44**, paso de 48 | 40: medido · 44: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
105
+ | preset del rango (`sui-period-range`) | 168 × 36 | igual | 36 de alto, en fila que se desliza (**no llega a 44**) | **44** de alto | 36: medido · 44: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
106
+ | flechas de mes | 24 | 40 | 40 | **44** | 40: canon (aprobado por el dueño, 03-10-2026) · 44: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
107
+ | Cancelar / Aplicar | 36 | 48 | 48 | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
108
+
109
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): con `large` y `xlarge`, la fecha del
110
+ campo (y su placeholder) va en 16/24. Con `large` el calendario no cambia (días, mes y resumen en
111
+ 14); con `xlarge` los días, el mes y los rangos predefinidos también van en 16/24 (sus piezas son
112
+ `large`). El resumen del rango sigue en 14.
106
113
 
107
114
  ```html
108
115
  <!-- Web: popover. Mobile: en línea dentro de un sui-modal fullscreen. -->
109
116
  @if (bp.isMobile()) {
110
- <sui-datepicker mode="range" size="large" [inline]="true" [calendars]="1" [(value)]="rango" />
117
+ <sui-datepicker mode="range" size="xlarge" [inline]="true" [calendars]="1" [(value)]="rango" />
111
118
  } @else {
112
119
  <sui-datepicker mode="range" placeholder="Elige el período" [(value)]="rango" />
113
120
  }
@@ -115,8 +122,8 @@ en 14.
115
122
 
116
123
  | uso | mobile | web | fuente |
117
124
  |---|---|---|---|
118
- | fecha en un formulario | `large` | `medium` | propuesta, falta aprobación |
119
- | filtro de período de un reporte | `large`, en línea dentro de un modal | `medium`, popover | propuesta, falta aprobación |
125
+ | fecha en un formulario | `xlarge` (días de 44) | `medium` | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono (el «web medium» es propuesta) |
126
+ | filtro de período de un reporte | `xlarge`, en línea dentro de un modal | `medium`, popover | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono (el «web medium» es propuesta) |
120
127
 
121
128
  ## «No usar»: por qué no hoy y cuándo sí
122
129
 
@@ -129,7 +136,7 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
129
136
  | `mode="date"` en un formulario | `sui-input type="date"` hace lo mismo con el selector del sistema | un calendario que se ve siempre, con días marcados (pedidos programados de la semana para el local) |
130
137
  | `markedDates` | no hay calendarios a la vista | días con pedidos programados o con gastos cargados |
131
138
  | `calendars="2"` en mobile | se fuerza a 1 solo | — |
132
- | el popover (`inline=false`) en mobile | no es hoja: es un panel flotante de 368 px y el trigger mide 40 | ninguno en mobile; en web, cualquiera |
139
+ | el popover (`inline=false`) en mobile | no es hoja: es un panel flotante de 368 px (aunque el campo `large` mida 48) | ninguno en mobile; en web, cualquiera |
133
140
 
134
141
  ## API
135
142
 
@@ -141,7 +148,7 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
141
148
  | `mode` | `'date' \| 'range'` | `'date'` |
142
149
  | `calendars` | `1 \| 2` | `2` |
143
150
  | `inline` | `boolean` | `false` |
144
- | `size` | `'small' \| 'medium' \| 'large'` | `'medium'` |
151
+ | `size` | `'small' \| 'medium' \| 'large' \| 'xlarge'` | `'medium'` |
145
152
  | `placeholder` | `string` | `'Seleccionar fecha'` |
146
153
  | `showFooter` | `boolean` | `true` |
147
154
  | `disabled` | `boolean` | `false` |
@@ -179,7 +186,14 @@ interface DatepickerPreset { id: DatepickerPresetId; label: string; resolve: (ho
179
186
  - En mobile (hasta 767 px) **se fuerza un solo calendario** aunque `calendars` sea 2.
180
187
  - El campo muestra la fecha como `dd/MM/yyyy`; el rango, como «1 de oct 2026 – 7 de oct 2026».
181
188
  - «Todo el tiempo» devuelve `{ start: null, end: null }`: quien lo recibe tiene que tratarlo como
182
- «sin filtro», no como «vacío».
189
+ «sin filtro», no como «vacío». El campo muestra «Todo el tiempo» (antes caía al placeholder y
190
+ parecía vacío; fix 04-10-2026). Un `{ start: null, end: null }` que llega de afuera se sigue
191
+ mostrando como placeholder: el componente no sabe si es «todo» o «nada».
192
+ - **Accesibilidad (04-10-2026)**: el panel es un `dialog` modal con nombre («Elegir fecha» /
193
+ «Elegir período»; `group` en `inline`), la fila LU…DO está dentro de la grilla, cada día se
194
+ anuncia con la fecha completa («martes 7 de octubre de 2026»), hoy lleva `aria-current="date"`,
195
+ inicio y fin del rango salen seleccionados, y las flechas mueven el foco entre días (← → un
196
+ día, ↑ ↓ una semana, Inicio/Fin a la punta de la semana). Las flechas no cambian de mes.
183
197
  - Cierra con clic afuera y con Escape, y eso **descarta** la elección (como Cancelar).
184
198
  - Las piezas internas son `sui-date-selector`, `sui-day-label`, `sui-day-cell` y
185
199
  `sui-period-range`: no se arman a mano.
@@ -54,18 +54,23 @@ Usos de hoy que rompen la regla: **0**.
54
54
 
55
55
  ## Tamaño en mobile y en web
56
56
 
57
- **No tiene `size`.** Mide 40 × 40 fijo. En el `sui-datepicker` el paso entre celdas es de 44 px en
58
- mobile (gap 4) y 48 en web (gap 8): llega justo a los 44.
57
+ Tiene `size`: **`medium`** (default, 40 × 40, Figma) y **`large`** (44 × 44, número en 16/24). El
58
+ `sui-datepicker` `xlarge` pinta sus días en `large`. En el `sui-datepicker` el paso entre celdas es
59
+ de 44 px en mobile (gap 4) y 48 en web (gap 8) con `medium`, y 48 (gap 4) con `large`.
59
60
 
60
- | uso | mobile | web | fuente |
61
- |---|---|---|---|
62
- | celda de una grilla | 40 × 40 con gap 4 (paso 44) | 40 × 40 con gap 8 | medido |
61
+ | size | celda | texto | uso | fuente |
62
+ |---|---|---|---|---|
63
+ | `large` | **44 × 44** | 16/24 | mobile: lo que se toca llega a 44 (en 390 entran 7 × 44 con gap 4 = 332) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
64
+ | `medium` (default) | 40 × 40 | 14/20 | web | medido (Figma 437:174) |
65
+
66
+ Los puntos de hoy y de marcado no cambian con el size.
63
67
 
64
68
  ```html
65
- <!-- La grilla da el paso: gap 4 en mobile, 8 en web -->
66
- <div class="semana" [style.gap.px]="bp.isMobile() ? 4 : 8">
69
+ <!-- La grilla da el paso: gap 4 -->
70
+ <div class="semana" [style.gap.px]="4">
67
71
  @for (d of dias(); track d.fecha) {
68
- <sui-day-cell [day]="d.numero" [today]="d.esHoy" [marked]="d.conTurno" (clicked)="elegir(d)" />
72
+ <sui-day-cell [size]="bp.isMobile() ? 'large' : 'medium'" [day]="d.numero" [today]="d.esHoy"
73
+ [marked]="d.conTurno" (clicked)="elegir(d)" />
69
74
  }
70
75
  </div>
71
76
  ```
@@ -86,6 +91,7 @@ mobile (gap 4) y 48 en web (gap 8): llega justo a los 44.
86
91
  |---|---|---|
87
92
  | `day` | `number \| string` | — (requerido) |
88
93
  | `type` | `'basic' \| 'range'` | `'basic'` |
94
+ | `size` | `'medium' \| 'large'` | `'medium'` |
89
95
  | `rangePosition` | `'start' \| 'end' \| 'in' \| null` | `null` |
90
96
  | `selected` | `boolean` | `false` |
91
97
  | `marked` | `boolean` | `false` |
@@ -108,6 +114,9 @@ mobile (gap 4) y 48 en web (gap 8): llega justo a los 44.
108
114
  - `today` y `marked` juntos: se ve solo el punto de hoy.
109
115
  - `outOfMonth` no la bloquea: se puede tocar igual. Para bloquearla, `disabled`.
110
116
  - Ya trae el arreglo de iOS para el `:active` pegado.
117
+ - Sin `ariaLabel` se anuncia «Día N», sin mes: dentro de `sui-datepicker` ya recibe la fecha
118
+ completa. Hoy lleva `aria-current="date"` y, en `type="range"`, `start`/`end` salen
119
+ `aria-selected` (04-10-2026).
111
120
 
112
121
  ## Ejemplo
113
122
 
@@ -31,8 +31,8 @@ Story: [Molecules/Date & Time/Day Label](https://sui-design-system.web.app/?path
31
31
  | input | valor | cuándo | fuente |
32
32
  |---|---|---|---|
33
33
  | `label` | dos letras en mayúsculas | Lo normal, igual que el datepicker: `LU MA MI JU VI SÁ DO`. La semana arranca el lunes. | propuesta |
34
- | `label` | una letra | No usar: «M» es martes y miércoles a la vez. | no usar |
35
- | `label` | tres letras o más | No usar: «MIÉ» entra justo en 40 px, pero rompe el formato de dos letras del datepicker; «LUNES» ya no entra. | no usar |
34
+ | `label` | una letra | No usar: «M» es martes y miércoles a la vez. | propuesta |
35
+ | `label` | tres letras o más | No usar: «MIÉ» entra justo en 40 px, pero rompe el formato de dos letras del datepicker; «LUNES» ya no entra. | propuesta |
36
36
 
37
37
  Usos de hoy que rompen la regla: **0**.
38
38
 
@@ -15,7 +15,7 @@ Story: [Atoms/Divider/Divider](https://sui-design-system.web.app/?path=/docs/ato
15
15
 
16
16
  - **horizontal**: bloques dentro de una card, filas de una lista, secciones de un formulario, el
17
17
  subtotal del total.
18
- - **vertical**: datos en una misma fila («4,7 | 25–35 min | Envío S/ 3.00»).
18
+ - **vertical**: datos en una misma fila («4.7 | 25–35 min | Envío S/ 3.00»).
19
19
 
20
20
  **No lo uses** para:
21
21
 
@@ -35,14 +35,14 @@ Story: [Atoms/Divider/Divider](https://sui-design-system.web.app/?path=/docs/ato
35
35
  > dice cuándo separar con línea y cuándo con espacio. Lo marcado «según la guía del DS» sale de
36
36
  > ahí; el resto es **propuesta, falta aprobación**.
37
37
  >
38
- > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **13 dividers en 10 pantallas**, todos
39
- > horizontales, sin contar prototipos ni vitrinas (`master-preview`, `master-prototipos`,
38
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app`: **39 dividers en 14 archivos** (los 13 de
39
+ > antes + las 26 líneas a mano que se pasaron el 03-10-2026), todos horizontales, sin contar prototipos ni vitrinas (`master-preview`, `master-prototipos`,
40
40
  > `mockup-sheets-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`,
41
41
  > `dev-index`).
42
42
 
43
43
  | orientation | cuándo | ejemplo real | fuente |
44
44
  |---|---|---|---|
45
- | `horizontal` (default) | Separa bloques o filas. El espacio arriba y abajo lo pone el `gap` del padre, no el divider. | `pages/driver/driver-dashboard/driver-dashboard.html:1124` (entre filas, `@if (!last)`) | según la guía del DS («Line») |
45
+ | `horizontal` (default) | Separa bloques o filas. El espacio arriba y abajo lo pone el `gap` del padre, no el divider. | `pages/driver/driver-dashboard/driver-dashboard.html:1127` (entre filas, `@if (!last)`) | según la guía del DS («Line») |
46
46
  | `vertical` | Separa datos cortos en una sola fila. El padre necesita alto (si no, mide 16 px). | — (sin usos) | propuesta, falta aprobación |
47
47
 
48
48
  **Corregido el 03-10-2026:** las 26 líneas hechas a mano (mi-negocio, checkout, carrito, billetera y movimientos) ya son `sui-divider`. Seis conservan un `margin` propio porque sus vecinos se separan con margen y no con el `gap` del padre; pasarlo al `gap` es un cambio aparte.
@@ -97,6 +97,6 @@ Outputs: ninguno.
97
97
 
98
98
  <!-- Datos en una fila -->
99
99
  <div class="meta">
100
- <span>4,7</span><sui-divider orientation="vertical" /><span>25–35 min</span>
100
+ <span>4.7</span><sui-divider orientation="vertical" /><span>25–35 min</span>
101
101
  </div>
102
102
  ```
@@ -58,15 +58,23 @@ Usos de hoy que rompen las reglas: **0** (no se usa).
58
58
 
59
59
  ## Tamaño en mobile y en web
60
60
 
61
- **No tiene tamaño**: los botones miden **40 px**, sin input para cambiarlos. En mobile el canon de
62
- modales pide 48. El pie mide 80 px de alto.
61
+ El `size` cambia **los botones** (escala del `sui-button`):
62
+
63
+ | size | botones | texto del checkbox / switch | alto del pie | fuente |
64
+ |---|---|---|---|---|
65
+ | `medium` (default) | 40 | 14 | 80 | Figma |
66
+ | `large` | 48 | 16 (Paragraph/Medium) | 88 (el padding sigue en 20) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono. Size nuevo del 04-10-2026 |
67
+
68
+ `large` es el siguiente de la escala del `sui-button` (48), el mismo alto que el canon de modales.
63
69
 
64
70
  | uso | mobile | web | fuente |
65
71
  |---|---|---|---|
66
- | par de botones | `sui-modal-footer` (botones `large`, 48) | `sui-modal-footer` | canon (CLAUDE.md, botones: size `large` en todos los modales) |
72
+ | pie de un drawer | `large` (48) | `medium` (40) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono |
73
+ | par de botones de un modal | `sui-modal-footer` (botones `large`, 48) | `sui-modal-footer` | canon (CLAUDE.md, botones: size `large` en todos los modales) |
67
74
 
68
75
  ```html
69
- <sui-modal-footer secondaryButton="Cancelar" primaryButton="Guardar" [stretch]="bp.isMobile()" … />
76
+ <sui-drawer-footer type="stretch" [size]="bp.isMobile() ? 'large' : 'medium'"
77
+ (primaryClick)="guardar()" (secondaryClick)="cancelar()" />
70
78
  ```
71
79
 
72
80
  ## «No usar»: por qué no hoy y cuándo sí
@@ -83,6 +91,7 @@ modales pide 48. El pie mide 80 px de alto.
83
91
  | input | tipo | default |
84
92
  |---|---|---|
85
93
  | `type` | `'stretch' \| 'basic' \| 'checkbox' \| 'toggle' \| 'stepper' \| 'link-button'` | `'stretch'` |
94
+ | `size` | `'medium' \| 'large'` | `'medium'` |
86
95
  | `primaryButton` | `SuiFooterButtonConfig \| string` | `'Continuar'` |
87
96
  | `secondaryButton` | `SuiFooterButtonConfig \| string \| null` | `'Cancelar'` |
88
97
  | `checkboxLabel` | `string` | `''` |
@@ -110,9 +119,14 @@ interface SuiFooterButtonConfig { label: string; disabled?: boolean; color?: 'pr
110
119
  «Continuar» y sin `secondaryButton` dice «Cancelar». Para un solo botón pasa
111
120
  `[secondaryButton]="null"`.
112
121
  - **`color: 'error'` se ignora**: el primario está fijo en `primary`.
113
- - **Sin tamaño**: botones de 40 px.
122
+ - **`size` va de `medium` (40, default) a `large` (48)** desde el 04-10-2026; antes no tenía tamaño.
123
+ - **Los botones del pie no emitían nada antes del 04-10-2026**: el template escuchaba `(clicked)` en
124
+ `sui-button`, que no tiene ese output (su evento es el `click` nativo), así que `primaryClick` y
125
+ `secondaryClick` nunca salían con un toque real. Arreglado (`(click)`), con test.
114
126
  - `stepper` usa `{ current, total }` con `current` desde 0, y dibuja sus propios puntos (no es
115
127
  `sui-stepper`).
128
+ Para el lector es un `progressbar` «Progreso» que dice «Paso 2 de 4» (`aria-valuetext`, desde
129
+ el 04-10-2026).
116
130
  - `checkboxActive` y `toggleActive` son `model`: `[(checkboxActive)]`.
117
131
  - El borde de arriba ya viene puesto: no le sumes otro.
118
132
 
@@ -47,7 +47,7 @@ para limpiar.
47
47
 
48
48
  | prop | regla | fuente |
49
49
  |---|---|---|
50
- | `placeholder` | **Siempre**, en español y con elipsis: «Buscar repartidor…». El default es `'Search...'`. | canon (CANON-SUI §5: copy en español, elipsis `…`) |
50
+ | `placeholder` | **Siempre**, en español y con elipsis: «Buscar repartidor…». El default genérico es `'Buscar…'`. | canon (CANON-SUI §5: copy en español, elipsis `…`) |
51
51
  | `[(value)]` | El texto; con él se filtra la lista. | API |
52
52
  | `disabled` | Extensión SUI, no está en el Figma. Sin caso hoy. | — |
53
53
 
@@ -71,7 +71,7 @@ mobile, mejor un `sui-modal-sheet` con `sui-input type="search"` arriba. Propues
71
71
  | input | tipo | default |
72
72
  |---|---|---|
73
73
  | `value` · model, `[(value)]` | `string` | `''` |
74
- | `placeholder` | `string` | `'Search...'` |
74
+ | `placeholder` | `string` | `'Buscar…'` |
75
75
  | `disabled` | `boolean` | `false` |
76
76
 
77
77
  | output | payload |
@@ -86,7 +86,7 @@ que además deja `value` en `''`.
86
86
  ## Trampas
87
87
 
88
88
  - **No filtra.** Hay que filtrar la lista con el `value` (un `computed` sobre las opciones).
89
- - **El default del placeholder es `'Search...'`**, en inglés y con tres puntos. Pásalo siempre.
89
+ - **El default del placeholder es genérico** (`'Buscar…'`, en español desde el 04-10-2026): pásalo siempre diciendo qué se busca.
90
90
  - **iOS hace zoom al enfocarlo**: el campo está en 14 px y la regla de la app pide 16 px en los
91
91
  inputs de mobile (CLAUDE.md, «Responsive mobile»). Hoy no hay forma de cambiarlo desde afuera.
92
92
  - **El teclado no trae la lupa**: el `<input>` es `type="text"` sin `enterkeyhint="search"` (la regla
@@ -11,8 +11,8 @@ Story: [Atoms/Emoji](https://sui-design-system.web.app/?path=/docs/atoms-emoji--
11
11
 
12
12
  ## Cuándo usarlo / cuándo no
13
13
 
14
- **Úsalo** donde la pantalla tiene que **sentirse**, no solo funcionar: un estado vacío, «¡Pedido
15
- confirmado!», los pasos de una landing, la barra de calificación.
14
+ **Úsalo** donde la pantalla tiene que **sentirse**, no solo funcionar: un estado vacío, «Pedido
15
+ confirmado», los pasos de una landing, la barra de calificación.
16
16
 
17
17
  **No lo uses** para:
18
18
 
@@ -32,10 +32,10 @@ confirmado!», los pasos de una landing, la barra de calificación.
32
32
 
33
33
  | caso | cómo | fuente |
34
34
  |---|---|---|
35
- | Estados vacíos y celebraciones | Emoji animado, uno solo, en `xl`. Nada de íconos genéricos en un estado vacío. | canon (preferencia del dueño: emojis animados en los estados vacíos) |
35
+ | Estados vacíos y celebraciones | Emoji animado, uno solo, en `xl`. Nada de íconos genéricos en un estado vacío. | canon (CANON-SUI §5.6) para los estados vacíos · propuesta, falta aprobación para celebraciones y el `xl` |
36
36
  | Pasos de una landing | `lg`, uno por paso. | propuesta |
37
37
  | Junto a un título o dentro de un texto | `md` o `sm`, como acento. | propuesta |
38
- | Como ícono de un botón | No: el botón lleva `leftIcon`. | propuesta |
38
+ | Como ícono de un botón | No: el botón lleva `leftIcon`. | derivado de CANON-SUI §5.7 (emojis solo en contenido escrito por un usuario; botones con `leftIcon`), falta confirmación |
39
39
 
40
40
  ### `size`
41
41
 
@@ -59,12 +59,12 @@ confirmado!», los pasos de una landing, la barra de calificación.
59
59
 
60
60
  **Usos de hoy que romperían la propuesta:**
61
61
 
62
- - **2 emojis como ícono de botón**: «Encargarme yo» en `pages/orders/orders.html:322` y `:353` → `leftIcon`.
62
+ - **2 emojis como ícono de botón**: «Encargarme yo» en `pages/orders/orders.html:323` y `:354` → `leftIcon`.
63
63
  - **5 animados a la vez** en `pages/public/landing-customers/landing-customers.html:160`–`:184`
64
64
  (más otro en `:56`). No tienen copia estática: o se acepta el peso en la landing o se generan
65
65
  las copias.
66
66
  - **Un catálogo paralelo**: `core/fluent-emoji.ts` arma sus propias URLs (otro CDN incluido) y lo
67
- importan 8 archivos (`components/permission-prime-modal/permission-prime-modal.ts`,
67
+ importan 11 archivos (medido el 04-10-2026) (`components/permission-prime-modal/permission-prime-modal.ts`,
68
68
  `pages/role-selector/role-selector.ts`, `pages/customer/order-tracking/order-tracking.ts`…).
69
69
  - **10 `<img>` con un emoji**, fuera del componente: `pages/products/add-product/add-product.html:122`
70
70
  (la URL del paquete escrita a mano, y 3 más en el mismo archivo),
@@ -28,40 +28,30 @@ algo que avisar → alert.**
28
28
  ## Qué variante usar
29
29
 
30
30
  > **La guía del DS no tiene página del empty state.** El componente de SUI se construyó a
31
- > propósito con Fluent Emoji animados en vez de ilustraciones: es una decisión del proyecto
32
- > (memoria «emojis animados en empty states», 17-04-2026).
31
+ > propósito con Fluent Emoji animados en vez de ilustraciones: es una decisión del proyecto, escrita
32
+ > en CANON-SUI §5.6 (ilustración = Fluent Emoji animado, default el zorro).
33
33
  >
34
- > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **66
35
- > empty-states en 40 archivos**. 25 con `action` (10 con `route`). 4 con `emoji` propio, 22 con la
36
- > URL del zorro pegada a mano (que ya es el default) y 40 sin `emoji`. 29 con un atributo `icon`
37
- > que el componente no tiene.
34
+ > Uso medido el 04-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-card`): **66
35
+ > empty-states en 40 archivos**. 29 con `action` (10 con `route`). 8 con `emoji` propio y 58 sin
36
+ > `emoji` (sale el zorro). 0 con `icon`, 0 con la URL del zorro pegada, 0 con `size`.
38
37
 
39
38
  ### Las piezas
40
39
 
41
40
  | prop | cuándo | fuente |
42
41
  |---|---|---|
43
- | `emoji` vacío (default: el zorro) | Lo normal. El zorro es la mascota de los empty states y sale solo: **no pegues su URL**. | canon (memoria del proyecto) |
44
- | `emoji` propio | Cuando el emoji dice algo del caso: el reloj de arena en «Aún no tienes facturas» (se está esperando algo), el chef en los avisos del local. Siempre de `FLUENT_EMOJI_ANIM` (`core/fluent-emoji.ts`) o de `assets/emoji-anim/`. | canon (memoria del proyecto) |
45
- | `title` (obligatorio) | Qué pasa, en corto y sin punto: «Tu carrito está vacío», «Sin pedidos aún». En una búsqueda, repite lo buscado: «Nada con “pollo broaster”». | propuesta (práctica de la app) |
46
- | `subtitle` | Qué va a pasar o qué puede hacer la persona: «Cuando hagas tu primer pedido, aparecerá aquí.» | propuesta |
42
+ | `emoji` vacío (default: el zorro) | Lo normal. El zorro es la mascota de los empty states y sale solo: **no pegues su URL**. | canon (CANON-SUI §5.6) |
43
+ | `emoji` propio | Cuando el emoji dice algo del caso: el reloj de arena en «Aún no tienes facturas» (se está esperando algo), el chef en los avisos del local. Siempre de `FLUENT_EMOJI_ANIM` (`core/fluent-emoji.ts`) o de `assets/emoji-anim/`. | canon (CANON-SUI §5.6: Fluent Emoji animado) |
44
+ | `title` (obligatorio) | Qué pasa, sin punto y en 2 a 4 palabras, con uno de tres patrones: «Todavía no hay <cosa>», «Sin <cosa>», «Tu <cosa> está vacío» («Tu carrito está vacío», «Sin pedidos aún»). En una búsqueda, repetir lo buscado («Nada con “pollo broaster”») queda fuera de esos patrones. | canon (CANON-SUI §5.6) · lo de la búsqueda: propuesta, falta aprobación |
45
+ | `subtitle` | Una oración con punto, en futuro tranquilizador: «Cuando hagas tu primer pedido, aparecerá aquí.» | canon (CANON-SUI §5.6) |
47
46
  | `action` como string + `(actionClicked)` | La salida es algo de esta misma pantalla: «Reintentar», «Ver todo el catálogo», «Activar captura». | propuesta |
48
47
  | `action` como `{ label, route }` | La salida es otra pantalla: «Ver negocios» → `/cliente/inicio`. | propuesta |
49
48
  | sin `action` | No hay un paso obvio, o la pantalla ya tiene el botón para llenarla (el «Nuevo local» de arriba). | propuesta |
50
49
  | error de carga | Siempre con `action="Reintentar"`. Excepción: la pantalla reintenta sola y lo dice («Seguimos intentando»). | propuesta |
51
50
 
52
- **Usos de hoy que rompen las reglas:**
53
-
54
- - **29 con `icon="…"`**: `icon` no es un input, el atributo no hace nada. Ejemplos:
55
- `pages/customer/cart/cart.html:18`, `pages/drivers/drivers.html:87`,
56
- `pages/customer/order-history/order-history.html:20`. Se borra.
57
- - **22 con la URL del zorro pegada** (`emoji="…/Animals/Fox.png"`), que ya es el default:
58
- `pages/customers/customers.html:65`, `pages/products/products.html:113`,
59
- `pages/locations/locations.html:16`. Se borra.
60
- - **4 errores de carga sin «Reintentar»**:
61
- `pages/driver/driver-dashboard/driver-dashboard.html:1071`,
62
- `pages/customer/order-history/order-history.html:20`,
63
- `pages/super-admin/master-drivers/master-drivers.html:524` y `:754`.
64
- (`pages/public/pedido-en-vivo/pedido-en-vivo.html:50` no cuenta: reintenta solo.)
51
+ **Usos de hoy que rompen las reglas:** 0. Los 29 `icon="…"` (que no es un input), las 22 URL del
52
+ zorro pegadas a mano y los 4 errores de carga sin «Reintentar» se corrigieron el 03-10-2026 (commit
53
+ `461efbec` de la app). `pages/public/pedido-en-vivo/pedido-en-vivo.html:50` sigue sin «Reintentar»
54
+ a propósito: reintenta solo y lo dice.
65
55
 
66
56
  ## Tamaño en mobile y en web
67
57
 
@@ -38,7 +38,7 @@ marketing: brillo arriba, borde interior claro y un anillo del color del botón.
38
38
 
39
39
  - **Para qué es**: un botón normal con un acabado más vistoso.
40
40
  - **Default**: `neutral` (negro) en la guía; **`primary` en SUI**.
41
- - **Tamaños**: `medium` (40), `small` (36) y `xsmall` (32). No hay más grandes.
41
+ - **Tamaños**: `medium` (40), `small` (36) y `xsmall` (32). SUI agrega `large` (48) para el teléfono (04-10-2026).
42
42
  - **Hover**: el brillo se aclara, no se oscurece. `basic` pasa a fondo gris plano.
43
43
  - **Deshabilitado**: fondo gris plano, sin brillo, sin anillo ni sombra, igual en los cuatro tipos.
44
44
 
@@ -55,6 +55,7 @@ marketing: brillo arriba, borde interior claro y un anillo del color del botón.
55
55
 
56
56
  | size | cuándo | fuente |
57
57
  |---|---|---|
58
+ | `large` (48) | El CTA en el teléfono. Texto 16. | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono; extensión de SUI, la guía no lo tiene |
58
59
  | `medium` (40, default) | El CTA de la landing en desktop. | escala y default según la guía del DS · cuándo: propuesta |
59
60
  | `small` (36) | Un CTA dentro de una card de la landing (la card de un plan). | escala según la guía del DS · cuándo: propuesta |
60
61
  | `xsmall` (32) | Sin caso: en una landing el CTA nunca es tan chico. | escala según la guía del DS · cuándo: propuesta |
@@ -70,27 +71,32 @@ marketing: brillo arriba, borde interior claro y un anillo del color del botón.
70
71
 
71
72
  ## Tamaño en mobile y en web
72
73
 
73
- En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
74
- va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
75
- (`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px):
76
- `[size]="bp.isMobile() ? 'large' : 'small'"`, 27 usos hoy en `master-pedidos` (16 `large`/`small`,
77
- 9 `large`/`medium`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
74
+ En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más** (canon (dueño, 04-10-2026): piso táctil 44 en el teléfono). En web,
75
+ con mouse, va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
76
+ (`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px).
77
+
78
+ | size | alto | texto | cuándo | fuente |
79
+ |---|---|---|---|---|
80
+ | `large` | 48 | 16 (Label/Medium) | CTA en el teléfono | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono. Size nuevo del 04-10-2026 |
81
+ | `medium` (default) | 40 | 14 | CTA en web | Figma |
82
+ | `small` | 36 | 14 | CTA dentro de una card en web | Figma |
83
+ | `xsmall` | 32 | 14 | — | Figma |
84
+
85
+ **Por qué `large` = 48 y no 44**: el fancy es «el mismo botón con otro acabado» que `sui-button` y su
86
+ escala lo espeja tal cual (medium 40 / small 36 / xsmall 32). El siguiente es `large`, y el
87
+ `large` de sui-button mide 48: el fancy en el teléfono queda del mismo alto que el botón normal
88
+ que va al lado. El texto sube a 16 (regla de tamaños del 03-10-2026); los íconos siguen en 20.
78
89
 
79
90
  | uso | mobile | web | fuente |
80
91
  |---|---|---|---|
81
- | CTA principal de una landing | no usar fancy: `sui-button` `large` (48) | `medium` (40) | propuesta |
82
- | CTA dentro de la card de un plan | no usar fancy: `sui-button` `large` | `small` (36) | propuesta |
92
+ | CTA principal de una landing | `large` (48) | `medium` (40) | propuesta |
93
+ | CTA dentro de la card de un plan | `large` (48) | `small` (36) | propuesta |
83
94
 
84
95
  ```html
85
- @if (bp.isMobile()) {
86
- <sui-button size="large">Empieza gratis</sui-button>
87
- } @else {
88
- <sui-fancy-button type="primary" size="medium">Empieza gratis</sui-fancy-button>
89
- }
96
+ <sui-fancy-button type="primary" [size]="bp.isMobile() ? 'large' : 'medium'">Empieza gratis</sui-fancy-button>
90
97
  ```
91
98
 
92
- **El fancy no tiene un tamaño táctil**: el más grande mide 40, por debajo de 44. En mobile el CTA
93
- va con `sui-button` `large`. Hoy no hay usos (todo el componente está en «no usar»).
99
+ Hoy no hay usos (todo el componente está en «no usar»).
94
100
 
95
101
  ## «No usar»: por qué no hoy y cuándo sí
96
102
 
@@ -110,7 +116,7 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
110
116
  | input | tipo | default |
111
117
  |---|---|---|
112
118
  | `type` | `'primary' \| 'neutral' \| 'basic' \| 'destructive'` | `'primary'` |
113
- | `size` | `'medium' \| 'small' \| 'xsmall'` | `'medium'` |
119
+ | `size` | `'large' \| 'medium' \| 'small' \| 'xsmall'` | `'medium'` |
114
120
  | `leftIcon` | `string \| null` | `null` |
115
121
  | `rightIcon` | `string \| null` | `null` |
116
122
  | `disabled` | `boolean` | `false` |
@@ -132,8 +138,8 @@ El clic se escucha con `(clicked)`. Slots: `<ng-content>` (el texto).
132
138
  - **`type` es el relleno**, no el `type` HTML: ese se llama **`htmlType`**. `type="submit"` no
133
139
  compila (no es un tipo válido) y no hace un submit.
134
140
  - **El radio es 10 px, no pill.** Al lado de un `sui-button` (pill en SUI) se ven de dos familias.
135
- - **No hay `large` ni `xlarge`**: el más grande mide 40. En mobile, donde el CTA de la app es de
136
- 48, un fancy queda más bajo.
141
+ - **`large` (48) es de SUI** (04-10-2026), no de la guía: en el teléfono va ese, del mismo alto que
142
+ el `large` de `sui-button`. No hay `xlarge`.
137
143
  - **El default es `primary`**; en la guía es `neutral`.
138
144
  - El anillo del `neutral` es un hex crudo (`#242628`): no hay token para ese gris.
139
145
  - Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
@@ -92,7 +92,7 @@ Outputs: ninguno.
92
92
 
93
93
  - **La extensión se corta a 4 letras** y va en mayúsculas: `.jpeg` → `JPEG`, `.numbers` → `NUMB`.
94
94
  - **`extension` gana sobre `filename`.**
95
- - **El nombre para el lector de pantalla está en inglés** («File: PDF») y no se puede cambiar.
95
+ - El nombre para el lector de pantalla es «Archivo PDF» (en español desde el 04-10-2026) y no se puede cambiar.
96
96
  - `size` es `xsmall` o `medium`: no hay `small` ni `large`.
97
97
 
98
98
  ## Ejemplo
@@ -132,6 +132,9 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
132
132
  ## Trampas
133
133
 
134
134
  - `browseLabel` dice «Buscar archivo» por defecto (antes «Browse File»).
135
+ - **Con teclado el control es «Buscar archivo»**, no el área. Desde el 04-10-2026 el host ya no
136
+ es `role="button"` ni entra en el Tab (era un control con otro adentro y Enter pedía el selector
137
+ dos veces). Con el mouse o el dedo, tocar cualquier parte del área sigue abriendo el selector.
135
138
  - **Llena el ancho del contenedor** desde el 03-10-2026 (antes medía 400 fijo y había que forzar
136
139
  `style="width: 100%"`). Las pantallas que lo dejaban en 400 en un contenedor ancho ahora se
137
140
  estiran; para un ancho fijo, se lo pone el consumer al host.
@@ -41,7 +41,7 @@ subiendo con su barra, listo, o falló con «Reintentar».
41
41
  | input | cuándo | fuente |
42
42
  |---|---|---|
43
43
  | `file` | El nombre real del archivo (`'carta-octubre.pdf'`). La extensión da el ícono y el color. | propuesta |
44
- | `description` | **Siempre** se pasa: el default es un texto de ejemplo («0 KB de 120 KB»). Subiendo: «1,2 MB de 3,4 MB»; listo: «3,4 MB». | propuesta |
44
+ | `description` | **Siempre** se pasa: el default es un texto de ejemplo («0 KB de 120 KB»). Subiendo: «1.2 MB de 3.4 MB»; listo: «3.4 MB» (punto decimal, como el «10.0 MB» que arma `sui-file-upload`). | propuesta |
45
45
  | `progress` | 0–100, solo en `in-progress`. | propuesta |
46
46
  | `statusText` | Los defaults ya están en español («Subiendo…», «Completado», «Falló»); en error, mejor el motivo: «Se cortó la conexión». | propuesta |
47
47
  | `showStatus=false` | Solo en `success`, cuando el check sobra porque la lista ya dice «Archivos subidos». | propuesta |
@@ -52,14 +52,15 @@ Usos de hoy que rompen la regla: **0**.
52
52
  ## Tamaño en mobile y en web
53
53
 
54
54
  **No tiene `size`.** Llena el ancho del contenedor (antes 400 fijo) y la X o el tacho de la derecha
55
- es un `sui-compact-button` `2xlarge` de **32 px** (Figma: 24), que con el aire de la tarjeta (16 de
56
- padding, 72 de alto mínimo) se toca bien con el dedo. «Reintentar» sigue siendo un link de 20 px de
57
- alto: en mobile conviene que la fila entera también reintente.
55
+ es un `sui-compact-button` `2xlarge` de **32 px** (Figma: 24): queda debajo de los 44 del dedo. La
56
+ fila mide 74 sin barra (ícono de 40 + padding 16 × 2 + borde 1 × 2; no hay `min-height`).
57
+ «Reintentar» sigue siendo un link de 20 px de alto: en mobile conviene que la fila entera también
58
+ reintente.
58
59
 
59
60
  | pieza | mobile | web | fuente |
60
61
  |---|---|---|---|
61
62
  | ancho | el del contenedor | el del contenedor | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
62
- | X / tacho | 32 px | 32 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
63
+ | X / tacho | 32 px — **no llega** a 44 | 32 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
63
64
  | «Reintentar» | link de 20 px — **no llega** | link | medido |
64
65
 
65
66
  ```html
@@ -122,8 +123,8 @@ interface SuiFileUploadCardFile { filename: string; extension?: string; }
122
123
 
123
124
  ```html
124
125
  <sui-file-upload-card file="carta-octubre.pdf" state="in-progress" [progress]="45"
125
- description="1,2 MB de 2,6 MB" statusText="Subiendo…" />
126
- <sui-file-upload-card file="carta-octubre.pdf" state="error" description="2,6 MB"
126
+ description="1.2 MB de 2.6 MB" statusText="Subiendo…" />
127
+ <sui-file-upload-card file="carta-octubre.pdf" state="error" description="2.6 MB"
127
128
  statusText="Se cortó la conexión" retryLabel="Reintentar"
128
129
  (retryClicked)="reintentar()" (actionClicked)="quitar()" />
129
130
  ```
@@ -61,7 +61,7 @@ los controles que se proyectan.
61
61
  |---|---|---|
62
62
  | `sui-filter-item` `active` | La categoría abierta (la que muestra sus opciones al lado): fondo gris, texto negro, flecha a la derecha. | propuesta (estados del Figma) |
63
63
  | `sui-filter-item` `leftIcon` | Un ícono por categoría si ayuda a ubicarla («Estado», «Local», «Repartidor»). | propuesta |
64
- | `sui-filter-panel-header` `clear` | Pásale texto (`clear="Limpiar"`), no `true`: con `true` dice «Clear». | canon (CANON-SUI §5: copy en español) |
64
+ | `sui-filter-panel-header` `clear` | `clear=true` dice «Limpiar» (en español desde el 04-10-2026); un string lo cambia. | canon (CANON-SUI §5: copy en español) |
65
65
  | `sui-filter-panel-footer` | «Limpiar» a la izquierda (`stroke neutral`), «Aplicar» a la derecha (`filled primary`), mitad y mitad. | canon (orden de `sui-modal-footer`, CLAUDE.md «Botones») |
66
66
  | «Limpiar» en header **y** footer | Elegir uno. Con el footer, el header va sin link. | propuesta |
67
67
  | `applyButton` deshabilitado | `{ label: 'Aplicar', disabled: !cambio() }` mientras no se toca nada. | propuesta |
@@ -116,8 +116,8 @@ Outputs: ninguno.
116
116
 
117
117
  | input | tipo | default |
118
118
  |---|---|---|
119
- | `clearButton` | `SuiFooterButtonConfig \| string` | `'Clear'` |
120
- | `applyButton` | `SuiFooterButtonConfig \| string` | `'Apply'` |
119
+ | `clearButton` | `SuiFooterButtonConfig \| string` | `'Limpiar'` |
120
+ | `applyButton` | `SuiFooterButtonConfig \| string` | `'Aplicar'` |
121
121
  | `size` | `'small' \| 'medium'` | `'small'` |
122
122
 
123
123
  | output | payload |
@@ -145,8 +145,8 @@ de `sui-drawer-footer`).
145
145
 
146
146
  ## Trampas
147
147
 
148
- - **Los textos por defecto están en inglés**: «Clear» y «Apply» en el footer, «Clear» en el header con
149
- `clear=true`. Pásalos siempre.
148
+ - Los textos por defecto son «Limpiar» y «Aplicar» en el footer y «Limpiar» en el header con
149
+ `clear=true` (en español desde el 04-10-2026).
150
150
  - **La barra apila a 640 px; la app cambia a mobile a 767.** Entre 641 y 767 px la app ya está en
151
151
  mobile y la barra sigue en una fila.
152
152
  - **Varios controles en un lado van en un contenedor.** Cada slot es una fila con 12 px de separación,