Files
project.linkedcorp.net/docs/UI-UX-WINDOWS.md
T
Milton Gonzalez 1d22adc42e chore: estructura inicial del MVP
Backend (Express + MariaDB) y frontend (React + Vite, identidad Fluent/Windows) con el
nucleo funcional: seguridad, organizacion, proyectos, actividades, subtareas, dependencias,
dashboard, calendario, gantt, comentarios, adjuntos, notificaciones in-app y catalogos.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-03 08:37:58 -05:00

20 KiB
Raw Blame History

UI/UX — Identidad para aplicaciones de escritorio Windows (cómo construir pantallas)

🖥️ Muestra viva: UI-UX-WINDOWS.html (en esta misma carpeta) — ábrela en el navegador para VER todos los elementos (ventana con barra de título propia, panel de navegación, comandos, listado con clic derecho, maestro-detalle, diálogos, flyouts, configuración). Es lo primero que se le muestra al usuario al arrancar un proyecto de escritorio Windows para que apruebe o pida ajustes de la identidad antes de construir. Usa dos JS locales junto al HTML (sin CDN, offline): lucide.min.js (íconos) y chart.umd.js (gráficas Chart.js) — cópialos junto al HTML si se mueve.

⚠️ Este documento es la referencia visual y de interacción (look & feel, tokens, componentes, nomenclatura de regiones). No asume una tecnología de implementación concreta: sirve tanto para una app WinUI 3/.NET nativa como para una app Electron/Tauri, o cualquier otro stack de escritorio Windows. Cada proyecto decide su stack al copiar este documento; lo que no cambia es el comportamiento y la identidad descritos aquí — son los que hacen que la app "se sienta Windows".

Estilo de referencia: Fluent Design / Windows 11 (Mica, esquinas redondeadas, tipografía Segoe UI Variable, paleta de acento del sistema). Pensado primero para mouse (hover, clic derecho, arrastre), sin dejar de ser accesible por teclado.


1. Identidad visual (tokens y tema)

Colores como variables CSS RGB (o el equivalente del framework elegido: DynamicResource en WPF/WinUI, CSS vars en Electron/Tauri), para poder escribir rgb(var(--accent)/.2) y variantes con transparencia. Tema oscuro por defecto + claro vía data-theme="light".

Token Uso Oscuro (ref.) Claro (ref.)
canvas fondo de ventana (equivalente a Mica) 32 32 32 243 243 243
surface tarjetas, diálogos, flyouts 43 43 43 255 255 255
panel panel de navegación, hover de filas 51 51 51 249 249 249
field fondo de campos de entrada 43 43 43 255 255 255
body texto principal 255 255 255 32 32 32
muted texto secundario, labels, hints 168 168 168 96 96 96
line bordes y divisores 70 70 70 225 225 225
accent acción primaria — el acento del sistema 0 120 212 0 103 192
success / warning / danger estados 108 203 95 / 255 185 0 / 255 105 97 16 124 16 / 157 93 0 / 196 43 28

Acento del sistema (do & don't): Windows deja al usuario elegir un color de acento en la configuración del sistema; la app debe heredarlo cuando el framework lo expone (WinUI 3 lo hace automático vía AccentColor), o dar un selector propio con la paleta estándar si no hay acceso al acento del SO. Paleta de referencia (la que usa la muestra viva): blue #0078D4 (por defecto), purple #8764B8, green #10893E, red #C42B1C, orange #CA5010, teal #009984.

Tipografía: Segoe UI Variable (Windows 11) como fuente del sistema — no requiere carga de fuente web, ya está instalada en Windows: font-family:'Segoe UI Variable Text','Segoe UI',system-ui,sans-serif. Los títulos grandes usan el corte Display de la misma familia (Segoe UI Variable Display). Escala: .72rem metadatos/labels · .8–.82rem cuerpo/controles · 1.05–1.25rem títulos de sección · 1.6rem+ valores KPI/Display. Pesos: 600–700 títulos y labels, 400 párrafos.

Forma (radios de Fluent 2): --r-sm: 4px en controles (botones, campos, checkboxes) y --r-lg: 8px en superficies elevadas (tarjetas, diálogos, flyouts, menús, y la propia ventana). No usar esquinas totalmente cuadradas ni "pill" (999px) salvo en ToggleSwitch, badge y avatar.

Iconografía: un solo set en toda la app. Dos opciones válidas:

  • Lucide (la que usa la muestra viva, lucide.min.js local) — mismo estándar que ya usa el grupo en sus apps web (UI-UX-LINKEDCORP.md), da continuidad visual entre plataformas y permite compartir nombres de ícono entre el proyecto web y el de escritorio de un mismo cliente.
  • Segoe Fluent Icons (fuente de glifos del propio Windows) — 100% nativo, cero peso adicional, pero solo tiene sentido en una implementación WinUI/WPF nativa (no está disponible como webfont fuera de Windows).
  • Los íconos heredan el color del contexto (activo = accent, texto = body/muted). No mezclar ambos sets en la misma app.

2. Mensajes del sistema — jerarquía de avisos (REGLA DE ORO)

A diferencia de la web (donde todo pasa por un único AppDialog), una app de escritorio Windows tiene cuatro mecanismos de aviso, cada uno con un propósito distinto. Elegir el correcto es parte de la identidad:

Mecanismo Para qué Bloquea Ejemplo
ContentDialog (modal) toda decisión del usuario (confirmar, elegir, error crítico) Sí "¿Eliminar el cliente CLI-002?"
InfoBar estado o aviso no bloqueante, embebido en el contenido de la pantalla No "Sincronización activa", "Licencia por vencer"
Toast/notificación evento de fondo, sin interacción esperada, autodesaparece No "Copia de seguridad completada"
Flyout acción o info contextual, anclada a un control, se cierra al hacer clic fuera No (light-dismiss) menú de usuario, "¿seguro?" ligado a un botón puntual

Nunca MessageBox/alert/confirm del sistema operativo ni del navegador si el shell es web-based: siempre el ContentDialog propio, para mantener consistencia visual entre Windows y el resto de plataformas del grupo.

Contrato del ContentDialog (equivalente al openDialog del template web):

openDialog({
  tone: 'info' | 'success' | 'warning' | 'error',   // franja superior + color del ícono/título
  title: 'Título claro',
  message: 'Descripción en lenguaje del usuario',
  actions: [                                          // opcional; sin actions -> botón "Cerrar"
    { label: 'Cancelar', variant: 'standard' },
    { label: 'Eliminar', variant: 'danger', onClick: async () => { ... }, keepOpen: false },
  ],
});
  • Sin actions ⇒ botón "Cerrar" (accent) automático. keepOpen: true mantiene el diálogo abierto tras el onClick (procesos largos).
  • Sets de botones estándar (misma convención que la identidad web): Aceptar/Cancelar, Sí/No, Eliminar(danger)/Cancelar, Guardar/Descartar. Acción primaria a la derecha, Cancelar/No a la izquierda. Los botones de decisión siempre muestran texto (nunca solo ícono).
  • El ContentDialog se centra sobre la ventana de la app, no sobre toda la pantalla del monitor.

3. Kit de componentes (resumen; ver el markup/CSS de referencia en UI-UX-WINDOWS.html)

  • Botones — accent (relleno de color, acción primaria), standard (borde + fondo neutro), subtle (transparente, solo hover), danger (borde/texto rojo). Alto 32px (sm 26px). Todo botón compone ícono (izq.) + texto; en toolbars muy densas puede ir solo ícono con tooltip obligatorio indicando la acción.
  • Campos — TextBox, NumberBox (con spinner +/-), ComboBox propio (desplegable redondeado, con buscador si la lista tiene ≥10 ítems; nunca el <select>/combo nativo del SO — no se puede redondear ni estilar), Textarea, CheckBox, RadioButtons, ToggleSwitch (interruptor), Slider.
  • DatePicker/TimePicker — calendario propio en un flyout anclado al campo (navegación de mes, día de hoy marcado, selección resaltada con accent); igual criterio que ComboBox: no usar el selector nativo del SO por falta de control visual.
  • ListView/DataGrid — tabla con encabezados ordenables (clic ordena asc/desc), columna de selección múltiple (checkbox), fila con hover y estado seleccionado (accent/.14), y clic derecho que abre el menú contextual de esa fila (ver §6). Alternativa por fila sin mouse derecho: botón ⋯ que abre el mismo menú.
  • Master-Detail (Split View) — patrón nativo de Windows (Correo, Configuración, Explorador): lista angosta a la izquierda + panel de detalle a la derecha que se actualiza en el sitio al seleccionar un ítem, sin modal. Preferir sobre "detalle en modal" cuando la pantalla es principalmente de exploración/lectura de una lista larga.
  • Menú contextual (clic derecho) — el patrón de interacción más característico de Windows: ítems con ícono + label + acelerador de teclado a la derecha (Ctrl+E, Del…), separadores, submenú con flecha ▸ que se expande al pasar el mouse, ítem destructivo en danger. Debe estar disponible en toda fila/elemento accionable, no solo en listados.
  • Barra de menú clásica (Archivo · Editar · Ver…) — opcional, solo para apps de productividad/edición que lo necesiten (no todas las apps modernas la llevan; Configuración o Correo no la tienen). Si se usa, cada ítem abre un menú desplegable igual al contextual.
  • Flyout — popover anclado a un control (avatar, botón), con light-dismiss (clic fuera o Esc cierra). Para menús de cuenta, ayuda contextual corta o una confirmación ligada a un botón puntual.
  • InfoBar — banner de 4 tonos (info/success/warning/error) embebido en el contenido, con botón de cierre ✕; no empuja al usuario a decidir, solo informa.
  • Toast — notificación flotante (esquina inferior derecha), autodesaparece (~4s), apilable. Solo para eventos de fondo — si el usuario debe decidir algo, es un ContentDialog, no un toast.
  • Teaching Tip — "coach mark" anclado con flecha, para presentar una función nueva la primera vez (onboarding); se descarta con un botón, no reaparece tras cerrarse.
  • Expander (patrón de Configuración) — fila con ícono + título + descripción + chevron; al hacer clic expande un cuerpo con los controles de esa sección (toggles, botones). Es el patrón estándar para pantallas de Configuración/Ajustes.
  • Treeview — árbol jerárquico estilo Explorador de Windows (▾/▸ para expandir/colapsar, ícono de carpeta/archivo, selección resaltada). Para categorías, carpetas o estructuras anidadas.
  • Barra de título personalizada — reemplaza el chrome nativo de Windows: ícono+nombre de la app a la izquierda (zona arrastrable, mueve la ventana), controles minimizar / maximizar / cerrar a la derecha. Cerrar se resalta en rojo (#C42B1C) al hover; Maximizar muestra, al hover, la vista previa de Snap Layouts (2/3/4 particiones) — detalle que distingue a una app "moderna".
  • NavigationView (panel de navegación) — fijo a la izquierda, con tres modos: expandido (ícono+texto), compacto (solo ícono) y oculto (drawer). Se colapsa con el botón ☰; tiene buscador propio arriba y, al pie, la cuenta del usuario (abre un Flyout).
  • CommandBar — franja de botones de acción de la vista actual (Nuevo, Actualizar, Eliminar…) con botón "···" (overflow) para acciones secundarias cuando no caben todos los botones.
  • BreadcrumbBar — ruta de navegación bajo la barra de comandos, segmentos separados por ›, el último en negrita y no clicable.
  • Barra de estado — pie de ventana con texto pequeño: conteo de elementos/selección, estado de conexión, versión. Equivalente a la barra de estado del Explorador de Windows.
  • KPI / spinner / skeleton / progress bar — igual criterio que en web: tarjetas de indicador con delta ▲/▼, spinner circular para cargas cortas, skeleton para listados, barra de progreso para procesos medibles.
  • Gráficas — Chart.js local (chart.umd.js, sin CDN); colores desde los tokens del tema y se reconstruyen al cambiar tema/acento. maintainAspectRatio:false + contenedor con max-height.
  • Plantillas de ventana — Login (ventana pequeña centrada, avatar, usuario/contraseña, recordarme), Acerca de (ventana utilitaria pequeña con ícono, versión, botón de actualización) y Reporte/factura (documento con Imprimir/Exportar PDF, aislado con @media print si el shell es web-based).

4. Layout (estructura de la ventana) y NOMENCLATURA de regiones

Úsalos para pedir cambios: "cambia X en barra-comandos". La muestra viva rotula visualmente cada región (chip azul) y cada componente (chip verde) al activar el interruptor "Mostrar nombres" (vista Resumen, o menú ··· de la barra de comandos).

Nombre Qué es Comportamiento
ventana contenedor raíz de la app esquinas redondeadas (8px), sombra; simula el marco de una app de escritorio flotando sobre el escritorio
barra-titulo barra de título personalizada arrastrable salvo sobre sus controles; ícono+nombre a la izq., minimizar/maximizar/cerrar a la der.
navegacion panel de navegación izquierdo (NavigationView) FIJO, scroll propio si hay muchos ítems; modos expandido/compacto/oculto
col-derecha columna derecha todo lo no-navegación, alto completo de la ventana
barra-comandos CommandBar de la vista actual botones de acción + overflow ···
migas-pan BreadcrumbBar bajo la barra de comandos; último nivel en negrita
area-contenido contenido de la vista ÚNICA región con scroll propio
panel-detalle panel derecho en vistas maestro-detalle se actualiza al seleccionar un ítem, sin modal
divisor separador arrastrable entre paneles cursor col-resize; el arrastre con mouse redimensiona los paneles adyacentes
barra-estado pie de ventana conteo de ítems/selección, estado; texto pequeño

Comportamiento clave: navegacion queda fija (no se desplaza con area-contenido); solo area-contenido hace scroll. barra-titulo, barra-comandos, migas-pan y barra-estado permanecen siempre visibles.

Ventanas secundarias vs. una sola ventana: a diferencia de la web (todo en una pestaña), una app Windows puede abrir ventanas propias para diálogos de larga duración o utilitarios (Acerca de, Propiedades, un asistente). Regla: usar una ventana secundaria solo cuando el contenido necesita vivir independientemente de la ventana principal (el usuario puede moverla, alternar entre ambas con Alt+Tab); si es una decisión puntual ligada al contexto actual, es un ContentDialog, no una ventana nueva.


5. Interacción — pensada primero para mouse

  • Hover en todo lo accionable: botones, filas de listado, ítems de navegación, ítems de menú y árbol cambian de fondo al pasar el mouse (panel o accent/.14 si están seleccionados). Es la señal principal de "esto se puede interactuar" en una app de mouse.
  • Clic derecho = menú contextual, en cualquier fila/elemento accionable (listados, árbol, tarjetas). Debe existir también una vía sin botón derecho (botón ⋯) para paridad con touch/teclado.
  • Tooltips con retardo (~350ms) en todo botón de solo-ícono y en controles cuyo propósito no sea obvio por el texto visible; nunca sustituyen a un ContentDialog para respuestas del sistema.
  • Cursores con significado: pointer en clicables, col-resize/row-resize en divisores arrastrables, move en zonas de arrastre (barra de título), text en campos.
  • Anillo de foco solo para teclado (:focus-visible), no al hacer clic con el mouse — evita el "flash" de foco en cada clic que resulta ruidoso en una app mouse-first, sin sacrificar accesibilidad por teclado (Tab/flechas siguen mostrando el anillo).
  • Snap Layouts: al pasar el mouse sobre "Maximizar" se muestra la vista previa de particiones de pantalla — reforzar este detalle si el framework lo expone nativamente (Windows 11 lo da gratis en WinUI/WPF con el chrome nativo bien configurado).
  • Divisores/splitters arrastrables entre paneles (p. ej. lista/árbol ↔ detalle) para que el usuario ajuste el espacio a su gusto; el ancho elegido se persiste por vista.
  • Sin scroll horizontal en tablas cuando sea evitable: preferir ocultar columnas secundarias o usar panel-detalle para el resto de la información antes que forzar scroll-x.

6. Receta para construir una pantalla

  1. CommandBar (Nuevo, Actualizar, acciones contextuales + overflow ···).
  2. Elegir el patrón de datos según el caso:
    • Listado + Master-Detail: lista con selección simple a la izquierda/arriba, detalle en el sitio a la derecha/abajo. Preferido cuando el usuario navega/lee mucho (correo, catálogos).
    • Listado + ContentDialog de detalle: al hacer clic en una fila se abre un ContentDialog (o una ventana secundaria si el contenido es largo) con el detalle y acciones (Editar, Eliminar). Preferido cuando el detalle es ocasional y la lista debe verse completa mientras se usa.
  3. Selección múltiple + acciones por lote: casillas en la columna izquierda de la tabla; la barra de estado muestra "N de M seleccionados"; las acciones de lote aparecen en la CommandBar solo cuando hay selección.
  4. Clic derecho en cada fila con el menú contextual estándar: Ver detalle, Editar, Duplicar, Exportar (submenú), separador, Eliminar (danger).
  5. Edición: campos habilitados solo en modo edición; Guardar solo si hubo cambios reales; acciones destructivas siempre confirmadas con ContentDialog (tono warning, Cancelar/Eliminar).
  6. Pie de listado (pie-listado, igual criterio que en la identidad web): líneas por página (5·10·20·50·Todo, default 10, persistente por listado), rango "Mostrando X–Y de N", paginación con ventana deslizante de 5 números, y alto constante entre páginas (filas de relleno invisibles en la última página parcial).

7. Reglas de identidad (do & don't)

  • ✅ Barra de título personalizada (no la nativa del SO) con drag region + minimizar/maximizar/cerrar.
  • ✅ Panel de navegación fijo, con modos expandido/compacto/oculto persistentes.
  • ✅ Tema oscuro/claro y acento del sistema, ambos persistentes; heredar el acento del SO cuando el framework lo permita.
  • ✅ Toda decisión del usuario pasa por ContentDialog; estados no bloqueantes por InfoBar; eventos de fondo por Toast; nada de MessageBox/alert/confirm nativos.
  • ✅ Clic derecho con menú contextual en toda fila/elemento accionable — es la firma de interacción de una app Windows mouse-first.
  • ✅ ComboBox y DatePicker propios (redondeados, estilables); nunca los controles nativos del SO/navegador para estos casos — igual criterio que la identidad web.
  • ✅ Tipografía del sistema (Segoe UI Variable), sin cargar fuentes web — más estable y coherente con el resto de Windows.
  • ✅ Radios de esquina consistentes: 4px controles, 8px superficies elevadas y la ventana misma.
  • ✅ Un solo set de íconos en toda la app (Lucide o Segoe Fluent Icons), heredando color del contexto.
  • ✅ Master-Detail para listas de exploración; ContentDialog/ventana secundaria para detalle ocasional.
  • ✅ Foco visible solo con teclado (:focus-visible); hover visible siempre (mouse-first).
  • ❌ MessageBox/alert/confirm del sistema. ❌ combos/selects/calendarios nativos sin estilar. ❌ mezclar sets de íconos. ❌ apilar listado + formulario + detalle en una sola pantalla sin separación clara. ❌ usar Toast para pedir una decisión al usuario.

Para que una app "se sienta Windows moderna": misma barra de título, mismo panel de navegación, mismos cuatro mecanismos de aviso (ContentDialog/InfoBar/Toast/Flyout) bien diferenciados, clic derecho en todo lo accionable, y los mismos tokens de color/tipografía/radio. Abre UI-UX-WINDOWS.html para verlo funcionando y pide ajustes por el nombre de región/componente.