@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
@@ -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,20 +57,37 @@ 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
  |---|---|---|---|
64
- | moneda dentro del monto | `sui-input` `large` + este `large` | `sui-input` `medium` + este `medium` | propuesta, falta aprobación |
64
+ | moneda dentro del monto | `sui-input` `large` + este `large` | `sui-input` `medium` + este `medium` | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono · web: canon (dueño, 05-10-2026, D16) |
65
65
 
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
  ```
@@ -41,24 +41,24 @@ se elige → card de selección.**
41
41
 
42
42
  | type | cuándo | fuente |
43
43
  |---|---|---|
44
- | `avatar` (`avatar`) | Una persona o un local con foto. El color de las iniciales va por rol: local `orange`, repartidor `green`, cliente `blue`. | canon (avatar por rol); el uso es propuesta |
45
- | `left-icon` (`icon`) | La misma fila cuando no hay foto: `store-2-line` para el local sin logo. | propuesta (precedente `master-overview.html:224`) |
46
- | `basic` | Ver «No usar». | propuesta |
47
- | `company` (`avatar` + `companyLogoSrc`) | Ver «No usar». | propuesta |
48
- | `brand` (`brand`) | Ver «No usar». | propuesta |
49
- | `card-provider` (`brand`) | Ver «No usar». | propuesta |
44
+ | `avatar` (`avatar`) | Una persona o un local con foto. El color de las iniciales va por rol: local `orange`, repartidor `green`, cliente `blue`. | canon (avatar por rol) · el uso: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
45
+ | `left-icon` (`icon`) | La misma fila cuando no hay foto: `store-2-line` para el local sin logo. | canon (aprobado por el dueño, 05-10-2026, bloque B2; precedente `master-overview.html:224`) |
46
+ | `basic` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
47
+ | `company` (`avatar` + `companyLogoSrc`) | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
48
+ | `brand` (`brand`) | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
49
+ | `card-provider` (`brand`) | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
50
50
 
51
51
  ### Las piezas
52
52
 
53
53
  | prop | cuándo | fuente |
54
54
  |---|---|---|
55
55
  | `title` | Siempre. El nombre, nunca un id (regla de la pasada de UX). | canon (CLAUDE.md, «un identificador nunca es el título») |
56
- | `subtitle` | El dato que se compara entre filas: «214 pedidos este mes», «38 calificaciones». | propuesta |
57
- | `badge` | Un dato chico que se compara de un vistazo (la nota). El color sigue el significado del badge: `red` si está mal. | propuesta (badge: canon de colores) |
58
- | `dismissible` | La X solo cuando quitar la fila ES la acción (sacar a alguien del equipo, borrar una tarjeta). **El default es `true`**: pasa `false` siempre que no. | propuesta |
56
+ | `subtitle` | El dato que se compara entre filas: «214 pedidos este mes», «38 calificaciones». | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
57
+ | `badge` | Un dato chico que se compara de un vistazo (la nota). El color sigue el significado del badge: `red` si está mal. | canon (aprobado por el dueño, 05-10-2026, bloque B3; badge: canon de colores) |
58
+ | `dismissible` | La X solo cuando quitar la fila ES la acción (sacar a alguien del equipo, borrar una tarjeta). **El default es `true`**: pasa `false` siempre que no. | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
59
59
  | `dismissAriaLabel` | Siempre que haya X: «Quitar a Rosa del equipo», no el default «Descartar». | propuesta |
60
- | `sublabel` | Ver «No usar». | propuesta |
61
- | `disabled` | Ver «No usar». | propuesta |
60
+ | `sublabel` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
61
+ | `disabled` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
62
62
 
63
63
  **Usos de hoy que rompen las reglas:** 0. Las 4 apagan la X a mano: el default de `dismissible`
64
64
  no le sirve a ningún uso de hoy.
@@ -79,12 +79,30 @@ táctil de `large` es de **44** (desde el 04-10-2026; 40 en web).
79
79
  | uso | mobile | web | fuente |
80
80
  |---|---|---|---|
81
81
  | fila | 74, sin cambio | 74, sin cambio | medido del `.scss` |
82
- | X para quitar | `large` (32, área 44) | `medium` (20) | propuesta: el tamaño es extensión SUI aprobada (03-10-2026); el «cuándo» falta aprobarlo |
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
  ```
@@ -24,8 +24,8 @@ Story: [Atoms/Divider/Content Divider](https://sui-design-system.web.app/?path=/
24
24
  > **En la guía del DS este componente se llama «Divider»** y trae: línea (default), línea con
25
25
  > espacio, línea con texto («OR»), solo texto, texto con fondo («a menudo va en modales») y
26
26
  > contenido al centro. Los cuatro tipos con botones vienen del Figma del DS, no de la guía. Lo
27
- > marcado «según la guía del DS» sale de su texto o de sus ejemplos; el resto es **propuesta,
28
- > falta aprobación**.
27
+ > marcado «según la guía del DS» sale de su texto o de sus ejemplos; las reglas marcadas canon
28
+ > están aprobadas; lo que sigue en propuesta espera decisión.
29
29
  >
30
30
  > Uso medido el 04-10-2026 en `master-pedidos/src/app`: **3 content-dividers en 3 archivos**:
31
31
  > `pages/auth/login/login.html:61` y `pages/auth/register/register.html:97` (`text-line` «o») y
@@ -37,21 +37,21 @@ Story: [Atoms/Divider/Content Divider](https://sui-design-system.web.app/?path=/
37
37
  |---|---|---|---|
38
38
  | `text-line` | El «o» entre dos formas de hacer lo mismo. | `text="o"` entre «Continuar con Google» y el formulario de correo | según la guía del DS («OR») |
39
39
  | `solid-text` | Cabecera de un grupo dentro de una lista o un modal, con fondo. | «Con pocos pedidos» (`master-drivers.html:192`) | según la guía del DS («a menudo en modales») |
40
- | `text` | Cabecera de grupo sin fondo, en una lista partida por fecha o por tipo. | «Ayer», «Esta semana» | según la guía del DS (existe) · propuesta (cuándo) |
40
+ | `text` | Cabecera de grupo sin fondo, en una lista partida por fecha o por tipo. | «Ayer», «Esta semana» | según la guía del DS (existe) · cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B2) |
41
41
  | `line` (default) | **No usar** (ver abajo). | — | según la guía del DS (default) |
42
42
  | `line-spacing` | **No usar** (ver abajo). | — | según la guía del DS |
43
- | `icon-button` | **No usar** hoy (ver abajo). | `icon="add-line"` | propuesta, falta aprobación |
44
- | `text-button` | **No usar** hoy (ver abajo). | «Ver 12 más» | propuesta, falta aprobación |
45
- | `icon-button-group` | **No usar** hoy (ver abajo). | Subir · agregar · bajar | propuesta, falta aprobación |
46
- | `text-button-group` | **No usar** hoy (ver abajo). | «Producto» · «Sección» | propuesta, falta aprobación |
43
+ | `icon-button` | **No usar** hoy (ver abajo). | `icon="add-line"` | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
44
+ | `text-button` | **No usar** hoy (ver abajo). | «Ver 12 más» | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
45
+ | `icon-button-group` | **No usar** hoy (ver abajo). | Subir · agregar · bajar | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
46
+ | `text-button-group` | **No usar** hoy (ver abajo). | «Producto» · «Sección» | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
47
47
 
48
48
  | propiedad | regla | fuente |
49
49
  |---|---|---|
50
- | `text` | Se escribe en sentence case («o», «Con pocos pedidos»): el componente lo pasa a MAYÚSCULAS. | propuesta, falta aprobación |
51
- | `icon` | Solo en `icon-button`. Nombre Remix sin `ri-`. | propuesta, falta aprobación |
52
- | `ariaLabel` | **Obligatorio en `icon-button`**: sin él el lector dice «Acción». | propuesta, falta aprobación |
50
+ | `text` | Se escribe en sentence case («o», «Con pocos pedidos»): el componente lo pasa a MAYÚSCULAS. | canon (CANON-SUI §5.1: sentence case, nunca ALL CAPS a mano) |
51
+ | `icon` | Solo en `icon-button`. Nombre Remix sin `ri-`. | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
52
+ | `ariaLabel` | **Obligatorio en `icon-button`**: sin él el lector dice «Acción». | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
53
53
  | `items` | Solo en los `-group`: de 2 a 3, cada uno con `ariaLabel` si es ícono. | propuesta, falta aprobación |
54
- | `disabled` | El botón existe pero hoy no aplica (lista ya completa). | propuesta, falta aprobación |
54
+ | `disabled` | El botón existe pero hoy no aplica (lista ya completa). | canon (aprobado por el dueño, 05-10-2026, bloque B8) |
55
55
 
56
56
  **Corregido el 03-10-2026:** los 2 «o» que estaban hechos a mano (login y registro) ya son `type="text-line"`.
57
57
 
@@ -66,10 +66,13 @@ Story: [Atoms/Divider/Content Divider](https://sui-design-system.web.app/?path=/
66
66
 
67
67
  ## Tamaño en mobile y en web
68
68
 
69
- Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
70
- (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
71
- en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
72
- de la app.
69
+ Criterio de la app: **D16, tamaño por dispositivo** (canon, dueño, 05-10-2026), que reemplaza al
70
+ «tamaño por plataforma» del 03-10-2026 (mobile grande, web chico). La columna «mobile» es el celular de
71
+ 380 px o más y, en lo que se toca, también la tablet (`pointer: coarse`). La columna «web» es la
72
+ computadora (`pointer: fine`) y, en lo que no se toca, también la tablet. En el celular chico
73
+ (< 380 px) va `medium` a la vista, sin achicar el área de 44 de lo que se toca. **Nada en `small` ni
74
+ `xsmall`**, salvo lo que el componente solo tiene en chico. Hoy la app corta con
75
+ `BreakpointsService.isMobile()` (≤ 767 px), que todavía no mira el puntero ni los 380 px.
73
76
 
74
77
  | uso | mobile | web | fuente |
75
78
  |---|---|---|---|
@@ -79,6 +82,15 @@ de la app.
79
82
  los botones (`icon-button`, `text-button`, grupos) quedan debajo de los 44 px del dedo; es otra
80
83
  razón para no usarlos hoy. Si un flujo nuevo los necesita en mobile, se pide al DS un tamaño grande.
81
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
+
82
94
  ## API
83
95
 
84
96
  <!-- api:inicio -->
@@ -104,13 +116,52 @@ Outputs: `(buttonClick)` en `icon-button` y `text-button`; `(itemClick)` con
104
116
 
105
117
  ## Trampas
106
118
 
107
- - **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.
108
121
  - **`text` y `solid-text` alinean a la izquierda**, no al centro (así está en el Figma).
109
122
  - `text-line` usa 11 px; `text` y `solid-text`, 12 px.
110
123
  - Sin `ariaLabel`, el `icon-button` se anuncia como «Acción» y los ítems de grupo como
111
124
  «Acción 0», «Acción 1».
112
125
  - `line` y `line-spacing` existen, pero la línea sola es `sui-divider`.
113
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
+
114
165
  ## Ejemplo
115
166
 
116
167
  ```html
@@ -39,54 +39,86 @@ content-card · ajuste → switch-label.**
39
39
 
40
40
  | type | cuándo | fuente |
41
41
  |---|---|---|
42
- | `left-icon` (`icon`) | El ícono dice de qué va la fila: los consejos («Revisa tu zona de cobertura»), «Contactar soporte». Sale en un círculo con borde (`sui-key-icon` stroke). | propuesta (14 de 18) |
43
- | `basic` | Fila de dato sin cara, casi siempre con badge: «Datos personales → Completados». | propuesta |
42
+ | `left-icon` (`icon`) | El ícono dice de qué va la fila: los consejos («Revisa tu zona de cobertura»), «Contactar soporte». Sale en un círculo con borde (`sui-key-icon` stroke). | canon (aprobado por el dueño, 05-10-2026, bloque B2; 14 de 18) |
43
+ | `basic` | Fila de dato sin cara, casi siempre con badge: «Datos personales → Completados». | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
44
44
  | `avatar` (`avatar`) | Una persona o un local. El color de las iniciales va por rol: local `orange`, repartidor `green`, cliente `blue`. | canon (avatar por rol) |
45
- | `company` (`avatar` + `companyLogoSrc`) | Ver «No usar». | propuesta |
46
- | `brand` (`brand`) | Ver «No usar». | propuesta |
45
+ | `company` (`avatar` + `companyLogoSrc`) | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
46
+ | `brand` (`brand`) | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
47
47
 
48
48
  ### `size`
49
49
 
50
50
  | size | cuándo | fuente |
51
51
  |---|---|---|
52
- | `large` (leading 48, título 16) | Consejos y pasos que se leen, con descripción larga (los 13 de hoy). | propuesta |
53
- | `medium` (leading 40, título 14, default) | Filas de dato en una lista: el negocio del repartidor, el resumen del registro. | propuesta |
52
+ | `large` (leading 48, título 16) | Consejos y pasos que se leen, con descripción larga (los 13 de hoy). | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
53
+ | `medium` (leading 40, título 14, default) | Filas de dato en una lista: el negocio del repartidor, el resumen del registro. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
54
54
 
55
55
  ### Las piezas
56
56
 
57
57
  | prop | cuándo | fuente |
58
58
  |---|---|---|
59
- | `label` | Siempre. En los consejos, una instrucción («Ponle foto a tus productos»); en los datos, el nombre del dato. | propuesta |
60
- | `description` | La explicación o el detalle. En los consejos, el porqué. | propuesta |
61
- | `badge` trailing (default) | El estado del dato a la derecha. Pasa el objeto con el color del badge: con string sale naranja. | propuesta |
62
- | `badgePlacement="title"` | El badge pegado al nombre, cuando la derecha queda libre o es angosta («Sabores Andinos · Propio»). | propuesta |
63
- | `sublabel` | Ver «No usar». | propuesta |
64
- | `toggle` / `toggleChecked` | Ver «No usar». | propuesta |
65
- | `disabled` | Ver «No usar». | propuesta |
66
-
67
- **Usos de hoy que rompen las reglas:** 0. A mirar: los 3 badges de
59
+ | `label` | Siempre. En los consejos, una instrucción («Ponle foto a tus productos»); en los datos, el nombre del dato. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
60
+ | `description` | La explicación o el detalle. En los consejos, el porqué. | canon (aprobado por el dueño, 05-10-2026, bloque B4) |
61
+ | `badge` trailing (default) | El estado del dato a la derecha. Pasa el objeto con el color del badge: con string sale naranja. | canon (aprobado por el dueño, 05-10-2026, bloque B3) |
62
+ | `badgePlacement="title"` | El badge pegado al nombre, cuando la derecha queda libre o es angosta («Sabores Andinos · Propio»). | canon (aprobado por el dueño, 05-10-2026, bloque B9) |
63
+ | `sublabel` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
64
+ | `toggle` / `toggleChecked` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
65
+ | `disabled` | Ver «No usar». | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
66
+
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
- | consejos y pasos | `large` | `large` | propuesta, falta aprobación |
79
- | filas de dato | `medium` | `medium` | propuesta, falta aprobación |
80
- | fila que se toca (soporte) | `large`, o dale a la fila un alto mínimo de 44 | `medium` | propuesta, falta aprobación |
84
+ | consejos y pasos | `large` | `large` | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
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) |
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'" … /> <!-- solo si la fila se toca -->
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