@ajuarezso/sui-design-system 0.18.10 → 0.20.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 (47) hide show
  1. package/docs/INDEX.md +136 -0
  2. package/docs/sui-alert/README.md +216 -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 +212 -0
  7. package/docs/sui-brand-logo/README.md +143 -0
  8. package/docs/sui-button/README.md +192 -0
  9. package/docs/sui-button-group/README.md +178 -0
  10. package/docs/sui-button-group-item/README.md +102 -0
  11. package/docs/sui-checkbox/README.md +147 -0
  12. package/docs/sui-checkbox-label/README.md +143 -0
  13. package/docs/sui-circular-progress-bar/README.md +131 -0
  14. package/docs/sui-color-dot/README.md +112 -0
  15. package/docs/sui-color-picker/README.md +124 -0
  16. package/docs/sui-compact-avatar-group/README.md +103 -0
  17. package/docs/sui-compact-button/README.md +190 -0
  18. package/docs/sui-content-divider/README.md +124 -0
  19. package/docs/sui-divider/README.md +102 -0
  20. package/docs/sui-emoji/README.md +138 -0
  21. package/docs/sui-fancy-button/README.md +148 -0
  22. package/docs/sui-file-icon/README.md +103 -0
  23. package/docs/sui-flag/README.md +99 -0
  24. package/docs/sui-form-hint/README.md +124 -0
  25. package/docs/sui-form-label/README.md +148 -0
  26. package/docs/sui-icon/README.md +135 -0
  27. package/docs/sui-kbd/README.md +97 -0
  28. package/docs/sui-key-icon/README.md +125 -0
  29. package/docs/sui-link-button/README.md +221 -0
  30. package/docs/sui-logo/README.md +152 -0
  31. package/docs/sui-payment-icon/README.md +98 -0
  32. package/docs/sui-progress-bar/README.md +132 -0
  33. package/docs/sui-progress-bar-label/README.md +143 -0
  34. package/docs/sui-radio/README.md +134 -0
  35. package/docs/sui-radio-label/README.md +137 -0
  36. package/docs/sui-rating/README.md +198 -0
  37. package/docs/sui-segmented-control/README.md +144 -0
  38. package/docs/sui-slider/README.md +143 -0
  39. package/docs/sui-social-button/README.md +158 -0
  40. package/docs/sui-status-badge/README.md +164 -0
  41. package/docs/sui-switch/README.md +146 -0
  42. package/docs/sui-switch-label/README.md +139 -0
  43. package/docs/sui-tag/README.md +145 -0
  44. package/fesm2022/ajuarezso-sui-design-system.mjs +207 -52
  45. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  46. package/package.json +1 -1
  47. package/types/ajuarezso-sui-design-system.d.ts +177 -28
@@ -0,0 +1,103 @@
1
+ ---
2
+ name: sui-compact-avatar-group
3
+ selector: sui-compact-avatar-group
4
+ resumen: Varias personas en una píldora baja con el «+N» en texto, para tablas y filas apretadas
5
+ alternativas: [sui-avatar-group (la pila grande, para cards y cabeceras), sui-avatar (una sola persona)]
6
+ ---
7
+
8
+ # sui-compact-avatar-group
9
+
10
+ Story: [Atoms/Avatar/Compact Avatar Group](https://sui-design-system.web.app/?path=/docs/atoms-avatar-compact-avatar-group--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando hay que mostrar varias personas **en poco alto**: una celda de tabla, una fila
15
+ de lista. Es una píldora blanca con los avatares casi pegados y el «+N» como texto.
16
+
17
+ **No lo uses** para:
18
+
19
+ - Una card o una cabecera con espacio: `sui-avatar-group`.
20
+ - Una sola persona: `sui-avatar`.
21
+
22
+ ## Qué variante usar
23
+
24
+ > **La guía del DS dice qué es, sus tamaños y sus dos estilos, no cuándo usar cada uno.** Lo
25
+ > marcado «según la guía del DS» sale de su texto o de su código; el resto es **propuesta,
26
+ > falta aprobación**.
27
+ >
28
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos directos**. El DS lo usa dentro
29
+ > de `sui-table`.
30
+
31
+ ### Lo que sí dice la guía del DS
32
+
33
+ - **Para qué es**: la versión más compacta del avatar group.
34
+ - **Tamaños**: 40, 32 y 24; el default de la guía es 40 (en SUI, `'32'`).
35
+ - **Estilos**: `default` (píldora blanca con sombra) y `stroke` (además, un borde `stroke-soft-200`).
36
+
37
+ ### `size`, `appearance`, `max` y `count`
38
+
39
+ | input | valor | cuándo | fuente |
40
+ |---|---|---|---|
41
+ | `size` | `'24'` | Celda de tabla. | propuesta |
42
+ | `size` | `'32'` (default SUI) | Fila de una lista. | propuesta |
43
+ | `size` | `'40'` (default de la guía) | Dentro de una card. | propuesta |
44
+ | `appearance` | `default` | Sobre un fondo gris o de color: la sombra lo separa. | propuesta |
45
+ | `appearance` | `stroke` | Sobre blanco, donde la sombra sola no alcanza a marcar el borde. | propuesta |
46
+ | `max` | `3` (default) | Tres avatares visibles. | propuesta |
47
+ | `count` | — | Solo si el total no está en `items` (vienen 3 caras pero son 12 personas): `count="+9"`. Si no, se calcula solo. | propuesta |
48
+
49
+ Usos de hoy que rompen la regla: **0** (no hay usos).
50
+
51
+ ## Tamaño en mobile y en web
52
+
53
+ En mobile se lee y se toca con el dedo, así que va más grande; en web, más chico. En las
54
+ pantallas que se usan en los dos (panel del local, super admin) se elige con el servicio de
55
+ breakpoints de la app (`bp`, en `services/breakpoints.service.ts`); en las que solo existen en
56
+ el celular (cliente, repartidor) va directo el valor de mobile. Todo es **propuesta**.
57
+
58
+ | uso | mobile | web |
59
+ |---|---|---|
60
+ | fila o celda de tabla | `'32'` | `'24'` |
61
+ | dentro de una card | `'40'` | `'32'` |
62
+
63
+ ```html
64
+ <sui-compact-avatar-group [size]="bp.isMobile() ? '32' : '24'" [items]="repartidores" />
65
+ ```
66
+
67
+ ## «No usar»: por qué no hoy y cuándo sí
68
+
69
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
70
+ |---|---|---|
71
+ | todo el componente (0 usos) | no hay tablas con varias personas por fila | la columna «repartidores» en la tabla de locales del super admin |
72
+
73
+ ## API
74
+
75
+ <!-- api:inicio -->
76
+ <!-- generada: no editar a mano — `npm run docs` -->
77
+
78
+ | input | tipo | default |
79
+ |---|---|---|
80
+ | `size` | `'24' \| '32' \| '40'` | `'32'` |
81
+ | `appearance` | `'default' \| 'stroke'` | `'default'` |
82
+ | `items` | `readonly SuiAvatarGroupItem[]` | `[]` |
83
+ | `max` | `number` | `3` |
84
+ | `count` | `string \| null` | `null` |
85
+
86
+ Outputs: ninguno.
87
+ <!-- api:fin -->
88
+
89
+ `items` usa `SuiAvatarGroupItem` (ver `sui-avatar-group`).
90
+
91
+ ## Trampas
92
+
93
+ - **`size` es un string**: `size="32"`, no `[size]="32"` (con número no compila).
94
+ - **El estilo se llama `appearance`**, no `variant` ni `style` (el atributo `style` es del HTML).
95
+ - **`size` no es el de `sui-avatar`**: `'24'` → avatar `sm`, `'32'` → `md`, `'40'` → `lg`.
96
+ - **`count` gana sobre el cálculo**: si lo pasas, se muestra aunque no sobre nadie.
97
+ - Las reglas de foto y color de cada persona son las de `sui-avatar`.
98
+
99
+ ## Ejemplo
100
+
101
+ ```html
102
+ <sui-compact-avatar-group size="24" appearance="stroke" [items]="repartidoresDelLocal" />
103
+ ```
@@ -0,0 +1,190 @@
1
+ ---
2
+ name: sui-compact-button
3
+ selector: sui-compact-button
4
+ resumen: Botón de solo ícono, chico, para cuando falta espacio
5
+ alternativas: [sui-button (acción con texto, o de ícono con onlyIcon en tamaños de 28 a 52), sui-link-button (acción que se lee como texto), sui-topbar-button (ícono de la barra superior)]
6
+ ---
7
+
8
+ # sui-compact-button
9
+
10
+ Story: [Atoms/Button/Compact Button](https://sui-design-system.web.app/?path=/docs/atoms-button-compact-button--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para una acción de un solo ícono donde no entra un botón: cerrar en la cabecera de un
15
+ modal o sheet, «más» o «quitar» en una fila, el − / + de una cantidad, las flechas flotantes de un
16
+ carrusel o un mapa.
17
+
18
+ **No lo uses** para:
19
+
20
+ - **Una acción con texto**: `sui-button` o `sui-link-button`.
21
+ - **El ícono de la barra superior**: `sui-topbar-button`.
22
+ - **Un ícono decorativo** que no hace nada: `sui-icon`.
23
+
24
+ ## Qué variante usar
25
+
26
+ > **La guía del DS no dice cuándo usar cada estilo.** Su página muestra los cuatro estilos, los
27
+ > dos tamaños, el radio completo y el deshabilitado, sin do/don't. Las reglas de abajo son
28
+ > **canon (aprobado por el dueño, 03-10-2026)** salvo donde dice otra fuente.
29
+ >
30
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: 11 compact-buttons en 7 archivos, sin
31
+ > contar prototipos ni vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`,
32
+ > `dx/*`, `master-rutina`, `master-medico`, `dev-index`). Estilos: 6 `ghost`, 3 `stroke` (uno
33
+ > por error, ver abajo), 2 `white`, 0 `modifiable`. Tamaños: 6 `large`, 3 `medium`, 2 `xlarge`.
34
+ > 4 con `fullRadius`, 1 con `disabled`.
35
+
36
+ ### Lo que sí dice la guía del DS
37
+
38
+ - **Para qué es**: botones para cuando el espacio es limitado.
39
+ - **Defaults**: `stroke` + `large` + sin `fullRadius`. Igual que SUI.
40
+ - **Tamaños**: solo `large` (24 px, ícono 20) y `medium` (20 px, ícono 18; en SUI, 16). `xlarge`
41
+ y los tres más grandes son extensión de SUI.
42
+ - **`modifiable` no tiene color, fondo ni hover propios**: hereda el color del contenedor.
43
+ - **Deshabilitado**: sin borde, sin fondo y sin sombra; el ícono en `text-disabled-300`.
44
+
45
+ ### `variantStyle`
46
+
47
+ | variantStyle | cuándo | ejemplo real de la app | fuente |
48
+ |---|---|---|---|
49
+ | `stroke` (default) | Acciones de una fila o una card: «más», «editar», el − / + de una cantidad. | `components/product-detail-view/product-detail-view.html:169` (− / +) | canon (aprobado por el dueño, 03-10-2026) |
50
+ | `ghost` | Cerrar en la cabecera de un modal o un sheet. | `components/store-ratings-modal/store-ratings-modal.html:33` («Cerrar») | canon (aprobado por el dueño, 03-10-2026) |
51
+ | `white` | Flotante sobre un mapa o una foto, siempre con `fullRadius`. | `pages/customer/store-browser/arrastre-carrusel.ts:102` (flechas del carrusel) | canon (aprobado por el dueño, 03-10-2026) |
52
+ | `modifiable` | Hereda el color del contenedor: el cerrar del alert (ya lo trae `sui-alert` adentro). | (sin uso directo; vive dentro de `sui-alert`) | hereda el color: según la guía del DS · dónde va: canon (aprobado por el dueño, 03-10-2026) |
53
+
54
+ **Usos de hoy que rompen la regla:**
55
+
56
+ - **1 bug: `variant="ghost"` en vez de `variantStyle`.** `pages/super-admin/master-settings/master-settings.html:647`
57
+ («Quitar este nivel»). `variant` no es un input del compact-button: el atributo se ignora y el
58
+ botón sale `stroke`. Pasar a `variantStyle="ghost"`.
59
+ - **A discutir — 5 `ghost` para acciones de fila** (quitar, más):
60
+ `components/option-sections-manager/option-sections-manager.html:39` y `:146`,
61
+ `components/add-product-modal/add-product-modal.html:306`,
62
+ `pages/super-admin/master-settings/master-settings.html:111` y `:647`. Este canon dice `stroke`
63
+ para filas y `ghost` solo para cerrar; el canon de `sui-button` permite `ghost` para editar y
64
+ borrar en filas. Los dos canon se contradicen: hay que elegir uno.
65
+
66
+ ### `size`
67
+
68
+ | size | px (ícono) | cuándo | fuente |
69
+ |---|---|---|---|
70
+ | `medium` | 20 (16) | Solo desktop, filas muy densas (tablas). | escala: según la guía del DS · cuándo: canon (aprobado por el dueño, 03-10-2026) |
71
+ | `large` (default) | 24 (20) | Desktop, dentro de cards. | default según la guía del DS · cuándo: canon (aprobado por el dueño, 03-10-2026) |
72
+ | `xlarge` | 28 (24) | Cabeceras de modal en desktop; flechas de carrusel que solo se ven con mouse. | extensión de SUI · canon (aprobado por el dueño, 03-10-2026) |
73
+ | `2xlarge` | 32 (20) | **El mínimo en mobile**: filas y cards que se tocan con el dedo. | extensión de SUI · canon (aprobado por el dueño, 03-10-2026). **En el repo del DS, todavía no en el paquete publicado 0.19.0** |
74
+ | `3xlarge` | 36 (20) | Cerrar en modales y sheets en mobile. | ídem: canon; en el repo, no en 0.19.0 |
75
+ | `4xlarge` | 40 (24) | Flotantes sobre el mapa (volver, centrar). | ídem: canon; en el repo, no en 0.19.0 |
76
+
77
+ **Usos de hoy que rompen la regla** (pantallas del cliente, que se usan en el teléfono, con
78
+ botones de 20 o 24 px):
79
+
80
+ - **4 casos**: `components/product-detail-view/product-detail-view.html:169` y `:173` (− / + en
81
+ `large` → `2xlarge`), `components/store-ratings-modal/store-ratings-modal.html:33` (cerrar en
82
+ `medium` → `3xlarge`), `pages/customer/order-history/order-history.html:383` (flecha de la fila
83
+ en `large` → `2xlarge`).
84
+ - **La migración está bloqueada** hasta que se publique la versión del DS con `2xlarge`,
85
+ `3xlarge` y `4xlarge`.
86
+
87
+ ### `fullRadius`
88
+
89
+ | fullRadius | cuándo | fuente |
90
+ |---|---|---|
91
+ | `false` (default, radio 6) | Lo normal: filas, cards, cabeceras. | default según la guía del DS · cuándo: propuesta |
92
+ | `true` (círculo) | Flotante (`white`) sobre mapa o foto. | canon (aprobado por el dueño, 03-10-2026) |
93
+ | `true` (círculo) | El − / + de una cantidad, para que se lea como un stepper. | propuesta (es lo que ya hace `product-detail-view`) |
94
+
95
+ ### `disabled`, `href`, `ariaLabel`
96
+
97
+ | prop | cuándo | fuente |
98
+ |---|---|---|
99
+ | `disabled` | Se llegó al límite: no hay más stock para sumar, no se puede quitar el último. | cómo se ve: según la guía del DS · cuándo: propuesta |
100
+ | `href` | Solo si el botón navega sin otra acción (volver a una ruta). Pinta un `<a>`; `rel` ya viene en `'noopener noreferrer'`. | propuesta |
101
+ | `ariaLabel` (requerido) | Lo que hace, no lo que muestra: «Cerrar», «Quitar opción», «Agregar uno»; nunca «X» ni «Ícono». | propuesta (el input es obligatorio) |
102
+ | `type="submit"` | Solo dentro de un `<form>`. | propuesta |
103
+
104
+ ## Tamaño en mobile y en web
105
+
106
+ En mobile se toca con el dedo: el área táctil tiene que medir **44 px o más**. En web, con mouse,
107
+ va un tamaño más chico. La app ya lo resuelve con `BreakpointsService`
108
+ (`src/app/services/breakpoints.service.ts`, mobile = hasta 767 px):
109
+ `[size]="bp.isMobile() ? 'large' : 'small'"`, 27 usos hoy en `master-pedidos` (16 `large`/`small`,
110
+ 9 `large`/`medium`, 2 `medium`/`xsmall`). Regla del dueño, 03-10-2026.
111
+
112
+ | uso | mobile | web | fuente |
113
+ |---|---|---|---|
114
+ | acciones de fila o card (más, quitar, − / +) | `2xlarge` (32) | `large` (24); `medium` (20) en tablas densas | canon (aprobado por el dueño, 03-10-2026) |
115
+ | cerrar en la cabecera de un modal o sheet | `3xlarge` (36) | `xlarge` (28) | canon (aprobado por el dueño, 03-10-2026) |
116
+ | flotante sobre el mapa o una foto | `4xlarge` (40) | `xlarge` (28) | canon (aprobado por el dueño, 03-10-2026) |
117
+
118
+ ```html
119
+ <sui-compact-button icon="close-line" variantStyle="ghost" ariaLabel="Cerrar"
120
+ [size]="bp.isMobile() ? '3xlarge' : 'xlarge'" (clicked)="cerrar()" />
121
+ ```
122
+
123
+ **`2xlarge`, `3xlarge` y `4xlarge` están en el repo del DS y todavía no en el paquete publicado
124
+ (0.19.0).** Hasta publicarlos, el patrón de arriba no compila. Aun en `4xlarge` (40) el botón queda
125
+ por debajo de 44: deja 4 px de aire alrededor (gap o padding del contenedor) para que el dedo no
126
+ toque el vecino. `medium` y `large` no van en mobile: hoy hay 4 en pantallas del cliente (ver
127
+ «`size`» arriba).
128
+
129
+ ## «No usar»: por qué no hoy y cuándo sí
130
+
131
+ Ningún valor del compact-button está en «no usar»: los cuatro estilos y los seis tamaños tienen
132
+ un caso. `modifiable` no tiene un uso directo hoy porque el único lugar donde va (el cerrar del
133
+ alert) ya lo trae `sui-alert` adentro.
134
+
135
+ ## API
136
+
137
+ <!-- api:inicio -->
138
+ <!-- generada: no editar a mano — `npm run docs` -->
139
+
140
+ | input | tipo | default |
141
+ |---|---|---|
142
+ | `icon` | `string` | — (requerido) |
143
+ | `variantStyle` | `'stroke' \| 'ghost' \| 'modifiable' \| 'white'` | `'stroke'` |
144
+ | `size` | `'medium' \| 'large' \| 'xlarge' \| '2xlarge' \| '3xlarge' \| '4xlarge'` | `'large'` |
145
+ | `fullRadius` | `boolean` | `false` |
146
+ | `disabled` | `boolean` | `false` |
147
+ | `href` | `string \| null` | `null` |
148
+ | `target` | `string \| null` | `null` |
149
+ | `rel` | `string \| null` | `'noopener noreferrer'` |
150
+ | `type` | `'button' \| 'submit' \| 'reset'` | `'button'` |
151
+ | `ariaLabel` | `string` | — (requerido) |
152
+
153
+ | output | payload |
154
+ |---|---|
155
+ | `clicked` | `MouseEvent` |
156
+ <!-- api:fin -->
157
+
158
+ El clic se escucha con `(clicked)`. `icon` recibe el nombre RemixIcon, sin el prefijo `ri-`.
159
+
160
+ ## Trampas
161
+
162
+ - **El estilo se llama `variantStyle`**, no `variant`. `variant="ghost"` no da error de
163
+ compilación: se ignora y sale `stroke` (pasó en `master-settings.html:647`).
164
+ - **`icon` y `ariaLabel` son obligatorios**: sin `ariaLabel` no compila.
165
+ - **El output es `(clicked)`**. `(click)` sobre el host también llega porque el clic burbujea; hoy 6
166
+ usos lo escuchan así (`product-detail-view.html:169` y `:173`, `master-settings.html:647`,
167
+ `arrastre-carrusel.ts:102` y `:104`, `order-history.html:383`). Usa `(clicked)`, que ya respeta
168
+ `disabled`.
169
+ - **El paquete publicado (0.19.0) solo trae `medium`, `large` y `xlarge`.** Pasar `2xlarge` con un
170
+ cast compila, pero el botón sale sin tamaño y con ícono de 16: no lo hagas hasta que se publique.
171
+ - En `medium` el ícono mide 16, no los 18 de la guía.
172
+ - `modifiable` en hover pinta blanco al 16 %: pensado para fondos oscuros o de color. Sobre blanco
173
+ casi no se nota. Se ajusta con `--sui-compact-button-hover-bg` y `--sui-compact-button-active-bg`.
174
+ - Al presionar, `stroke`, `ghost` y `white` se ponen oscuros (`bg-surface-800`) con el ícono
175
+ blanco: es el estado activo del Figma, no un error.
176
+ - Ya trae el arreglo de iOS para el `:active` pegado: no lo agregues.
177
+
178
+ ## Ejemplo
179
+
180
+ ```html
181
+ <!-- Cerrar en la cabecera de un sheet, en mobile -->
182
+ <sui-compact-button icon="close-line" variantStyle="ghost" size="xlarge" ariaLabel="Cerrar" (clicked)="cerrar()" />
183
+
184
+ <!-- Acción de una fila en desktop -->
185
+ <sui-compact-button icon="more-2-line" ariaLabel="Opciones de la sección" (clicked)="abrirMenu()" />
186
+
187
+ <!-- Flotante sobre el mapa -->
188
+ <sui-compact-button icon="arrow-left-line" variantStyle="white" [fullRadius]="true" size="xlarge"
189
+ ariaLabel="Volver" (clicked)="volver()" />
190
+ ```
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: sui-content-divider
3
+ selector: sui-content-divider
4
+ resumen: Línea con algo encima: el «o» entre dos opciones, la cabecera de un grupo o un botón entre bloques
5
+ alternativas: [sui-divider (la línea sola, horizontal o vertical)]
6
+ ---
7
+
8
+ # sui-content-divider
9
+
10
+ Story: [Atoms/Divider/Content Divider](https://sui-design-system.web.app/?path=/docs/atoms-divider-content-divider--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando la separación **dice algo**:
15
+
16
+ - El «o» entre dos formas de hacer lo mismo (entrar con Google **o** con el correo).
17
+ - La cabecera de un grupo dentro de una lista o un modal («Con pocos pedidos», «Ayer»).
18
+ - Un botón entre dos bloques (agregar algo ahí, ver el resto).
19
+
20
+ **No lo uses** para una línea sola: eso es `sui-divider`, que pesa menos y tiene vertical.
21
+
22
+ ## Qué variante usar
23
+
24
+ > **En la guía del DS este componente se llama «Divider»** y trae: línea (default), línea con
25
+ > espacio, línea con texto («OR»), solo texto, texto con fondo («a menudo va en modales») y
26
+ > contenido al centro. Los cuatro tipos con botones vienen del Figma del DS, no de la guía. Lo
27
+ > marcado «según la guía del DS» sale de su texto o de sus ejemplos; el resto es **propuesta,
28
+ > falta aprobación**.
29
+ >
30
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **1 content-divider**
31
+ > (`pages/super-admin/master-drivers/master-drivers.html:190`, `solid-text` «Con pocos
32
+ > pedidos»), sin contar prototipos ni vitrinas (`master-preview`, `master-prototipos`,
33
+ > `mockup-sheets-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`,
34
+ > `dev-index`).
35
+
36
+ | type | cuándo | ejemplo | fuente |
37
+ |---|---|---|---|
38
+ | `text-line` | El «o» entre dos formas de hacer lo mismo. | `text="o"` entre «Continuar con Google» y el formulario de correo | según la guía del DS («OR») |
39
+ | `solid-text` | Cabecera de un grupo dentro de una lista o un modal, con fondo. | «Con pocos pedidos» (`master-drivers.html:190`) | según la guía del DS («a menudo en modales») |
40
+ | `text` | Cabecera de grupo sin fondo, en una lista partida por fecha o por tipo. | «Ayer», «Esta semana» | según la guía del DS (existe) · propuesta (cuándo) |
41
+ | `line` (default) | **No usar** (ver abajo). | — | según la guía del DS (default) |
42
+ | `line-spacing` | **No usar** (ver abajo). | — | según la guía del DS |
43
+ | `icon-button` | **No usar** hoy (ver abajo). | `icon="add-line"` | propuesta, falta aprobación |
44
+ | `text-button` | **No usar** hoy (ver abajo). | «Ver 12 más» | propuesta, falta aprobación |
45
+ | `icon-button-group` | **No usar** hoy (ver abajo). | Subir · agregar · bajar | propuesta, falta aprobación |
46
+ | `text-button-group` | **No usar** hoy (ver abajo). | «Producto» · «Sección» | propuesta, falta aprobación |
47
+
48
+ | propiedad | regla | fuente |
49
+ |---|---|---|
50
+ | `text` | Se escribe en sentence case («o», «Con pocos pedidos»): el componente lo pasa a MAYÚSCULAS. | propuesta, falta aprobación |
51
+ | `icon` | Solo en `icon-button`. Nombre Remix sin `ri-`. | propuesta, falta aprobación |
52
+ | `ariaLabel` | **Obligatorio en `icon-button`**: sin él el lector dice «Acción». | propuesta, falta aprobación |
53
+ | `items` | Solo en los `-group`: de 2 a 3, cada uno con `ariaLabel` si es ícono. | propuesta, falta aprobación |
54
+ | `disabled` | El botón existe pero hoy no aplica (lista ya completa). | propuesta, falta aprobación |
55
+
56
+ **Corregido el 03-10-2026:** los 2 «o» que estaban hechos a mano (login y registro) ya son `type="text-line"`.
57
+
58
+ ## No usar: por qué no hoy y cuándo sí
59
+
60
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
61
+ |---|---|---|
62
+ | `line` y `line-spacing` | `sui-divider` hace lo mismo, pesa menos y tiene vertical; el espacio lo pone el `gap`. | Ninguno. |
63
+ | `icon-button` | No hay editores donde se inserte algo entre dos bloques. | «Agregar opción aquí» entre dos opciones en el editor de opciones del producto. |
64
+ | `text-button` | Ninguna pantalla de hoy corta una lista con un botón para ver el resto. | «Ver 12 más» al final de una lista cortada (reseñas, historial). |
65
+ | `icon-button-group` / `text-button-group` | No hay editores con bloques que se mueven o se insertan. | Mover, agregar o elegir qué insertar entre secciones de la carta. |
66
+
67
+ ## Tamaño en mobile y en web
68
+
69
+ Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
70
+ (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
71
+ en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
72
+ de la app.
73
+
74
+ | uso | mobile | web | fuente |
75
+ |---|---|---|---|
76
+ | Cualquiera | tamaño único | tamaño único | lo que hay en el DS |
77
+
78
+ **No tiene tamaños**: el texto mide 11–12 px y los botones 32 px en las dos plataformas. En mobile
79
+ los botones (`icon-button`, `text-button`, grupos) quedan debajo de los 44 px del dedo; es otra
80
+ razón para no usarlos hoy. Si un flujo nuevo los necesita en mobile, se pide al DS un tamaño grande.
81
+
82
+ ## API
83
+
84
+ <!-- api:inicio -->
85
+ <!-- generada: no editar a mano — `npm run docs` -->
86
+
87
+ | input | tipo | default |
88
+ |---|---|---|
89
+ | `type` | `'line' \| 'line-spacing' \| 'text-line' \| 'text' \| 'solid-text' \| 'icon-button' \| 'icon-button-group' \| 'text-button' \| 'text-button-group'` | `'line'` |
90
+ | `text` | `string` | `''` |
91
+ | `icon` | `string \| null` | `null` |
92
+ | `ariaLabel` | `string \| null` | `null` |
93
+ | `disabled` | `boolean` | `false` |
94
+ | `items` | `readonly SuiContentDividerItem[]` | `[]` |
95
+
96
+ | output | payload |
97
+ |---|---|
98
+ | `buttonClick` | `MouseEvent` |
99
+ | `itemClick` | `{ item: SuiContentDividerItem; index: number; event: MouseEvent }` |
100
+ <!-- api:fin -->
101
+
102
+ Outputs: `(buttonClick)` en `icon-button` y `text-button`; `(itemClick)` con
103
+ `{ item, index, event }` en los `-group`.
104
+
105
+ ## Trampas
106
+
107
+ - **Todo el texto sale en MAYÚSCULAS** por CSS: escribirlo normal.
108
+ - **`text` y `solid-text` alinean a la izquierda**, no al centro (así está en el Figma).
109
+ - `text-line` usa 11 px; `text` y `solid-text`, 12 px.
110
+ - Sin `ariaLabel`, el `icon-button` se anuncia como «Acción» y los ítems de grupo como
111
+ «Acción 0», «Acción 1».
112
+ - `line` y `line-spacing` existen, pero la línea sola es `sui-divider`.
113
+
114
+ ## Ejemplo
115
+
116
+ ```html
117
+ <!-- Login: Google o correo -->
118
+ <sui-social-button brand="google" label="Continuar con Google" />
119
+ <sui-content-divider type="text-line" text="o" />
120
+ <form>…</form>
121
+
122
+ <!-- Cabecera de grupo en una lista -->
123
+ <sui-content-divider type="solid-text" text="Con pocos pedidos" />
124
+ ```
@@ -0,0 +1,102 @@
1
+ ---
2
+ name: sui-divider
3
+ selector: sui-divider
4
+ resumen: Línea de 1 px que separa bloques (horizontal) o datos en una fila (vertical)
5
+ alternativas: [sui-content-divider (línea con texto o botones encima, o el «o» entre dos opciones)]
6
+ ---
7
+
8
+ # sui-divider
9
+
10
+ Story: [Atoms/Divider/Divider](https://sui-design-system.web.app/?path=/docs/atoms-divider-divider--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para separar con una línea:
15
+
16
+ - **horizontal**: bloques dentro de una card, filas de una lista, secciones de un formulario, el
17
+ subtotal del total.
18
+ - **vertical**: datos en una misma fila («4,7 | 25–35 min | Envío S/ 3.00»).
19
+
20
+ **No lo uses** para:
21
+
22
+ - Una línea con texto o botones encima (el «o» del login, la cabecera de un grupo):
23
+ `sui-content-divider`.
24
+ - Separar cosas que ya separa el espacio. Si el `gap` alcanza, la línea sobra.
25
+ - Dos acciones en texto: el canon del alert es el punto medio «·», no una línea.
26
+
27
+ **Toda línea de separación es `<sui-divider>`**, no un `<div>` con `height: 1px` y
28
+ `background: var(--sui-stroke-soft-200)`.
29
+
30
+ ## Qué variante usar
31
+
32
+ > **La guía del DS llama «Divider» a lo que en SUI es `sui-content-divider`** (línea, línea con
33
+ > espacio, línea con texto, texto, texto con fondo y contenido al centro). Su variante «Line»
34
+ > («una línea horizontal simple», la default) es este componente. La guía no trae la vertical ni
35
+ > dice cuándo separar con línea y cuándo con espacio. Lo marcado «según la guía del DS» sale de
36
+ > ahí; el resto es **propuesta, falta aprobación**.
37
+ >
38
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **13 dividers en 10 pantallas**, todos
39
+ > horizontales, sin contar prototipos ni vitrinas (`master-preview`, `master-prototipos`,
40
+ > `mockup-sheets-*`, `dx/*`, `_guia-*`, `master-rutina`, `master-medico`, `master-ejercicios`,
41
+ > `dev-index`).
42
+
43
+ | orientation | cuándo | ejemplo real | fuente |
44
+ |---|---|---|---|
45
+ | `horizontal` (default) | Separa bloques o filas. El espacio arriba y abajo lo pone el `gap` del padre, no el divider. | `pages/driver/driver-dashboard/driver-dashboard.html:1124` (entre filas, `@if (!last)`) | según la guía del DS («Line») |
46
+ | `vertical` | Separa datos cortos en una sola fila. El padre necesita alto (si no, mide 16 px). | — (sin usos) | propuesta, falta aprobación |
47
+
48
+ **Corregido el 03-10-2026:** las 26 líneas hechas a mano (mi-negocio, checkout, carrito, billetera y movimientos) ya son `sui-divider`. Seis conservan un `margin` propio porque sus vecinos se separan con margen y no con el `gap` del padre; pasarlo al `gap` es un cambio aparte.
49
+
50
+ El «o» del login y del registro también pasó a `sui-content-divider type="text-line"`.
51
+
52
+ ## No usar: por qué no hoy y cuándo sí
53
+
54
+ Nada: las dos orientaciones tienen caso. La vertical no tiene usos hoy, pero el caso existe
55
+ (la fila de nota, tiempo y envío de un local).
56
+
57
+ ## Tamaño en mobile y en web
58
+
59
+ Criterio de la app: **en mobile se lee y se toca con el dedo, así que va más grande; en web
60
+ (desktop), más chico.** Mobile es `≤ 767 px`, el mismo corte de `BreakpointsService.isMobile()`
61
+ en master-pedidos. Fuente: canon del dueño (03-10-2026), el mismo patrón que ya usan 27 controles
62
+ de la app.
63
+
64
+ **No aplica**: es 1 px en las dos plataformas. Lo que cambia por plataforma es el `gap` del padre,
65
+ que separa los bloques (la regla de spacing de la app: 20/16/12 según el breakpoint).
66
+
67
+ ## API
68
+
69
+ <!-- api:inicio -->
70
+ <!-- generada: no editar a mano — `npm run docs` -->
71
+
72
+ | input | tipo | default |
73
+ |---|---|---|
74
+ | `orientation` | `'horizontal' \| 'vertical'` | `'horizontal'` |
75
+
76
+ Outputs: ninguno.
77
+ <!-- api:fin -->
78
+
79
+ ## Trampas
80
+
81
+ - **No tiene margen**: el espacio sale del `gap` del padre. Un divider entre dos bloques sin
82
+ `gap` queda pegado.
83
+ - **El vertical mide `height: 100%`**: dentro de un padre sin alto queda en 16 px. En un flex,
84
+ `align-items: center` + alto en el padre.
85
+ - Es `display: block` (horizontal) e `inline-block` (vertical).
86
+ - Lleva `role="separator"` y `aria-orientation`. Va **entre** filas (`@if (!last)`), no uno por
87
+ fila: el último sobra.
88
+
89
+ ## Ejemplo
90
+
91
+ ```html
92
+ <!-- Entre filas de una lista -->
93
+ @for (f of filas; track f.id; let last = $last) {
94
+ <app-fila [fila]="f" />
95
+ @if (!last) { <sui-divider /> }
96
+ }
97
+
98
+ <!-- Datos en una fila -->
99
+ <div class="meta">
100
+ <span>4,7</span><sui-divider orientation="vertical" /><span>25–35 min</span>
101
+ </div>
102
+ ```
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: sui-emoji
3
+ selector: sui-emoji
4
+ resumen: Un emoji 3D animado (Fluent) para los momentos con emoción: estados vacíos, celebraciones, onboarding
5
+ alternativas: [sui-icon (ícono funcional, monocromo), sui-empty-state (el estado vacío completo, que ya trae su emoji)]
6
+ ---
7
+
8
+ # sui-emoji
9
+
10
+ Story: [Atoms/Emoji](https://sui-design-system.web.app/?path=/docs/atoms-emoji--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** donde la pantalla tiene que **sentirse**, no solo funcionar: un estado vacío, «¡Pedido
15
+ confirmado!», los pasos de una landing, la barra de calificación.
16
+
17
+ **No lo uses** para:
18
+
19
+ - Un ícono funcional (un botón, una fila, un menú): eso es `sui-icon`. Un emoji no es un ícono.
20
+ - Muchos a la vez animados: cada uno es un APNG de ~1 MB en bucle.
21
+ - Una imagen propia que no es un emoji (la moneda de sol): un `<img>`.
22
+
23
+ ## Qué variante usar
24
+
25
+ > **La guía del DS no tiene este componente**: es propio de SUI. Lo marcado «canon» ya es regla
26
+ > del proyecto; el resto es **propuesta, falta aprobación**.
27
+ >
28
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: 10 emojis en 3 archivos, sin contar
29
+ > prototipos ni vitrinas. El catálogo tiene 59.
30
+
31
+ ### Dónde va
32
+
33
+ | caso | cómo | fuente |
34
+ |---|---|---|
35
+ | Estados vacíos y celebraciones | Emoji animado, uno solo, en `xl`. Nada de íconos genéricos en un estado vacío. | canon (preferencia del dueño: emojis animados en los estados vacíos) |
36
+ | Pasos de una landing | `lg`, uno por paso. | propuesta |
37
+ | Junto a un título o dentro de un texto | `md` o `sm`, como acento. | propuesta |
38
+ | Como ícono de un botón | No: el botón lleva `leftIcon`. | propuesta |
39
+
40
+ ### `size`
41
+
42
+ | valor | px | cuándo | fuente |
43
+ |---|---|---|---|
44
+ | `xl` | 48 | Estado vacío, celebración. | propuesta |
45
+ | `lg` | 32 | Pasos de una landing, la barra de calificación. | propuesta |
46
+ | `md` (default) | 24 | Acompaña un título. | propuesta |
47
+ | `sm` | 20 | Dentro de una línea de texto. | propuesta |
48
+ | `xs` | 16 | No usar hoy. | propuesta |
49
+ | `full` | 100 % | Llena su caja: lo usa `sui-empty-state`. | propuesta |
50
+
51
+ ### `animated`, `src`, `name`, `ariaLabel`
52
+
53
+ | input | cuándo | fuente |
54
+ |---|---|---|
55
+ | `animated` (default `true`) | Uno solo → animado. **Varios a la vez → `false`.** Ojo: solo las 5 caritas de la calificación (`pensive-face` … `grinning-face-smiling-eyes`) tienen copia estática; para el resto, `false` no cambia nada. | propuesta (la regla ya está escrita en `sui-emoji.ts`) |
56
+ | `name` | Uno del catálogo. Si no está, se agrega al catálogo del DS. | propuesta |
57
+ | `src` | Un emoji que no está en el catálogo, mientras se agrega. **Nunca** un `<img>` suelto con la URL del emoji. | propuesta |
58
+ | `ariaLabel` | Solo si el emoji dice algo que el texto no dice. Si no, queda decorativo (`aria-hidden`). | propuesta |
59
+
60
+ **Usos de hoy que romperían la propuesta:**
61
+
62
+ - **2 emojis como ícono de botón**: «Encargarme yo» en `pages/orders/orders.html:322` y `:353` → `leftIcon`.
63
+ - **5 animados a la vez** en `pages/public/landing-customers/landing-customers.html:160`–`:184`
64
+ (más otro en `:56`). No tienen copia estática: o se acepta el peso en la landing o se generan
65
+ las copias.
66
+ - **Un catálogo paralelo**: `core/fluent-emoji.ts` arma sus propias URLs (otro CDN incluido) y lo
67
+ importan 8 archivos (`components/permission-prime-modal/permission-prime-modal.ts`,
68
+ `pages/role-selector/role-selector.ts`, `pages/customer/order-tracking/order-tracking.ts`…).
69
+ - **10 `<img>` con un emoji**, fuera del componente: `pages/products/add-product/add-product.html:122`
70
+ (la URL del paquete escrita a mano, y 3 más en el mismo archivo),
71
+ `components/location-flow-outlet/location-flow-outlet.html:14`,
72
+ `pages/customer/order-tracking/order-tracking.html:249`. No cuentan las imágenes de los rubros
73
+ (`pages/customer/store-browser/store-browser.html:193` y similares): vienen de datos y no son
74
+ del catálogo.
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
+ | estado vacío, celebración | `xl` (48) | `xl` (48) |
86
+ | pasos de una landing | `lg` (32) | `xl` (48) |
87
+ | dentro de un texto | `md` (24) | `sm` (20) |
88
+
89
+ ```html
90
+ <sui-emoji name="hamburger" [size]="bp.isMobile() ? 'lg' : 'xl'" />
91
+ ```
92
+
93
+ El emoji no se toca, así que la regla del dedo no aplica: en los casos de ilustración va igual o
94
+ más grande en web, donde sobra espacio. El tamaño con nombre más grande es `xl` (48); para uno más
95
+ grande, `size="full"` dentro de una caja con el alto que se quiera.
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
+ | `size` `xs` | a 16 px un emoji ya no se distingue | dentro de un tag de categoría, solo con copia estática |
102
+ | como ícono de botón o de fila | un emoji no es un ícono | ninguno |
103
+
104
+ ## API
105
+
106
+ <!-- api:inicio -->
107
+ <!-- generada: no editar a mano — `npm run docs` -->
108
+
109
+ | input | tipo | default |
110
+ |---|---|---|
111
+ | `name` | `SuiEmojiName \| null` | `null` |
112
+ | `src` | `string \| null` | `null` |
113
+ | `size` | `'xs' \| 'sm' \| 'md' \| 'lg' \| 'xl' \| 'full'` | `'md'` |
114
+ | `ariaLabel` | `string \| null` | `null` |
115
+ | `animated` | `boolean` | `true` |
116
+
117
+ Outputs: ninguno.
118
+ <!-- api:fin -->
119
+
120
+ ## Trampas
121
+
122
+ - **Pesan**: los animados son APNG de ~1 MB y 73 fotogramas cada uno, servidos desde
123
+ `raw.githubusercontent.com`. Si ese servidor se cae, no hay emoji.
124
+ - **`animated=false` solo sirve para 5**: las caritas. El resto no tiene copia estática.
125
+ - **`src` gana sobre `name`.**
126
+ - **No toma color**: no responde a `currentColor` ni al tema.
127
+ - Sin `ariaLabel` es decorativo: el lector de pantalla no lo dice.
128
+ - `loading="lazy"`: fuera de la pantalla, no carga hasta que se acerca.
129
+
130
+ ## Ejemplo
131
+
132
+ ```html
133
+ <!-- Celebración -->
134
+ <sui-emoji name="party-popper" size="xl" />
135
+
136
+ <!-- La barra de calificación: cinco juntos, estáticos -->
137
+ <sui-emoji name="neutral-face" size="lg" [animated]="false" ariaLabel="Regular" />
138
+ ```