@ajuarezso/sui-design-system 0.19.0 → 0.21.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 (97) hide show
  1. package/docs/INDEX.md +136 -0
  2. package/docs/sui-alert/README.md +229 -0
  3. package/docs/sui-app-store-badge/README.md +137 -0
  4. package/docs/sui-avatar/README.md +263 -0
  5. package/docs/sui-avatar-group/README.md +115 -0
  6. package/docs/sui-badge/README.md +229 -0
  7. package/docs/sui-banner/README.md +190 -0
  8. package/docs/sui-brand-logo/README.md +143 -0
  9. package/docs/sui-breadcrumb-item/README.md +96 -0
  10. package/docs/sui-breadcrumbs/README.md +122 -0
  11. package/docs/sui-button/README.md +209 -0
  12. package/docs/sui-button-group/README.md +178 -0
  13. package/docs/sui-button-group-item/README.md +102 -0
  14. package/docs/sui-card/README.md +168 -0
  15. package/docs/sui-chart-legend/README.md +140 -0
  16. package/docs/sui-chart-legend-dot/README.md +118 -0
  17. package/docs/sui-checkbox/README.md +147 -0
  18. package/docs/sui-checkbox-card/README.md +150 -0
  19. package/docs/sui-checkbox-label/README.md +143 -0
  20. package/docs/sui-circular-progress-bar/README.md +131 -0
  21. package/docs/sui-color-dot/README.md +112 -0
  22. package/docs/sui-color-picker/README.md +124 -0
  23. package/docs/sui-compact-avatar-group/README.md +103 -0
  24. package/docs/sui-compact-button/README.md +190 -0
  25. package/docs/sui-compact-select/README.md +127 -0
  26. package/docs/sui-compact-select-for-input/README.md +117 -0
  27. package/docs/sui-content-card/README.md +147 -0
  28. package/docs/sui-content-divider/README.md +124 -0
  29. package/docs/sui-content-label/README.md +148 -0
  30. package/docs/sui-counter-input/README.md +145 -0
  31. package/docs/sui-date-selector/README.md +98 -0
  32. package/docs/sui-datepicker/README.md +193 -0
  33. package/docs/sui-day-cell/README.md +118 -0
  34. package/docs/sui-day-label/README.md +81 -0
  35. package/docs/sui-divider/README.md +102 -0
  36. package/docs/sui-drawer-footer/README.md +127 -0
  37. package/docs/sui-drawer-header/README.md +140 -0
  38. package/docs/sui-emoji/README.md +138 -0
  39. package/docs/sui-empty-state/README.md +145 -0
  40. package/docs/sui-fancy-button/README.md +148 -0
  41. package/docs/sui-file-icon/README.md +103 -0
  42. package/docs/sui-file-upload/README.md +154 -0
  43. package/docs/sui-file-upload-card/README.md +129 -0
  44. package/docs/sui-flag/README.md +99 -0
  45. package/docs/sui-form-hint/README.md +124 -0
  46. package/docs/sui-form-label/README.md +148 -0
  47. package/docs/sui-icon/README.md +135 -0
  48. package/docs/sui-image-upload/README.md +200 -0
  49. package/docs/sui-image-upload-profile/README.md +145 -0
  50. package/docs/sui-inline-input/README.md +104 -0
  51. package/docs/sui-inline-select/README.md +101 -0
  52. package/docs/sui-input/README.md +244 -0
  53. package/docs/sui-integration-switch/README.md +142 -0
  54. package/docs/sui-kbd/README.md +97 -0
  55. package/docs/sui-key-icon/README.md +125 -0
  56. package/docs/sui-link-button/README.md +221 -0
  57. package/docs/sui-logo/README.md +152 -0
  58. package/docs/sui-notification/README.md +179 -0
  59. package/docs/sui-notification-footer/README.md +98 -0
  60. package/docs/sui-notification-tab-menu/README.md +112 -0
  61. package/docs/sui-otp-input/README.md +116 -0
  62. package/docs/sui-pagination/README.md +146 -0
  63. package/docs/sui-password-strength/README.md +99 -0
  64. package/docs/sui-payment-icon/README.md +98 -0
  65. package/docs/sui-period-range/README.md +93 -0
  66. package/docs/sui-popover/README.md +178 -0
  67. package/docs/sui-product-card/README.md +173 -0
  68. package/docs/sui-progress-bar/README.md +132 -0
  69. package/docs/sui-progress-bar-label/README.md +143 -0
  70. package/docs/sui-radio/README.md +134 -0
  71. package/docs/sui-radio-card/README.md +160 -0
  72. package/docs/sui-radio-label/README.md +137 -0
  73. package/docs/sui-rating/README.md +199 -0
  74. package/docs/sui-rich-editor/README.md +114 -0
  75. package/docs/sui-segmented-control/README.md +144 -0
  76. package/docs/sui-select/README.md +180 -0
  77. package/docs/sui-slider/README.md +143 -0
  78. package/docs/sui-social-button/README.md +158 -0
  79. package/docs/sui-status-badge/README.md +164 -0
  80. package/docs/sui-stepper/README.md +166 -0
  81. package/docs/sui-store-card/README.md +147 -0
  82. package/docs/sui-switch/README.md +146 -0
  83. package/docs/sui-switch-card/README.md +149 -0
  84. package/docs/sui-switch-label/README.md +139 -0
  85. package/docs/sui-tab-chips/README.md +185 -0
  86. package/docs/sui-tab-menu-horizontal/README.md +142 -0
  87. package/docs/sui-tab-menu-vertical/README.md +136 -0
  88. package/docs/sui-tag/README.md +145 -0
  89. package/docs/sui-tag-input/README.md +120 -0
  90. package/docs/sui-textarea/README.md +157 -0
  91. package/docs/sui-time-picker/README.md +237 -0
  92. package/docs/sui-toast/README.md +190 -0
  93. package/docs/sui-tooltip/README.md +201 -0
  94. package/fesm2022/ajuarezso-sui-design-system.mjs +466 -279
  95. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  96. package/package.json +1 -1
  97. package/types/ajuarezso-sui-design-system.d.ts +367 -72
@@ -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,143 @@
1
+ ---
2
+ name: sui-brand-logo
3
+ selector: sui-brand-logo
4
+ resumen: El logo oficial de otra marca (WhatsApp, Google, Apple, Instagram…) en su color, sin tocarlo
5
+ alternativas: [sui-icon (el mismo logo como ícono monocromo de una línea), sui-logo (el logo de Master Pedidos), sui-social-button (botón de entrar con Google o Apple)]
6
+ ---
7
+
8
+ # sui-brand-logo
9
+
10
+ Story: [Atoms/Brand Logo](https://sui-design-system.web.app/?path=/docs/atoms-brand-logo--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando **la marca es el contenido**: «Escríbenos por WhatsApp», los logos de redes de
15
+ un negocio, una tarjeta de contacto. Va con su color oficial y no se tiñe.
16
+
17
+ **No lo uses** para:
18
+
19
+ - Un ícono más dentro de un botón o de una fila de íconos monocromos: ahí va `sui-icon`
20
+ (`whatsapp-line`, `apple-fill`), que toma el color del texto.
21
+ - El botón de entrar con Google o Apple: `sui-social-button`, que ya lo trae adentro.
22
+ - El logo de Master Pedidos: `sui-logo`.
23
+
24
+ Regla corta: **la marca es lo que se muestra → brand-logo · es un ícono más → sui-icon.**
25
+
26
+ ## Qué variante usar
27
+
28
+ > **La guía del DS no tiene página para este componente.** Todo es **propuesta, falta
29
+ > aprobación**.
30
+ >
31
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. Lo usan por dentro
32
+ > `sui-content-card` (`type="brand"`), `sui-social-button`, `sui-content-label`,
33
+ > `sui-dropdown-item` y `sui-radio-card`. Además hay 9 logos de marca hechos con `sui-icon`
34
+ > (`whatsapp-line`, `apple-fill`), que están bien donde son un ícono más.
35
+
36
+ ### `company`
37
+
38
+ | valor | cuándo | fuente |
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 |
44
+
45
+ **No hay TikTok** en el catálogo (son 28 marcas), aunque la app hace publicidad ahí.
46
+
47
+ ### `variant`
48
+
49
+ | valor | cuándo | fuente |
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 |
54
+
55
+ ### `size`
56
+
57
+ | valor | px | cuándo | fuente |
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 |
65
+
66
+ ### `href`, `target`, `rel`, `disabled`, `ariaLabel`
67
+
68
+ | input | cuándo | fuente |
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 («Instagram logo») alcanza. | propuesta |
72
+ | `disabled` | No usar hoy. | propuesta |
73
+
74
+ Usos de hoy que rompen la regla: **0**.
75
+
76
+ ## Tamaño en mobile y en web
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**.
82
+
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) |
87
+
88
+ ```html
89
+ <sui-brand-logo company="instagram" [size]="bp.isMobile() ? '2xl' : 'lg'" [href]="url" target="_blank"
90
+ ariaLabel="Síguenos en Instagram" />
91
+ ```
92
+
93
+ Con `href` el logo **es** el área táctil: en mobile tiene que medir 44 px o más, y el único
94
+ tamaño que llega es `2xl` (48). Si se quiere un logo de 32 px tocable, el link va en un
95
+ contenedor de 44 px.
96
+
97
+ ## «No usar»: por qué no hoy y cuándo sí
98
+
99
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
100
+ |---|---|---|
101
+ | las 23 marcas ajenas | la app no se relaciona con Adobe, Notion, Slack… | una integración real (pagos con Stripe o PayPal) |
102
+ | `variant` `black` | no hay un fondo donde vaya | una fila de «nos encuentras en» o de aliados donde el color distrae |
103
+ | `disabled` | un logo apagado no explica nada | una integración que el local todavía no conectó, con el motivo al lado |
104
+
105
+ ## API
106
+
107
+ <!-- api:inicio -->
108
+ <!-- generada: no editar a mano — `npm run docs` -->
109
+
110
+ | input | tipo | default |
111
+ |---|---|---|
112
+ | `company` | `SuiBrandLogoCompany` | — (requerido) |
113
+ | `variant` | `'original' \| 'black' \| 'white'` | `'original'` |
114
+ | `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| '2xl'` | `'md'` |
115
+ | `href` | `string \| null` | `null` |
116
+ | `target` | `string \| null` | `null` |
117
+ | `rel` | `string \| null` | `'noopener noreferrer'` |
118
+ | `disabled` | `boolean` | `false` |
119
+ | `ariaLabel` | `string \| null` | `null` |
120
+
121
+ Outputs: ninguno.
122
+ <!-- api:fin -->
123
+
124
+ ## Trampas
125
+
126
+ - **Los SVG no vienen en el paquete npm.** Se piden a `/assets/brand/brand-logos/<marca>-<variant>.svg`:
127
+ la app tiene que tener la carpeta copiada en `src/assets/brand/brand-logos/` (hoy la tiene, 84
128
+ archivos). Si falta, sale una imagen rota.
129
+ - **No se tiñe**: es un `<img>`. Si necesitas otro color, es `sui-icon`.
130
+ - **`variant` es el color**, no el tamaño ni la forma.
131
+ - Con `href` y `disabled` a la vez, no se vuelve link.
132
+ - El `aria-label` por defecto está en inglés («WhatsApp logo»): pasa `ariaLabel` en español.
133
+
134
+ ## Ejemplo
135
+
136
+ ```html
137
+ <!-- Tarjeta de soporte -->
138
+ <sui-brand-logo company="whatsapp" size="lg" />
139
+
140
+ <!-- Red del negocio, como link -->
141
+ <sui-brand-logo company="instagram" size="md" [href]="tenant.instagramUrl" target="_blank"
142
+ ariaLabel="Síguenos en Instagram" />
143
+ ```
@@ -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
+ ```