@ajuarezso/sui-design-system 0.25.0 → 0.25.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/sui-accordion/README.md +83 -9
- package/docs/sui-activity-feed/README.md +55 -1
- package/docs/sui-activity-filter/README.md +50 -1
- package/docs/sui-alert/README.md +54 -0
- package/docs/sui-app-store-badge/README.md +57 -3
- package/docs/sui-avatar/README.md +66 -6
- package/docs/sui-avatar-group/README.md +64 -2
- package/docs/sui-badge/README.md +79 -11
- package/docs/sui-banner/README.md +70 -5
- package/docs/sui-brand-logo/README.md +77 -14
- package/docs/sui-breadcrumb-item/README.md +51 -0
- package/docs/sui-breadcrumbs/README.md +48 -0
- package/docs/sui-button/README.md +68 -6
- package/docs/sui-button-group/README.md +70 -5
- package/docs/sui-button-group-item/README.md +68 -4
- package/docs/sui-card/README.md +97 -10
- package/docs/sui-chart-legend/README.md +53 -0
- package/docs/sui-chart-legend-dot/README.md +49 -0
- package/docs/sui-checkbox/README.md +106 -26
- package/docs/sui-checkbox-card/README.md +58 -2
- package/docs/sui-checkbox-label/README.md +89 -23
- package/docs/sui-circular-progress-bar/README.md +63 -5
- package/docs/sui-color-dot/README.md +61 -5
- package/docs/sui-color-picker/README.md +62 -4
- package/docs/sui-command-menu-footer/README.md +49 -0
- package/docs/sui-command-menu-item/README.md +63 -4
- package/docs/sui-command-menu-search/README.md +58 -4
- package/docs/sui-compact-avatar-group/README.md +61 -4
- package/docs/sui-compact-button/README.md +112 -28
- package/docs/sui-compact-select/README.md +58 -4
- package/docs/sui-compact-select-for-input/README.md +69 -5
- package/docs/sui-content-card/README.md +63 -2
- package/docs/sui-content-divider/README.md +49 -1
- package/docs/sui-content-label/README.md +83 -4
- package/docs/sui-counter-input/README.md +91 -7
- package/docs/sui-date-selector/README.md +61 -3
- package/docs/sui-datepicker/README.md +72 -5
- package/docs/sui-day-cell/README.md +60 -3
- package/docs/sui-day-label/README.md +52 -3
- package/docs/sui-divider/README.md +57 -5
- package/docs/sui-drawer-footer/README.md +63 -2
- package/docs/sui-drawer-header/README.md +60 -3
- package/docs/sui-dropdown-caption/README.md +53 -1
- package/docs/sui-dropdown-item/README.md +72 -6
- package/docs/sui-dropdown-menu/README.md +74 -5
- package/docs/sui-dropdown-search/README.md +57 -1
- package/docs/sui-emoji/README.md +82 -18
- package/docs/sui-empty-state/README.md +68 -4
- package/docs/sui-fancy-button/README.md +59 -1
- package/docs/sui-file-icon/README.md +56 -1
- package/docs/sui-file-upload/README.md +69 -9
- package/docs/sui-file-upload-card/README.md +53 -2
- package/docs/sui-filter/README.md +74 -5
- package/docs/sui-flag/README.md +62 -1
- package/docs/sui-form-hint/README.md +54 -5
- package/docs/sui-form-label/README.md +53 -1
- package/docs/sui-href/README.md +47 -0
- package/docs/sui-icon/README.md +69 -4
- package/docs/sui-image-upload/README.md +70 -3
- package/docs/sui-image-upload-profile/README.md +58 -0
- package/docs/sui-img-retry/README.md +49 -0
- package/docs/sui-inline-input/README.md +61 -3
- package/docs/sui-inline-select/README.md +60 -0
- package/docs/sui-input/README.md +77 -14
- package/docs/sui-integration-switch/README.md +69 -2
- package/docs/sui-kbd/README.md +71 -7
- package/docs/sui-key-icon/README.md +65 -6
- package/docs/sui-link-button/README.md +79 -13
- package/docs/sui-logo/README.md +74 -4
- package/docs/sui-modal/README.md +61 -2
- package/docs/sui-modal-footer/README.md +83 -9
- package/docs/sui-modal-header/README.md +56 -0
- package/docs/sui-modal-sheet/README.md +72 -10
- package/docs/sui-notification/README.md +71 -1
- package/docs/sui-notification-footer/README.md +51 -1
- package/docs/sui-notification-tab-menu/README.md +57 -1
- package/docs/sui-otp-input/README.md +67 -6
- package/docs/sui-page-header/README.md +83 -15
- package/docs/sui-pagination/README.md +60 -0
- package/docs/sui-password-strength/README.md +50 -1
- package/docs/sui-payment-icon/README.md +66 -7
- package/docs/sui-period-range/README.md +65 -6
- package/docs/sui-popover/README.md +73 -7
- package/docs/sui-product-card/README.md +76 -8
- package/docs/sui-progress-bar/README.md +72 -8
- package/docs/sui-progress-bar-label/README.md +69 -12
- package/docs/sui-radio/README.md +83 -6
- package/docs/sui-radio-card/README.md +58 -4
- package/docs/sui-radio-label/README.md +86 -19
- package/docs/sui-rating/README.md +81 -14
- package/docs/sui-rich-editor/README.md +45 -0
- package/docs/sui-segmented-control/README.md +83 -14
- package/docs/sui-select/README.md +72 -3
- package/docs/sui-sidebar/README.md +64 -9
- package/docs/sui-slider/README.md +68 -1
- package/docs/sui-social-button/README.md +63 -3
- package/docs/sui-status-badge/README.md +64 -6
- package/docs/sui-stepper/README.md +57 -0
- package/docs/sui-store-card/README.md +71 -8
- package/docs/sui-switch/README.md +80 -9
- package/docs/sui-switch-card/README.md +70 -6
- package/docs/sui-switch-label/README.md +90 -13
- package/docs/sui-tab-chips/README.md +79 -9
- package/docs/sui-tab-menu-horizontal/README.md +62 -1
- package/docs/sui-tab-menu-vertical/README.md +56 -3
- package/docs/sui-table/README.md +68 -7
- package/docs/sui-tag/README.md +75 -4
- package/docs/sui-tag-input/README.md +71 -7
- package/docs/sui-textarea/README.md +78 -11
- package/docs/sui-time-picker/README.md +70 -7
- package/docs/sui-toast/README.md +65 -5
- package/docs/sui-tooltip/README.md +61 -4
- package/docs/sui-topbar/README.md +57 -3
- package/docs/sui-topbar-button/README.md +57 -3
- package/docs/sui-topbar-item/README.md +61 -0
- package/docs/sui-topbar-user/README.md +56 -0
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +19 -19
|
@@ -84,9 +84,27 @@ es solo el texto: el `gap` entre pestañas no responde.
|
|
|
84
84
|
| 4+ secciones | si no entran a 390 px, se salen sin poder deslizarse (las 4 del panel de repartidores, con sus números, ya no entran a 360): va `sui-tab-chips` | el mismo | según el código |
|
|
85
85
|
|
|
86
86
|
```html
|
|
87
|
-
<sui-tab-menu-horizontal [tabs]="secciones" [(active)]="seccion" [size]="bp.
|
|
87
|
+
<sui-tab-menu-horizontal [tabs]="secciones" [(active)]="seccion" [size]="bp.tactil() && !bp.celularChico() ? 'large' : 'medium'" />
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
+
### Por dispositivo (D16)
|
|
91
|
+
|
|
92
|
+
Fila de `tab-menu-horizontal` en la tabla de D16 (dueño, 05-10-2026): se toca, pero su `medium`
|
|
93
|
+
ya mide 48 de alto, así que el celular chico no necesita subir.
|
|
94
|
+
|
|
95
|
+
| dispositivo | size | nota |
|
|
96
|
+
|---|---|---|
|
|
97
|
+
| celular chico (< 380 px) | `medium` (48) | ya mide 48: pasa el piso de 44 sin subir |
|
|
98
|
+
| celular (380–767 px) | `large` (52, texto 16) | |
|
|
99
|
+
| tablet táctil (`pointer: coarse`) | `large` (52) | se toca con el dedo, aunque mida más de 767 |
|
|
100
|
+
| computadora (`pointer: fine`) | `medium` (48) | `small` no se usa |
|
|
101
|
+
|
|
102
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`. `xlarge` no sale de ningún dispositivo.
|
|
103
|
+
|
|
104
|
+
En master-pedidos: `[size]="bp.tactil() && !bp.celularChico() ? 'large' : 'medium'"`. No hay
|
|
105
|
+
helper propio, y `bp.sizeControl()` no sirve aunque los valores coincidan: da `large` en el celular
|
|
106
|
+
chico.
|
|
107
|
+
|
|
90
108
|
## «No usar»: por qué no hoy y cuándo sí
|
|
91
109
|
|
|
92
110
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -141,6 +159,49 @@ interface SuiTabMenuHorizontalItem<T = string> {
|
|
|
141
159
|
- El ícono de la pestaña activa es `strong-950`, no naranja; en el tab menu vertical es naranja.
|
|
142
160
|
Es a propósito.
|
|
143
161
|
|
|
162
|
+
## Bien y mal
|
|
163
|
+
|
|
164
|
+
Pestañas del modal del local, que el cliente abre en el teléfono
|
|
165
|
+
|
|
166
|
+
```html
|
|
167
|
+
<!-- ❌ mal: sin size queda en medium en el teléfono y la tablet (components/store-ratings-modal/store-ratings-modal.html:43) -->
|
|
168
|
+
<sui-tab-menu-horizontal [tabs]="tabs" [active]="tab()" (tabChange)="tab.set($any($event))" />
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
```html
|
|
172
|
+
<!-- ✅ bien -->
|
|
173
|
+
<sui-tab-menu-horizontal [tabs]="tabs" [(active)]="tab"
|
|
174
|
+
[size]="bp.tactil() && !bp.celularChico() ? 'large' : 'medium'" />
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Flecha en una pestaña
|
|
178
|
+
|
|
179
|
+
```html
|
|
180
|
+
<!-- ❌ mal: rightIcon dice «te lleva a otra pantalla» y una pestaña no navega -->
|
|
181
|
+
<sui-tab-menu-horizontal [(active)]="tab"
|
|
182
|
+
[tabs]="[{ value: 'opiniones', label: 'Opiniones', rightIcon: true }, { value: 'info', label: 'Información' }]" />
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```html
|
|
186
|
+
<!-- ✅ bien -->
|
|
187
|
+
<sui-tab-menu-horizontal [(active)]="tab"
|
|
188
|
+
[tabs]="[{ value: 'opiniones', label: 'Opiniones' }, { value: 'info', label: 'Información' }]" />
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Un total neutro en el círculo rojo
|
|
192
|
+
|
|
193
|
+
```html
|
|
194
|
+
<!-- ❌ mal: number es para pendientes que piden acción, no para cuántos repartidores hay -->
|
|
195
|
+
<sui-tab-menu-horizontal [(active)]="tab"
|
|
196
|
+
[tabs]="[{ value: 'activos', label: 'Activos', number: 42 }, { value: 'solicitudes', label: 'Solicitudes' }]" />
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
```html
|
|
200
|
+
<!-- ✅ bien -->
|
|
201
|
+
<sui-tab-menu-horizontal [(active)]="tab"
|
|
202
|
+
[tabs]="[{ value: 'activos', label: 'Activos' }, { value: 'solicitudes', label: 'Solicitudes', number: 3 }]" />
|
|
203
|
+
```
|
|
204
|
+
|
|
144
205
|
## Ejemplo
|
|
145
206
|
|
|
146
207
|
```html
|
|
@@ -17,8 +17,9 @@ de pago · Repartidores»), el perfil del super admin.
|
|
|
17
17
|
|
|
18
18
|
**No lo uses** para:
|
|
19
19
|
|
|
20
|
-
- **Mobile**: el ítem mide 36 px y
|
|
21
|
-
|
|
20
|
+
- **Mobile y tablet táctil**: el ítem mide 36 px y no llega a los 44 del dedo; en el celular,
|
|
21
|
+
además, ocupa el ancho de la pantalla dejando el contenido debajo. Ahí cada sección es una fila
|
|
22
|
+
de una lista que abre su propia pantalla.
|
|
22
23
|
- La navegación de toda la app: `sui-sidebar`.
|
|
23
24
|
- 2 a 4 secciones arriba del contenido: `sui-tab-menu-horizontal`.
|
|
24
25
|
- Filtros de una lista: `sui-tab-chips`.
|
|
@@ -71,11 +72,19 @@ Usos de hoy que rompen las reglas: **0** (no se usa).
|
|
|
71
72
|
| secciones de ajustes | no se usa: lista de filas que abren pantalla | `tab-menu-vertical` | «no se usa en mobile»: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — el ítem mide 36 y no tiene `size` · la lista de filas en mobile y el uso en web: canon (aprobado por el dueño, 05-10-2026, bloque B7) |
|
|
72
73
|
|
|
73
74
|
```html
|
|
74
|
-
@if (!bp.
|
|
75
|
+
@if (!bp.tactil()) {
|
|
75
76
|
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" menuStyle="card" />
|
|
76
77
|
}
|
|
77
78
|
```
|
|
78
79
|
|
|
80
|
+
### Por dispositivo (D16)
|
|
81
|
+
|
|
82
|
+
No tiene `size` (ítem único de 36, sin eje de tamaño en Figma): no hay tabla por dispositivo. Como
|
|
83
|
+
se toca y no llega a 44, la regla general de D16 lo deja fuera de todo lo táctil: celular (chico o
|
|
84
|
+
no) y tablet táctil van con la lista de filas que abren pantalla (B7); computadora y ultrawide, el
|
|
85
|
+
menú tal cual. Fuente: D16, dueño 05-10-2026 (columna «lo que se toca»). En master-pedidos:
|
|
86
|
+
`@if (!bp.tactil()) { <sui-tab-menu-vertical … /> }`.
|
|
87
|
+
|
|
79
88
|
## «No usar»: por qué no hoy y cuándo sí
|
|
80
89
|
|
|
81
90
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -128,6 +137,50 @@ type SuiTabMenuVerticalStyle = 'card' | 'list';
|
|
|
128
137
|
- `role="tablist"`: si cada ítem navega a una ruta, el lector de pantalla lo anuncia mal; para
|
|
129
138
|
navegación entre rutas, `sui-sidebar`.
|
|
130
139
|
|
|
140
|
+
## Bien y mal
|
|
141
|
+
|
|
142
|
+
Menú en el celular
|
|
143
|
+
|
|
144
|
+
```html
|
|
145
|
+
<!-- ❌ mal: en el celular y la tablet táctil el ítem mide 36 (no llega a 44), y en el celular el contenido queda debajo -->
|
|
146
|
+
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" />
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<!-- ✅ bien: en el celular y la tablet táctil, cada sección es una fila que abre su pantalla -->
|
|
151
|
+
@if (!bp.tactil()) {
|
|
152
|
+
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" />
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
Ítem activo al entrar
|
|
157
|
+
|
|
158
|
+
```html
|
|
159
|
+
<!-- ❌ mal: sin active no se marca ningún ítem -->
|
|
160
|
+
<sui-tab-menu-vertical [tabs]="secciones" (tabChange)="mostrar($event)" />
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
```html
|
|
164
|
+
<!-- ✅ bien: seccion arranca en la primera sección ('datos') -->
|
|
165
|
+
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" />
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Menú dentro de una card
|
|
169
|
+
|
|
170
|
+
```html
|
|
171
|
+
<!-- ❌ mal: card dentro de una card, borde y sombra dobles -->
|
|
172
|
+
<sui-card>
|
|
173
|
+
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" menuStyle="card" />
|
|
174
|
+
</sui-card>
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```html
|
|
178
|
+
<!-- ✅ bien: la columna ya tiene fondo y borde, el menú va plano -->
|
|
179
|
+
<sui-card>
|
|
180
|
+
<sui-tab-menu-vertical [tabs]="secciones" [(active)]="seccion" menuStyle="list" />
|
|
181
|
+
</sui-card>
|
|
182
|
+
```
|
|
183
|
+
|
|
131
184
|
## Ejemplo
|
|
132
185
|
|
|
133
186
|
```html
|
package/docs/sui-table/README.md
CHANGED
|
@@ -72,8 +72,8 @@ Dentro va un componente SUI, no HTML a mano:
|
|
|
72
72
|
|
|
73
73
|
| contenido | componente | fuente |
|
|
74
74
|
|---|---|---|
|
|
75
|
-
| estado o categoría | `<sui-badge variant="lighter" size="
|
|
76
|
-
| acciones de la fila | `<sui-button variant="ghost" color="neutral" size="
|
|
75
|
+
| estado o categoría | `<sui-badge variant="lighter" [size]="bp.sizeBadge()">` (`medium` en la computadora, `large` en el celular) | D16, dueño 05-10-2026; CANON-SUI §0 («Chip de estado») todavía dice `small`: hay que actualizarlo en master-pedidos |
|
|
76
|
+
| acciones de la fila | `<sui-button variant="ghost" color="neutral" [size]="bp.sizeControl()" [onlyIcon]="true">` (`medium` en la computadora, `large` donde se toca) | D16, dueño 05-10-2026 (README de `sui-button`: en una tabla, `medium` en la computadora; antes `2xsmall`) |
|
|
77
77
|
| prender/apagar | `<sui-switch>` | propuesta, falta aprobación |
|
|
78
78
|
| calificación | `<sui-rating>` de solo lectura | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
79
79
|
|
|
@@ -118,11 +118,11 @@ secundaria dentro de un tablero) y 6 sin `size` (o sea `medium`).
|
|
|
118
118
|
| uso | mobile | web | fuente |
|
|
119
119
|
|---|---|---|---|
|
|
120
120
|
| tabla principal de una pantalla | `medium` | `medium` | práctica de la app |
|
|
121
|
-
| tabla secundaria dentro de un tablero | `
|
|
121
|
+
| tabla secundaria dentro de un tablero | `medium` | `medium` | D16, dueño 05-10-2026 (antes `small`, práctica de la app: `master-overview.html:126`) |
|
|
122
122
|
| filas con dos líneas y un badge | `medium` | `medium` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
123
123
|
|
|
124
|
-
El patrón
|
|
125
|
-
ya mide 64 y el toque es sobre toda la fila. `large`/`xlarge` no tienen uso hoy.
|
|
124
|
+
El patrón por dispositivo de los botones (`bp.sizeControl()`) **no aplica al `size` de la tabla**:
|
|
125
|
+
la fila ya mide 64 y el toque es sobre toda la fila. `large`/`xlarge` no tienen uso hoy.
|
|
126
126
|
|
|
127
127
|
**Qué pasa en mobile (≤ 767 px):** la tabla scrollea en horizontal dentro de sí misma; la
|
|
128
128
|
cabecera y el cuerpo miden lo mismo y la barra de scroll se oculta. En la app conviven dos
|
|
@@ -140,6 +140,19 @@ solo en Android**: pone `touch-action: pan-x` por JS para que el scroll horizont
|
|
|
140
140
|
y mueve él mismo la página con el gesto vertical (con inercia). En iOS no hace nada: WebKit delega
|
|
141
141
|
el vertical solo. Por eso la página **no** agrega `touch-action` ni un wrapper con `overflow-x`.
|
|
142
142
|
|
|
143
|
+
### Por dispositivo (D16)
|
|
144
|
+
|
|
145
|
+
El `size` de la tabla no depende del dispositivo: cambia el alto de la fila (48 a 96), no el área
|
|
146
|
+
que se toca, y la fila entera ya pasa los 44 del dedo. Va `medium` (el default) en el celular
|
|
147
|
+
chico, el celular, la tablet táctil, la computadora y el ultrawide; por eso no hay tabla de D16.
|
|
148
|
+
Lo que sí sigue a D16 es lo que va **dentro** de las celdas: el badge como lo que no se toca y el
|
|
149
|
+
botón de acción como lo que se toca. Fuente: D16, dueño 05-10-2026.
|
|
150
|
+
|
|
151
|
+
En master-pedidos: `<sui-table>` sin `size`, y en las plantillas `[size]="bp.sizeBadge()"` (badge)
|
|
152
|
+
y `[size]="bp.sizeControl()"` (botón). Las tablas de la app que tienen badge o botón en una celda
|
|
153
|
+
ya llevan esos helpers; la que queda fuera es `master-overview.html:126`, que pasa `size="small"` a
|
|
154
|
+
la tabla.
|
|
155
|
+
|
|
143
156
|
## Pista de scroll (canon, aprobado por el dueño el 05-10-2026)
|
|
144
157
|
|
|
145
158
|
Desde la **0.24.0**. Cuando la tabla scrollea en horizontal (≤ 767 px, o con una columna `sticky`)
|
|
@@ -256,6 +269,54 @@ trabajo de la página.
|
|
|
256
269
|
- **El degradado de la pista es `bg-white-0`**, el fondo de la propia tabla. Si la tabla vive
|
|
257
270
|
sobre otro fondo (no es el caso hoy), se pisa `--sui-pista-de-scroll-fondo` en un contenedor.
|
|
258
271
|
|
|
272
|
+
## Bien y mal
|
|
273
|
+
|
|
274
|
+
Segunda línea en la columna principal
|
|
275
|
+
|
|
276
|
+
```html
|
|
277
|
+
<!-- ❌ mal: la columna tiene descriptionKey, pero con plantilla la segunda línea no sale (central-gastos.html:49, central-gastos.ts:83) -->
|
|
278
|
+
<ng-template suiTableCell="concepto" let-row>
|
|
279
|
+
<span class="cg__concepto">{{ row.concepto }}</span>
|
|
280
|
+
</ng-template>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
```html
|
|
284
|
+
<!-- ✅ bien: sin plantilla en 'concepto'; leading + descriptionKey pintan las dos líneas (como orders.html:94) -->
|
|
285
|
+
<sui-table [columns]="columnas" [rows]="filas()" emptyMessage="No hay gastos registrados este mes." />
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Columnas que no entran
|
|
289
|
+
|
|
290
|
+
```html
|
|
291
|
+
<!-- ❌ mal: wrapper con overflow-x desde la página (drivers.html:212, drivers.scss:111) -->
|
|
292
|
+
<div class="drivers__table-wrap">
|
|
293
|
+
<sui-table [columns]="tableColumns" [rows]="filteredDrivers()" rowKey="id" />
|
|
294
|
+
</div>
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
```html
|
|
298
|
+
<!-- ✅ bien: las columnas entran en el ancho real; con 6+ columnas, tarjetas por debajo de 1350 px -->
|
|
299
|
+
<sui-table [columns]="tableColumns" [rows]="filteredDrivers()" rowKey="id" />
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
Botón dentro de una fila que abre el detalle
|
|
303
|
+
|
|
304
|
+
```html
|
|
305
|
+
<!-- ❌ mal: el clic edita y además abre el detalle por rowClicked -->
|
|
306
|
+
<ng-template suiTableCell="acciones" let-row>
|
|
307
|
+
<sui-button variant="ghost" color="neutral" [size]="bp.sizeControl()" [onlyIcon]="true"
|
|
308
|
+
leftIcon="pencil-line" aria-label="Editar" (click)="editar(row)" />
|
|
309
|
+
</ng-template>
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
```html
|
|
313
|
+
<!-- ✅ bien -->
|
|
314
|
+
<ng-template suiTableCell="acciones" let-row>
|
|
315
|
+
<sui-button variant="ghost" color="neutral" [size]="bp.sizeControl()" [onlyIcon]="true"
|
|
316
|
+
leftIcon="pencil-line" aria-label="Editar" (click)="$event.stopPropagation(); editar(row)" />
|
|
317
|
+
</ng-template>
|
|
318
|
+
```
|
|
319
|
+
|
|
259
320
|
## Ejemplo
|
|
260
321
|
|
|
261
322
|
```html
|
|
@@ -268,12 +329,12 @@ trabajo de la página.
|
|
|
268
329
|
emptyMessage="Sin pedidos en este estado."
|
|
269
330
|
(rowClicked)="abrirDetalle($event)">
|
|
270
331
|
<ng-template suiTableCell="estado" let-row>
|
|
271
|
-
<sui-badge [color]="row.color" variant="lighter" size="
|
|
332
|
+
<sui-badge [color]="row.color" variant="lighter" [size]="bp.sizeBadge()">{{ row.estadoLabel }}</sui-badge>
|
|
272
333
|
</ng-template>
|
|
273
334
|
</sui-table>
|
|
274
335
|
|
|
275
336
|
@if (hayMas()) {
|
|
276
|
-
<sui-button variant="stroke" color="neutral" [size]="bp.
|
|
337
|
+
<sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()"
|
|
277
338
|
[disabled]="cargandoMas()" (click)="cargarMas()">Cargar más</sui-button>
|
|
278
339
|
}
|
|
279
340
|
</sui-card>
|
package/docs/sui-tag/README.md
CHANGED
|
@@ -72,8 +72,9 @@ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026)
|
|
|
72
72
|
380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
|
|
73
73
|
computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
|
|
74
74
|
(< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
|
|
75
|
-
`xsmall`**, salvo lo que el componente solo tiene en chico.
|
|
76
|
-
`
|
|
75
|
+
`xsmall`**, salvo lo que el componente solo tiene en chico. `BreakpointsService` ya mira el puntero
|
|
76
|
+
y los 380 px (`bp.toque()`, `bp.celularChico()`, `bp.celular()`, `bp.tactil()`), pero no tiene un
|
|
77
|
+
helper para el tag: se usa la expresión de «Por dispositivo (D16)».
|
|
77
78
|
|
|
78
79
|
| size | alto | texto | leading | X de quitar (área táctil) |
|
|
79
80
|
|---|---|---|---|---|
|
|
@@ -97,17 +98,42 @@ máximo se sigue cortando, y la X queda siempre visible.
|
|
|
97
98
|
|
|
98
99
|
| uso | mobile | web | fuente |
|
|
99
100
|
|---|---|---|---|
|
|
100
|
-
| Tag con X (filtro aplicado, elegido que se quita) | `xlarge` (40) | `medium` (24) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — solo la X de `xlarge` llega a 44 · web: canon (dueño, 05-10-2026, D16) (`medium` es el más chico que tiene) |
|
|
101
|
+
| Tag con X (filtro aplicado, elegido que se quita) | `xlarge` (40) | `medium` (24) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — solo la X de `xlarge` llega a 44 (en la tablet de más de 767 px, 40: ver «Por dispositivo») · web: canon (dueño, 05-10-2026, D16) (`medium` es el más chico que tiene) |
|
|
101
102
|
| Tag de solo lectura (sin X) | `large` (32) | `medium` (24) | canon (dueño, 05-10-2026, P1 b); el tamaño es extensión SUI aprobada (03-10-2026) |
|
|
102
103
|
| Separación entre tags | 8 px | 4–6 px | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
103
104
|
|
|
104
105
|
```html
|
|
105
|
-
<sui-tag [size]="bp.
|
|
106
|
+
<sui-tag [size]="bp.tactil() ? 'xlarge' : 'medium'" [dismissible]="true" (dismiss)="quitar(f)">{{ f.nombre }}</sui-tag>
|
|
106
107
|
```
|
|
107
108
|
|
|
108
109
|
El leading proyectado (ícono, avatar, bandera) se escala solo a la caja de 20 en los grandes; un
|
|
109
110
|
`<i class="ri-…">` necesita además su `font-size` en 20.
|
|
110
111
|
|
|
112
|
+
### Por dispositivo (D16)
|
|
113
|
+
|
|
114
|
+
Fila `tag` de la tabla D16 (dueño, 05-10-2026). El tag con X se toca (la X); el de solo lectura no:
|
|
115
|
+
|
|
116
|
+
| dispositivo | size | nota |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| celular chico (< 380) | con X `xlarge` · solo lectura `medium` | la X solo llega a 44 en `xlarge` (el área de 44 se prende con `max-width: 767px`) |
|
|
119
|
+
| celular (380–767) | con X `xlarge` · solo lectura `large` | lo que no se toca sube un paso en el celular (P1 b) |
|
|
120
|
+
| tablet táctil (`pointer: coarse`) | con X `xlarge` · solo lectura `medium` | la X se toca con el dedo (Apple pide 44 también en el iPad), pero en la tablet de más de 767 px hoy se toca en **40×40**, no en 44: ver abajo |
|
|
121
|
+
| computadora (`pointer: fine`) | `medium` | `medium` es el más chico que tiene |
|
|
122
|
+
|
|
123
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`.
|
|
124
|
+
|
|
125
|
+
**La X en la tablet queda en 40×40.** El área de 44 de la X de `xlarge` se prende con
|
|
126
|
+
`@media (max-width: 767px)` (`sui-tag.scss`, `inset` −10); en una tablet de más de 767 px de ancho
|
|
127
|
+
(casi todos los iPad, y cualquiera en horizontal) la X se toca en 40×40 (`inset` −8). `xlarge`
|
|
128
|
+
sigue siendo lo correcto en la tablet (es el más grande que tiene); llega a 44 cuando el DS cambie
|
|
129
|
+
ese media query por el mixin `sui-tactil` (`max-width: 767px` o `pointer: coarse`), que está
|
|
130
|
+
propuesto en el doc de D16 y todavía no se hizo.
|
|
131
|
+
|
|
132
|
+
En master-pedidos (no hay helper para el tag):
|
|
133
|
+
|
|
134
|
+
- con X: `[size]="bp.tactil() ? 'xlarge' : 'medium'"`
|
|
135
|
+
- solo lectura: `[size]="bp.celular() ? 'large' : 'medium'"`
|
|
136
|
+
|
|
111
137
|
## API
|
|
112
138
|
|
|
113
139
|
<!-- api:inicio -->
|
|
@@ -146,6 +172,51 @@ Slots: `[data-slot=start]` (avatar, logo, bandera o ícono de 16 px) y `<ng-cont
|
|
|
146
172
|
- `sui-avatar` no tiene 16 px: el `xs` (20) se escala por CSS dentro del slot.
|
|
147
173
|
- Radio de 6 px, 24 px de alto en `medium`, sin mayúsculas: no es un badge (radio completo).
|
|
148
174
|
|
|
175
|
+
## Bien y mal
|
|
176
|
+
|
|
177
|
+
Dato de solo lectura
|
|
178
|
+
|
|
179
|
+
```html
|
|
180
|
+
<!-- ❌ mal: solo se lee y no lleva nada a la izquierda, eso es un badge -->
|
|
181
|
+
<sui-tag tagStyle="gray" sublabel="3 días">Frecuencia</sui-tag>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
```html
|
|
185
|
+
<!-- ✅ bien -->
|
|
186
|
+
<sui-badge color="gray" [size]="bp.sizeBadge()">Frecuencia: 3 días</sui-badge>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Filtro aplicado que se quita
|
|
190
|
+
|
|
191
|
+
```html
|
|
192
|
+
<!-- ❌ mal: sin size la X mide 16 en el celular, y el lector de pantalla solo oye «Quitar» -->
|
|
193
|
+
<sui-tag [dismissible]="true" (dismiss)="quitarFiltro('abierto')">Abierto ahora</sui-tag>
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
```html
|
|
197
|
+
<!-- ✅ bien -->
|
|
198
|
+
<sui-tag [size]="bp.tactil() ? 'xlarge' : 'medium'" [dismissible]="true"
|
|
199
|
+
dismissLabel="Quitar Abierto ahora" (dismiss)="quitarFiltro('abierto')">Abierto ahora</sui-tag>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
Logo a la izquierda
|
|
203
|
+
|
|
204
|
+
```html
|
|
205
|
+
<!-- ❌ mal: con algo en [data-slot=start] y sin [leading]="true", el padding queda mal -->
|
|
206
|
+
<sui-tag [size]="bp.celular() ? 'large' : 'medium'">
|
|
207
|
+
<sui-avatar data-slot="start" size="xs" [src]="local.imageUrl" [initials]="'B'" />
|
|
208
|
+
Burger House
|
|
209
|
+
</sui-tag>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
```html
|
|
213
|
+
<!-- ✅ bien -->
|
|
214
|
+
<sui-tag [size]="bp.celular() ? 'large' : 'medium'" [leading]="true">
|
|
215
|
+
<sui-avatar data-slot="start" size="xs" [src]="local.imageUrl" [initials]="'B'" />
|
|
216
|
+
Burger House
|
|
217
|
+
</sui-tag>
|
|
218
|
+
```
|
|
219
|
+
|
|
149
220
|
## Ejemplo
|
|
150
221
|
|
|
151
222
|
```html
|
|
@@ -28,9 +28,10 @@ Regla corta: **varios valores libres → tag-input · varias opciones fijas →
|
|
|
28
28
|
> **En la guía del DS es un ejemplo de su página del input** («With Tags»: un campo con los chips
|
|
29
29
|
> Berlin, London, Paris debajo). No dice cuándo usarlo.
|
|
30
30
|
>
|
|
31
|
-
> Uso medido el
|
|
32
|
-
>
|
|
33
|
-
> palabras separadas por coma
|
|
31
|
+
> Uso medido el 06-10-2026 en `master-pedidos/src/app`: **1 uso**, «Rubros que entran» de una
|
|
32
|
+
> categoría propia del home (`pages/super-admin/master-categorias/master-categorias.html:179`), con
|
|
33
|
+
> `commaSeparator` y `addOnBlur`. Antes eran palabras separadas por coma en un `sui-input` que la
|
|
34
|
+
> pantalla partía a mano.
|
|
34
35
|
|
|
35
36
|
| prop / evento | cuándo | fuente |
|
|
36
37
|
|---|---|---|
|
|
@@ -65,17 +66,38 @@ en web; el alto sigue en 48/52.
|
|
|
65
66
|
|
|
66
67
|
| uso | mobile | web | fuente |
|
|
67
68
|
|---|---|---|---|
|
|
68
|
-
| campo de formulario | `
|
|
69
|
+
| campo de formulario | `large` (48, chips de 32 con X tocable en 32) | `medium` (40) | D16, dueño 05-10-2026 (fila `input`/`tag-input`); reemplaza el `xlarge` del 04-10-2026 · la X de 32 no llega a 44: ver «Por dispositivo» |
|
|
69
70
|
|
|
70
71
|
```html
|
|
71
|
-
<sui-tag-input [size]="bp.
|
|
72
|
+
<sui-tag-input [size]="bp.sizeControl()" … /> <!-- bp = BreakpointsService -->
|
|
72
73
|
```
|
|
73
74
|
|
|
75
|
+
### Por dispositivo (D16)
|
|
76
|
+
|
|
77
|
+
Fila `input`/`tag-input` de la tabla D16 (dueño, 05-10-2026). Se toca, así que va por tipo de
|
|
78
|
+
puntero además del ancho:
|
|
79
|
+
|
|
80
|
+
| dispositivo | size | nota |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| celular chico (< 380) | `large` (48) | D16 pide `medium` con área tocable de 44; mientras el DS no estire el área de los `medium`, va `large` (interino) |
|
|
83
|
+
| celular (380–767) | `large` (48) | los chips salen en `large`: la X mide 20 con área de 32, no llega a 44 |
|
|
84
|
+
| tablet táctil (`pointer: coarse`) | `large` (48) | igual que el celular |
|
|
85
|
+
| computadora (`pointer: fine`) | `medium` (40) | también en filtros del panel; `xsmall` y `small` no se usan |
|
|
86
|
+
|
|
87
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`.
|
|
88
|
+
|
|
89
|
+
**Choque entre dos filas de D16 (a confirmar con el dueño):** con el campo en `large` la X del
|
|
90
|
+
chip queda en 32, y la fila `tag` dice que la X solo llega a 44 en `xlarge`. Hasta el 04-10-2026 el
|
|
91
|
+
campo iba `xlarge` en el teléfono justo por eso. Mientras no se diga otra cosa, manda la fila
|
|
92
|
+
`tag-input` (`large`).
|
|
93
|
+
|
|
94
|
+
En master-pedidos: `[size]="bp.sizeControl()"`.
|
|
95
|
+
|
|
74
96
|
## «No usar»: por qué no hoy y cuándo sí
|
|
75
97
|
|
|
76
98
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
77
99
|
|---|---|---|
|
|
78
|
-
|
|
|
100
|
+
| otros usos (hoy solo los rubros de una categoría) | nadie más carga listas de palabras | sinónimos de un producto para el buscador |
|
|
79
101
|
| `rightIcon` | el hint explica mejor | — |
|
|
80
102
|
| `maxTags` | no hay topes | un máximo de 5 palabras clave por producto |
|
|
81
103
|
| `allowDuplicates` | repetir no sirve | — |
|
|
@@ -124,10 +146,52 @@ no es parte del valor. Slot `[slot=right]` para un contenido propio a la derecha
|
|
|
124
146
|
- **Accesibilidad (04-10-2026)**: el control trae su `id`; el `label` interno apunta a él con `for`,
|
|
125
147
|
el hint o el error se enlazan con `aria-describedby` y `error` pone `aria-invalid`.
|
|
126
148
|
|
|
127
|
-
##
|
|
149
|
+
## Bien y mal
|
|
150
|
+
|
|
151
|
+
Tamaño en el celular
|
|
152
|
+
|
|
153
|
+
```html
|
|
154
|
+
<!-- ❌ mal: sin size queda en medium en el celular y la X de los chips mide 16 (master-categorias.html:179) -->
|
|
155
|
+
<sui-tag-input label="Rubros que entran" [commaSeparator]="true" [addOnBlur]="true"
|
|
156
|
+
[value]="e.match" (valueChange)="editar('match', $event)" />
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```html
|
|
160
|
+
<!-- ✅ bien -->
|
|
161
|
+
<sui-tag-input [size]="bp.sizeControl()" label="Rubros que entran" [commaSeparator]="true"
|
|
162
|
+
[addOnBlur]="true" [value]="e.match" (valueChange)="editar('match', $event)" />
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Placeholder y hint
|
|
128
166
|
|
|
129
167
|
```html
|
|
168
|
+
<!-- ❌ mal: el placeholder dice cómo se agrega, no qué se agrega (master-categorias.html:179) -->
|
|
169
|
+
<sui-tag-input label="Rubros que entran" placeholder="Escribe y pulsa coma"
|
|
170
|
+
hint="Un local entra si su rubro contiene alguna de estas palabras" />
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
```html
|
|
174
|
+
<!-- ✅ bien: el placeholder dice qué; el hint, cómo -->
|
|
130
175
|
<sui-tag-input label="Rubros que entran" placeholder="Agrega una palabra…"
|
|
176
|
+
hint="Separa con coma. Un local entra si su rubro contiene alguna" />
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Salir del campo sin Enter
|
|
180
|
+
|
|
181
|
+
```html
|
|
182
|
+
<!-- ❌ mal: sin addOnBlur, lo escrito y no confirmado se pierde al salir -->
|
|
183
|
+
<sui-tag-input label="Sinónimos" [commaSeparator]="true" [(value)]="sinonimos" />
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
```html
|
|
187
|
+
<!-- ✅ bien -->
|
|
188
|
+
<sui-tag-input label="Sinónimos" [commaSeparator]="true" [addOnBlur]="true" [(value)]="sinonimos" />
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Ejemplo
|
|
192
|
+
|
|
193
|
+
```html
|
|
194
|
+
<sui-tag-input [size]="bp.sizeControl()" label="Rubros que entran" placeholder="Agrega una palabra…"
|
|
131
195
|
hint="Un local entra si su rubro contiene alguna" [commaSeparator]="true"
|
|
132
196
|
[addOnBlur]="true" [(value)]="rubros" />
|
|
133
197
|
```
|
|
@@ -18,8 +18,8 @@ comentario al calificar.
|
|
|
18
18
|
**No lo uses** para:
|
|
19
19
|
|
|
20
20
|
- Un dato de una línea (nombre, referencia corta, URL, un slug): `sui-input`. Hoy hay 4 así:
|
|
21
|
-
«Personaliza tu url» en `pages/mi-negocio/mi-negocio.html:
|
|
22
|
-
mobile, según su comentario) y 3 URL de imagen: `pages/mi-negocio/mi-negocio.html:
|
|
21
|
+
«Personaliza tu url» en `pages/mi-negocio/mi-negocio.html:714` (a propósito, para que envuelva en
|
|
22
|
+
mobile, según su comentario) y 3 URL de imagen: `pages/mi-negocio/mi-negocio.html:533`, `:588` y
|
|
23
23
|
`components/add-product-modal/add-product-modal.html:72`.
|
|
24
24
|
- Un motivo que se puede elegir de una lista cerrada: radios o `sui-select`, y la opción «Otro»
|
|
25
25
|
abre el textarea (como ya hace `pages/envios/envios.html:822`, con `[maxLength]="200"`; el
|
|
@@ -50,7 +50,7 @@ Regla corta: **se redacta y puede pasar de una línea → textarea · una línea
|
|
|
50
50
|
| `maxLength` | **Siempre que otro lo va a leer** (cliente, repartidor, local) o se guarda en la base: muestra «n/200» y corta el exceso. 200 para motivos y notas; 500 para descripciones. | según la guía del DS (su ejemplo principal lleva contador); los topes: canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
51
51
|
| `size` | El mismo de los inputs del formulario: `large` en mobile, `medium` en web. Ver «Tamaño en mobile y en web». | canon (aprobado por el dueño, 03-10-2026), extensión SUI; el «cuándo»: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
52
52
|
| `rows` | `3` para motivos y notas (el default del componente es `4`). `2` para una nota corta en un formulario largo. `4` o más solo para una descripción larga. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
53
|
-
| `resizable` | `true` en web. En mobile **`false
|
|
53
|
+
| `resizable` | `true` en web. En mobile y en la tablet táctil **`false`** (`!bp.tactil()`, D16): la manija no se puede arrastrar con el dedo y parece un adorno. | según la guía del DS (versión con y sin manija); el «cuándo»: canon (aprobado por el dueño, 05-10-2026, bloque B8) |
|
|
54
54
|
| `readonly` | Mostrar un texto ya enviado con la misma forma del campo (copiar un mensaje). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
|
|
55
55
|
| `disabled` | Mientras se envía. | según la guía del DS |
|
|
56
56
|
| `autocomplete` | No hace falta: ningún texto libre se autocompleta. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
|
|
@@ -61,9 +61,12 @@ Regla corta: **se redacta y puede pasar de una línea → textarea · una línea
|
|
|
61
61
|
|
|
62
62
|
- **7 sin `maxLength`**: 4 son las URL de una línea de arriba y 1 es de solo lectura
|
|
63
63
|
(`components/copy-text-dialog/copy-text-dialog.html:9`); quedan 2 «Notas» que se guardan en la base:
|
|
64
|
-
`pages/super-admin/super-admin.html:
|
|
65
|
-
-
|
|
66
|
-
|
|
64
|
+
`pages/super-admin/super-admin.html:339`, `pages/super-admin/master-gastos/master-gastos.html:235`.
|
|
65
|
+
- **`size` ya cumple** (medido de nuevo el 06-10-2026, tras la migración a D16): los 51 usos de la
|
|
66
|
+
app (sin vitrinas) van con `bp.sizeControl()`.
|
|
67
|
+
- **49 de 51 sin `resizable`**: la manija sale también en el celular y la tablet, donde no se puede
|
|
68
|
+
arrastrar con el dedo (p. ej. «Nota para el repartidor», `pages/envios/envios.html:422`). Solo
|
|
69
|
+
`copy-text-dialog.html:9` y `mi-negocio.html:714` la apagan, y fijo, también en la computadora.
|
|
67
70
|
|
|
68
71
|
## Tamaño en mobile y en web
|
|
69
72
|
|
|
@@ -90,14 +93,34 @@ también en web, así que cada fila mide 24 en las dos plataformas.
|
|
|
90
93
|
|
|
91
94
|
| uso | mobile | web | fuente |
|
|
92
95
|
|---|---|---|---|
|
|
93
|
-
| motivo, nota | el `size` del formulario (`large` si los inputs van en `large`), `rows=3`,
|
|
96
|
+
| motivo, nota | el `size` del formulario (`large` si los inputs van en `large`), `rows=3`, sin manija | `medium`, `rows=3`, manija | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
94
97
|
| descripción larga | igual, `rows=4` | `medium`, `rows=4` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
|
|
95
98
|
|
|
99
|
+
«Mobile» aquí incluye la tablet táctil (D16): la manija se apaga con `[resizable]="!bp.tactil()"`,
|
|
100
|
+
no con `[resizable]="false"` ni por ancho, para que tampoco salga en una tablet ancha.
|
|
101
|
+
|
|
96
102
|
```html
|
|
97
|
-
<sui-textarea [size]="bp.
|
|
98
|
-
[resizable]="!bp.
|
|
103
|
+
<sui-textarea [size]="bp.sizeControl()" [rows]="3"
|
|
104
|
+
[resizable]="!bp.tactil()" … /> <!-- bp = BreakpointsService -->
|
|
99
105
|
```
|
|
100
106
|
|
|
107
|
+
### Por dispositivo (D16)
|
|
108
|
+
|
|
109
|
+
Fila `textarea` de la tabla D16 (dueño, 05-10-2026), la misma de `sui-input`: se toca, así que va
|
|
110
|
+
por tipo de puntero además del ancho, y mide lo mismo que los campos y el botón del formulario.
|
|
111
|
+
|
|
112
|
+
| dispositivo | size | nota |
|
|
113
|
+
|---|---|---|
|
|
114
|
+
| celular chico (< 380 px) | `large` | D16 pide `medium` con área tocable de 44; mientras el DS no estire el área de los `medium`, va `large` (interino). Sin manija |
|
|
115
|
+
| celular (380–767 px) | `large` | el mismo padding que el `sui-input` `large` de arriba. Sin manija |
|
|
116
|
+
| tablet táctil (`pointer: coarse`) | `large` | también se toca con el dedo: `large` y sin manija, igual que el celular |
|
|
117
|
+
| computadora (`pointer: fine`) | `medium` | con manija; `small` y `xsmall` no se usan |
|
|
118
|
+
|
|
119
|
+
Ultrawide (≥ 1920 px): igual que la computadora, `medium`; el espacio extra va al ancho del
|
|
120
|
+
formulario, no a un campo más alto. El alto lo siguen poniendo las `rows` en todos los dispositivos.
|
|
121
|
+
|
|
122
|
+
En master-pedidos: `[size]="bp.sizeControl()"` + `[resizable]="!bp.tactil()"`.
|
|
123
|
+
|
|
101
124
|
## «No usar»: por qué no hoy y cuándo sí
|
|
102
125
|
|
|
103
126
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -147,12 +170,56 @@ Outputs: ninguno.
|
|
|
147
170
|
- **Accesibilidad (04-10-2026)**: el control trae su `id`; el `label` interno apunta a él con `for`,
|
|
148
171
|
el hint o el error se enlazan con `aria-describedby` y `error` pone `aria-invalid`.
|
|
149
172
|
|
|
173
|
+
## Bien y mal
|
|
174
|
+
|
|
175
|
+
URL de una imagen
|
|
176
|
+
|
|
177
|
+
```html
|
|
178
|
+
<!-- ❌ mal: una URL es un dato de una línea, y sin maxLength (pages/mi-negocio/mi-negocio.html:533, components/add-product-modal/add-product-modal.html:72) -->
|
|
179
|
+
<sui-textarea [size]="bp.sizeControl()" [rows]="2" placeholder="https://ejemplo.com/logo.png"
|
|
180
|
+
[value]="logoUrlInput()" (valueChange)="logoUrlInput.set($event)" />
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
```html
|
|
184
|
+
<!-- ✅ bien -->
|
|
185
|
+
<sui-input type="url" [size]="bp.sizeControl()" placeholder="https://ejemplo.com/logo.png"
|
|
186
|
+
[value]="logoUrlInput()" (valueChange)="logoUrlInput.set($event)" />
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
Nota que se guarda en la base
|
|
190
|
+
|
|
191
|
+
```html
|
|
192
|
+
<!-- ❌ mal: sin maxLength no hay contador ni tope, y la nota se guarda (pages/super-admin/super-admin.html:339) -->
|
|
193
|
+
<sui-textarea [size]="bp.sizeControl()" label="Notas" sublabel="(Opcional)" [rows]="3"
|
|
194
|
+
[ngModel]="subNotes()" (ngModelChange)="subNotes.set($event)" />
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
```html
|
|
198
|
+
<!-- ✅ bien -->
|
|
199
|
+
<sui-textarea [size]="bp.sizeControl()" label="Notas" sublabel="(Opcional)" [rows]="3" [maxLength]="200"
|
|
200
|
+
[resizable]="!bp.tactil()" [ngModel]="subNotes()" (ngModelChange)="subNotes.set($event)" />
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Nota para el repartidor en el celular
|
|
204
|
+
|
|
205
|
+
```html
|
|
206
|
+
<!-- ❌ mal: sin resizable, la manija sale en el celular y la tablet, donde no se arrastra con el dedo; y el tope de una nota es 200 (pages/envios/envios.html:422) -->
|
|
207
|
+
<sui-textarea [size]="bp.sizeControl()" [maxLength]="300" label="Nota para el repartidor"
|
|
208
|
+
placeholder="Ej. frágil, tocar el timbre, entregar en recepción" [rows]="3" [(value)]="nota" />
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
```html
|
|
212
|
+
<!-- ✅ bien -->
|
|
213
|
+
<sui-textarea [size]="bp.sizeControl()" [maxLength]="200" label="Nota para el repartidor" [resizable]="!bp.tactil()"
|
|
214
|
+
placeholder="Ej. frágil, tocar el timbre, entregar en recepción" [rows]="3" [(value)]="nota" />
|
|
215
|
+
```
|
|
216
|
+
|
|
150
217
|
## Ejemplo
|
|
151
218
|
|
|
152
219
|
```html
|
|
153
220
|
<sui-textarea label="Nota para el repartidor" sublabel="(Opcional)" [rows]="3" [maxLength]="200"
|
|
154
|
-
[size]="bp.
|
|
155
|
-
[resizable]="!bp.
|
|
221
|
+
[size]="bp.sizeControl()" placeholder="Ej. frágil, tocar el timbre, entregar en recepción"
|
|
222
|
+
[resizable]="!bp.tactil()" [(value)]="nota" />
|
|
156
223
|
|
|
157
224
|
<sui-textarea label="Motivo del rechazo" [required]="true" [rows]="3" [maxLength]="200"
|
|
158
225
|
hint="Lo va a leer el local" [error]="intentado() && !motivo()"
|