@ajuarezso/sui-design-system 0.25.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) 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/package.json +1 -1
  118. package/types/ajuarezso-sui-design-system.d.ts +19 -19
@@ -30,7 +30,7 @@ Regla corta: **el campo cambia según una elección corta pegada a él → este
30
30
  >
31
31
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Candidato: el gasto del super
32
32
  > admin pone «Monto» (`type="number"`) y «Moneda» (PEN/USD) como dos campos separados,
33
- > `pages/super-admin/master-gastos/master-gastos.html:195` y `:203`.
33
+ > `pages/super-admin/master-gastos/master-gastos.html:197` y `:206` (medido el 06-10-2026).
34
34
 
35
35
  | prop | cuándo | fuente |
36
36
  |---|---|---|
@@ -57,7 +57,7 @@ en 16/24, igual que el valor del `sui-input` large; el alto no cambia (46 dentro
57
57
  | size del input y del selector | campo | fuente |
58
58
  |---|---|---|
59
59
  | `large` | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
60
- | `medium` (default) · `small` · `xsmall` | 40 · 36 · 32 | según la guía del DS |
60
+ | `medium` (default) · `small` · `xsmall` | 40 · 36 · 32 | según la guía del DS · `small` y `xsmall` no se usan: D16, dueño 05-10-2026 |
61
61
 
62
62
  | uso | mobile | web | fuente |
63
63
  |---|---|---|---|
@@ -66,11 +66,28 @@ en 16/24, igual que el valor del `sui-input` large; el alto no cambia (46 dentro
66
66
  Arreglo del 03-10-2026: antes el selector medía 40/36/32 y empujaba el campo a 42/38/34 (el padding
67
67
  de la guía no descontaba el borde del input). Ahora el campo mide exacto.
68
68
 
69
+ ### Por dispositivo (D16)
70
+
71
+ Comparte fila con `input` y `select` en la tabla de D16 (dueño, 05-10-2026). El size lo decide el
72
+ `sui-input` que lo contiene: el selector lleva **el mismo**.
73
+
74
+ | dispositivo | size (input y selector) | nota |
75
+ |---|---|---|
76
+ | celular chico (< 380 px) | `large` (48) | interino: D16 pide `medium` con área tocable de 44, pero el DS todavía no la estira en `medium` (40); hasta que lo haga, el mismo que el celular |
77
+ | celular (380–767 px) | `large` (48) | el selector toca de arriba a abajo (46) |
78
+ | tablet táctil (`pointer: coarse`) | `large` (48) | también se toca; las opciones de un `medium` solo suben a 44 hasta 767 px |
79
+ | computadora (`pointer: fine`) | `medium` (40) | `small` y `xsmall` no se usan |
80
+
81
+ Ultrawide (≥ 1920 px): igual que la computadora.
82
+
83
+ En master-pedidos: `[size]="bp.sizeControl()"` **en el `sui-input` y en el selector**, los dos con el
84
+ mismo helper.
85
+
69
86
  ## «No usar»: por qué no hoy y cuándo sí
70
87
 
71
88
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
72
89
  |---|---|---|
73
- | el componente entero (0 usos) | todo es en soles y con +51 | la moneda de un gasto (`master-gastos.html:195`) o teléfonos de otro país |
90
+ | el componente entero (0 usos) | todo es en soles y con +51 | la moneda de un gasto (`master-gastos.html:197`) o teléfonos de otro país |
74
91
  | `country` con bandera | solo hay teléfonos de Perú | repartidores o clientes con número extranjero |
75
92
 
76
93
  ## API
@@ -110,11 +127,58 @@ Implementa `ControlValueAccessor`.
110
127
  movió el clic a un div interno. Aquí sigue en el host. Probar en un iPhone antes del primer uso.
111
128
  - No mezclar `[(selected)]` con `formControlName`.
112
129
 
130
+ ## Bien y mal
131
+
132
+ **El tamaño del selector y del campo**
133
+
134
+ ```html
135
+ <!-- ❌ mal: el selector en medium dentro de un input large; no cubre el campo (vitrina: master-preview/_guia-moleculas/campos.ts:247) -->
136
+ <sui-input size="large" type="amount" label="Monto" [leadingControl]="true">
137
+ <sui-compact-select-for-input data-slot="start" size="medium" [country]="false" [items]="monedas" />
138
+ </sui-input>
139
+ ```
140
+
141
+ ```html
142
+ <!-- ✅ bien -->
143
+ <sui-input [size]="bp.sizeControl()" type="amount" label="Monto" [leadingControl]="true">
144
+ <sui-compact-select-for-input data-slot="start" [size]="bp.sizeControl()" [country]="false" [items]="monedas" />
145
+ </sui-input>
146
+ ```
147
+
148
+ **Dónde se proyecta**
149
+
150
+ ```html
151
+ <!-- ❌ mal: slot="prefix" no proyecta y, sin leadingControl, el input no dibuja el divisor -->
152
+ <sui-input [size]="bp.sizeControl()" type="amount" label="Monto">
153
+ <sui-compact-select-for-input slot="prefix" [size]="bp.sizeControl()" [country]="false" [items]="monedas" />
154
+ </sui-input>
155
+ ```
156
+
157
+ ```html
158
+ <!-- ✅ bien -->
159
+ <sui-input [size]="bp.sizeControl()" type="amount" label="Monto" [leadingControl]="true">
160
+ <sui-compact-select-for-input data-slot="start" [size]="bp.sizeControl()" [country]="false" [items]="monedas" />
161
+ </sui-input>
162
+ ```
163
+
164
+ **Una moneda**
165
+
166
+ ```html
167
+ <!-- ❌ mal: country arranca en true; una moneda no lleva bandera -->
168
+ <sui-compact-select-for-input data-slot="start" [size]="bp.sizeControl()" [items]="monedas" [(selected)]="moneda" />
169
+ ```
170
+
171
+ ```html
172
+ <!-- ✅ bien -->
173
+ <sui-compact-select-for-input data-slot="start" [size]="bp.sizeControl()" [country]="false"
174
+ [items]="monedas" [(selected)]="moneda" />
175
+ ```
176
+
113
177
  ## Ejemplo
114
178
 
115
179
  ```html
116
- <sui-input label="Monto" type="amount" placeholder="0.00" [leadingControl]="true" [(value)]="monto">
117
- <sui-compact-select-for-input data-slot="start" size="medium" [country]="false"
180
+ <sui-input label="Monto" type="amount" placeholder="0.00" [size]="bp.sizeControl()" [leadingControl]="true" [(value)]="monto">
181
+ <sui-compact-select-for-input data-slot="start" [size]="bp.sizeControl()" [country]="false"
118
182
  [items]="monedas" [(selected)]="moneda" />
119
183
  </sui-input>
120
184
  ```
@@ -82,9 +82,27 @@ táctil de `large` es de **44** (desde el 04-10-2026; 40 en web).
82
82
  | X para quitar | `large` (32, área 44) | `medium` (20) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: canon (aprobado por el dueño, 05-10-2026, bloque B1) (el tamaño `large` es extensión SUI aprobada el 03-10-2026) |
83
83
 
84
84
  ```html
85
- <sui-content-card … [size]="bp.isMobile() ? 'large' : 'medium'" (dismiss)="quitar(item)" />
85
+ <sui-content-card … [size]="bp.tactil() ? 'large' : 'medium'" (dismiss)="quitar(item)" />
86
86
  ```
87
87
 
88
+ ### Por dispositivo (D16)
89
+
90
+ No está en la tabla por componente de D16 (dueño, 05-10-2026). La fila no cambia; el `size` solo
91
+ mueve la X, que **se toca**, así que va como «lo que se toca».
92
+
93
+ | dispositivo | size | nota |
94
+ |---|---|---|
95
+ | celular chico (< 380 px) | `large` (32, área 44) | interino: D16 pide `medium` con área de 44, pero la X `medium` tiene área de 20; hasta que el DS la estire, el mismo que el celular |
96
+ | celular (380–767 px) | `large` (32, área 44) | |
97
+ | tablet táctil (`pointer: coarse`) | `large` (32, área 40) | también se toca. Ojo: el área de 44 del `::before` está bajo `@media (max-width: 767px)` (`sui-content-card.scss:118`), así que en la tablet se queda en 40 hasta que el DS la prenda con `pointer: coarse` |
98
+ | computadora (`pointer: fine`) | `medium` (20) | |
99
+
100
+ Ultrawide (≥ 1920 px): igual que la computadora. Con `[dismissible]="false"` (los 4 usos de hoy) el
101
+ `size` no cambia nada y no hace falta pasarlo. El badge de adentro **no se toca**: su `size` va
102
+ dentro del objeto `badge` con `bp.sizeBadge()` (como `master-overview.html:335`).
103
+
104
+ En master-pedidos: `[size]="bp.tactil() ? 'large' : 'medium'"` (no hay helper propio).
105
+
88
106
  ## «No usar»: por qué no hoy y cuándo sí
89
107
 
90
108
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -135,6 +153,49 @@ táctil de `large` es de **44** (desde el 04-10-2026; 40 en web).
135
153
  - No tiene `interactive` ni output de toque: la fila no se puede tocar entera.
136
154
  - El host borra el atributo `title` del DOM y lleva `role="group"` con `aria-label` = `title`.
137
155
 
156
+ ## Bien y mal
157
+
158
+ **La nota como badge**
159
+
160
+ ```html
161
+ <!-- ❌ mal: badge en string sale naranja lighter small, en MAYÚSCULAS (prototipo: master-prototipos.html:146) -->
162
+ <sui-content-card type="avatar" [avatar]="{ initials: yo.iniciales, color: 'orange' }" [title]="yo.nombre"
163
+ badge="★ 5.0" [dismissible]="false" />
164
+ ```
165
+
166
+ ```html
167
+ <!-- ✅ bien -->
168
+ <sui-content-card type="avatar" [avatar]="{ initials: yo.iniciales, color: 'orange' }" [title]="yo.nombre"
169
+ [badge]="{ label: '5.0 ★', color: 'orange', variant: 'lighter', size: bp.sizeBadge() }"
170
+ [dismissible]="false" />
171
+ ```
172
+
173
+ **Una fila que no se quita**
174
+
175
+ ```html
176
+ <!-- ❌ mal: dismissible arranca en true; sale una X que no hace nada -->
177
+ <sui-content-card type="avatar" [avatar]="avatarDe(c, 'blue')" [title]="c.nombre" [subtitle]="c.detalle" />
178
+ ```
179
+
180
+ ```html
181
+ <!-- ✅ bien -->
182
+ <sui-content-card type="avatar" [avatar]="avatarDe(c, 'blue')" [title]="c.nombre" [subtitle]="c.detalle"
183
+ [dismissible]="false" />
184
+ ```
185
+
186
+ **Una fila que sí se quita**
187
+
188
+ ```html
189
+ <!-- ❌ mal: la X en medium mide 20 en el celular y se anuncia como «Descartar» -->
190
+ <sui-content-card type="avatar" [avatar]="m.avatar" [title]="m.nombre" (dismiss)="quitar(m)" />
191
+ ```
192
+
193
+ ```html
194
+ <!-- ✅ bien -->
195
+ <sui-content-card type="avatar" [avatar]="m.avatar" [title]="m.nombre" [size]="bp.tactil() ? 'large' : 'medium'"
196
+ [dismissAriaLabel]="'Quitar a ' + m.nombre + ' del equipo'" (dismiss)="quitar(m)" />
197
+ ```
198
+
138
199
  ## Ejemplo
139
200
 
140
201
  ```html
@@ -143,6 +204,6 @@ táctil de `large` es de **44** (desde el 04-10-2026; 40 en web).
143
204
  [avatar]="{ src: local.logo, initials: 'SA', color: 'orange' }"
144
205
  [title]="local.nombre"
145
206
  [subtitle]="local.pedidos + ' pedidos este mes'"
146
- [badge]="{ label: '4.6 ★', color: 'orange', variant: 'lighter', size: 'small' }"
207
+ [badge]="{ label: '4.6 ★', color: 'orange', variant: 'lighter', size: bp.sizeBadge() }"
147
208
  [dismissible]="false" />
148
209
  ```
@@ -82,6 +82,15 @@ computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el
82
82
  los botones (`icon-button`, `text-button`, grupos) quedan debajo de los 44 px del dedo; es otra
83
83
  razón para no usarlos hoy. Si un flujo nuevo los necesita en mobile, se pide al DS un tamaño grande.
84
84
 
85
+ ### Por dispositivo (D16)
86
+
87
+ No aplica: **no tiene `size`** (texto de 11–12 y botones de 32 en todos los dispositivos, del
88
+ celular chico al ultrawide). Con D16 los botones de 32 quedan bajo los 44 también en la tablet
89
+ táctil (`pointer: coarse`), no solo en el celular: una razón más para no usar los tipos con botón
90
+ hasta que el DS tenga un tamaño grande.
91
+
92
+ En master-pedidos: no hay helper ni `[size]`; solo `type` y `text`.
93
+
85
94
  ## API
86
95
 
87
96
  <!-- api:inicio -->
@@ -107,13 +116,52 @@ Outputs: `(buttonClick)` en `icon-button` y `text-button`; `(itemClick)` con
107
116
 
108
117
  ## Trampas
109
118
 
110
- - **Todo el texto sale en MAYÚSCULAS** por CSS: escribirlo normal.
119
+ - **El texto de `text-line`, `text` y `solid-text` sale en MAYÚSCULAS** por CSS: escribirlo normal.
120
+ Los botones (`text-button`, `text-button-group`) no van en mayúsculas.
111
121
  - **`text` y `solid-text` alinean a la izquierda**, no al centro (así está en el Figma).
112
122
  - `text-line` usa 11 px; `text` y `solid-text`, 12 px.
113
123
  - Sin `ariaLabel`, el `icon-button` se anuncia como «Acción» y los ítems de grupo como
114
124
  «Acción 0», «Acción 1».
115
125
  - `line` y `line-spacing` existen, pero la línea sola es `sui-divider`.
116
126
 
127
+ ## Bien y mal
128
+
129
+ **El «o» entre Google y el correo**
130
+
131
+ ```html
132
+ <!-- ❌ mal: el «o» armado a mano, como estaba en login.html:61 y register.html:97 hasta el 03-10-2026 -->
133
+ <div class="auth-page__divider"><span>o</span></div>
134
+ ```
135
+
136
+ ```html
137
+ <!-- ✅ bien -->
138
+ <sui-content-divider type="text-line" text="o" />
139
+ ```
140
+
141
+ **Cabecera de grupo en MAYÚSCULAS a mano**
142
+
143
+ ```html
144
+ <!-- ❌ mal: el componente ya lo pasa a MAYÚSCULAS; el texto va en sentence case (CANON-SUI §5.1) -->
145
+ <sui-content-divider type="solid-text" text="CON POCOS PEDIDOS" />
146
+ ```
147
+
148
+ ```html
149
+ <!-- ✅ bien -->
150
+ <sui-content-divider type="solid-text" text="Con pocos pedidos" />
151
+ ```
152
+
153
+ **Una línea sola entre dos bloques**
154
+
155
+ ```html
156
+ <!-- ❌ mal: `line` no dice nada; la línea sola es `sui-divider`, que pesa menos -->
157
+ <sui-content-divider type="line" />
158
+ ```
159
+
160
+ ```html
161
+ <!-- ✅ bien -->
162
+ <sui-divider />
163
+ ```
164
+
117
165
  ## Ejemplo
118
166
 
119
167
  ```html
@@ -64,29 +64,61 @@ content-card · ajuste → switch-label.**
64
64
  | `toggle` / `toggleChecked` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
65
65
  | `disabled` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
66
66
 
67
- **Usos de hoy que rompen las reglas:** 0. A mirar: los 3 badges de
67
+ **Usos de hoy que rompen las reglas:** 0 en tipo y piezas. **Con D16 (medido el 06-10-2026)
68
+ rompen el `size` 5**: `pages/driver/driver-dashboard/driver-dashboard.html:1236` (`medium` fijo en
69
+ una fila de dato), los 3 de `step-complete.html:48`–`:58` (sin `size`, fila de dato) y
70
+ `step-complete.html:80` (sin `size`, fila que se toca: queda en `medium` en el celular y la tablet,
71
+ donde la fila de D16 pide `large`). Ojo: en ese último el área táctil está bien (el `<a>` que lo
72
+ envuelve mide 66); lo que rompe es el tamaño de lectura, no el dedo. A mirar: los 3 badges de
68
73
  `pages/driver-onboarding/step-complete/step-complete.html:48`–`:58` dicen estados de ciclo
69
74
  («Completados», «Esperando vinculación»); el README de `sui-badge` deja esos en
70
75
  `sui-status-badge`, pero el content-label solo recibe la config del badge.
71
76
 
72
77
  ## Tamaño en mobile y en web
73
78
 
74
- No se toca, así que no tiene que llegar a 44. El `size` es de lectura, no de dedo.
79
+ No se toca, así que no tiene que llegar a 44. El `size` es de lectura, no de dedo: cuando la fila
80
+ entera se toca, el área de 44 la pone lo que la envuelve (un `<a>` o un botón), no el `size`.
75
81
 
76
82
  | uso | mobile | web | fuente |
77
83
  |---|---|---|---|
78
84
  | consejos y pasos | `large` | `large` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
79
85
  | filas de dato | `large` | `medium` | canon (dueño, 05-10-2026, D16): grande en el celular; `medium` en la computadora, la tablet y el celular chico (no se toca) |
80
- | fila que se toca (soporte) | `large`, o dale a la fila un alto mínimo de 44 | `medium` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
86
+ | fila que se toca (soporte) | `large` (celular y tablet táctil) | `medium` (computadora y celular chico) | canon (aprobado por el dueño, 05-10-2026, bloque B1; dispositivos por D16). Además, lo que la envuelve mide 44 o más de alto |
81
87
 
82
88
  Alto de la fila, medido: `medium` 40 (máx. entre el leading de 40 y el texto 20 + 4 + 16) y
83
89
  `large` 48 (máx. entre 48 y 24 + 4 + 20). Lo que se toca es lo que la envuelve: «Contactar soporte»
84
90
  va dentro de un `<a>` con padding 12 y borde 1, que da 66.
85
91
 
86
92
  ```html
87
- <sui-content-label [size]="bp.isMobile() ? 'large' : 'medium'" … /> <!-- filas de dato y filas que se tocan (D16) -->
93
+ <sui-content-label [size]="bp.celular() ? 'large' : 'medium'" … /> <!-- filas de dato (D16) -->
94
+ <sui-content-label [size]="bp.tactil() && !bp.celularChico() ? 'large' : 'medium'" … /> <!-- fila que se toca (D16) -->
88
95
  ```
89
96
 
97
+ ### Por dispositivo (D16)
98
+
99
+ Fila de D16 para `content-label` (dueño, 05-10-2026). Es de lectura: sube un paso solo en el
100
+ celular, salvo que la fila entera se toque, que entonces sube también en la tablet táctil. En el
101
+ celular chico queda `medium` en los dos casos: la fila de D16 no lleva el «+ área 44» de lo que se
102
+ toca, porque el área la da lo que envuelve a la fila.
103
+
104
+ | dispositivo | size | nota |
105
+ |---|---|---|
106
+ | celular chico (< 380) | `medium` | también si la fila se toca: el área de 44 la pone el `<a>` que la envuelve («Contactar soporte» mide 66) |
107
+ | celular (380–767) | `large` | lo que no se toca sube un paso en el celular (P1 b) |
108
+ | tablet táctil (`pointer: coarse`) | `medium` · `large` si la fila se toca | |
109
+ | computadora (`pointer: fine`) | `medium` | |
110
+
111
+ Ultrawide: igual que la computadora; el espacio extra va al ancho de la lista, no a la fila.
112
+
113
+ Los **consejos y pasos** quedan en `large` en todos los dispositivos (tabla de arriba, bloque B1):
114
+ el `size` ahí es por la descripción larga, no por el dispositivo.
115
+
116
+ En master-pedidos: no hay helper propio. Filas de dato `[size]="bp.celular() ? 'large' : 'medium'"`
117
+ (da lo mismo que `bp.sizeBadge()`); fila que se toca
118
+ `[size]="bp.tactil() && !bp.celularChico() ? 'large' : 'medium'"` (`bp.tactil()` solo daría `large`
119
+ también en el celular chico, que la fila de D16 deja en `medium`);
120
+ consejos `size="large"`.
121
+
90
122
  ## «No usar»: por qué no hoy y cuándo sí
91
123
 
92
124
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -137,6 +169,53 @@ va dentro de un `<a>` con padding 12 y borde 1, que da 66.
137
169
  - El host lleva `role="group"` y `aria-label` = `label`. El `toggle` toma su nombre del `label`
138
170
  (y su descripción de `description`) con `aria-labelledby` (revisión 04-10-2026).
139
171
 
172
+ ## Bien y mal
173
+
174
+ **Fila de dato con el tamaño fijo**
175
+
176
+ ```html
177
+ <!-- ❌ mal: `medium` también en el celular, donde D16 pide `large` (driver-dashboard.html:1236; sin size en step-complete.html:48–58) -->
178
+ <sui-content-label type="avatar" size="medium" [avatar]="n.avatar"
179
+ [label]="n.tenantName" [badge]="n.badge" badgePlacement="title" />
180
+ ```
181
+
182
+ ```html
183
+ <!-- ✅ bien -->
184
+ <sui-content-label type="avatar" [size]="bp.celular() ? 'large' : 'medium'" [avatar]="n.avatar"
185
+ [label]="n.tenantName" [badge]="n.badge" badgePlacement="title" />
186
+ ```
187
+
188
+ **Fila que se toca sin `size`**
189
+
190
+ ```html
191
+ <!-- ❌ mal: queda en `medium` en el celular y la tablet táctil, donde D16 pide `large`; el área ya está bien, el `<a>` mide 66 (step-complete.html:80) -->
192
+ <a class="complete__quick-action" [href]="whatsappUrl">
193
+ <sui-content-label type="left-icon" icon="whatsapp-line" label="Contactar soporte" />
194
+ </a>
195
+ ```
196
+
197
+ ```html
198
+ <!-- ✅ bien -->
199
+ <a class="complete__quick-action" [href]="whatsappUrl">
200
+ <sui-content-label type="left-icon" icon="whatsapp-line" label="Contactar soporte"
201
+ [size]="bp.tactil() && !bp.celularChico() ? 'large' : 'medium'" />
202
+ </a>
203
+ ```
204
+
205
+ **Un ajuste que se prende o apaga**
206
+
207
+ ```html
208
+ <!-- ❌ mal: el `toggle` es un switch `medium` fijo y la fila no se toca entera («No usar») -->
209
+ <sui-content-label label="Sonidos de la app" description="Avisos al confirmar pedidos"
210
+ [toggle]="true" [(toggleChecked)]="sonidos" />
211
+ ```
212
+
213
+ ```html
214
+ <!-- ✅ bien -->
215
+ <sui-switch-label [flip]="true" label="Sonidos de la app" description="Avisos al confirmar pedidos"
216
+ [size]="bp.controlSize()" [(active)]="sonidos" />
217
+ ```
218
+
140
219
  ## Ejemplo
141
220
 
142
221
  ```html
@@ -48,8 +48,16 @@ Regla corta: **se ajusta de a uno y tiene tope → counter · se tipea → input
48
48
  | `error` + `errorMessage` | No usar hoy: el contador no deja salir del rango. | — |
49
49
  | `required` · `sublabel` · `tooltip` | No usar hoy: una cantidad siempre tiene valor. | — |
50
50
 
51
- **Usos de hoy que rompen la regla:** ninguno (medido el 04-10-2026). Los 2 sin nombre para el
52
- lector y los 2 en `medium` fijo en el teléfono se corrigieron en la app el 03-10-2026 (`f96cf735`).
51
+ **Usos de hoy que rompen la regla:** los 4, por el `size` (medido el 06-10-2026, D16): en el
52
+ teléfono van en `large`, con botones de 40, por debajo del piso de 44.
53
+ `pages/customer/restaurant-menu/restaurant-menu.html:479` y
54
+ `components/cambiar-pasajeros/cambiar-pasajeros.html:8` llevan `size="large"` fijo, pero no les
55
+ toca lo mismo: el de restaurant-menu va junto al CTA (`bp.tactil() ? 'xlarge' : 'large'`) y el de
56
+ cambiar-pasajeros es un campo de formulario dentro de un modal, con `label` y `hint`, que va como
57
+ una fila (`bp.tactil() ? 'xlarge' : 'medium'`). `pages/customer/cart/cart.html:77` y
58
+ `pages/customer/viaje/viaje.html:182` llevan `bp.isMobile() ? 'large' : 'medium'` (además la tablet
59
+ queda en `medium`); les toca `bp.tactil() ? 'xlarge' : 'medium'`. Los 2 sin nombre para el
60
+ lector y los 2 en `medium` fijo en el teléfono ya se habían corregido el 03-10-2026 (`f96cf735`).
53
61
 
54
62
  ## Tamaño en mobile y en web
55
63
 
@@ -75,18 +83,37 @@ en 40, por debajo del piso; no hace falta un size nuevo porque `xlarge` ya llega
75
83
  | uso | mobile | web | fuente |
76
84
  |---|---|---|---|
77
85
  | cantidad junto al CTA (detalle del producto) | `xlarge` (52, botones de 44) | `large` | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
78
- | cantidad en una fila (carrito, pasajeros) | `xlarge` (52, botones de 44) | `medium` (40) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
86
+ | cantidad en una fila o campo de un formulario (carrito, pasajeros) | `xlarge` (52, botones de 44) | `medium` (40) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: canon (aprobado por el dueño, 05-10-2026, bloque B1) |
79
87
 
80
88
  ```html
81
- <sui-counter-input [size]="bp.isMobile() ? 'xlarge' : 'medium'" … /> <!-- bp = BreakpointsService -->
89
+ <sui-counter-input [size]="bp.tactil() ? 'xlarge' : 'medium'" … /> <!-- en una fila · bp = BreakpointsService -->
90
+ <sui-counter-input [size]="bp.tactil() ? 'xlarge' : 'large'" … /> <!-- junto al CTA -->
82
91
  ```
83
92
 
93
+ ### Por dispositivo (D16)
94
+
95
+ Fila de D16 para `counter-input` (dueño, 05-10-2026). Se toca: donde hay dedo va `xlarge`, el
96
+ único size con botones de 44.
97
+
98
+ | dispositivo | size | nota |
99
+ |---|---|---|
100
+ | celular chico (< 380) | `xlarge` | no hay un `medium` con botones de 44, así que no baja como el resto de lo que se toca |
101
+ | celular (380–767) | `xlarge` | campo de 52, botones de 44 |
102
+ | tablet táctil (`pointer: coarse`) | `xlarge` | Apple pide 44 pt también en iPad |
103
+ | computadora (`pointer: fine`) | `large` junto al CTA · `medium` en una fila o en un formulario | con mouse no hace falta llegar a 44 |
104
+
105
+ Ultrawide: igual que la computadora.
106
+
107
+ En master-pedidos: no hay helper (`bp.sizeControl()` da `large`/`medium` y no llega a `xlarge`).
108
+ En una fila o en un formulario `[size]="bp.tactil() ? 'xlarge' : 'medium'"`; junto al CTA
109
+ `[size]="bp.tactil() ? 'xlarge' : 'large'"`.
110
+
84
111
  ## «No usar»: por qué no hoy y cuándo sí
85
112
 
86
113
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
87
114
  |---|---|---|
88
115
  | `size` `2xsmall`, `xsmall`, `small` | en la app la cantidad se toca con el dedo, y son chicos (D16, 05-10-2026) | nunca: una tabla del panel donde se ajusta el stock también va `medium` |
89
- | `size="xlarge"` | el CTA de al lado es `large` | si el CTA del detalle pasa a `xlarge` |
116
+ | `size="xlarge"` en la computadora | con mouse no hace falta llegar a 44: junto al CTA va `large` y en una fila `medium` (D16, dueño 05-10-2026). En celular y tablet sí va `xlarge` | — |
90
117
  | `step` distinto de 1 | no hay productos que se vendan de a varios | huevos por media docena, gaseosas por pack de 6 |
91
118
  | `error` | el contador no deja salir del rango | el stock bajó con el carrito abierto y la cantidad ya no alcanza |
92
119
  | `tooltip` · `sublabel` · `required` | una cantidad siempre tiene valor | — |
@@ -136,14 +163,71 @@ en 40, por debajo del piso; no hace falta un size nuevo porque `xlarge` ya llega
136
163
  mínimo/máximo, si están definidos) desde el 04-10-2026; antes solo se operaba con − y +.
137
164
  - El campo es una píldora (radio completo), decisión de SUI; el Figma de origen usa 10/8 px.
138
165
 
166
+ ## Bien y mal
167
+
168
+ **Cantidad junto al CTA del detalle**
169
+
170
+ ```html
171
+ <!-- ❌ mal: `large` fijo deja los botones en 40 en el teléfono (restaurant-menu.html:479) -->
172
+ <sui-counter-input size="large" ariaLabel="Cantidad" [min]="1" [max]="pdv.topeCantidad()"
173
+ [value]="pdv.qty()" (valueChange)="pdv.setQty($event)" />
174
+ ```
175
+
176
+ ```html
177
+ <!-- ✅ bien -->
178
+ <sui-counter-input [size]="bp.tactil() ? 'xlarge' : 'large'" ariaLabel="Cantidad" [min]="1"
179
+ [max]="pdv.topeCantidad()" [value]="pdv.qty()" (valueChange)="pdv.setQty($event)" />
180
+ ```
181
+
182
+ **Cantidad en una fila del carrito**
183
+
184
+ ```html
185
+ <!-- ❌ mal: `large` en el teléfono (botones de 40) y `medium` en la tablet (cart.html:77, viaje.html:182) -->
186
+ <sui-counter-input [size]="bp.isMobile() ? 'large' : 'medium'" [ariaLabel]="'Cantidad de ' + item.name"
187
+ [value]="item.quantity" [min]="1" [max]="99" (valueChange)="setQuantity(item.lineKey, $event)" />
188
+ ```
189
+
190
+ ```html
191
+ <!-- ✅ bien -->
192
+ <sui-counter-input [size]="bp.tactil() ? 'xlarge' : 'medium'" [ariaLabel]="'Cantidad de ' + item.name"
193
+ [value]="item.quantity" [min]="1" [max]="99" (valueChange)="setQuantity(item.lineKey, $event)" />
194
+ ```
195
+
196
+ **Campo de formulario con `large` fijo**
197
+
198
+ ```html
199
+ <!-- ❌ mal: `large` fijo deja los botones en 40 en el teléfono, y en la computadora no va junto a un CTA (cambiar-pasajeros.html:8) -->
200
+ <sui-counter-input size="large" label="Pasajeros" [hint]="cupoTexto()" [min]="1" [max]="cupo()"
201
+ [value]="pasajeros()" (valueChange)="pasajeros.set($event)" />
202
+ ```
203
+
204
+ ```html
205
+ <!-- ✅ bien: es un campo, va como una fila -->
206
+ <sui-counter-input [size]="bp.tactil() ? 'xlarge' : 'medium'" label="Pasajeros" [hint]="cupoTexto()"
207
+ [min]="1" [max]="cupo()" [value]="pasajeros()" (valueChange)="pasajeros.set($event)" />
208
+ ```
209
+
210
+ **Sin tope y sin `valueChange`**
211
+
212
+ ```html
213
+ <!-- ❌ mal: es controlado, el número no se mueve; y sin `min` baja a negativos (Trampas) -->
214
+ <sui-counter-input ariaLabel="Cantidad" [value]="cantidad()" />
215
+ ```
216
+
217
+ ```html
218
+ <!-- ✅ bien -->
219
+ <sui-counter-input ariaLabel="Cantidad" [min]="1" [max]="99"
220
+ [value]="cantidad()" (valueChange)="cantidad.set($event)" />
221
+ ```
222
+
139
223
  ## Ejemplo
140
224
 
141
225
  ```html
142
226
  <!-- En el detalle del producto, al lado del CTA -->
143
- <sui-counter-input size="large" [min]="1" [max]="pdv.topeCantidad()"
227
+ <sui-counter-input [size]="bp.tactil() ? 'xlarge' : 'large'" [min]="1" [max]="pdv.topeCantidad()"
144
228
  ariaLabel="Cantidad" [value]="pdv.qty()" (valueChange)="pdv.setQty($event)" />
145
229
 
146
230
  <!-- Campo de formulario -->
147
231
  <sui-counter-input label="Pasajeros" hint="Hasta 4 pasajeros" [min]="1" [max]="4"
148
- [size]="bp.isMobile() ? 'large' : 'medium'" [(value)]="pasajeros" />
232
+ [size]="bp.tactil() ? 'xlarge' : 'medium'" [(value)]="pasajeros" />
149
233
  ```
@@ -53,13 +53,30 @@ Tiene `size`: **`medium`** (default, 288 × 36, flechas `sui-compact-button` de
53
53
  | `medium` (default) | 36 | 24 × 24 | 14/20 | web | medido (Figma 442:192) |
54
54
 
55
55
  ```html
56
- <sui-date-selector [size]="bp.isMobile() ? 'large' : 'medium'" label="Octubre 2026"
56
+ <sui-date-selector [size]="bp.tactil() ? 'large' : 'medium'" label="Octubre 2026"
57
57
  [rightIcon]="!esMesActual()" (prev)="mesAnterior()" (next)="mesSiguiente()" />
58
58
  ```
59
59
 
60
60
  Dentro del `sui-datepicker` `large` (y en mobile con `small`–`large`) el datepicker agranda las
61
61
  flechas a 40 por su cuenta; con `xlarge` usa este `size="large"` (44).
62
62
 
63
+ ### Por dispositivo (D16)
64
+
65
+ No está en la tabla por componente de D16; las flechas se tocan, así que va como **lo que se
66
+ toca** (dueño, 05-10-2026). `large` es el único size con flechas de 44.
67
+
68
+ | dispositivo | size | nota |
69
+ |---|---|---|
70
+ | celular chico (< 380) | `medium` + área 44 | interino: hoy `large`, porque el DS todavía no estira a 44 el área de las flechas de 24 del `medium` |
71
+ | celular (380–767) | `large` | barra de 52, flechas de 44 |
72
+ | tablet táctil (`pointer: coarse`) | `large` | Apple pide 44 pt también en iPad |
73
+ | computadora (`pointer: fine`) | `medium` | barra de 36, flechas de 24 |
74
+
75
+ Ultrawide: igual que la computadora; el ancho sigue fijo en 288.
76
+
77
+ En master-pedidos: `[size]="bp.tactil() ? 'large' : 'medium'"` (son los mismos literales que
78
+ devuelve `bp.sizeControl()`, que también sirve).
79
+
63
80
  ## «No usar»: por qué no hoy y cuándo sí
64
81
 
65
82
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -90,13 +107,54 @@ flechas a 40 por su cuenta; con `xlarge` usa este `size="large"` (44).
90
107
 
91
108
  - **`leftIcon` y `rightIcon` son booleanos**, no nombres de ícono: prenden o apagan las flechas.
92
109
  - **Ancho fijo de 288 px** (`max-width` incluido): no se estira con el contenedor.
93
- - Con una flecha apagada queda un hueco de 24 px para que el texto siga centrado.
110
+ - Con una flecha apagada queda un hueco del ancho de la flecha (24 px en `medium`, 44 en `large`)
111
+ para que el texto siga centrado.
94
112
  - El componente **no sabe de fechas**: el texto lo arma quien lo usa y las flechas solo emiten.
95
113
  - Los `aria-label` de las flechas dicen «Mes anterior» y «Mes siguiente» aunque el período sea
96
114
  una semana.
97
115
 
98
- ## Ejemplo
116
+ ## Bien y mal
117
+
118
+ **Las flechas en el teléfono**
119
+
120
+ ```html
121
+ <!-- ❌ mal: `medium` deja las flechas en 24 en el celular y la tablet -->
122
+ <sui-date-selector label="Octubre 2026" (prev)="mesAnterior()" (next)="mesSiguiente()" />
123
+ ```
124
+
125
+ ```html
126
+ <!-- ✅ bien -->
127
+ <sui-date-selector [size]="bp.tactil() ? 'large' : 'medium'" label="Octubre 2026"
128
+ (prev)="mesAnterior()" (next)="mesSiguiente()" />
129
+ ```
130
+
131
+ **Ya se está en el mes actual**
99
132
 
100
133
  ```html
134
+ <!-- ❌ mal: los dos en `false` es un título con fondo; y abrevia el mes («Qué variante usar») -->
135
+ <sui-date-selector label="Oct. 2026" [leftIcon]="false" [rightIcon]="false" />
136
+ ```
137
+
138
+ ```html
139
+ <!-- ✅ bien: se apaga solo la flecha que no lleva a nada -->
101
140
  <sui-date-selector label="Octubre 2026" [rightIcon]="false" (prev)="mesAnterior()" />
102
141
  ```
142
+
143
+ **Períodos fijos**
144
+
145
+ ```html
146
+ <!-- ❌ mal: «Hoy», «Esta semana», «Este mes» no se recorren con flechas («Cuándo no») -->
147
+ <sui-date-selector [label]="periodo()" (prev)="periodoAnterior()" (next)="periodoSiguiente()" />
148
+ ```
149
+
150
+ ```html
151
+ <!-- ✅ bien -->
152
+ <sui-segmented-control [tabs]="periodos" [(active)]="periodo" ariaLabel="Período" />
153
+ ```
154
+
155
+ ## Ejemplo
156
+
157
+ ```html
158
+ <sui-date-selector [size]="bp.tactil() ? 'large' : 'medium'" label="Octubre 2026"
159
+ [rightIcon]="false" (prev)="mesAnterior()" />
160
+ ```