@ajuarezso/sui-design-system 0.24.1 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/docs/sui-accordion/README.md +85 -11
  2. package/docs/sui-activity-feed/README.md +65 -11
  3. package/docs/sui-activity-filter/README.md +54 -5
  4. package/docs/sui-alert/README.md +54 -0
  5. package/docs/sui-app-store-badge/README.md +64 -10
  6. package/docs/sui-avatar/README.md +92 -29
  7. package/docs/sui-avatar-group/README.md +75 -9
  8. package/docs/sui-badge/README.md +85 -17
  9. package/docs/sui-banner/README.md +85 -20
  10. package/docs/sui-brand-logo/README.md +95 -31
  11. package/docs/sui-breadcrumb-item/README.md +54 -3
  12. package/docs/sui-breadcrumbs/README.md +54 -6
  13. package/docs/sui-button/README.md +76 -12
  14. package/docs/sui-button-group/README.md +91 -23
  15. package/docs/sui-button-group-item/README.md +81 -14
  16. package/docs/sui-card/README.md +105 -18
  17. package/docs/sui-chart-legend/README.md +63 -10
  18. package/docs/sui-chart-legend-dot/README.md +59 -10
  19. package/docs/sui-checkbox/README.md +109 -29
  20. package/docs/sui-checkbox-card/README.md +70 -14
  21. package/docs/sui-checkbox-label/README.md +92 -26
  22. package/docs/sui-circular-progress-bar/README.md +80 -19
  23. package/docs/sui-color-dot/README.md +72 -12
  24. package/docs/sui-color-picker/README.md +71 -13
  25. package/docs/sui-command-menu-footer/README.md +50 -1
  26. package/docs/sui-command-menu-item/README.md +74 -14
  27. package/docs/sui-command-menu-search/README.md +58 -3
  28. package/docs/sui-compact-avatar-group/README.md +73 -13
  29. package/docs/sui-compact-button/README.md +123 -34
  30. package/docs/sui-compact-select/README.md +61 -7
  31. package/docs/sui-compact-select-for-input/README.md +70 -6
  32. package/docs/sui-content-card/README.md +75 -14
  33. package/docs/sui-content-divider/README.md +67 -16
  34. package/docs/sui-content-label/README.md +99 -20
  35. package/docs/sui-counter-input/README.md +102 -18
  36. package/docs/sui-date-selector/README.md +69 -11
  37. package/docs/sui-datepicker/README.md +85 -18
  38. package/docs/sui-day-cell/README.md +75 -17
  39. package/docs/sui-day-label/README.md +56 -7
  40. package/docs/sui-divider/README.md +64 -9
  41. package/docs/sui-drawer-footer/README.md +63 -2
  42. package/docs/sui-drawer-header/README.md +69 -12
  43. package/docs/sui-dropdown-caption/README.md +58 -6
  44. package/docs/sui-dropdown-item/README.md +75 -9
  45. package/docs/sui-dropdown-menu/README.md +83 -14
  46. package/docs/sui-dropdown-search/README.md +60 -4
  47. package/docs/sui-emoji/README.md +94 -30
  48. package/docs/sui-empty-state/README.md +71 -7
  49. package/docs/sui-fancy-button/README.md +74 -14
  50. package/docs/sui-file-icon/README.md +70 -12
  51. package/docs/sui-file-upload/README.md +77 -17
  52. package/docs/sui-file-upload-card/README.md +64 -12
  53. package/docs/sui-filter/README.md +83 -14
  54. package/docs/sui-flag/README.md +73 -8
  55. package/docs/sui-form-hint/README.md +56 -7
  56. package/docs/sui-form-label/README.md +57 -5
  57. package/docs/sui-href/README.md +47 -0
  58. package/docs/sui-icon/README.md +86 -18
  59. package/docs/sui-image-upload/README.md +90 -22
  60. package/docs/sui-image-upload-profile/README.md +70 -11
  61. package/docs/sui-img-retry/README.md +50 -1
  62. package/docs/sui-inline-input/README.md +67 -9
  63. package/docs/sui-inline-select/README.md +62 -2
  64. package/docs/sui-input/README.md +90 -27
  65. package/docs/sui-integration-switch/README.md +84 -17
  66. package/docs/sui-kbd/README.md +73 -9
  67. package/docs/sui-key-icon/README.md +85 -23
  68. package/docs/sui-link-button/README.md +96 -27
  69. package/docs/sui-logo/README.md +93 -22
  70. package/docs/sui-modal/README.md +72 -13
  71. package/docs/sui-modal-footer/README.md +86 -12
  72. package/docs/sui-modal-header/README.md +57 -1
  73. package/docs/sui-modal-sheet/README.md +74 -12
  74. package/docs/sui-notification/README.md +81 -11
  75. package/docs/sui-notification-footer/README.md +55 -5
  76. package/docs/sui-notification-tab-menu/README.md +61 -5
  77. package/docs/sui-otp-input/README.md +70 -9
  78. package/docs/sui-page-header/README.md +89 -19
  79. package/docs/sui-pagination/README.md +73 -13
  80. package/docs/sui-password-strength/README.md +50 -1
  81. package/docs/sui-payment-icon/README.md +80 -18
  82. package/docs/sui-period-range/README.md +70 -11
  83. package/docs/sui-popover/README.md +81 -15
  84. package/docs/sui-product-card/README.md +89 -21
  85. package/docs/sui-progress-bar/README.md +82 -15
  86. package/docs/sui-progress-bar-label/README.md +79 -18
  87. package/docs/sui-radio/README.md +84 -7
  88. package/docs/sui-radio-card/README.md +70 -16
  89. package/docs/sui-radio-label/README.md +89 -22
  90. package/docs/sui-rating/README.md +101 -31
  91. package/docs/sui-rich-editor/README.md +47 -2
  92. package/docs/sui-segmented-control/README.md +90 -21
  93. package/docs/sui-select/README.md +80 -11
  94. package/docs/sui-sidebar/README.md +71 -16
  95. package/docs/sui-slider/README.md +75 -8
  96. package/docs/sui-social-button/README.md +71 -11
  97. package/docs/sui-status-badge/README.md +75 -14
  98. package/docs/sui-stepper/README.md +75 -18
  99. package/docs/sui-store-card/README.md +85 -22
  100. package/docs/sui-switch/README.md +82 -11
  101. package/docs/sui-switch-card/README.md +80 -16
  102. package/docs/sui-switch-label/README.md +91 -14
  103. package/docs/sui-tab-chips/README.md +93 -21
  104. package/docs/sui-tab-menu-horizontal/README.md +68 -7
  105. package/docs/sui-tab-menu-vertical/README.md +64 -11
  106. package/docs/sui-table/README.md +77 -16
  107. package/docs/sui-tag/README.md +86 -12
  108. package/docs/sui-tag-input/README.md +77 -13
  109. package/docs/sui-textarea/README.md +84 -17
  110. package/docs/sui-time-picker/README.md +96 -33
  111. package/docs/sui-toast/README.md +81 -20
  112. package/docs/sui-tooltip/README.md +80 -22
  113. package/docs/sui-topbar/README.md +64 -10
  114. package/docs/sui-topbar-button/README.md +61 -7
  115. package/docs/sui-topbar-item/README.md +68 -7
  116. package/docs/sui-topbar-user/README.md +61 -5
  117. package/fesm2022/ajuarezso-sui-design-system.mjs +15 -10
  118. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  119. package/package.json +1 -1
  120. package/types/ajuarezso-sui-design-system.d.ts +7 -3
@@ -25,8 +25,8 @@ Regla corta: **la marca es lo que se muestra → brand-logo · es un ícono más
25
25
 
26
26
  ## Qué variante usar
27
27
 
28
- > **La guía del DS no tiene página para este componente.** Todo es **propuesta, falta
29
- > aprobación**.
28
+ > **La guía del DS no tiene página para este componente.** Lo marcado canon está
29
+ > aprobado; lo que sigue en **propuesta** espera decisión.
30
30
  >
31
31
  > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usan por dentro
32
32
  > `sui-content-card` (`type="brand"`), `sui-social-button`, `sui-content-label`,
@@ -37,10 +37,10 @@ Regla corta: **la marca es lo que se muestra → brand-logo · es un ícono más
37
37
 
38
38
  | valor | cuándo | fuente |
39
39
  |---|---|---|
40
- | `whatsapp` | Soporte y contacto con el negocio. | propuesta |
41
- | `google`, `apple` | Entrar con esa cuenta (vía `sui-social-button`). | propuesta |
42
- | `instagram`, `facebook` | Las redes del negocio o de la app. | propuesta |
43
- | las otras 23 (`adobe`, `notion`, `slack`, `stripe`…) | No usar hoy. | propuesta |
40
+ | `whatsapp` | Soporte y contacto con el negocio. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
41
+ | `google`, `apple` | Entrar con esa cuenta (vía `sui-social-button`). | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
42
+ | `instagram`, `facebook` | Las redes del negocio o de la app. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
43
+ | las otras 23 (`adobe`, `notion`, `slack`, `stripe`…) | No usar hoy. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
44
44
 
45
45
  **No hay TikTok** en el catálogo (son 28 marcas), aunque la app hace publicidad ahí.
46
46
 
@@ -48,45 +48,46 @@ Regla corta: **la marca es lo que se muestra → brand-logo · es un ícono más
48
48
 
49
49
  | valor | cuándo | fuente |
50
50
  |---|---|---|
51
- | `original` (default) | El normal: sobre fondo claro, con su color oficial. | propuesta |
52
- | `white` | Sobre fondo oscuro o sobre foto. | propuesta |
53
- | `black` | No usar hoy. | propuesta |
51
+ | `original` (default) | El normal: sobre fondo claro, con su color oficial. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
52
+ | `white` | Sobre fondo oscuro o sobre foto. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
53
+ | `black` | No usar hoy. | canon (aprobado por el dueño, 05-10-2026, bloque B2) |
54
54
 
55
55
  ### `size`
56
56
 
57
57
  | valor | px | cuándo | fuente |
58
58
  |---|---|---|---|
59
- | `xs` | 16 | Dentro de un texto o de un tag. | propuesta |
60
- | `sm` | 20 | Dentro de un botón (lo usa `sui-social-button`). | propuesta |
61
- | `md` (default) | 24 | Fila de una lista. | propuesta |
62
- | `lg` | 32 | Tarjeta de contacto (el tamaño del Figma). | propuesta |
63
- | `xl` | 40 | Tarjeta grande. | propuesta |
64
- | `2xl` | 48 | Lo pide `sui-content-label` en tamaño grande. | propuesta |
59
+ | `xs` | 16 | Dentro de un texto o de un tag. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
60
+ | `sm` | 20 | Dentro de un botón (lo usa `sui-social-button`). | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
61
+ | `md` (default) | 24 | Fila de una lista o tarjeta de contacto, en la computadora, la tablet y el celular chico (ver «Por dispositivo (D16)»). | canon (aprobado por el dueño, 05-10-2026, bloque B1) · por dispositivo: D16, dueño 05-10-2026 |
62
+ | `lg` | 32 | Tarjeta de contacto o fila en el celular (380–767), un paso arriba del `md` de la computadora; es el tamaño del Figma. También el logo con `href` en la computadora (propuesta). | canon (aprobado por el dueño, 05-10-2026, bloque B1) · por dispositivo: D16, dueño 05-10-2026 |
63
+ | `xl` | 40 | Tarjeta grande. | canon (aprobado por el dueño, 05-10-2026, bloque B1) |
64
+ | `2xl` | 48 | Lo pide `sui-content-label` en tamaño grande. Y el logo con `href` en todo lo táctil: es el único que llega a 44. | canon (aprobado por el dueño, 05-10-2026, bloque B1) · con `href`: canon (dueño, 04-10-2026) |
65
65
 
66
66
  ### `href`, `target`, `rel`, `disabled`, `ariaLabel`
67
67
 
68
68
  | input | cuándo | fuente |
69
69
  |---|---|---|
70
- | `href` + `target="_blank"` | El logo lleva a la red social. `rel` ya viene en `noopener noreferrer`. | propuesta |
71
- | `ariaLabel` | Con `href`, siempre: «Síguenos en Instagram». Sin `href`, el default («Logo de Instagram») alcanza. | propuesta |
72
- | `disabled` | No usar hoy. | propuesta |
70
+ | `href` + `target="_blank"` | El logo lleva a la red social. `rel` ya viene en `noopener noreferrer`. | canon (aprobado por el dueño, 05-10-2026, bloque B10) |
71
+ | `ariaLabel` | Con `href`, siempre: «Síguenos en Instagram». Sin `href`, el default («Logo de Instagram») alcanza. | canon (aprobado por el dueño, 05-10-2026, bloque B10) |
72
+ | `disabled` | No usar hoy. | canon (aprobado por el dueño, 05-10-2026, bloque B10) |
73
73
 
74
74
  Usos de hoy que rompen la regla: **0**.
75
75
 
76
76
  ## Tamaño en mobile y en web
77
77
 
78
- En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
79
- pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
80
- breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
81
- el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
78
+ En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. Se elige
79
+ siempre con el servicio de breakpoints de la app (`bp`, en `services/breakpoints.service.ts`),
80
+ también en las pantallas que solo existen en el celular (cliente, repartidor): con D16 el celular
81
+ chico y la tablet llevan el valor de web en lo que no se toca (D16, dueño 05-10-2026). Todo es
82
+ **propuesta**, salvo lo marcado canon.
82
83
 
83
- | uso | mobile | web |
84
- |---|---|---|
85
- | tarjeta de contacto, fila | `lg` (32) | `md` (24) |
86
- | como link (con `href`, se toca) | `2xl` (48) | `lg` (32) |
84
+ | uso | mobile | web | fuente |
85
+ |---|---|---|---|
86
+ | tarjeta de contacto, fila | `lg` (32) | `md` (24) | canon (dueño, 05-10-2026, P1 b) |
87
+ | como link (con `href`, se toca) | `2xl` (48), también en la tablet táctil | `lg` (32) | mobile: canon (decisión del dueño 04-10-2026, piso táctil 44: `2xl` es el único size que llega) · tablet: D16, dueño 05-10-2026 (lo que se toca) · web: propuesta |
87
88
 
88
89
  ```html
89
- <sui-brand-logo company="instagram" [size]="bp.isMobile() ? '2xl' : 'lg'" [href]="url" target="_blank"
90
+ <sui-brand-logo company="instagram" [size]="bp.tactil() ? '2xl' : 'lg'" [href]="url" target="_blank"
90
91
  ariaLabel="Síguenos en Instagram" />
91
92
  ```
92
93
 
@@ -94,6 +95,25 @@ Con `href` el logo **es** el área táctil: en mobile tiene que medir 44 px o m
94
95
  tamaño que llega es `2xl` (48). Si se quiere un logo de 32 px tocable, el link va en un
95
96
  contenedor de 44 px.
96
97
 
98
+ ### Por dispositivo (D16)
99
+
100
+ Sin `href` no se toca: sigue la fila de `brand-logo` de D16 (sube un paso solo en el celular). Con
101
+ `href` se toca: va `2xl` en todo lo táctil.
102
+
103
+ | dispositivo | size | nota |
104
+ |---|---|---|
105
+ | celular chico (< 380) | `md` · con `href`: `2xl` | lo que no se toca va con el valor de web; el link no tiene otro size que llegue a 44 |
106
+ | celular (380–767) | `lg` · con `href`: `2xl` | el valor de mobile de la tabla de arriba |
107
+ | tablet táctil (`pointer: coarse`) | `md` · con `href`: `2xl` | se toca con el dedo: el link también pide 44 |
108
+ | computadora (`pointer: fine`) | `md` · con `href`: `lg` | el `lg` del link en la computadora sigue siendo propuesta |
109
+
110
+ Ultrawide: igual que la computadora.
111
+
112
+ En master-pedidos (no hay helper propio): `[size]="bp.celular() ? 'lg' : 'md'"` sin `href`;
113
+ `[size]="bp.tactil() ? '2xl' : 'lg'"` con `href`. Los size de la fila son los de «tarjeta de
114
+ contacto, fila»: en otro uso (`xs` en un texto, `xl` en una tarjeta grande) se sube un paso igual,
115
+ solo en `bp.celular()`.
116
+
97
117
  ## «No usar»: por qué no hoy y cuándo sí
98
118
 
99
119
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -131,13 +151,57 @@ Outputs: ninguno.
131
151
  - Con `href` y `disabled` a la vez, no se vuelve link.
132
152
  - El `aria-label` por defecto es «Logo de <Marca>» (en español desde el 04-10-2026); con `href` pasa uno que diga adónde lleva.
133
153
 
154
+ ## Bien y mal
155
+
156
+ **Logo que lleva a la red del negocio**
157
+
158
+ ```html
159
+ <!-- ❌ mal: con `href` el logo ES el área táctil, y `lg` (32) no llega a 44 en el celular -->
160
+ <sui-brand-logo company="instagram" size="lg" [href]="url" target="_blank"
161
+ ariaLabel="Síguenos en Instagram" />
162
+ ```
163
+
164
+ ```html
165
+ <!-- ✅ bien -->
166
+ <sui-brand-logo company="instagram" [size]="bp.tactil() ? '2xl' : 'lg'" [href]="url" target="_blank"
167
+ ariaLabel="Síguenos en Instagram" />
168
+ ```
169
+
170
+ **Entrar con Google**
171
+
172
+ ```html
173
+ <!-- ❌ mal: botón armado a mano con el logo adentro -->
174
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()">
175
+ <sui-brand-logo company="google" size="sm" /> Continuar con Google
176
+ </sui-button>
177
+ ```
178
+
179
+ ```html
180
+ <!-- ✅ bien -->
181
+ <sui-social-button brand="google" variantStyle="stroke" [size]="bp.sizeControl()" label="Continuar con Google" />
182
+ ```
183
+
184
+ **WhatsApp como un ícono más del botón**
185
+
186
+ ```html
187
+ <!-- ❌ mal: dentro de un botón la marca no es el contenido, y el <img> no toma el color del texto -->
188
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()">
189
+ <sui-brand-logo company="whatsapp" size="sm" /> Escríbenos
190
+ </sui-button>
191
+ ```
192
+
193
+ ```html
194
+ <!-- ✅ bien -->
195
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()" leftIcon="whatsapp-line">Escríbenos</sui-button>
196
+ ```
197
+
134
198
  ## Ejemplo
135
199
 
136
200
  ```html
137
- <!-- Tarjeta de soporte -->
138
- <sui-brand-logo company="whatsapp" size="lg" />
201
+ <!-- Tarjeta de soporte: no se toca, sube un paso solo en el celular -->
202
+ <sui-brand-logo company="whatsapp" [size]="bp.celular() ? 'lg' : 'md'" />
139
203
 
140
- <!-- Red del negocio, como link -->
141
- <sui-brand-logo company="instagram" size="2xl" [href]="tenant.instagramUrl" target="_blank"
204
+ <!-- Red del negocio, como link: se toca, 2xl en todo lo táctil -->
205
+ <sui-brand-logo company="instagram" [size]="bp.tactil() ? '2xl' : 'lg'" [href]="tenant.instagramUrl" target="_blank"
142
206
  ariaLabel="Síguenos en Instagram" />
143
207
  ```
@@ -31,11 +31,11 @@ desplegable al lado o un separador propio. Hoy no hay ningún caso.
31
31
  | input | valor | cuándo | fuente |
32
32
  |---|---|---|---|
33
33
  | `label` | texto | El nombre del nivel. | según la guía del DS |
34
- | `icon` | nombre RemixIcon | Solo el primer nivel (inicio), y con `ariaLabel` si va sin texto. | según la guía del DS (el ícono existe); el cuándo es propuesta |
34
+ | `icon` | nombre RemixIcon | Solo el primer nivel (inicio), y con `ariaLabel` si va sin texto. | según la guía del DS (el ícono existe); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B9) |
35
35
  | `href` | ruta | Con ruta: dibuja un `<a>`; una ruta interna (`/…`) navega con el router sin recargar. | según la guía del DS (como enlace) |
36
36
  | `href` | vacío | Dibuja un `<button>` y avisa por `(clicked)`. | según el código |
37
37
  | `active` | `true` | La página actual: no es clicable, va en negro y lleva `aria-current="page"`. | según la guía del DS |
38
- | `ariaLabel` | texto | Obligatorio cuando va solo el ícono. | propuesta, falta aprobación |
38
+ | `ariaLabel` | texto | Obligatorio cuando va solo el ícono. | canon (aprobado por el dueño, 05-10-2026, bloque B5) |
39
39
 
40
40
  Usos de hoy que rompen las reglas: **0** (no se usa).
41
41
 
@@ -46,12 +46,23 @@ no se usa en mobile.
46
46
 
47
47
  | uso | mobile | web | fuente |
48
48
  |---|---|---|---|
49
- | miga | no se usa | el componente (dentro de `sui-breadcrumbs`) | propuesta, falta aprobación |
49
+ | miga | no se usa | el componente (dentro de `sui-breadcrumbs`) | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
50
50
 
51
51
  ```html
52
52
  @if (!bp.isMobile()) { <sui-breadcrumbs [items]="ruta()" /> }
53
53
  ```
54
54
 
55
+ ### Por dispositivo (D16)
56
+
57
+ No aplica: no tiene `size` y mide 20 px fijos en todo dispositivo. Ni la miga ni `sui-breadcrumbs`
58
+ se ocultan solos (no tienen `@media` ni lógica para eso): **lo decide la pantalla que usa la ruta**,
59
+ con su propio `@if (!bp.isMobile())`. Con eso no se muestra en el celular chico ni en el celular, y
60
+ sí en la computadora y el ultrawide. En la tablet táctil con 768 px o más `bp.isMobile()` es falso, la
61
+ ruta se muestra y la miga de 20 px no llega al piso de 44 de lo táctil: no hay size que lo arregle y
62
+ queda sin decidir, igual que en `sui-breadcrumbs`.
63
+
64
+ En master-pedidos: sin `[size]`; la pantalla envuelve `sui-breadcrumbs` en `@if (!bp.isMobile())`.
65
+
55
66
  ## «No usar»: por qué no hoy y cuándo sí
56
67
 
57
68
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -85,6 +96,46 @@ no se usa en mobile.
85
96
  `SuiBreadcrumbEntry`. No son lo mismo.
86
97
  - No trae separador: el separador lo pone `sui-breadcrumbs`.
87
98
 
99
+ ## Bien y mal
100
+
101
+ **Ruta armada a mano**
102
+
103
+ ```html
104
+ <!-- ❌ mal: separador propio y activo a mano; sui-breadcrumbs ya hace las dos cosas -->
105
+ <sui-breadcrumb-item label="Productos" href="/empresa/productos" />
106
+ <sui-icon name="arrow-right-s-line" />
107
+ <sui-breadcrumb-item label="Hamburguesas" [active]="true" />
108
+ ```
109
+
110
+ ```html
111
+ <!-- ✅ bien -->
112
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: 'Hamburguesas' }]" />
113
+ ```
114
+
115
+ **Inicio solo con el ícono**
116
+
117
+ ```html
118
+ <!-- ❌ mal: sin texto ni `ariaLabel`, el lector de pantalla no dice adónde lleva -->
119
+ <sui-breadcrumb-item icon="home-5-line" href="/empresa/inicio" />
120
+ ```
121
+
122
+ ```html
123
+ <!-- ✅ bien -->
124
+ <sui-breadcrumb-item icon="home-5-line" ariaLabel="Inicio" href="/empresa/inicio" />
125
+ ```
126
+
127
+ **Navegar dos veces**
128
+
129
+ ```html
130
+ <!-- ❌ mal: con `href` el clic ya navega y además emite `clicked` -->
131
+ <sui-breadcrumb-item label="Productos" href="/empresa/productos" (clicked)="router.navigateByUrl('/empresa/productos')" />
132
+ ```
133
+
134
+ ```html
135
+ <!-- ✅ bien -->
136
+ <sui-breadcrumb-item label="Productos" href="/empresa/productos" />
137
+ ```
138
+
88
139
  ## Ejemplo
89
140
 
90
141
  ```html
@@ -38,17 +38,17 @@ Regla corta: **3+ niveles en web → breadcrumbs · mobile o 1-2 niveles → fle
38
38
  | divider | cuándo | fuente |
39
39
  |---|---|---|
40
40
  | `arrow` (default) | Siempre en la app. | según la guía del DS (es su default) |
41
- | `slash` | No: misma función que la flecha; dos estilos en la misma app se leen como dos cosas. | según la guía del DS (la forma existe); el no es propuesta |
42
- | `dot` | No: el punto separa metadatos («12 min · S/ 4.50»), no niveles. Extensión de SUI. | propuesta, falta aprobación |
41
+ | `slash` | No: misma función que la flecha; dos estilos en la misma app se leen como dos cosas. | según la guía del DS (la forma existe); el no: canon (aprobado por el dueño, 05-10-2026, bloque B6) |
42
+ | `dot` | No: el punto separa metadatos («12 min · S/ 4.50»), no niveles. Extensión de SUI. | canon (aprobado por el dueño, 05-10-2026, bloque B6) |
43
43
 
44
44
  ### Ítems (`items`)
45
45
 
46
46
  | qué | cuándo | fuente |
47
47
  |---|---|---|
48
48
  | `label` | Siempre el nombre real del nivel («Hamburguesas», no «Categoría»). Un id nunca es el nombre. | canon (CLAUDE.md, «un identificador nunca es el título de nada») |
49
- | `href` | Cada nivel anterior con su ruta interna (`/empresa/productos`): navega con el router, sin recargar. | propuesta, falta aprobación |
50
- | sin `href` + `(navigate)` | Cuando volver no es una ruta (cerrar un panel, limpiar un filtro). | propuesta, falta aprobación |
51
- | `icon` solo en el primero | El inicio como casa (`home-5-line`) con `ariaLabel`. | según la guía del DS (ítems con ícono); el cuándo es propuesta |
49
+ | `href` | Cada nivel anterior con su ruta interna (`/empresa/productos`): navega con el router, sin recargar. | canon (aprobado por el dueño, 05-10-2026, bloque B10) |
50
+ | sin `href` + `(navigate)` | Cuando volver no es una ruta (cerrar un panel, limpiar un filtro). | canon (aprobado por el dueño, 05-10-2026, bloque B10) |
51
+ | `icon` solo en el primero | El inicio como casa (`home-5-line`) con `ariaLabel`. | según la guía del DS (ítems con ícono); el cuándo: canon (aprobado por el dueño, 05-10-2026, bloque B9) |
52
52
  | `active` | No hace falta: el último ya es el activo. Solo si la página actual no va al final (raro). | según el código |
53
53
 
54
54
  Usos de hoy que rompen las reglas: **0** (no se usa).
@@ -59,7 +59,7 @@ Alto fijo de **20 px** (texto 14, ícono 20), sin `size`. **No tiene tamaño par
59
59
 
60
60
  | uso | mobile | web | fuente |
61
61
  |---|---|---|---|
62
- | ruta de 3+ niveles | no se usa: flecha de volver | `sui-breadcrumbs` | propuesta, falta aprobación |
62
+ | ruta de 3+ niveles | no se usa: flecha de volver | `sui-breadcrumbs` | canon (aprobado por el dueño, 05-10-2026, bloque B7) |
63
63
 
64
64
  ```html
65
65
  @if (!bp.isMobile()) {
@@ -67,6 +67,16 @@ Alto fijo de **20 px** (texto 14, ícono 20), sin `size`. **No tiene tamaño par
67
67
  }
68
68
  ```
69
69
 
70
+ ### Por dispositivo (D16)
71
+
72
+ No aplica: no tiene `size` y sus migas miden 20 px fijos (texto 14, ícono 20) en todo dispositivo;
73
+ lo que cambia por dispositivo es si se muestra, no su tamaño. En el celular chico y el celular no se
74
+ usa (flecha de volver); en la computadora y el ultrawide va tal cual. En la tablet táctil con 768 px o
75
+ más `bp.isMobile()` es falso y la ruta se muestra, con migas de 20 px que no llegan al piso de 44 de
76
+ lo táctil: no hay size que lo arregle y no está decidido si se oculta también ahí.
77
+
78
+ En master-pedidos: sin `[size]`; se muestra con `@if (!bp.isMobile())`.
79
+
70
80
  ## «No usar»: por qué no hoy y cuándo sí
71
81
 
72
82
  | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
@@ -111,6 +121,44 @@ type SuiBreadcrumbDivider = 'arrow' | 'slash' | 'dot';
111
121
  - El host dice `aria-label="Ruta de navegación"` (hasta el 03-10-2026, «Breadcrumb») y no se puede cambiar.
112
122
  - `SuiBreadcrumbEntry` (los datos) no es `SuiBreadcrumbItem` (el componente de cada miga).
113
123
 
124
+ ## Bien y mal
125
+
126
+ **Ruta en el celular**
127
+
128
+ ```html
129
+ <!-- ❌ mal: en 390 px la fila se corta y compite con el título -->
130
+ <sui-breadcrumbs [items]="ruta()" />
131
+ ```
132
+
133
+ ```html
134
+ <!-- ✅ bien -->
135
+ @if (!bp.isMobile()) { <sui-breadcrumbs [items]="ruta()" /> }
136
+ ```
137
+
138
+ **El nombre del nivel**
139
+
140
+ ```html
141
+ <!-- ❌ mal: un id nunca es el nombre de nada -->
142
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: producto.id }]" />
143
+ ```
144
+
145
+ ```html
146
+ <!-- ✅ bien -->
147
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: producto.name }]" />
148
+ ```
149
+
150
+ **Navegar dos veces**
151
+
152
+ ```html
153
+ <!-- ❌ mal: los ítems con `href` ya navegan; `navigate` sale igual y vuelve a navegar -->
154
+ <sui-breadcrumbs [items]="ruta()" (navigate)="router.navigateByUrl($event.href ?? '')" />
155
+ ```
156
+
157
+ ```html
158
+ <!-- ✅ bien: con `href`, sin `(navigate)` -->
159
+ <sui-breadcrumbs [items]="ruta()" />
160
+ ```
161
+
114
162
  ## Ejemplo
115
163
 
116
164
  ```html
@@ -98,13 +98,14 @@ Uso medido el 04-10-2026: 123 `large`, 93 `small`, 58 `medium` (5 por default),
98
98
  | size | cuándo | fuente |
99
99
  |---|---|---|
100
100
  | `large` (48 px) | Footers de modal y CTA táctiles en mobile. | ya es canon (default de sui-modal-footer); extensión de SUI, la guía no lo tiene |
101
- | `medium` (40 px, default) | CTA en desktop y formularios. | default según la guía del DS; el «cuándo» es propuesta |
102
- | `small` (36) / `xsmall` (32) | Acciones dentro de cards, filas y cabeceras de sección. | escala según la guía del DS; el «cuándo» es propuesta |
103
- | `2xsmall` (28) | Acciones de ícono en tablas y filas densas. Si el espacio es de verdad chico, mirar antes `sui-compact-button`. | escala según la guía del DS; el «cuándo» es propuesta |
101
+ | `medium` (40 px, default) | Todo botón en la computadora: CTA, formularios, acciones de cards, filas, cabeceras y tablas. En el celular chico (< 380 px), a la vista, con el área de 44. La tablet va como el celular. | default según la guía del DS; el «cuándo»: canon (aprobado por el dueño, 05-10-2026, bloque B1) y, para filas, cabeceras y tablas, canon (dueño, 05-10-2026, D16); solo en web (en el teléfono manda el piso táctil de 44) |
102
+ | `small` (36) / `xsmall` (32) | No usar: son chicos. Las acciones de cards, filas y cabeceras van en `medium` en web y `large` en el teléfono. | escala según la guía del DS; no usarlos: canon (dueño, 05-10-2026, D16), reemplaza el «cuándo» del bloque B13 |
103
+ | `2xsmall` (28) | No usar: es chico. Las acciones de ícono en tablas van en `medium` `onlyIcon`; si de verdad no entra, `sui-compact-button`. | escala según la guía del DS; no usarlo: canon (dueño, 05-10-2026, D16), reemplaza el «cuándo» del bloque B13 |
104
104
  | `xlarge` (52) | Extensión de SUI. Sin uso hoy. | canon (aprobado por el dueño, 03-10-2026) |
105
105
 
106
- En la app el patrón responsive ya es `[size]="bp.isMobile() ? 'large' : 'medium'"` (o
107
- `bp.controlSize()`).
106
+ En la app el patrón responsive es `[size]="bp.sizeControl()"`: `large` en el celular y la tablet
107
+ táctil, `medium` en la computadora (D16, dueño 05-10-2026). **No uses `bp.controlSize()` en un
108
+ botón**: es el de checkbox/radio/switch y da `large` en la computadora. Ver «Por dispositivo (D16)».
108
109
 
109
110
  ## «No usar»: por qué no hoy y cuándo sí
110
111
 
@@ -127,20 +128,26 @@ flujo nuevo cae en la columna de la derecha, se usa (aprobado por el dueño, 03-
127
128
  ## Tamaño en mobile y en web
128
129
 
129
130
  En mobile se toca con el dedo: **44 px como mínimo** (piso táctil, canon del dueño 04-10-2026) y 48
130
- en la acción principal. En web, 28–40.
131
+ en la acción principal. En la computadora, `medium` (40); la tablet va como el celular; en el celular chico
132
+ (< 380 px), `medium` a la vista con el área de 44. Nada en `small`, `xsmall` ni `2xsmall` (canon, dueño,
133
+ 05-10-2026, D16).
131
134
 
132
135
  | uso | mobile | web | fuente |
133
136
  |---|---|---|---|
134
137
  | acción principal de la pantalla o footer de modal | `large` (48) | `medium` (40) | canon (aprobado por el dueño, 03-10-2026) (footer de modal siempre `large`) |
135
- | acción dentro de una card o una fila | `large` (48) | `small` (36) / `xsmall` (32) | canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — antes `medium` (40), que no llega |
136
- | acción en una tabla densa | — (no hay tablas en mobile) | `2xsmall` (28) | canon (aprobado por el dueño, 03-10-2026) |
138
+ | acción dentro de una card o una fila | `large` (48) | `medium` (40) | mobile: canon (dueño, 04-10-2026): piso táctil 44 en el teléfono — antes `medium` (40), que no llega · web: canon (dueño, 05-10-2026, D16), antes `small` / `xsmall` |
139
+ | acción en una tabla | — (no hay tablas en mobile) | `medium` (40) | canon (dueño, 05-10-2026, D16), antes `2xsmall` (03-10-2026) |
137
140
  | CTA de landing | `xlarge` (52) | `large` (48) | propuesta, falta aprobación |
138
141
 
139
- Patrón (`bp` = `BreakpointsService`, mobile hasta 767 px). Medido el 04-10-2026: 9 `sui-button` con este
140
- par exacto y 30 con algún tamaño por `bp`; en toda la app hay 142 `[size]` con este mismo par:
142
+ Patrón (`bp` = `BreakpointsService`). Medido el 06-10-2026 en `master-pedidos/src/app`, sin
143
+ prototipos ni vitrinas: 399 de 412 `sui-button` ya van con `bp.sizeControl()`; quedan 5 con
144
+ `sizeAccionesCard()` de `master-drivers.ts:243` (`bp.isMobile()` solo: deja la tablet en `medium`),
145
+ 1 con `bp.controlSize()` (`checkout.html:392`), 1 en `small` (`notifications.html:50`), 2 sin
146
+ `size` y 4 en `large` fijo (2 en el footer de `copy-text-dialog`, donde va bien; `cart.html:190` y
147
+ `master-orders.html:662` no son footer de modal y en la computadora irían en `medium`):
141
148
 
142
149
  ```html
143
- <sui-button [size]="bp.isMobile() ? 'large' : 'medium'" …/>
150
+ <sui-button [size]="bp.sizeControl()" …/>
144
151
  ```
145
152
 
146
153
  ### Piso táctil de 44 en el teléfono (canon, dueño 04-10-2026)
@@ -179,6 +186,23 @@ Vale para todos los componentes que tienen `size` `large` / `xlarge`:
179
186
  En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el botón ya usa Label/Medium 16/24
180
187
  en esos dos tamaños.
181
188
 
189
+ ### Por dispositivo (D16)
190
+
191
+ Fila `button` de la tabla D16 (dueño, 05-10-2026). Se toca, así que va por tipo de puntero además
192
+ del ancho.
193
+
194
+ | dispositivo | size | nota |
195
+ |---|---|---|
196
+ | celular chico (< 380 px) | `large` (48) | D16 pide `medium` con área tocable de 44; mientras el DS no estire el área de los `medium`, va `large` (interino) |
197
+ | celular (380–767 px) | `large` (48) | |
198
+ | tablet táctil (`pointer: coarse`) | `large` (48) | también se toca con el dedo: Apple pide 44 pt en el iPad |
199
+ | computadora (`pointer: fine`) | `medium` (40) | también en tablas, filas y cabeceras; `small`, `xsmall` y `2xsmall` no se usan |
200
+
201
+ Footer de modal: `large` en todos (D2). Ultrawide (≥ 1920 px): igual que la computadora, `medium`;
202
+ el espacio extra va a ancho y columnas, no a botones más grandes.
203
+
204
+ En master-pedidos: `[size]="bp.sizeControl()"`.
205
+
182
206
  ## API
183
207
 
184
208
  <!-- api:inicio -->
@@ -234,6 +258,46 @@ interface SuiFooterButtonConfig {
234
258
  disabled propio desde afuera.
235
259
  - Ya trae el arreglo de iOS para el `:active` pegado (`touchstart`/`touchend`): no lo agregues.
236
260
 
261
+ ## Bien y mal
262
+
263
+ **Botón de ícono en una cabecera**
264
+
265
+ ```html
266
+ <!-- ❌ mal: small (36) no llega a 44 en el teléfono y en la computadora va medium (pages/notifications/notifications.html:50) -->
267
+ <sui-button variant="stroke" color="neutral" size="small" [onlyIcon]="true" leftIcon="check-double-line"
268
+ aria-label="Marcar todas como leídas" (click)="markAllAsRead()" />
269
+ ```
270
+
271
+ ```html
272
+ <!-- ✅ bien -->
273
+ <sui-button variant="stroke" color="neutral" [size]="bp.sizeControl()" [onlyIcon]="true" leftIcon="check-double-line"
274
+ aria-label="Marcar todas como leídas" (click)="markAllAsRead()" />
275
+ ```
276
+
277
+ **El helper equivocado para el tamaño**
278
+
279
+ ```html
280
+ <!-- ❌ mal: controlSize() es de checkbox/radio/switch y da large en la computadora (pages/customer/checkout/checkout.html:392) -->
281
+ <sui-button [size]="bp.controlSize()" (click)="applyCoupon()">Aplicar</sui-button>
282
+ ```
283
+
284
+ ```html
285
+ <!-- ✅ bien: large en celular y tablet táctil, medium en la computadora -->
286
+ <sui-button [size]="bp.sizeControl()" (click)="applyCoupon()">Aplicar</sui-button>
287
+ ```
288
+
289
+ **El botón que abre una confirmación de borrar**
290
+
291
+ ```html
292
+ <!-- ❌ mal: filled error es para confirmar; este solo abre el modal (pages/empresa/about/about.html:46, igual en repartidor/about) -->
293
+ <sui-button variant="filled" color="error" [size]="bp.sizeControl()" (click)="openDeleteModal()">Eliminar mi cuenta</sui-button>
294
+ ```
295
+
296
+ ```html
297
+ <!-- ✅ bien: stroke error abre; el filled error queda para el «Sí, eliminar» del modal -->
298
+ <sui-button variant="stroke" color="error" [size]="bp.sizeControl()" (click)="openDeleteModal()">Eliminar mi cuenta</sui-button>
299
+ ```
300
+
237
301
  ## Ejemplo
238
302
 
239
303
  ```html
@@ -247,6 +311,6 @@ interface SuiFooterButtonConfig {
247
311
  </sui-button>
248
312
 
249
313
  <!-- Solo ícono -->
250
- <sui-button variant="ghost" color="neutral" size="2xsmall" leftIcon="pencil-line" [onlyIcon]="true"
314
+ <sui-button variant="ghost" color="neutral" [size]="bp.sizeControl()" leftIcon="pencil-line" [onlyIcon]="true"
251
315
  aria-label="Editar" (click)="editar()" />
252
316
  ```