@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
package/docs/INDEX.md CHANGED
@@ -9,10 +9,13 @@ se lee esta lista; para usar uno, se abre su doc:
9
9
  - en Storybook: `<storybook>/<name sin sui->.md` (ej. `/alert.md`) y la lista en `/index.md`
10
10
  - en el repo: `projects/sui-design-system/src/lib/<name>/README.md`
11
11
 
12
- Documentados: 92 de 116.
12
+ Documentados: 116 de 116.
13
13
 
14
14
  | name | resumen | alternativas |
15
15
  |---|---|---|
16
+ | `sui-accordion` | Fila con título que se abre para mostrar un texto o contenido secundario que no hace falta ver siempre | sui-tabs (vistas hermanas que se alternan) · sui-modal (detalle que pide atención completa) · sui-card (contenido que siempre se ve) |
17
+ | `sui-activity-feed` | Historial de actividad — quién hizo qué y hace cuánto — con archivos, comentarios, personas o tareas debajo de cada fila | sui-notification (bandeja de avisos para quien mira, con leído/no leído) · sui-stepper (los pasos fijos de un flujo, no un historial) · sui-table (registros para comparar por columnas) · sui-activity-filter (los filtros que van arriba del feed) |
18
+ | `sui-activity-filter` | Chip con ícono para filtrar un historial de actividad por tipo — Archivos, Comentarios, Tareas — prendido o apagado | sui-tab-chips (los filtros de lista de la app, siempre uno elegido) · sui-segmented-control (2-4 vistas hermanas) · sui-tag (una etiqueta que se puede quitar) · sui-badge (un estado que no se toca) |
16
19
  | `sui-alert` | Aviso que se queda en la pantalla, en el lugar donde pasa lo que avisa | sui-toast (efímero, resultado de una acción) · sui-banner (afecta a toda la app o la pantalla) · sui-notification (fila de la bandeja) · sui-form-hint (ayuda de un solo campo) |
17
20
  | `sui-app-store-badge` | El sello oficial de App Store o Google Play que lleva a descargar la app | sui-link-button (link directo de descarga, «Descargar la app») · sui-social-button (entrar con una cuenta de Google o Apple) |
18
21
  | `sui-avatar` | La cara de alguien (o el logo de un local) en un círculo, con iniciales cuando no hay foto | sui-avatar-group (varias personas apiladas) · sui-compact-avatar-group (varias personas en una celda de tabla) · sui-key-icon (un ícono en círculo que no es nadie) · sui-image-upload-profile (subir o cambiar la foto) |
@@ -34,6 +37,9 @@ Documentados: 92 de 116.
34
37
  | `sui-circular-progress-bar` | El avance de algo en un anillo, para cuando cabe en un cuadrado al lado de un título | sui-progress-bar-label (barra con título y número, cuando hay ancho) · sui-progress-bar (barra pelada) |
35
38
  | `sui-color-dot` | Una opción de color para elegir (o mostrar el color elegido); no es un punto de estado | sui-color-picker (el selector completo, con hex propio) · sui-badge type="with-dot" (punto de estado vivo) · sui-status-badge withDot (punto de estado de un ciclo) |
36
39
  | `sui-color-picker` | Botón que abre un panel para elegir un color libre (espectro, matiz, hex) o uno de los recomendados | sui-color-dot (un punto de color, para armar una grilla propia) · sui-select o sui-radio-card (el color es una categoría con nombre, no un color libre) |
40
+ | `sui-command-menu-footer` | Pie del buscador ⌘K (command menu) con las teclas para moverse y elegir, y un link de ayuda | sui-modal-footer (botones de un modal) · sui-kbd (una tecla suelta) · sui-dropdown-caption (texto de pie de un menú flotante) |
41
+ | `sui-command-menu-item` | Fila de resultado del buscador ⌘K (command menu) que lleva a una pantalla, un pedido o una persona | 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) |
42
+ | `sui-command-menu-search` | Campo de arriba del buscador ⌘K (command menu), sin caja y con borde inferior | sui-input type="search" (buscador de una pantalla) · sui-dropdown-search (filtrar los items de un menú flotante) |
37
43
  | `sui-compact-avatar-group` | Varias personas en una píldora baja con el «+N» en texto, para tablas y filas apretadas | sui-avatar-group (la pila grande, para cards y cabeceras) · sui-avatar (una sola persona) |
38
44
  | `sui-compact-button` | Botón de solo ícono, chico, para cuando falta espacio | 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) |
39
45
  | `sui-compact-select` | Select chico que se ajusta al ancho de su texto, para filtros sueltos y paginación | 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) |
@@ -49,18 +55,25 @@ Documentados: 92 de 116.
49
55
  | `sui-divider` | Línea de 1 px que separa bloques (horizontal) o datos en una fila (vertical) | sui-content-divider (línea con texto o botones encima, o el «o» entre dos opciones) |
50
56
  | `sui-drawer-footer` | Pie de un panel lateral con dos botones y un extra a la izquierda; hoy sin uso, los botones van en sui-modal-footer | sui-modal-footer (el canon de botones de toda la app) · sui-filter-panel-footer (pie de un panel de filtros) |
51
57
  | `sui-drawer-header` | Cabecera de un panel lateral (título, descripción, cerrar); hoy sin contenedor en SUI y sin uso en la app | sui-modal (con title y description: la cabecera de todos los modales de la app) · sui-modal-header (la cabecera suelta del modal) · sui-page-header (título de una página) |
58
+ | `sui-dropdown-caption` | Texto gris de pie dentro de un menú flotante (una pista, la versión, cuándo se actualizó) | 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) |
59
+ | `sui-dropdown-item` | 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 | 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) |
60
+ | `sui-dropdown-menu` | Menú flotante anclado a un botón (el kebab ⋮ de una card, un avatar) con acciones sobre eso; también es el overlay que usan por dentro los selects | sui-select (elegir un valor de un formulario) · sui-modal-sheet (más de 5 acciones o una lista larga en mobile) · sui-popover (explicar algo con una flecha, sin anclaje propio) · sui-tooltip (ayuda corta al pasar el mouse) · sui-command-menu-item (buscar y saltar con ⌘K en desktop) |
61
+ | `sui-dropdown-search` | Buscador sin caja que va arriba del panel de un menú flotante para filtrar sus items | sui-input type="search" (buscador de una pantalla o una lista a la vista) · sui-command-menu-search (buscador del ⌘K) · sui-select (elegir de una lista corta, sin buscar) |
52
62
  | `sui-emoji` | Un emoji 3D animado (Fluent) para los momentos con emoción: estados vacíos, celebraciones, onboarding | sui-icon (ícono funcional, monocromo) · sui-empty-state (el estado vacío completo, que ya trae su emoji) |
53
63
  | `sui-empty-state` | Pantalla o lista sin nada que mostrar (o que no pudo cargar) con emoji animado, título, explicación y una acción opcional | sui-alert (un aviso dentro de una pantalla que sí tiene contenido) · sui-banner (aviso de toda la app) · skeleton (mientras carga, nunca un empty) |
54
64
  | `sui-fancy-button` | Botón con brillo y degradé para el CTA de una landing o campaña | sui-button (toda acción dentro de la app) · sui-app-store-badge (descargar la app desde una landing) |
55
65
  | `sui-file-icon` | El ícono de un archivo con su extensión (PDF, XLSX, JPG…) en el color de su tipo | sui-file-upload-card (el archivo que se está subiendo, con progreso) · sui-icon (un ícono genérico de documento) |
56
66
  | `sui-file-upload` | Área para arrastrar o elegir archivos que no son una foto (PDF, Excel, CSV) | sui-image-upload (una sola imagen con vista previa: logo, portada, comprobante) · sui-image-upload-profile (foto de perfil con botones Subir/Cambiar/Eliminar) · sui-file-upload-card (el archivo ya elegido, con su progreso) |
57
67
  | `sui-file-upload-card` | La fila de un archivo que se está subiendo, con su progreso, listo o error para reintentar | sui-file-upload (el área para elegir el archivo) · sui-image-upload (una imagen: muestra la vista previa en vez de la fila) · sui-file-icon (un archivo en una lista, sin subida) |
68
+ | `sui-filter` | Piezas de filtros de una lista o tabla del panel; la barra horizontal (buscador, vista, orden) y el panel vertical (fila, cabecera con «Limpiar», pie con «Limpiar» / «Aplicar») | sui-segmented-control (2 a 4 vistas que se aplican al instante) · sui-compact-select (un filtro suelto) · sui-tab-chips (filtros rápidos con chips) · sui-activity-filter (filtro del feed de actividad) · sui-modal-sheet (el panel de filtros en mobile) |
58
69
  | `sui-flag` | La bandera circular de un país | sui-emoji (un emoji con emoción) · sui-icon (un ícono funcional) |
59
70
  | `sui-form-hint` | Una línea de ayuda o de error debajo de un campo o de un grupo de controles | el hint propio de sui-input / sui-select / sui-textarea (campo de texto) · sui-alert (un aviso de la pantalla o algo que salió bien) · sui-tooltip (ayuda escondida tras un toque) · sui-form-label (el rótulo de arriba) |
60
71
  | `sui-form-label` | Rótulo de un campo o de un grupo de controles que no traen el suyo (asterisco, opcional, ayuda y link) | el label propio de sui-input / sui-select / sui-textarea (campo de texto) · sui-checkbox-label / sui-radio-label / sui-switch-label (un control con su texto) · sui-page-header o sui-content-label (título de sección) · sui-form-hint (la ayuda debajo) |
72
+ | `sui-href` | Directiva para los <a> del DS que reciben un href configurable; los links internos navegan con el Router sin recargar la app | routerLink (link interno escrito en la plantilla de la app) · sui-link-button (acción con forma de link, ya usa suiHref por dentro) |
61
73
  | `sui-icon` | Un ícono monocromo de RemixIcon (o uno propio del DS) que toma el color del texto | sui-key-icon (el ícono dentro de un círculo de color) · sui-emoji (emoji con emoción) · sui-brand-logo (el logo de otra marca en su color) · sui-compact-button (un ícono que se toca) |
62
74
  | `sui-image-upload` | Subir una imagen y ver su vista previa en el mismo lugar (logo, portada, foto de producto, comprobante) | sui-image-upload-profile (foto de perfil con botones Subir/Cambiar/Eliminar al lado) · sui-file-upload (documentos que no son foto: PDF, Excel) · app-image-cropper (el recortador de la app, que se abre desde el lápiz) |
63
75
  | `sui-image-upload-profile` | Foto de perfil o logo en círculo con los botones Subir, o Eliminar y Cambiar, al lado | sui-image-upload (la imagen grande con su vista previa y el lápiz que abre el recortador; es lo que usa hoy la app) · sui-avatar (solo mostrar la foto) |
76
+ | `sui-img-retry` | Directiva que reintenta cargar un <img> cuando falla la red y marca cuándo cargó o se dio por perdido | sui-avatar (foto de persona o logo con iniciales de respaldo) · sui-image-upload (subir una imagen) |
64
77
  | `sui-inline-input` | Texto que se edita en su lugar: en reposo muestra el dato y un lápiz; al tocarlo, campo con ✓ y ✕ | sui-input (campo de formulario, siempre editable) · sui-modal con sui-input (editar con más contexto o varios datos a la vez) |
65
78
  | `sui-inline-select` | Selector sin caja que vive dentro de una frase o al final de un campo («Mostrar en USD ▾») | sui-compact-select (filtro suelto con caja propia) · sui-compact-select-for-input (al inicio de un sui-input, con divisor) · sui-select (campo de formulario) |
66
79
  | `sui-input` | Campo de una sola línea para escribir un dato (nombre, teléfono, monto, búsqueda) | sui-textarea (texto de varias líneas) · sui-select (elegir de una lista) · sui-counter-input (una cantidad con − y +) · sui-tag-input (varios valores cortos) · sui-otp-input (código de verificación) · sui-inline-input (editar un dato en su lugar, con lápiz) |
@@ -69,10 +82,15 @@ Documentados: 92 de 116.
69
82
  | `sui-key-icon` | Un ícono dentro de un círculo, con fondo de color si el ícono dice un estado | sui-icon (el ícono suelto) · sui-avatar (cuando es una persona o un local) · sui-payment-icon (el círculo ya armado para un pago de servicio) |
70
83
  | `sui-link-button` | Acción que se lee como texto, sin caja | sui-button (acción con caja: la principal o la secundaria de un grupo) · sui-compact-button (solo ícono, sin texto) · sui-alert (sus acciones se pasan en actions[] y ya salen como link) |
71
84
  | `sui-logo` | El logo de Master Pedidos (la M y la palabra), dibujado en SVG y coloreable | sui-brand-logo (logos de OTRAS marcas: WhatsApp, Google, Apple…) · sui-avatar (el logo de un local, que es una foto) |
85
+ | `sui-modal` | Diálogo que se abre encima de la pantalla y pide terminar o cerrar algo antes de seguir | sui-modal-sheet (hoja que sube desde abajo y deja ver lo de atrás, p. ej. un mapa) · sui-alert (aviso en la misma pantalla, sin interrumpir) · sui-toast (confirmación breve de una acción) · sui-popover (contenido chico anclado a un botón) · sui-drawer-header (panel lateral) |
86
+ | `sui-modal-footer` | Pie de modal con la acción principal a la derecha, la secundaria a su izquierda y un slot izquierdo para un checkbox, un link o un texto | sui-button (botones sueltos fuera de un modal o una hoja) · sui-drawer-footer (pie de un panel lateral) · sui-notification-footer (acciones de una notificación) |
87
+ | `sui-modal-header` | Cabecera de modal con título, descripción, ícono opcional y la X de cerrar; sui-modal ya la dibuja sola | sui-modal (ya trae este header por title/description/iconVariant) · sui-drawer-header (cabecera de un panel lateral) · sui-page-header (título de una pantalla) |
88
+ | `sui-modal-sheet` | Hoja que sube desde abajo, se arrastra entre alturas fijas y puede dejar usable lo de atrás (un mapa) | sui-modal (pide terminar algo antes de seguir, sin fondo usable) · sui-popover (contenido chico anclado a un botón) · sui-dropdown-menu (lista de acciones) |
72
89
  | `sui-notification` | Fila de la bandeja de notificaciones, con quién, qué pasó, hace cuánto y si ya se leyó | sui-toast (aviso efímero, incluido el «notification» de esquina de la guía) · sui-alert (aviso que se queda en su contexto) · sui-banner (toda la app) |
73
90
  | `sui-notification-footer` | Pie del panel desplegable de notificaciones (web): ayuda de teclado a la izquierda y un link a los ajustes a la derecha | sui-link-button (un link suelto a los ajustes) · sui-drawer-footer (pie de un panel lateral) · sui-modal-footer (pie con botones) |
74
91
  | `sui-notification-tab-menu` | Cabecera con pestañas del panel desplegable de notificaciones (web), con conteo de no leídas y botón de filtro | sui-tab-chips (pestañas de la bandeja a pantalla completa, en mobile) · sui-tab-menu-horizontal (pestañas de una pantalla) · sui-segmented-control (cambiar de vista con 2–4 opciones) |
75
92
  | `sui-otp-input` | Código de verificación dígito por dígito, una celda por número (SMS, código de entrega) | sui-input (un código largo o que se pega entero) · sui-input type="password-toggle" (una clave que no se ve) |
93
+ | `sui-page-header` | Título y subtítulo de una pantalla, con las acciones de la pantalla a la derecha en desktop y debajo en mobile | sui-modal-header (cabecera de un modal) · sui-drawer-header (cabecera de un panel lateral) · sui-topbar (barra superior de la app, no de la pantalla) |
76
94
  | `sui-pagination` | Números de página para recorrer una tabla larga en web cuando todos los datos ya están cargados | scroll infinito (directiva appInfiniteScroll de la app, para listas de Firestore) · sui-stepper (pasos de un flujo) · sui-tab-chips (filtrar en vez de paginar) |
77
95
  | `sui-password-strength` | Barra de 3 niveles y lista de condiciones que acompaña al campo de una contraseña nueva | sui-input con hint (una sola regla, como «Mínimo 6 caracteres») |
78
96
  | `sui-payment-icon` | El círculo de color de un pago de servicio (agua, gas, luz, internet, alquiler…) | sui-key-icon (cualquier otro ícono en círculo) · sui-brand-logo (el logo de un medio de pago con marca) |
@@ -88,6 +106,7 @@ Documentados: 92 de 116.
88
106
  | `sui-rich-editor` | Barra de formato (negrita, cursiva, alineación, enlace) con un área de texto editable opcional | sui-textarea (todo texto libre de la app hoy, sin formato) |
89
107
  | `sui-segmented-control` | Píldora de 2 a 4 opciones hermanas donde se elige una y se aplica en el momento | sui-tab-menu-horizontal (navegar entre secciones de contenido) · sui-tab-chips (fila de filtros con muchas opciones) · sui-radio-card (elegir una opción de un formulario que se guarda después) · sui-button-group (varias opciones a la vez) |
90
108
  | `sui-select` | Campo que despliega una lista para elegir UNA opción (distrito, repartidor, categoría, motivo) | sui-radio-label / sui-radio-card (2 a 6 opciones fijas a la vista) · sui-segmented-control (2 a 4 modos que se aplican al instante) · sui-compact-select (filtro chico que se ajusta al texto) · sui-compact-select-for-input (elegir moneda o país dentro de un campo) · sui-tag-input (varios valores) |
109
+ | `sui-sidebar` | Navegación principal de un rol — columna fija a la izquierda en web y cajón que entra desde la izquierda en mobile | la barra inferior nativa del layout (las 4-5 secciones más usadas en el teléfono) · sui-topbar (navegación arriba, sin columna lateral) · sui-tab-menu-vertical (secciones dentro de UNA pantalla, como ajustes) · sui-dropdown-menu (acciones de una cuenta o un botón) |
91
110
  | `sui-slider` | Barra para elegir un valor, o un rango, dentro de una escala donde importa ver la posición | sui-counter-input (cantidad chica y exacta con − y +) · sui-input type="number" (valor exacto o rango abierto) · sui-progress-bar (avance de solo lectura) |
92
111
  | `sui-social-button` | Botón para iniciar sesión o registrarse con una cuenta de Google o Apple | sui-button (cualquier otra acción, aunque mencione una marca) · sui-app-store-badge (descargar la app de una tienda) |
93
112
  | `sui-status-badge` | El resultado de un ciclo (completado, pendiente, fallido, deshabilitado) con su color y su ícono ya resueltos | sui-badge (estado con muchos valores, categoría o distinción) · sui-tag (chip neutro que se puede quitar) · sui-alert (mensaje que hay que leer) |
@@ -99,38 +118,14 @@ Documentados: 92 de 116.
99
118
  | `sui-tab-chips` | Fila de chips que se desliza en horizontal para filtrar una lista o saltar entre categorías; siempre hay uno elegido | sui-segmented-control (2 a 4 modos de la misma vista) · sui-tab-menu-horizontal (secciones de contenido distinto) · sui-radio-card (elegir un valor de un formulario) · sui-tag (chip que se quita) |
100
119
  | `sui-tab-menu-horizontal` | Pestañas subrayadas para cambiar entre secciones de contenido distinto dentro de una pantalla | sui-tab-chips (filtros o categorías que se deslizan) · sui-segmented-control (2 a 4 modos de la misma vista) · sui-tab-menu-vertical (menú lateral de ajustes en web) |
101
120
  | `sui-tab-menu-vertical` | Menú apilado para cambiar entre secciones de una página de ajustes en web | sui-tab-menu-horizontal (pocas secciones arriba del contenido) · sui-sidebar (navegación de toda la app) · sui-tab-chips (filtros o categorías) |
121
+ | `sui-table` | Tabla de datos — una fila por registro, una columna por dato — para comparar y recorrer listas en web | tarjetas en grilla con sui-card (la misma lista cuando no entran las columnas) · sui-empty-state (no hay nada que listar todavía) · sui-pagination (paginar por número de página, debajo de la tabla) · sui-activity-feed (historial de quién hizo qué) |
102
122
  | `sui-tag` | Chip neutro que nombra algo elegido o aplicado y que la persona puede quitar | sui-badge (etiqueta de solo lectura, con color y significado) · sui-status-badge (resultado de un ciclo) · sui-tab-chips / sui-filter (chips para elegir) · sui-tag-input (campo que junta tags) |
103
123
  | `sui-tag-input` | Campo donde se escriben varios valores cortos que se van sumando como chips (palabras clave) | sui-input (un solo valor) · sui-select (una opción de una lista) · sui-checkbox-label (varias opciones fijas) |
104
124
  | `sui-textarea` | Campo de varias líneas para un texto libre (motivo, nota al repartidor, descripción) | sui-input (un dato de una línea) · sui-rich-editor (texto con formato, hoy sin uso) · sui-select (motivos que se pueden elegir de una lista) |
105
125
  | `sui-time-picker` | Campo para elegir una hora del día, con columnas de hora, minuto y AM/PM | sui-tab-chips + sui-radio-label (día y franja de entrega de un pedido programado) · sui-select (pocas horas fijas) · sui-input type="time" (hora libre con el selector del sistema) |
106
126
  | `sui-toast` | Aviso efímero que confirma el resultado de una acción y se va solo; se dispara con SuiToastService | sui-alert (aviso que se queda, en su contexto) · sui-banner (toda la app) · sui-notification (fila de la bandeja, con hora) · sui-form-hint (error de un campo) |
107
127
  | `sui-tooltip` | Directiva que muestra una ayuda corta al pasar el mouse o al enfocar un elemento; solo web, no sirve con el dedo | sui-form-hint (ayuda visible bajo un campo) · sui-modal-sheet (explicación que se abre al tocar, en mobile) · sui-popover (panel que señala algo y pide una acción) |
108
-
109
- ## Sin documentar
110
-
111
- Existen en el paquete pero todavía no tienen doc; antes de usarlos, leer su `.d.ts`.
112
-
113
- - `sui-accordion`
114
- - `sui-activity-feed`
115
- - `sui-activity-filter`
116
- - `sui-command-menu-footer`
117
- - `sui-command-menu-item`
118
- - `sui-command-menu-search`
119
- - `sui-dropdown-caption`
120
- - `sui-dropdown-item`
121
- - `sui-dropdown-menu`
122
- - `sui-dropdown-search`
123
- - `sui-filter`
124
- - `sui-href`
125
- - `sui-img-retry`
126
- - `sui-modal`
127
- - `sui-modal-footer`
128
- - `sui-modal-header`
129
- - `sui-modal-sheet`
130
- - `sui-page-header`
131
- - `sui-sidebar`
132
- - `sui-table`
133
- - `sui-topbar`
134
- - `sui-topbar-button`
135
- - `sui-topbar-item`
136
- - `sui-topbar-user`
128
+ | `sui-topbar` | Barra de navegación horizontal de escritorio — logo, secciones, buscador, íconos de acción y el chip de la cuenta | sui-sidebar (la navegación de los roles de la app, con cajón en mobile) · sui-page-header (el título de UNA pantalla, sin navegación) · sui-topbar-item / sui-topbar-button / sui-topbar-user (las piezas sueltas, para una cabecera armada a mano) |
129
+ | `sui-topbar-button` | Botón de solo ícono de 40×40 para la barra superior, con punto rojo de «hay algo nuevo» | sui-button con onlyIcon (un botón de ícono en cualquier otro lugar) · sui-compact-button (ícono chico de 20-28 en filas y barras apretadas) · sui-topbar (la barra completa, que ya lo compone) |
130
+ | `sui-topbar-item` | Una sección de la navegación horizontal — texto, ícono opcional, badge o contador — con estado activo | sui-topbar (la barra completa: lo compone desde [items]) · sui-tab-menu-horizontal (pestañas dentro de UNA pantalla) · sui-tab-chips (filtros) · sui-link-button (un link suelto en un texto) |
131
+ | `sui-topbar-user` | Chip de la cuenta en la barra superior — avatar, nombre y flecha — que abre el menú de la cuenta | sui-topbar (la barra completa: lo compone desde [user]) · el perfil del pie de sui-sidebar (la cuenta en la navegación lateral) · sui-avatar (solo la foto, sin nombre ni menú) |
@@ -0,0 +1,171 @@
1
+ ---
2
+ name: sui-accordion
3
+ selector: sui-accordion
4
+ resumen: Fila con título que se abre para mostrar un texto o contenido secundario que no hace falta ver siempre
5
+ alternativas: [sui-tabs (vistas hermanas que se alternan), sui-modal (detalle que pide atención completa), sui-card (contenido que siempre se ve)]
6
+ ---
7
+
8
+ # sui-accordion
9
+
10
+ Story: [Organisms/Accordion](https://sui-design-system.web.app/?path=/docs/organisms-accordion--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para esconder lo **secundario** y dejar a la vista lo que decide: preguntas frecuentes,
15
+ «Más detalles (opcional)» en un formulario, el historial técnico de un pedido, la lista completa
16
+ de cambios de una versión.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Lo que la persona necesita para decidir en esa pantalla: si hay que abrirlo siempre, va abierto
21
+ (sin accordion).
22
+ - Navegar entre vistas del mismo nivel: `sui-tabs`.
23
+ - Un solo campo que aparece o desaparece: un `@if` con un `sui-switch` que lo controle.
24
+ - Anidar accordions: dos niveles de «+» dentro de una card se leen como un árbol.
25
+
26
+ ## Qué variante usar
27
+
28
+ > **La guía del DS dibuja los estados pero no dice cuándo usar cada cosa.** El Figma del DS
29
+ > (nodo 210:4022) trae el accordion en tres estados (normal, hover y abierto) y con el «+» a la
30
+ > derecha o a la izquierda. No trae do/don't. Lo marcado **propuesta** falta aprobar.
31
+ >
32
+ > Uso medido el 03-10-2026 en `master-pedidos/src/app`: 19 accordions, sin contar prototipos ni
33
+ > vitrinas (`master-preview`, `master-prototipos`, `mockup-sheets-*`, `dx/*`, `master-rutina`,
34
+ > `master-medico`, `dev-index`) ni las copias de `components/sui/`.
35
+
36
+ ### Lo que sí dice la guía del DS
37
+
38
+ - **Cerrado**: fondo blanco, borde gris y sombra mínima; el toggle es un «+».
39
+ - **Hover y abierto**: fondo gris claro, sin borde ni sombra; abierto, el toggle es un «−».
40
+ - **La descripción solo se ve abierto**, 6 px bajo el título.
41
+ - **Con el «+» a la izquierda (`flipIcon="on"`) no hay ícono lateral**: el toggle ocupa su lugar.
42
+ - Padding 14, gap 10, radio 10, íconos de 20.
43
+
44
+ ### Ícono izquierdo — `leftIcon`
45
+
46
+ | valor | cuándo | ejemplo real de la app | fuente |
47
+ |---|---|---|---|
48
+ | `[leftIcon]="false"` | el caso normal: el título se explica solo | `pages/envios/envios.html:412` («Más detalles (opcional)») | propuesta |
49
+ | `true` (default, `question-line`) | **solo** si el título es una pregunta de ayuda | `pages/driver/driver-profile/driver-profile.html:156` («¿Por qué no me llegan pedidos?») | propuesta |
50
+ | un nombre de ícono | el ícono dice de qué es la sección y hay varias juntas | `pages/notifications/notifications.html:72` (`settings-3-line`) | propuesta |
51
+
52
+ Hoy: 16 en `false`, 2 con el default (las dos son preguntas de ayuda) y 1 con ícono propio. El
53
+ default del componente es el caso raro: **casi siempre hay que apagarlo**.
54
+
55
+ **A revisar:** las preguntas frecuentes de las landings (`pages/public/landing-business/landing-business.html:170`,
56
+ `pages/public/landing-driver/landing-driver.html:167`, `pages/public/pricing/pricing.html:131`)
57
+ son preguntas y van sin ícono; las dos de ayuda dentro de la app, con. Elegir uno.
58
+
59
+ ### `description` vs contenido proyectado
60
+
61
+ | qué | cuándo | fuente |
62
+ |---|---|---|
63
+ | `description` | **una respuesta corta en texto** (FAQ): aparece al abrir, alineada con el título | según el Figma del DS |
64
+ | contenido proyectado | cualquier otra cosa: campos, listas, cards, tablas | propuesta |
65
+
66
+ **A revisar:** 4 accordions pasan un **resumen** en `description` (`resumenReto()`,
67
+ `resumenVotaciones()`, `resumenDetalles()`…) que, por cómo funciona el componente, **solo se ve
68
+ con el accordion abierto**. Si la idea era ver el resumen cerrado, hoy no se ve:
69
+ `pages/driver/driver-dashboard/driver-dashboard.html:287` y `:486`,
70
+ `pages/envios/envios.html:412`, `pages/customer/mandadito/mandadito.html:188`.
71
+
72
+ ### `lazy` — cuándo diferir el contenido
73
+
74
+ | forma | qué pasa | cuándo | fuente |
75
+ |---|---|---|---|
76
+ | contenido plano, sin `lazy` | se crea y se pinta al cargar la pantalla | contenido liviano (texto, 2-3 campos) | componente |
77
+ | `[lazy]="true"` + contenido plano | no se pinta hasta abrir, pero **los componentes de adentro igual se crean** al cargar | no ahorra mucho; evitarlo | componente |
78
+ | `[lazy]="true"` + `<ng-template suiAccordionContent>` | no se crea nada hasta el primer open; después queda montado | contenido pesado (listas, mapas, formularios grandes) o muchos accordions en la misma pantalla | componente |
79
+
80
+ **Usos de hoy que no hacen lo que parecen:** 4 accordions usan `<ng-template suiAccordionContent>`
81
+ **sin** `[lazy]="true"`, y sin `lazy` el template se crea al cargar igual que el contenido plano:
82
+ `pages/envios/envios.html:418` y `:743`, `pages/customer/order-tracking/order-tracking.html:590`,
83
+ `pages/customer/mandadito/mandadito.html:194`. Les falta `[lazy]="true"`.
84
+
85
+ ### `flipIcon` y `badge`
86
+
87
+ | input | cuándo | fuente |
88
+ |---|---|---|
89
+ | `flipIcon="on"` | listas largas donde el «+» a la izquierda se escanea mejor que a la derecha. 0 usos hoy | según el Figma del DS (la variante existe) |
90
+ | `badge` | marcar una sección como nueva o actualizada («Nuevo»). Extensión de SUI; 0 usos hoy | propuesta |
91
+
92
+ ## Tamaño en mobile y en web
93
+
94
+ El accordion **no tiene `size`** ni cambia por breakpoint: ocupa todo el ancho de su contenedor y
95
+ mide 48 px de alto cerrado con una línea de título (14 + 20 + 14), que ya es un área táctil
96
+ cómoda en mobile.
97
+
98
+ | uso | mobile | web | fuente |
99
+ |---|---|---|---|
100
+ | fila | ancho completo, 48 px | igual | componente |
101
+ | texto | Label/Small 14 y Paragraph/Small 14 | igual | según el Figma del DS |
102
+
103
+ ## API
104
+
105
+ <!-- api:inicio -->
106
+ <!-- generada: no editar a mano — `npm run docs` -->
107
+
108
+ ### `sui-accordion`
109
+
110
+ | input | tipo | default |
111
+ |---|---|---|
112
+ | `title` | `string` | `''` |
113
+ | `description` | `string` | `''` |
114
+ | `open` · model, `[(open)]` | `boolean` | `false` |
115
+ | `lazy` | `boolean` | `false` |
116
+ | `flipIcon` | `'off' \| 'on'` | `'off'` |
117
+ | `leftIcon` | `string \| boolean` | `true` |
118
+ | `badge` | `SuiBadgeConfig \| string \| null` | `null` |
119
+
120
+ Outputs: ninguno.
121
+
122
+ ### `ng-template[suiAccordionContent]`
123
+
124
+ Inputs: ninguno.
125
+
126
+ Outputs: ninguno.
127
+ <!-- api:fin -->
128
+
129
+ `open` es un `model`: el cambio se escucha con `(openChange)` o `[(open)]`. Método público:
130
+ `toggle()`.
131
+
132
+ `badge` acepta un `string` (atajo de `{ label }`, en verde, `lighter`, `small`) o un
133
+ `SuiBadgeConfig` con `color`, `variant` y `size`.
134
+
135
+ Slots: contenido plano (o con el atributo `sui-accordion-body`) y el template
136
+ `<ng-template suiAccordionContent>`. Van debajo de la descripción, con padding `0 14px 14px`.
137
+
138
+ ## Trampas
139
+
140
+ - **`leftIcon` arranca en `true`**: sin `[leftIcon]="false"` sale un signo de pregunta junto a
141
+ cualquier título.
142
+ - **`suiAccordionContent` sin `[lazy]="true"` no difiere nada.** Las dos piezas van juntas.
143
+ - **`[lazy]="true"` con contenido plano engaña**: los componentes de adentro se construyen igual
144
+ al cargar (corren su `ngOnInit`, piden datos). Para no construirlos, el template.
145
+ - **Una vez abierto, queda montado**: cerrar no destruye el contenido (conserva lo escrito).
146
+ Si necesitas reiniciarlo al cerrar, hazlo tú en `(openChange)`.
147
+ - **`description` solo se ve abierto.** No sirve como resumen de la fila cerrada.
148
+ - **No hay `disabled`** (el Figma tampoco lo trae).
149
+ - El toggle cambia de «+» a «−»; no rota. El cuerpo anima su alto con un `ResizeObserver`: si el
150
+ contenido cambia de alto estando abierto, acompaña.
151
+ - El host borra el atributo `title` nativo (sin tooltip gris del navegador).
152
+
153
+ ## Ejemplo
154
+
155
+ ```html
156
+ <!-- Sección opcional de un formulario, con el contenido diferido de verdad -->
157
+ <sui-accordion
158
+ title="Más detalles (opcional)"
159
+ [leftIcon]="false"
160
+ [lazy]="true"
161
+ [(open)]="detallesAbiertos">
162
+ <ng-template suiAccordionContent>
163
+ <sui-textarea label="Indicaciones para el repartidor" [(value)]="indicaciones" />
164
+ </ng-template>
165
+ </sui-accordion>
166
+
167
+ <!-- Pregunta de ayuda: el ícono por defecto sí calza -->
168
+ <sui-accordion
169
+ title="¿Cómo apareces más arriba en el inicio?"
170
+ description="El inicio de cada cliente se ordena solo. Esto es lo que puedes mover desde tu panel." />
171
+ ```
@@ -0,0 +1,155 @@
1
+ ---
2
+ name: sui-activity-feed
3
+ selector: sui-activity-feed
4
+ resumen: Historial de actividad — quién hizo qué y hace cuánto — con archivos, comentarios, personas o tareas debajo de cada fila
5
+ alternativas: [sui-notification (bandeja de avisos para quien mira, con leído/no leído), sui-stepper (los pasos fijos de un flujo, no un historial), sui-table (registros para comparar por columnas), sui-activity-filter (los filtros que van arriba del feed)]
6
+ ---
7
+
8
+ # sui-activity-feed
9
+
10
+ Story: [Organisms/Activity/Activity Feed](https://sui-design-system.web.app/?path=/docs/organisms-activity-activity-feed--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** para un **historial de acciones hechas por personas**, de la más nueva a la más vieja:
15
+ «Ana aprobó la recarga de S/ 50 · hace 4 min», «Carlos editó la carta de Pollería Don Tito ·
16
+ ayer». Cada fila tiene autor, verbo, objeto y hora, y puede llevar debajo los archivos, el
17
+ comentario, las personas o las tareas de esa acción.
18
+
19
+ **No lo uses** para:
20
+
21
+ - Avisos para quien mira, que se marcan como leídos: `sui-notification`.
22
+ - El avance de un pedido por estados fijos (recibido → en camino → entregado): es una línea de
23
+ pasos (`sui-stepper` o la línea de tiempo del detalle del pedido), no un historial libre.
24
+ - Registros que se comparan por columnas (montos, fechas): `sui-table`.
25
+
26
+ Regla corta: **quién hizo qué → activity feed · avisos para mí → notification · pasos de un flujo → stepper.**
27
+
28
+ ## Qué variante usar
29
+
30
+ > **La guía del DS no tiene página del activity feed.** El componente sale del Figma de SUI
31
+ > (Activity Feed [1.1], frame 166035:46833). Uso medido el 03-10-2026 en `master-pedidos/src/app`:
32
+ > **0 usos**. Todo lo de abajo es **propuesta, falta aprobación**.
33
+
34
+ El tipo de fila lo decide `type` de cada item (una unión discriminada): lo que cuelga debajo de
35
+ la línea de texto.
36
+
37
+ | `type` | cuándo | ejemplo posible en la app | fuente |
38
+ |---|---|---|---|
39
+ | `default` | La acción se entiende sola con la línea. Es el caso normal. | «Ana aprobó la recarga de Luis» | propuesta, falta aprobación |
40
+ | `file` | La acción dejó archivos que se pueden bajar. | «Luis subió su comprobante de Yape» | propuesta, falta aprobación |
41
+ | `comment` | La acción fue escribir algo y el texto importa. | «El local dejó una nota en el pedido» | propuesta, falta aprobación |
42
+ | `avatar-group` | La acción involucró a varias personas. | «Se asignaron 3 repartidores a la zona» | propuesta, falta aprobación |
43
+ | `tasks` | La acción tuvo un resultado por partes (hechas, pendientes, con error). | «Se importó la carta: 40 productos, 2 con error» | propuesta, falta aprobación |
44
+
45
+ | pieza del item | regla | fuente |
46
+ |---|---|---|
47
+ | leading | `avatar` cuando lo hizo una persona; `icon` cuando lo hizo el sistema (una Cloud Function, un cobro automático). | propuesta, falta aprobación |
48
+ | `avatar.src` | La foto de **otra** persona va denormalizada y pasada por `fotoDeStorage()`, nunca la URL de Google. | canon (CLAUDE.md, «Fotos de otra persona») |
49
+ | `avatar.color` | Para iniciales sin foto, `color` del set de SUI. `bgColor` solo como escape: no ajusta el color del texto. | canon del componente |
50
+ | `userName` / `target` | Nombres, nunca IDs. | canon (CLAUDE.md, «Pasada de UX/UI»: un identificador nunca es el título de nada) |
51
+ | `verb` | En pasado y en minúscula: «aprobó», «subió». | propuesta, falta aprobación |
52
+ | `timestamp` | Relativo y corto: «hace 4 min», «ayer». Lo formateas tú. | propuesta, falta aprobación |
53
+ | `showAction` | `false` salvo que haya un menú real detrás de los tres puntos. | propuesta, falta aprobación |
54
+
55
+ **Carga:** un historial crece sin techo. Se pide por páginas con cursor (`getCollectionPage`
56
+ ordenado por fecha) y un «Cargar más» al final, nunca la colección entera. Canon
57
+ (`master-pedidos/CLAUDE.md`, «Performance — Firestore reads»).
58
+
59
+ ## Tamaño en mobile y en web
60
+
61
+ **No tiene `size`** ni breakpoints. Avatar o ícono de 32, texto 14/20, chips de 28-30. La línea
62
+ de texto **envuelve** (`flex-wrap`), así que en mobile un «Ana aprobó la recarga de S/ 50 de Luis
63
+ · hace 4 min» baja a dos o tres renglones sin romperse.
64
+
65
+ | uso | mobile | web | fuente |
66
+ |---|---|---|---|
67
+ | historial | ancho completo de la columna | dentro de una `sui-card` o un panel lateral | propuesta, falta aprobación |
68
+
69
+ En táctil, el botón de tres puntos y la descarga miden 20 y 28: por debajo del área cómoda. Si
70
+ el feed va en mobile con acciones, esa es la primera mejora que pide el componente.
71
+
72
+ ## «No usar»: por qué no hoy y cuándo sí
73
+
74
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
75
+ |---|---|---|
76
+ | `sui-activity-feed` entero (0 usos) | no hay pantallas de auditoría | historial de cambios de un local en super admin, o quién aprobó cada recarga |
77
+ | `type: 'comment'` con `replyLabel` | no hay hilos de respuesta | notas entre el local y la central sobre un pedido |
78
+ | `avatar.bgColor` | el set de `color` ya cubre los casos y ajusta el texto | una entidad con color propio guardado en la base |
79
+
80
+ ## API
81
+
82
+ <!-- api:inicio -->
83
+ <!-- generada: no editar a mano — `npm run docs` -->
84
+
85
+ | input | tipo | default |
86
+ |---|---|---|
87
+ | `items` | `readonly SuiActivityFeedItem[]` | — (requerido) |
88
+
89
+ | output | payload |
90
+ |---|---|
91
+ | `action` | `{ item: SuiActivityFeedItem; event: MouseEvent }` |
92
+ | `fileDownload` | `{ item: SuiActivityFeedItem; file: SuiActivityFile; event: MouseEvent }` |
93
+ | `reply` | `{ item: SuiActivityFeedItem; event: MouseEvent }` |
94
+ <!-- api:fin -->
95
+
96
+ ```ts
97
+ type SuiActivityFeedItem =
98
+ | (Base & { type: 'default' })
99
+ | (Base & { type: 'file'; files: SuiActivityFile[] })
100
+ | (Base & { type: 'comment'; comment: string; replyLabel?: string })
101
+ | (Base & { type: 'avatar-group'; avatars: SuiActivityAvatarRef[]; extraCount?: number })
102
+ | (Base & { type: 'tasks'; tasks: SuiActivityTask[] });
103
+
104
+ interface Base {
105
+ id: string; // track del @for: único
106
+ avatar?: SuiActivityAvatarRef; // { src?, initials?, color?, bgColor? }
107
+ icon?: string; // en vez del avatar (lo hizo el sistema)
108
+ userName: string;
109
+ verb: string;
110
+ target?: string;
111
+ timestamp: string; // ya formateado
112
+ showAction?: boolean; // default true
113
+ }
114
+ interface SuiActivityFile { name: string; size?: string; href?: string; }
115
+ interface SuiActivityTask { state: 'success' | 'warning' | 'pending' | 'error'; label: string; }
116
+ ```
117
+
118
+ ## Trampas
119
+
120
+ - **Los tres puntos salen por defecto** (`showAction` es `true` si no lo pasas). Si no hay menú
121
+ detrás, pon `showAction: false` en cada item o la persona toca algo que no hace nada.
122
+ - **`replyLabel` por defecto dice «Reply», en inglés.** En una fila `comment`, pasa siempre
123
+ `replyLabel: 'Responder'`.
124
+ - **`file.href` no hace nada.** El tipo dice que dispara la descarga, pero la plantilla no lo lee:
125
+ la descarga la haces tú en `(fileDownload)`.
126
+ - `timestamp` es un string: el feed no formatea ni actualiza «hace 4 min». Si la pantalla queda
127
+ abierta, recalcúlalo tú.
128
+ - Sin `avatar.src`, `initials` ni `icon`, el leading es la silueta gris genérica.
129
+ - Los tres outputs hacen `stopPropagation`: un `(click)` en un contenedor padre no se entera.
130
+ - El host lleva `role="feed"`; cada fila es un `<article>`. No lo metas dentro de otra lista.
131
+ - No hay estado vacío ni de carga: cuando `items` está vacío no se ve nada. Usa `sui-empty-state`
132
+ afuera, y un skeleton mientras llega la primera página.
133
+
134
+ ## Ejemplo
135
+
136
+ ```html
137
+ <sui-card>
138
+ <sui-activity-feed [items]="historial()" (fileDownload)="descargar($event.file)" />
139
+ @if (hayMas()) {
140
+ <sui-button variant="stroke" color="neutral" [size]="bp.isMobile() ? 'large' : 'small'"
141
+ (click)="cargarMas()">Cargar más</sui-button>
142
+ }
143
+ </sui-card>
144
+ ```
145
+
146
+ ```ts
147
+ readonly historial = signal<SuiActivityFeedItem[]>([
148
+ { id: 'r1', type: 'default', avatar: { src: ana.avatarUrl, initials: 'AR', color: 'orange' },
149
+ userName: 'Ana', verb: 'aprobó la recarga de', target: 'Luis Quispe', timestamp: 'hace 4 min',
150
+ showAction: false },
151
+ { id: 'r2', type: 'file', icon: 'bank-card-line', userName: 'Luis Quispe', verb: 'subió su',
152
+ target: 'comprobante de Yape', timestamp: 'hace 6 min', showAction: false,
153
+ files: [{ name: 'yape-50.jpg', size: '(320 kb)' }] },
154
+ ]);
155
+ ```
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: sui-activity-filter
3
+ selector: sui-activity-filter
4
+ resumen: Chip con ícono para filtrar un historial de actividad por tipo — Archivos, Comentarios, Tareas — prendido o apagado
5
+ alternativas: [sui-tab-chips (los filtros de lista de la app, siempre uno elegido), sui-segmented-control (2-4 vistas hermanas), sui-tag (una etiqueta que se puede quitar), sui-badge (un estado que no se toca)]
6
+ ---
7
+
8
+ # sui-activity-filter
9
+
10
+ Story: [Organisms/Activity/Activity Filter](https://sui-design-system.web.app/?path=/docs/organisms-activity-activity-filter--docs)
11
+
12
+ ## Cuándo usarlo / cuándo no
13
+
14
+ **Úsalo** en la fila de filtros **de un `sui-activity-feed`**, para mostrar solo un tipo de
15
+ actividad. Es un botón que se prende y se apaga (`aria-pressed`); la fila de chips y qué se
16
+ filtra lo arma la pantalla.
17
+
18
+ **No lo uses** para:
19
+
20
+ - Filtrar una lista o un catálogo: `sui-tab-chips`, que es el patrón de filtros de toda la app
21
+ (desliza en horizontal y siempre hay uno elegido).
22
+ - Cambiar entre 2-4 vistas de lo mismo: `sui-segmented-control`.
23
+ - Mostrar un estado: `sui-badge`.
24
+
25
+ Regla corta: **filtros del activity feed → activity filter · cualquier otra lista → tab chips.**
26
+
27
+ ## Qué variante usar
28
+
29
+ > **La guía del DS no tiene página de este filtro.** Sale del Figma de SUI (Activity Feed Selected
30
+ > Filter [1.1], frame 165967:3881: Default, Hover, Active). Uso medido el 03-10-2026 en
31
+ > `master-pedidos/src/app`: **0 usos**. Lo de abajo es **propuesta, falta aprobación**.
32
+
33
+ | prop | cuándo | fuente |
34
+ |---|---|---|
35
+ | `active` | El filtro que está aplicado (fondo naranja al 10 %, texto e ícono naranja). | Figma (State=Active) |
36
+ | `icon` | Un ícono que diga el tipo: `file-list-2-line` archivos, `chat-3-line` comentarios, `task-line` tareas. | propuesta, falta aprobación |
37
+ | `icon` en `null` | «Todos»: el chip que limpia el filtro va sin ícono. | propuesta, falta aprobación |
38
+ | `disabled` | Un tipo que no tiene ninguna actividad en el rango elegido. Mejor que esconderlo: la fila no salta. | propuesta, falta aprobación (el disabled no está en el Figma) |
39
+
40
+ ¿Uno o varios a la vez? El componente no lo decide. Propuesta: **uno a la vez, con «Todos»**,
41
+ igual que `sui-tab-chips`; así nadie se queda con un historial vacío por combinar filtros.
42
+
43
+ ## Tamaño en mobile y en web
44
+
45
+ **No tiene `size`**: 30 de alto (4 + 20 + 4 y el borde), texto 14/500, ícono de 18, radio 8.
46
+
47
+ | uso | mobile | web | fuente |
48
+ |---|---|---|---|
49
+ | filtros del activity feed | no usar: 30 no llega al dedo; usar `sui-tab-chips` en `large` | `sui-activity-filter` | propuesta, falta aprobación |
50
+
51
+ La fila de chips la arma la pantalla: el componente no trae contenedor ni scroll lateral.
52
+
53
+ ## «No usar»: por qué no hoy y cuándo sí
54
+
55
+ | qué | por qué no hoy | cuándo sí, en un flujo nuevo |
56
+ |---|---|---|
57
+ | `sui-activity-filter` (0 usos) | no hay activity feed en la app | arriba de un historial de cambios en super admin, solo en web |
58
+ | como filtro de listas | los filtros de la app son `sui-tab-chips` | nunca: dos componentes de filtro con distinto aspecto confunden |
59
+
60
+ ## API
61
+
62
+ <!-- api:inicio -->
63
+ <!-- generada: no editar a mano — `npm run docs` -->
64
+
65
+ | input | tipo | default |
66
+ |---|---|---|
67
+ | `active` | `boolean` | `false` |
68
+ | `disabled` | `boolean` | `false` |
69
+ | `icon` | `string \| null` | `'file-list-2-line'` |
70
+
71
+ | output | payload |
72
+ |---|---|
73
+ | `clicked` | `Event` |
74
+ <!-- api:fin -->
75
+
76
+ Slot: `<ng-content>` (el texto del chip).
77
+
78
+ ## Trampas
79
+
80
+ - **`icon` trae un ícono por defecto** (`file-list-2-line`): un chip sin `icon` igual muestra el de
81
+ archivos. Para sacarlo, `[icon]="null"`.
82
+ - **Escucha `(clicked)`, no `(click)`.** El host no es un `<button>` nativo: Enter y Espacio emiten
83
+ `(clicked)` pero **no** generan un `click`, así que con `(click)` el filtro no funciona por
84
+ teclado. Además `(clicked)` ya se calla cuando está `disabled`.
85
+ - `active` no cambia solo al tocarlo: lo controla la pantalla (`[active]="filtro() === 'archivos'"`).
86
+ - El host es el botón (`role="button"`, `tabindex`, Enter y Espacio): no lo envuelvas en un
87
+ `<button>`.
88
+ - El foco usa un `outline` de 2 px naranja, no el doble anillo de los inputs del DS.
89
+ - Ya trae el arreglo de iOS para el `:active` pegado.
90
+
91
+ ## Ejemplo
92
+
93
+ ```html
94
+ <div class="historial__filtros">
95
+ <sui-activity-filter [icon]="null" [active]="filtro() === 'todos'" (clicked)="filtro.set('todos')">Todos</sui-activity-filter>
96
+ <sui-activity-filter icon="file-list-2-line" [active]="filtro() === 'archivos'" (clicked)="filtro.set('archivos')">Archivos</sui-activity-filter>
97
+ <sui-activity-filter icon="chat-3-line" [active]="filtro() === 'comentarios'" (clicked)="filtro.set('comentarios')">Comentarios</sui-activity-filter>
98
+ </div>
99
+ <sui-activity-feed [items]="historialFiltrado()" />
100
+ ```
@@ -139,6 +139,25 @@ Patrón (la app ya lo usa en 27 lugares; `bp` = `BreakpointsService`, mobile has
139
139
  <sui-button [size]="bp.isMobile() ? 'large' : 'medium'" …/>
140
140
  ```
141
141
 
142
+ ### Regla de tamaños para todo el DS (aprobada por el dueño, 03-10-2026)
143
+
144
+ Vale para todos los componentes que tienen `size` `large` / `xlarge`:
145
+
146
+ - **Alto, padding y área táctil crecen en cada paso.**
147
+ - **El texto sube un solo escalón: hasta `medium` va en 14 px; `large` y `xlarge` van en 16 px.**
148
+ Labels, botones, chips, tabs e ítems usan `--sui-type-label-md-*`; valores y placeholders de
149
+ campos, `--sui-type-paragraph-md-*`. El line-height acompaña (24). Siempre con token (un
150
+ fallback `var(--token, 16px)` está bien), nunca px sueltos.
151
+ - **El texto secundario chico no cambia**: hints, contadores, sublabels y captions de 12.
152
+ - **Los íconos se quedan en 20.**
153
+ - Si la línea de 24 movería el alto medido, se baja el padding para que el alto total quede igual.
154
+ - Los chips cuya escala arranca en 12 (`sui-tag`, `sui-status-badge`) siguen a `sui-badge`, la
155
+ referencia: 14 en `large` y 16 en `xlarge` (derivado de la referencia `sui-badge`, falta
156
+ confirmación del dueño).
157
+
158
+ En large y xlarge el texto sube a 16 px (regla del 03-10-2026): el botón ya usa Label/Medium 16/24
159
+ en esos dos tamaños.
160
+
142
161
  ## API
143
162
 
144
163
  <!-- api:inicio -->