@ajuarezso/sui-design-system 0.25.0 → 0.25.2

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 +83 -9
  2. package/docs/sui-activity-feed/README.md +55 -1
  3. package/docs/sui-activity-filter/README.md +50 -1
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +57 -3
  6. package/docs/sui-avatar/README.md +66 -6
  7. package/docs/sui-avatar-group/README.md +64 -2
  8. package/docs/sui-badge/README.md +79 -11
  9. package/docs/sui-banner/README.md +70 -5
  10. package/docs/sui-brand-logo/README.md +77 -14
  11. package/docs/sui-breadcrumb-item/README.md +51 -0
  12. package/docs/sui-breadcrumbs/README.md +48 -0
  13. package/docs/sui-button/README.md +68 -6
  14. package/docs/sui-button-group/README.md +70 -5
  15. package/docs/sui-button-group-item/README.md +68 -4
  16. package/docs/sui-card/README.md +97 -10
  17. package/docs/sui-chart-legend/README.md +53 -0
  18. package/docs/sui-chart-legend-dot/README.md +49 -0
  19. package/docs/sui-checkbox/README.md +106 -26
  20. package/docs/sui-checkbox-card/README.md +58 -2
  21. package/docs/sui-checkbox-label/README.md +89 -23
  22. package/docs/sui-circular-progress-bar/README.md +63 -5
  23. package/docs/sui-color-dot/README.md +61 -5
  24. package/docs/sui-color-picker/README.md +62 -4
  25. package/docs/sui-command-menu-footer/README.md +49 -0
  26. package/docs/sui-command-menu-item/README.md +63 -4
  27. package/docs/sui-command-menu-search/README.md +58 -4
  28. package/docs/sui-compact-avatar-group/README.md +61 -4
  29. package/docs/sui-compact-button/README.md +112 -28
  30. package/docs/sui-compact-select/README.md +58 -4
  31. package/docs/sui-compact-select-for-input/README.md +69 -5
  32. package/docs/sui-content-card/README.md +63 -2
  33. package/docs/sui-content-divider/README.md +49 -1
  34. package/docs/sui-content-label/README.md +83 -4
  35. package/docs/sui-counter-input/README.md +91 -7
  36. package/docs/sui-date-selector/README.md +61 -3
  37. package/docs/sui-datepicker/README.md +72 -5
  38. package/docs/sui-day-cell/README.md +60 -3
  39. package/docs/sui-day-label/README.md +52 -3
  40. package/docs/sui-divider/README.md +57 -5
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +60 -3
  43. package/docs/sui-dropdown-caption/README.md +53 -1
  44. package/docs/sui-dropdown-item/README.md +72 -6
  45. package/docs/sui-dropdown-menu/README.md +74 -5
  46. package/docs/sui-dropdown-search/README.md +57 -1
  47. package/docs/sui-emoji/README.md +82 -18
  48. package/docs/sui-empty-state/README.md +68 -4
  49. package/docs/sui-fancy-button/README.md +59 -1
  50. package/docs/sui-file-icon/README.md +56 -1
  51. package/docs/sui-file-upload/README.md +69 -9
  52. package/docs/sui-file-upload-card/README.md +53 -2
  53. package/docs/sui-filter/README.md +74 -5
  54. package/docs/sui-flag/README.md +62 -1
  55. package/docs/sui-form-hint/README.md +54 -5
  56. package/docs/sui-form-label/README.md +53 -1
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +69 -4
  59. package/docs/sui-image-upload/README.md +70 -3
  60. package/docs/sui-image-upload-profile/README.md +58 -0
  61. package/docs/sui-img-retry/README.md +49 -0
  62. package/docs/sui-inline-input/README.md +61 -3
  63. package/docs/sui-inline-select/README.md +60 -0
  64. package/docs/sui-input/README.md +77 -14
  65. package/docs/sui-integration-switch/README.md +69 -2
  66. package/docs/sui-kbd/README.md +71 -7
  67. package/docs/sui-key-icon/README.md +65 -6
  68. package/docs/sui-link-button/README.md +79 -13
  69. package/docs/sui-logo/README.md +74 -4
  70. package/docs/sui-modal/README.md +61 -2
  71. package/docs/sui-modal-footer/README.md +83 -9
  72. package/docs/sui-modal-header/README.md +56 -0
  73. package/docs/sui-modal-sheet/README.md +72 -10
  74. package/docs/sui-notification/README.md +71 -1
  75. package/docs/sui-notification-footer/README.md +51 -1
  76. package/docs/sui-notification-tab-menu/README.md +57 -1
  77. package/docs/sui-otp-input/README.md +67 -6
  78. package/docs/sui-page-header/README.md +83 -15
  79. package/docs/sui-pagination/README.md +60 -0
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +66 -7
  82. package/docs/sui-period-range/README.md +65 -6
  83. package/docs/sui-popover/README.md +73 -7
  84. package/docs/sui-product-card/README.md +76 -8
  85. package/docs/sui-progress-bar/README.md +72 -8
  86. package/docs/sui-progress-bar-label/README.md +69 -12
  87. package/docs/sui-radio/README.md +83 -6
  88. package/docs/sui-radio-card/README.md +58 -4
  89. package/docs/sui-radio-label/README.md +86 -19
  90. package/docs/sui-rating/README.md +81 -14
  91. package/docs/sui-rich-editor/README.md +45 -0
  92. package/docs/sui-segmented-control/README.md +83 -14
  93. package/docs/sui-select/README.md +72 -3
  94. package/docs/sui-sidebar/README.md +64 -9
  95. package/docs/sui-slider/README.md +68 -1
  96. package/docs/sui-social-button/README.md +63 -3
  97. package/docs/sui-status-badge/README.md +64 -6
  98. package/docs/sui-stepper/README.md +57 -0
  99. package/docs/sui-store-card/README.md +71 -8
  100. package/docs/sui-switch/README.md +80 -9
  101. package/docs/sui-switch-card/README.md +70 -6
  102. package/docs/sui-switch-label/README.md +90 -13
  103. package/docs/sui-tab-chips/README.md +79 -9
  104. package/docs/sui-tab-menu-horizontal/README.md +62 -1
  105. package/docs/sui-tab-menu-vertical/README.md +56 -3
  106. package/docs/sui-table/README.md +68 -7
  107. package/docs/sui-tag/README.md +75 -4
  108. package/docs/sui-tag-input/README.md +71 -7
  109. package/docs/sui-textarea/README.md +78 -11
  110. package/docs/sui-time-picker/README.md +70 -7
  111. package/docs/sui-toast/README.md +65 -5
  112. package/docs/sui-tooltip/README.md +61 -4
  113. package/docs/sui-topbar/README.md +57 -3
  114. package/docs/sui-topbar-button/README.md +57 -3
  115. package/docs/sui-topbar-item/README.md +61 -0
  116. package/docs/sui-topbar-user/README.md +56 -0
  117. package/fesm2022/ajuarezso-sui-design-system.mjs +216 -227
  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 +68 -45
@@ -69,6 +69,21 @@ El ícono no se toca: si la fila abre el archivo, la fila da los 44 px. `medium`
69
69
  grande que tiene y `xsmall` es chico (D16), así que va igual en las dos: es la excepción a P1 b
70
70
  («un paso más grande en el celular»), porque no hay un paso más.
71
71
 
72
+ ### Por dispositivo (D16)
73
+
74
+ No se toca; la fila de `file-icon` de la tabla D16 manda (canon, dueño, 05-10-2026, D16).
75
+
76
+ | dispositivo | size | nota |
77
+ |---|---|---|
78
+ | celular chico (< 380 px) | `medium` (40) | |
79
+ | celular (380–767 px) | `medium` (40) | es el más grande que tiene: no hay un paso más para subir (P1 b) |
80
+ | tablet táctil (`pointer: coarse`) | `medium` (40) | si la fila abre el archivo, los 44 los da la fila |
81
+ | computadora (`pointer: fine`) | `medium` (40) | también en filas densas y tablas; `xsmall` no se usa |
82
+
83
+ Ultrawide (≥ 1920 px): igual, `medium`.
84
+
85
+ En master-pedidos: `size="medium"` fijo, o se omite (es el default). No hay helper ni hace falta `bp`.
86
+
72
87
  ## «No usar»: por qué no hoy y cuándo sí
73
88
 
74
89
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -98,9 +113,49 @@ Outputs: ninguno.
98
113
  - El nombre para el lector de pantalla es «Archivo PDF» (en español desde el 04-10-2026) y no se puede cambiar.
99
114
  - `size` es `xsmall` o `medium`: no hay `small` ni `large`.
100
115
 
116
+ ## Bien y mal
117
+
118
+ **Un archivo en una tabla**
119
+
120
+ ```html
121
+ <!-- ❌ mal: xsmall es chico (D16). La vitrina (master-preview/_guia-atomos/identidad.ts:422)
122
+ todavía lo ofrece para «filas densas, tablas» -->
123
+ <sui-file-icon [filename]="doc.nombre" size="xsmall" />
124
+ ```
125
+
126
+ ```html
127
+ <!-- ✅ bien -->
128
+ <sui-file-icon [filename]="doc.nombre" size="medium" />
129
+ ```
130
+
131
+ **El color del tipo**
132
+
133
+ ```html
134
+ <!-- ❌ mal: forzar el color miente; un CSV en rojo parece PDF (vitrina identidad.ts:424) -->
135
+ <sui-file-icon filename="ventas.csv" color="red" />
136
+ ```
137
+
138
+ ```html
139
+ <!-- ✅ bien: el color sale solo de la extensión (CSV en verde) -->
140
+ <sui-file-icon filename="ventas.csv" />
141
+ ```
142
+
143
+ **Un archivo que se está subiendo**
144
+
145
+ ```html
146
+ <!-- ❌ mal: el ícono solo no dice cómo va la subida («Cuándo no») -->
147
+ <sui-file-icon filename="carta-octubre.pdf" />
148
+ ```
149
+
150
+ ```html
151
+ <!-- ✅ bien: la card ya trae el ícono, la barra y el estado -->
152
+ <sui-file-upload-card file="carta-octubre.pdf" state="in-progress" [progress]="45"
153
+ description="1.2 MB de 2.6 MB" />
154
+ ```
155
+
101
156
  ## Ejemplo
102
157
 
103
158
  ```html
104
159
  <sui-file-icon filename="comprobante-yape.pdf" />
105
- <sui-file-icon filename="ventas-setiembre.csv" size="xsmall" />
160
+ <sui-file-icon filename="ventas-setiembre.csv" size="medium" />
106
161
  ```
@@ -31,7 +31,9 @@ elegido → file-upload-card.**
31
31
  > («Elige un archivo o arrástralo aquí»), una línea con **formatos y tamaño máximo** («JPEG, PNG,
32
32
  > PDF y MP4, hasta 50 MB») y el botón **«Buscar archivo»**. Trae aparte el ícono por tipo de
33
33
  > archivo (en SUI, `sui-file-icon`). No dice cuándo usar cada tamaño. Lo de abajo marcado canon
34
- > está aprobado; lo que sigue en **propuesta** (el `small` en mobile) espera decisión.
34
+ > está aprobado; el `small` en mobile sigue en propuesta: lo cubre **P13, pendiente**. D16 en
35
+ > general no usa `small`, pero la hoja de decisiones (05-10-2026) dejó estas filas esperando la
36
+ > respuesta a P13.
35
37
  >
36
38
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Hoy todo lo que se sube es
37
39
  > imagen y va con `sui-image-upload` (13) o con un `<input type="file">` a mano (3: `renewal-modal`,
@@ -57,8 +59,8 @@ elegido → file-upload-card.**
57
59
 
58
60
  | valor | padding | cuándo | fuente |
59
61
  |---|---|---|---|
60
- | `small` | 24 | En mobile y dentro de un modal o una card. | propuesta |
61
- | `medium` (default) | 32 | En web, en una página o un modal ancho. | guía (es el único tamaño que muestra) |
62
+ | `small` | 24 | Propuesta: en mobile y dentro de un modal o una card. Pendiente (P13): la opción recomendada es que no (en mobile `medium` o `large`, por D8), y D16 en general no usa `small`, pero el dueño todavía no respondió. | pendiente (P13) |
63
+ | `medium` (default) | 32 | En web, en una página o un modal ancho. En mobile: pendiente (P13). | guía (es el único tamaño que muestra) |
62
64
  | `large` | 40 | Cuando subir el archivo es lo único de la pantalla (importar la carta). | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
63
65
  | `xlarge` | 48 | No usar: más aire no ayuda a soltar el archivo. | no usar |
64
66
 
@@ -74,17 +76,17 @@ Usos de hoy que rompen la regla: **0** (no hay file-upload).
74
76
  ## Tamaño en mobile y en web
75
77
 
76
78
  En mobile se toca con el dedo: lo que se toca mide **44 px o más**. Aquí **toda el área se toca**
77
- (abre el selector), así que pasa en cualquier tamaño; en el celular no se arrastra, por eso va
78
- más compacta. En pantallas de los dos, con el servicio de breakpoints de la app (`bp`, en
79
- `services/breakpoints.service.ts`).
79
+ (abre el selector), así que pasa en cualquier tamaño. En pantallas de los dos, con el servicio
80
+ de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`).
80
81
 
81
82
  | uso | mobile | web | fuente |
82
83
  |---|---|---|---|
83
- | subir un documento en un formulario o modal | `small` | `medium` | propuesta |
84
- | subir es lo único de la pantalla | `medium` | `large` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
84
+ | subir un documento en un formulario o modal | pendiente (P13) | `medium` | mobile: pendiente (P13; la propuesta era `small`) · web: guía |
85
+ | subir es lo único de la pantalla | `medium` | `large` | canon (aprobado por el dueño, 05-10-2026, bloque B1) · va al revés de D16: ver abajo |
85
86
 
86
87
  ```html
87
- <sui-file-upload [size]="bp.isMobile() ? 'small' : 'medium'"
88
+ <!-- en web, en un formulario o modal; el size en mobile espera P13 -->
89
+ <sui-file-upload size="medium"
88
90
  title="Sube tu carta en PDF" subtitle="PDF, hasta 10 MB"
89
91
  accept=".pdf" [maxSize]="10 * 1024 * 1024" (filesSelected)="subir($event)" />
90
92
  ```
@@ -93,6 +95,20 @@ Llena el ancho del contenedor (antes 400 fijo; extensión SUI, 03-10-2026). El b
93
95
  archivo» mide 32 px (`xsmall`) en todos los tamaños: solo, en mobile **no
94
96
  llegaría**; pasa porque el área entera también abre el selector.
95
97
 
98
+ ### Por dispositivo (D16)
99
+
100
+ **Pendiente (P13).** `file-upload` no está en la tabla por componente de D16, y la hoja de
101
+ decisiones (05-10-2026, «Lo que esta hoja no cierra») deja sus dos filas de tamaño esperando P13.
102
+ Se toca, así que la regla general de D16 sería «lo que se toca»: grande en el celular y en la
103
+ tablet, `medium` en la computadora (y en ultrawide). Eso choca con la fila de B1 («subir es lo
104
+ único de la pantalla»: `medium` en mobile y `large` en web), que va en la dirección contraria, y
105
+ D16 dice que reemplaza el tamaño por plataforma. Cuál manda no está decidido: se resuelve con P13.
106
+
107
+ Hasta entonces, lo cerrado es: `medium` en la computadora en un formulario o modal (guía) y
108
+ `xlarge` no se usa. Si P13 cierra con la regla general de D16, en master-pedidos quedaría
109
+ `[size]="bp.tactil() ? 'large' : 'medium'"` (no hay helper propio; `sizeControl()` es de
110
+ botón, input, select y textarea).
111
+
96
112
  ## «No usar»: por qué no hoy y cuándo sí
97
113
 
98
114
  Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
@@ -148,6 +164,50 @@ en la columna de la derecha, se usa (aprobado por el dueño, 03-10-2026).
148
164
  hace quien lo usa.
149
165
  - El atributo `title` del host se borra solo (no sale el tooltip gris del navegador).
150
166
 
167
+ ## Bien y mal
168
+
169
+ **El error que se pasa a mano**
170
+
171
+ ```html
172
+ <!-- ❌ mal: el componente ya muestra solo el aviso de tamaño debajo del área (y lo emite por errorEvent); este errorMessage lo tapa con otro texto -->
173
+ <sui-file-upload accept=".pdf" [maxSize]="10 * 1024 * 1024"
174
+ title="Sube tu carta en PDF" subtitle="PDF, hasta 10 MB"
175
+ [error]="pesaDeMas()" errorMessage="El archivo pesa más de 10 MB" />
176
+ ```
177
+
178
+ ```html
179
+ <!-- ✅ bien: errorMessage solo para lo que rechaza el servidor después de subirlo -->
180
+ <sui-file-upload accept=".pdf" [maxSize]="10 * 1024 * 1024"
181
+ title="Sube tu carta en PDF" subtitle="PDF, hasta 10 MB"
182
+ [error]="rechazado()" errorMessage="El PDF está protegido con clave" />
183
+ ```
184
+
185
+ **El límite de tamaño**
186
+
187
+ ```html
188
+ <!-- ❌ mal: maxSize va en bytes (10 = 10 bytes) y el subtitle no dice formatos ni tamaño (Trampas) -->
189
+ <sui-file-upload accept=".pdf" [maxSize]="10" title="Sube tu carta" />
190
+ ```
191
+
192
+ ```html
193
+ <!-- ✅ bien: el mismo límite en el filtro y en el texto -->
194
+ <sui-file-upload accept=".pdf" [maxSize]="10 * 1024 * 1024"
195
+ title="Sube tu carta en PDF" subtitle="PDF, hasta 10 MB" />
196
+ ```
197
+
198
+ **El filtro y el texto**
199
+
200
+ ```html
201
+ <!-- ❌ mal: el subtitle promete Excel y accept lo rechaza: la persona elige un archivo que no entra -->
202
+ <sui-file-upload accept=".pdf" title="Sube tu carta" subtitle="PDF o Excel, hasta 10 MB" />
203
+ ```
204
+
205
+ ```html
206
+ <!-- ✅ bien: lo que promete el subtitle es lo que dejan pasar accept y maxSize -->
207
+ <sui-file-upload accept=".pdf,.xlsx" [maxSize]="10 * 1024 * 1024"
208
+ title="Sube tu carta" subtitle="PDF o Excel, hasta 10 MB" />
209
+ ```
210
+
151
211
  ## Ejemplo
152
212
 
153
213
  ```html
@@ -65,10 +65,18 @@ reintente.
65
65
  | «Reintentar» | link de 20 px — **no llega** | link | medido |
66
66
 
67
67
  ```html
68
- <sui-file-upload-card [file]="a.nombre" [state]="a.estado" [progress]="a.pct"
69
- [description]="a.peso" (actionClicked)="quitar(a)" (retryClicked)="reintentar(a)" />
68
+ <sui-file-upload-card [file]="a.nombre" [state]="a.estado" [progress]="a.pct" [description]="a.peso"
69
+ (actionClicked)="a.estado === 'in-progress' ? cancelar(a) : quitar(a)"
70
+ (retryClicked)="reintentar(a)" />
70
71
  ```
71
72
 
73
+ ### Por dispositivo (D16)
74
+
75
+ No aplica: **no tiene input `size`** y nada en ella cambia por dispositivo (la fila llena el ancho y
76
+ la X o el tacho mide 32 en el celular, la tablet y la computadora). Que esa X y «Reintentar» lleguen
77
+ a 44 en lo táctil es trabajo pendiente del DS, no un `size` que se elija. En master-pedidos: sin
78
+ `[size]` ni `bp`.
79
+
72
80
  ## «No usar»: por qué no hoy y cuándo sí
73
81
 
74
82
  Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
@@ -120,6 +128,49 @@ interface SuiFileUploadCardFile { filename: string; extension?: string; }
120
128
  - La barra de progreso es azul, no naranja.
121
129
  - No sube nada: refleja el estado que le pasan.
122
130
 
131
+ ## Bien y mal
132
+
133
+ **El peso del archivo**
134
+
135
+ ```html
136
+ <!-- ❌ mal: coma decimal; el canon es punto, como el «10.0 MB» de sui-file-upload
137
+ (vitrina master-preview/_guia-moleculas/fechas.ts:182) -->
138
+ <sui-file-upload-card file="carta-octubre.pdf" state="in-progress" [progress]="45"
139
+ description="1,2 MB de 2,6 MB" />
140
+ ```
141
+
142
+ ```html
143
+ <!-- ✅ bien -->
144
+ <sui-file-upload-card file="carta-octubre.pdf" state="in-progress" [progress]="45"
145
+ description="1.2 MB de 2.6 MB" />
146
+ ```
147
+
148
+ **Los textos de fábrica**
149
+
150
+ ```html
151
+ <!-- ❌ mal: sin description sale «0 KB de 120 KB», y sin progress la barra arranca en 10 -->
152
+ <sui-file-upload-card [file]="a.nombre" state="in-progress" />
153
+ ```
154
+
155
+ ```html
156
+ <!-- ✅ bien -->
157
+ <sui-file-upload-card [file]="a.nombre" state="in-progress" [progress]="a.pct" [description]="a.peso" />
158
+ ```
159
+
160
+ **La X de la derecha**
161
+
162
+ ```html
163
+ <!-- ❌ mal: mientras sube, la X cancela; tratarla siempre como «quitar» (Trampas) -->
164
+ <sui-file-upload-card [file]="a.nombre" [state]="a.estado" [description]="a.peso"
165
+ (actionClicked)="quitar(a)" />
166
+ ```
167
+
168
+ ```html
169
+ <!-- ✅ bien -->
170
+ <sui-file-upload-card [file]="a.nombre" [state]="a.estado" [description]="a.peso"
171
+ (actionClicked)="a.estado === 'in-progress' ? cancelar(a) : quitar(a)" />
172
+ ```
173
+
123
174
  ## Ejemplo
124
175
 
125
176
  ```html
@@ -40,7 +40,7 @@ panel (header + items + footer) · un filtro suelto → compact-select.**
40
40
 
41
41
  > **La guía del DS no tiene página de filtros**: estas piezas salen solo del Figma del DS
42
42
  > («Filters»: HorizontalFilter y VerticalFilter). Las reglas marcadas canon están aprobadas; lo
43
- > que sigue en **propuesta** (la barra y el item en mobile) espera decisión.
43
+ > que sigue **pendiente** (el área de 44 de `sui-filter-item` en mobile, P19) espera decisión.
44
44
  >
45
45
  > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-dropdown-menu`):
46
46
  > **0 usos**. Solo aparecen en la vitrina `master-preview`.
@@ -72,20 +72,42 @@ Ninguna pieza cambia sola en mobile, salvo la barra, que apila sus dos lados por
72
72
 
73
73
  | pieza | mobile | web | fuente |
74
74
  |---|---|---|---|
75
- | `sui-filter-bar` | sin tamaño; los controles adentro van `large` (48) | sin tamaño; los controles `medium` (40) | web: canon (dueño, 05-10-2026, D16) · mobile: propuesta (igual que `sui-compact-select` en una barra) |
76
- | `sui-filter-item` | 36 de alto, no se puede cambiar: debajo de los 44 del dedo | 36 | propuesta |
75
+ | `sui-filter-bar` | sin tamaño; los controles adentro van `large` (48) | sin tamaño; los controles `medium` (40) | canon (D16, dueño 05-10-2026) |
76
+ | `sui-filter-item` | 36 de alto, no se puede cambiar: debajo de los 44 del dedo | 36 | pendiente (P19: área invisible de 44 o no usarlo en mobile) |
77
77
  | `sui-filter-panel-footer` | `medium` (40) es lo más grande que tiene; en mobile, mejor `sui-modal-footer` (48) dentro de un `sui-modal-sheet` | `medium` (40) | canon para el 48 de mobile (CLAUDE.md: footer de modal `large`); web `medium` (40): canon (dueño, 05-10-2026, D16), reemplaza el `small` del bloque B1 (`small` es el default del componente: hay que pasarlo) |
78
78
  | `sui-filter-panel-header` | sin tamaño | sin tamaño | — |
79
79
 
80
80
  ```html
81
81
  <sui-filter-bar>
82
- <sui-segmented-control slot="start" … />
82
+ <sui-segmented-control slot="start" [size]="bp.tactil() ? '2xlarge' : 'medium'" … />
83
83
  <div slot="end">
84
- <sui-input type="search" [size]="bp.isMobile() ? 'large' : 'medium'" placeholder="Buscar pedido…" … />
84
+ <sui-input type="search" [size]="bp.sizeControl()" placeholder="Buscar pedido…" … />
85
85
  </div>
86
86
  </sui-filter-bar>
87
87
  ```
88
88
 
89
+ ### Por dispositivo (D16)
90
+
91
+ Las piezas no tienen un `size` propio (salvo el pie): lo que cambia por dispositivo son los
92
+ controles que se proyectan en la barra. Fuente: D16, dueño 05-10-2026 (fila `filter`).
93
+
94
+ | dispositivo | size | nota |
95
+ |---|---|---|
96
+ | celular chico (< 380) | sin regla en la tabla (`—`) | la fila `filter` de D16 no lo define; `bp.sizeControl()` da `large`, igual que en el celular, mientras el DS no estire a 44 el área de los `medium` |
97
+ | celular (380–767) | controles `large` · segmented `2xlarge` | el panel va en un `sui-modal-sheet` con `sui-modal-footer` (48), no con este pie; el área de 44 de `sui-filter-item` está pendiente (P19) |
98
+ | tablet táctil (`pointer: coarse`) | controles `large` · segmented `2xlarge` | se toca como un celular: el panel lleva `sui-modal-footer` (48) en vez de este pie, que llega solo a `medium` (40). D16 no fija el pie en la tablet; esto sigue la columna «mobile» de arriba. El área de 44 de `sui-filter-item` está pendiente (P19), igual que en el celular |
99
+ | computadora (`pointer: fine`) | controles `medium` · `sui-filter-panel-footer` `medium` | el default del pie es `small`: hay que pasarlo |
100
+
101
+ En el ultrawide, igual que en la computadora: el espacio extra va al ancho de la tabla, no a
102
+ controles más grandes.
103
+
104
+ En master-pedidos: `[size]="bp.sizeControl()"` en el `sui-input`, `sui-select` o
105
+ `sui-compact-select` de la barra, `[size]="bp.tactil() ? '2xlarge' : 'medium'"` en el
106
+ `sui-segmented-control` (no tiene helper) y `size="medium"` fijo en `sui-filter-panel-footer`,
107
+ que solo se usa en la computadora (solo tiene `small` y `medium`: `bp.sizeControl()` le pasaría un
108
+ `large` que no existe); con `bp.tactil()` el panel lleva `sui-modal-footer` en su lugar. No uses
109
+ `bp.isMobile() ? 'large' : 'medium'`: deja la tablet táctil en `medium`.
110
+
89
111
  ## API
90
112
 
91
113
  <!-- api:inicio -->
@@ -159,6 +181,53 @@ de `sui-drawer-footer`).
159
181
  - El footer no llega a `large`: en mobile queda más chico que el footer de cualquier modal.
160
182
  - `disabled` del item usa opacidad (no está en el Figma).
161
183
 
184
+ ## Bien y mal
185
+
186
+ > Hoy no hay usos de estas piezas fuera de la vitrina `master-preview`: los pares salen de las
187
+ > trampas de este README.
188
+
189
+ Pie del panel en la computadora
190
+
191
+ ```html
192
+ <!-- ❌ mal: sin size queda en small (36), y D16 no usa small -->
193
+ <sui-filter-panel-footer (clear)="limpiar()" (apply)="aplicar()" />
194
+ ```
195
+
196
+ ```html
197
+ <!-- ✅ bien -->
198
+ <sui-filter-panel-footer size="medium" (clear)="limpiar()" (apply)="aplicar()" />
199
+ ```
200
+
201
+ «Limpiar» en dos lugares
202
+
203
+ ```html
204
+ <!-- ❌ mal: «Limpiar» en la cabecera y en el pie; se elige uno -->
205
+ <sui-filter-panel-header label="Filtros" [clear]="true" (clearClick)="limpiar()" />
206
+ <sui-filter-panel-footer size="medium" (clear)="limpiar()" (apply)="aplicar()" />
207
+ ```
208
+
209
+ ```html
210
+ <!-- ✅ bien -->
211
+ <sui-filter-panel-header label="Filtros" leftIcon="equalizer-line" />
212
+ <sui-filter-panel-footer size="medium" (clear)="limpiar()" (apply)="aplicar()" />
213
+ ```
214
+
215
+ Buscador de la barra
216
+
217
+ ```html
218
+ <!-- ❌ mal: isMobile deja la tablet táctil en medium (40), debajo de los 44 -->
219
+ <sui-filter-bar>
220
+ <sui-input slot="end" type="search" [size]="bp.isMobile() ? 'large' : 'medium'" />
221
+ </sui-filter-bar>
222
+ ```
223
+
224
+ ```html
225
+ <!-- ✅ bien -->
226
+ <sui-filter-bar>
227
+ <sui-input slot="end" type="search" [size]="bp.sizeControl()" placeholder="Buscar pedido…" />
228
+ </sui-filter-bar>
229
+ ```
230
+
162
231
  ## Ejemplo
163
232
 
164
233
  ```html
@@ -63,11 +63,31 @@ se migra todo ahora, no solo al tocar cada pantalla.
63
63
  | fila de una lista | `md` (24) | `sm` (20) |
64
64
 
65
65
  ```html
66
- <sui-flag name="peru" [size]="bp.isMobile() ? 'sm' : 'xs'" ariaLabel="Perú" />
66
+ <sui-flag name="peru" [size]="bp.celular() ? 'sm' : 'xs'" ariaLabel="Perú" />
67
67
  ```
68
68
 
69
69
  La bandera no se toca: el área táctil es la del select que la contiene.
70
70
 
71
+ ### Por dispositivo (D16)
72
+
73
+ La bandera no se toca: sube un paso **solo en el celular de 380 px o más**. Fuente: D16, dueño
74
+ 05-10-2026 (P1 b).
75
+
76
+ | dispositivo | size | nota |
77
+ |---|---|---|
78
+ | celular chico (< 380) | valor «web» (`xs` en el prefijo, `sm` en una fila) | no se toca: no sube aunque sea un celular |
79
+ | celular (380–767) | valor «mobile» (`sm` en el prefijo, `md` en una fila) | un paso más que en la computadora |
80
+ | tablet táctil (`pointer: coarse`) | valor «web» (`xs` / `sm`) | no se toca: el puntero no cambia nada |
81
+ | computadora (`pointer: fine`) | valor «web» (`xs` / `sm`) | |
82
+
83
+ En el ultrawide, igual que en la computadora: el espacio extra va a más columnas, no a banderas
84
+ más grandes.
85
+
86
+ En master-pedidos no hay helper: `[size]="bp.celular() ? 'sm' : 'xs'"` en el prefijo y
87
+ `[size]="bp.celular() ? 'md' : 'sm'"` en una fila. No uses `bp.isMobile()`: incluye el celular
88
+ chico, que va con el valor de web. Dentro de un select o un compact-select no se pasa nada: el
89
+ componente elige el tamaño de su bandera.
90
+
71
91
  ## «No usar»: por qué no hoy y cuándo sí
72
92
 
73
93
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -97,6 +117,47 @@ Outputs: ninguno.
97
117
  - **El nombre va en inglés** y con las grafías del set (`slovania`, `mauritus`, `taijikistan`):
98
118
  copia el slug de `SUI_FLAG_NAMES`, no lo escribas de memoria.
99
119
 
120
+ ## Bien y mal
121
+
122
+ > Hoy no hay usos directos fuera de la vitrina `master-preview`: los pares salen de las reglas
123
+ > de este README.
124
+
125
+ Bandera de adorno
126
+
127
+ ```html
128
+ <!-- ❌ mal: la app es solo Perú; la bandera no le dice nada a nadie -->
129
+ <p><sui-flag name="peru" size="sm" /> Delivery en todo el Perú</p>
130
+ ```
131
+
132
+ ```html
133
+ <!-- ✅ bien -->
134
+ <p>Delivery en todo el Perú</p>
135
+ ```
136
+
137
+ País sin nombre al lado
138
+
139
+ ```html
140
+ <!-- ❌ mal: sin ariaLabel es decorativa y el lector de pantalla no dice el país -->
141
+ <sui-flag name="venezuela" [size]="bp.celular() ? 'md' : 'sm'" />
142
+ ```
143
+
144
+ ```html
145
+ <!-- ✅ bien -->
146
+ <sui-flag name="venezuela" [size]="bp.celular() ? 'md' : 'sm'" ariaLabel="Venezuela" />
147
+ ```
148
+
149
+ Tamaño por dispositivo
150
+
151
+ ```html
152
+ <!-- ❌ mal: isMobile sube la bandera también en el celular chico (< 380), que va con el valor de web -->
153
+ <sui-flag name="peru" [size]="bp.isMobile() ? 'sm' : 'xs'" ariaLabel="Perú" />
154
+ ```
155
+
156
+ ```html
157
+ <!-- ✅ bien -->
158
+ <sui-flag name="peru" [size]="bp.celular() ? 'sm' : 'xs'" ariaLabel="Perú" />
159
+ ```
160
+
100
161
  ## Ejemplo
101
162
 
102
163
  ```html
@@ -32,7 +32,7 @@ Regla corta: **ayuda o error de un control sin hint propio → form-hint · camp
32
32
  > y opcional. No da reglas de largo ni de copy.
33
33
  >
34
34
  > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`; las cifras
35
- > siguen iguales el 04-10-2026, las líneas de abajo están actualizadas a esa fecha):
35
+ > siguen iguales el 04-10-2026, las líneas de abajo se revisaron el 06-10-2026):
36
36
  > **36 usos en 18 archivos**: 11 `error`, 25 `neutral` (24 por default y 1 explícito), 0
37
37
  > `disabled`; 2 con `icon` propio (`information-line`). Hay además **al menos 14 hints escritos a
38
38
  > mano** con clases propias (`__form-hint`, `__hint`).
@@ -65,11 +65,11 @@ Regla corta: **ayuda o error de un control sin hint propio → form-hint · camp
65
65
  («Pausa tu sucursal…», bajo el título de la card), `:61`, `pages/drivers/drivers.html:29`,
66
66
  `pages/driver/driver-schedule/driver-schedule.html:92`.
67
67
  - **12 de más de 8 palabras** (4 son los subtítulos de arriba) → acortar, o `sui-alert` si de
68
- verdad hace falta todo: `pages/super-admin/master-users/master-users.html:66` (26 palabras),
69
- `pages/orders/orders.html:589` (23), `pages/driver/driver-order-detail/driver-order-detail.html:868` (23),
70
- `pages/envios/envios.html:401` (15).
68
+ verdad hace falta todo: `pages/super-admin/master-users/master-users.html:68` (26 palabras),
69
+ `pages/orders/orders.html:590` (23), `pages/driver/driver-order-detail/driver-order-detail.html:898` (23),
70
+ `pages/envios/envios.html:402` (15).
71
71
  - **Al menos 14 hints a mano** con clases propias. Ejemplos: `pages/discounts/discounts.html:205`
72
- (`discounts__form-hint`), `components/settings-panel/settings-panel.html:93`,
72
+ (`discounts__form-hint`), `components/settings-panel/settings-panel.html:95`,
73
73
  `pages/promociones/promociones.html:181`.
74
74
 
75
75
  ## Tamaño en mobile y en web
@@ -80,6 +80,12 @@ Regla corta: **ayuda o error de un control sin hint propio → form-hint · camp
80
80
 
81
81
  Es texto que no se toca: el mismo tamaño en las dos plataformas está bien.
82
82
 
83
+ ### Por dispositivo (D16)
84
+
85
+ No aplica: no tiene `size` (la letra es fija de 12/16 px y no se toca), así que es la misma en el
86
+ celular chico, el celular, la tablet táctil, la computadora y el ultrawide. En master-pedidos no
87
+ lleva `bp`.
88
+
83
89
  ## «No usar»: por qué no hoy y cuándo sí
84
90
 
85
91
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -115,6 +121,49 @@ Outputs: ninguno.
115
121
  (04-10-2026). Para enlazarlo a un control propio, pon `id` en el host y apúntalo con
116
122
  `aria-describedby`; los campos del DS ya lo hacen solos.
117
123
 
124
+ ## Bien y mal
125
+
126
+ Ayuda debajo de un campo de texto
127
+
128
+ ```html
129
+ <!-- ❌ mal: sui-input ya trae su hint (pages/driver-onboarding/step-info/step-info.html:50) -->
130
+ <sui-input [size]="bp.sizeControl()" [errorMessage]="nameError() || null" … />
131
+ @if (!nameError()) { <sui-form-hint message="Como aparece en tu DNI." /> }
132
+ ```
133
+
134
+ ```html
135
+ <!-- ✅ bien -->
136
+ <sui-input [size]="bp.sizeControl()" hint="Como aparece en tu DNI"
137
+ [error]="!!nameError()" [errorMessage]="nameError() || null" … />
138
+ ```
139
+
140
+ Subtítulo de una card
141
+
142
+ ```html
143
+ <!-- ❌ mal: no es ayuda de un campo, es el texto de la sección (pages/schedule/schedule.html:17) -->
144
+ <h2 class="schedule__card-title">Estado de la sucursal</h2>
145
+ <sui-form-hint message="Pausa tu sucursal sin perder el horario que ya configuraste." />
146
+ ```
147
+
148
+ ```html
149
+ <!-- ✅ bien -->
150
+ <h2 class="schedule__card-title">Estado de la sucursal</h2>
151
+ <p class="schedule__card-subtitle">Pausa tu sucursal sin perder el horario que ya configuraste.</p>
152
+ ```
153
+
154
+ Explicación de dos oraciones
155
+
156
+ ```html
157
+ <!-- ❌ mal: 23 palabras; pasa las 8 del hint (pages/orders/orders.html:590) -->
158
+ <sui-form-hint message="Si eliges un motivo de la lista, el cliente lo verá. Si escribes uno propio, verá “El local no pudo preparar tu pedido”." />
159
+ ```
160
+
161
+ ```html
162
+ <!-- ✅ bien -->
163
+ <sui-alert variant="info"
164
+ description="Si eliges un motivo de la lista, el cliente lo verá. Si escribes uno propio, verá «El local no pudo preparar tu pedido»." />
165
+ ```
166
+
118
167
  ## Ejemplo
119
168
 
120
169
  ```html
@@ -78,7 +78,7 @@ tipografía, no área táctil.
78
78
  - **1 encima de un `sui-textarea`**, que ya trae su `[label]`: `pages/promociones/promociones.html:201`
79
79
  («Descripción»).
80
80
  - **3 con un switch armado a mano al lado → `sui-switch-label`:** `pages/discounts/discounts.html:204`,
81
- `:316`; `components/add-product-modal/add-product-modal.html:204`.
81
+ `:316`; `components/add-product-modal/add-product-modal.html:206`.
82
82
 
83
83
  ## Tamaño en mobile y en web
84
84
 
@@ -91,6 +91,13 @@ No necesita `bp`: es texto, no se toca. Lo único tocable es el `link` («Cambia
91
91
  `sui-link-button` de 12 px **sin tamaño para mobile**: su área táctil es la del texto. Si en
92
92
  mobile esa acción importa, conviene un botón aparte.
93
93
 
94
+ ### Por dispositivo (D16)
95
+
96
+ No aplica: el `size` es tipografía, no área táctil, y no depende del dispositivo. Va `medium`
97
+ (14 px) en el celular chico, el celular, la tablet táctil, la computadora y el ultrawide;
98
+ `small` dibuja igual y `xsmall` no se usa (D16, dueño 05-10-2026: nada en `small`/`xsmall`).
99
+ En master-pedidos: sin `[size]` (el default `medium` ya es el correcto) y sin `bp`.
100
+
94
101
  ## «No usar»: por qué no hoy y cuándo sí
95
102
 
96
103
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -131,6 +138,51 @@ mobile esa acción importa, conviene un botón aparte.
131
138
  `rel="noopener noreferrer"`). Se pinta en gris, empujado a la derecha.
132
139
  - El ícono de info es gris muy claro a propósito (baja jerarquía); se oscurece al pasar el mouse.
133
140
 
141
+ ## Bien y mal
142
+
143
+ Campo de texto con su rótulo
144
+
145
+ ```html
146
+ <!-- ❌ mal: sui-input ya dibuja su label y su asterisco (pages/driver-onboarding/step-info/step-info.html:37) -->
147
+ <sui-form-label label="Nombre completo" [required]="true" for="ob-name" />
148
+ <sui-input [size]="bp.sizeControl()" type="text" [(value)]="nombre" />
149
+ ```
150
+
151
+ ```html
152
+ <!-- ✅ bien -->
153
+ <sui-input [size]="bp.sizeControl()" type="text" label="Nombre completo" [required]="true" [(value)]="nombre" />
154
+ ```
155
+
156
+ Título de una sección
157
+
158
+ ```html
159
+ <!-- ❌ mal: «Datos personales» titula la sección, no un campo (pages/customer/checkout/checkout.html:187) -->
160
+ <section class="checkout__section">
161
+ <sui-form-label label="Datos personales" size="medium" />
162
+ ```
163
+
164
+ ```html
165
+ <!-- ✅ bien -->
166
+ <section class="checkout__section">
167
+ <h2 class="checkout__section-title">Datos personales</h2>
168
+ ```
169
+
170
+ Rótulo de un switch
171
+
172
+ ```html
173
+ <!-- ❌ mal: label, ayuda y switch armados a mano (pages/discounts/discounts.html:204) -->
174
+ <sui-form-label label="Un uso por cliente" />
175
+ <span class="discounts__form-hint">Si activas esto, cada cliente solo podrá usar el cupón…</span>
176
+ <sui-switch [size]="bp.controlSize()" [checked]="unUso()" (checkedChange)="unUso.set($event)" />
177
+ ```
178
+
179
+ ```html
180
+ <!-- ✅ bien -->
181
+ <sui-switch-label [size]="bp.controlSize()" label="Un uso por cliente"
182
+ description="Cada cliente usa el cupón una sola vez"
183
+ [active]="unUso()" (activeChange)="unUso.set($event)" />
184
+ ```
185
+
134
186
  ## Ejemplo
135
187
 
136
188
  ```html