@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.
Files changed (120) hide show
  1. package/docs/sui-accordion/README.md +85 -11
  2. package/docs/sui-activity-feed/README.md +65 -11
  3. package/docs/sui-activity-filter/README.md +54 -5
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +64 -10
  6. package/docs/sui-avatar/README.md +92 -29
  7. package/docs/sui-avatar-group/README.md +75 -9
  8. package/docs/sui-badge/README.md +85 -17
  9. package/docs/sui-banner/README.md +85 -20
  10. package/docs/sui-brand-logo/README.md +95 -31
  11. package/docs/sui-breadcrumb-item/README.md +54 -3
  12. package/docs/sui-breadcrumbs/README.md +54 -6
  13. package/docs/sui-button/README.md +76 -12
  14. package/docs/sui-button-group/README.md +91 -23
  15. package/docs/sui-button-group-item/README.md +81 -14
  16. package/docs/sui-card/README.md +105 -18
  17. package/docs/sui-chart-legend/README.md +63 -10
  18. package/docs/sui-chart-legend-dot/README.md +59 -10
  19. package/docs/sui-checkbox/README.md +109 -29
  20. package/docs/sui-checkbox-card/README.md +70 -14
  21. package/docs/sui-checkbox-label/README.md +92 -26
  22. package/docs/sui-circular-progress-bar/README.md +80 -19
  23. package/docs/sui-color-dot/README.md +72 -12
  24. package/docs/sui-color-picker/README.md +71 -13
  25. package/docs/sui-command-menu-footer/README.md +50 -1
  26. package/docs/sui-command-menu-item/README.md +74 -14
  27. package/docs/sui-command-menu-search/README.md +58 -3
  28. package/docs/sui-compact-avatar-group/README.md +73 -13
  29. package/docs/sui-compact-button/README.md +123 -34
  30. package/docs/sui-compact-select/README.md +61 -7
  31. package/docs/sui-compact-select-for-input/README.md +70 -6
  32. package/docs/sui-content-card/README.md +75 -14
  33. package/docs/sui-content-divider/README.md +67 -16
  34. package/docs/sui-content-label/README.md +99 -20
  35. package/docs/sui-counter-input/README.md +102 -18
  36. package/docs/sui-date-selector/README.md +69 -11
  37. package/docs/sui-datepicker/README.md +85 -18
  38. package/docs/sui-day-cell/README.md +75 -17
  39. package/docs/sui-day-label/README.md +56 -7
  40. package/docs/sui-divider/README.md +64 -9
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +69 -12
  43. package/docs/sui-dropdown-caption/README.md +58 -6
  44. package/docs/sui-dropdown-item/README.md +75 -9
  45. package/docs/sui-dropdown-menu/README.md +83 -14
  46. package/docs/sui-dropdown-search/README.md +60 -4
  47. package/docs/sui-emoji/README.md +94 -30
  48. package/docs/sui-empty-state/README.md +71 -7
  49. package/docs/sui-fancy-button/README.md +74 -14
  50. package/docs/sui-file-icon/README.md +70 -12
  51. package/docs/sui-file-upload/README.md +77 -17
  52. package/docs/sui-file-upload-card/README.md +64 -12
  53. package/docs/sui-filter/README.md +83 -14
  54. package/docs/sui-flag/README.md +73 -8
  55. package/docs/sui-form-hint/README.md +56 -7
  56. package/docs/sui-form-label/README.md +57 -5
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +86 -18
  59. package/docs/sui-image-upload/README.md +90 -22
  60. package/docs/sui-image-upload-profile/README.md +70 -11
  61. package/docs/sui-img-retry/README.md +50 -1
  62. package/docs/sui-inline-input/README.md +67 -9
  63. package/docs/sui-inline-select/README.md +62 -2
  64. package/docs/sui-input/README.md +90 -27
  65. package/docs/sui-integration-switch/README.md +84 -17
  66. package/docs/sui-kbd/README.md +73 -9
  67. package/docs/sui-key-icon/README.md +85 -23
  68. package/docs/sui-link-button/README.md +96 -27
  69. package/docs/sui-logo/README.md +93 -22
  70. package/docs/sui-modal/README.md +72 -13
  71. package/docs/sui-modal-footer/README.md +86 -12
  72. package/docs/sui-modal-header/README.md +57 -1
  73. package/docs/sui-modal-sheet/README.md +74 -12
  74. package/docs/sui-notification/README.md +81 -11
  75. package/docs/sui-notification-footer/README.md +55 -5
  76. package/docs/sui-notification-tab-menu/README.md +61 -5
  77. package/docs/sui-otp-input/README.md +70 -9
  78. package/docs/sui-page-header/README.md +89 -19
  79. package/docs/sui-pagination/README.md +73 -13
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +80 -18
  82. package/docs/sui-period-range/README.md +70 -11
  83. package/docs/sui-popover/README.md +81 -15
  84. package/docs/sui-product-card/README.md +89 -21
  85. package/docs/sui-progress-bar/README.md +82 -15
  86. package/docs/sui-progress-bar-label/README.md +79 -18
  87. package/docs/sui-radio/README.md +84 -7
  88. package/docs/sui-radio-card/README.md +70 -16
  89. package/docs/sui-radio-label/README.md +89 -22
  90. package/docs/sui-rating/README.md +101 -31
  91. package/docs/sui-rich-editor/README.md +47 -2
  92. package/docs/sui-segmented-control/README.md +90 -21
  93. package/docs/sui-select/README.md +80 -11
  94. package/docs/sui-sidebar/README.md +71 -16
  95. package/docs/sui-slider/README.md +75 -8
  96. package/docs/sui-social-button/README.md +71 -11
  97. package/docs/sui-status-badge/README.md +75 -14
  98. package/docs/sui-stepper/README.md +75 -18
  99. package/docs/sui-store-card/README.md +85 -22
  100. package/docs/sui-switch/README.md +82 -11
  101. package/docs/sui-switch-card/README.md +80 -16
  102. package/docs/sui-switch-label/README.md +91 -14
  103. package/docs/sui-tab-chips/README.md +93 -21
  104. package/docs/sui-tab-menu-horizontal/README.md +68 -7
  105. package/docs/sui-tab-menu-vertical/README.md +64 -11
  106. package/docs/sui-table/README.md +77 -16
  107. package/docs/sui-tag/README.md +86 -12
  108. package/docs/sui-tag-input/README.md +77 -13
  109. package/docs/sui-textarea/README.md +84 -17
  110. package/docs/sui-time-picker/README.md +96 -33
  111. package/docs/sui-toast/README.md +81 -20
  112. package/docs/sui-tooltip/README.md +80 -22
  113. package/docs/sui-topbar/README.md +64 -10
  114. package/docs/sui-topbar-button/README.md +61 -7
  115. package/docs/sui-topbar-item/README.md +68 -7
  116. package/docs/sui-topbar-user/README.md +61 -5
  117. package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
  118. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  119. package/package.json +1 -1
  120. 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). Todo lo de abajo es **propuesta**, salvo lo marcado «según el componente».
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)`. | propuesta |
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. | propuesta |
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: propuesta |
48
- | el link de ajustes | si hiciera falta, un `sui-link-button` `large` suelto | `small` (16 px) | propuesta |
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). Todo lo de abajo es **propuesta**, salvo lo marcado «según el componente».
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. | propuesta |
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). | propuesta |
37
- | `showFilter` | `false` | Lo normal: sin filtros, un botón que no hace nada estorba. | propuesta |
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" [value]="activa()" (valueChange)="activa.set($event)" />
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`. | propuesta, falta aprobación |
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». | propuesta, falta aprobación |
44
- | `(completed)` | Verificar apenas se llena, sin botón «Continuar». | propuesta, falta aprobación |
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) queda para
51
- 360 px o un código dentro de una tarjeta.
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` | propuesta, falta aprobación |
66
- | código de 4 dígitos | `large` (344 px, entra) | `large` | propuesta, falta aprobación |
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 | pantallas de 360 px o un código dentro de una tarjeta |
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 demás es **propuesta**.
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 03-10-2026 en `master-pedidos/src/app`: 64 page headers, sin contar prototipos ni
34
- > vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `master-rutina`,
35
- > `master-medico`, `dev-index`) ni las copias de `components/sui/`. 50 llevan `subtitle` fijo, 14
36
- > calculado; 17 tienen acciones; 0 usan `sticky`.
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` | propuesta |
49
- | acciones | Las que valen para toda la pantalla: una `filled` como máximo (la principal) y el resto `stroke`. Hoy: 9 `filled`, 7 `stroke`. | `pages/drivers/drivers.html:2` | canon para «una principal» (CANON-SUI §6.2), propuesta el resto |
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 el copy canon** (sentence case en botones): `pages/drivers/drivers.html:8`
52
- («Nuevo Repartidor»).
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 | propuesta |
59
- | `true` | listas largas donde las acciones del header se usan mientras se recorre (filtros, «Agregar»). Le pone fondo blanco. 0 usos hoy | propuesta |
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) | `small` (36) | propuesta |
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
- Los botones de las acciones hoy: 10 `small` fijos, 2 `bp.isMobile() ? 'large' : 'small'`, 2
74
- `bp.controlSize()` (`large`/`xlarge`), 2 `large`, 1 `medium`. La propuesta es la pareja que ya
75
- usan dos pantallas: en mobile las acciones bajan a su fila y tienen sitio para 48 px; en desktop
76
- van al lado del título de 28 y `small` no le compite.
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.isMobile() ? 'large' : 'small'" slot="actions">Agregar</sui-button>
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.isMobile() ? 'large' : 'small'" (click)="crear()">
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 es propuesta |
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 es propuesta |
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 es propuesta |
58
- | `small` | celdas de 28 px | Web, en una tabla dentro de un modal o panel angosto. | propuesta, falta aprobación |
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. | propuesta, falta aprobación |
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 es propuesta |
67
- | `siblingCount` | `1` (default) | Siempre. Más números a cada lado ensanchan sin ayudar. | propuesta, falta aprobación |
68
- | `showInfo` | `true` (default) | Con `infoFormat="items"`: «Mostrando 11-20 de 134». | propuesta, falta aprobación |
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. | propuesta, falta aprobación |
71
- | `pageSizeOptions` | `[]` (default) | Lo normal: sin selector de filas por página. | propuesta, falta aprobación |
72
- | `pageSizeOptions` | `[10, 25, 50]` | Las opciones dicen «10 / página» (en español desde 03-10-2026). | propuesta, falta aprobación |
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) | propuesta, falta aprobación |
84
- | tabla en un panel angosto | no se usa | `small` (28) | propuesta, falta aprobación |
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