Guide Claude to generate frontend designs that align with QuestGen's refined, professional aesthetic—avoiding flashy AI-generated patterns while maintaining the sophisticated minimalism that defines the brand.
Visual Identity: QuestGen embodies an Apple-esque look and feel, seamlessly integrated with Vercel's design language (https://vercel.com/design/guidelines). This means:
- Apple influence: Refined minimalism, invisible complexity, extreme attention to detail, subtle shadows, premium feel through restraint
- Vercel influence: Geist typography, monochrome palette with purposeful accents, precise spacing, dark-mode first, performance-obsessed
- Synthesis: Professional confidence through simplicity, not decoration. Every pixel serves a purpose.
Think: SF Pro-like precision meets Next.js aesthetic. Quiet sophistication over loud statements.
During generation, you tend to default to visually loud patterns: heavy shadows, bold gradients, bright accent colors, ornate animations. QuestGen's design language is the opposite: refined restraint. Heavy shadows become 0.04 opacity. Bold borders become #e5e5e5. Flashy animations become subtle cubic-bezier transitions. Users expect polish, not noise.
QuestGen uses OKLCH color space for perceptual uniformity and precise dark mode translation.
Never use:
- RGB/Hex without OKLCH conversion
- Vibrant gradients or rainbow palettes
- Heavy saturation (chroma > 0.25 except for semantic colors)
- Generic Tailwind colors without customization
- Bright accent colors for decoration
Required patterns:
/* Light mode base */
--background: oklch(1 0 0); /* Pure white */
--foreground: oklch(0.145 0 0); /* Near-black #171717 */
--border: oklch(0.922 0 0); /* Light gray #e5e5e5 */
--muted: oklch(0.97 0 0); /* Off-white */
/* Dark mode base */
--background: oklch(0.145 0 0); /* Dark charcoal */
--foreground: oklch(0.985 0 0); /* Off-white */
--border: oklch(1 0 0 / 10%); /* Transparent white */Color philosophy:
- Monochrome dominates: Black, white, grays
- Semantic colors only: Green (success), yellow (warning), red (danger)
- No decorative colors: No purple, no teal, no bright blue
- Purposeful contrast: WCAG AA minimum (4.5:1 for text)
Semantic Colors
-
Success (Green):
- Light bg:
oklch(0.982 0.018 155.826) - Dark bg:
oklch(0.22 0.04 155.826) - Light text:
oklch(0.448 0.119 151.328) - Dark text:
oklch(0.65 0.12 151.328)
- Light bg:
-
Warning (Yellow):
- Light bg:
oklch(0.943 0.109 102.126) - Dark bg:
oklch(0.25 0.06 102.126) - Light text:
oklch(0.412 0.109 65.638) - Dark text:
oklch(0.70 0.08 65.638)
- Light bg:
-
Danger (Red): Use
--destructiveCSS variable:- Light:
oklch(0.577 0.245 27.325) - Dark:
oklch(0.396 0.141 25.723)
- Light:
Implementation guidelines:
- Use CSS variables exclusively (never hardcode colors)
- Dark mode via class strategy (
.darkon<html>) - Default theme: Dark (explicit, no system detection)
- Border colors: Subtle, never bold (
#e5e5e5light,oklch(1 0 0 / 10%)dark)
QuestGen uses Geist (Vercel's typeface) for modern geometric clarity.
Never use:
- Inter, Roboto, Open Sans, System fonts
- Multiple font families (no pairing)
- Generic sans-serif as fallback without loading Geist
- Decorative or script fonts
Required fonts:
import { Geist, Geist_Mono } from "next/font/google";
const geistSans = Geist({ subsets: ["latin"] });
const geistMono = Geist_Mono({ subsets: ["latin"] });Type scale (pixel-based precision):
Display/Hero: 96px (font-650) /* Landing hero only */
Section titles: 56-72px (font-650) /* Major headings */
Card titles: 16px (font-500) /* Paper cards, features */
Dialog headers: 17px (font-500) /* Modal titles */
Body text: 15-17px (regular) /* Main content */
Labels: 13-14px (regular) /* Form labels, metadata */
Fine print: 11-12px (regular) /* Status badges, timestamps */Letter spacing strategy:
- Hero titles:
tracking-[-0.04em](tight, sophisticated) - Headings:
tracking-[-0.01em](subtle tightness) - Body:
tracking-normal - Uppercase labels:
tracking-[0.18em](airy spacing)
Line heights:
- Headings:
leading-[1.05]toleading-[1.1](tight for impact) - Body:
leading-[1.5]toleading-[1.6](generous readability) - Small text:
leading-[1.45](balanced density)
Weight strategy:
- 500 (medium): Interactive elements, small headings
- 600 (semibold): Card titles, feature names
- 650 (custom): Landing page headers only
- Never use: 700, 800, 900 (too heavy for Geist)
QuestGen's signature is almost invisible shadows.
Never use:
- Tailwind's default shadow utilities (
shadow-sm,shadow-md, etc.) - Heavy drop shadows (opacity > 0.1)
- Colored shadows
- Multiple shadow layers
Required shadow patterns:
/* Card hover (the only shadow in the system) */
hover:shadow-[0_1px_3px_rgba(0,0,0,0.04)]
/* Dark mode cards (slightly stronger) */
.dark hover:shadow-[0_2px_6px_rgba(0,0,0,0.4)]
/* That's it. No other shadows. */Dialog Exception: Dialogs may use slightly elevated shadows:
- Light:
shadow-[0_4px_12px_rgba(0,0,0,0.04)] - Dark:
shadow-[0_4px_12px_rgba(0,0,0,0.4)]This is the ONLY exception to the hover-only shadow rule.
Shadow philosophy:
- Light mode: Opacity
0.04(barely perceptible) - Dark mode: Opacity
0.4(needed for depth) - Only on hover states (never static)
- Elevation through borders, not shadows
Borders define structure without visual weight.
Border patterns:
/* Light mode */
border-[#e5e5e5] /* Standard border */
hover:border-[#d4d4d4] /* Hover state (slightly darker) */
/* Dark mode */
border-[#333333] /* Standard border */
border-[oklch(1 0 0 / 10%)] /* Transparent white (preferred) */Border radius scale:
rounded-[6px] /* Buttons, inputs, small cards */
rounded-[8px] /* Standard cards, panels */
rounded-[10px] /* Large sections, default radius */
rounded-[12px] /* Feature sections */
rounded-[16px] /* Large modals, hero sections */Border philosophy:
- Never use
border-2or thicker (alwaysborder= 1px) - Subtle color shifts on hover (not bold changes)
- Consistent radius across component families
QuestGen favors subtle, spring-like animations over flashy effects.
Never use:
- Linear easing (
ease-linear) - Long durations (> 300ms)
- Scale transforms > 2% (
scale-105,scale-110) - Rotation or skew (too playful)
- Bounce or elastic easings
Required animation patterns:
duration-200acceptable for: dialog animations, complex multi-property transitionsduration-150standard for: simple hover/active transitions
/* Standard transitions */
transition-all duration-150
transition-all duration-200
/* Spring-like easing (signature) */
cubic-bezier(0.16, 1, 0.3, 1)
/* Hover scale (subtle compression) */
active:scale-[0.98]
/* Dialog animations */
scale-[0.96] → scale-100
opacity-0 → opacity-100
duration-200Motion guidelines:
- Hover states: Background color shifts only (no scale, no shadow jumps)
- Active states:
scale-[0.98](2% compression, never expansion) - Dialogs: Scale + opacity (0.96 → 1.0) with
cubic-bezier(0.16, 1, 0.3, 1) - Loading: Spinner only (
animate-spin), no pulsing or bouncing - Focus rings: Instant (no transition)
What to avoid:
ease-in-out(use the signature cubic-bezier instead)- Staggered reveals on page load
- Parallax scrolling
- Auto-playing animations
- Gradient shifts on hover
- Morphing shapes
Backgrounds create depth through gradients, not patterns.
Approved patterns:
/* Landing page gradient (signature) */
Two large radial gradients with low opacity:
- Top-left: Muted color at 60% opacity
- Bottom-right: Complementary color at 60% opacity
- Result: Subtle atmospheric depth
/* Metadata panels */
bg-[#fafafa] light / bg-[#1a1a1a] dark
(Subtle off-white/off-black, not pure)
/* Section backgrounds */
bg-white / bg-[#171717]
(Pure colors for main content)Never use:
- Geometric patterns (dots, grids, waves)
- Mesh gradients or complex gradients
- Animated backgrounds
- Glassmorphism or backdrop blur (except dialog overlays)
- Noise textures
- Images as backgrounds (except content images)
Background philosophy:
- Minimize visual noise
- Gradients for landing page atmosphere only
- Solid colors for content areas
- Subtle off-white/off-black for secondary panels
Card design (signature):
className="group block w-full rounded-[8px]
border border-[#e5e5e5]
bg-white p-5
transition-all duration-150
hover:border-[#d4d4d4]
hover:shadow-[0_1px_3px_rgba(0,0,0,0.04)]
dark:border-[#333333]
dark:bg-[#1a1a1a]"Button design:
/* Primary */
className="h-[44px] px-6 rounded-[6px]
bg-[#171717] text-white
hover:bg-[#404040]
active:scale-[0.98]
focus:ring-2 focus:ring-[#171717] focus:ring-offset-2
dark:bg-white dark:text-[#171717] dark:hover:bg-[#e5e5e5]"
/* Secondary */
className="h-[44px] px-6 rounded-[6px]
border border-[#e5e5e5] bg-white text-[#171717]
hover:border-[#d4d4d4] hover:bg-[#fafafa]
dark:border-[#333333] dark:bg-[#171717]"Switch design (Apple-inspired):
Track: h-[24px] w-[44px]
Thumb: h-[20px] w-[20px]
Shadow: shadow-[0_1px_2px_rgba(0,0,0,0.15)]
Checked: bg-[#171717] dark:bg-white
Unchecked: bg-[#e5e5e5] dark:bg-[#333333]Form input design:
className="h-[44px] px-3 rounded-[6px]
border border-[#e5e5e5]
focus:border-[#171717]
focus:ring-1 focus:ring-[#171717]
dark:border-[#333333]
dark:focus:border-white"Even with explicit instructions, you may converge toward flashy AI patterns. Actively resist this:
- If you notice yourself adding
shadow-lgorshadow-xl, stop and use the 0.04 opacity pattern - If you reach for colored accents (purple, teal, blue), stop and use monochrome + semantic colors only
- If you add scale-up hover effects (
scale-105), stop and use compression (scale-[0.98]) on active only - If you create complex gradients, stop and use solid colors or simple two-color radial gradients
- If you add staggered animations, stop and use simple transitions only
- Challenge yourself: "Is this refined or flashy?" If flashy, simplify.
Before finalizing any QuestGen design, verify:
- Colors: Using OKLCH via CSS variables, monochrome dominant
- Typography: Geist font family, pixel-based sizing, tight leading for headings
- Shadows: Only
0.04opacity on hover (or none) - Borders:
#e5e5e5/#333333, never bold (1px only) - Animations: Cubic-bezier easing, 150-200ms duration, subtle scale compression
- Backgrounds: Solid colors or simple gradients, no patterns
- Components: Following established patterns (card, button, switch, input)
- Accessibility: WCAG AA contrast (4.5:1), keyboard navigation, ARIA labels
- Dark mode: Explicit dark variants for all colors
- Refinement: Looks professional, not flashy
Interpret these guidelines through QuestGen page types:
- Typography: Hero at 96px with
tracking-[-0.04em] - Background: Two-gradient atmospheric effect
- Sections: Features (3×2 grid), Workflow (2-col), Trust metrics (3 stats)
- Motion: Subtle transitions only (no staggered reveals)
- CTA: Primary dark button (black bg, white text)
- Layout: Search bar + view toggle + grid/list
- Cards: Standard card pattern with hover states
- Empty states: Large icon + CTA button
- Loading: Skeleton loaders matching card layout
- Actions: Icon buttons with subtle hover states
- Layout: Sequential vertical flow
- File upload: Dashed border zone with drag-drop
- Inputs: 44px height, consistent border treatment
- Pattern presets: Expandable radio group
- CTA: Full-width mobile, fixed-width desktop
- Layout: Breadcrumb → metadata grid → actions → content
- Metadata: 3-column grid with icons
- Actions: Primary + secondary + destructive buttons
- Regeneration: Collapsible panel with textarea
- Content: Markdown preview with typography scale
- Layout: Centered card (max-w-md)
- Minimal: No decorative elements
- OAuth: Google button with logo
- Trust: Terms + privacy links below
/* 1. CSS Variables (always first) */
:root {
--background: ...;
}
.dark {
--background: ...;
}
/* 2. Reset/Base */
* {
box-sizing: border-box;
}
/* 3. Typography */
body {
font-family: var(--font-geist-sans);
}
/* 4. Components */
.card {
...;
}
.button {
...;
}// Always customize Tailwind config
theme: {
extend: {
colors: {
background: "var(--background)",
foreground: "var(--foreground)",
// ... all OKLCH variables
},
borderRadius: {
DEFAULT: "10px",
sm: "6px",
md: "8px",
lg: "10px",
xl: "14px",
},
},
}// ThemeProvider config
<ThemeProvider
attribute="class"
defaultTheme="dark"
enableSystem={false}
disableTransitionOnChange
>- All interactive elements: 44px minimum touch target
- Focus rings:
ring-2 ring-offset-2(always visible) - ARIA labels: On icon buttons, dialogs, switches
- Keyboard navigation: Tab order, Enter/Space activation
- Color contrast: WCAG AA (4.5:1 text, 3:1 UI components)
- Memoize expensive components (cards, lists)
- Use CSS-only animations (no JS unless necessary)
- Skeleton loaders for perceived performance
- Lazy load images (Next.js Image component)
- Conditional rendering (dialogs, modals)
Visual Identity: This project must embody an Apple-esque look and feel, seamlessly integrated with Vercel's design language (https://vercel.com/design/guidelines). Every design decision should pass this test: "Would this look at home on Apple.com or Vercel.com?"
QuestGen's design language is refined restraint. Every shadow, border, animation, and color is intentionally minimal. This skill exists to maintain that consistency—avoiding the flashy patterns that AI generation naturally gravitates toward.
The design is sophisticated because of what it doesn't include:
- No heavy shadows (Apple: barely-there, Vercel: minimal)
- No bright accent colors (Apple: monochrome + product colors, Vercel: black/white dominant)
- No complex animations (Apple: purposeful motion, Vercel: instant feedback)
- No decorative patterns (Apple: content-first, Vercel: clean backgrounds)
- No visual noise (Apple: breathing room, Vercel: generous whitespace)
When in doubt, simplify. When tempted to add polish, subtract instead. The result should feel professional, trustworthy, and quietly confident—never loud or attention-seeking.
Core mantra: "Refined, not flashy. Minimal, not boring. Professional, not corporate."
Inspiration checklist:
- Would Apple ship this? (Premium restraint, invisible complexity)
- Would Vercel ship this? (Dark-mode polish, Geist typography, performance)
- Does it feel timeless, not trendy?
- Is every element necessary, or am I adding decoration?