AI Skill Report Card
Redesigning with Flat Glassmorphism
Quick Start15 / 15
HTML<!-- Fonts --> <link href="https://fonts.googleapis.com/css2?family=Outfit:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet"> <!-- Lucide Icons --> <script src="https://unpkg.com/lucide@latest"></script>
CSS:root { --font-sans: 'Outfit', sans-serif; --font-mono: 'JetBrains Mono', monospace; --bg: #0b0d12; --glass-bg: rgba(255, 255, 255, 0.06); --glass-border: rgba(255, 255, 255, 0.12); --text-primary: #f5f6f8; --text-secondary: rgba(245, 246, 248, 0.6); --accent: #7c9dff; --radius: 16px; } body { font-family: var(--font-sans); background: var(--bg); color: var(--text-primary); } .glass { background: var(--glass-bg); border: 1px solid var(--glass-border); border-radius: var(--radius); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); box-shadow: none; /* flat — no shadows, ever */ } .mono { font-family: var(--font-mono); }
JavaScript<div className="glass p-6"> <i data-lucide="sparkles" className="w-5 h-5 text-accent"></i> <h2 className="font-sans font-semibold">Dashboard</h2> <span className="mono text-sm text-secondary">v2.4.1</span> </div>
Recommendation▾
Add a second concrete example showing a 'bad outcome' (e.g., a redesign that violates the flat rule) for contrast
Workflow14 / 15
Progress checklist for any redesign/creation task:
- [ ] 1. Audit current component/page (if redesigning) or gather requirements (if new)
- [ ] 2. Identify structural regions (header, nav, cards, forms, footer)
- [ ] 3. Apply design tokens (colors, radius, spacing, typography)
- [ ] 4. Replace all icons with Lucide equivalents
- [ ] 5. Apply font roles: Outfit for UI/copy, JetBrains Mono for data/code/labels
- [ ] 6. Strip all box-shadows, drop-shadows, and elevation effects
- [ ] 7. Apply glass surfaces to elevated elements (cards, modals, nav, dropdowns)
- [ ] 8. Verify contrast/readability against glass backgrounds
- [ ] 9. Add hover/focus states using border or background opacity shifts (not shadow)
- [ ] 10. Responsive pass
Step Details
1. Audit/Requirements
- Redesign: list every existing element, its purpose, and current style choices to replace.
- New page: define sections needed (hero, nav, content blocks, CTA, footer) before styling.
2. Design tokens (always define these, don't hardcode values inline)
- Background: dark or light base (
#0b0d12dark /#f4f5f7light) - Glass surface:
rgba(255,255,255,0.05–0.08)with1px solid rgba(255,255,255,0.1–0.15)border - Radius: 12–20px, consistent across all surfaces
- Spacing scale: 4/8/12/16/24/32/48px
- One accent color max (used sparingly for CTAs, active states, focus rings)
3. Typography roles
- Outfit: headings, body copy, buttons, nav labels — anything conversational/UI
- JetBrains Mono: numbers, stats, timestamps, code, IDs, tags, metadata, badges
- Never mix fonts within a single text element
4. Icons
- Lucide only. Remove all other icon sets (Font Awesome, Material Icons, emoji-as-icon).
- Standard sizes: 16px (inline/labels), 20px (buttons), 24px (nav/headers)
- Stroke width 1.5–2, never filled icons (keeps it flat)
5. Flatness rule
box-shadow: noneon every element, always- No
filter: drop-shadow(...) - Depth comes from: border opacity, background opacity, blur — never shadow
- Hover/active states: lighten border or background, do not add shadow or lift (
transform: translateY) effects
Recommendation▾
Include a dark/light mode toggle example to demonstrate token inversion in practice
Examples17 / 20
Example 1: Redesigning a card component
Input:
JavaScript<div style={{ boxShadow: '0 4px 12px rgba(0,0,0,0.2)', background: '#fff', borderRadius: 8 }}> <FontAwesomeIcon icon="star" /> <h3 style={{ fontFamily: 'Arial' }}>Premium Plan</h3> <p>$29/month</p> </div>
Output:
JavaScript<div className="glass p-6 rounded-2xl"> <i data-lucide="star" className="w-5 h-5 text-accent mb-3"></i> <h3 className="font-sans font-semibold text-lg">Premium Plan</h3> <p className="font-mono text-2xl mt-2">$29<span className="text-secondary text-sm">/month</span></p> </div>
Example 2: New page from scratch
Input: "Create a settings page with profile, notifications, and billing sections"
Output: A page with a .glass sidebar nav (Lucide icons: user, bell, credit-card), each section in its own .glass panel with Outfit headings, JetBrains Mono for account IDs/plan details/dates, toggle switches styled flat (no shadow, border-based states), consistent 24px padding and 16px radius throughout.
Recommendation▾
Add brief guidance on accessibility contrast ratios (e.g., WCAG AA) for text-secondary on glass backgrounds
Best Practices
- Define tokens once (CSS variables or Tailwind theme config), reuse everywhere — never one-off hex values
- Layer glass surfaces subtly: nested glass panels should increase opacity slightly (e.g., 0.05 → 0.08) to imply hierarchy without shadow
- Keep accent color usage minimal — 1 primary accent, used for CTAs/focus/active states only
- Use
backdrop-filter: blur()generously; it's what sells the glass effect in the absence of shadow - For light mode: glass becomes
rgba(0,0,0,0.04)bg withrgba(0,0,0,0.08)border — same rules, inverted - Group Lucide icon names mentally by section (nav, status, actions) for consistency across a redesign
- When redesigning, preserve the original information architecture — only change visual treatment unless asked otherwise
Common Pitfalls
- Adding shadow "just a little" for depth — don't; use border/opacity instead
- Mixing icon sets because Lucide lacks one specific icon — find the closest Lucide match or use a simple SVG in the same stroke style
- Using JetBrains Mono for headings/body text — it's for data/code only, not prose
- Overusing blur on every element — reserve
backdrop-filterfor genuinely elevated surfaces (cards, modals, nav), not flat backgrounds - Inconsistent border-radius across components — pick one scale and stick to it
- Low contrast text on glass — always verify text-secondary is still readable against the blurred background
- Forgetting focus states — flat design still needs visible, accessible focus rings (use accent-colored border, not shadow)