@ajuarezso/sui-design-system 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/docs/INDEX.md +75 -80
  2. package/docs/sui-accordion/README.md +171 -0
  3. package/docs/sui-activity-feed/README.md +155 -0
  4. package/docs/sui-activity-filter/README.md +100 -0
  5. package/docs/sui-alert/README.md +13 -0
  6. package/docs/sui-badge/README.md +17 -0
  7. package/docs/sui-banner/README.md +190 -0
  8. package/docs/sui-breadcrumb-item/README.md +96 -0
  9. package/docs/sui-breadcrumbs/README.md +122 -0
  10. package/docs/sui-button/README.md +36 -0
  11. package/docs/sui-card/README.md +168 -0
  12. package/docs/sui-chart-legend/README.md +140 -0
  13. package/docs/sui-chart-legend-dot/README.md +118 -0
  14. package/docs/sui-checkbox-card/README.md +150 -0
  15. package/docs/sui-command-menu-footer/README.md +100 -0
  16. package/docs/sui-command-menu-item/README.md +140 -0
  17. package/docs/sui-command-menu-search/README.md +105 -0
  18. package/docs/sui-compact-select/README.md +130 -0
  19. package/docs/sui-compact-select-for-input/README.md +120 -0
  20. package/docs/sui-content-card/README.md +147 -0
  21. package/docs/sui-content-label/README.md +148 -0
  22. package/docs/sui-counter-input/README.md +148 -0
  23. package/docs/sui-date-selector/README.md +98 -0
  24. package/docs/sui-datepicker/README.md +197 -0
  25. package/docs/sui-day-cell/README.md +118 -0
  26. package/docs/sui-day-label/README.md +81 -0
  27. package/docs/sui-drawer-footer/README.md +127 -0
  28. package/docs/sui-drawer-header/README.md +140 -0
  29. package/docs/sui-dropdown-caption/README.md +92 -0
  30. package/docs/sui-dropdown-item/README.md +163 -0
  31. package/docs/sui-dropdown-menu/README.md +196 -0
  32. package/docs/sui-dropdown-search/README.md +113 -0
  33. package/docs/sui-empty-state/README.md +145 -0
  34. package/docs/sui-file-upload/README.md +154 -0
  35. package/docs/sui-file-upload-card/README.md +129 -0
  36. package/docs/sui-filter/README.md +181 -0
  37. package/docs/sui-href/README.md +85 -0
  38. package/docs/sui-image-upload/README.md +200 -0
  39. package/docs/sui-image-upload-profile/README.md +145 -0
  40. package/docs/sui-img-retry/README.md +107 -0
  41. package/docs/sui-inline-input/README.md +104 -0
  42. package/docs/sui-inline-select/README.md +101 -0
  43. package/docs/sui-input/README.md +247 -0
  44. package/docs/sui-integration-switch/README.md +142 -0
  45. package/docs/sui-modal/README.md +238 -0
  46. package/docs/sui-modal-footer/README.md +178 -0
  47. package/docs/sui-modal-header/README.md +115 -0
  48. package/docs/sui-modal-sheet/README.md +170 -0
  49. package/docs/sui-notification/README.md +179 -0
  50. package/docs/sui-notification-footer/README.md +98 -0
  51. package/docs/sui-notification-tab-menu/README.md +112 -0
  52. package/docs/sui-otp-input/README.md +116 -0
  53. package/docs/sui-page-header/README.md +123 -0
  54. package/docs/sui-pagination/README.md +146 -0
  55. package/docs/sui-password-strength/README.md +99 -0
  56. package/docs/sui-period-range/README.md +93 -0
  57. package/docs/sui-popover/README.md +178 -0
  58. package/docs/sui-product-card/README.md +173 -0
  59. package/docs/sui-radio-card/README.md +160 -0
  60. package/docs/sui-rating/README.md +7 -6
  61. package/docs/sui-rich-editor/README.md +114 -0
  62. package/docs/sui-segmented-control/README.md +3 -0
  63. package/docs/sui-select/README.md +183 -0
  64. package/docs/sui-sidebar/README.md +217 -0
  65. package/docs/sui-stepper/README.md +166 -0
  66. package/docs/sui-store-card/README.md +147 -0
  67. package/docs/sui-switch-card/README.md +149 -0
  68. package/docs/sui-switch-label/README.md +3 -0
  69. package/docs/sui-tab-chips/README.md +188 -0
  70. package/docs/sui-tab-menu-horizontal/README.md +142 -0
  71. package/docs/sui-tab-menu-vertical/README.md +136 -0
  72. package/docs/sui-table/README.md +264 -0
  73. package/docs/sui-tag-input/README.md +123 -0
  74. package/docs/sui-textarea/README.md +160 -0
  75. package/docs/sui-time-picker/README.md +240 -0
  76. package/docs/sui-toast/README.md +190 -0
  77. package/docs/sui-tooltip/README.md +201 -0
  78. package/docs/sui-topbar/README.md +153 -0
  79. package/docs/sui-topbar-button/README.md +95 -0
  80. package/docs/sui-topbar-item/README.md +97 -0
  81. package/docs/sui-topbar-user/README.md +83 -0
  82. package/fesm2022/ajuarezso-sui-design-system.mjs +291 -246
  83. package/fesm2022/ajuarezso-sui-design-system.mjs.map +1 -1
  84. package/package.json +1 -1
  85. package/types/ajuarezso-sui-design-system.d.ts +208 -50
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: sui-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
+ ```
@@ -0,0 +1,130 @@
1
+ ---
2
+ name: sui-compact-select
3
+ selector: sui-compact-select
4
+ resumen: Select chico que se ajusta al ancho de su texto, para filtros sueltos y paginación
5
+ alternativas: [sui-select (campo de formulario a todo el ancho, con label), sui-inline-select (dentro de una frase, sin caja), sui-compact-select-for-input (dentro de un sui-input), sui-segmented-control (2 a 4 modos a la vista)]
6
+ ---
7
+
8
+ # sui-compact-select
9
+
10
+ Story: [Molecules/Select/Compact Select](https://sui-design-system.web.app/?path=/docs/molecules-select-compact-select--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para un filtro suelto en una barra de herramientas del panel, donde el campo debe medir
15
+ lo que mide su texto («Todos los roles ▾», «20 por página ▾»), sin label encima.
16
+
17
+ **No lo uses** para:
18
+
19
+ - Un campo de formulario con label, hint y error: `sui-select` (este no tiene label ni hint).
20
+ - Algo dentro de un `sui-input` (moneda, país del teléfono): `sui-compact-select-for-input`.
21
+ - Un valor dentro de una frase: `sui-inline-select`.
22
+ - 2 a 4 modos que se ven todos (Hoy · Semana · Mes): `sui-segmented-control`.
23
+
24
+ Regla corta: **filtro suelto en una barra, ancho al texto → compact · campo con label → select.**
25
+
26
+ ## Qué variante usar
27
+
28
+ > **En la guía del DS es la variante `compact` del select**, con tres ejemplos: paginación
29
+ > («filas por página»), país y tamaños. No dice cuándo usarla. Lo de abajo es **propuesta, falta
30
+ > aprobación**, salvo lo marcado.
31
+ >
32
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Los filtros de las barras del
33
+ > panel usan `sui-select` sin label (6: `pages/customers/customers.html:38`,
34
+ > `pages/settings/team/team.html:66`, `pages/drivers/drivers.html:72`…), que se estira a todo el ancho.
35
+
36
+ | prop | cuándo | fuente |
37
+ |---|---|---|
38
+ | `type="basic"` (default) | Texto + flecha: «Todos los roles», «20 por página». | según la guía del DS (ejemplo de paginación) |
39
+ | `type="icon"` | Solo el ícono de la opción elegida, sin texto: un selector de vista en una barra muy apretada. Hoy sin caso. | según la guía del DS |
40
+ | `type="country"` + `flag` | No usar hoy: todo es Perú. | según la guía del DS (ejemplo «Country») |
41
+ | `items` | La lista: `{ value, label, sublabel?, icon?, flag?, disabled? }`. A diferencia de `sui-select`, cada opción **sí** puede llevar ícono o bandera. | API |
42
+ | `selected` / `selectedChange` | La opción elegida (objeto entero). O `formControlName`, nunca los dos. | API |
43
+ | `placeholder` | El filtro sin elegir: «Todos». Corto. | propuesta, falta aprobación |
44
+ | `value` / `icon` | Lo que muestra el campo cuando no hay `items` (modo «solo campo», el menú lo arma la pantalla). | API |
45
+ | `error` | No usar hoy: un filtro no tiene error. | — |
46
+ | `disabled` | Mientras carga la lista. | según la guía del DS |
47
+ | `clicked` | Solo si la pantalla arma su propio menú (sin `items`). | API |
48
+
49
+ **Candidatos de hoy:** los 6 filtros de barra del panel en web (arriba). En mobile siguen como
50
+ `sui-select` `large` a todo el ancho, porque este no pasa de 40 px.
51
+
52
+ ## Tamaño en mobile y en web
53
+
54
+ Tiene los tres tamaños de la guía —`medium` (40), `small` (36), `xsmall` (32)— y **`large` (48)**,
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 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).
60
+
61
+ Las opciones del menú siguen al `size` como en `sui-select`: 36 hasta `medium`, **44 en `large`**, y
62
+ **44 en mobile (≤ 767 px) con cualquier tamaño**.
63
+
64
+ | size | alto | opción del menú (web · mobile) | fuente |
65
+ |---|---|---|---|
66
+ | `large` | 48 | 44 · 44 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
67
+ | `medium` (default) | 40 | 36 · 44 | según la guía del DS; 44 en mobile: canon (aprobado por el dueño, 03-10-2026) |
68
+ | `small` | 36 | 36 · 44 | ídem |
69
+ | `xsmall` | 32 | 36 · 44 | ídem |
70
+
71
+ | uso | mobile | web | fuente |
72
+ |---|---|---|---|
73
+ | filtro de una barra del panel | `large` (48), junto a botones `large` | `small` (36) | propuesta, falta aprobación |
74
+ | paginación al pie de una tabla | no aplica | `xsmall` (32) | según la guía del DS (ejemplo de paginación); el tamaño es propuesta |
75
+
76
+ ```html
77
+ <sui-compact-select [size]="bp.isMobile() ? 'large' : 'small'" placeholder="Todos los roles"
78
+ [items]="roles" [(selected)]="rolElegido" /> <!-- bp = BreakpointsService -->
79
+ ```
80
+
81
+ ## «No usar»: por qué no hoy y cuándo sí
82
+
83
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
84
+ |---|---|---|
85
+ | el componente entero (0 usos) | los filtros usan `sui-select` | filtros del panel en web, y «20 por página» si las tablas pasan a paginar |
86
+ | `type="country"` | todo es Perú | si se abre otro país |
87
+ | `type="icon"` | ninguna barra está tan apretada | un selector de vista (cuadrícula o lista) en la barra de productos |
88
+ | `error` | un filtro no tiene error | — |
89
+
90
+ ## API
91
+
92
+ <!-- api:inicio -->
93
+ <!-- generada: no editar a mano — `npm run docs` -->
94
+
95
+ | input | tipo | default |
96
+ |---|---|---|
97
+ | `type` | `'basic' \| 'icon' \| 'country'` | `'basic'` |
98
+ | `size` | `'large' \| 'medium' \| 'small' \| 'xsmall'` | `'medium'` |
99
+ | `value` | `string` | `''` |
100
+ | `placeholder` | `string` | `''` |
101
+ | `icon` | `string \| null` | `null` |
102
+ | `flag` | `SuiFlagName \| null` | `null` |
103
+ | `items` | `readonly SuiCompactSelectItem<T>[]` | `[]` |
104
+ | `selected` · model, `[(selected)]` | `SuiCompactSelectItem<T> \| null` | `null` |
105
+ | `error` | `boolean` | `false` |
106
+ | `disabled` | `boolean` | `false` |
107
+
108
+ | output | payload |
109
+ |---|---|
110
+ | `clicked` | `Event` |
111
+ | `selectedChange` | `SuiCompactSelectItem<T>` |
112
+ <!-- api:fin -->
113
+
114
+ Implementa `ControlValueAccessor` (el valor es el `value` de la opción).
115
+
116
+ ## Trampas
117
+
118
+ - **No mezclar `[(selected)]` con `formControlName`**: son dos fuentes de verdad y el formulario no
119
+ se entera de lo que escribe `selected`.
120
+ - Sin `items` no abre nada: solo emite `(clicked)`.
121
+ - `type="icon"` **no muestra texto**: solo el ícono de la opción elegida.
122
+ - El menú mide al menos 200 px aunque el campo sea más angosto.
123
+ - Las opciones miden 36 px en web hasta `medium`; 44 en `large` y en mobile (ver «Tamaño»).
124
+
125
+ ## Ejemplo
126
+
127
+ ```html
128
+ <sui-compact-select size="small" placeholder="Todos los roles" [items]="roles"
129
+ [(selected)]="rolElegido" />
130
+ ```
@@ -0,0 +1,120 @@
1
+ ---
2
+ name: sui-compact-select-for-input
3
+ selector: sui-compact-select-for-input
4
+ resumen: Selector chico que vive DENTRO de un sui-input, para elegir moneda o código de país sin salir del campo
5
+ alternativas: [sui-select (el valor se elige aparte, con su propio label), sui-compact-select (filtro suelto con caja propia), sui-inline-select (dentro de una frase)]
6
+ ---
7
+
8
+ # sui-compact-select-for-input
9
+
10
+ Story: [Molecules/Select/Compact Select For Input](https://sui-design-system.web.app/?path=/docs/molecules-select-compact-select-for-input--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** cuando un dato del campo depende de una elección corta que va pegada a él: la moneda de
15
+ un monto (`S/` o `$`) o el código de país de un teléfono. Se proyecta en el `[data-slot=start]`
16
+ de un `sui-input` con `[leadingControl]="true"`, que dibuja el divisor.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Un select con label propio: `sui-select`.
21
+ - Suelto, fuera de un `sui-input`: no tiene borde ni foco propios. Para eso, `sui-compact-select`.
22
+ - Un prefijo fijo (`S/` siempre): eso es `prefix="S/"` del `sui-input`, no un selector.
23
+
24
+ Regla corta: **el campo cambia según una elección corta pegada a él → este · siempre igual → `prefix`.**
25
+
26
+ ## Qué variante usar
27
+
28
+ > **En la guía del DS es la variante `compactForInput` del select**, con dos ejemplos: un monto
29
+ > con su moneda («€») y los tamaños. Y la página del input lo usa en «With Select». No dice cuándo.
30
+ >
31
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: **0 usos**. Candidato: el gasto del super
32
+ > admin pone «Monto» (`type="number"`) y «Moneda» (PEN/USD) como dos campos separados,
33
+ > `pages/super-admin/master-gastos/master-gastos.html:193` y `:200`.
34
+
35
+ | prop | cuándo | fuente |
36
+ |---|---|---|
37
+ | `items` | Las opciones: `{ value, label, sublabel?, flag?, disabled? }`. | API |
38
+ | `selected` / `selectedChange` | La opción elegida. O `formControlName`, nunca los dos. | API |
39
+ | `country` (default `true`) | Con bandera (teléfono). `false` para una moneda, que no lleva bandera. | según la guía del DS (ejemplo con moneda sin bandera) |
40
+ | `flag` | Bandera a mostrar sin opción elegida. Hoy no aplica. | API |
41
+ | `value` | Texto que se ve si no hay `selected` («S/»). | API |
42
+ | `size` | El mismo tamaño que el `sui-input` que lo contiene, hasta `medium`. | según la guía del DS (ejemplo de tamaños) |
43
+ | `disabled` | Cuando el campo entero está deshabilitado. | API |
44
+ | `clicked` | Solo si la pantalla arma su propio menú. | API |
45
+
46
+ ## Tamaño en mobile y en web
47
+
48
+ Tiene `medium` (40), `small` (36) y `xsmall` (32) de la guía, y **`large`** para el `sui-input`
49
+ `large` (48) de mobile (extensión SUI). Va siempre con **el mismo `size` que el input que lo
50
+ contiene**: el selector ocupa todo el alto interior del campo (46 · 38 · 34 · 30), así que lo que se
51
+ toca (y su hover) cubre el campo de arriba a abajo. Sus opciones miden 44 en `large` y en mobile
52
+ (≤ 767 px); 36 en el resto, como en `sui-select`.
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
+
57
+ | size del input y del selector | campo | fuente |
58
+ |---|---|---|
59
+ | `large` | 48 | canon (aprobado por el dueño, 03-10-2026), extensión SUI |
60
+ | `medium` (default) · `small` · `xsmall` | 40 · 36 · 32 | según la guía del DS |
61
+
62
+ | uso | mobile | web | fuente |
63
+ |---|---|---|---|
64
+ | moneda dentro del monto | `sui-input` `large` + este `large` | `sui-input` `medium` + este `medium` | propuesta, falta aprobación |
65
+
66
+ Arreglo del 03-10-2026: antes el selector medía 40/36/32 y empujaba el campo a 42/38/34 (el padding
67
+ de la guía no descontaba el borde del input). Ahora el campo mide exacto.
68
+
69
+ ## «No usar»: por qué no hoy y cuándo sí
70
+
71
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
72
+ |---|---|---|
73
+ | el componente entero (0 usos) | todo es en soles y con +51 | la moneda de un gasto (`master-gastos.html:193`) o teléfonos de otro país |
74
+ | `country` con bandera | solo hay teléfonos de Perú | repartidores o clientes con número extranjero |
75
+
76
+ ## API
77
+
78
+ <!-- api:inicio -->
79
+ <!-- generada: no editar a mano — `npm run docs` -->
80
+
81
+ | input | tipo | default |
82
+ |---|---|---|
83
+ | `size` | `'large' \| 'medium' \| 'small' \| 'xsmall'` | `'medium'` |
84
+ | `value` | `string` | `''` |
85
+ | `country` | `boolean` | `true` |
86
+ | `flag` | `SuiFlagName \| null` | `null` |
87
+ | `items` | `readonly SuiCompactSelectForInputItem<T>[]` | `[]` |
88
+ | `selected` · model, `[(selected)]` | `SuiCompactSelectForInputItem<T> \| null` | `null` |
89
+ | `disabled` | `boolean` | `false` |
90
+
91
+ | output | payload |
92
+ |---|---|
93
+ | `clicked` | `Event` |
94
+ | `selectedChange` | `SuiCompactSelectForInputItem<T>` |
95
+ <!-- api:fin -->
96
+
97
+ Implementa `ControlValueAccessor`.
98
+
99
+ ## Trampas
100
+
101
+ - **Va en `data-slot="start"`, no en `slot="prefix"`** (`slot="prefix"` no proyecta). El
102
+ `sui-input` necesita además `[leadingControl]="true"` (suelta el bloqueo de ícono decorativo y
103
+ dibuja el divisor).
104
+ - El `size` tiene que ser el mismo del `sui-input`: uno `large` dentro de un input `medium` lo
105
+ agranda.
106
+ - `country` arranca en `true`: para una moneda hay que apagarlo.
107
+ - No tiene estado de error: lo pinta el `sui-input` que lo contiene.
108
+ - **Riesgo en iPhone (no verificado en dispositivo):** el host escucha `touchend` y hace `blur()`.
109
+ En `sui-compact-select` ese mismo patrón cancelaba el clic de iOS y el menú no abría; ahí se
110
+ movió el clic a un div interno. Aquí sigue en el host. Probar en un iPhone antes del primer uso.
111
+ - No mezclar `[(selected)]` con `formControlName`.
112
+
113
+ ## Ejemplo
114
+
115
+ ```html
116
+ <sui-input label="Monto" type="amount" placeholder="0.00" [leadingControl]="true" [(value)]="monto">
117
+ <sui-compact-select-for-input data-slot="start" size="medium" [country]="false"
118
+ [items]="monedas" [(selected)]="moneda" />
119
+ </sui-input>
120
+ ```