ui-from-mockup
Convierte una maqueta HTML/CSS hi-fi de docs/diseno/ en un componente Angular del proyecto: spartan.ng (helm) + utilidades Tailwind con los tokens del proyecto, standalone OnPush, textos con i18n, acc
SKILL.md.claude/skills/ui-from-mockup/SKILL.md
GitHubui-from-mockup — Runcriticon
Traduce una maqueta hi-fi de docs/diseno/ a componente(s) Angular siguiendo las convenciones de frontend-feature-dev. La maqueta manda en layout, jerarquía y contenido; spartan.ng (helm en src/app/ui/ + brain) manda en componentes y accesibilidad, y los tokens de src/styles.css en theming. No se copia el CSS de la maqueta: se reproduce su diseño con utilidades Tailwind y los tokens del proyecto.
Cuándo usar esta skill
- Construir una pantalla del MVP que tiene maqueta en
docs/diseno/. - Rehacer un componente que se desvió de su maqueta.
- NO para pantallas sin maqueta: primero se diseña la maqueta (proceso de diseño del proyecto), luego se construye.
Argumentos
/ui-from-mockup {maqueta} [{feature}]
{maqueta} es el nombre del fichero sin extensión (ej. vista-hoy-alumno, editor-plan-semanal, constructor-grupos). Si no se pasa, lista las maquetas disponibles con ls docs/diseno/*.html y pregunta. {feature} es la feature Angular destino; si no existe aún, invocar primero /frontend-feature-dev para el scaffold y construir encima.
Workflow
1. Leer la fuente
docs/diseno/README.md— convenciones de las maquetas.docs/diseno/{maqueta}.html— la maqueta completa: estructura, jerarquía visual, estados (hover, vacío, error) y cualquier comentario embebido.- Si hay variantes (
editor-plan-semanal.htmlyeditor-plan-semanal-combo.html), preguntar cuál es la vigente antes de continuar.
2. Inventario de la maqueta
Antes de escribir código, producir un inventario corto:
- Regiones de layout (header, panel lateral, grid de cards, modal...).
- Componentes identificados → su equivalente helm/brain (tabla de mapeo abajo).
- Estados representados (vacío, cargando, error, éxito) — y los que faltan, que habrá que añadir (skeleton screens, ADR-0012 D20).
- Textos visibles — todos saldrán con
i18n, vocabulario del glosario. - Interacciones (drag-drop, filtros en vivo, modales) → CDK correspondiente.
3. Mapeo maqueta → spartan (helm en src/app/ui/)
Consultar el inventario real de componentes copiados en frontend/src/app/ui/ — si el componente no está copiado aún, se añade con ng g @spartan-ng/cli:ui {componente}.
| En la maqueta | En el componente |
|---|---|
| Botones | hlmBtn (variante según jerarquía visual: default/outline/ghost/link) |
| Cards | helm card |
| Inputs, selects, textareas | helm input/label/form-field + ReactiveForms tipados |
| Tablas / listados densos | helm table o lista propia con utilidades, según densidad |
| Chips / tags | helm badge (los tags del dominio) o componente propio sobre brain |
| Modales | helm/brain dialog con focus management (foco al primer control, devolución al disparador) |
| Fechas | helm date-picker |
| Toggles, checkboxes | helm switch / checkbox |
| Alertas / callouts | helm alert (variantes de éxito/error con los tokens del proyecto) |
| Toasts | ToastService propio (envuelve helm sonner) |
| Drag-drop (editor plan) | @angular/cdk/drag-drop |
| Navegación / shell | Ya existe en layouts/ — la maqueta solo aporta el contenido |
4. Reglas de traducción
- Colores, espaciado, tipografía: NUNCA copiar valores hex de la maqueta. Usar los tokens CSS del proyecto (
var(--primary),var(--muted-foreground), …) y la escala de Tailwind. Si la maqueta usa un color que los tokens no tienen, es una conversación de theming (src/styles.css), no un hardcode en el componente. - Estructura: utilidades Tailwind en el template; grid/flex propios solo para el layout de página; SCSS residual solo si una utilidad no llega (justificado en PR);
::ng-deepprohibido. - Textos: todos con
i18n/$localize, castellano del glosario (docs/glosario.md). La maqueta puede tener textos provisionales — el glosario manda sobre la maqueta en vocabulario. - Lo que la maqueta no enseña: estados de carga (skeleton con la forma del contenido), errores 4xx (patrón ADR-0012 D19), y permisos (
*hasPermissionpara acciones que el rol no puede ejecutar). - Datos: el componente consume su servicio Signals; nada de datos hardcodeados de la maqueta fuera de los specs.
5. Accesibilidad
Si la pantalla es crítica (login/activación, vista hoy, editor plan, reportar sesión, vista salud, gestión alumnos — ADR-0012 D6):
- Test Playwright + axe-core obligatorio.
- Test de flujo completo solo con teclado (Tab/Enter/Esc/flechas).
- Verificar jerarquía de headings y labels de formulario que la maqueta solo insinúa visualmente.
6. Verificación
cd frontend
npm run build # compila y respeta bundle budget
npm run lint
npm test -- --testPathPattern={feature}
npx playwright test --grep "{feature}" # si pantalla crítica
Y la comprobación que ningún comando hace: abrir la maqueta y el componente lado a lado (npm start + docs/diseno/{maqueta}.html en el navegador) y comparar jerarquía visual, no píxeles.
Antipatrones
- Copiar el CSS de la maqueta al componente — la maqueta es referencia visual, no código fuente.
- Inventar layout o elementos que la maqueta no tiene "porque quedaría mejor" — eso se propone al proceso de diseño, no se cuela en el PR.
- Reproducir la maqueta con
<div>estilizados cuando existe el componente helm/brain equivalente (se pierde la a11y de serie). - Construir pantalla sin maqueta usando esta skill como excusa.
- Dejar los textos de la maqueta sin marcar con
i18n.
Referencias
docs/diseno/README.md— convenciones de las maquetas- frontend-feature-dev y sus referencias (componentes, convenciones, testing)
- ADR-0012 D1-D8 (spartan.ng, theming con tokens CSS, Tailwind, a11y), D20 (skeleton/optimistic UI)
docs/glosario.md— el vocabulario manda sobre los textos de la maqueta