@ajuarezso/sui-design-system 0.21.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 (42) hide show
  1. package/docs/INDEX.md +25 -30
  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-button/README.md +19 -0
  6. package/docs/sui-command-menu-footer/README.md +100 -0
  7. package/docs/sui-command-menu-item/README.md +140 -0
  8. package/docs/sui-command-menu-search/README.md +105 -0
  9. package/docs/sui-compact-select/README.md +4 -1
  10. package/docs/sui-compact-select-for-input/README.md +3 -0
  11. package/docs/sui-counter-input/README.md +3 -0
  12. package/docs/sui-datepicker/README.md +4 -0
  13. package/docs/sui-dropdown-caption/README.md +92 -0
  14. package/docs/sui-dropdown-item/README.md +163 -0
  15. package/docs/sui-dropdown-menu/README.md +196 -0
  16. package/docs/sui-dropdown-search/README.md +113 -0
  17. package/docs/sui-filter/README.md +181 -0
  18. package/docs/sui-href/README.md +85 -0
  19. package/docs/sui-img-retry/README.md +107 -0
  20. package/docs/sui-input/README.md +3 -0
  21. package/docs/sui-modal/README.md +238 -0
  22. package/docs/sui-modal-footer/README.md +178 -0
  23. package/docs/sui-modal-header/README.md +115 -0
  24. package/docs/sui-modal-sheet/README.md +170 -0
  25. package/docs/sui-page-header/README.md +123 -0
  26. package/docs/sui-segmented-control/README.md +3 -0
  27. package/docs/sui-select/README.md +5 -2
  28. package/docs/sui-sidebar/README.md +217 -0
  29. package/docs/sui-switch-label/README.md +3 -0
  30. package/docs/sui-tab-chips/README.md +5 -2
  31. package/docs/sui-table/README.md +264 -0
  32. package/docs/sui-tag-input/README.md +3 -0
  33. package/docs/sui-textarea/README.md +3 -0
  34. package/docs/sui-time-picker/README.md +3 -0
  35. package/docs/sui-topbar/README.md +153 -0
  36. package/docs/sui-topbar-button/README.md +95 -0
  37. package/docs/sui-topbar-item/README.md +97 -0
  38. package/docs/sui-topbar-user/README.md +83 -0
  39. package/fesm2022/ajuarezso-sui-design-system.mjs +32 -29
  40. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  41. package/package.json +1 -1
  42. package/types/ajuarezso-sui-design-system.d.ts +18 -16
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: sui-command-menu-footer
3
+ selector: sui-command-menu-footer
4
+ resumen: Pie del buscador ⌘K (command menu) con las teclas para moverse y elegir, y un link de ayuda
5
+ alternativas: [sui-modal-footer (botones de un modal), sui-kbd (una tecla suelta), sui-dropdown-caption (texto de pie de un menú flotante)]
6
+ ---
7
+
8
+ # sui-command-menu-footer
9
+
10
+ Story: [Organisms/Command Menu/Command Menu Footer](https://sui-design-system.web.app/?path=/docs/organisms-command-menu-command-menu-footer--docs)
11
+
12
+ La última de las tres piezas del command menu (ver README de `sui-command-menu-item`): dos grupos
13
+ de teclas (↑ ↓ «Navegar», ↵ «Seleccionar») y a la derecha un texto con un link de ayuda.
14
+
15
+ ## Cuándo usarlo / cuándo no
16
+
17
+ **Úsalo** al pie de un command menu **en desktop**, para enseñar las teclas.
18
+
19
+ **No lo uses** para:
20
+
21
+ - Mobile: no hay teclado físico; las teclas no dicen nada (README de `sui-kbd`). No se pinta.
22
+ - Un command menu que **no** se mueve con flechas: si el pie dice «↑ ↓ Navegar», las flechas tienen
23
+ que funcionar. `sui-command-menu-item` no las trae; las cablea quien arma el menú.
24
+ - Botones de un modal: `sui-modal-footer`.
25
+
26
+ Regla corta: **command menu en desktop con flechas cableadas → footer · mobile → nada.**
27
+
28
+ ## Qué variante usar
29
+
30
+ > **La guía del DS lo pone como parte opcional del command menu**: un pie para mostrar atajos de
31
+ > teclado o información extra. No trae do/don't. Todo lo de abajo es **propuesta, falta
32
+ > aprobación**, salvo lo marcado canon.
33
+ >
34
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-dropdown-menu`):
35
+ > **0 usos**.
36
+
37
+ No tiene variantes. Se decide el copy y si va el bloque de ayuda.
38
+
39
+ | prop | regla | fuente |
40
+ |---|---|---|
41
+ | `navigateLabel` · `selectLabel` | **Siempre en español**: «Moverte» y «Abrir» (o «Elegir»). Los defaults son `'Navigate'` y `'Select'`. | canon (CANON-SUI §5: copy en español, tuteo) |
42
+ | `helpText` + `helpLink` | Solo si hay adónde mandar a la persona (el WhatsApp de soporte). Si no, `[helpText]="null"` saca el bloque entero. Los defaults están en inglés. | propuesta |
43
+ | `helpLink` como objeto | `{ label, href, target }` dibuja un `<a>` de verdad; con `target: '_blank'` pone `rel="noopener noreferrer"` solo. | API |
44
+
45
+ ## Tamaño en mobile y en web
46
+
47
+ No tiene tamaños: 48 px de alto, textos 12/16, hasta 600 px de ancho.
48
+
49
+ | uso | mobile | web | fuente |
50
+ |---|---|---|---|
51
+ | pie del command menu | no se pinta | 48 px | canon para mobile (README de `sui-kbd`: en mobile las teclas no se muestran) |
52
+
53
+ ```html
54
+ @if (!bp.isMobile()) {
55
+ <sui-command-menu-footer navigateLabel="Moverte" selectLabel="Abrir" [helpText]="null" />
56
+ }
57
+ ```
58
+
59
+ ## API
60
+
61
+ <!-- api:inicio -->
62
+ <!-- generada: no editar a mano — `npm run docs` -->
63
+
64
+ | input | tipo | default |
65
+ |---|---|---|
66
+ | `navigateLabel` | `string` | `'Navigate'` |
67
+ | `selectLabel` | `string` | `'Select'` |
68
+ | `helpText` | `string \| null` | `"Not what you're looking for? Try the"` |
69
+ | `helpLink` | `SuiLinkConfig \| string \| null` | `'Help Center'` |
70
+
71
+ | output | payload |
72
+ |---|---|
73
+ | `helpClicked` | `MouseEvent` |
74
+ <!-- api:fin -->
75
+
76
+ `helpLink` como string dibuja un botón que solo emite `helpClicked`; como `SuiLinkConfig`
77
+ (`{ label, href?, target?, rel? }`) dibuja un `<a>`, y un `href` interno navega dentro de la app.
78
+
79
+ ## Trampas
80
+
81
+ - **Los cuatro textos vienen en inglés.** Si no se pasan, el pie dice «Navigate», «Select», «Not
82
+ what you're looking for? Try the» y «Help Center».
83
+ - **`helpText: null` saca también el link**; `helpLink: null` saca solo el link y deja el texto.
84
+ - **Promete flechas que nadie cablea**: ni `sui-command-menu-item` ni el modal mueven la selección
85
+ con ↑ ↓.
86
+ - Hasta 600 px el texto de ayuda se oculta (queda solo el link): pasa en un modal angosto aunque sea
87
+ desktop.
88
+ - Las teclas son íconos fijos (↑ ↓ ↵); no se pueden cambiar.
89
+
90
+ ## Ejemplo
91
+
92
+ ```html
93
+ @if (!bp.isMobile()) {
94
+ <sui-command-menu-footer
95
+ navigateLabel="Moverte"
96
+ selectLabel="Abrir"
97
+ helpText="¿No es lo que buscas? Escríbenos por"
98
+ [helpLink]="{ label: 'WhatsApp', href: 'https://wa.me/51931819925', target: '_blank' }" />
99
+ }
100
+ ```
@@ -0,0 +1,140 @@
1
+ ---
2
+ name: sui-command-menu-item
3
+ selector: sui-command-menu-item
4
+ resumen: Fila de resultado del buscador ⌘K (command menu) que lleva a una pantalla, un pedido o una persona
5
+ alternativas: [sui-dropdown-item (fila de un menú de acciones anclado a un botón), sui-filter-item (fila de un panel de filtros), sui-content-card (resultado que se ve en una lista de la pantalla)]
6
+ ---
7
+
8
+ # sui-command-menu-item
9
+
10
+ Story: [Organisms/Command Menu/Command Menu Item](https://sui-design-system.web.app/?path=/docs/organisms-command-menu-command-menu-item--docs)
11
+
12
+ **SUI no tiene un componente «command menu» entero.** Se arma con tres piezas dentro de un
13
+ `sui-modal`: `sui-command-menu-search` arriba, la lista de `sui-command-menu-item` en el medio
14
+ (con cabeceras de grupo `sui-content-divider`) y `sui-command-menu-footer` abajo. Quien lo arma pone
15
+ el filtrado, el teclado y el atajo ⌘K.
16
+
17
+ ## Cuándo usarlo / cuándo no
18
+
19
+ **Úsalo** para los resultados de un buscador que **lleva a algún lado**: abrir un pedido, ir a una
20
+ pantalla del panel, abrir la ficha de un repartidor o un local. Es el patrón del super admin o del
21
+ panel del local **en desktop**, donde hay teclado.
22
+
23
+ **No lo uses** para:
24
+
25
+ - Acciones sobre algo concreto (editar, archivar): `sui-dropdown-item` dentro de un
26
+ `sui-dropdown-menu`.
27
+ - Elegir un valor de un formulario: `sui-select`.
28
+ - La lista de resultados de una pantalla de búsqueda (la del cliente buscando tiendas): ahí van las
29
+ cards de la pantalla, no filas de palette.
30
+ - Un menú en mobile: el ⌘K es un patrón de teclado.
31
+
32
+ Regla corta: **buscar y saltar → command menu · actuar sobre algo → dropdown · elegir un valor →
33
+ select.** La tabla completa está en el README de `sui-dropdown-menu`.
34
+
35
+ ## Qué variante usar
36
+
37
+ > **La guía del DS define el command menu como el buscador que deja saltar rápido desde cualquier
38
+ > pantalla**, armado dentro de un diálogo, con input, lista, grupos con título, items y un pie con
39
+ > teclas. El item tiene dos tamaños, `small` (default) y `medium`, y el elegido se marca con fondo
40
+ > `bg-weak-50`. No trae do/don't. Lo demás es **propuesta, falta aprobación**.
41
+ >
42
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-dropdown-menu`):
43
+ > **0 usos**. Solo aparece en la vitrina `master-preview`.
44
+
45
+ ### `type` — qué va a la izquierda
46
+
47
+ | type | cuándo | fuente |
48
+ |---|---|---|
49
+ | `left-icon` | Ir a una **pantalla** o una sección: «Pedidos», «Mi negocio», «Recargas». | según la guía del DS (item con ícono); el cuándo es propuesta |
50
+ | `avatar` | Una **persona**: repartidor, cliente, dueño de local (`avatar` con `src` o `initials`). | propuesta |
51
+ | `company` | Un **local**: su logo en `avatar.src`. | propuesta |
52
+ | `basic` (default) | Una búsqueda reciente o un resultado sin imagen («Pedido #1234»). | propuesta |
53
+ | `brand` | Un servicio externo con su logo (Yape, WhatsApp), proyectado en `slot="brand"`. | propuesta |
54
+ | `country` | No usar hoy: todo es Perú. | propuesta |
55
+
56
+ ### `size` y los extras
57
+
58
+ | prop | cuándo | fuente |
59
+ |---|---|---|
60
+ | `size="small"` (default, 40) | Listas de resultados de una línea (`title` + `sublabel`). | según la guía del DS (default `small`) |
61
+ | `size="medium"` (64) | Cuando el resultado necesita una segunda línea (`description`) para distinguirse: «Pedido #1234» · «Juan Pérez · S/ 45.00». | según la guía del DS (existe); el cuándo es propuesta |
62
+ | `badge` | Un estado corto que ayuda a elegir («Pendiente», «Cerrado»). String = gris `lighter`; objeto `SuiBadgeConfig` para color. | propuesta |
63
+ | `shortcut` | El atajo de esa acción (`sui-kbd`). Solo web. | canon (README de `sui-kbd`: en mobile no se pinta) |
64
+ | `showButton` | Una flecha a la derecha cuando el resultado abre otra pantalla. | propuesta |
65
+
66
+ ## Tamaño en mobile y en web
67
+
68
+ El command menu es un patrón de desktop. En mobile no hay ⌘K ni flechas; si se reusa la lista en un
69
+ buscador de mobile, la fila `small` mide 40 y queda debajo de los 44 del dedo.
70
+
71
+ | uso | mobile | web | fuente |
72
+ |---|---|---|---|
73
+ | resultado de una línea | `medium` (64) | `small` (40) | propuesta, falta aprobación |
74
+ | resultado con descripción | `medium` (64) | `medium` (64) | propuesta |
75
+
76
+ ```html
77
+ <sui-command-menu-item [size]="bp.isMobile() ? 'medium' : 'small'" … /> <!-- bp = BreakpointsService -->
78
+ ```
79
+
80
+ ## API
81
+
82
+ <!-- api:inicio -->
83
+ <!-- generada: no editar a mano — `npm run docs` -->
84
+
85
+ | input | tipo | default |
86
+ |---|---|---|
87
+ | `type` | `'basic' \| 'left-icon' \| 'avatar' \| 'brand' \| 'company' \| 'country'` | `'basic'` |
88
+ | `size` | `'small' \| 'medium'` | `'small'` |
89
+ | `title` | `string` | — (requerido) |
90
+ | `sublabel` | `string \| null` | `null` |
91
+ | `description` | `string \| null` | `null` |
92
+ | `icon` | `string \| null` | `null` |
93
+ | `avatar` | `SuiAvatarConfig \| string \| null` | `null` |
94
+ | `flagName` | `SuiFlagName \| null` | `null` |
95
+ | `badge` | `SuiBadgeConfig \| string \| null` | `null` |
96
+ | `shortcut` | `string \| null` | `null` |
97
+ | `showButton` | `boolean` | `false` |
98
+
99
+ | output | payload |
100
+ |---|---|
101
+ | `clicked` | `MouseEvent` |
102
+ | `buttonClicked` | `MouseEvent` |
103
+ <!-- api:fin -->
104
+
105
+ Slot: `[slot=brand]` (solo con `type="brand"`). `avatar` acepta un string (la URL) o
106
+ `SuiAvatarConfig` (`{ src?, initials?, color? }`).
107
+
108
+ ## Trampas
109
+
110
+ - **`(clicked)` nunca sale.** El componente declara el output pero no lo conecta a ningún clic (el
111
+ host no escucha `click` y el template no llama a `onClick`; el spec no lo prueba). Escucha el
112
+ `(click)` nativo del host: `<sui-command-menu-item (click)="ir(r)" … />`.
113
+ - **Enter y Espacio no hacen nada.** Tiene `role="button"` y `tabindex="0"`, así que se enfoca con
114
+ Tab, pero activarlo con teclado lo tiene que cablear quien lo usa (`(keydown.enter)`).
115
+ - **No hay estado «elegido»** para la navegación con flechas: el fondo `weak-50` sale con hover y
116
+ con `:focus-visible`. Para mover la selección con ↑ ↓ hay que mover el foco entre filas.
117
+ - `description` solo se ve en `medium`.
118
+ - `showButton` pinta una flecha con `ariaLabel="Abrir"` fijo, y su clic sale por `buttonClicked`
119
+ (no burbujea al item).
120
+ - `type="left-icon"` sin `icon` en `small` cae al ícono `apps-line`; en `medium` queda el círculo vacío.
121
+ - Mide como máximo 600 px de ancho.
122
+ - El host borra el atributo `title` nativo (no aparece el tooltip gris del navegador).
123
+
124
+ ## Ejemplo
125
+
126
+ ```html
127
+ <sui-modal [(open)]="buscadorAbierto" size="large" [fullscreen]="true">
128
+ <sui-command-menu-search [(value)]="q" placeholder="Busca pedidos, locales o repartidores…"
129
+ [shortcut]="!bp.isMobile()" />
130
+ <sui-content-divider type="text" text="Pantallas" />
131
+ @for (p of pantallas(); track p.ruta) {
132
+ <sui-command-menu-item type="left-icon" [icon]="p.icono" [title]="p.nombre"
133
+ [size]="bp.isMobile() ? 'medium' : 'small'"
134
+ (click)="ir(p.ruta)" (keydown.enter)="ir(p.ruta)" />
135
+ }
136
+ @if (!bp.isMobile()) {
137
+ <sui-command-menu-footer navigateLabel="Moverte" selectLabel="Abrir" [helpText]="null" />
138
+ }
139
+ </sui-modal>
140
+ ```
@@ -0,0 +1,105 @@
1
+ ---
2
+ name: sui-command-menu-search
3
+ selector: sui-command-menu-search
4
+ resumen: Campo de arriba del buscador ⌘K (command menu), sin caja y con borde inferior
5
+ alternativas: [sui-input type="search" (buscador de una pantalla), sui-dropdown-search (filtrar los items de un menú flotante)]
6
+ ---
7
+
8
+ # sui-command-menu-search
9
+
10
+ Story: [Organisms/Command Menu/Command Menu Search](https://sui-design-system.web.app/?path=/docs/organisms-command-menu-command-menu-search--docs)
11
+
12
+ Es la primera de las tres piezas del command menu (ver README de `sui-command-menu-item`): el
13
+ campo, el chip ⌘K y un botón para limpiar. **No busca**: emite el texto y quien lo usa filtra.
14
+
15
+ ## Cuándo usarlo / cuándo no
16
+
17
+ **Úsalo** arriba de un command menu armado dentro de un `sui-modal`: el buscador que salta a
18
+ pedidos, locales, repartidores o pantallas del panel en desktop.
19
+
20
+ **No lo uses** para:
21
+
22
+ - El buscador de una pantalla o de una lista a la vista: `sui-input type="search"` (ya lleva
23
+ `enterkeyhint="search"`, tamaños y label).
24
+ - Filtrar las opciones de un menú anclado a un botón: `sui-dropdown-search`.
25
+ - Fuera del command menu: no tiene caja, solo un borde abajo; suelto parece texto.
26
+
27
+ Regla corta: **buscar en toda la app → command-menu-search · buscar en una pantalla → sui-input
28
+ search · filtrar un menú → dropdown-search.**
29
+
30
+ ## Qué variante usar
31
+
32
+ > **La guía del DS define el command menu como el buscador que deja saltar rápido desde cualquier
33
+ > pantalla**; el input es su primera parte. No dice nada del chip ni del botón de la derecha (salen
34
+ > del Figma del DS). Todo lo de abajo es **propuesta, falta aprobación**, salvo lo marcado canon.
35
+ >
36
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-dropdown-menu`):
37
+ > **0 usos**.
38
+
39
+ Los tres estados salen solos del `value`: vacío (lupa gris, placeholder gris), hover (placeholder
40
+ más oscuro) y con texto (lupa naranja, X para limpiar).
41
+
42
+ | prop | regla | fuente |
43
+ |---|---|---|
44
+ | `placeholder` | **Siempre**, en español y diciendo qué se busca: «Busca pedidos, locales o repartidores…». El default es `'Search or jump to'`. | canon (CANON-SUI §5: copy en español, elipsis `…`) |
45
+ | `shortcut` | `true` solo en web; en mobile `false` (no hay teclado físico). | canon (README de `sui-kbd`) |
46
+ | `button` | Déjalo en `true`: la X de limpiar ahorra borrar a mano. El ícono de info del estado vacío no hace nada. | propuesta |
47
+
48
+ ## Tamaño en mobile y en web
49
+
50
+ No tiene tamaños: 48 px de alto (14 + 20 + 13 + 1 de borde), texto 14/20, hasta 600 px de ancho.
51
+
52
+ | uso | mobile | web | fuente |
53
+ |---|---|---|---|
54
+ | buscador del command menu | igual, sin chip ⌘K | igual, con chip ⌘K | canon para el chip (README de `sui-kbd`); el resto, propuesta |
55
+
56
+ ```html
57
+ <sui-command-menu-search [(value)]="q" placeholder="Busca pedidos, locales o repartidores…"
58
+ [shortcut]="!bp.isMobile()" /> <!-- bp = BreakpointsService -->
59
+ ```
60
+
61
+ ## API
62
+
63
+ <!-- api:inicio -->
64
+ <!-- generada: no editar a mano — `npm run docs` -->
65
+
66
+ | input | tipo | default |
67
+ |---|---|---|
68
+ | `value` | `string` | `''` |
69
+ | `placeholder` | `string` | `'Search or jump to'` |
70
+ | `shortcut` | `boolean` | `true` |
71
+ | `button` | `boolean` | `true` |
72
+
73
+ | output | payload |
74
+ |---|---|
75
+ | `valueChange` | `string` |
76
+ | `cleared` | `void` |
77
+ <!-- api:fin -->
78
+
79
+ `value` no es `model`, pero el par `value` + `valueChange` permite `[(value)]`. La X emite
80
+ `valueChange('')` y `cleared`, y devuelve el foco al campo.
81
+
82
+ ## Trampas
83
+
84
+ - **Sin `[(value)]` no funciona bien.** El componente no guarda lo que se escribe: solo lo emite. Si
85
+ no se le devuelve el `value`, la X nunca aparece y la lupa no cambia: el estado «con texto» sale
86
+ del input `value`, no de lo escrito.
87
+ - **El chip dice ⌘K, fijo.** En Windows el atajo es Ctrl+K y el chip no cambia; tampoco hay atajo
88
+ real: el `keydown` global lo cablea quien arma el command menu.
89
+ - **iOS hace zoom al enfocarlo**: el campo está en 14 px y la regla de la app pide 16 px en los
90
+ inputs de mobile (CLAUDE.md, «Responsive mobile»).
91
+ - **El teclado no trae la lupa**: el `<input>` es `type="text"` sin `enterkeyhint="search"` (CLAUDE.md,
92
+ «La lupa del teclado»).
93
+ - **El campo no tiene nombre accesible**: solo placeholder, sin `aria-label`.
94
+ - No tiene `disabled`.
95
+ - El ícono de info del estado vacío es decorativo: no abre ayuda ni tiene `aria-label`.
96
+
97
+ ## Ejemplo
98
+
99
+ ```html
100
+ <sui-command-menu-search
101
+ [(value)]="q"
102
+ placeholder="Busca pedidos, locales o repartidores…"
103
+ [shortcut]="!bp.isMobile()"
104
+ (cleared)="resultados.set([])" />
105
+ ```
@@ -53,7 +53,10 @@ Regla corta: **filtro suelto en una barra, ancho al texto → compact · campo c
53
53
 
54
54
  Tiene los tres tamaños de la guía —`medium` (40), `small` (36), `xsmall` (32)— y **`large` (48)**,
55
55
  extensión SUI para mobile: mide lo mismo que un `sui-button` `large` de la misma barra. En `large`
56
- crece el aire (padding 14 · 12, radio 12); el texto y los íconos siguen en 14/20 y 20.
56
+ crece el aire (padding 12 a los lados, radio 12) y los íconos siguen en 20.
57
+
58
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el valor y las opciones del menú
59
+ van en 16/24 en `large` y el padding vertical baja para que el alto siga en 48 (trigger) y 44 (opción).
57
60
 
58
61
  Las opciones del menú siguen al `size` como en `sui-select`: 36 hasta `medium`, **44 en `large`**, y
59
62
  **44 en mobile (≤ 767 px) con cualquier tamaño**.
@@ -51,6 +51,9 @@ contiene**: el selector ocupa todo el alto interior del campo (46 · 38 · 34 ·
51
51
  toca (y su hover) cubre el campo de arriba a abajo. Sus opciones miden 44 en `large` y en mobile
52
52
  (≤ 767 px); 36 en el resto, como en `sui-select`.
53
53
 
54
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): en `large` el valor y las opciones van
55
+ en 16/24, igual que el valor del `sui-input` large; el alto no cambia (46 dentro del campo, 44 la opción).
56
+
54
57
  | size del input y del selector | campo | fuente |
55
58
  |---|---|---|
56
59
  | `large` | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
@@ -70,6 +70,9 @@ dentro de la píldora). El ícono es de 20 hasta `large` y de 24 en `xlarge`.
70
70
  | `medium` (default) · `small` · `xsmall` | 40 · 36 · 32 | 24 | según la guía del DS |
71
71
  | `2xsmall` | 28 | 24 | extensión SUI |
72
72
 
73
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el número va en 16/24; el alto del
74
+ campo no cambia (lo ponen los botones).
75
+
73
76
  | uso | mobile | web | fuente |
74
77
  |---|---|---|---|
75
78
  | cantidad junto al CTA (detalle del producto) | `large` (48), igual que el botón | `large` | propuesta (ya es práctica en `restaurant-menu.html:480`) |
@@ -100,6 +100,10 @@ el teléfono el footer del rango pone el resumen «Rango: …» arriba y los dos
100
100
  | flechas de mes | 24 | 40 | 40 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
101
101
  | Cancelar / Aplicar | 36 | 48 | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
102
102
 
103
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): con `large`, la fecha del campo (y
104
+ su placeholder) va en 16/24. El calendario no cambia: los días, el mes y el resumen del rango siguen
105
+ en 14.
106
+
103
107
  ```html
104
108
  <!-- Web: popover. Mobile: en línea dentro de un sui-modal fullscreen. -->
105
109
  @if (bp.isMobile()) {
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: sui-dropdown-caption
3
+ selector: sui-dropdown-caption
4
+ resumen: Texto gris de pie dentro de un menú flotante (una pista, la versión, cuándo se actualizó)
5
+ alternativas: [sui-content-divider (cabecera de un grupo de items), sui-form-hint (ayuda debajo de un campo), sui-empty-state (el menú no tiene resultados)]
6
+ ---
7
+
8
+ # sui-dropdown-caption
9
+
10
+ Story: [Organisms/Dropdown/Dropdown Caption](https://sui-design-system.web.app/?path=/docs/organisms-dropdown-dropdown-caption--docs)
11
+
12
+ Una línea de texto `soft-400` 14/20 con 8 px de aire, pensada para el **pie** del panel de un
13
+ `sui-dropdown-menu`. No tiene inputs: el texto se proyecta.
14
+
15
+ ## Cuándo usarlo / cuándo no
16
+
17
+ **Úsalo** para un dato accesorio al final del menú, que nadie tiene que leer para usarlo: una
18
+ pista («Presiona Enter para agregar»), la versión, «Actualizado hace 5 min».
19
+
20
+ **No lo uses** para:
21
+
22
+ - La cabecera de un grupo de items («Negocios», «Sucursales»): `sui-content-divider` `text`.
23
+ - Algo que la persona necesita para decidir: el gris `soft-400` es el de los metadatos y
24
+ placeholders (CANON-SUI §0); lo importante va en el `description` del item.
25
+ - Decir que la búsqueda no encontró nada: un texto de vacío con la voz del CANON («No encontramos
26
+ nada con ese filtro»), sin CTA.
27
+ - Fuera de un menú: en una pantalla, el metadato es texto con `paragraph-xs` + `soft-400`.
28
+
29
+ Regla corta: **pie del menú → caption · cabecera de grupo → content-divider · ayuda de un campo →
30
+ form-hint.**
31
+
32
+ ## Qué variante usar
33
+
34
+ > **La guía del DS no tiene una pieza «caption»** en su dropdown: tiene etiqueta de grupo y
35
+ > separador. La caption sale del Figma del DS («Dropdown Misc Items»). Todo lo de abajo es
36
+ > **propuesta, falta aprobación**.
37
+ >
38
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-dropdown-menu`):
39
+ > **0 usos**.
40
+
41
+ No tiene variantes. Lo único que se decide es el texto:
42
+
43
+ | qué | regla | fuente |
44
+ |---|---|---|
45
+ | largo | Una línea; si no entra, corta palabra y salta de línea (`word-break: break-word`). | propuesta |
46
+ | copy | Sentence case, con punto solo si son dos frases. Tuteo: «Presiona Enter para agregar». | canon (CANON-SUI §5, `docs/VOZ-Y-ESCRITURA.md`) |
47
+ | posición | Al final del panel, después del último item. | propuesta |
48
+
49
+ **Candidatos de hoy:** las cabeceras de grupo a mano del switcher del sidebar
50
+ (`components/sidebar/sidebar.html:67`, `:88`, `:104`) **no** son caption: son cabeceras de grupo y van
51
+ con `sui-content-divider`.
52
+
53
+ ## Tamaño en mobile y en web
54
+
55
+ No tiene tamaños: 14/20 con 8 px de padding en los dos. No se toca, así que no le aplica el mínimo
56
+ de 44 px del dedo.
57
+
58
+ | uso | mobile | web | fuente |
59
+ |---|---|---|---|
60
+ | pie de un menú | igual (14/20) | igual (14/20) | propuesta |
61
+
62
+ ## API
63
+
64
+ <!-- api:inicio -->
65
+ <!-- generada: no editar a mano — `npm run docs` -->
66
+
67
+ Inputs: ninguno.
68
+
69
+ Outputs: ninguno.
70
+ <!-- api:fin -->
71
+
72
+ Slot: el contenido por defecto (`<ng-content />`) es el texto.
73
+
74
+ ## Trampas
75
+
76
+ - **No es una cabecera de grupo.** Es gris claro y va al pie; para «Negocios» / «Sucursales» se usa
77
+ `sui-content-divider`.
78
+ - Tiene fondo blanco propio (`bg-white-0`) y ocupa todo el ancho: sobre un panel de otro color se nota
79
+ la caja.
80
+ - No lleva `role`: el lector de pantalla lo lee como texto suelto dentro del menú.
81
+
82
+ ## Ejemplo
83
+
84
+ ```html
85
+ <ng-template suiDropdownPanel>
86
+ <sui-dropdown-search [(value)]="busqueda" placeholder="Buscar etiqueta…" />
87
+ @for (e of etiquetasFiltradas(); track e) {
88
+ <sui-dropdown-item [label]="e" (clicked)="menu.close(); elegir(e)" />
89
+ }
90
+ <sui-dropdown-caption>Presiona Enter para crear «{{ busqueda() }}»</sui-dropdown-caption>
91
+ </ng-template>
92
+ ```
@@ -0,0 +1,163 @@
1
+ ---
2
+ name: sui-dropdown-item
3
+ selector: sui-dropdown-item
4
+ resumen: Fila de un menú flotante o de una lista de opciones, con ícono, bandera, avatar o logo a la izquierda y badge o atajo a la derecha
5
+ alternativas: [sui-command-menu-item (fila del buscador ⌘K), sui-filter-item (fila de un panel de filtros), sui-sidebar (navegación lateral, con sus items), sui-radio-label (opciones fijas a la vista en un formulario)]
6
+ ---
7
+
8
+ # sui-dropdown-item
9
+
10
+ Story: [Organisms/Dropdown/Dropdown Item](https://sui-design-system.web.app/?path=/docs/organisms-dropdown-dropdown-item--docs)
11
+
12
+ Va **dentro** de algo que lo contiene: el panel de un `sui-dropdown-menu`, la lista de un
13
+ `sui-select` (que lo arma solo) o el panel del header de `sui-sidebar`. Suelto en una pantalla no
14
+ tiene sentido: para una lista a la vista hay otros componentes.
15
+
16
+ ## Cuándo usarlo / cuándo no
17
+
18
+ **Úsalo** para cada fila de un menú de acciones (`mode="menuitem"`, el default) o de una lista
19
+ donde se elige un valor y el elegido queda marcado (`mode="option"`): el ⋮ de una sección, el
20
+ switcher de negocio y sucursal del sidebar.
21
+
22
+ **No lo uses** para:
23
+
24
+ - Las opciones de un `sui-select` o `sui-compact-select`: el select ya las pinta con este mismo
25
+ componente; se le pasan `options`, no items.
26
+ - Una lista de navegación lateral: `sui-sidebar` y sus items (`SuiSidebarItem`).
27
+ - Las filas del buscador ⌘K: `sui-command-menu-item` (otra altura y otro marcado).
28
+ - Opciones fijas que deberían verse todas en un formulario: `sui-radio-label` / `sui-radio-card`.
29
+
30
+ Regla corta: **hace algo → `menuitem` · elige y queda marcado → `option`.** Ver la relación entre
31
+ dropdown, select y command menu en el README de `sui-dropdown-menu`.
32
+
33
+ ## Qué variante usar
34
+
35
+ > **La guía del DS lo arma por partes** (item + ícono, y adentro bandera, avatar, badge o atajo),
36
+ > con una prop `inset` para alinear los que no llevan ícono. No dice cuándo va cada tamaño ni cada
37
+ > modo. Lo que sigue es **propuesta, falta aprobación**, salvo lo marcado.
38
+ >
39
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app` (misma exclusión que `sui-dropdown-menu`):
40
+ > **10 usos, los 10 en `size="large"`**. 7 `mode="option"` en los switchers del sidebar
41
+ > (`components/sidebar/sidebar.html:69`, `:89`, `:96`, `:106`, `layouts/customer/customer-layout.html:27`,
42
+ > `layouts/driver/driver-layout.html:25`, `layouts/master/master-layout.html:27`) y 3 `menuitem` con
43
+ > `leadingFramed` en el ⋮ de `components/option-sections-manager/option-sections-manager.html:40`, `:43`, `:46`.
44
+
45
+ ### `mode` — qué es la fila
46
+
47
+ | mode | cuándo | ejemplo real de la app | fuente |
48
+ |---|---|---|---|
49
+ | `menuitem` (default) | La fila **hace algo**: editar, archivar, ir a otra pantalla. `selected` no pinta nada. | `option-sections-manager.html:40` («Editar») | propuesta |
50
+ | `option` | La fila **es un valor** y el elegido queda marcado (fondo `primary-alpha-10` + check a la derecha). El contenedor lleva `role="listbox"`. | `sidebar.html:69` (el negocio actual) | propuesta (ya es práctica) |
51
+
52
+ ### `size`
53
+
54
+ | size | alto | cuándo | fuente |
55
+ |---|---|---|---|
56
+ | `small` (default) | 36 | Menú de acciones en web, una línea (label + `sublabel` en la misma línea). | según la guía del DS (Figma: Small 36) |
57
+ | `large` | 56 | Toda fila en mobile; en web, cuando hay segunda línea (`description`) o el ícono va enmarcado. | según la guía del DS (Figma: Large 56); el cuándo es propuesta |
58
+ | `xlarge` | 76 | Extensión SUI. Sin uso hoy. | — |
59
+
60
+ ### Las piezas
61
+
62
+ | prop / slot | cuándo | fuente |
63
+ |---|---|---|
64
+ | `slot="leading"` | `sui-icon` (20), `sui-flag`, `sui-avatar` (`xs`), `sui-brand-logo` o `sui-checkbox`. El tipo de la fila sale de lo que se proyecta. | según la guía del DS (se arma por partes) |
65
+ | `leadingFramed` | Solo con un `sui-icon` en `large`/`xlarge`: lo mete en un círculo de 40 con borde. Nunca con avatar, bandera o logo (ya traen forma). | según la guía del DS (Figma Large, tipo basic) |
66
+ | `sublabel` | Dato corto al lado del label en `small` («(es)», «@juan»). | según la guía del DS |
67
+ | `description` | Segunda línea en `large`: la aclaración que ayuda a elegir. **En `small` no se ve.** | según la guía del DS |
68
+ | `shortcut` | Solo web (en mobile no hay teclado físico, ver README de `sui-kbd`). | canon (README de `sui-kbd`) |
69
+ | `slot="trailing"` | Badge primero, después el atajo (lo pone el componente), al final un switch o botón. | según la guía del DS (orden del Figma) |
70
+ | `disabled` | Existe pero hoy no se puede: queda gris claro y no recibe toques. | según la guía del DS |
71
+ | `highlighted` | Lo usa el select para la navegación con flechas. A mano no hace falta. | propuesta |
72
+
73
+ **Usos de hoy que romperían la propuesta:**
74
+
75
+ - **4 filas de «Cambiar de rol» en `mode="option"` que nunca marcan `selected`**:
76
+ `customer-layout.html:27`, `driver-layout.html:25`, `master-layout.html:27` (y `sidebar.html:106`).
77
+ Cambiar de rol es una acción, no un valor elegido: o se marca el rol actual con `selected`, o
78
+ pasan a `menuitem` con el contenedor en `role="menu"`. **A discutir.**
79
+ - **`sublabel` en `large`** en esos mismos switchers: en `large` el sublabel cae abajo en 12/16
80
+ `soft-400` (gris claro). Para la segunda línea de `large` el componente tiene `description`
81
+ (`sub-600`, se lee mejor).
82
+ - **Íconos de 18 dentro de `leadingFramed`**: `option-sections-manager.html:41`, `:44`, `:47`. El
83
+ círculo está medido para un ícono de 20 (20 + 10 + 10 = 40); con 18 queda de 38.
84
+
85
+ ## Tamaño en mobile y en web
86
+
87
+ El item **no cambia solo en mobile**: no tiene `@media`. El 44 de mobile que tienen las opciones de
88
+ `sui-select` lo pone el panel del select, no el item. Suelto, un `small` mide 36 también en el
89
+ celular: queda debajo de los 44 del dedo.
90
+
91
+ | uso | mobile | web | fuente |
92
+ |---|---|---|---|
93
+ | menú de acciones (⋮) | `large` (56) | `small` (36) | propuesta, falta aprobación |
94
+ | switcher con segunda línea (negocio + dirección) | `large` (56) | `large` (56) | propuesta (ya es práctica en el sidebar) |
95
+ | opciones de un select | las pone el select (44) | las pone el select (36–48) | canon (README de `sui-select`, aprobado 03-10-2026) |
96
+
97
+ ```html
98
+ <sui-dropdown-item label="Editar" [size]="bp.isMobile() ? 'large' : 'small'" … /> <!-- bp = BreakpointsService -->
99
+ ```
100
+
101
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026). El label va en Label/Medium 16/24
102
+ (el nodo de Figma del large lo dibuja en 14); la description no cambia en large (12) y el alto
103
+ sigue en 56: el padding-y bajó de 8 a 6.
104
+
105
+ ## API
106
+
107
+ <!-- api:inicio -->
108
+ <!-- generada: no editar a mano — `npm run docs` -->
109
+
110
+ | input | tipo | default |
111
+ |---|---|---|
112
+ | `label` | `string` | — (requerido) |
113
+ | `sublabel` | `string \| null` | `null` |
114
+ | `description` | `string \| null` | `null` |
115
+ | `size` | `'small' \| 'large' \| 'xlarge'` | `'small'` |
116
+ | `leadingFramed` | `boolean` | `false` |
117
+ | `mode` | `'menuitem' \| 'option'` | `'menuitem'` |
118
+ | `selected` | `boolean` | `false` |
119
+ | `highlighted` | `boolean` | `false` |
120
+ | `disabled` | `boolean` | `false` |
121
+ | `shortcut` | `string \| null` | `null` |
122
+
123
+ | output | payload |
124
+ |---|---|
125
+ | `clicked` | `Event` |
126
+ <!-- api:fin -->
127
+
128
+ Slots: `[slot=leading]` y `[slot=trailing]`. `clicked` sale con clic, Enter y Espacio, y no sale si
129
+ está `disabled`.
130
+
131
+ ## Trampas
132
+
133
+ - **No cierra el menú.** Dentro de un `sui-dropdown-menu` hay que cerrarlo en el handler:
134
+ `(clicked)="menu.close(); editar()"`.
135
+ - **`selected` en `menuitem` no se ve.** El set del Figma no le da fondo al seleccionado de un menú;
136
+ solo `mode="option"` pinta fondo naranja suave + check. Si la fila tiene que verse marcada, es
137
+ `option`.
138
+ - **CANON-SUI §4.2 mezcla los dos modos**: dice que la opción de lista «no lleva fondo de selección»
139
+ y a la vez que se marca con `primary-alpha-10`. Lo que hace el código: `menuitem` seleccionado =
140
+ sin fondo; `option` seleccionado = `primary-alpha-10` + check (hover `primary-alpha-16`).
141
+ - **`description` solo existe en `large`/`xlarge`.** En `small` se descarta sin avisar.
142
+ - **`leadingFramed` solo hace algo en `large`/`xlarge`.**
143
+ - `role="option"` necesita un padre con `role="listbox"` (los switchers lo ponen a mano).
144
+ - `disabled` no usa opacidad: baja el texto y el ícono a `disabled-300`; un avatar o una bandera
145
+ quedan al 48 %.
146
+ - El label corta con `…` en una línea: no hace salto de línea.
147
+ - Ya trae los listeners `touchstart`/`touchend` para el `:active` pegado de iOS.
148
+
149
+ ## Ejemplo
150
+
151
+ ```html
152
+ <!-- Acción en un menú -->
153
+ <sui-dropdown-item label="Archivar" [size]="bp.isMobile() ? 'large' : 'small'"
154
+ (clicked)="menu.close(); archivar()">
155
+ <sui-icon slot="leading" name="archive-line" [size]="20" />
156
+ </sui-dropdown-item>
157
+
158
+ <!-- Valor elegido en un switcher (el contenedor lleva role="listbox") -->
159
+ <sui-dropdown-item [label]="local.name" [description]="local.address" mode="option" size="large"
160
+ [selected]="local.id === localActual()" (clicked)="cambiarLocal(local.id)">
161
+ <sui-avatar slot="leading" size="xs" [src]="local.imageUrl" [initials]="local.name.charAt(0)" />
162
+ </sui-dropdown-item>
163
+ ```