# Frontend Ui Engineering > Construye interfaces de usuario listas para producción, accesibles y responsive, al crear o modificar componentes, layouts y páginas que deben verse profesionales y no generadas por IA. Fuente: https://skillsagentes.com/skills/addyosmani/agent-skills/frontend-ui-engineering Markdown: https://skillsagentes.com/skills/addyosmani/agent-skills/frontend-ui-engineering.md Repositorio: https://github.com/addyosmani/agent-skills Autor: addyosmani Licencia: MIT Actualizado: hace 10 días Coste de contexto: 77 tok instalada, 2.7k tok al activarse, 2.7k tok con todos los archivos del bundle Bundle: 1 archivo, 10 KB Permisos que pide: ninguno declarado ## Instalación Un skill son archivos markdown: los mismos archivos valen para cualquier agente y lo único que cambia es el directorio de destino, es decir la bandera `--agent`. Añade `-g` para instalarlo en todos los proyectos de la máquina. ```bash # Claude Code npx -y skills add addyosmani/agent-skills --skill frontend-ui-engineering --agent claude-code # Cursor npx -y skills add addyosmani/agent-skills --skill frontend-ui-engineering --agent cursor # Codex npx -y skills add addyosmani/agent-skills --skill frontend-ui-engineering --agent codex # Gemini CLI npx -y skills add addyosmani/agent-skills --skill frontend-ui-engineering --agent gemini # Windsurf npx -y skills add addyosmani/agent-skills --skill frontend-ui-engineering --agent windsurf # Cline npx -y skills add addyosmani/agent-skills --skill frontend-ui-engineering --agent cline ``` ## Qué hace - Estructura componentes con colocación de archivos, composición sobre configuración y separación de datos y presentación - Aplica accesibilidad WCAG 2.1 AA: navegación por teclado, ARIA, gestión de foco, estados vacíos y de error - Evita la 'estética de IA' (morados, gradientes, esquinas exageradas) usando el sistema de diseño real del proyecto - Define patrones de gestión de estado según el caso (local, contexto, URL, servidor, store global) - Implementa diseño responsive mobile-first y estados de carga con skeletons y actualizaciones optimistas ## Cuándo usarla - Construir nuevos componentes o páginas de UI - Modificar interfaces de usuario existentes - Implementar layouts responsive o añadir interactividad/gestión de estado - Corregir problemas visuales o de UX ## Qué la activa - "Crea un componente de lista de tareas accesible con estados de carga y vacío" - "Haz que este layout sea responsive en móvil, tablet y desktop" - "Revisa este formulario para que cumpla con WCAG 2.1 AA" - "Rediseña esta interfaz para que no parezca generada por IA" ## Archivos - SKILL.md — 10 KB ## SKILL.md Reproducido tal cual desde addyosmani/agent-skills bajo MIT. Esta sección es el documento original y está en inglés. # Frontend UI Engineering ## Overview Build production-quality user interfaces that are accessible, performant, and visually polished. The goal is UI that looks like it was built by a design-aware engineer at a top company — not like it was generated by an AI. This means real design system adherence, proper accessibility, thoughtful interaction patterns, and no generic "AI aesthetic." ## When to Use - Building new UI components or pages - Modifying existing user-facing interfaces - Implementing responsive layouts - Adding interactivity or state management - Fixing visual or UX issues ## Component Architecture ### File Structure Colocate everything related to a component: ``` src/components/ TaskList/ TaskList.tsx # Component implementation TaskList.test.tsx # Tests TaskList.stories.tsx # Storybook stories (if using) use-task-list.ts # Custom hook (if complex state) types.ts # Component-specific types (if needed) ``` ### Component Patterns **Prefer composition over configuration:** ```tsx // Good: Composable Tasks // Avoid: Over-configured } /> ``` **Keep components focused:** ```tsx // Good: Does one thing export function TaskItem({ task, onToggle, onDelete }: TaskItemProps) { return (
  • onToggle(task.id)} /> {task.title}
  • ); } ``` **Separate data fetching from presentation:** ```tsx // Container: handles data export function TaskListContainer() { const { tasks, isLoading, error } = useTasks(); if (isLoading) return ; if (error) return ; if (tasks.length === 0) return ; return ; } // Presentation: handles rendering export function TaskList({ tasks }: { tasks: Task[] }) { return (
      {tasks.map(task => )}
    ); } ``` ## State Management **Choose the simplest approach that works:** ``` Local state (useState) → Component-specific UI state Lifted state → Shared between 2-3 sibling components Context → Theme, auth, locale (read-heavy, write-rare) URL state (searchParams) → Filters, pagination, shareable UI state Server state (React Query, SWR) → Remote data with caching Global store (Zustand, Redux) → Complex client state shared app-wide ``` **Avoid prop drilling deeper than 3 levels.** If you're passing props through components that don't use them, introduce context or restructure the component tree. ## Design System Adherence ### Avoid the AI Aesthetic AI-generated UI has recognizable patterns. Avoid all of them: | AI Default | Why It Is a Problem | Production Quality | |---|---|---| | Purple/indigo everything | Models default to visually "safe" palettes, making every app look identical | Use the project's actual color palette | | Excessive gradients | Gradients add visual noise and clash with most design systems | Flat or subtle gradients matching the design system | | Rounded everything (rounded-2xl) | Maximum rounding signals "friendly" but ignores the hierarchy of corner radii in real designs | Consistent border-radius from the design system | | Generic hero sections | Template-driven layout with no connection to the actual content or user need | Content-first layouts | | Lorem ipsum-style copy | Placeholder text hides layout problems that real content reveals (length, wrapping, overflow) | Realistic placeholder content | | Oversized padding everywhere | Equal generous padding destroys visual hierarchy and wastes screen space | Consistent spacing scale | | Stock card grids | Uniform grids are a layout shortcut that ignores information priority and scanning patterns | Purpose-driven layouts | | Shadow-heavy design | Layered shadows add depth that competes with content and slows rendering on low-end devices | Subtle or no shadows unless the design system specifies | ### Spacing and Layout Use a consistent spacing scale. Don't invent values: ```css /* Use the scale: 0.25rem increments (or whatever the project uses) */ /* Good */ padding: 1rem; /* 16px */ /* Good */ gap: 0.75rem; /* 12px */ /* Bad */ padding: 13px; /* Not on any scale */ /* Bad */ margin-top: 2.3rem; /* Not on any scale */ ``` ### Typography Respect the type hierarchy: ``` h1 → Page title (one per page) h2 → Section title h3 → Subsection title body → Default text small → Secondary/helper text ``` Don't skip heading levels. Don't use heading styles for non-heading content. ### Color - Use semantic color tokens: `text-primary`, `bg-surface`, `border-default` — not raw hex values - Ensure sufficient contrast (4.5:1 for normal text, 3:1 for large text) - Don't rely solely on color to convey information (use icons, text, or patterns too) ## Accessibility (WCAG 2.1 AA) Every component must meet these standards: ### Keyboard Navigation ```tsx // Every interactive element must be keyboard accessible // ✓ Focusable by default
    Click me
    // ✗ Not focusable
    onKeyDown={e => { if (e.key === 'Enter') handleClick(); if (e.key === ' ') e.preventDefault(); }} onKeyUp={e => { if (e.key === ' ') handleClick(); }}> Click me
    ``` ### ARIA Labels ```tsx // Label interactive elements that lack visible text // Label form inputs // Or use aria-label when no visible label exists ``` ### Focus Management ```tsx // Move focus when content changes function Dialog({ isOpen, onClose }: DialogProps) { const closeRef = useRef(null); useEffect(() => { if (isOpen) closeRef.current?.focus(); }, [isOpen]); // Trap focus inside dialog when open return ( {/* dialog content */} ); } ``` ### Meaningful Empty and Error States ```tsx // Don't show blank screens function TaskList({ tasks }: { tasks: Task[] }) { if (tasks.length === 0) { return (

    No tasks

    Get started by creating a new task.

    ); } return
      ...
    ; } ``` ## Responsive Design Design for mobile first, then expand: ```tsx // Tailwind: mobile-first responsive
    ``` Test at these breakpoints: 320px, 768px, 1024px, 1440px. ## Loading and Transitions ```tsx // Skeleton loading (not spinners for content) function TaskListSkeleton() { return (
    {Array.from({ length: 3 }).map((_, i) => (
    ))}
    ); } // Optimistic updates for perceived speed function useToggleTask() { const queryClient = useQueryClient(); return useMutation({ mutationFn: toggleTask, onMutate: async (taskId) => { await queryClient.cancelQueries({ queryKey: ['tasks'] }); const previous = queryClient.getQueryData(['tasks']); queryClient.setQueryData(['tasks'], (old: Task[]) => old.map(t => t.id === taskId ? { ...t, done: !t.done } : t) ); return { previous }; }, onError: (_err, _taskId, context) => { queryClient.setQueryData(['tasks'], context?.previous); }, }); } ``` ## See Also For detailed accessibility requirements and testing tools, see `../../references/accessibility-checklist.md`. ## Common Rationalizations | Rationalization | Reality | |---|---| | "Accessibility is a nice-to-have" | It's a legal requirement in many jurisdictions and an engineering quality standard. | | "We'll make it responsive later" | Retrofitting responsive design is 3x harder than building it from the start. | | "The design isn't final, so I'll skip styling" | Use the design system defaults. Unstyled UI creates a broken first impression for reviewers. | | "This is just a prototype" | Prototypes become production code. Build the foundation right. | | "The AI aesthetic is fine for now" | It signals low quality. Use the project's actual design system from the start. | ## Red Flags - Components with more than 200 lines (split them) - Inline styles or arbitrary pixel values - Missing error states, loading states, or empty states - No keyboard navigation testing - Color as the sole indicator of state (red/green without text or icons) - Generic "AI look" (purple gradients, oversized cards, stock layouts) ## Verification After building UI: - [ ] Component renders without console errors - [ ] All interactive elements are keyboard accessible (Tab through the page) - [ ] Screen reader can convey the page's content and structure - [ ] Responsive: works at 320px, 768px, 1024px, 1440px - [ ] Loading, error, and empty states all handled - [ ] Follows the project's design system (spacing, colors, typography) - [ ] No accessibility warnings in dev tools or axe-core ## Dónde encaja - Categoría: [Diseño y UI](https://skillsagentes.com/categorias/diseno-ui.md) — Sistemas de diseño, trabajo con componentes y acabado visual. - Creador: [addyosmani](https://skillsagentes.com/creators/addyosmani.md) — 5 skills en el directorio - [Todas las skills](https://skillsagentes.com/skills.md) - [Ranking de instalaciones](https://skillsagentes.com/ranking.md) ## Otras skills del mismo repositorio - [Security And Hardening](https://skillsagentes.com/skills/addyosmani/agent-skills/security-and-hardening.md): Endurece el código contra vulnerabilidades. Úsalo al manejar entrada de usuario, autenticación, almacenamiento de datos, integraciones externas o datos personales (GDPR, CCPA). - [Spec Driven Development](https://skillsagentes.com/skills/addyosmani/agent-skills/spec-driven-development.md): Crea especificaciones antes de programar: úsalo al iniciar un proyecto o cambio sin spec, cuando los requisitos son ambiguos, o cuando un requerimiento debe descomponerse en un mapa de módulos. - [Code Review And Quality](https://skillsagentes.com/skills/addyosmani/agent-skills/code-review-and-quality.md): Realiza revisión de código en múltiples ejes. Úsalo antes de fusionar cualquier cambio, sea escrito por ti, otro agente o una persona, para evaluar la calidad antes de entrar a la rama principal. - [Planning And Task Breakdown](https://skillsagentes.com/skills/addyosmani/agent-skills/planning-and-task-breakdown.md): Divide el trabajo en tareas ordenadas. Úsalo cuando tengas un spec o requisitos claros y necesites descomponer el trabajo en tareas implementables, estimar alcance o paralelizar. - [Observability And Instrumentation](https://skillsagentes.com/skills/addyosmani/agent-skills/observability-and-instrumentation.md): Instrumenta el código para que el comportamiento en producción sea visible y diagnosticable, con logging, métricas, tracing y alertas. --- Skills Agentes · [Índice de páginas en markdown](https://skillsagentes.com/sitemap.md) · [Inicio](https://skillsagentes.com/index.md)