--- name: portfolio-ui-design description: Estándar de diseño UI/UX para el Portafolio Profesional Interactivo. Fusión de estética Zen Japonés, Dark High-Contrast y Retro Computing (PC-98 / NeXT / Terminal Linux), con especificaciones para Laptop 3D desarmable en scroll, mini-pantalla Retro OS con videojuegos retro, terminal interactiva y probador de API en vivo. --- # Estándar de Diseño UI/UX — Portafolio Profesional Interactivo (Zen Japonés + Dark + Retro) Este documento define las reglas visuales, estéticas, de interacción y diseño de componentes para el **Portafolio Web Profesional Interactivo**. Su propósito es crear una experiencia memorable, sofisticada y técnicamente impresionante, combinando la serenidad y minimalismo del **Zen Japonés (Wabi-Sabi, Ma, Kanso)** con el misterio del **Dark Mode de alto contraste** y la nostalgia táctil del **Retro Computing / Cyber-Zen**. --- ## 1. Filosofía de Diseño — Reglas de Oro El agente actúa como un **Director Creativo & Diseñador UI/UX Senior con 10+ años de experiencia** en diseño web interactivo, aplicaciones 3D y sistemas de diseño de alto impacto. ### 1.1 El Concepto Central: "Cyber-Zen & Retro Elegance" 1. **Zen Japonés (Wabi-Sabi & Ma - 間)**: - **Ma (Espacio negativo consciente)**: Las secciones respiran. No atiborrar la pantalla. El vacío tiene peso y propósito. - **Kanso (Simplicidad)**: Eliminar lo superfluo. Cada elemento visual tiene una función de comunicación o interacción. - **Shizen (Naturalidad dentro de lo digital)**: Transiciones orgánicas, fluidez como el agua, contrastadas con el rigor del código. - **Kintsugi (El valor de la técnica)**: Acentos dorados sutiles (`#d4af37` / `#c59b27`) que destacan la artesanía del software. 2. **Dark High-Contrast**: - Fondos negros tinta (Sumi-e ink `#0a0c10`), carbón profundo (`#12151b`) y pizarra (`#1a1f26`). - Cero grises desteñidos o descoloridos. El texto y los acentos resaltan con legibilidad WCAG AAA. 3. **Retro Computing & Terminal Nostalgia**: - Elementos inspirados en estaciones de trabajo Unix (NeXTSTEP, Silicon Graphics, PC-98 japonés). - Tipografía monoespaciada para datos técnicos, prompt de terminal Linux interactivo, scanlines CRT hiper-sutiles (opcionales/conmutables) y ventanas estilo OS vintage pero refinadas. ### 1.2 Prohibiciones Absolutas (Cero "AI Slop") - **Prohibido emojis en la UI**: En ningún título, label, botón, tooltip o feedback. - **Prohibido gradientes estridentes tipo arcoíris o neón descontrolado**: La paleta es sobria, monocromática con acentos de precisión. - **Prohibido cards hinchadas con sombras gigantescas**: Las tarjetas usan bordes nítidos de `1px solid rgba(...)`, sombras difusas tenues y proporciones elegantes. - **Prohibido border-radius desproporcionado**: El estilo zen/retro usa bordes rectos o de redondeo mínimo (`2px` a `6px`). Prohibido usar `border-radius: 24px` o píldoras gigantes. - **Prohibido saturar con librerías pesadas de animación**: Las interacciones deben ser fluidas a 60fps usando CSS moderno, requestAnimationFrame y WebGL/Canvas nativo cuando sea requerido. --- ## 2. Paleta de Colores y Tokens Visuales ### 2.1 Variables CSS Base (Sumi & Gold Palette) ```css :root { /* Fondos (Sumi-e Ink & Obsidian) */ --zen-bg-abyss: #07080b; /* Fondo más profundo (canvas del 3D / Landing) */ --zen-bg-base: #0c0e14; /* Fondo principal de la aplicación */ --zen-bg-surface: #131720; /* Superficie de cards, ventanas y paneles */ --zen-bg-elevated: #1a202c; /* Superficies flotantes, dropdowns, tooltips */ --zen-bg-overlay: rgba(12, 14, 20, 0.85); /* Backdrops y overlays */ /* Bordes & Divisores */ --zen-border-subtle: #1e2533; /* Bordes estándar de división */ --zen-border-focus: #3d4a63; /* Bordes activos o hover */ --zen-border-kintsugi: #c59b27; /* Borde acentuado de oro kintsugi */ /* Textos & Tipografía */ --zen-text-primary: #f0f3f8; /* Blanco perla japonés (alta legibilidad) */ --zen-text-secondary: #9aa5b8; /* Gris pizarra para subtítulos y metadatos */ --zen-text-muted: #5e697d; /* Gris atenuado para hints y footer */ --zen-text-gold: #e2b94a; /* Dorado para llamadas de atención selectas */ /* Acentos Temáticos */ --zen-accent-kintsugi: #c59b27; /* Oro kintsugi (artesanía, acción primaria) */ --zen-accent-matcha: #4e9b6f; /* Verde matcha / Terminal éxito */ --zen-accent-sakura: #d96f88; /* Rosa sakura atenuado / Alertas o badges */ --zen-accent-amber: #e69d45; /* Ámbar CRT retro / Warnings */ --zen-accent-cyan: #38bdf8; /* Azul glacial / API tester */ /* Retro CRT & Terminal */ --term-bg: #090b0e; --term-prompt: #4e9b6f; /* Verde fósforo zen */ --term-text: #d8dee9; --term-cursor: #e2b94a; /* Elevaciones & Sombras */ --zen-shadow-sm: 0 2px 4px rgba(0, 0, 0, 0.4); --zen-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.6); --zen-shadow-window: 0 10px 30px rgba(0, 0, 0, 0.8), 0 0 1px 1px rgba(255, 255, 255, 0.05); /* Curvaturas (Bordes nítidos y elegantes) */ --zen-radius-xs: 2px; /* Botones retro, inputs */ --zen-radius-sm: 4px; /* Tarjetas, ventanas */ --zen-radius-md: 6px; /* Contenedores principales */ } ``` ### 2.2 Temas Conmutables (Data-Attributes) El usuario puede alternar la paleta visual desde la Terminal (ej: `theme amber`) o desde los ajustes del Retro OS: ```css /* Tema 1: Zen Dark (Predeterminado) */ [data-theme='zen-dark'] { --zen-bg-base: #0c0e14; --zen-bg-surface: #131720; --zen-text-primary: #f0f3f8; --zen-accent-kintsugi: #c59b27; --term-prompt: #4e9b6f; } /* Tema 2: Retro CRT Ámbar (Estación de trabajo vintage) */ [data-theme='retro-amber'] { --zen-bg-base: #0a0702; --zen-bg-surface: #140f06; --zen-border-subtle: #2d1e0a; --zen-text-primary: #ffb833; --zen-text-secondary: #cc8e20; --zen-accent-kintsugi: #ffb833; --term-bg: #0d0903; --term-prompt: #ffb833; --term-text: #ffcf70; --term-cursor: #ffb833; } /* Tema 3: Matrix / Cyber-Zen Verde */ [data-theme='matrix-green'] { --zen-bg-base: #040a06; --zen-bg-surface: #0a140d; --zen-border-subtle: #122819; --zen-text-primary: #33ff77; --zen-text-secondary: #22aa4e; --zen-accent-kintsugi: #33ff77; --term-bg: #040a06; --term-prompt: #33ff77; --term-text: #66ff99; --term-cursor: #33ff77; } ``` --- ## 3. Tipografía El portafolio comunica rigor de ingeniería mediante una cuidada jerarquía tipográfica: ```css /* Familias Tipográficas */ --font-sans: 'Plus Jakarta Sans', 'Inter', -apple-system, sans-serif; --font-mono: 'JetBrains Mono', 'Fira Code', monospace; --font-retro: 'VT323', 'Press Start 2P', monospace; /* Para detalles retro específicos */ ``` | Elemento | Fuente | Tamaño | Peso | Color | Uso | |---|---|---|---|---|---| | Display / Hero Title | Sans | `2.75rem - 3.5rem` | `700` | `--zen-text-primary` | Título de landing, frase de impacto | | Heading H1 / Sección | Sans | `1.75rem - 2.25rem` | `600` | `--zen-text-primary` | Títulos de proyectos, terminal header | | Heading H2 / Subsección | Sans | `1.25rem - 1.5rem` | `600` | `--zen-text-primary` | Títulos de cards, ventanas de OS | | Eyebrow / Kanji Tag | Mono | `0.75rem` | `600` | `--zen-accent-kintsugi` | Acentos zen (ej: `01 // 開発 PROYECTOS`) | | Body / Párrafo | Sans | `0.9375rem` | `400` | `--zen-text-secondary` | Descripciones, texto de lectura fluida | | Terminal / Logs | Mono | `0.875rem` | `400` | `--term-text` | Consola interactiva, código, respuestas API | | Retro OS UI | Mono / Retro | `0.8125rem` | `500` | `--zen-text-primary` | Barras de título de ventanas, menú de juegos | --- ## 4. Componentes Interiores Clave — Especificación Detallada ### 4.1 Fondo Hero con Laptop 3D Desarmable al Scroll (Exploded View) #### Concepto y Comportamiento: - En la Landing Page, el centro visual es una **laptop estética minimalista** vista en perspectiva isométrica o 3/4. - A medida que el usuario hace scroll hacia abajo, la laptop se **desarma suavemente en capas explosivas (Exploded View)**: 1. **Scroll 0% - 15%**: Laptop cerrada/abierta en reposo, pantalla brillando tenuemente con el logo o terminal zen. 2. **Scroll 15% - 40%**: La tapa superior con la pantalla se eleva verticalmente en el eje Z. 3. **Scroll 40% - 65%**: El teclado y el chasis superior flotan hacia arriba, revelando la placa madre (motherboard). 4. **Scroll 65% - 85%**: Los microcomponentes (procesador .NET, chips de memoria, buses) se separan flotando con líneas de conexión y etiquetas técnicas flotantes que apuntan a tus habilidades técnicas reales (ej. "Arquitectura Limpia", "Motor de Signals", "MySQL Optimization"). 5. **Scroll 85% - 100%**: Los componentes se reensamblan o se desvanecen suavemente dando paso al siguiente bloque de contenido. #### Reglas de Implementación Técnica & Rendimiento: - Utilizar **Three.js** o **WebGL Canvas** con instanced meshes ligeras o primitivas geométricas optimizadas (archivo GLTF/GLB comprimido con Draco, peso máximo `< 1.8 MB`). - Vincular la rotación y separación exclusivamente a la posición de scroll normalizada (`0.0` a `1.0`) mediante `requestAnimationFrame`. - **Modo Reducido / Fallback**: - En dispositivos móviles o si `prefers-reduced-motion: reduce` está activo, deshabilitar la separación 3D continua y renderizar una vista 3D fija o una ilustración estática de alta calidad optimizada. - Pausar el render loop de WebGL cuando la sección hero esté fuera del viewport (vía `IntersectionObserver`). --- ### 4.2 Terminal Linux Interactiva (Hacker Zen Console) #### Concepto: Una consola interactiva incrustada donde reclutadores y visitantes técnicos pueden ejecutar comandos reales para navegar tu información como si estuvieran en un servidor Unix. #### Anatomía Visual de la Terminal: - Barra superior estilo ventana Unix/Retro con: - Indicador de estado: punto verde latente (`● online`). - Título: `bryan@zen-kernel: ~ (zsh)` - Botones de acción mínimos (minimizar, cerrar). - Prompt interactivo: `bryan@zen:~$ ` en color matcha `--term-prompt`. - Cursor parpadeante con animación escalonada `steps(2, start)`. #### Comandos Soportados Requeridos: - `help`: Muestra la lista de comandos disponibles con formato de tabla limpia. - `about`: Resumen profesional, filosofía de desarrollo y enfoque arquitectónico. - `skills`: Lista de tecnologías organizadas por Backend (.NET, MySQL), Frontend (Angular, Signals), y Prácticas (Clean Arch, CQRS). - `projects`: Lista de proyectos destacados con enlaces clickeables. - `curl /api/ping`: Ejecuta una petición HTTP real al backend .NET y muestra la respuesta con latencia. - `retro`: Abre la ventana del sistema operativo retro / minijuegos. - `clear`: Limpia el buffer de la pantalla. - `sudo`: Mensaje de humor de permisos para administradores. #### Estilo CSS de la Terminal: ```css .zen-terminal-window { background: var(--term-bg); border: 1px solid var(--zen-border-subtle); border-radius: var(--zen-radius-sm); box-shadow: var(--zen-shadow-window); font-family: var(--font-mono); overflow: hidden; } .zen-terminal-header { background: #11141a; padding: 8px 16px; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--zen-border-subtle); } .zen-terminal-body { padding: 16px; min-height: 260px; max-height: 420px; overflow-y: auto; color: var(--term-text); line-height: 1.6; } .zen-terminal-prompt { color: var(--term-prompt); font-weight: 600; } ``` --- ### 4.3 Pantalla de Sistema Operativo Retro (ZenOS / Retro Desktop) #### Concepto: Una mini-pantalla o ventana de escritorio que evoca sistemas operativos de los años 90 (estilo NeXTSTEP / PC-98 japonés / System 7): - Fondo de escritorio con cuadrícula punteada retro o patrón geométrico monocromático. - Íconos en el escritorio estilo pixel-art minimalista: - `Juegos.exe` (Abre el catálogo de videojuegos retro). - `Curriculum.doc` (Visor de experiencia interactiva). - `Terminal.sh` (Acceso directo a la consola). - `Ajustes.sys` (Cambio de tema: Zen Dark / Phosphor Amber / Matrix Green). - Ventanas arrastrables (*draggable*) con barra de título gris pizarra oscura, botones biselados clásicos de cerrar/minimizar y tipografía pixelada o mono nítida. #### Mini-Juego Retro Integrado: - Juegos ligeros implementados en **Canvas 2D HTML5 nativo** (cero dependencias pesadas de juegos): - **Zen Snake**: La clásica serpiente, pero con estética de tinta japonesa (come esferas de kanjis o monedas kintsugi). - **Space Defense / Katana Retro**: Un juego arcade simple de esquivar/disparar obstáculos con puntuación guardada localmente. - Panel de control del juego: botones de pausa, reinicio, controles táctiles opcionales para móvil y tabla de "High Scores" que puede consultar la API del backend. --- ### 4.4 Probador de API en Vivo (Live .NET Playground) #### Concepto: Demuestra de inmediato que no es solo un frontend estático, sino una arquitectura fullstack real en producción. Permite al visitante invocar endpoints públicos controlados de .NET. #### Componente Visual: - Selector de endpoints de prueba: - `GET /api/v1/interactive/ping` (Verifica salud y tiempo de respuesta del backend .NET). - `GET /api/v1/interactive/skills-metrics` (Retorna métricas dinámicas calculadas por el backend). - `GET /api/v1/interactive/server-telemetry` (Retorna tiempo de actividad, versión de .NET y motor de base de datos MySQL). - Botón de acción: `Ejecutar Endpoint` con feedback de carga elegante. - Visor de respuesta: - Badge de Status Code: `200 OK` (verde matcha), `422 Unprocessable` (ámbar), `500 Server Error` (sakura). - Medidor de latencia: `Tiempo de respuesta: 42 ms`. - Caja de código JSON formateada con sintaxis coloreada nativa. --- ### 4.5 Panel de Administración RBAC (Backoffice Minimalista Zen) #### Concepto: Vista protegida para que Bryan pueda gestionar sus proyectos, habilidades y contenidos sin desplegar código nuevo. - Acceso mediante modal discreto (o atajo desde terminal con `login`). - Formularios limpios: - Inputs con focus de borde inferior kintsugi (`#c59b27`). - Tablas densas con tipografía mono, filtros rápidos y acciones CRUD (Crear, Editar, Desactivar). - Modal de confirmación con diseño sobrio. --- ## 5. Sistema de Espaciado (Grid de 8px) Todo padding, margen y separación debe ser múltiplo de `8px` (o submúltiplo de `4px` para elementos microscópicos): | Token | Medida | Aplicación | |---|---|---| | `--space-1` | `4px` | Separación mínima entre icono y texto | | `--space-2` | `8px` | Padding interno de inputs, tags y botones compactos | | `--space-3` | `12px` | Separación de items en listas densas | | `--space-4` | `16px` | Padding de cards, ventanas y botones estándar | | `--space-6` | `24px` | Separación entre grupos de campos o elementos de card | | `--space-8` | `32px` | Padding principal de secciones y modales | | `--space-12`| `48px` | Separación entre módulos mayores de la página | | `--space-16`| `64px` | Margen vertical de grandes secciones en desktop | --- ## 6. Movimiento, Animaciones y Microinteracciones 1. **Duraciones y Curvas de Aceleración**: - Transiciones de hover/focus: `150ms cubic-bezier(0.4, 0, 0.2, 1)` (rápidas, precisas). - Apertura de ventanas retro / modales: `200ms cubic-bezier(0, 0, 0.2, 1)` (sin rebotes infantiles). - Movimiento de scroll 3D: Interpolación lineal suave (*lerp* con factor `0.08` a `0.12`). 2. **Efecto Scanline Retro**: - Implementado mediante un pseudo-elemento `::after` con gradiente repetitivo muy sutil (`opacity: 0.04`) y `pointer-events: none`. Con interruptor para apagarlo en caso de preferencia del usuario. 3. **Respeto a la Accesibilidad**: - `@media (prefers-reduced-motion: reduce)` debe anular cualquier animación continua o de scroll 3D. ### 6.2 Diseño de Sonido Retro (Web Audio API Nativa — 0 KB) Para brindar respuesta táctil a la terminal y controles retro sin descargar archivos `.mp3` ni añadir librerías: ```typescript export class RetroAudioService { private ctx: AudioContext | null = null; private getContext(): AudioContext { if (!this.ctx) this.ctx = new (window.AudioContext || (window as any).webkitAudioContext)(); return this.ctx; } // Clic mecánico sutil al teclear en la terminal (120Hz triángulo) playKeypress(): void { const ctx = this.getContext(); const osc = ctx.createOscillator(); const gain = ctx.createGain(); osc.type = 'triangle'; osc.frequency.setValueAtTime(120, ctx.currentTime); gain.gain.setValueAtTime(0.03, ctx.currentTime); gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.03); osc.connect(gain); gain.connect(ctx.destination); osc.start(); osc.stop(ctx.currentTime + 0.03); } // Beep retro al ejecutar comando con éxito (880Hz senoidal) playSuccessBeep(): void { const ctx = this.getContext(); const osc = ctx.createOscillator(); const gain = ctx.createGain(); osc.type = 'sine'; osc.frequency.setValueAtTime(880, ctx.currentTime); gain.gain.setValueAtTime(0.05, ctx.currentTime); gain.gain.exponentialRampToValueAtTime(0.001, ctx.currentTime + 0.08); osc.connect(gain); gain.connect(ctx.destination); osc.start(); osc.stop(ctx.currentTime + 0.08); } } ``` --- ## 7. Límites de Líneas y Modularidad de Componentes UI Para permitir un desarrollo visual fluido y expresivo sin caer en el extremo de crear micro-archivos innecesarios para cada detalle, se definen los siguientes umbrales tolerables: | Elemento Visual | Líneas Ideales | Máximo Tolerable | Acción al Exceder el Límite | |---|---|---|---| | **Plantilla de Componente UI (`.html`)** | **50 – 130** | **200** | Descomponer bloques visuales densos en subcomponentes presentacionales hijos. | | **Estilos de Componente (`.css`)** | **40 – 100** | **160** | Utilizar los tokens CSS globales definidos en `portfolio-ui-design` (colores, sombras, radios) en lugar de CSS repetitivo. | | **Componentes de Ventana (Retro OS / Terminal)** | **60 – 140** | **240** | Dividir la ventana en subcomponentes (`window-header`, `window-content`) si supera el máximo. | | **Tarjetas de Proyecto / Skills** | **30 – 75** | **130** | Cada tarjeta encapsula su preview, descripción y tags; dividir solo si integra modales embebidos. | | **Diálogos Modales / Drawers** | **50 – 110** | **170** | El modal provee el marco y botones; el contenido de formularios extensos es un subcomponente hijo. | ### Regla de Descomposición UI: 1. **Cohesión Visual Natural**: Un componente puede albergar cómodamente su estructura visual completa (hasta 150-200 líneas de HTML y 100-160 de CSS). Se divide cuando un sub-bloque tiene comportamiento interactivo propio e independiente. 2. **Subcomponentes Atómicos**: Si una interfaz compuesta (como la consola interactiva o la ventana retro) supera las 200 líneas de HTML o 160 de CSS, se crean subcomponentes hijos en una carpeta `components/` local a esa feature. --- ## 8. Tabla de Anti-Patrones Prohibidos | Anti-patrón Prohibido | Solución Correcta en este Portafolio | |---|---| | Usar emojis en la interfaz para verse "amigable" | Tipografía limpia, badges de texto plano e iconos SVG monocromáticos precisos | | Gradientes púrpuras/rosas genéricos de IA | Paleta Sumi-e: fondos carbón profundos con acentos dorados kintsugi y verde matcha | | Border-radius excesivo tipo píldora (20px+) | Bordes nítidos (`2px` a `6px`) de estilo arquitectónico y retro computing | | Ventanas retro sobrecargadas que bloquean la navegación | Ventana contenida, redimensionable o minimizable sin entorpecer el flujo principal | | Modelo 3D pesado que demora 10 segundos en cargar | Geometría optimizada (`< 1.8 MB`), carga diferida (lazy load) y fallback estático | | Animaciones que saltan y distraen la lectura | Movimiento solo en interacción deliberada o ligado al scroll de forma armónica | | Falta de contraste en modo oscuro (texto gris sobre gris) | Texto principal perla `#f0f3f8` sobre fondo `#0c0e14` (ratio > 7:1, WCAG AAA) |