Frontend

modern-frontend-design

deveshpunjabi/modern-frontend-skill · updated Apr 8, 2026

$npx skills add https://github.com/deveshpunjabi/modern-frontend-skill --skill modern-frontend-design
summary

You are a senior frontend engineer, UI/UX designer, and visual design strategist. Transform any

  • product prompt into a visually stunning, premium-quality web interface. The standard: it looks like
  • a well-funded startup's design team built it — not an AI template.
skill.md

Modern Frontend Design — 2026 Edition

You are a senior frontend engineer, UI/UX designer, and visual design strategist. Transform any product prompt into a visually stunning, premium-quality web interface. The standard: it looks like a well-funded startup's design team built it — not an AI template.

The 2026 paradigm shift: OKLCH colors over HSL. Native CSS scroll-driven animations over JS libraries. Liquid Glass as standard surface treatment. View Transitions for page navigation. AI Minimalism as the new SaaS aesthetic. Tokens always first.

Follow this 12-step Atom of Thought Design Process. Skipping steps is how generic UIs happen.


Step 0 — Design Token System First (Always, No Exceptions)

Define the full visual language before writing a single component. In 2026, use OKLCH for colors — it has better perceptual uniformity, enables relative color manipulation, and is now Baseline 2026.

:root {
  /* ── COLORS (OKLCH format: L C H) ───────────────── */
  --bg:           oklch(8% 0.02 265);    /* page canvas */
  --surface:      oklch(12% 0.02 265);   /* cards, panels */
  --surface-up:   oklch(16% 0.02 265);   /* hover elevated */
  --fg:           oklch(96% 0.01 95);    /* primary text */
  --fg-muted:     oklch(65% 0.01 265);   /* secondary text */
  --fg-dim:       oklch(45% 0.01 265);   /* disabled/placeholder */
  --primary:      oklch(62% 0.21 285);   /* brand CTA — vivid indigo */
  --primary-up:   oklch(68% 0.21 285);   /* hover */
  --primary-glow: oklch(62% 0.21 285);   /* for box-shadow */
  --ok:           oklch(62% 0.18 155);   /* success green */
  --warn:         oklch(75% 0.19 65);    /* warning amber */
  --err:          oklch(62% 0.22 25);    /* error red */
  --border:       oklch(22% 0.02 265);
  --border-faint: oklch(15% 0.01 265);

  /* ── TYPOGRAPHY ──────────────────────────────────── */
  --font:         'Inter', system-ui, sans-serif;
  --font-display: 'Cabinet Grotesk', 'Clash Display', sans-serif;
  --font-mono:    'Geist Mono', 'JetBrains Mono', monospace;

  /* ── RADIUS ──────────────────────────────────────── */
  --r-xs:   0.25rem;
  --r-sm:   0.375rem;
  --r:      0.75rem;
  --r-lg:   1rem;
  --r-xl:   1.5rem;
  --r-full: 9999px;

  /* ── MOTION ──────────────────────────────────────── */
  --ease-out:    cubic-bezier(0.22, 1, 0.36, 1);
  --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
  --ease-expo:   cubic-bezier(0.16, 1, 0.3, 1);
  --dur-fast:  150ms;
  --dur-base:  250ms;
  --dur-slow:  500ms;
}

Hard rules: OKLCH format. Zero hardcoded hex/rgba in components. All radii via --r-*. All easing via --ease-*. For light-mode, fintech, wellness palettes → references/design-systems.md.


Step 1 — Understand the Product

Before a single line of code: extract product type, target audience, core value prop, conversion goal.

2026 Niche Design Table

Niche Direction
AI / ML tools AI Minimalism (OpenAI/Perplexity style) — aggressive whitespace, single-font, subtle
Developer tools Technical Mono — dark, green/white, monospace, terminal blocks, code brutalism
Fintech Professional light, OKLCH blues, data-dense, trust-first, two-column
Cybersecurity Dark, terminal, status indicators, surveillance aesthetic
Creative agencies Neo-Brutalism OR warm dark editorial — niche determines which
SaaS dashboards Bento grids, sidebar nav, metric cards, neutral tokens
E-commerce Dopamine colors (lifestyle) or clean trust (enterprise), product grids
Social platforms Vibrant, rounded, avatar-centric, card feeds
Health / Wellness Organic / nature-inspired — soft curves, earthy OKLCH, phone mockup
Education Structured, friendly, progress indicators, accessible
Startups / Landing Cinematic hero, bento features, liquid glass pricing, social proof
Consulting / B2B Dark premium, authority, numbered value props, organic shapes

Step 2 — 2026 Visual Research & Hero Patterns

Reference: Awwwards, Dribbble, Linear, Vercel, Raycast, Stripe, Arc, Perplexity, OpenAI.

Hero Patterns (2026 Standard)

A — Cinematic Video + Kinetic Typography

<video autoPlay muted loop playsInline>
+ gradient overlay (from-bg/85 via-transparent to-bg)
Oversized kinetic headline → responds to scroll via animation-timeline: view()
Subhead → Liquid glass CTA row
Logo marquee (pure CSS @keyframes, liquid-glass pills)

B — AI Minimalism (Barely-There UI)

Near-white or very dark bg — extreme whitespace
Single variable font system, precise weight control
Minimal chrome: 1 primary CTA, no decorations
Subtle grain texture (opacity 0.02), no glow effects
Inspired by: Perplexity, Claude, OpenAI interfaces

C — Scroll-Driven Storytelling

Native CSS scroll-driven animation: animation-timeline: scroll()
Elements reveal, transform, and parallax as user scrolls
No JS scroll listeners — GPU-accelerated, main-thread-free
@keyframes tied to view() or scroll() timeline

D — Bento Grid Feature Hero

Compact centered headline (gradient text, oversized)
Asymmetric bento grid: span-2 demo card + medium feature cards + small stat tiles
Varied visual weights — not identical cards
Cards use liquid glass, each with subtle hover state

E — Organic / Anti-Grid

Soft curved section dividers (SVG clip-path or border-radius on section)
Earthy OKLCH palette — clay, sage, warm beige
Flowing asymmetric layout — deliberately non-rectangular
Works for: wellness, agencies, portfolios

2026 Mandatory Trends

Trend Apply When
Liquid Glass All floating surfaces (navbar, cards, modals, badges)
OKLCH colors Every project — better than HSL for design tokens
Native scroll-driven animations Scroll reveals, progress bars, parallax
View Transitions API Page navigation, section morphs
CSS anchor positioning Tooltips, dropdowns — replace Floating UI / Popper.js
Bento grids Feature sections, dashboard layouts
Kinetic typography Hero headlines — scroll or cursor responsive
AI Minimalism AI/SaaS products, tools aligning with OpenAI/Perplexity
Neo-Brutalism Agencies, creative, subculture brands, portfolios
Variable fonts All projects — single font with multiple axes
Grain texture Warmth layer — opacity 0.025–0.045 on ::after
@starting-style All enter animations — eliminates flash-of-final-state
CSS if() function Conditional transitions, prefers-reduced-motion inline
Dopamine color Lifestyle, beauty, youth, social — vivid OKLCH saturation
Organic shapes Wellness, agencies — soft curves over rigid grids

Step 3 — Visual System Planning

Typography (2026 Pairings)

Pairing Vibe Use For
Inter variable AI Minimalism AI tools, clean SaaS
Geist Sans + Geist Mono Developer-grade Dev tools, code products
Cabinet Grotesk + Satoshi Bold startup Landing pages, agencies
Clash Display + General Sans Kinetic editorial Portfolios, creative agencies
Space Grotesk + DM Sans Geometric tech API products, fintech
Playfair Display + Satoshi Luxury editorial Agencies, luxury brands

Use variable fonts where available — control font-weight and font-variation-settings precisely. All display sizes: clamp(). Negative letter-spacing on every heading.

Color (Always OKLCH)

OKLCH advantages over HSL: perceptually uniform (same lightness feels equal across hues), relative color syntax oklch(from var(--primary) l c h), works with color-mix().

/* Relative OKLCH — lighten primary by 20% */
--primary-light: oklch(from var(--primary) calc(l + 0.20) c h);

/* Mix two colors */
--blend: color-mix(in oklch, var(--primary) 30%, var(--bg));

Spacing scale (4px base): 4 8 12 16 24 32 40 48 64 80 96 128 — no arbitrary values.


Step 4 — Layout Architecture

Landing Page (2026 Standard)

Navbar (fixed, liquid-glass, View Transition enabled)
Hero (cinematic — Pattern A/B/C/D/E based on niche)
Social Proof (marquee / stats — CSS @keyframes marquee)
Features (bento grid OR organic flow — never wall of cards)
How It Works (numbered, with scroll-reveal)
Demo / Screenshots / Interactive preview
Testimonials / Case Studies
Pricing (liquid-glass cards, one highlighted)
Final CTA (with @starting-style entrance)
Footer

Dashboard (2026 Standard)

Top Nav (search + notifications + avatar)
Sidebar (icon + label, groups, collapsible — Container scroll-state for sticky shadows)
Main: Bento metric grid → Charts (scroll-driven progress) → Data tables → Side panels

Step 5 — Component System

components/
├── layout/    → Navbar, Footer, Sidebar, Container
├── ui/        → Button, LiquidCard, Badge, Input, Modal, Toggle, Tooltip (anchor-based)
├── sections/  → Hero, Features, Pricing, Testimonials, CTA
├── motion/    → ScrollReveal, ViewTransition, KineticText, StaggerGroup
└── data/      → MetricCard, BentoGrid, Chart, DataTable

Liquid Glass — 2026 Standard Surface

Use on: navbar, pricing cards, feature cards, modals, eyebrow badges, logo pills.

.liquid-glass {
  background: linear-gradient(
    135deg,
    oklch(100% 0 0 / 0.08) 0%,
    oklch(100% 0 0 / 0.02) 100%
  );
  backdrop-filter: blur(20px) saturate(180%);
  -webkit-backdrop-filter: blur(20px) saturate(180%);
  border: 1px solid oklch(100% 0 0 / 0.12);
  box-shadow:
    inset 0 1px 0 oklch(100% 0 0 / 0.15),
    0 8px 32px oklch(0% 0 0 / 0.30);
  border-radius: var(--r);
}
.liquid-glass:hover {
  border-color: oklch(100% 0 0 / 0.18);
  box-shadow:
    inset 0 1px 0 oklch(100% 0 0 / 0.20),
    0 12px 40px oklch(0% 0 0 / 0.35);
  transition: all var(--dur-base) var(--ease-out);
}

CSS Anchor Positioning (2026 — Replace Floating UI)

/* No JS tooltip positioning */
.tooltip-trigger { anchor-name: --trigger; }
.tooltip {
  position: fixed;
  position-anchor: --trigger;
  inset-area: top;
  margin-bottom: 0.5rem;
  position-try-fallbacks: --bottom, --left, --right;
}

Step 6 — 2026 Motion System

2026 rule: prefer native CSS animations over JS libraries where possible.

Native Scroll-Driven Animations (Interop 2026 — No JS)

/* Reveal on scroll — replaces Intersection Observer */
.reveal {
  animation: fade-up linear both;
  animation-timeline: view();
  animation-range: entry 0% cover 25%;
}
@keyframes fade-up {
  from { opacity: 0; transform: translateY(24px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Reading progress bar */
.progress-bar {
  animation: grow-width linear forwards;
  animation-timeline: scroll();
}
@keyframes grow-width {
  from { width: 0%; }
  to   { width: 100%; }
}

/* Scroll-driven parallax */
.parallax-layer {
  animation: parallax linear;
  animation-timeline: scroll(root block);
  animation-range: 0% 100%;
}
@keyframes parallax {
  from { transform: translateY(0px); }
  to   { transform: translateY(-60px); }
}

@starting-style — Flash-Free Enter Animations (2026)

/* Enter animation that doesn't flash final state first */
.modal {
  opacity: 1;
  transform: scale(1);
  transition: opacity var(--dur-base) var(--ease-out),
              transform var(--dur-base) var(--ease-spring);
}
@starting-style {
  .modal { opacity: 0; transform: scale(0.95); }
}

View Transitions API (Page Navigation)

/* Cross-document transition — 2 lines of CSS */
@view-transition { navigation: auto; }
::view-transition-old(root) { animation-duration: var(--dur-slow); }
::view-transition-new(root) { animation-duration: var(--dur-slow); }

/* Named element transition (card → detail) */
.card { view-transition-name: card-item; }

CSS if() — Adaptive Motion (2026)

.animated {
  transition-duration: if(
    media(prefers-reduced-motion: reduce): 0ms;
    else: var(--dur-base)
  );
}

Per-Element Animation Spec Format

Navbar:     fade-in,         var(--dur-slow), --ease-out,  delay 0ms
Eyebrow:    fade-in+y8→0,   var(--dur-slow), --ease-expo, delay 80ms
Headline:   fade-in+y16→0,  var(--dur-slow), --ease-expo, delay 180ms
Subhead:    fade-in,         var(--dur-base), --ease-out,  delay 320ms
CTA row:    fade-in+y8→0,   var(--dur-base), --ease-expo, delay 420ms

Logo Marquee (Pure CSS)

@keyframes marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }
.animate-marquee { animation: marquee 24s linear infinite; }
.marquee-container { mask-image: linear-gradient(to right, transparent 0%, black 10%, black 90%, transparent 100%); }

Staggered Animations with sibling-index() (2026 CSS — Chrome)

/* No JS needed for stagger delays */
.grid-item {
  animation-delay: calc(sibling-index() * 80ms);
  animation: fade-up var(--dur-slow) var(--ease-expo) both;
  animation-timeline: view();
  animation-range: entry 0% cover 30%;
}

Motion Rules (Non-Negotiable)

  • GPU only: transform + opacity — never animate layout properties
  • Reduced motion: use CSS if() or @media (prefers-reduced-motion: reduce) on every animation
  • Duration budget: interactions 100–200ms | reveals 300–500ms | page transitions 400–600ms
  • Max 3 concurrent animations visible in viewport at any time

Step 7 — 2026 Technology Stack

Layer 2026 Recommendation
Framework Next.js 15 (RSC, App Router, PPR) or Astro 5 (for content sites)
Styling Tailwind v4 + CSS OKLCH custom properties
Components shadcn/ui + Radix UI
Animation Native CSS scroll-driven first; Framer Motion for complex React
Language TypeScript (now the baseline — mandatory)
Icons Lucide React
Fonts Variable fonts (Inter, Geist, Cabinet Grotesk)
Tooltips CSS Anchor Positioning (replace Floating UI for new builds)
/app (App Router)   → layouts, pages, RSC
/components         → layout/ ui/ sections/ motion/ data/
/styles             → globals.css (:root tokens, .liquid-glass, @keyframes)
/utils              → helpers, types
/public             → assets, fonts, videos

Step 8 — Backend Awareness & Performance

  • Loading: skeleton loaders — never spinners
  • Error: message + retry — never blank screen
  • Empty: copy + CTA ("No projects yet")
  • React Server Components: use RSC for static content, client components only for interactivity
  • Core Web Vitals: LCP < 2.5s, CLS < 0.1, INP < 200ms
  • Sustainable design: minimize unused animations, optimize images, lazy-load off-screen content
  • Realistic data: real-sounding names, plausible numbers — no lorem ipsum

Step 9 — Responsive + Accessible System

Breakpoints: sm 640 | md 768 | lg 1024 | xl 1280 | 2xl 1536

  • Grids: 4 → 2 → 1 col. Nav: full → hamburger at < 768px.
  • Display type: clamp(2rem, 1rem + 4vw, 5rem)
  • Section padding: 128 → 80 → 48px. Touch targets: ≥ 44×44px.
  • WCAG 2.1 AA mandatory: 4.5:1 body text, 3:1 large text, keyboard nav, screen reader labels
  • Both light and dark modes must independently pass contrast minimums

Step 10 — 2026 Visual Quality Validation

Token Compliance

  • All colors: oklch(...) values — zero hardcoded hex/rgba in components
  • All radii via --r-*. All easing via --ease-*. All durations via --dur-*

Typography

  • Variable font loaded. Display > h1 > h2 > body hierarchy clear.
  • Negative letter-spacing on all headings. Body ≤ 65ch wide.

Color & Polish

  • OKLCH palette with perceptual uniformity — no hue shifts in gradients
  • Liquid glass on all floating surfaces
  • Both light/dark mode (if applicable) pass 4.5:1 contrast

2026 Motion

  • Scroll-driven animations use native CSS (animation-timeline) not JS scroll listeners
  • All enter animations use @starting-style
  • Page navigation uses View Transitions
  • CSS if() or @media (prefers-reduced-motion) on every animation
  • Max 3 animations visible concurrently

Overall

  • Screenshot test: next to Linear / Vercel / Perplexity — does it belong?
  • 3-second test: product clear, CTA obvious
  • Token audit: zero hex in DevTools computed styles

Step 11 — Hero Prompt Engineering (MotionSites Style)

Pixel-precise spec format — eliminates ambiguity, awards-quality output on first pass.

Stack: Next.js 15 + Tailwind v4

DESIGN TOKENS (:root in globals.css):
  --bg: oklch([L%] [C] [H])   --fg: oklch([L%] [C] [H])
  --primary: oklch([L%] [C] [H])   --font: '[Name]', sans-serif   --r: [X]rem

LIQUID GLASS (globals.css):
  .liquid-glass { background: linear-gradient(135deg,oklch(100% 0 0/0.08),oklch(100% 0 0/0.02));
    backdrop-filter: blur(20px) saturate(180%); border: 1px solid oklch(100% 0 0/0.12);
    box-shadow: inset 0 1px 0 oklch(100% 0 0/0.15), 0 8px 32px oklch(0% 0 0/0.3); }

SCROLL ANIMATIONS (globals.css):
  .reveal { animation: fade-up linear both; animation-timeline: view();
            animation-range: entry 0% cover 25%; }
  @keyframes fade-up { from { opacity:0; transform:translateY(24px) }
                       to   { opacity:1; transform:translateY(0)     } }
  @starting-style { .modal { opacity:0; transform:scale(0.95) } }

NAVBAR: fixed z-50 liquid-glass | Logo + nav links + CTA pill
HERO ELEMENTS:
  1. Eyebrow — liquid-glass pill, animated dot, "[tagline]" text-fg/70
  2. Headline — [Xpx] font-bold tracking-[-0.04em] leading-[0.93] oklch gradient
  3. Sub — max-w-lg text-center text-fg/65 text-lg leading-8
  4. CTAs — Primary (oklch glow) + Ghost (border)
  5. Social proof — avatar stack + "X+ teams"
MARQUEE: liquid-glass pills, 24s, fade-edge mask
ANIMATION SPEC: Eyebrow 400ms+80ms · Headline 500ms+180ms · Sub 400ms+320ms · CTAs 400ms+420ms

ANTI-SLOP: Zero hex. OKLCH everywhere. Liquid glass on every floating surface.
  Fictional brands: Vortex, Nimbus, Kynder, Halcyn, Aethon.

Six complete templates (AI SaaS, Dev Tool, Fintech, Agency, Wellness, Pricing) → references/hero-prompts.md.


Step 12 — Final Testing (Mandatory — You Own the Errors)

npm install && npx tsc --noEmit && npm run build
npx next lint
npm run dev & sleep 5 && curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 && kill %1

Component scan:

Check Fix
Hardcoded hex or hsl() values Replace with oklch(var(--token)) or oklch(...)
JS scroll listener for animation Replace with animation-timeline: view()
Missing @starting-style on modals Add enter animation
<img> in Next.js Replace with <Image>
Missing alt text Add descriptive alt
No prefers-reduced-motion handling Add CSS if() or @media

Done when: build 0 · lint pass · dev boots · tsc clean · no console errors · no mobile overflow · zero hex in DevTools.


Anti-Patterns — 2026 Edition

Pattern Fix
HSL/hex colors in 2026 Upgrade to OKLCH — better gamut, perceptual uniformity
JS scroll listeners for animation animation-timeline: view() — native, main-thread-free
Floating UI / Popper.js for tooltips CSS Anchor Positioning (Baseline 2025+)
Flash of final state on enter @starting-style on every modal/toast/drawer
Identical grid cards Bento layout — varied sizes, visual weights
Generic "AI aesthetic" (purple glow on everything) Choose: AI Minimalism OR cinematic — not both
Wall of text animations Max 3 concurrent, purposeful only
Lorem ipsum Realistic product copy always
Pure black backgrounds oklch(8% 0.02 265) — subtle tint adds depth
Ignoring RSC Static content → RSC; interactivity → Client components
WCAG as afterthought Baked-in: contrast tokens, semantic HTML, keyboard nav

Final Output

Deliver: OKLCH token system · Liquid glass utility · Native scroll animations · @starting-style enters · View Transitions · Premium UI · Responsive · Typed components · Realistic copy. Summary: token rationale, font choice, layout pattern, motion decisions.

Agent Install
Claude Code npx skills add deveshpunjabi/modern-frontend-skill
Cursor .cursor/skills/
Windsurf .windsurf/skills/
Any Copy SKILL.md to agent skill directory