@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
@@ -42,10 +42,10 @@ segmented · secciones → tab menu · filtros → tab-chips.**
42
42
  | qué | cuándo | fuente |
43
43
  |---|---|---|
44
44
  | texto | Lo normal: el nombre de la sección, una o dos palabras. | según la guía del DS (ejemplos con texto) |
45
- | `icon` | Solo si **todas** las pestañas llevan ícono y ayuda a reconocerlas. Nunca en una sola. | propuesta, falta aprobación |
46
- | `number` | Pendientes **que piden acción** dentro de esa sección («Solicitudes 3»). Es un círculo rojo: no lo uses para totales neutros. | propuesta, falta aprobación |
47
- | `rightIcon` | No: la flecha dice «te lleva a otra pantalla» y una pestaña no navega. | propuesta, falta aprobación |
48
- | `disabled` | Una sección que existe pero no aplica todavía (depende del plan). | propuesta, falta aprobación |
45
+ | `icon` | Solo si **todas** las pestañas llevan ícono y ayuda a reconocerlas. Nunca en una sola. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
46
+ | `number` | Pendientes **que piden acción** dentro de esa sección («Solicitudes 3»). Es un círculo rojo: no lo uses para totales neutros. | canon (aprobado por el dueño, 05-10-2026, bloque B3) |
47
+ | `rightIcon` | No: la flecha dice «te lleva a otra pantalla» y una pestaña no navega. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
48
+ | `disabled` | Una sección que existe pero no aplica todavía (depende del plan). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
49
49
 
50
50
  ### `size`
51
51
 
@@ -61,7 +61,7 @@ desde el 03-10-2026 (`sui-tab-menu-horizontal.scss`, bloque «Tamaños»). Cuán
61
61
  - **A discutir, 1 sin tamaño por plataforma:** el único uso
62
62
  (`components/store-ratings-modal/store-ratings-modal.html:43`) es del modal del local, que el
63
63
  cliente abre en el teléfono, y no pasa `size`: mide 48 px tocables (`medium`). Llega a 44, pero la
64
- propuesta de abajo pide `large` en mobile.
64
+ regla de abajo (canon, 05-10-2026) pide `large` en mobile.
65
65
 
66
66
  ## Tamaño en mobile y en web
67
67
 
@@ -80,13 +80,31 @@ es solo el texto: el `gap` entre pestañas no responde.
80
80
 
81
81
  | uso | mobile | web | fuente |
82
82
  |---|---|---|---|
83
- | 2-3 secciones | `large` (52, texto 16) | `medium` (48) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
83
+ | 2-3 secciones | `large` (52, texto 16) | `medium` (48) | canon (aprobado por el dueño, 05-10-2026, bloque B1); el tamaño es extensión SUI aprobada (03-10-2026) |
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.isMobile() ? 'large' : 'medium'" />
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,13 +17,14 @@ 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 ocupa el ancho de la pantalla dejando el contenido debajo. En
21
- mobile cada sección es una fila de una lista que abre su propia pantalla.
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`.
25
26
 
26
- Regla corta (propuesta, falta aprobación): **secciones de una página de ajustes en web → tab menu
27
+ Regla corta (canon, aprobado por el dueño, 05-10-2026, bloque B7): **secciones de una página de ajustes en web → tab menu
27
28
  vertical · en mobile → lista de filas que abren pantalla.**
28
29
 
29
30
  ## Qué variante usar
@@ -39,14 +40,14 @@ vertical · en mobile → lista de filas que abren pantalla.**
39
40
 
40
41
  | valor | cuándo | fuente |
41
42
  |---|---|---|
42
- | `card` | El menú flota junto al contenido sobre un fondo gris (`bg-weak-50`): el borde y la sombra lo separan. | según la guía del DS (ejemplo «contenedor con estilo»); el cuándo es propuesta |
43
- | `list` | El menú vive dentro de una columna que ya tiene fondo o borde propio (una card, un panel). | según la guía del DS (ejemplo base); el cuándo es propuesta |
43
+ | `card` | El menú flota junto al contenido sobre un fondo gris (`bg-weak-50`): el borde y la sombra lo separan. | según la guía del DS (ejemplo «contenedor con estilo»); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
44
+ | `list` | El menú vive dentro de una columna que ya tiene fondo o borde propio (una card, un panel). | según la guía del DS (ejemplo base); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
44
45
 
45
46
  ### `dividerLabel`
46
47
 
47
48
  | valor | cuándo | fuente |
48
49
  |---|---|---|
49
- | vacío (default) | Un solo grupo de secciones. | propuesta, falta aprobación |
50
+ | vacío (default) | Un solo grupo de secciones. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
50
51
  | texto | Nombra el grupo cuando hay más de un menú apilado («Tu local» · «Tu cuenta»). Sale en MAYÚSCULAS y gris. | según la guía del DS (ejemplo con título) |
51
52
 
52
53
  ### Ítems (`tabs`)
@@ -54,10 +55,10 @@ vertical · en mobile → lista de filas que abren pantalla.**
54
55
  | qué | cuándo | fuente |
55
56
  |---|---|---|
56
57
  | texto | El nombre de la sección. Una o dos palabras; si es más largo, se corta con «…». | según la guía del DS (ejemplos con texto) |
57
- | `icon` | Sí, en todos los ítems: en un menú lateral el ícono ayuda a encontrar rápido. El activo se pinta naranja. | propuesta, falta aprobación |
58
- | `number` | Pendientes que piden acción en esa sección (círculo rojo). | propuesta, falta aprobación |
58
+ | `icon` | Sí, en todos los ítems: en un menú lateral el ícono ayuda a encontrar rápido. El activo se pinta naranja. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
59
+ | `number` | Pendientes que piden acción en esa sección (círculo rojo). | canon (aprobado por el dueño, 05-10-2026, bloque B3) |
59
60
  | `rightIcon` | Cuando el ítem lleva a otra página en vez de cambiar el panel de al lado. | propuesta, falta aprobación |
60
- | `disabled` | Una sección que depende del plan. | propuesta, falta aprobación |
61
+ | `disabled` | Una sección que depende del plan. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
61
62
 
62
63
  Usos de hoy que rompen las reglas: **0** (no se usa).
63
64
 
@@ -68,14 +69,22 @@ Usos de hoy que rompen las reglas: **0** (no se usa).
68
69
 
69
70
  | uso | mobile | web | fuente |
70
71
  |---|---|---|---|
71
- | secciones de ajustes | no se usa: lista de filas que abren pantalla | `tab-menu-vertical` | propuesta, falta aprobación |
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.isMobile()) {
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
@@ -32,9 +32,9 @@ Regla corta: **comparar por columnas → tabla · leer de a uno → tarjetas ·
32
32
  > estructura de dos dimensiones donde cada fila es un ítem y cada columna un dato del ítem»,
33
33
  > muestra un solo ejemplo (un directorio de personas **con selección por checkbox**), le pone
34
34
  > `overflow-x-auto` al contenedor y deriva el orden, la selección y la paginación a una
35
- > librería externa. No trae do/don't, tamaños ni comportamiento en mobile. Casi todo lo de
36
- > abajo es **práctica de la app** o **propuesta, falta aprobación**; lo marcado «canon» sale de
37
- > `master-pedidos/CLAUDE.md` o de `docs/CANON-SUI.md`.
35
+ > librería externa. No trae do/don't, tamaños ni comportamiento en mobile. Lo de abajo es
36
+ > **práctica de la app**, **canon** (sale de `master-pedidos/CLAUDE.md`, de `docs/CANON-SUI.md` o lo
37
+ > aprobó el dueño el 05-10-2026) o **propuesta, falta aprobación**, que espera decisión.
38
38
  >
39
39
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **9 tablas** en 7 pantallas, sin contar
40
40
  > prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`,
@@ -55,9 +55,9 @@ Regla corta: **comparar por columnas → tabla · leer de a uno → tarjetas ·
55
55
  | prop de columna | cuándo | ejemplo real de la app | fuente |
56
56
  |---|---|---|---|
57
57
  | `priority: 'leading'` + `descriptionKey` | La **primera** columna: el dato que identifica la fila arriba (14/500) y un dato de apoyo debajo (12/400). Se usa en vez de una plantilla propia para la columna principal. | `pages/orders/orders.ts:278` (pedido + «hace 12 min») · `pages/super-admin/master-orders/master-orders.ts:390` | práctica de la app (7 de 9 tablas) |
58
- | `priority: 'passive'` | Datos de contexto que no deciden nada: fecha, número de comprobante. Se leen en gris (`text-sub-600`). | `pages/super-admin/master-overview/master-overview.ts:192` | propuesta, falta aprobación |
58
+ | `priority: 'passive'` | Datos de contexto que no deciden nada: fecha, número de comprobante. Se leen en gris (`text-sub-600`). | `pages/super-admin/master-overview/master-overview.ts:192` | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
59
59
  | `priority: 'none'` | Columna de acciones (íconos) sin texto propio. Con `label: ''` y `width` fijo. | `pages/super-admin/master-gastos/master-gastos.ts:143` | práctica de la app |
60
- | `align: 'right'` | Montos. Así se comparan en vertical. | `pages/central/central-gastos/central-gastos.ts:82` | propuesta, falta aprobación |
60
+ | `align: 'right'` | Montos. Así se comparan en vertical. | `pages/central/central-gastos/central-gastos.ts:82` | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
61
61
  | `width` | Columnas de largo fijo: monto, estado, fecha, acciones. | `central-gastos.ts:82-83` | práctica de la app |
62
62
  | `minWidth` | Columnas de texto que crecen (nombre, concepto): el piso para que no se aplasten. | `master-orders.ts:392` | práctica de la app |
63
63
  | `maxWidth` + `truncate` | Nombres que pueden ser muy largos: corta con «…» y el valor completo sale en tooltip. | `master-overview.ts:193` | práctica de la app |
@@ -72,10 +72,10 @@ 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="small">` | canon (CANON-SUI §0: «Chip de estado») |
76
- | acciones de la fila | `<sui-button variant="ghost" color="neutral" size="2xsmall" [onlyIcon]="true">` | canon (README de `sui-button`: tabla densa = `2xsmall`) |
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
- | calificación | `<sui-rating>` de solo lectura | propuesta, falta aprobación |
78
+ | calificación | `<sui-rating>` de solo lectura | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
79
79
 
80
80
  Si la columna tiene plantilla, `descriptionKey` y `truncate` **no se aplican**: solo funcionan en
81
81
  el render de texto plano. Por eso `orders.html:94` deja la columna del pedido sin plantilla.
@@ -118,17 +118,17 @@ 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 | `small` | `small` | práctica de la app (1 uso) |
122
- | filas con dos líneas y un badge | `medium` | `medium` | propuesta, falta aprobación |
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
+ | 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 `[size]="bp.isMobile() ? 'large' : 'medium'"` de los botones **no aplica aquí**: la fila
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
129
- salidas, y las dos son práctica, no regla:
129
+ salidas, y cuándo va cada una ya es regla:
130
130
 
131
- | salida | dónde | cuándo elegirla (propuesta) |
131
+ | salida | dónde | cuándo elegirla (canon (aprobado por el dueño, 05-10-2026, bloque B7)) |
132
132
  |---|---|---|
133
133
  | la misma tabla, con scroll lateral | `orders`, `master-orders`, `central-gastos`, `central-ingresos` | 3-4 columnas, y la primera (`leading`) ya dice casi todo |
134
134
  | tarjetas en grilla por debajo de 1350 px | `drivers` (`drivers.ts:282`), `master-gastos` | 6+ columnas: con el sidebar abierto no entran ni en laptop ni en iPad |
@@ -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="small">{{ row.estadoLabel }}</sui-badge>
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.isMobile() ? 'large' : 'small'"
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>
@@ -35,7 +35,7 @@ tab-chips o segmented-control.**
35
35
  > **La guía del DS dice para qué es, no cuándo usar cada estilo.** Su página lo define como
36
36
  > «categorizar y etiquetar contenido» y muestra `stroke` (default), `gray`, deshabilitado, con
37
37
  > imagen, con avatar y con botón de quitar. No trae do/don't. Lo marcado «según la guía del DS»
38
- > sale de ahí; el resto es **propuesta, falta aprobación**.
38
+ > sale de ahí; lo marcado canon lo aprobó el dueño; el resto es **propuesta, falta aprobación** y espera decisión.
39
39
  >
40
40
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 tags**, sin contar prototipos ni
41
41
  > vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `_guia-*`,
@@ -48,12 +48,12 @@ tab-chips o segmented-control.**
48
48
  | `tagStyle` | `stroke` (default) | Lo normal. Sirve sobre cualquier fondo (blanco o gris claro). | — | según la guía del DS (default) |
49
49
  | `tagStyle` | `gray` | Solo sobre blanco, cuando hay muchos tags juntos y el borde hace ruido. **Sobre gris claro desaparece.** | Varios filtros aplicados en fila | propuesta, falta aprobación |
50
50
  | `dismissible` | `true` | Lo que se nombra se puede quitar. Emite `(dismiss)`; la pantalla lo saca. | «Abierto ahora ✕» | según la guía del DS |
51
- | `dismissLabel` | texto | Siempre «Quitar» + el nombre: el lector de pantalla no ve el texto del tag desde la X. | `dismissLabel="Quitar Abierto ahora"` | propuesta, falta aprobación |
51
+ | `dismissLabel` | texto | Siempre «Quitar» + el nombre: el lector de pantalla no ve el texto del tag desde la X. | `dismissLabel="Quitar Abierto ahora"` | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
52
52
  | `leading` + `[data-slot=start]` | avatar | Nombra a una persona o un local. | «Burger House» con su logo | según la guía del DS (con avatar, con imagen) |
53
53
  | `leading` + `[data-slot=start]` | ícono de 16 | El ícono dice qué tipo de dato es. | «Andahuaylas» con un pin | según la guía del DS (`Tag.Icon`) |
54
54
  | `sublabel` | texto | Cuántos resultados trae ese filtro, entre paréntesis. | «Pollerías (12)» | propuesta, falta aprobación |
55
- | `disabled` | `true` | **No usar** hoy (ver abajo). | — | según la guía del DS (existe) · propuesta (cuándo) |
56
- | `interactive` | `true` | **No usar** hoy (ver abajo). | — | propuesta, falta aprobación |
55
+ | `disabled` | `true` | **No usar** hoy (ver abajo). | — | según la guía del DS (existe) · canon (aprobado por el dueño, 05-10-2026, bloque B6) (cuándo) |
56
+ | `interactive` | `true` | **No usar** hoy (ver abajo). | — | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
57
57
 
58
58
  Usos de hoy que rompen la regla: **0** (no hay usos).
59
59
 
@@ -67,10 +67,14 @@ Usos de hoy que rompen la regla: **0** (no hay usos).
67
67
 
68
68
  ## Tamaño en mobile y en web
69
69
 
70
- Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
71
- (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
72
- en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
73
- de la app.
70
+ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026), que reemplaza al
71
+ «tamaño por plataforma» del 03-10-2026 (mobile grande, web chico). La columna «mobile» es el celular de
72
+ 380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
73
+ computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
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. `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)».
74
78
 
75
79
  | size | alto | texto | leading | X de quitar (área táctil) |
76
80
  |---|---|---|---|---|
@@ -94,17 +98,42 @@ máximo se sigue cortando, y la X queda siempre visible.
94
98
 
95
99
  | uso | mobile | web | fuente |
96
100
  |---|---|---|---|
97
- | Tag con X (filtro aplicado, elegido que se quita) | `xlarge` (40) | `medium` (24) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
98
- | Tag de solo lectura (sin X) | `large` (32) | `medium` (24) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
99
- | Separación entre tags | 8 px | 4–6 px | propuesta, falta aprobación |
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) |
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) |
103
+ | Separación entre tags | 8 px | 4–6 px | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
100
104
 
101
105
  ```html
102
- <sui-tag [size]="bp.isMobile() ? 'xlarge' : 'medium'" [dismissible]="true" (dismiss)="quitar(f)">{{ f.nombre }}</sui-tag>
106
+ <sui-tag [size]="bp.tactil() ? 'xlarge' : 'medium'" [dismissible]="true" (dismiss)="quitar(f)">{{ f.nombre }}</sui-tag>
103
107
  ```
104
108
 
105
109
  El leading proyectado (ícono, avatar, bandera) se escala solo a la caja de 20 en los grandes; un
106
110
  `<i class="ri-…">` necesita además su `font-size` en 20.
107
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
+
108
137
  ## API
109
138
 
110
139
  <!-- api:inicio -->
@@ -143,6 +172,51 @@ Slots: `[data-slot=start]` (avatar, logo, bandera o ícono de 16 px) y `<ng-cont
143
172
  - `sui-avatar` no tiene 16 px: el `xs` (20) se escala por CSS dentro del slot.
144
173
  - Radio de 6 px, 24 px de alto en `medium`, sin mayúsculas: no es un badge (radio completo).
145
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
+
146
220
  ## Ejemplo
147
221
 
148
222
  ```html