@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.
- package/docs/INDEX.md +8 -8
- package/docs/sui-accordion/README.md +2 -2
- package/docs/sui-activity-feed/README.md +1 -2
- package/docs/sui-alert/README.md +28 -19
- package/docs/sui-app-store-badge/README.md +5 -4
- package/docs/sui-avatar/README.md +16 -16
- package/docs/sui-avatar-group/README.md +4 -4
- package/docs/sui-badge/README.md +27 -9
- package/docs/sui-banner/README.md +10 -9
- package/docs/sui-brand-logo/README.md +3 -3
- package/docs/sui-breadcrumbs/README.md +1 -1
- package/docs/sui-button/README.md +48 -24
- package/docs/sui-button-group/README.md +6 -4
- package/docs/sui-button-group-item/README.md +3 -3
- package/docs/sui-card/README.md +17 -19
- package/docs/sui-chart-legend/README.md +8 -7
- package/docs/sui-checkbox/README.md +11 -6
- package/docs/sui-checkbox-card/README.md +24 -19
- package/docs/sui-checkbox-label/README.md +32 -10
- package/docs/sui-circular-progress-bar/README.md +2 -0
- package/docs/sui-color-dot/README.md +1 -1
- package/docs/sui-color-picker/README.md +22 -7
- package/docs/sui-command-menu-footer/README.md +8 -8
- package/docs/sui-command-menu-search/README.md +2 -2
- package/docs/sui-compact-avatar-group/README.md +4 -3
- package/docs/sui-compact-button/README.md +41 -44
- package/docs/sui-compact-select/README.md +9 -5
- package/docs/sui-compact-select-for-input/README.md +2 -2
- package/docs/sui-content-card/README.md +6 -5
- package/docs/sui-content-divider/README.md +4 -4
- package/docs/sui-content-label/README.md +11 -6
- package/docs/sui-counter-input/README.md +19 -18
- package/docs/sui-date-selector/README.md +16 -12
- package/docs/sui-datepicker/README.md +46 -32
- package/docs/sui-day-cell/README.md +17 -8
- package/docs/sui-day-label/README.md +2 -2
- package/docs/sui-divider/README.md +5 -5
- package/docs/sui-drawer-footer/README.md +19 -5
- package/docs/sui-dropdown-search/README.md +3 -3
- package/docs/sui-emoji/README.md +6 -6
- package/docs/sui-empty-state/README.md +13 -23
- package/docs/sui-fancy-button/README.md +24 -18
- package/docs/sui-file-icon/README.md +1 -1
- package/docs/sui-file-upload/README.md +3 -0
- package/docs/sui-file-upload-card/README.md +8 -7
- package/docs/sui-filter/README.md +5 -5
- package/docs/sui-flag/README.md +3 -2
- package/docs/sui-form-hint/README.md +12 -8
- package/docs/sui-form-label/README.md +11 -16
- package/docs/sui-icon/README.md +4 -3
- package/docs/sui-image-upload/README.md +28 -16
- package/docs/sui-inline-input/README.md +7 -6
- package/docs/sui-inline-select/README.md +8 -5
- package/docs/sui-input/README.md +26 -35
- package/docs/sui-integration-switch/README.md +14 -7
- package/docs/sui-kbd/README.md +4 -4
- package/docs/sui-key-icon/README.md +6 -2
- package/docs/sui-link-button/README.md +21 -17
- package/docs/sui-modal-footer/README.md +1 -1
- package/docs/sui-notification/README.md +8 -6
- package/docs/sui-notification-footer/README.md +2 -2
- package/docs/sui-notification-tab-menu/README.md +5 -3
- package/docs/sui-pagination/README.md +8 -5
- package/docs/sui-password-strength/README.md +1 -1
- package/docs/sui-period-range/README.md +18 -14
- package/docs/sui-popover/README.md +13 -7
- package/docs/sui-product-card/README.md +14 -10
- package/docs/sui-progress-bar/README.md +4 -2
- package/docs/sui-progress-bar-label/README.md +2 -0
- package/docs/sui-radio/README.md +14 -7
- package/docs/sui-radio-card/README.md +12 -12
- package/docs/sui-radio-label/README.md +36 -11
- package/docs/sui-rating/README.md +28 -9
- package/docs/sui-rich-editor/README.md +3 -3
- package/docs/sui-segmented-control/README.md +32 -21
- package/docs/sui-select/README.md +35 -31
- package/docs/sui-sidebar/README.md +1 -2
- package/docs/sui-slider/README.md +7 -0
- package/docs/sui-social-button/README.md +24 -11
- package/docs/sui-status-badge/README.md +7 -3
- package/docs/sui-stepper/README.md +30 -17
- package/docs/sui-store-card/README.md +9 -4
- package/docs/sui-switch/README.md +16 -11
- package/docs/sui-switch-card/README.md +18 -16
- package/docs/sui-switch-label/README.md +22 -11
- package/docs/sui-tab-chips/README.md +55 -41
- package/docs/sui-tab-menu-horizontal/README.md +19 -11
- package/docs/sui-tab-menu-vertical/README.md +10 -5
- package/docs/sui-tag/README.md +25 -11
- package/docs/sui-tag-input/README.md +24 -14
- package/docs/sui-textarea/README.md +21 -21
- package/docs/sui-time-picker/README.md +38 -32
- package/docs/sui-toast/README.md +27 -22
- package/docs/sui-tooltip/README.md +14 -17
- package/docs/sui-topbar-button/README.md +2 -2
- package/fesm2022/ajuarezso-sui-design-system.mjs +1071 -240
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- 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-
|
|
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-
|
|
27
|
-
|
|
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` |
|
|
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
|
|
73
|
-
(«Válido hasta»), `pages/super-admin/super-admin.html:
|
|
74
|
-
`pages/super-admin/master-gastos/master-gastos.html:
|
|
75
|
-
`pages/central/central-gastos/central-gastos.html:115`, y `pages/promociones/promociones.html:
|
|
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
|
|
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** (
|
|
88
|
-
|
|
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)
|
|
92
|
-
el mismo alto que `sui-input` y `sui-select` `large
|
|
93
|
-
px)** el panel también crece: **flechas de mes de 40** y
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
en
|
|
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="
|
|
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 | `
|
|
119
|
-
| filtro de período de un reporte | `
|
|
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
|
|
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
|
-
|
|
58
|
-
|
|
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
|
-
|
|
|
61
|
-
|
|
62
|
-
|
|
|
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
|
|
66
|
-
<div class="semana" [style.gap.px]="
|
|
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 [
|
|
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. |
|
|
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. |
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
-
|
|
62
|
-
|
|
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
|
-
|
|
|
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-
|
|
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
|
-
-
|
|
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 `'
|
|
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` | `'
|
|
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 `'
|
|
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
|
package/docs/sui-emoji/README.md
CHANGED
|
@@ -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,
|
|
15
|
-
confirmado
|
|
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 (
|
|
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`. |
|
|
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:
|
|
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
|
|
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
|
-
> (
|
|
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
|
|
35
|
-
> empty-states en 40 archivos**.
|
|
36
|
-
>
|
|
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 (
|
|
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 (
|
|
45
|
-
| `title` (obligatorio) | Qué pasa,
|
|
46
|
-
| `subtitle` |
|
|
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
|
-
|
|
55
|
-
|
|
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).
|
|
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
|
|
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
|
-
|
|
77
|
-
|
|
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 |
|
|
82
|
-
| CTA dentro de la card de un plan |
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
136
|
-
|
|
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
|
-
-
|
|
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
|
|
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)
|
|
56
|
-
|
|
57
|
-
alto: en mobile conviene que la fila entera también
|
|
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
|
|
126
|
-
<sui-file-upload-card file="carta-octubre.pdf" state="error" description="2
|
|
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` |
|
|
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` | `'
|
|
120
|
-
| `applyButton` | `SuiFooterButtonConfig \| string` | `'
|
|
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
|
-
-
|
|
149
|
-
`clear=true
|
|
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,
|