dev-frontend/SKILL.md
MUST USE for any frontend, web UI, or visual implementation work — building, styling, or redesigning pages/components, responsive layouts, motion, component architecture, and production-surface polish. Triggers: frontend, UI, component, CSS, responsive, animation, React, Vue, Svelte, Tailwind, layout, styling, redesign, mockup, anti-slop, 프론트엔드, UI 작업, 반응형, 디자인 수정.
npx skillsauth add lidge-jun/cli-jaw-skills dev-frontendInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Build distinctive, production-grade interfaces that fit the product domain, locale, interaction model, and real visual evidence. This skill has modular references for specialized guidance — read the relevant ones before coding. It activates by change surface whenever the work is primarily frontend, UI, styling, responsive layout, or animation.
Role separation: For design judgment — typography/color/layout direction, UX decision gates, product personalities, or vague visual briefs — load
dev-uiux-designfirst. This skill implements the chosen direction;dev-uiux-designmakes the design decisions. Implementation anti-slop tell detection and enforcement stays here (concrete rendered tells in UI); design-level concept/taste judgment lives indev-uiux-design.
Role boundary (canonical — identical in
devanddev-uiux-design):devowns universal process, evidence, and safety rules.dev-uiux-designowns design intent, direction, and concept judgment.dev-frontendowns concrete frontend implementation and rendered tell enforcement. Anti-slop has three layers:dev= output/process hygiene (FAMILY-SLOP-01),dev-uiux-design= concept/taste judgment (is this direction generic or domain-wrong?),dev-frontend= rendered implementation tell detection and removal (FE-AI-TELL-01).
C0/C1 work (small local patches): See
dev§0.0 Work Classifier + §0.1 Patch Fast-Path before reading references.
devis canonical:dev§0.2 Rule Classes, §3 Verification Gate, and §5 Safety Rules apply to all work governed by this skill.
| File | When to Read | What It Covers |
| ----------------------------------------- | ------------------------------------ | --------------------------------------------------------------------------------- |
| references/core/crud-ui.md | C2 list/detail/form product screens | State coverage (loading/empty/error/permission), forms, objective UX gates |
| references/core/anti-slop.md | New components or UI redesign | 2026 AI slop patterns, Korean slop, oversized text, fake assets, default UI smells |
| references/core/aesthetics.md | Implementing an established visual direction | Domain-correct typography, color, and composition constraints |
| references/core/product-density.md | Apps, tools, dashboards | Density profiles for landing, consumer app, SaaS, ops, finance, devtools |
| references/core/asset-requirements.md | Any public/product/visual surface | Required screenshots, images, diagrams, charts, generated bitmaps, or 3D assets |
| references/core/visual-verification.md | Changes affecting rendered layout | Screenshot, viewport, text fit, state, asset, and motion verification |
| references/core/korea-2026.md | Korean-first or Korea-facing UI | Korean service patterns, CJK typography, formats, mobile flows |
| references/core/ux-writing-ko.md | Korean UI copy | Natural Korean labels, error messages, tone, spacing, punctuation |
| references/core/soft-3d-asset-gates.md | 3D/miniature/character-like visuals | Toss-style soft 3D vs generic cute asset slop, domain gates |
| references/core/motion.md | Motion/animation needed | CSS animations, Framer Motion, scroll-driven, View Transitions, domain gates |
| references/core/iterative-design.md | Multi-round design | LLM convergence problem, Diverge→Kill→Mutate process, upgrade techniques |
| references/core/prototype-variants.md | Runnable design variants | ?variant= switchers, structurally distinct options, cleanup after winner selection |
| references/core/typography-wrapping.md | Heading/descriptor text changes | text-wrap: balance/pretty, short descriptor category (balance not pretty for 1-3 line text), ch units, rag control, Korean orphan prevention, -webkit-line-clamp conflict |
| references/core/logo-sections.md | Integration/partner logo display | Marquee CSS, static grid, orphan cell fix, grayscale treatment, no individual hover |
| references/core/brand-asset-sourcing.md | Brand logos in UI | Simple Icons/SVGL sourcing, AI agent strategy, placeholder hierarchy, legal guide |
| references/core/layout-discipline.md | Landing/marketing pages | Hero, eyebrow, section repetition, bento, zigzag, per-section responsive transforms |
| references/core/consistency-locks.md | Any multi-section page | Color, shape, theme consistency per page |
| references/core/responsive-viewport.md | Layout or breakpoint changes | Canonical breakpoints, page containment, container queries, responsive images, safe area, split-screen |
| references/core/mobile-ux.md | Consumer/landing pages with mobile traffic | Thumb zone, touch targets, sticky CTA, mobile section composition, bottom sheet, portrait media |
| references/core/seo-baseline.md | Public-facing sites, SSR/SSG | SEO meta, JSON-LD, robots.txt, GEO strategies, OG/Twitter cards |
| references/core/a11y-patterns.md | Interactive widgets, modals, forms | ARIA patterns, focus management, keyboard nav, screen reader testing |
| references/core/performance-budget.md | Launch / audit | CWV targets, bundle budgets, font loading, image optimization, build gates, browser connection budgets |
| references/core/preflight-full.md | Launch / audit | Full ~40-item pre-flight checklist (router §14 keeps only blocking gates) |
| references/core/theme-switching.md | Dark mode / theme | CSS custom properties toggle, FOWT prevention, transition, component checklist |
| references/core/i18n-global.md | Multi-language / RTL | RTL layout, pluralization, Intl API, locale switching, content expansion |
| See also: dev-uiux-design skill | Vague requests, onboarding, UX states | Intent discovery, design isms, product personalities, onboarding/empty/error patterns |
| references/stacks/react.md | React projects | Server Components, hooks, state, TanStack Query, shadcn/ui, performance |
| references/stacks/nextjs.md | Next.js projects | App Router, RSC, image optimization, data fetching, middleware |
| references/stacks/vanilla.md | HTML+CSS+JS (no framework) | Zero-dependency, viewport fitting, responsive CSS, progressive enhancement |
| references/stacks/svelte.md | Svelte/SvelteKit projects | Svelte 5 Runes, SvelteKit 2 routing/actions, snippets, migration from Svelte 4 |
| references/stacks/mobile-native.md | Native mobile app development | RN/Expo current pairing, Flutter 3.44, KMP, Swift 6, framework selection |
| references/stacks/astro.md | Astro projects | Islands architecture, multi-framework shell, content collections, SSG/SSR/hybrid |
Start with anti-slop.md, aesthetics.md, responsive-viewport.md, and visual-verification.md. Add domain/locale/stack references only when relevant.
For C2 ordinary app screens (form/table/list/detail), crud-ui.md alone suffices; add the style references above for marketing/visual surfaces or C3+ work.
dev-debugging.dev-devops.dev-scaffolding.dev-data.When frontend choices depend on current framework, design-system, browser API,
library behavior, browser-rendered source evidence, or package/source freshness,
read the active search skill and follow its source-fetch and evidence-status
rules before treating external material as proof.
STRICT: For render/executable artifacts (HTML, SVG, games, UI, charts), run the real renderer: headless browser, screenshot, canvas check, or equivalent. Observe the actual output yourself, fix what observation reveals, then re-run. Static parsing confirms well-formed files; it does not prove the artifact is visually or interactively correct. One clean observation is enough for unchanged state; do not re-render unchanged output just to repeat evidence.
Before designing or coding, classify the work:
| Decision | Options | Why It Matters | | --- | --- | --- | | Product surface | landing, app, dashboard, AI tool, public service, education, game, creative | Sets density, typography scale, asset requirements | | Locale | Korean-first, global/i18n, English-only | Sets CJK typography, copy, date/number formats | | Density | campaign, consumer app, productivity, SaaS, ops, finance, developer console | Prevents landing-page composition inside repeated-work tools | | Asset need | none, screenshot, product photo, diagram, chart, illustration, soft 3D, game asset | Prevents asset-free gradient/card UI | | Soft 3D/character gate | not allowed, subtle, primary | Prevents generic cute 3D/mascot slop | | Motion intensity | static, feedback-only, expressive, cinematic | Prevents cinematic motion in utility workflows |
Default rules:
korea-2026.md and ux-writing-ko.md.soft-3d-asset-gates.md.dev-uiux-design UX-LAZY-01 owns the gate).typography-wrapping.md. Dashboard table cells are excluded.When the user describes UI in vague terms (e.g. "접히는 거", "팝업 같은 거"):
<Name> — <what it does, why it fits>If the user already names a specific component, skip this step. Reference: component.gallery/components
For new React/Vue/Svelte/Next UI source files, prefer .tsx or typed component files when the repo supports TypeScript. Inherit dev TypeScript strict-compatibility rules.
If frontend structure is unclear, read existing source-of-truth docs/logs first, then document pages, components, routes, state stores, and build commands in the repo's existing SOT before broad implementation.
Two different kinds of rules live in this skill (see dev §0.2):
When the user cannot articulate a clear design direction, load
dev-uiux-designfirst. It owns intent discovery and direction selection. This section validates and implements the chosen direction; it does not choose independently.
Before coding, validate the design direction from dev-uiux-design (or a concrete brief):
When user intent is vague ("깔끔하게", "모던하게", "just make it look good"), read the dev-uiux-design skill and run the User Intent Discovery Protocol before making routing decisions.
If the user cannot answer these questions, use the dev-uiux-design skill's structured preference elicitation flow. Offer product references ("Notion 느낌? Linear 느낌?") and visual comparisons.
Concept pass before code (pointer — canonical: dev-uiux-design UX-CONCEPT-GEN-01):
for C2+ expressive or brand-visible surfaces, load the design skill's concept-generation
protocol before implementation. It owns direction discovery, concept branching, synthesis,
and direction lock. Resume here after DESIGN.md is locked.
Intentionality over intensity. Bold maximalism, refined minimalism, dense utility, and friendly consumer UI can all work when they match the domain.
Adjust these dials based on what's being built. Present to user if unclear.
| Dial | Default | Range | Meaning | | ---------------- | :-----: | :---: | ------------------------------------ | | DESIGN_VARIANCE | 5 | 1-10 | 1=symmetric utility, 10=asymmetric art | | MOTION_INTENSITY | 4 | 1-10 | 1=static, 10=cinematic choreography | | VISUAL_DENSITY | 5 | 1-10 | 1=art gallery airy, 10=cockpit dense |
After Design Read, set dials per dev-uiux-design §2 Dial Setting.
Product density profile (D1-D8 in references/core/product-density.md) sets component class; VISUAL_DENSITY (1-10) sets spacing within that class. These are orthogonal axes.
Adapt dynamically based on user requests. Dashboard → density up. Portfolio → variance up. Data tool → motion down. Korean app/tool surfaces usually need higher density and clearer hierarchy, not oversized hero text.
Read references/core/aesthetics.md for full guidelines. Summary:
text-wrap: balance on all headings AND short descriptors (hero subtitle, card description, caption — anything 1-3 lines). Use text-wrap: pretty only on body paragraphs (4+ lines). pretty has no effect on short text and will leave Korean orphans like "합니다." or "화." on a line alone. See typography-wrapping.md for full rules.references/core/motion.md. One well-choreographed page load > 10 scattered effects.Rule classes (dev §0.2): items below are DEFAULT — deviate with a stated reason; concrete values and palettes are STYLE_SAMPLE (§1.5); the emoji-as-UI-icon ban is the only STRICT item.
Read references/core/anti-slop.md for full rules. Key standards:
anti-slop.md § Gradient Budgetanti-slop.md § One-Note Theme Bananti-slop.md § Self-Describing Meta Copylayout-discipline.md § Bento Compositionanti-slop.md § Emoji Slopanti-slop.md § Premium-Consumer Palette Banreferences/core/layout-discipline.mdreferences/core/consistency-locks.md#0a0a0a, #111) — pure #000000 lacks depthresponsive-viewport.mdmax-w-[1400px] mx-auto or equivalent wrapper. Content stretching to viewport edges on wide monitors is a layout bugmobile-ux.mdtext-wrap, no max-width in ch) as a slop signal — see typography-wrapping.mdtext-wrap: pretty instead of balance as a slop signal — pretty does nothing on 1-3 line text, especially Koreanbrand-asset-sourcing.mdtransform and opacity only — layout properties cause jankwill-change sparingly (remove after animation); z-index only for systemic layersreferences/core/performance-budget.md (this skill owns browser-side budgets;
server connection lifecycle is owned by dev-backend §1)<button>, <nav>, <main>); keyboard navigation for all interactive elementsprefers-reduced-motionaria-expanded/
aria-haspopup/aria-activedescendant; tab order follows visual flowa11y-patterns.mdFull guidance moved to references/stacks/react.md § Behavior Rules. Router decisions:
| Decision | Rule |
|----------|------|
| New custom hook | Only when it owns reusable behavior (subscription lifecycle, async state machine, shared form-field behavior) — never a thin useState alias |
| Memoization | Measure first; with React Compiler enabled, remove defensive memo/useMemo/useCallback unless semantics require identity |
| Perf strategy | Pure components, local state, correct state ownership (§12 table), split expensive client islands |
| Forms | Simple → controlled + schema (Zod); complex/multi-step → react-hook-form + resolver; field errors with role="alert" |
Use this section when modernizing or creating React/Next/Vite frontends. Prefer project
conventions first. Version-detail depth lives in references/stacks/react.md / nextjs.md.
<Activity> (stable): state-preserving hidden UI (tabs, drawers, route shells) — not for security hiding or active subscriptions.--webpack).cacheComponents: true): dynamic by default; cache only explicit use cache + cacheLife + cacheTag; PPR is expressed through Cache Components (the old experimental.ppr flag is gone).Prefer native CSS before JS layout observers/animation libraries: container queries,
:has(), subgrid (all Baseline widely-available), View Transitions (same-document,
Baseline 2025 newly-available — provide fallback for cautious audiences),
text-wrap: balance/pretty, dvh/svh/lvh units, logical properties, shallow CSS
nesting. Tailwind v4 (CSS-first config, theme variables). Record Baseline status
(widely/newly/caution) for each modern feature used and decide fallback per audience.
rolldown-vite is only a
Vite 7 migration bridge). Node 20.19+/22.12+; Baseline target Chrome/Edge 111,
Firefox 114, Safari 16.4.Prefer dev servers that surface browser/runtime errors to the CLI/agent before relying on static review: Vite 8 forwards browser console to the dev server (auto-activates for coding agents); Next 16 ships DevTools MCP. Wire these before debugging rendered behavior.
Before adding state, classify it:
| State type | Owner | Default tool |
|---|---|---|
| render-local UI | nearest component | useState / useReducer |
| derived | render calculation | expression / useMemo if expensive |
| form draft | form boundary | native form, React Hook Form, TanStack Form |
| server/cache | server/cache layer | RSC, Next cache, TanStack Query, SWR |
| URL/navigation | router | path params, search params |
| global client UI | external store | Zustand, Jotai, context |
| optimistic mutation | mutation boundary | useOptimistic, mutation library |
| AI stream | conversation boundary | append-only message model + stream status |
Rules: Do not store derived state just to sync with Effect. Do not put server state in Zustand. Do not put URL-shareable state only in component state. Keep optimistic state reversible.
Before inventing design tokens, check:
grep -r "material-ui\|@mui\|carbon-components\|@carbon\|@fluentui\|govuk-frontend\|uswds" package.json)find . -name "tokens.*" -o -name "theme.*" -o -name "design-system*")If YES to any: use the official package. Do not recreate CSS by hand.
| System | Package | Import |
|--------|---------|--------|
| Material | @mui/material | import { Button } from '@mui/material' |
| Carbon | @carbon/react | import { Button } from '@carbon/react' |
| Fluent | @fluentui/react | import { Button } from '@fluentui/react-components' |
| GOV.UK | govuk-frontend | import 'govuk-frontend/dist/govuk/all.scss' |
| USWDS | @uswds/uswds | import '@uswds/uswds/css/uswds.css' |
If NO: proceed with dev-uiux-design/references/design-system-bootstrap.md.
components.json, aliases, tokens, and registry conventionsFor AI-native interfaces (chat, agent, copilot), design explicit states: empty → prompt ready → submitted → streaming → tool call → result → complete → feedback. Never fake streaming, citations, or tool calls.
Wrap each major section (not the whole app); boundary renders friendly message + retry +
report link; log to monitoring in componentDidCatch; never show stack traces to users.
Error hierarchy: field-inline → form-summary → section Error Boundary → page error.tsx
→ root boundary (offline/crash page).
Gates apply to production surfaces (dev §0.4 shared definition); prototypes and
internal demos are exempt unless production polish is requested.
Full ~40-item checklist: references/core/preflight-full.md — run it for launches
and audits. The blocking gates below are the minimum for every production delivery:
min-h-[100dvh] + page containmentword-break: keep-all + orphan screenshot checkperformance-budget.mdreferences/stacks/)| Responsibility | Owner |
|---------------|-------|
| Response envelope shape (success, data, error, meta) | dev-backend defines, dev-testing verifies |
| Consumer-side fixture alignment | Frontend — keep mocks in sync with fixtures/contracts/; payload changes update contract tests BEFORE merging (dev-testing §3.5) |
| Error display mapping | Frontend maps error.code to messages; never parse error.message for logic |
| CSP/XSS/token storage | Policy: dev-security §5/§2. Frontend implements: no inline scripts/eval; sanitize dangerouslySetInnerHTML (DOMPurify) or avoid; httpOnly cookies over localStorage; never flash protected content |
Playwright smoke validates rendered flows AFTER API + contract tests pass; frontend unit
tests mock the same envelope shape as dev-backend §5; error-code changes update
frontend error-mapping tests.
tools
Use only on the Codex CLI for native image generation or image editing without an API key. Save final PNG files under ~/.cli-jaw/uploads, report web-ready absolute-path markdown, and send to Telegram or Discord only when explicitly requested.
tools
Ranked repository structure map via `cli-jaw map`. Use for codebase overview, structure map, symbol overview, unfamiliar codebase exploration, architecture orientation. Triggers: repo map, structure map, codebase overview, 와꾸, project structure, unfamiliar code.
tools
cli-jaw Design workspace: create, preview, run, and export design pages from the right sidebar. Covers panel UX, direct-write workflow, artifact lifecycle, wireframe generation, design system, and Open Design adapter.
development
MUST USE for infrastructure and delivery work — container builds, deploy pipelines, Kubernetes, Infrastructure as Code, SRE foundations, edge/serverless, ML infrastructure. Triggers: Dockerfile, K8s manifests, CI/CD pipeline, Terraform/IaC, release/deploy, devops/infra/deploy or release_cd task_tags.