@ajuarezso/sui-design-system 0.20.0 → 0.22.0

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 (85) hide show
  1. package/docs/INDEX.md +75 -80
  2. package/docs/sui-accordion/README.md +171 -0
  3. package/docs/sui-activity-feed/README.md +155 -0
  4. package/docs/sui-activity-filter/README.md +100 -0
  5. package/docs/sui-alert/README.md +13 -0
  6. package/docs/sui-badge/README.md +17 -0
  7. package/docs/sui-banner/README.md +190 -0
  8. package/docs/sui-breadcrumb-item/README.md +96 -0
  9. package/docs/sui-breadcrumbs/README.md +122 -0
  10. package/docs/sui-button/README.md +36 -0
  11. package/docs/sui-card/README.md +168 -0
  12. package/docs/sui-chart-legend/README.md +140 -0
  13. package/docs/sui-chart-legend-dot/README.md +118 -0
  14. package/docs/sui-checkbox-card/README.md +150 -0
  15. package/docs/sui-command-menu-footer/README.md +100 -0
  16. package/docs/sui-command-menu-item/README.md +140 -0
  17. package/docs/sui-command-menu-search/README.md +105 -0
  18. package/docs/sui-compact-select/README.md +130 -0
  19. package/docs/sui-compact-select-for-input/README.md +120 -0
  20. package/docs/sui-content-card/README.md +147 -0
  21. package/docs/sui-content-label/README.md +148 -0
  22. package/docs/sui-counter-input/README.md +148 -0
  23. package/docs/sui-date-selector/README.md +98 -0
  24. package/docs/sui-datepicker/README.md +197 -0
  25. package/docs/sui-day-cell/README.md +118 -0
  26. package/docs/sui-day-label/README.md +81 -0
  27. package/docs/sui-drawer-footer/README.md +127 -0
  28. package/docs/sui-drawer-header/README.md +140 -0
  29. package/docs/sui-dropdown-caption/README.md +92 -0
  30. package/docs/sui-dropdown-item/README.md +163 -0
  31. package/docs/sui-dropdown-menu/README.md +196 -0
  32. package/docs/sui-dropdown-search/README.md +113 -0
  33. package/docs/sui-empty-state/README.md +145 -0
  34. package/docs/sui-file-upload/README.md +154 -0
  35. package/docs/sui-file-upload-card/README.md +129 -0
  36. package/docs/sui-filter/README.md +181 -0
  37. package/docs/sui-href/README.md +85 -0
  38. package/docs/sui-image-upload/README.md +200 -0
  39. package/docs/sui-image-upload-profile/README.md +145 -0
  40. package/docs/sui-img-retry/README.md +107 -0
  41. package/docs/sui-inline-input/README.md +104 -0
  42. package/docs/sui-inline-select/README.md +101 -0
  43. package/docs/sui-input/README.md +247 -0
  44. package/docs/sui-integration-switch/README.md +142 -0
  45. package/docs/sui-modal/README.md +238 -0
  46. package/docs/sui-modal-footer/README.md +178 -0
  47. package/docs/sui-modal-header/README.md +115 -0
  48. package/docs/sui-modal-sheet/README.md +170 -0
  49. package/docs/sui-notification/README.md +179 -0
  50. package/docs/sui-notification-footer/README.md +98 -0
  51. package/docs/sui-notification-tab-menu/README.md +112 -0
  52. package/docs/sui-otp-input/README.md +116 -0
  53. package/docs/sui-page-header/README.md +123 -0
  54. package/docs/sui-pagination/README.md +146 -0
  55. package/docs/sui-password-strength/README.md +99 -0
  56. package/docs/sui-period-range/README.md +93 -0
  57. package/docs/sui-popover/README.md +178 -0
  58. package/docs/sui-product-card/README.md +173 -0
  59. package/docs/sui-radio-card/README.md +160 -0
  60. package/docs/sui-rating/README.md +7 -6
  61. package/docs/sui-rich-editor/README.md +114 -0
  62. package/docs/sui-segmented-control/README.md +3 -0
  63. package/docs/sui-select/README.md +183 -0
  64. package/docs/sui-sidebar/README.md +217 -0
  65. package/docs/sui-stepper/README.md +166 -0
  66. package/docs/sui-store-card/README.md +147 -0
  67. package/docs/sui-switch-card/README.md +149 -0
  68. package/docs/sui-switch-label/README.md +3 -0
  69. package/docs/sui-tab-chips/README.md +188 -0
  70. package/docs/sui-tab-menu-horizontal/README.md +142 -0
  71. package/docs/sui-tab-menu-vertical/README.md +136 -0
  72. package/docs/sui-table/README.md +264 -0
  73. package/docs/sui-tag-input/README.md +123 -0
  74. package/docs/sui-textarea/README.md +160 -0
  75. package/docs/sui-time-picker/README.md +240 -0
  76. package/docs/sui-toast/README.md +190 -0
  77. package/docs/sui-tooltip/README.md +201 -0
  78. package/docs/sui-topbar/README.md +153 -0
  79. package/docs/sui-topbar-button/README.md +95 -0
  80. package/docs/sui-topbar-item/README.md +97 -0
  81. package/docs/sui-topbar-user/README.md +83 -0
  82. package/fesm2022/ajuarezso-sui-design-system.mjs +291 -246
  83. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  84. package/package.json +1 -1
  85. package/types/ajuarezso-sui-design-system.d.ts +208 -50
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: sui-activity-filter
3
+ selector: sui-activity-filter
4
+ resumen: Chip con ícono para filtrar un historial de actividad por tipo — Archivos, Comentarios, Tareas — prendido o apagado
5
+ alternativas: [sui-tab-chips (los filtros de lista de la app, siempre uno elegido), sui-segmented-control (2-4 vistas hermanas), sui-tag (una etiqueta que se puede quitar), sui-badge (un estado que no se toca)]
6
+ ---
7
+
8
+ # sui-activity-filter
9
+
10
+ Story: [Organisms/Activity/Activity Filter](https://sui-design-system.web.app/?path=/docs/organisms-activity-activity-filter--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** en la fila de filtros **de un `sui-activity-feed`**, para mostrar solo un tipo de
15
+ actividad. Es un botón que se prende y se apaga (`aria-pressed`); la fila de chips y qué se
16
+ filtra lo arma la pantalla.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Filtrar una lista o un catálogo: `sui-tab-chips`, que es el patrón de filtros de toda la app
21
+ (desliza en horizontal y siempre hay uno elegido).
22
+ - Cambiar entre 2-4 vistas de lo mismo: `sui-segmented-control`.
23
+ - Mostrar un estado: `sui-badge`.
24
+
25
+ Regla corta: **filtros del activity feed → activity filter · cualquier otra lista → tab chips.**
26
+
27
+ ## Qué variante usar
28
+
29
+ > **La guía del DS no tiene página de este filtro.** Sale del Figma de SUI (Activity Feed Selected
30
+ > Filter [1.1], frame 165967:3881: Default, Hover, Active). Uso medido el 03-10-2026 en
31
+ > `master-pedidos/src/app`: **0 usos**. Lo de abajo es **propuesta, falta aprobación**.
32
+
33
+ | prop | cuándo | fuente |
34
+ |---|---|---|
35
+ | `active` | El filtro que está aplicado (fondo naranja al 10 %, texto e ícono naranja). | Figma (State=Active) |
36
+ | `icon` | Un ícono que diga el tipo: `file-list-2-line` archivos, `chat-3-line` comentarios, `task-line` tareas. | propuesta, falta aprobación |
37
+ | `icon` en `null` | «Todos»: el chip que limpia el filtro va sin ícono. | propuesta, falta aprobación |
38
+ | `disabled` | Un tipo que no tiene ninguna actividad en el rango elegido. Mejor que esconderlo: la fila no salta. | propuesta, falta aprobación (el disabled no está en el Figma) |
39
+
40
+ ¿Uno o varios a la vez? El componente no lo decide. Propuesta: **uno a la vez, con «Todos»**,
41
+ igual que `sui-tab-chips`; así nadie se queda con un historial vacío por combinar filtros.
42
+
43
+ ## Tamaño en mobile y en web
44
+
45
+ **No tiene `size`**: 30 de alto (4 + 20 + 4 y el borde), texto 14/500, ícono de 18, radio 8.
46
+
47
+ | uso | mobile | web | fuente |
48
+ |---|---|---|---|
49
+ | filtros del activity feed | no usar: 30 no llega al dedo; usar `sui-tab-chips` en `large` | `sui-activity-filter` | propuesta, falta aprobación |
50
+
51
+ La fila de chips la arma la pantalla: el componente no trae contenedor ni scroll lateral.
52
+
53
+ ## «No usar»: por qué no hoy y cuándo sí
54
+
55
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
56
+ |---|---|---|
57
+ | `sui-activity-filter` (0 usos) | no hay activity feed en la app | arriba de un historial de cambios en super admin, solo en web |
58
+ | como filtro de listas | los filtros de la app son `sui-tab-chips` | nunca: dos componentes de filtro con distinto aspecto confunden |
59
+
60
+ ## API
61
+
62
+ <!-- api:inicio -->
63
+ <!-- generada: no editar a mano — `npm run docs` -->
64
+
65
+ | input | tipo | default |
66
+ |---|---|---|
67
+ | `active` | `boolean` | `false` |
68
+ | `disabled` | `boolean` | `false` |
69
+ | `icon` | `string \| null` | `'file-list-2-line'` |
70
+
71
+ | output | payload |
72
+ |---|---|
73
+ | `clicked` | `Event` |
74
+ <!-- api:fin -->
75
+
76
+ Slot: `<ng-content>` (el texto del chip).
77
+
78
+ ## Trampas
79
+
80
+ - **`icon` trae un ícono por defecto** (`file-list-2-line`): un chip sin `icon` igual muestra el de
81
+ archivos. Para sacarlo, `[icon]="null"`.
82
+ - **Escucha `(clicked)`, no `(click)`.** El host no es un `<button>` nativo: Enter y Espacio emiten
83
+ `(clicked)` pero **no** generan un `click`, así que con `(click)` el filtro no funciona por
84
+ teclado. Además `(clicked)` ya se calla cuando está `disabled`.
85
+ - `active` no cambia solo al tocarlo: lo controla la pantalla (`[active]="filtro() === 'archivos'"`).
86
+ - El host es el botón (`role="button"`, `tabindex`, Enter y Espacio): no lo envuelvas en un
87
+ `<button>`.
88
+ - El foco usa un `outline` de 2 px naranja, no el doble anillo de los inputs del DS.
89
+ - Ya trae el arreglo de iOS para el `:active` pegado.
90
+
91
+ ## Ejemplo
92
+
93
+ ```html
94
+ <div class="historial__filtros">
95
+ <sui-activity-filter [icon]="null" [active]="filtro() === 'todos'" (clicked)="filtro.set('todos')">Todos</sui-activity-filter>
96
+ <sui-activity-filter icon="file-list-2-line" [active]="filtro() === 'archivos'" (clicked)="filtro.set('archivos')">Archivos</sui-activity-filter>
97
+ <sui-activity-filter icon="chat-3-line" [active]="filtro() === 'comentarios'" (clicked)="filtro.set('comentarios')">Comentarios</sui-activity-filter>
98
+ </div>
99
+ <sui-activity-feed [items]="historialFiltrado()" />
100
+ ```
@@ -136,6 +136,19 @@ cliente**, que no es una novedad: `pages/envios/envios.html:725`,
136
136
  y `:198` (`accionActivar`, `accionReintentar`, usadas en `notifications.html:17` y `:23`).
137
137
  - Más de dos acciones: 0.
138
138
 
139
+ ## Tamaño en mobile y en web
140
+
141
+ El alert no tiene un tamaño «de mobile»: el tamaño lo decide el contenido (guía del DS).
142
+ Con descripción va `large` en las dos plataformas; de una línea, `small`. Lo que cambia
143
+ en mobile es el ancho: ocupa toda la columna.
144
+
145
+ | uso | mobile | web | fuente |
146
+ |---|---|---|---|
147
+ | aviso con descripción | `large` | `large` | guía del DS |
148
+ | aviso de una línea en la página | `small` | `small` | guía del DS |
149
+ | dentro de un campo o una card | `xsmall` | `xsmall` | guía del DS |
150
+
151
+
139
152
  ## API
140
153
 
141
154
  <!-- api:inicio -->
@@ -153,6 +153,23 @@ dos valores (`pages/invoices/invoices.html:50` pagado/reembolsado,
153
153
  `pages/super-admin/master-gastos/master-gastos.html:67` confirmado/pendiente) son candidatos; los de
154
154
  pedidos con muchos estados (`pages/orders/orders.html:113`) se quedan como badge.
155
155
 
156
+ ## Tamaño en mobile y en web
157
+
158
+ En mobile el badge se lee de más lejos y al lado de textos de 16 px; en web va más chico.
159
+ `large` (24) y `xlarge` (28) son extensión SUI del 03-10-2026.
160
+
161
+ | uso | mobile | web | fuente |
162
+ |---|---|---|---|
163
+ | estado en una lista o card | `large` (24) | `small` (16, mayúsculas) | canon (aprobado por el dueño, 03-10-2026) |
164
+ | junto a un título o un monto | `xlarge` (28) | `medium` (20) | propuesta, falta aprobación |
165
+ | conteo (`type="number"`) | `large` (24) | `small` (16) | propuesta, falta aprobación |
166
+
167
+ Patrón (la app ya lo usa en 27 lugares; `bp` = `BreakpointsService`, mobile hasta 767 px):
168
+
169
+ ```html
170
+ <sui-badge [size]="bp.isMobile() ? 'large' : 'small'" …/>
171
+ ```
172
+
156
173
  ## API
157
174
 
158
175
  <!-- api:inicio -->
@@ -0,0 +1,190 @@
1
+ ---
2
+ name: sui-banner
3
+ selector: sui-banner
4
+ resumen: Barra de aviso a todo el ancho, arriba de la pantalla, para algo que afecta a toda la app
5
+ alternativas: [sui-alert (aviso ligado a una sección o una card), sui-toast (resultado efímero de una acción), sui-notification (fila de la bandeja), sui-modal (algo que bloquea todo, como quedarse sin conexión)]
6
+ ---
7
+
8
+ # sui-banner
9
+
10
+ Story: [Molecules/Feedback/Banner](https://sui-design-system.web.app/?path=/docs/molecules-feedback-banner--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando el aviso es de **toda la app o de toda la pantalla**, no de una parte: el plan
15
+ del local venció, estás administrando un local como super admin, hay una versión nueva, la app
16
+ está en modo de prueba. Va pegado arriba, a todo el ancho, y se queda mientras dure la situación.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Un aviso de una sección, una card o un paso del flujo («Cobras S/ 12.00 al local al recoger»):
21
+ eso es `sui-alert`, aunque sea importante. El banner no tiene tamaños ni descripción larga: no
22
+ está hecho para vivir en medio del contenido.
23
+ - Confirmar que algo salió bien: `sui-toast`.
24
+ - Algo que impide usar la app (sin conexión, cuenta suspendida): un `sui-modal` o una pantalla
25
+ propia. La app ya lo hace así con «Sin conexión».
26
+
27
+ Regla corta (canon, la misma del alert): **contexto → alert · toda la app → banner · efímero →
28
+ toast · bandeja → notification.**
29
+
30
+ ## Qué variante usar
31
+
32
+ > La guía del DS dice **para qué** es el banner, pero no cuándo va cada relleno ni cada tipo. Lo
33
+ > marcado «según la guía del DS» sale de su texto o de sus ejemplos publicados; lo marcado
34
+ > «canon» ya lo aprobó el dueño en el README de `sui-alert`; el resto es **propuesta** y falta su ok.
35
+ >
36
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`, sin contar prototipos ni vitrinas
37
+ > (`master-preview`, `master-prototipos`, `mockup-*`, `dx/*`, `_guia-*`, `master-rutina`,
38
+ > `master-medico`, `master-ejercicios`, `dev-index`): **2 banners** en 2 archivos, más **1 barra
39
+ > hecha a mano** que debería ser banner.
40
+
41
+ ### Lo que sí dice la guía del DS
42
+
43
+ - **Para qué es**: avisos cruciales, **arriba de la pantalla** y a la vista. Coincide con «toda la
44
+ app → banner».
45
+ - **Una sola línea**: título, punto medio, descripción y **un link** como acción. El link es un
46
+ `sui-link-button` `modifiable`, `medium` y **subrayado**: toma el color del banner.
47
+ - **Botón de cerrar** en todos sus ejemplos.
48
+ - **Defaults**: la guía arranca en relleno `filled` y tipo `feature`; SUI arranca en `stroke` e
49
+ `info`. Es un default, no una recomendación de uso.
50
+
51
+ ### `variant` — qué tipo de aviso es
52
+
53
+ Los mismos cinco tipos que `sui-alert`, con el mismo significado.
54
+
55
+ | variant | cuándo | ejemplo real de la app | fuente |
56
+ |---|---|---|---|
57
+ | `info` (default) | Un dato de toda la app que conviene saber y no pide nada: hay una versión nueva, estás viendo datos de prueba. | (sin uso hoy) | propuesta (sigue la regla canon del alert) |
58
+ | `success` | Un estado bueno que dura y afecta a todo: «Tu local ya está publicado». Si es la confirmación de un clic, es toast. | (sin uso hoy) | propuesta (sigue la regla canon del alert) |
59
+ | `warning` | Hay que hacer algo pronto o lo que hagas tiene consecuencia para toda la cuenta: el plan vence, estás administrando un local que no es tuyo. | `components/subscription-banner/subscription-banner.html:5` («Tu plan vence en 3 días») · candidato: `components/impersonation-banner/impersonation-banner.ts:17` | propuesta (sigue la regla canon del alert) |
60
+ | `error` | Algo ya pasó y afecta a toda la cuenta. | `components/subscription-banner/subscription-banner.html:5` («Tu plan venció») | propuesta (sigue la regla canon del alert) |
61
+ | `feature` | Novedad que alcanza a toda la app. **Aquí es gris**, no morado como en el alert. | (sin uso hoy) | canon (decisión documentada en el `.ts`, recogida en el README del alert) |
62
+
63
+ ### `variantStyle` — el peso visual
64
+
65
+ Misma pregunta que en el alert: **¿este aviso tiene que ganarle a todo lo demás de la pantalla?**
66
+
67
+ | variantStyle | cuándo | ejemplo real de la app | fuente |
68
+ |---|---|---|---|
69
+ | `lighter` | El aviso **acompaña**: hay que tenerlo presente, pero se puede seguir trabajando. Es el caso normal. | `subscription-banner.html:7` en el caso «vence en N días» (hoy en `light`) | propuesta |
70
+ | `filled` (default de la guía) | Hay que **actuar ya**, o la app está en un **modo que cambia lo que haces**: el plan venció, estás administrando otro local. Uno a la vez. | `subscription-banner.html:7` («Tu plan venció») | propuesta |
71
+ | `light` | No usar hoy, como en el alert. **Cuándo sí:** un banner dentro de una zona ya teñida, donde `lighter` se pierde. | — | propuesta |
72
+ | `stroke` (default SUI) | No usar hoy: un banner blanco con borde se confunde con la barra superior. **Cuándo sí:** arriba de una pantalla a sangre (un mapa o una foto), donde la banda blanca sí se distingue. | — | propuesta |
73
+
74
+ ### `dismissible`, `showIcon`, acción y título
75
+
76
+ | prop | valor | cuándo | fuente |
77
+ |---|---|---|---|
78
+ | `dismissible` | `true` | Solo si el aviso se puede ignorar sin problema (versión nueva, novedad). La guía lo muestra en todos sus ejemplos. | según la guía del DS (que exista) · propuesta (cuándo) |
79
+ | `dismissible` | `false` (default) | Todo `filled` y todo aviso que tiene que seguir ahí: plan vencido, administrando otro local. Cerrarlo no arregla nada. | propuesta |
80
+ | `showIcon` | `true` (default) | Siempre: el ícono es la mitad del significado del tipo. | propuesta |
81
+ | `showIcon` | `false` | No usar hoy. **Cuándo sí:** cuando se proyecta un avatar o logo en `slot="icon"` (ver abajo), que ya ocupa ese lugar. | propuesta |
82
+ | `slot="icon"` | avatar o logo | Reemplaza al ícono del tipo: el logo del local que estás administrando. | propuesta |
83
+ | `slot="action"` | **un** `sui-link-button` `variant="modifiable"` con `[underline]="true"` | La única acción del banner: «Renovar plan», «Salir», «Actualizar». Nunca un `sui-button`, nunca dos. | según la guía del DS |
84
+ | `title` | frase corta | Lo que pasa, en sentence case y sin punto final. | canon (copy de la app) |
85
+ | `description` | complemento | Qué hacer o hasta cuándo. Una línea en web; en mobile se envuelve. | según la guía del DS (una línea) |
86
+
87
+ ### Usos de hoy que rompen la regla
88
+
89
+ - **Rompe el canon — 1 banner en contexto → `sui-alert`:**
90
+ `pages/driver/driver-order-detail/driver-order-detail.html:391` («Cobras S/ … al local al
91
+ recoger»). Es el aviso de **un pedido**, dentro de su detalle: va `sui-alert` (`error` `filled`
92
+ si cobra en el mostrador, `info` `lighter` si cobra en la puerta).
93
+ - **Barra hecha a mano que es un banner — 1:** `components/impersonation-banner/impersonation-banner.ts:17`
94
+ («Estás administrando … como super admin» + botón «Salir»), con `#fff` y `rgb()` sueltos. Pasaría a
95
+ `<sui-banner variant="warning" variantStyle="filled">` con un link «Salir».
96
+ - **Romperían la propuesta — 1 `light` → `lighter`:** `components/subscription-banner/subscription-banner.html:7`
97
+ (el caso «vence en N días»).
98
+ - No confundir: `components/upgrade-banner/` (6 pantallas) se llama «banner» pero es un aviso dentro
99
+ de una sección; su destino es `sui-alert`, ya anotado en `docs/CANON-SUI.md`.
100
+
101
+ ## Tamaño en mobile y en web
102
+
103
+ El banner **no tiene `size`**: mide 44 px de alto en web, centrado; en mobile (≤ 767 px) pasa a
104
+ `min-height: 44px`, se alinea a la izquierda y el texto se envuelve en varias líneas.
105
+
106
+ | uso | mobile | web | fuente |
107
+ |---|---|---|---|
108
+ | la barra | 44 px mínimo, crece si el texto envuelve | 44 px fijos, una línea | según el componente |
109
+ | el link de acción | `large` (24 px) cuando se publique (hoy `medium`, 20 px) | `medium` (20 px) | propuesta |
110
+ | la X de cerrar | se ve de 24 px; **se toca en 40 × 40** | igual | canon (aprobado por el dueño, 03-10-2026): área táctil invisible, extensión SUI |
111
+
112
+ ```html
113
+ <sui-banner variant="warning" variantStyle="lighter" title="Tu plan vence en 3 días"
114
+ description="Renueva para seguir recibiendo pedidos">
115
+ <sui-link-button slot="action" variant="modifiable" [underline]="true"
116
+ [size]="bp.isMobile() ? 'large' : 'medium'" (clicked)="renovar()">Renovar plan</sui-link-button>
117
+ </sui-banner>
118
+ ```
119
+
120
+ `size="large"` del link-button está en el repo del DS y todavía no en el paquete publicado 0.19.0:
121
+ hasta entonces va `medium` en las dos.
122
+
123
+ ## «No usar»: por qué no hoy y cuándo sí
124
+
125
+ Nada se borra del DS. Lo marcado «no usar» no tiene caso en la app de hoy; si un flujo nuevo cae
126
+ en la columna de la derecha, se usa.
127
+
128
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
129
+ |---|---|---|
130
+ | `light` | queda a medio camino entre `lighter` y `filled` | un banner dentro de una zona ya teñida |
131
+ | `stroke` | blanco con borde: se confunde con la barra superior | arriba de un mapa o una foto a sangre |
132
+ | `success` | no hay estados buenos que afecten a toda la app | «Tu local ya está publicado» el día que sale al aire |
133
+ | `feature` | no hay novedades anunciadas arriba | anunciar una función nueva a todos los locales, con X para cerrarlo |
134
+ | `showIcon=false` | sin el ícono se pierde el tipo | con un avatar o logo en `slot="icon"` |
135
+
136
+ ## API
137
+
138
+ <!-- api:inicio -->
139
+ <!-- generada: no editar a mano — `npm run docs` -->
140
+
141
+ | input | tipo | default |
142
+ |---|---|---|
143
+ | `variant` | `'info' \| 'success' \| 'warning' \| 'error' \| 'feature'` | `'info'` |
144
+ | `variantStyle` | `'filled' \| 'light' \| 'lighter' \| 'stroke'` | `'stroke'` |
145
+ | `title` | `string \| null` | `null` |
146
+ | `description` | `string \| null` | `null` |
147
+ | `showIcon` | `boolean` | `true` |
148
+ | `dismissible` | `boolean` | `false` |
149
+
150
+ | output | payload |
151
+ |---|---|
152
+ | `closed` | `void` |
153
+ <!-- api:fin -->
154
+
155
+ Signal pública: `dismissed` (`signal(false)`). Slots: `[slot=icon]` (reemplaza el ícono del tipo)
156
+ y `[slot=action]` (el link).
157
+
158
+ ## Trampas
159
+
160
+ - **Defaults distintos al alert:** el banner arranca en `stroke` (blanco con borde), el alert en
161
+ `lighter`. Pásale siempre `variantStyle`.
162
+ - **`feature` es gris** aquí (estado «faded» de la paleta) y morado en `sui-alert`.
163
+ - No tiene `size` ni `actions[]`: la acción va **proyectada** en `slot="action"`, a diferencia del
164
+ alert. Los slots usan `slot=`, no `data-slot=`.
165
+ - En web la altura es **fija** (44 px): un título más una descripción largos se cortan. En mobile sí
166
+ envuelve.
167
+ - **La X se toca en 40 × 40** aunque se vea de 24 (un `::before` invisible sobre su `<button>`,
168
+ desde 03-10-2026). En mobile esa área se mete 4 px en el espacio del texto o del link de acción
169
+ (el padding derecho es 40 y la X ocupa de 4 a 44 px desde el borde): un toque justo en la última
170
+ letra del link puede caer en la X.
171
+ - Al tocar la X se oculta solo (`dismissed`) y emite `closed`; no recuerda nada: si tiene que
172
+ quedarse cerrado entre sesiones, lo guarda el padre.
173
+ - El host lleva `role="region"` con `aria-label` = `title`, y borra el `title` nativo.
174
+ - En mobile, una pantalla con modal a pantalla completa tapa el banner: el de la suscripción se
175
+ esconde con `uiOverlay.fullscreenOpen()` para no quedar encima.
176
+
177
+ ## Ejemplo
178
+
179
+ ```html
180
+ <!-- Aviso que acompaña -->
181
+ <sui-banner variant="warning" variantStyle="lighter"
182
+ title="Tu plan vence en 3 días" description="Renueva para seguir recibiendo pedidos">
183
+ <sui-link-button slot="action" variant="modifiable" [underline]="true" (clicked)="renovar()">Renovar plan</sui-link-button>
184
+ </sui-banner>
185
+
186
+ <!-- Modo que cambia lo que haces: filled, sin X -->
187
+ <sui-banner variant="warning" variantStyle="filled" title="Estás administrando Pollería El Dorado como super admin">
188
+ <sui-link-button slot="action" variant="modifiable" [underline]="true" (clicked)="salir()">Salir</sui-link-button>
189
+ </sui-banner>
190
+ ```
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: sui-breadcrumb-item
3
+ selector: sui-breadcrumb-item
4
+ resumen: Una miga suelta de la ruta; casi siempre la dibuja sui-breadcrumbs por ti
5
+ alternativas: [sui-breadcrumbs (la ruta completa con separadores), sui-link-button (un enlace de texto suelto)]
6
+ ---
7
+
8
+ # sui-breadcrumb-item
9
+
10
+ Story: [Molecules/Breadcrumbs/Breadcrumb Item](https://sui-design-system.web.app/?path=/docs/molecules-breadcrumbs-breadcrumb-item--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **No lo uses directo.** `sui-breadcrumbs` lo dibuja por cada entrada de `items`, pone los
15
+ separadores y decide cuál es el activo. Las reglas de cuándo mostrar una ruta están en el README de
16
+ `sui-breadcrumbs`.
17
+
18
+ **Úsalo suelto** solo si armas una ruta que `sui-breadcrumbs` no cubre: una miga con un menú
19
+ desplegable al lado o un separador propio. Hoy no hay ningún caso.
20
+
21
+ **Tampoco** para un enlace de texto que no es parte de una ruta («Ver todas»): `sui-link-button`.
22
+
23
+ ## Qué variante usar
24
+
25
+ > **Lo que dice la guía del DS**: el ítem de la ruta tiene un estado `active` (la página actual),
26
+ > puede llevar **ícono** y puede ser **un enlace**. No trae do/don't.
27
+ >
28
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`): **0 usos**
29
+ > directos (y 0 de `sui-breadcrumbs`).
30
+
31
+ | input | valor | cuándo | fuente |
32
+ |---|---|---|---|
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 |
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
+ | `href` | vacío | Dibuja un `<button>` y avisa por `(clicked)`. | según el código |
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 |
39
+
40
+ Usos de hoy que rompen las reglas: **0** (no se usa).
41
+
42
+ ## Tamaño en mobile y en web
43
+
44
+ Alto fijo de **20 px**, sin `size`. **No tiene tamaño para mobile**, igual que `sui-breadcrumbs`:
45
+ no se usa en mobile.
46
+
47
+ | uso | mobile | web | fuente |
48
+ |---|---|---|---|
49
+ | miga | no se usa | el componente (dentro de `sui-breadcrumbs`) | propuesta, falta aprobación |
50
+
51
+ ```html
52
+ @if (!bp.isMobile()) { <sui-breadcrumbs [items]="ruta()" /> }
53
+ ```
54
+
55
+ ## «No usar»: por qué no hoy y cuándo sí
56
+
57
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
58
+ |---|---|---|
59
+ | suelto, fuera de `sui-breadcrumbs` | `sui-breadcrumbs` cubre todos los casos | una ruta con un selector en una miga (cambiar de local desde la ruta en web) |
60
+ | en mobile | 20 px de alto | nunca |
61
+
62
+ ## API
63
+
64
+ <!-- api:inicio -->
65
+ <!-- generada: no editar a mano — `npm run docs` -->
66
+
67
+ | input | tipo | default |
68
+ |---|---|---|
69
+ | `label` | `string` | `''` |
70
+ | `icon` | `string` | `''` |
71
+ | `href` | `string` | `''` |
72
+ | `active` | `boolean` | `false` |
73
+ | `ariaLabel` | `string` | `''` |
74
+
75
+ | output | payload |
76
+ |---|---|
77
+ | `clicked` | `void` |
78
+ <!-- api:fin -->
79
+
80
+ ## Trampas
81
+
82
+ - **`clicked` no sale cuando el ítem es `active`.**
83
+ - **Con `href`, el clic navega y además emite `clicked`**: no navegues dos veces.
84
+ - **El nombre de la clase es `SuiBreadcrumbItem`** y el de los datos de `sui-breadcrumbs` es
85
+ `SuiBreadcrumbEntry`. No son lo mismo.
86
+ - No trae separador: el separador lo pone `sui-breadcrumbs`.
87
+
88
+ ## Ejemplo
89
+
90
+ ```html
91
+ <!-- Lo normal: que lo dibuje sui-breadcrumbs -->
92
+ <sui-breadcrumbs [items]="[{ label: 'Productos', href: '/empresa/productos' }, { label: 'Hamburguesas' }]" />
93
+
94
+ <!-- Suelto, solo si de verdad hace falta -->
95
+ <sui-breadcrumb-item icon="home-5-line" ariaLabel="Inicio" href="/empresa/inicio" />
96
+ ```
@@ -0,0 +1,122 @@
1
+ ---
2
+ name: sui-breadcrumbs
3
+ selector: sui-breadcrumbs
4
+ resumen: Ruta de migas en web que dice dónde estás dentro de una jerarquía de 3 o más niveles y deja volver a cualquiera
5
+ alternativas: [sui-page-header (título de la pantalla), botón de volver del layout (mobile), sui-tab-menu-horizontal (secciones del mismo nivel)]
6
+ ---
7
+
8
+ # sui-breadcrumbs
9
+
10
+ Story: [Molecules/Breadcrumbs/Breadcrumbs](https://sui-design-system.web.app/?path=/docs/molecules-breadcrumbs-breadcrumbs--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** en **web** cuando una pantalla está **3 o más niveles adentro** y sirve volver a un nivel
15
+ intermedio sin pasar por todos: «Productos › Hamburguesas › Clásica con queso» en el panel de la
16
+ empresa, «Locales › Sabores Andinos › Pedidos» en el super admin.
17
+
18
+ **No lo uses** para:
19
+
20
+ - **Mobile**: ahí se vuelve con la flecha del layout. Una fila de migas en 390 px se corta y
21
+ compite con el título.
22
+ - **Una pantalla de 1 o 2 niveles**: el título y el volver ya lo dicen.
23
+ - Secciones del mismo nivel: `sui-tab-menu-horizontal`.
24
+ - Los pasos de un flujo: `sui-stepper`.
25
+
26
+ Regla corta: **3+ niveles en web → breadcrumbs · mobile o 1-2 niveles → flecha de volver.**
27
+
28
+ ## Qué variante usar
29
+
30
+ > **Lo que dice la guía del DS**: «guía mostrando el camino dentro de una app o sitio». Ejemplos con
31
+ > flecha (default), **como enlaces** y con **separador `/`**. El ítem activo es la página actual. No
32
+ > trae do/don't.
33
+ >
34
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-badge`): **0 usos**.
35
+
36
+ ### `divider`
37
+
38
+ | divider | cuándo | fuente |
39
+ |---|---|---|
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 |
43
+
44
+ ### Ítems (`items`)
45
+
46
+ | qué | cuándo | fuente |
47
+ |---|---|---|
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 |
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
+
54
+ Usos de hoy que rompen las reglas: **0** (no se usa).
55
+
56
+ ## Tamaño en mobile y en web
57
+
58
+ Alto fijo de **20 px** (texto 14, ícono 20), sin `size`. **No tiene tamaño para mobile**: no se usa ahí.
59
+
60
+ | uso | mobile | web | fuente |
61
+ |---|---|---|---|
62
+ | ruta de 3+ niveles | no se usa: flecha de volver | `sui-breadcrumbs` | propuesta, falta aprobación |
63
+
64
+ ```html
65
+ @if (!bp.isMobile()) {
66
+ <sui-breadcrumbs [items]="ruta()" />
67
+ }
68
+ ```
69
+
70
+ ## «No usar»: por qué no hoy y cuándo sí
71
+
72
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
73
+ |---|---|---|
74
+ | el componente entero | ninguna pantalla pasa de 2 niveles con salto a uno intermedio | el detalle de un producto dentro de una categoría en el panel web, o un local dentro del super admin |
75
+ | `slash` | ya hay flecha; mezclar estilos confunde | nunca, mientras la flecha sea el estilo de la app |
76
+ | `dot` | el punto es separador de metadatos | nunca para niveles |
77
+ | en mobile | 20 px de alto y la ruta se corta | nunca |
78
+
79
+ ## API
80
+
81
+ <!-- api:inicio -->
82
+ <!-- generada: no editar a mano — `npm run docs` -->
83
+
84
+ | input | tipo | default |
85
+ |---|---|---|
86
+ | `items` | `readonly SuiBreadcrumbEntry[]` | — (requerido) |
87
+ | `divider` | `'arrow' \| 'slash' \| 'dot'` | `'arrow'` |
88
+
89
+ | output | payload |
90
+ |---|---|
91
+ | `navigate` | `SuiBreadcrumbEntry` |
92
+ <!-- api:fin -->
93
+
94
+ ```ts
95
+ interface SuiBreadcrumbEntry {
96
+ label?: string;
97
+ icon?: string; // RemixIcon, 20 px
98
+ href?: string; // interno → router; externo → navegador
99
+ active?: boolean; // default: el último
100
+ ariaLabel?: string; // obligatorio si va solo el ícono
101
+ }
102
+ type SuiBreadcrumbDivider = 'arrow' | 'slash' | 'dot';
103
+ ```
104
+
105
+ ## Trampas
106
+
107
+ - **`navigate` sale en todo clic**, también en los que tienen `href` (el navegador ya navega). Si
108
+ usas `href`, no navegues otra vez en `(navigate)`.
109
+ - **El último ítem es el activo solo**: no es clicable y va en negro.
110
+ - **No corta texto largo**: con nombres de producto largos la fila crece. Acórtalos tú.
111
+ - El host dice `aria-label="Ruta de navegación"` (hasta el 03-10-2026, «Breadcrumb») y no se puede cambiar.
112
+ - `SuiBreadcrumbEntry` (los datos) no es `SuiBreadcrumbItem` (el componente de cada miga).
113
+
114
+ ## Ejemplo
115
+
116
+ ```html
117
+ <sui-breadcrumbs
118
+ [items]="[{ icon: 'home-5-line', href: '/empresa/inicio', ariaLabel: 'Inicio' },
119
+ { label: 'Productos', href: '/empresa/productos' },
120
+ { label: 'Hamburguesas', href: '/empresa/productos?categoria=hamburguesas' },
121
+ { label: 'Clásica con queso' }]" />
122
+ ```
@@ -122,6 +122,42 @@ flujo nuevo cae en la columna de la derecha, se usa (aprobado por el dueño, 03-
122
122
  | `sui-button-group` (0 usos) | hoy no hay opciones combinables pegadas | días del horario del local o filtros que se suman |
123
123
  | `sui-topbar-button` (0 usos) | las barras de la app tienen sus íconos propios | si se unifica la barra superior del admin con la del DS |
124
124
 
125
+ ## Tamaño en mobile y en web
126
+
127
+ En mobile se toca con el dedo: 40 px como mínimo y 48 en la acción principal. En web, 28–40.
128
+
129
+ | uso | mobile | web | fuente |
130
+ |---|---|---|---|
131
+ | 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`) |
132
+ | acción dentro de una card o una fila | `medium` (40) | `small` (36) / `xsmall` (32) | canon (aprobado por el dueño, 03-10-2026) |
133
+ | acción en una tabla densa | — (no hay tablas en mobile) | `2xsmall` (28) | canon (aprobado por el dueño, 03-10-2026) |
134
+ | CTA de landing | `xlarge` (52) | `large` (48) | propuesta, falta aprobación |
135
+
136
+ Patrón (la app ya lo usa en 27 lugares; `bp` = `BreakpointsService`, mobile hasta 767 px):
137
+
138
+ ```html
139
+ <sui-button [size]="bp.isMobile() ? 'large' : 'medium'" …/>
140
+ ```
141
+
142
+ ### Regla de tamaños para todo el DS (aprobada por el dueño, 03-10-2026)
143
+
144
+ Vale para todos los componentes que tienen `size` `large` / `xlarge`:
145
+
146
+ - **Alto, padding y área táctil crecen en cada paso.**
147
+ - **El texto sube un solo escalón: hasta `medium` va en 14 px; `large` y `xlarge` van en 16 px.**
148
+ Labels, botones, chips, tabs e ítems usan `--sui-type-label-md-*`; valores y placeholders de
149
+ campos, `--sui-type-paragraph-md-*`. El line-height acompaña (24). Siempre con token (un
150
+ fallback `var(--token, 16px)` está bien), nunca px sueltos.
151
+ - **El texto secundario chico no cambia**: hints, contadores, sublabels y captions de 12.
152
+ - **Los íconos se quedan en 20.**
153
+ - Si la línea de 24 movería el alto medido, se baja el padding para que el alto total quede igual.
154
+ - Los chips cuya escala arranca en 12 (`sui-tag`, `sui-status-badge`) siguen a `sui-badge`, la
155
+ referencia: 14 en `large` y 16 en `xlarge` (derivado de la referencia `sui-badge`, falta
156
+ confirmación del dueño).
157
+
158
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el botón ya usa Label/Medium 16/24
159
+ en esos dos tamaños.
160
+
125
161
  ## API
126
162
 
127
163
  <!-- api:inicio -->