# 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): ```js 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 `