@ajuarezso/sui-design-system 0.24.1 → 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 +85 -11
- package/docs/sui-activity-feed/README.md +65 -11
- package/docs/sui-activity-filter/README.md +54 -5
- package/docs/sui-alert/README.md +54 -0
- package/docs/sui-app-store-badge/README.md +64 -10
- package/docs/sui-avatar/README.md +92 -29
- package/docs/sui-avatar-group/README.md +75 -9
- package/docs/sui-badge/README.md +85 -17
- package/docs/sui-banner/README.md +85 -20
- package/docs/sui-brand-logo/README.md +95 -31
- package/docs/sui-breadcrumb-item/README.md +54 -3
- package/docs/sui-breadcrumbs/README.md +54 -6
- package/docs/sui-button/README.md +76 -12
- package/docs/sui-button-group/README.md +91 -23
- package/docs/sui-button-group-item/README.md +81 -14
- package/docs/sui-card/README.md +105 -18
- package/docs/sui-chart-legend/README.md +63 -10
- package/docs/sui-chart-legend-dot/README.md +59 -10
- package/docs/sui-checkbox/README.md +109 -29
- package/docs/sui-checkbox-card/README.md +70 -14
- package/docs/sui-checkbox-label/README.md +92 -26
- package/docs/sui-circular-progress-bar/README.md +80 -19
- package/docs/sui-color-dot/README.md +72 -12
- package/docs/sui-color-picker/README.md +71 -13
- package/docs/sui-command-menu-footer/README.md +50 -1
- package/docs/sui-command-menu-item/README.md +74 -14
- package/docs/sui-command-menu-search/README.md +58 -3
- package/docs/sui-compact-avatar-group/README.md +73 -13
- package/docs/sui-compact-button/README.md +123 -34
- package/docs/sui-compact-select/README.md +61 -7
- package/docs/sui-compact-select-for-input/README.md +70 -6
- package/docs/sui-content-card/README.md +75 -14
- package/docs/sui-content-divider/README.md +67 -16
- package/docs/sui-content-label/README.md +99 -20
- package/docs/sui-counter-input/README.md +102 -18
- package/docs/sui-date-selector/README.md +69 -11
- package/docs/sui-datepicker/README.md +85 -18
- package/docs/sui-day-cell/README.md +75 -17
- package/docs/sui-day-label/README.md +56 -7
- package/docs/sui-divider/README.md +64 -9
- package/docs/sui-drawer-footer/README.md +63 -2
- package/docs/sui-drawer-header/README.md +69 -12
- package/docs/sui-dropdown-caption/README.md +58 -6
- package/docs/sui-dropdown-item/README.md +75 -9
- package/docs/sui-dropdown-menu/README.md +83 -14
- package/docs/sui-dropdown-search/README.md +60 -4
- package/docs/sui-emoji/README.md +94 -30
- package/docs/sui-empty-state/README.md +71 -7
- package/docs/sui-fancy-button/README.md +74 -14
- package/docs/sui-file-icon/README.md +70 -12
- package/docs/sui-file-upload/README.md +77 -17
- package/docs/sui-file-upload-card/README.md +64 -12
- package/docs/sui-filter/README.md +83 -14
- package/docs/sui-flag/README.md +73 -8
- package/docs/sui-form-hint/README.md +56 -7
- package/docs/sui-form-label/README.md +57 -5
- package/docs/sui-href/README.md +47 -0
- package/docs/sui-icon/README.md +86 -18
- package/docs/sui-image-upload/README.md +90 -22
- package/docs/sui-image-upload-profile/README.md +70 -11
- package/docs/sui-img-retry/README.md +50 -1
- package/docs/sui-inline-input/README.md +67 -9
- package/docs/sui-inline-select/README.md +62 -2
- package/docs/sui-input/README.md +90 -27
- package/docs/sui-integration-switch/README.md +84 -17
- package/docs/sui-kbd/README.md +73 -9
- package/docs/sui-key-icon/README.md +85 -23
- package/docs/sui-link-button/README.md +96 -27
- package/docs/sui-logo/README.md +93 -22
- package/docs/sui-modal/README.md +72 -13
- package/docs/sui-modal-footer/README.md +86 -12
- package/docs/sui-modal-header/README.md +57 -1
- package/docs/sui-modal-sheet/README.md +74 -12
- package/docs/sui-notification/README.md +81 -11
- package/docs/sui-notification-footer/README.md +55 -5
- package/docs/sui-notification-tab-menu/README.md +61 -5
- package/docs/sui-otp-input/README.md +70 -9
- package/docs/sui-page-header/README.md +89 -19
- package/docs/sui-pagination/README.md +73 -13
- package/docs/sui-password-strength/README.md +50 -1
- package/docs/sui-payment-icon/README.md +80 -18
- package/docs/sui-period-range/README.md +70 -11
- package/docs/sui-popover/README.md +81 -15
- package/docs/sui-product-card/README.md +89 -21
- package/docs/sui-progress-bar/README.md +82 -15
- package/docs/sui-progress-bar-label/README.md +79 -18
- package/docs/sui-radio/README.md +84 -7
- package/docs/sui-radio-card/README.md +70 -16
- package/docs/sui-radio-label/README.md +89 -22
- package/docs/sui-rating/README.md +101 -31
- package/docs/sui-rich-editor/README.md +47 -2
- package/docs/sui-segmented-control/README.md +90 -21
- package/docs/sui-select/README.md +80 -11
- package/docs/sui-sidebar/README.md +71 -16
- package/docs/sui-slider/README.md +75 -8
- package/docs/sui-social-button/README.md +71 -11
- package/docs/sui-status-badge/README.md +75 -14
- package/docs/sui-stepper/README.md +75 -18
- package/docs/sui-store-card/README.md +85 -22
- package/docs/sui-switch/README.md +82 -11
- package/docs/sui-switch-card/README.md +80 -16
- package/docs/sui-switch-label/README.md +91 -14
- package/docs/sui-tab-chips/README.md +93 -21
- package/docs/sui-tab-menu-horizontal/README.md +68 -7
- package/docs/sui-tab-menu-vertical/README.md +64 -11
- package/docs/sui-table/README.md +77 -16
- package/docs/sui-tag/README.md +86 -12
- package/docs/sui-tag-input/README.md +77 -13
- package/docs/sui-textarea/README.md +84 -17
- package/docs/sui-time-picker/README.md +96 -33
- package/docs/sui-toast/README.md +81 -20
- package/docs/sui-tooltip/README.md +80 -22
- package/docs/sui-topbar/README.md +64 -10
- package/docs/sui-topbar-button/README.md +61 -7
- package/docs/sui-topbar-item/README.md +68 -7
- package/docs/sui-topbar-user/README.md +61 -5
- package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
- package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ajuarezso-sui-design-system.d.ts +7 -3
|
@@ -25,7 +25,7 @@ la barra superior, con filas `sui-notification` y la cabecera `sui-notification-
|
|
|
25
25
|
## Qué variante usar
|
|
26
26
|
|
|
27
27
|
> La guía del DS no tiene página para este componente: sale del Figma del DS (pie del panel de
|
|
28
|
-
> notificaciones).
|
|
28
|
+
> notificaciones). Lo marcado **canon** está aprobado; lo que sigue en **propuesta** espera decisión, y «según el componente» describe lo que el código ya hace.
|
|
29
29
|
>
|
|
30
30
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. La app no tiene panel
|
|
31
31
|
> desplegable de campana: su bandeja es una pantalla (`pages/notifications/`).
|
|
@@ -33,10 +33,10 @@ la barra superior, con filas `sui-notification` y la cabecera `sui-notification-
|
|
|
33
33
|
| prop | valor | cuándo | fuente |
|
|
34
34
|
|---|---|---|---|
|
|
35
35
|
| `usePrefix` · `useSuffix` | `'Usa'` · `'para moverte'` | Ya son los defaults (03-10-2026); no hace falta pasarlos. | canon (copy de la app: tuteo, español) |
|
|
36
|
-
| `manage` | `'Ajustes de notificaciones'` | El link a los ajustes. Emite `(manageClick)`. |
|
|
36
|
+
| `manage` | `'Ajustes de notificaciones'` | El link a los ajustes. Emite `(manageClick)`. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
37
37
|
| `manage` | `{ label, href }` | Cuando los ajustes son otra ruta: se dibuja un `<a>` de verdad. | según el componente |
|
|
38
38
|
| `manage` | `true` (default) | Dice «Administrar notificaciones» (en español desde 03-10-2026). | propuesta |
|
|
39
|
-
| `manage` | `false` · `null` | Cuando los ajustes ya están a la vista en el mismo panel. |
|
|
39
|
+
| `manage` | `false` · `null` | Cuando los ajustes ya están a la vista en el mismo panel. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
|
|
40
40
|
|
|
41
41
|
## Tamaño en mobile y en web
|
|
42
42
|
|
|
@@ -44,8 +44,8 @@ la barra superior, con filas `sui-notification` y la cabecera `sui-notification-
|
|
|
44
44
|
|
|
45
45
|
| uso | mobile | web | fuente |
|
|
46
46
|
|---|---|---|---|
|
|
47
|
-
| el pie entero | no aplica: es ayuda de teclado; en mobile no se muestra (el componente no se oculta solo: lo esconde quien lo usa) | 48 px de alto (14 + 20 de la tecla + 14) | alto: según el componente · ocultarlo en mobile:
|
|
48
|
-
| el link de ajustes | si hiciera falta, un `sui-link-button`
|
|
47
|
+
| el pie entero | no aplica: es ayuda de teclado; en mobile no se muestra (el componente no se oculta solo: lo esconde quien lo usa) | 48 px de alto (14 + 20 de la tecla + 14) | alto: según el componente · ocultarlo en mobile: canon (aprobado por el dueño, 05-10-2026, bloque B7) |
|
|
48
|
+
| el link de ajustes | si hiciera falta, un `sui-link-button` suelto: su size en el celular y la tablet sigue **pendiente** (P8 de la tabla D16) | `small` (16 px), fijo dentro del componente | `small` fijo: según el componente · choca con el «nada en `small`» de D16 (el `link-button` va `medium` en la computadora): **pendiente** del componente, quien lo usa no lo puede cambiar |
|
|
49
49
|
|
|
50
50
|
```html
|
|
51
51
|
@if (!bp.isMobile()) {
|
|
@@ -54,6 +54,15 @@ la barra superior, con filas `sui-notification` y la cabecera `sui-notification-
|
|
|
54
54
|
}
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
### Por dispositivo (D16)
|
|
58
|
+
|
|
59
|
+
No aplica: no tiene `size` y solo se usa en la computadora (y el ultrawide), porque la mitad del
|
|
60
|
+
pie es una ayuda de **teclado**; en el celular chico y en el celular no se muestra. En la tablet
|
|
61
|
+
táctil de 768 px o más `bp.isMobile()` lo deja visible y el link de 16 px no llega al piso de 44:
|
|
62
|
+
queda **pendiente**, igual que el resto del panel de la campana (`sui-notification-tab-menu`).
|
|
63
|
+
|
|
64
|
+
En master-pedidos: sin helper; `@if (!bp.isMobile())` alrededor.
|
|
65
|
+
|
|
57
66
|
## «No usar»: por qué no hoy y cuándo sí
|
|
58
67
|
|
|
59
68
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -90,6 +99,47 @@ interface SuiLinkConfig { label: string; href?: string; target?: string; rel?: s
|
|
|
90
99
|
- Ocupa el 100 % del ancho de su contenedor (el Figma lo dibuja de 540 px).
|
|
91
100
|
- Borra el `title` nativo del host.
|
|
92
101
|
|
|
102
|
+
## Bien y mal
|
|
103
|
+
|
|
104
|
+
Link a los ajustes
|
|
105
|
+
|
|
106
|
+
```html
|
|
107
|
+
<!-- ❌ mal: con un texto y sin (manageClick) ni href, el link no lleva a ningún lado (vitrina: pages/super-admin/master-preview/_guia-moleculas/avisos.ts:268) -->
|
|
108
|
+
<sui-notification-footer manage="Ajustes de notificaciones" />
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```html
|
|
112
|
+
<!-- ✅ bien -->
|
|
113
|
+
<sui-notification-footer
|
|
114
|
+
[manage]="{ label: 'Ajustes de notificaciones', href: '/empresa/notificaciones' }" />
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Texto del link
|
|
118
|
+
|
|
119
|
+
```html
|
|
120
|
+
<!-- ❌ mal: sin manage sale «Administrar notificaciones», que no nombra la pantalla a la que lleva -->
|
|
121
|
+
<sui-notification-footer (manageClick)="abrirAjustes()" />
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
```html
|
|
125
|
+
<!-- ✅ bien -->
|
|
126
|
+
<sui-notification-footer manage="Ajustes de notificaciones" (manageClick)="abrirAjustes()" />
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
En el celular
|
|
130
|
+
|
|
131
|
+
```html
|
|
132
|
+
<!-- ❌ mal: «Usa ↑ ↓ para moverte» en una pantalla sin teclado; el componente no se oculta solo -->
|
|
133
|
+
<sui-notification-footer manage="Ajustes de notificaciones" (manageClick)="abrirAjustes()" />
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```html
|
|
137
|
+
<!-- ✅ bien -->
|
|
138
|
+
@if (!bp.isMobile()) {
|
|
139
|
+
<sui-notification-footer manage="Ajustes de notificaciones" (manageClick)="abrirAjustes()" />
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
93
143
|
## Ejemplo
|
|
94
144
|
|
|
95
145
|
```html
|
|
@@ -23,18 +23,18 @@ Archivadas» con el filtro a la derecha, encima de las filas `sui-notification`.
|
|
|
23
23
|
## Qué variante usar
|
|
24
24
|
|
|
25
25
|
> La guía del DS no tiene página para este componente: sale del Figma del DS (cabecera del panel
|
|
26
|
-
> de notificaciones).
|
|
26
|
+
> de notificaciones). Lo marcado **canon** está aprobado por el dueño; «según el componente» describe lo que el código ya hace.
|
|
27
27
|
>
|
|
28
28
|
> Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos** (no hay panel de campana).
|
|
29
29
|
|
|
30
30
|
| prop | valor | cuándo | fuente |
|
|
31
31
|
|---|---|---|---|
|
|
32
|
-
| `tabs` | 2 a 4 pestañas | «Todas» primero, luego «No leídas» y los grupos del rol (Pedidos, Promos, Encargos…). Más de 4 no caben en el panel. |
|
|
32
|
+
| `tabs` | 2 a 4 pestañas | «Todas» primero, luego «No leídas» y los grupos del rol (Pedidos, Promos, Encargos…). Más de 4 no caben en el panel. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
33
33
|
| `tabs[].badge` | número > 0 | El conteo de **no leídas**, solo en la pestaña donde importa. Es un `sui-badge` rojo lleno: un conteo que pide acción. | según el componente · regla de badge: canon |
|
|
34
34
|
| `tabs[].dividerBefore` | `true` | Separa lo que no es bandeja activa: «Archivadas» al final. | según el componente (Figma) |
|
|
35
35
|
| `[(active)]` | el `value` de la pestaña | Siempre enlazado: es un model de dos vías. | según el componente |
|
|
36
|
-
| `showFilter` | `true` (default) | Solo si el panel tiene filtros de verdad (por local, por fecha). |
|
|
37
|
-
| `showFilter` | `false` | Lo normal: sin filtros, un botón que no hace nada estorba. |
|
|
36
|
+
| `showFilter` | `true` (default) | Solo si el panel tiene filtros de verdad (por local, por fecha). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
37
|
+
| `showFilter` | `false` | Lo normal: sin filtros, un botón que no hace nada estorba. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
38
38
|
| `filterLabel` | texto | El nombre del botón de filtro para el lector de pantalla. Default «Filtrar». | según el componente |
|
|
39
39
|
|
|
40
40
|
## Tamaño en mobile y en web
|
|
@@ -49,12 +49,29 @@ texto) y el filtro es un compact-button de 24 px.
|
|
|
49
49
|
|
|
50
50
|
```html
|
|
51
51
|
@if (bp.isMobile()) {
|
|
52
|
-
<sui-tab-chips [chips]="pestanas" [
|
|
52
|
+
<sui-tab-chips [chips]="pestanas" [size]="bp.sizeChips()"
|
|
53
|
+
[value]="activa()" (valueChange)="activa.set($event)" />
|
|
53
54
|
} @else {
|
|
54
55
|
<sui-notification-tab-menu [tabs]="pestanas" [(active)]="activa" [showFilter]="false" />
|
|
55
56
|
}
|
|
56
57
|
```
|
|
57
58
|
|
|
59
|
+
### Por dispositivo (D16)
|
|
60
|
+
|
|
61
|
+
No aplica: no tiene `size` y es solo de la computadora (y el ultrawide). En el celular va
|
|
62
|
+
`sui-tab-chips` con `[size]="bp.sizeChips()"` (`xlarge`, fila `tab-chips` de D16). En el celular
|
|
63
|
+
chico el helper también da `xlarge`, pero es interino: la fila `tab-chips` pide `medium` con área
|
|
64
|
+
tocable de 44, y mientras el DS no estire el área de los `medium` se queda el size grande (nota ¹
|
|
65
|
+
de D16).
|
|
66
|
+
Lo que trae fijo adentro: el filtro es un `sui-compact-button` `large` (24), que cuadra con la
|
|
67
|
+
computadora; el conteo es un `sui-badge` `small`, que choca con el «nada en `small`» de D16 y
|
|
68
|
+
queda **pendiente** del componente (quien lo usa no lo puede cambiar). En la tablet táctil de
|
|
69
|
+
768 px o más `bp.isMobile()` lo deja visible con pestañas de 20 y filtro de 24, lejos del piso de
|
|
70
|
+
44: queda **pendiente**, igual que el resto del panel de la campana.
|
|
71
|
+
|
|
72
|
+
En master-pedidos: sin helper; `@if (bp.isMobile())` elige `sui-tab-chips` con
|
|
73
|
+
`[size]="bp.sizeChips()"`, y si no, este componente.
|
|
74
|
+
|
|
58
75
|
## «No usar»: por qué no hoy y cuándo sí
|
|
59
76
|
|
|
60
77
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -101,6 +118,45 @@ interface SuiNotificationTab<T = string> {
|
|
|
101
118
|
04-10-2026) y cada una es `role="tab"` con `aria-selected`. Un solo tab stop: ← → mueven y
|
|
102
119
|
activan con vuelta al inicio, Home/End a los extremos. No hay `tabpanel` asociado: lo arma quien lo usa.
|
|
103
120
|
|
|
121
|
+
## Bien y mal
|
|
122
|
+
|
|
123
|
+
Pestañas en el celular
|
|
124
|
+
|
|
125
|
+
```html
|
|
126
|
+
<!-- ❌ mal: cada pestaña mide 20 px de alto, lejos de los 44 del dedo -->
|
|
127
|
+
<sui-notification-tab-menu [tabs]="pestanas" [(active)]="activa" [showFilter]="false" />
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
```html
|
|
131
|
+
<!-- ✅ bien -->
|
|
132
|
+
<sui-tab-chips [chips]="pestanas" [size]="bp.sizeChips()"
|
|
133
|
+
[value]="activa()" (valueChange)="activa.set($event)" />
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Pestaña activa
|
|
137
|
+
|
|
138
|
+
```html
|
|
139
|
+
<!-- ❌ mal: active fijo; la pestaña cambia adentro pero la página no se entera (vitrina: pages/super-admin/master-preview/_guia-moleculas/avisos.ts:264) -->
|
|
140
|
+
<sui-notification-tab-menu [tabs]="pestanas" active="todas" [showFilter]="false" />
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
```html
|
|
144
|
+
<!-- ✅ bien -->
|
|
145
|
+
<sui-notification-tab-menu [tabs]="pestanas" [(active)]="pestana" [showFilter]="false" />
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Botón de filtro
|
|
149
|
+
|
|
150
|
+
```html
|
|
151
|
+
<!-- ❌ mal: showFilter arranca en true; sin filtros de verdad sale un botón que no hace nada -->
|
|
152
|
+
<sui-notification-tab-menu [tabs]="pestanas" [(active)]="pestana" />
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
```html
|
|
156
|
+
<!-- ✅ bien -->
|
|
157
|
+
<sui-notification-tab-menu [tabs]="pestanas" [(active)]="pestana" [showFilter]="false" />
|
|
158
|
+
```
|
|
159
|
+
|
|
104
160
|
## Ejemplo
|
|
105
161
|
|
|
106
162
|
```html
|
|
@@ -36,19 +36,20 @@ Regla corta: **código corto que llega por otro canal → otp · cupón o clave
|
|
|
36
36
|
| prop / evento | cuándo | fuente |
|
|
37
37
|
|---|---|---|
|
|
38
38
|
| `type="number"` (default) | Códigos numéricos: teclado de números. | según la guía del DS (códigos numéricos) |
|
|
39
|
-
| `type="text"` | No usar hoy: un código con letras se tipea mejor en un `sui-input`. |
|
|
39
|
+
| `type="text"` | No usar hoy: un código con letras se tipea mejor en un `sui-input`. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
|
|
40
40
|
| `length` | `6` para un SMS (lo que manda Firebase); `4` para un código de entrega dictado en voz alta. | propuesta, falta aprobación |
|
|
41
41
|
| `error` | El código no coincide. Pinta todas las celdas; el mensaje va aparte, debajo. | según la guía del DS (ejemplo con error) |
|
|
42
42
|
| `disabled` | Mientras se verifica el código. | según la guía del DS (ejemplo deshabilitado) |
|
|
43
|
-
| `ariaLabel` | Qué código es: «Código que te llegó por SMS». El default es «Código de verificación». |
|
|
44
|
-
| `(completed)` | Verificar apenas se llena, sin botón «Continuar». |
|
|
43
|
+
| `ariaLabel` | Qué código es: «Código que te llegó por SMS». El default es «Código de verificación». | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
|
|
44
|
+
| `(completed)` | Verificar apenas se llena, sin botón «Continuar». | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
|
|
45
45
|
|
|
46
46
|
## Tamaño en mobile y en web
|
|
47
47
|
|
|
48
48
|
Tiene `size` (extensión SUI) para la celda. `large` es el de la guía y el default: **80 × 64** con 8
|
|
49
49
|
px entre celdas (6 celdas = 520 px). Para el teléfono, **`medium` (52 × 56)**: 6 celdas miden 352
|
|
50
|
-
px y entran en los 358 útiles de una pantalla de 390. `small` (44 × 48, dígito de 20)
|
|
51
|
-
360 px
|
|
50
|
+
px y entran en los 358 útiles de una pantalla de 390. `small` (44 × 48, dígito de 20) **no se usa**:
|
|
51
|
+
en 360 px el `medium` se achica solo a unos 48 × 56 y sigue por encima de 44 (D16, dueño
|
|
52
|
+
05-10-2026: nada en `small`; reemplaza el «`small` para 360 px» del 03-10-2026).
|
|
52
53
|
|
|
53
54
|
Además, **el componente nunca es más ancho que su contenedor**: si las celdas no entran, se achican
|
|
54
55
|
parejo en vez de salirse de la pantalla (un `large` de 6 en 390 queda en celdas de 53 × 64). Es la red
|
|
@@ -58,25 +59,45 @@ de seguridad, no el tamaño a elegir: se ve angosto y alto.
|
|
|
58
59
|
|---|---|---|---|
|
|
59
60
|
| `large` (default) | 80 × 64 · dígito 24 | 520 px | según la guía del DS |
|
|
60
61
|
| `medium` | 52 × 56 · dígito 24 | 352 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
61
|
-
| `small` | 44 × 48 · dígito 20 | 304 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
|
|
62
|
+
| `small` | 44 × 48 · dígito 20 | 304 px | canon (aprobado por el dueño, 03-10-2026), extensión SUI · no se usa: D16, dueño 05-10-2026 |
|
|
62
63
|
|
|
63
64
|
| uso | mobile (390) | web | fuente |
|
|
64
65
|
|---|---|---|---|
|
|
65
|
-
| código de 6 dígitos | `medium` | `large` |
|
|
66
|
-
| código de 4 dígitos | `large` (344 px, entra) | `large` |
|
|
66
|
+
| código de 6 dígitos | `medium` | `large` | canon (aprobado por el dueño, 05-10-2026, bloque B1) · la mitad web queda pendiente frente a D16 (ver «Por dispositivo») |
|
|
67
|
+
| código de 4 dígitos | `large` (344 px, entra) | `large` | canon (aprobado por el dueño, 05-10-2026, bloque B1) · la mitad web queda pendiente frente a D16 (ver «Por dispositivo») |
|
|
67
68
|
|
|
68
69
|
```html
|
|
69
70
|
<sui-otp-input [length]="6" [size]="bp.isMobile() ? 'medium' : 'large'" [(value)]="codigo" />
|
|
70
71
|
<!-- bp = BreakpointsService -->
|
|
71
72
|
```
|
|
72
73
|
|
|
74
|
+
### Por dispositivo (D16)
|
|
75
|
+
|
|
76
|
+
Las celdas se tocan, pero aquí el `size` lo elige **el ancho** (que las celdas entren), no el
|
|
77
|
+
puntero: las tres miden 48 o más de alto, así que cualquiera se toca bien. Fuente: D16, dueño
|
|
78
|
+
05-10-2026, y el bloque B1 (05-10-2026).
|
|
79
|
+
|
|
80
|
+
| dispositivo | size | nota |
|
|
81
|
+
|---|---|---|
|
|
82
|
+
| celular chico (< 380) | `medium` (6 dígitos) · `large` (4) | 6 `medium` no entran en los 328 útiles de 360: se achican solos a unos 48 × 56 y siguen tocables. Nada en `small` |
|
|
83
|
+
| celular (380–767) | `medium` (6 dígitos) · `large` (4) | 6 `medium` miden 352 y entran en los 358 útiles de 390; 4 `large` miden 344 |
|
|
84
|
+
| tablet táctil (`pointer: coarse`) | `large` desde 768 px · por debajo (iPad mini vertical, 744), como el celular: `medium` con 6 dígitos | aquí manda el ancho, no el puntero: es lo que da `bp.isMobile()` (hasta 767). Las dos celdas pasan los 44 |
|
|
85
|
+
| computadora (`pointer: fine`) | **pendiente** (`large` por ahora) | el bloque B1 (aprobado el 05-10-2026) dio `large` en web; la regla general de D16 (la misma tarde) da `medium` en lo que se toca. Pero el `medium` del otp es la celda angosta para que 6 entren en el teléfono (52 × 56), no un tamaño de escritorio. Falta que el dueño diga si D16 pisa a B1 aquí; mientras tanto se queda el `large` de B1, que es el default (interino) |
|
|
86
|
+
|
|
87
|
+
En el ultrawide, igual que en la computadora: el espacio extra no agranda las celdas.
|
|
88
|
+
|
|
89
|
+
En master-pedidos: `[size]="bp.isMobile() ? 'medium' : 'large'"` con 6 dígitos; con 4, sin `size`
|
|
90
|
+
(`large` es el default). El `'large'` de la computadora es el interino de B1 mientras la fila sigue
|
|
91
|
+
pendiente. No hay helper: `bp.sizeControl()` da `large` en el celular, y 6 celdas
|
|
92
|
+
`large` no entran.
|
|
93
|
+
|
|
73
94
|
## «No usar»: por qué no hoy y cuándo sí
|
|
74
95
|
|
|
75
96
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
76
97
|
|---|---|---|
|
|
77
98
|
| el componente entero (0 usos) | no hay verificación por código | verificar el teléfono del cliente por SMS, o un código de entrega de 4 dígitos que el cliente le dicta al repartidor |
|
|
78
99
|
| `type="text"` | los códigos que llegan son numéricos | un código alfanumérico corto de una campaña |
|
|
79
|
-
| `size="small"` | `medium` ya entra en 390 |
|
|
100
|
+
| `size="small"` | `medium` ya entra en 390 | ninguno: en 360 px el `medium` se achica solo a 48 × 56 (D16, dueño 05-10-2026: nada en `small`) |
|
|
80
101
|
|
|
81
102
|
## API
|
|
82
103
|
|
|
@@ -108,6 +129,46 @@ de seguridad, no el tamaño a elegir: se ve angosto y alto.
|
|
|
108
129
|
- `disabled` es un `model`: si el formulario lo deshabilita, el componente lo escribe de vuelta.
|
|
109
130
|
- No hay grupos (3-3): si se necesitan, son dos componentes.
|
|
110
131
|
|
|
132
|
+
## Bien y mal
|
|
133
|
+
|
|
134
|
+
Código de 6 dígitos en el teléfono
|
|
135
|
+
|
|
136
|
+
```html
|
|
137
|
+
<!-- ❌ mal: sin size va large; 6 celdas de 80 no entran en 390 y se aplastan a 53 × 64. No hay usos en la app: la vitrina aún lo muestra así, marcado como propuesta y con la nota «falta una celda angosta en el DS», que ya existe (medium) (pages/super-admin/master-preview/_guia-moleculas/campos.ts:322) -->
|
|
138
|
+
<sui-otp-input [length]="6" ariaLabel="Código que te llegó por SMS" [(value)]="codigo" />
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
```html
|
|
142
|
+
<!-- ✅ bien -->
|
|
143
|
+
<sui-otp-input [length]="6" ariaLabel="Código que te llegó por SMS"
|
|
144
|
+
[size]="bp.isMobile() ? 'medium' : 'large'" [(value)]="codigo" />
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Código que no coincide
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<!-- ❌ mal: error solo pinta las celdas; nadie dice qué pasó -->
|
|
151
|
+
<sui-otp-input [length]="4" ariaLabel="Código de entrega" [error]="codigoMalo()" [(value)]="codigo" />
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
```html
|
|
155
|
+
<!-- ✅ bien -->
|
|
156
|
+
<sui-otp-input [length]="4" ariaLabel="Código de entrega" [error]="codigoMalo()" [(value)]="codigo" />
|
|
157
|
+
@if (codigoMalo()) { <sui-form-hint variant="error" message="El código no coincide" /> }
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Un cupón con letras
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<!-- ❌ mal: más de 6 caracteres y con letras no es un otp -->
|
|
164
|
+
<sui-otp-input [length]="8" type="text" ariaLabel="Cupón" [(value)]="cupon" />
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```html
|
|
168
|
+
<!-- ✅ bien -->
|
|
169
|
+
<sui-input label="Cupón" [size]="bp.sizeControl()" [(value)]="cupon" />
|
|
170
|
+
```
|
|
171
|
+
|
|
111
172
|
## Ejemplo
|
|
112
173
|
|
|
113
174
|
```html
|
|
@@ -27,13 +27,15 @@ toda la pantalla («Agregar», «Exportar»).
|
|
|
27
27
|
## Qué variante usar
|
|
28
28
|
|
|
29
29
|
> **No está en la guía del DS: es extensión de SUI.** Nació como el título de las pantallas del
|
|
30
|
-
> panel de empresa y no tiene Figma. Lo marcado **canon** sale de `master-pedidos/docs/CANON-SUI.md
|
|
31
|
-
> lo
|
|
30
|
+
> panel de empresa y no tiene Figma. Lo marcado **canon** sale de `master-pedidos/docs/CANON-SUI.md` o de la aprobación del dueño (05-10-2026);
|
|
31
|
+
> lo marcado «componente» describe lo que el código ya hace. No queda nada en propuesta.
|
|
32
32
|
>
|
|
33
|
-
> Uso medido el
|
|
34
|
-
> vitrinas (`master-preview`, `master-prototipos`, `
|
|
35
|
-
> `master-medico
|
|
36
|
-
>
|
|
33
|
+
> Uso medido el 06-10-2026 en `master-pedidos/src/app`: 70 page headers en total y **66** sin contar
|
|
34
|
+
> prototipos ni vitrinas (1 en cada uno: `master-preview`, `master-prototipos`, `master-rutina` y
|
|
35
|
+
> `master-medico`; `mockup-sheets-*`, `dx/*`, `dev-index` y las copias de `components/sui/` no
|
|
36
|
+
> tienen). Un `grep` da 72 porque cuenta 2 comentarios (`master-preview.scss:1`, `envios.ts:923`).
|
|
37
|
+
> De los 66: 51 llevan `subtitle` fijo y 15 calculado; 17 tienen algo en
|
|
38
|
+
> `slot="actions"` (15 botones y 2 solo badges: `master-drivers`, `master-approvals`); 0 usan `sticky`.
|
|
37
39
|
|
|
38
40
|
### Lo que sí dice la guía del DS
|
|
39
41
|
|
|
@@ -45,18 +47,24 @@ escala del DS** (CANON-SUI §7): si se homologa, sería `title-h5`.
|
|
|
45
47
|
| pieza | regla | ejemplo real de la app | fuente |
|
|
46
48
|
|---|---|---|---|
|
|
47
49
|
| `title` | El nombre de la pantalla, el mismo que en el menú. Sentence case, sin punto. Nunca un ID. | `pages/discounts/discounts.html:2` | canon (CANON-SUI, copy) |
|
|
48
|
-
| `subtitle` | Una línea que dice **qué se hace aquí**, no que repite el título. | `pages/super-admin/master-orders/master-orders.html:1` |
|
|
49
|
-
| acciones | Las que valen para toda la pantalla: una `filled` como máximo (la principal) y el resto `stroke`. Hoy:
|
|
50
|
+
| `subtitle` | Una línea que dice **qué se hace aquí**, no que repite el título. | `pages/super-admin/master-orders/master-orders.html:1` | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
51
|
+
| acciones | Las que valen para toda la pantalla: una `filled` como máximo (la principal) y el resto `stroke`. Hoy, de los 16 botones que se dibujan: 10 `filled` (uno por default, sin `variant`: `master-gastos.html:8`) y 6 `stroke`. | `pages/drivers/drivers.html:2` | canon (CANON-SUI §6.2: una sola primaria por pantalla; CLAUDE.md «Botones — composición y orden», 27-07-2026: uno solo `filled`, el secundario `stroke` `neutral`) |
|
|
50
52
|
|
|
51
|
-
**Usos de hoy que rompen
|
|
52
|
-
|
|
53
|
+
**Usos de hoy que rompen** (medido el 06-10-2026):
|
|
54
|
+
|
|
55
|
+
- `pages/orders/orders.html:14`: el botón «Actualizar» va sin `slot="actions"`, así que no se
|
|
56
|
+
proyecta y no se dibuja en ningún ancho (ver «Bien y mal»).
|
|
57
|
+
|
|
58
|
+
Los cuatro botones en Title Case que había (`drivers.html:8`, `discounts.html:7`,
|
|
59
|
+
`employees.html:7`, `locations.html:7`) ya van en sentence case desde el commit `8b34d8ed`
|
|
60
|
+
(06-10-2026) de master-pedidos.
|
|
53
61
|
|
|
54
62
|
### `sticky`
|
|
55
63
|
|
|
56
64
|
| valor | cuándo | fuente |
|
|
57
65
|
|---|---|---|
|
|
58
|
-
| `false` (default) | el caso normal: el título se va con el scroll |
|
|
59
|
-
| `true` | listas largas donde las acciones del header se usan mientras se recorre (filtros, «Agregar»). Le pone fondo blanco. 0 usos hoy |
|
|
66
|
+
| `false` (default) | el caso normal: el título se va con el scroll | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
67
|
+
| `true` | listas largas donde las acciones del header se usan mientras se recorre (filtros, «Agregar»). Le pone fondo blanco. 0 usos hoy | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
60
68
|
|
|
61
69
|
## Tamaño en mobile y en web
|
|
62
70
|
|
|
@@ -68,17 +76,37 @@ El page header **no tiene `size`**. Cambia solo en 767 px:
|
|
|
68
76
|
| disposición | título y subtítulo arriba, acciones **debajo** | título a la izquierda, acciones a la derecha, alineadas abajo | componente |
|
|
69
77
|
| padding vertical | 24 arriba y abajo | 32 arriba, 16 abajo | componente |
|
|
70
78
|
| padding lateral | ninguno: lo pone el contenedor del layout | igual | componente |
|
|
71
|
-
| botones de las acciones | `large` (48) | `
|
|
79
|
+
| botones de las acciones | `large` (48) | `medium` (40) | mobile `large`: canon (decisión del dueño 04-10-2026, piso táctil 44) · web `medium`: canon (dueño, 05-10-2026, D16), reemplaza el `small` del bloque B1 |
|
|
72
80
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
van al lado del título de 28
|
|
81
|
+
En mobile, `large` es canon (piso táctil 44, 04-10-2026: `small` y `medium` no llegan); en la
|
|
82
|
+
computadora va `medium` y la tablet va como el celular (canon, dueño, 05-10-2026, D16; reemplaza el
|
|
83
|
+
`small` del bloque B1): en mobile las acciones bajan a su fila y tienen sitio para 48 px; en desktop
|
|
84
|
+
van al lado del título de 28. Medido el 06-10-2026: 66 page headers (sin vitrinas ni prototipos),
|
|
85
|
+
16 botones en las acciones, los 16 con `bp.sizeControl()` (ya no queda ningún `small`). Hay un
|
|
86
|
+
botón 17 dentro de un page header, también con `bp.sizeControl()`, pero va sin `slot="actions"` y no
|
|
87
|
+
se dibuja (`pages/orders/orders.html:14`).
|
|
77
88
|
|
|
78
89
|
```html
|
|
79
|
-
<sui-button [size]="bp.
|
|
90
|
+
<sui-button [size]="bp.sizeControl()" slot="actions">Agregar</sui-button>
|
|
80
91
|
```
|
|
81
92
|
|
|
93
|
+
### Por dispositivo (D16)
|
|
94
|
+
|
|
95
|
+
El header no tiene `size`: lo que cambia por dispositivo son **los botones de las acciones**, que
|
|
96
|
+
se tocan. Fuente: D16, dueño 05-10-2026 (fila `page-header (acciones)`).
|
|
97
|
+
|
|
98
|
+
| dispositivo | size | nota |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| celular chico (< 380) | `large` por ahora | D16 pide `medium` con área tocable de 44; el DS todavía no la estira, así que se queda el grande (interino) |
|
|
101
|
+
| celular (380–767) | `large` | las acciones bajan a su propia fila |
|
|
102
|
+
| tablet táctil (`pointer: coarse`) | `large` | Apple pide 44 también en el iPad; a 767 px o más las acciones ya van al lado del título |
|
|
103
|
+
| computadora (`pointer: fine`) | `medium` | al lado del título de 28 |
|
|
104
|
+
|
|
105
|
+
En el ultrawide, igual que en la computadora: el espacio extra no agranda los botones.
|
|
106
|
+
|
|
107
|
+
En master-pedidos: `[size]="bp.sizeControl()"` en cada `sui-button` de las acciones. No uses
|
|
108
|
+
`bp.isMobile() ? 'large' : 'medium'`: en el iPad `isMobile` es falso y el botón queda en 40.
|
|
109
|
+
|
|
82
110
|
## API
|
|
83
111
|
|
|
84
112
|
<!-- api:inicio -->
|
|
@@ -111,12 +139,54 @@ Slot: `slot="actions"`, a la derecha (desktop) o debajo (mobile), gap 8. No hay
|
|
|
111
139
|
- `title` es requerido: sin él, Angular falla al compilar la plantilla.
|
|
112
140
|
- El host borra el atributo `title` nativo (sin tooltip gris del navegador).
|
|
113
141
|
|
|
142
|
+
## Bien y mal
|
|
143
|
+
|
|
144
|
+
Botón de la pantalla
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<!-- ❌ mal: sin slot="actions" el botón no se dibuja en ningún ancho (pages/orders/orders.html:14) -->
|
|
148
|
+
<sui-page-header title="Pedidos" subtitle="Lo que está en curso y todo lo que pasó por tu local.">
|
|
149
|
+
<sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()" (click)="refresh()">Actualizar</sui-button>
|
|
150
|
+
</sui-page-header>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```html
|
|
154
|
+
<!-- ✅ bien -->
|
|
155
|
+
<sui-page-header title="Pedidos" subtitle="Lo que está en curso y todo lo que pasó por tu local.">
|
|
156
|
+
<sui-button slot="actions" variant="stroke" color="neutral" [size]="bp.sizeControl()" (click)="refresh()">Actualizar</sui-button>
|
|
157
|
+
</sui-page-header>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Texto de la acción
|
|
161
|
+
|
|
162
|
+
```html
|
|
163
|
+
<!-- ❌ mal: Title Case; los botones van en sentence case (así estaba pages/locations/locations.html:7 hasta el 06-10-2026) -->
|
|
164
|
+
<sui-button slot="actions" variant="filled" color="primary" [size]="bp.sizeControl()">Agregar Sucursal</sui-button>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```html
|
|
168
|
+
<!-- ✅ bien -->
|
|
169
|
+
<sui-button slot="actions" variant="filled" color="primary" [size]="bp.sizeControl()">Agregar sucursal</sui-button>
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Tamaño de la acción
|
|
173
|
+
|
|
174
|
+
```html
|
|
175
|
+
<!-- ❌ mal: isMobile no mira el puntero; en el iPad el botón queda en medium (40) -->
|
|
176
|
+
<sui-button slot="actions" variant="filled" [size]="bp.isMobile() ? 'large' : 'medium'">Crear descuento</sui-button>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
```html
|
|
180
|
+
<!-- ✅ bien -->
|
|
181
|
+
<sui-button slot="actions" variant="filled" [size]="bp.sizeControl()">Crear descuento</sui-button>
|
|
182
|
+
```
|
|
183
|
+
|
|
114
184
|
## Ejemplo
|
|
115
185
|
|
|
116
186
|
```html
|
|
117
187
|
<sui-page-header title="Descuentos" subtitle="Promociones y campañas activas de tu negocio.">
|
|
118
188
|
<sui-button slot="actions" variant="filled"
|
|
119
|
-
[size]="bp.
|
|
189
|
+
[size]="bp.sizeControl()" (click)="crear()">
|
|
120
190
|
Crear descuento
|
|
121
191
|
</sui-button>
|
|
122
192
|
</sui-page-header>
|
|
@@ -46,30 +46,30 @@ Regla corta: **tabla con todo cargado en web → pagination · lista de Firestor
|
|
|
46
46
|
|
|
47
47
|
| type | cuándo | fuente |
|
|
48
48
|
|---|---|---|
|
|
49
|
-
| `basic` (default) | El normal, debajo de una tabla con bordes. | según la guía del DS (es su default); el cuándo
|
|
50
|
-
| `group` | Cuando la tabla va dentro de una card y la paginación se apoya en su borde: un solo bloque se lee como parte de la tabla. | según la guía del DS (la forma existe); el cuándo
|
|
49
|
+
| `basic` (default) | El normal, debajo de una tabla con bordes. | según la guía del DS (es su default); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
50
|
+
| `group` | Cuando la tabla va dentro de una card y la paginación se apoya en su borde: un solo bloque se lee como parte de la tabla. | según la guía del DS (la forma existe); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
|
|
51
51
|
| `full-radius` | No: el resto de los controles de la app (botones, inputs) tienen esquinas de 8-10, no círculos. | según la guía del DS (la forma existe); el no es propuesta |
|
|
52
52
|
|
|
53
53
|
### `size`
|
|
54
54
|
|
|
55
55
|
| size | qué mide | cuándo | fuente |
|
|
56
56
|
|---|---|---|---|
|
|
57
|
-
| `medium` (default) | celdas de 32 px | Web, debajo de una tabla. | extensión de SUI (la guía tiene un tamaño); el cuándo
|
|
58
|
-
| `small` | celdas de 28 px |
|
|
57
|
+
| `medium` (default) | celdas de 32 px | Web, siempre: debajo de una tabla y en un modal o panel angosto. | extensión de SUI (la guía tiene un tamaño); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B1) · también en paneles angostos: canon (dueño, 05-10-2026, D16) |
|
|
58
|
+
| `small` | celdas de 28 px | No usar: es chico. En un modal o panel angosto va `medium`. | canon (dueño, 05-10-2026, D16), reemplaza el «cuándo» del bloque B1 |
|
|
59
59
|
|
|
60
60
|
### Botones y texto
|
|
61
61
|
|
|
62
62
|
| input | valor | cuándo | fuente |
|
|
63
63
|
|---|---|---|---|
|
|
64
64
|
| `nextPrevious` | `true` (default) | Siempre. | según la guía del DS |
|
|
65
|
-
| `firstLast` | `false` (default) | Lo normal: con las elipsis ya se ve la primera y la última. |
|
|
66
|
-
| `firstLast` | `true` | Más de 20 páginas, donde ir al final es un caso de uso (la última semana de un export). | según la guía del DS (los botones existen); el cuándo
|
|
67
|
-
| `siblingCount` | `1` (default) | Siempre. Más números a cada lado ensanchan sin ayudar. |
|
|
68
|
-
| `showInfo` | `true` (default) | Con `infoFormat="items"`: «Mostrando 11-20 de 134». |
|
|
65
|
+
| `firstLast` | `false` (default) | Lo normal: con las elipsis ya se ve la primera y la última. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
66
|
+
| `firstLast` | `true` | Más de 20 páginas, donde ir al final es un caso de uso (la última semana de un export). | según la guía del DS (los botones existen); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
67
|
+
| `siblingCount` | `1` (default) | Siempre. Más números a cada lado ensanchan sin ayudar. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
68
|
+
| `showInfo` | `true` (default) | Con `infoFormat="items"`: «Mostrando 11-20 de 134». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
69
69
|
| `infoFormat` | `'items'` (default) | «Mostrando 11-20 de 134». | según el código |
|
|
70
|
-
| `infoFormat` | `'pages'` | Imprime «Página 2 de 14» (en español desde 03-10-2026). Cuando no se sabe el total de ítems o no importa. |
|
|
71
|
-
| `pageSizeOptions` | `[]` (default) | Lo normal: sin selector de filas por página. |
|
|
72
|
-
| `pageSizeOptions` | `[10, 25, 50]` | Las opciones dicen «10 / página» (en español desde 03-10-2026). |
|
|
70
|
+
| `infoFormat` | `'pages'` | Imprime «Página 2 de 14» (en español desde 03-10-2026). Cuando no se sabe el total de ítems o no importa. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
|
|
71
|
+
| `pageSizeOptions` | `[]` (default) | Lo normal: sin selector de filas por página. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
72
|
+
| `pageSizeOptions` | `[10, 25, 50]` | Las opciones dicen «10 / página» (en español desde 03-10-2026). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
|
|
73
73
|
|
|
74
74
|
Usos de hoy que rompen las reglas: **0** (no se usa).
|
|
75
75
|
|
|
@@ -80,8 +80,8 @@ mobile no se usa.
|
|
|
80
80
|
|
|
81
81
|
| uso | mobile | web | fuente |
|
|
82
82
|
|---|---|---|---|
|
|
83
|
-
| debajo de una tabla | no se usa: scroll infinito | `medium` (32) |
|
|
84
|
-
| tabla en un panel angosto | no se usa | `
|
|
83
|
+
| debajo de una tabla | no se usa: scroll infinito | `medium` (32) | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
|
|
84
|
+
| tabla en un panel angosto | no se usa | `medium` (32) | no se usa en mobile: canon (aprobado por el dueño, 05-10-2026, bloque B7) · web: canon (dueño, 05-10-2026, D16), antes `small` |
|
|
85
85
|
|
|
86
86
|
```html
|
|
87
87
|
@if (!bp.isMobile()) {
|
|
@@ -89,6 +89,26 @@ mobile no se usa.
|
|
|
89
89
|
}
|
|
90
90
|
```
|
|
91
91
|
|
|
92
|
+
### Por dispositivo (D16)
|
|
93
|
+
|
|
94
|
+
Las celdas se tocan, pero ningún `size` llega a 44 (el más grande mide 32). Fuente: D16, dueño
|
|
95
|
+
05-10-2026 (fila `pagination`).
|
|
96
|
+
|
|
97
|
+
| dispositivo | size | nota |
|
|
98
|
+
|---|---|---|
|
|
99
|
+
| celular chico (< 380) | no se usa | scroll infinito |
|
|
100
|
+
| celular (380–767) | no se usa | scroll infinito |
|
|
101
|
+
| tablet táctil (`pointer: coarse`) | **pendiente** | con 32 px tiene el mismo problema que en el celular: celdas por debajo de 44 para el dedo. Falta que el dueño decida qué va en la tablet |
|
|
102
|
+
| computadora (`pointer: fine`) | `medium` | también en un modal o panel angosto. `small` no se usa |
|
|
103
|
+
|
|
104
|
+
En el ultrawide, igual que en la computadora: el espacio extra va a más columnas de la tabla, no a
|
|
105
|
+
celdas más grandes.
|
|
106
|
+
|
|
107
|
+
En master-pedidos no hay helper: `size` no se pasa (`medium` es el default) y el componente va
|
|
108
|
+
dentro de `@if (!bp.isMobile())`. Ojo: con esa condición el iPad (768 px o más) **sí** lo muestra,
|
|
109
|
+
en 32 px; es justo el caso pendiente, y no se resuelve cambiando a `bp.tactil()` hasta que el dueño
|
|
110
|
+
decida.
|
|
111
|
+
|
|
92
112
|
## «No usar»: por qué no hoy y cuándo sí
|
|
93
113
|
|
|
94
114
|
| qué | por qué no hoy | cuándo sí, en un flujo nuevo |
|
|
@@ -142,6 +162,46 @@ type SuiPaginationInfoFormat = 'items' | 'pages';
|
|
|
142
162
|
- **Con `total` en 0 no dibuja el texto**, pero sí los botones (una sola página «1»). Ocúltalo tú.
|
|
143
163
|
- Las flechas son `<i class="ri-…">`: necesitan la fuente de Remix Icon cargada.
|
|
144
164
|
|
|
165
|
+
## Bien y mal
|
|
166
|
+
|
|
167
|
+
Lista en el celular
|
|
168
|
+
|
|
169
|
+
```html
|
|
170
|
+
<!-- ❌ mal: en el celular no se usa; las celdas de 32 no llegan a 44 -->
|
|
171
|
+
<sui-pagination [total]="filas().length" [(currentPage)]="pagina" [pageSize]="25" />
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```html
|
|
175
|
+
<!-- ✅ bien -->
|
|
176
|
+
@if (!bp.isMobile()) {
|
|
177
|
+
<sui-pagination [total]="filas().length" [(currentPage)]="pagina" [pageSize]="25" />
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Tabla en un panel angosto
|
|
182
|
+
|
|
183
|
+
```html
|
|
184
|
+
<!-- ❌ mal: small (28) no se usa; la vitrina aún lo marca como propuesta (pages/super-admin/master-preview/_guia-moleculas/navegacion.ts:169) -->
|
|
185
|
+
<sui-pagination [total]="134" [(currentPage)]="pagina" size="small" [showInfo]="false" />
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```html
|
|
189
|
+
<!-- ✅ bien -->
|
|
190
|
+
<sui-pagination [total]="134" [(currentPage)]="pagina" [showInfo]="false" />
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Qué va en `total`
|
|
194
|
+
|
|
195
|
+
```html
|
|
196
|
+
<!-- ❌ mal: total es la cantidad de ítems, no de páginas: con 6 páginas de 25 dibuja una sola -->
|
|
197
|
+
<sui-pagination [total]="paginas()" [(currentPage)]="pagina" [pageSize]="25" />
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```html
|
|
201
|
+
<!-- ✅ bien -->
|
|
202
|
+
<sui-pagination [total]="filas().length" [(currentPage)]="pagina" [pageSize]="25" />
|
|
203
|
+
```
|
|
204
|
+
|
|
145
205
|
## Ejemplo
|
|
146
206
|
|
|
147
207
|
```html
|