KeiSeiKit-1.0/skills/frontend-design/SKILL.md
Parfii-bot a4e667de10 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

144 lines
6.5 KiB
Markdown

---
name: frontend-design
description: Use when designing web UI before coding — anti-AI-slop aesthetic philosophy, typography pairing, color theory, spatial composition, motion guidelines, design archetypes. Triggers on "design", "UI design", "frontend design", "anti-slop", "make it look premium", "design thinking".
arguments:
- name: archetype
description: "Archetype: editorial, swiss, brutalist, minimal, maximalist, retro-futuristic, organic, industrial, art-deco, lo-fi (auto-suggest if omitted)"
required: false
- name: differentiator
description: "The ONE thing someone will remember about this design"
required: false
---
# Frontend Design — Think Before You Code
> Design-first, code-second. Every implementation starts with a design decision, not a div.
## Phase Gate (MANDATORY before writing any UI code)
1. **Purpose** — What problem? Who uses it? (1 sentence)
2. **Archetype** — Pick from 10 below (sets the aesthetic DNA)
3. **Differentiator** — "The one thing someone remembers" (1 sentence)
4. **Anti-references** — Name 3 sites/patterns this is NOT
5. **Tokens** — Define palette + fonts + spacing in CSS variables
Skip this gate = skip the skill. Code without design intent = AI slop.
## Hard Bans (Anti-AI-Slop)
**Typography:**
- Inter, Roboto, Arial, system font stacks
- Space Grotesk (overused in AI-generated sites)
- Same font for heading and body
**Color:**
- Purple gradients on white backgrounds
- Evenly distributed palettes (everything gets equal weight)
- Pure #000 or #fff without tinting
**Layout:**
- Centered card grids as default composition
- Hero → Cards → Testimonials → Footer (the template trap)
- Even spacing everywhere (no rhythm)
**Motion:**
- `linear` easing on UI transitions
- `scale(0)` animation origins
- Default `ease` without custom cubic-bezier
## 10 Archetypes
| # | Name | Typography | Color | Layout | Motion |
|---|------|-----------|-------|--------|--------|
| 1 | **Editorial** | Serif display + sans body | Warm neutrals + 1 accent | Asymmetric columns, pull quotes | Subtle parallax, text reveals |
| 2 | **Swiss** | Geometric sans (Helvetica Now, Neue Haas) | Black/white + 1 primary | Strict grid, mathematical spacing | Minimal, precision timing |
| 3 | **Brutalist** | Monospace or system | Raw, high contrast | Exposed structure, raw HTML aesthetic | Glitch, intentional jank |
| 4 | **Minimal** | 1 refined sans, extreme weight contrast | 2 colors max + neutral | Massive whitespace, single column | Fade only, ultra-slow |
| 5 | **Maximalist** | Mixed display fonts, decorative | Saturated, 4+ colors | Layered, overlapping, collage | Everything moves, scroll-driven |
| 6 | **Retro-Futuristic** | Futuristic display + mono | Neon on dark, CRT glow | Scanlines, terminal aesthetic | Typing effects, flicker |
| 7 | **Organic** | Rounded sans + handwritten accent | Earth tones, muted | Curved containers, blob shapes | Fluid, spring physics |
| 8 | **Industrial** | Condensed bold sans | Dark grays + safety yellow/orange | Dense info, data-heavy | Mechanical, step-based |
| 9 | **Art Deco** | Geometric display, high contrast weight | Gold/brass + deep navy/black | Symmetrical, ornamental borders | Elegant reveals, fade + scale |
| 10 | **Lo-Fi** | Hand-drawn or pixel font | Paper/notebook palette | Sketch-like borders, tape/sticker elements | Wobbly, imperfect |
## Typography Rules
- Max 2 fonts: 1 display (headings) + 1 body (text)
- Use `clamp()` for fluid scaling: `font-size: clamp(1rem, 2.5vw, 1.5rem)`
- Body `line-height`: 1.4-1.6 | Display `line-height`: 1.0-1.2
- 3-5 clear hierarchy levels with dramatic size contrast (4:1 heading-to-body)
- Tune `letter-spacing` per size: tighter for large, looser for small caps
- `font-feature-settings` for ligatures, tabular numbers where needed
## Color System (OKLCH)
```css
@theme {
--brand-hue: 250;
--color-primary: oklch(0.6 0.2 var(--brand-hue));
--color-surface: oklch(0.995 0.005 var(--brand-hue));
--color-text: oklch(0.15 0.02 var(--brand-hue));
--color-muted: oklch(0.55 0.01 var(--brand-hue));
--color-accent: oklch(0.7 0.25 calc(var(--brand-hue) + 30));
--color-border: oklch(0.9 0.01 var(--brand-hue));
}
```
**60-30-10 rule:** 60% dominant (surface/bg), 30% secondary (text/containers), 10% accent (CTAs, highlights).
OKLCH = perceptually uniform. One `--brand-hue` controls entire palette.
## Spatial Composition
- Consistent scale: `--space-xs: 0.25rem` through `--space-3xl: 4rem`
- Whitespace is structural, not leftover
- At least ONE grid-breaking moment per page (full-bleed, overlap, offset)
- 8px base grid for alignment
- Dramatic rhythm changes between sections (dense → spacious → dense)
## Visual Depth & Texture
- Noise/grain via SVG `<feTurbulence>` filter or CSS pseudo-element
- Multi-value `box-shadow` for realistic depth
- `backdrop-filter: blur()` for glass effects
- `clip-path` for non-rectangular shapes
- Background: gradients, patterns, grain — never flat solid white
## Motion Guidelines
- Custom `cubic-bezier()` per element — never default `ease`
- Staggered page-load: 50-100ms increments between elements
- Duration: productivity UI <300ms, creative 200-500ms
- Spring physics for interactive elements (bounce: 0, no jello)
- Exit animations subtler than enter
- `prefers-reduced-motion`: replace motion with fade, keep <200ms
- Keyboard-initiated actions: NO animation
### Enter Animation Recipe (Motion/Framer Motion)
```jsx
initial={{ opacity: 0, y: 8, filter: "blur(4px)" }}
animate={{ opacity: 1, y: 0, filter: "blur(0px)" }}
transition={{ type: "spring", duration: 0.45, bounce: 0 }}
```
## Output Contract
Every frontend-design invocation MUST produce:
1. **Stated direction** archetype + differentiator + anti-references
2. **Design tokens** CSS custom properties (colors, type, spacing)
3. **Typography selection** 2 fonts with Google Fonts / Fontsource links
4. **Working code** implementation matching the stated direction
5. **Responsiveness** mobile-first, tested at 375px and 1280px
## The Blur Test
At 20% visibility, the layout silhouette should be distinguishable from anti-references. If blurred Stripe and blurred Your-Page look the same composition is not distinctive.
## Diverge-Kill-Mutate
If output feels generic:
1. **Diverge** generate 3 structurally different variants (different spatial logic, not color swaps)
2. **Kill** binary: alive or dead. NO blending (blending = averaging = AI slop)
3. **Mutate** within survivor, introduce named "breaks" (violations of convention)
4. **Repeat** each cycle moves further from center