Claude Code Plugins

Community-maintained marketplace

Feedback

wordpress-magic-seo-frontend-2026

@meastt/WordpressMagicSEO
0
0

Create cutting-edge WordPress plugin admin interfaces using 2026 design trends for AI-powered SEO tools. Use this skill when building WordPress admin dashboards, settings pages, or React-based plugin UIs. Implements fluid organic layouts, glassmorphism effects, Transformative Teal color theory, micro-delight interactions, and spatial depth. Optimized for AI-first experiences with humanized design elements that avoid generic AI aesthetics. Generates production-ready WordPress admin code following 2026 frontend best practices.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name wordpress-magic-seo-frontend-2026
description Create cutting-edge WordPress plugin admin interfaces using 2026 design trends for AI-powered SEO tools. Use this skill when building WordPress admin dashboards, settings pages, or React-based plugin UIs. Implements fluid organic layouts, glassmorphism effects, Transformative Teal color theory, micro-delight interactions, and spatial depth. Optimized for AI-first experiences with humanized design elements that avoid generic AI aesthetics. Generates production-ready WordPress admin code following 2026 frontend best practices.

WordPress Magic SEO Frontend Design Skill (2026 Edition)

This skill guides creation of next-generation WordPress plugin admin interfaces using 2026 design trends: fluid organic layouts, glassmorphism depth, earth-first color palettes, kinetic typography, micro-delight animations, and AI-contextual personalization. Built for AI-powered SEO automation tools that feel human, intelligent, and environmentally conscious.

2026 Design Philosophy: "Transformative Intelligence"

Core Principles:

  • Fluid Organic Layouts: Break free from rigid gridsβ€”use asymmetric compositions, flowing shapes, soft borders
  • Glassmorphism Depth: Frosted glass surfaces with blur, transparency, and layered spatial hierarchy
  • Earth-First Color Theory: Transformative Teal (2026 Color of the Year) with earthy naturals and vibrant accent pops
  • Micro-Delight Interactions: Purposeful animations that reduce cognitive load and create memorable moments
  • Humanized AI: Hand-drawn accents, imperfect elements, warmth that contrasts AI precision
  • Accessible by Default: WCAG AAA compliance, dark mode support, reduced motion options

NEVER:

  • Use outdated purple gradients (2020-2024 AI clichΓ©)
  • Apply rigid grid systems without fluid elements
  • Create flat, lifeless interfaces without depth
  • Ignore accessibility for aesthetic appeal
  • Use generic system fonts (Inter, Roboto, Arial)
  • Apply solid colors without considering transparency and layering

User Context

Target User: WordPress niche site owners

  • Managing content websites with SEO focus
  • Limited technical expertise but high content/marketing savvy
  • Want powerful automation without complexity
  • Expect modern, consumer-app-like experiences

Key Tasks:

  1. Run AI content optimizations on existing posts
  2. Generate/regenerate images using AI
  3. Monitor content health metrics from GSC data
  4. Configure API connections (Anthropic, Google, Vercel)
  5. Review before/after comparisons

WordPress Integration Requirements

Technical Constraints

Framework Options:

  1. React with @wordpress/element (Preferred for complex UIs)

    • Use WordPress's built-in React
    • Enqueue with wp_enqueue_script() dependency: ['wp-element', 'wp-components']
    • Mount to <div id="magic-seo-root"></div>
  2. Vanilla JS + WordPress Admin Classes (For simpler interfaces)

    • Use standard WordPress admin markup patterns
    • Leverage .wrap, .card, .notice classes
    • Enhance with custom CSS and vanilla JS

Code Structure:

// Main admin page callback
function magic_seo_admin_page() {
    ?>
    <div class="wrap magic-seo-dashboard">
        <div id="magic-seo-root"></div>
    </div>
    <?php
}

// Enqueue React app
function magic_seo_enqueue_scripts($hook) {
    if ($hook !== 'toplevel_page_magic-seo') return;
    
    wp_enqueue_script(
        'magic-seo-app',
        plugins_url('build/app.js', __FILE__),
        ['wp-element', 'wp-components', 'wp-api-fetch'],
        '1.0.0',
        true
    );
    
    wp_enqueue_style(
        'magic-seo-styles',
        plugins_url('build/app.css', __FILE__),
        [],
        '1.0.0'
    );
}

AJAX/API Patterns

WordPress REST API Integration:

// Use wp.apiFetch for WordPress REST calls
wp.apiFetch({
    path: '/magic-seo/v1/optimize',
    method: 'POST',
    data: {
        post_id: 123,
        keyword: 'target keyword',
        options: ['fix_title', 'enhance_content', 'generate_image']
    }
}).then(response => {
    // Handle success
}).catch(error => {
    // Handle error
});

External API Calls (Python backend via Vercel):

// Direct fetch to Vercel endpoint
const response = await fetch('https://magic-seo.vercel.app/api/generate', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        'X-Magic-SEO-Key': wpApiSettings.nonce
    },
    body: JSON.stringify({
        action: 'title_rewrite',
        content: currentContent,
        keyword: targetKeyword
    })
});

Component Design Patterns (2026)

1. Glassmorphic Dashboard Cards

Visual Design:

  • Frosted glass surface with backdrop blur
  • Subtle transparency revealing background gradients
  • Soft border glow
  • Floating shadow for depth
  • Fluid, organic corner radius (not uniform)

Code Pattern:

const GlassCard = ({ value, label, icon, trend }) => (
    <div className="glass-card">
        <div className="glass-card__background"></div>
        <div className="glass-card__content">
            <div className="glass-card__icon">{icon}</div>
            <div className="glass-card__value">{value}</div>
            <div className="glass-card__label">{label}</div>
            {trend && (
                <div className="glass-card__trend">
                    <TrendIndicator value={trend} />
                </div>
            )}
        </div>
    </div>
);

/* CSS - Glassmorphism 2026 */
.glass-card {
    position: relative;
    background: rgba(255, 255, 255, 0.08);
    backdrop-filter: blur(12px) saturate(180%);
    -webkit-backdrop-filter: blur(12px) saturate(180%);
    border: 1px solid rgba(255, 255, 255, 0.18);
    border-radius: 24px 28px 24px 32px; /* Organic, asymmetric */
    padding: clamp(20px, 4vw, 32px);
    box-shadow: 
        0 8px 32px rgba(0, 168, 150, 0.08),
        inset 0 1px 0 rgba(255, 255, 255, 0.25);
    transition: all 0.4s cubic-bezier(0.23, 1, 0.32, 1);
    overflow: hidden;
}

.glass-card::before {
    content: '';
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    height: 1px;
    background: linear-gradient(
        90deg, 
        transparent, 
        rgba(255, 255, 255, 0.4), 
        transparent
    );
}

.glass-card:hover {
    transform: translateY(-4px) scale(1.01);
    border-color: rgba(0, 168, 150, 0.3);
    box-shadow: 
        0 16px 48px rgba(0, 168, 150, 0.15),
        inset 0 1px 0 rgba(255, 255, 255, 0.4);
}

.glass-card__background {
    position: absolute;
    inset: 0;
    background: radial-gradient(
        circle at 120% 20%,
        rgba(0, 168, 150, 0.12) 0%,
        transparent 50%
    );
    opacity: 0;
    transition: opacity 0.4s ease;
}

.glass-card:hover .glass-card__background {
    opacity: 1;
}

.glass-card__value {
    font-family: var(--font-display);
    font-size: var(--text-4xl);
    font-weight: 700;
    line-height: 1;
    background: linear-gradient(135deg, var(--teal-600), var(--teal-400));
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
    margin: 12px 0 8px;
}

.glass-card__label {
    font-family: var(--font-accent);
    font-size: var(--text-xs);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--warm-gray-500);
    font-weight: 500;
}

/* Accessibility: Reduced motion */
@media (prefers-reduced-motion: reduce) {
    .glass-card {
        transition: none;
    }
    .glass-card:hover {
        transform: none;
    }
}

2. Fluid Organic "Optimization Station"

Visual Design (2026 Update):

  • Asymmetric layout with flowing shapes
  • Glassmorphic input fields
  • Morphing toggle switches with liquid animation
  • Segmented control with sliding glass indicator
  • Primary CTA: Teal gradient with mesh texture overlay

Code Pattern:

const OptimizationStation = () => {
    const [url, setUrl] = useState('');
    const [keyword, setKeyword] = useState('');
    const [options, setOptions] = useState({
        fixTitle: true,
        enhanceContent: true,
        generateImage: true
    });
    const [style, setStyle] = useState('authentic');
    const [isRunning, setIsRunning] = useState(false);

    return (
        <div className="optimization-station">
            <div className="station-blob-bg">
                <div className="blob blob-1"></div>
                <div className="blob blob-2"></div>
            </div>
            
            <h2 className="station-title">
                ✨ Optimization Station
            </h2>
            
            <div className="station-inputs">
                <GlassInput
                    type="url"
                    placeholder="https://griddleking.com/my-post..."
                    value={url}
                    onChange={setUrl}
                    icon="πŸ”—"
                />
                <GlassInput
                    type="text"
                    placeholder="target keyword"
                    value={keyword}
                    onChange={setKeyword}
                    icon="🎯"
                />
            </div>

            <div className="station-options">
                <LiquidToggle
                    label="Fix Title (High CTR)"
                    checked={options.fixTitle}
                    onChange={v => setOptions({...options, fixTitle: v})}
                />
                <LiquidToggle
                    label="Enhance Content"
                    checked={options.enhanceContent}
                    onChange={v => setOptions({...options, enhanceContent: v})}
                />
                <LiquidToggle
                    label="Generate Visuals"
                    checked={options.generateImage}
                    onChange={v => setOptions({...options, generateImage: v})}
                />
            </div>

            <FluidSegmentedControl
                options={[
                    { value: 'authentic', label: 'Authentic' },
                    { value: 'professional', label: 'Pro' },
                    { value: 'viral', label: 'Viral' }
                ]}
                value={style}
                onChange={setStyle}
            />

            <button
                className="btn-transformative"
                onClick={handleOptimize}
                disabled={isRunning}
            >
                {isRunning ? (
                    <>
                        <LiquidSpinner /> Transforming...
                    </>
                ) : (
                    <>
                        <SparkleIcon /> Run Optimization
                    </>
                )}
            </button>
        </div>
    );
};

/* CSS - Organic fluid station */
.optimization-station {
    position: relative;
    background: var(--cream);
    border-radius: 32px 40px 32px 36px;
    padding: clamp(32px, 5vw, 48px);
    box-shadow: 
        0 20px 60px rgba(0, 0, 0, 0.06),
        0 0 0 1px var(--warm-gray-200);
}

.station-blob-bg {
    position: absolute;
    inset: 0;
    overflow: hidden;
    border-radius: inherit;
    z-index: 0;
}

.blob {
    position: absolute;
    border-radius: 40% 60% 70% 30% / 40% 50% 60% 50%;
    filter: blur(40px);
    opacity: 0.15;
    animation: blob-morph 20s ease-in-out infinite;
}

.blob-1 {
    width: 300px;
    height: 300px;
    background: var(--teal-300);
    top: -150px;
    right: -100px;
}

.blob-2 {
    width: 250px;
    height: 250px;
    background: var(--mint);
    bottom: -100px;
    left: -80px;
    animation-delay: -10s;
}

@keyframes blob-morph {
    0%, 100% {
        border-radius: 40% 60% 70% 30% / 40% 50% 60% 50%;
        transform: rotate(0deg);
    }
    50% {
        border-radius: 70% 30% 50% 50% / 30% 60% 40% 70%;
        transform: rotate(180deg);
    }
}

/* Transformative CTA Button */
.btn-transformative {
    position: relative;
    background: linear-gradient(135deg, var(--teal-500) 0%, var(--teal-700) 100%);
    color: white;
    border: none;
    border-radius: 16px;
    padding: 18px 36px;
    font-family: var(--font-display);
    font-size: var(--text-lg);
    font-weight: 600;
    cursor: pointer;
    transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    box-shadow: 
        0 8px 24px rgba(0, 168, 150, 0.25),
        inset 0 1px 0 rgba(255, 255, 255, 0.2);
    overflow: hidden;
}

.btn-transformative::before {
    content: '';
    position: absolute;
    inset: 0;
    background: url("data:image/svg+xml,%3Csvg width='100' height='100' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' /%3E%3C/filter%3E%3Crect width='100' height='100' filter='url(%23noise)' opacity='0.05'/%3E%3C/svg%3E");
    opacity: 0.3;
    mix-blend-mode: overlay;
}

.btn-transformative:hover:not(:disabled) {
    transform: translateY(-2px);
    box-shadow: 
        0 12px 32px rgba(0, 168, 150, 0.35),
        inset 0 1px 0 rgba(255, 255, 255, 0.3);
}

.btn-transformative:active:not(:disabled) {
    transform: translateY(0);
}

.btn-transformative:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

3. iOS-Style Toggle Switch

Code Pattern:

const ToggleSwitch = ({ checked, onChange, label }) => (
    <label className="toggle-wrapper">
        <input
            type="checkbox"
            checked={checked}
            onChange={e => onChange(e.target.checked)}
            className="toggle-input"
        />
        <span className="toggle-slider"></span>
        <span className="toggle-label">{label}</span>
    </label>
);

// CSS
.toggle-wrapper {
    display: flex;
    align-items: center;
    gap: 12px;
    cursor: pointer;
    user-select: none;
}

.toggle-input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
}

.toggle-slider {
    position: relative;
    display: inline-block;
    width: 48px;
    height: 28px;
    background: #e5e7eb;
    border-radius: 14px;
    transition: background 0.3s ease;
}

.toggle-slider::after {
    content: '';
    position: absolute;
    width: 24px;
    height: 24px;
    left: 2px;
    top: 2px;
    background: white;
    border-radius: 50%;
    transition: transform 0.3s ease;
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

.toggle-input:checked + .toggle-slider {
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}

.toggle-input:checked + .toggle-slider::after {
    transform: translateX(20px);
}

.toggle-label {
    font-size: 14px;
    color: #374151;
}

4. Progress Stepper (Loading State)

Visual Design:

  • Horizontal stepper with animated progress
  • Purple gradient for active/completed steps
  • Smooth transitions between steps
  • Spinner animation for current step

Code Pattern:

const ProgressStepper = ({ currentStep, steps }) => (
    <div className="progress-stepper">
        {steps.map((step, idx) => (
            <div
                key={idx}
                className={`step ${
                    idx < currentStep ? 'step--completed' :
                    idx === currentStep ? 'step--active' :
                    'step--pending'
                }`}
            >
                <div className="step-indicator">
                    {idx < currentStep ? (
                        <CheckIcon />
                    ) : idx === currentStep ? (
                        <Spinner />
                    ) : (
                        idx + 1
                    )}
                </div>
                <div className="step-label">{step}</div>
                {idx < steps.length - 1 && (
                    <div className="step-connector" />
                )}
            </div>
        ))}
    </div>
);

// Usage
<ProgressStepper
    currentStep={2}
    steps={[
        'Reading Content',
        'Claude is Thinking',
        'Imagen is Painting',
        'Finalizing'
    ]}
/>

5. Before/After Comparison Card

Code Pattern:

const ComparisonCard = ({ before, after, label }) => (
    <div className="comparison-card">
        <div className="comparison-header">{label}</div>
        <div className="comparison-panels">
            <div className="comparison-panel comparison-panel--before">
                <div className="comparison-label">Before</div>
                <div className="comparison-content">{before}</div>
            </div>
            <div className="comparison-divider">β†’</div>
            <div className="comparison-panel comparison-panel--after">
                <div className="comparison-label">After</div>
                <div className="comparison-content">{after}</div>
            </div>
        </div>
    </div>
);

// CSS
.comparison-card {
    background: white;
    border-radius: 12px;
    padding: 24px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}

.comparison-panels {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    gap: 16px;
    margin-top: 16px;
}

.comparison-panel {
    background: #f9fafb;
    border-radius: 8px;
    padding: 16px;
}

.comparison-panel--after {
    background: linear-gradient(135deg, #f3f4f6 0%, #e5e7eb 100%);
}

.comparison-label {
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    color: #6b7280;
    margin-bottom: 8px;
}

.comparison-divider {
    display: flex;
    align-items: center;
    color: #667eea;
    font-size: 24px;
}

Typography: Variable Fonts + Kinetic Type (2026)

Font Stack - Beyond System Defaults:

:root {
    /* Display: Variable font for kinetic effects */
    --font-display: 'Outfit Variable', 'Plus Jakarta Sans', system-ui, sans-serif;
    
    /* Body: Humanist sans-serif, warm and readable */
    --font-body: 'Satoshi', 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
    
    /* Accent: Slightly condensed for density */
    --font-accent: 'Manrope Variable', 'Inter', sans-serif;
    
    /* Mono: For code/technical content */
    --font-mono: 'JetBrains Mono', 'Cascadia Code', 'SF Mono', monospace;
    
    /* Variable font settings */
    --font-weight-light: 300;
    --font-weight-regular: 400;
    --font-weight-medium: 500;
    --font-weight-semibold: 600;
    --font-weight-bold: 700;
}

/* Load modern variable fonts */
@import url('https://fonts.googleapis.com/css2?family=Outfit:wght@300..700&display=swap');
@import url('https://api.fontshare.com/v2/css?f[]=satoshi@400,500,700&display=swap');

body.magic-seo-page {
    font-family: var(--font-body);
    font-optical-sizing: auto;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
    font-feature-settings: 'kern' 1, 'liga' 1, 'calt' 1;
}

Type Scale (Fluid Typography):

:root {
    /* Responsive type scale using clamp() */
    --text-xs: clamp(0.69rem, 0.66rem + 0.17vw, 0.75rem);      /* 11-12px */
    --text-sm: clamp(0.83rem, 0.78rem + 0.24vw, 0.94rem);      /* 13-15px */
    --text-base: clamp(1rem, 0.93rem + 0.33vw, 1.13rem);       /* 16-18px */
    --text-lg: clamp(1.2rem, 1.09rem + 0.47vw, 1.41rem);       /* 19-23px */
    --text-xl: clamp(1.44rem, 1.28rem + 0.68vw, 1.76rem);      /* 23-28px */
    --text-2xl: clamp(1.73rem, 1.5rem + 0.98vw, 2.2rem);       /* 28-35px */
    --text-3xl: clamp(2.07rem, 1.76rem + 1.37vw, 2.75rem);     /* 33-44px */
    --text-4xl: clamp(2.49rem, 2.05rem + 1.87vw, 3.43rem);     /* 40-55px */
}

/* Typography hierarchy */
.heading-hero {
    font-family: var(--font-display);
    font-size: var(--text-4xl);
    font-weight: var(--font-weight-bold);
    line-height: 1.1;
    letter-spacing: -0.02em;
    font-variation-settings: 'wght' 700, 'wdth' 100;
}

.heading-section {
    font-family: var(--font-display);
    font-size: var(--text-2xl);
    font-weight: var(--font-weight-semibold);
    line-height: 1.3;
    letter-spacing: -0.01em;
}

.metric-value {
    font-family: var(--font-display);
    font-size: var(--text-4xl);
    font-weight: var(--font-weight-bold);
    line-height: 1;
    font-variant-numeric: tabular-nums;
    letter-spacing: -0.03em;
}

.label-caps {
    font-family: var(--font-accent);
    font-size: var(--text-xs);
    font-weight: var(--font-weight-medium);
    text-transform: uppercase;
    letter-spacing: 0.08em;
    color: var(--warm-gray-500);
}

.body-text {
    font-family: var(--font-body);
    font-size: var(--text-base);
    font-weight: var(--font-weight-regular);
    line-height: 1.6;
    color: var(--warm-gray-700);
}

Kinetic Typography (2026 Trend):

// Animated weight shift on hover
const KineticButton = ({ children }) => (
    <button className="kinetic-btn">
        {children}
    </button>
);

/* CSS with variable font animation */
.kinetic-btn {
    font-family: var(--font-display);
    font-weight: 500;
    font-variation-settings: 'wght' 500;
    transition: font-variation-settings 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

.kinetic-btn:hover {
    font-variation-settings: 'wght' 700;
}

/* Scroll-reactive heading weight */
.hero-title {
    font-variation-settings: 'wght' var(--scroll-weight);
    transition: font-variation-settings 0.1s ease-out;
}

/* JavaScript to animate based on scroll */
window.addEventListener('scroll', () => {
    const scrollPercent = window.scrollY / 500;
    const weight = Math.min(300 + (scrollPercent * 400), 700);
    document.documentElement.style.setProperty('--scroll-weight', weight);
});

Typography Best Practices:

  • Use variable fonts for smooth weight transitions
  • Implement fluid type scale with clamp() for true responsive typography
  • Apply kinetic effects sparingly (hero sections, primary CTAs)
  • Maintain WCAG AAA contrast ratios (7:1 for normal text, 4.5:1 for large)
  • Use tabular numerals for metric displays
  • Enable OpenType features: ligatures, kerning, contextual alternates

2026 Color Palette: Transformative Teal + Earth-First System

Primary Palette:

:root {
    /* Transformative Teal (2026 Color of Year) - Coloro 092-37-14 */
    --teal-50: #e6f7f5;
    --teal-100: #b3e8e1;
    --teal-200: #80d9cd;
    --teal-300: #4dcab9;
    --teal-400: #26b8a3;
    --teal-500: #00a896;  /* Primary - Transformative Teal */
    --teal-600: #00968a;
    --teal-700: #007a6e;
    --teal-800: #005f52;
    --teal-900: #004436;
    
    /* Complementary Vibrant Accents (WGSN S/S 2026) */
    --fuchsia: #e91e63;     /* Electric Fuchsia - urgent actions */
    --amber: #ffb74d;       /* Amber Haze - warnings, highlights */
    --mint: #81c784;        /* Jelly Mint - success states */
    --coral: #ff6b6b;       /* Coral-orange - complementary to teal */
    
    /* Earth Tones (grounding, natural) */
    --terracotta: #d4826f;
    --clay: #c4a68a;
    --sand: #e8d9c3;
    --stone: #9e9e9e;
    
    /* Neutrals - Warm bias for humanization */
    --cream: #faf8f5;       /* Backgrounds - not pure white */
    --off-white: #f5f3f0;
    --warm-gray-100: #ebe9e5;
    --warm-gray-200: #d6d4cf;
    --warm-gray-300: #b8b5ae;
    --warm-gray-500: #7a7770;
    --warm-gray-700: #4a4741;
    --warm-gray-900: #2b2825;
    
    /* Glassmorphism overlays */
    --glass-white: rgba(255, 255, 255, 0.15);
    --glass-blur: 12px;
    --glass-border: rgba(255, 255, 255, 0.25);
    
    /* Semantic colors - tied to teal system */
    --success: var(--mint);
    --warning: var(--amber);
    --error: var(--coral);
    --info: var(--teal-400);
}

Color Usage Philosophy:

  1. Transformative Teal (Primary):

    • Main CTAs, AI-powered features
    • Active states, selected items
    • Progress indicators, data visualizations
    • Links and interactive elements
    • Psychology: Trust + Innovation + Eco-consciousness
  2. Vibrant Accents (Strategic pops):

    • Fuchsia: High-urgency actions, notifications
    • Amber: Warnings, important highlights
    • Mint: Success confirmations, positive feedback
    • Coral: Delete actions, critical warnings
  3. Earth Tones (Grounding):

    • Secondary cards and panels
    • Dividers and subtle backgrounds
    • Illustrative elements
    • Creates warmth and authenticity
  4. Warm Neutrals (Base):

    • Cream/off-white backgrounds (never pure #ffffff)
    • Text hierarchy from warm-gray-900 to warm-gray-500
    • Subtle borders and dividers
    • Humanizes the digital space

Accessibility Requirements:

  • Teal-500 on cream background: 5.2:1 contrast (AA+ for large text)
  • Warm-gray-900 on cream: 9.8:1 contrast (AAA compliant)
  • All interactive elements: minimum 3:1 contrast ratio
  • Dark mode: Invert to dark-teal-900 base with teal-300 accents

Animation & Micro-Delight (2026)

Principles - Functional Animation:

  • Purposeful motion reduces cognitive load, not just decoration
  • Micro-delight creates memorable moments through subtle unexpected behavior
  • Natural easing mimics physics: spring animations, bounce, elastic
  • Performance-first uses transform/opacity only, GPU-accelerated
  • Respects preferences honors prefers-reduced-motion

Spring-Based Easing (2026 Standard):

:root {
    /* Spring physics easing curves */
    --ease-spring: cubic-bezier(0.68, -0.55, 0.265, 1.55);
    --ease-bounce: cubic-bezier(0.68, -0.6, 0.32, 1.6);
    --ease-elastic: cubic-bezier(0.87, -0.41, 0.19, 1.44);
    --ease-smooth: cubic-bezier(0.4, 0, 0.2, 1);
    
    /* Duration tokens */
    --duration-instant: 100ms;
    --duration-quick: 200ms;
    --duration-normal: 300ms;
    --duration-slow: 500ms;
    --duration-slower: 700ms;
}

Micro-Delight Examples:

  1. Liquid Toggle Switch (Beyond iOS):
const LiquidToggle = ({ checked, onChange, label }) => {
    return (
        <label className="liquid-toggle">
            <input
                type="checkbox"
                checked={checked}
                onChange={e => onChange(e.target.checked)}
                className="liquid-toggle__input"
            />
            <div className="liquid-toggle__track">
                <div className="liquid-toggle__thumb">
                    <div className="liquid-toggle__liquid"></div>
                </div>
            </div>
            <span className="liquid-toggle__label">{label}</span>
        </label>
    );
};

/* CSS - Liquid morphing animation */
.liquid-toggle {
    display: flex;
    align-items: center;
    gap: 12px;
    cursor: pointer;
    user-select: none;
}

.liquid-toggle__input {
    position: absolute;
    opacity: 0;
    width: 0;
    height: 0;
}

.liquid-toggle__track {
    position: relative;
    width: 56px;
    height: 32px;
    background: var(--warm-gray-200);
    border-radius: 16px;
    transition: background 0.4s var(--ease-smooth);
}

.liquid-toggle__thumb {
    position: absolute;
    width: 28px;
    height: 28px;
    left: 2px;
    top: 2px;
    background: white;
    border-radius: 50%;
    transition: transform 0.5s var(--ease-elastic);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
    overflow: hidden;
}

.liquid-toggle__liquid {
    position: absolute;
    inset: 0;
    background: radial-gradient(circle, var(--teal-400), var(--teal-600));
    border-radius: 50%;
    transform: scale(0);
    transition: transform 0.6s var(--ease-elastic);
}

.liquid-toggle__input:checked + .liquid-toggle__track {
    background: var(--teal-100);
}

.liquid-toggle__input:checked + .liquid-toggle__track .liquid-toggle__thumb {
    transform: translateX(24px);
}

.liquid-toggle__input:checked + .liquid-toggle__track .liquid-toggle__liquid {
    transform: scale(1);
}

/* Squish effect on press */
.liquid-toggle__input:active + .liquid-toggle__track .liquid-toggle__thumb {
    transform: scaleX(1.2) scaleY(0.9);
}

.liquid-toggle__input:checked:active + .liquid-toggle__track .liquid-toggle__thumb {
    transform: translateX(24px) scaleX(1.2) scaleY(0.9);
}
  1. Button with Haptic Feedback Feel:
const HapticButton = ({ children, onClick, ...props }) => {
    const [isPressed, setIsPressed] = useState(false);
    
    return (
        <button
            className={`haptic-btn ${isPressed ? 'is-pressed' : ''}`}
            onMouseDown={() => setIsPressed(true)}
            onMouseUp={() => setIsPressed(false)}
            onMouseLeave={() => setIsPressed(false)}
            onClick={onClick}
            {...props}
        >
            <span className="haptic-btn__bg"></span>
            <span className="haptic-btn__content">{children}</span>
        </button>
    );
};

/* CSS */
.haptic-btn {
    position: relative;
    border: none;
    background: transparent;
    padding: 14px 28px;
    border-radius: 12px;
    cursor: pointer;
    font-family: var(--font-display);
    font-weight: 600;
    overflow: hidden;
    transition: transform 0.2s var(--ease-spring);
}

.haptic-btn__bg {
    position: absolute;
    inset: 0;
    background: var(--teal-500);
    border-radius: inherit;
    transition: transform 0.3s var(--ease-elastic);
}

.haptic-btn__content {
    position: relative;
    z-index: 1;
    color: white;
    display: flex;
    align-items: center;
    gap: 8px;
}

.haptic-btn:hover .haptic-btn__bg {
    transform: scale(1.05);
}

.haptic-btn.is-pressed .haptic-btn__bg {
    transform: scale(0.95);
}

.haptic-btn:active {
    transform: scale(0.98);
}
  1. Morphing Progress Indicator:
const MorphingProgress = ({ steps, currentStep }) => {
    return (
        <div className="morphing-progress">
            {steps.map((step, idx) => (
                <div
                    key={idx}
                    className={`morph-step ${
                        idx < currentStep ? 'is-complete' :
                        idx === currentStep ? 'is-active' :
                        'is-pending'
                    }`}
                >
                    <div className="morph-step__dot">
                        {idx < currentStep && (
                            <svg className="morph-step__check" viewBox="0 0 16 16">
                                <path
                                    d="M3 8l3 3 7-7"
                                    fill="none"
                                    stroke="currentColor"
                                    strokeWidth="2"
                                    strokeLinecap="round"
                                />
                            </svg>
                        )}
                        {idx === currentStep && (
                            <div className="morph-step__ripple"></div>
                        )}
                    </div>
                    <div className="morph-step__label">{step}</div>
                    {idx < steps.length - 1 && (
                        <div className="morph-connector">
                            <div 
                                className="morph-connector__fill"
                                style={{ 
                                    width: idx < currentStep ? '100%' : '0%' 
                                }}
                            ></div>
                        </div>
                    )}
                </div>
            ))}
        </div>
    );
};

/* CSS */
.morph-step__dot {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    background: var(--warm-gray-200);
    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    transition: all 0.5s var(--ease-spring);
}

.morph-step.is-complete .morph-step__dot {
    background: var(--teal-500);
    transform: rotate(360deg);
}

.morph-step.is-active .morph-step__dot {
    background: var(--teal-400);
    transform: scale(1.15);
}

.morph-step__check {
    width: 16px;
    height: 16px;
    color: white;
    animation: check-draw 0.5s var(--ease-spring);
}

@keyframes check-draw {
    0% {
        stroke-dasharray: 0 20;
    }
    100% {
        stroke-dasharray: 20 20;
    }
}

.morph-step__ripple {
    position: absolute;
    inset: 0;
    border-radius: 50%;
    border: 2px solid var(--teal-400);
    animation: ripple-pulse 2s var(--ease-smooth) infinite;
}

@keyframes ripple-pulse {
    0% {
        transform: scale(1);
        opacity: 1;
    }
    100% {
        transform: scale(1.8);
        opacity: 0;
    }
}

.morph-connector {
    flex: 1;
    height: 2px;
    background: var(--warm-gray-200);
    position: relative;
    margin: 0 8px;
}

.morph-connector__fill {
    position: absolute;
    inset: 0;
    background: linear-gradient(90deg, var(--teal-500), var(--teal-400));
    transition: width 0.8s var(--ease-smooth);
}
  1. Scroll-Triggered Reveal Animations:
// Use Intersection Observer for performance
const useScrollReveal = (threshold = 0.1) => {
    const [isVisible, setIsVisible] = useState(false);
    const ref = useRef(null);
    
    useEffect(() => {
        const observer = new IntersectionObserver(
            ([entry]) => {
                if (entry.isIntersecting) {
                    setIsVisible(true);
                }
            },
            { threshold }
        );
        
        if (ref.current) {
            observer.observe(ref.current);
        }
        
        return () => observer.disconnect();
    }, [threshold]);
    
    return [ref, isVisible];
};

// Component usage
const RevealCard = ({ children, delay = 0 }) => {
    const [ref, isVisible] = useScrollReveal();
    
    return (
        <div
            ref={ref}
            className={`reveal-card ${isVisible ? 'is-visible' : ''}`}
            style={{ '--reveal-delay': `${delay}ms` }}
        >
            {children}
        </div>
    );
};

/* CSS */
.reveal-card {
    opacity: 0;
    transform: translateY(30px);
    transition: 
        opacity 0.6s var(--ease-smooth) var(--reveal-delay),
        transform 0.6s var(--ease-spring) var(--reveal-delay);
}

.reveal-card.is-visible {
    opacity: 1;
    transform: translateY(0);
}

Accessibility & Performance:

/* Respect user preferences */
@media (prefers-reduced-motion: reduce) {
    *,
    *::before,
    *::after {
        animation-duration: 0.01ms !important;
        animation-iteration-count: 1 !important;
        transition-duration: 0.01ms !important;
    }
    
    .liquid-toggle__thumb {
        transition: transform 0.2s ease;
    }
    
    .reveal-card {
        opacity: 1;
        transform: none;
    }
}

/* GPU acceleration */
.gpu-accelerated {
    will-change: transform;
    transform: translateZ(0);
}

/* Remove will-change after animation */
.gpu-accelerated:not(:hover):not(.is-animating) {
    will-change: auto;
}

Settings Page Pattern

For the "Settings & Connections" tab:

const SettingsPage = () => {
    const [apiKeys, setApiKeys] = useState({
        anthropic: '',
        gemini: '',
        openai: ''
    });
    
    return (
        <div className="settings-page">
            <div className="settings-section">
                <h3 className="settings-section-title">API Connections</h3>
                <p className="settings-section-desc">
                    Connect the AI services that power your content optimization.
                </p>
                
                <div className="settings-fields">
                    <ApiKeyField
                        label="Anthropic API Key"
                        value={apiKeys.anthropic}
                        onChange={v => setApiKeys({...apiKeys, anthropic: v})}
                        placeholder="sk-ant-..."
                        helpText="Used for Claude-powered title and content optimization"
                    />
                    
                    <ApiKeyField
                        label="Google Gemini API Key"
                        value={apiKeys.gemini}
                        onChange={v => setApiKeys({...apiKeys, gemini: v})}
                        placeholder="AIza..."
                        helpText="Used for Imagen 4 image generation"
                    />
                </div>
                
                <button className="btn-save">
                    Save Settings
                </button>
            </div>
        </div>
    );
};

const ApiKeyField = ({ label, value, onChange, placeholder, helpText }) => (
    <div className="field">
        <label className="field-label">{label}</label>
        <input
            type="password"
            className="field-input field-input--secret"
            value={value}
            onChange={e => onChange(e.target.value)}
            placeholder={placeholder}
        />
        {helpText && (
            <p className="field-help">{helpText}</p>
        )}
    </div>
);

Media Studio Pattern

Grid layout with asset cards:

const MediaStudio = () => {
    const [assets, setAssets] = useState([]);
    const [generating, setGenerating] = useState(false);
    
    return (
        <div className="media-studio">
            <div className="studio-generator">
                <input
                    type="text"
                    placeholder="Describe the image you want to generate..."
                    className="studio-input"
                />
                <select className="studio-style-select">
                    <option value="authentic">Authentic Griddle</option>
                    <option value="cinematic">Cinematic Macro</option>
                    <option value="landscape">Wide Landscape</option>
                </select>
                <button className="btn-magic" disabled={generating}>
                    {generating ? 'Generating...' : 'Generate Image'}
                </button>
            </div>
            
            <div className="asset-grid">
                {assets.map(asset => (
                    <AssetCard key={asset.id} asset={asset} />
                ))}
            </div>
        </div>
    );
};

const AssetCard = ({ asset }) => (
    <div className="asset-card">
        <img src={asset.url} alt={asset.prompt} />
        <div className="asset-actions">
            <button className="asset-btn">Download</button>
            <button className="asset-btn">To Media Library</button>
            <button className="asset-btn asset-btn--danger">Delete</button>
        </div>
    </div>
);

// CSS
.asset-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
    gap: 20px;
    margin-top: 32px;
}

.asset-card {
    background: white;
    border-radius: 12px;
    overflow: hidden;
    box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}

.asset-card img {
    width: 100%;
    height: 200px;
    object-fit: cover;
}

.asset-actions {
    padding: 12px;
    display: flex;
    gap: 8px;
}

.asset-btn {
    flex: 1;
    padding: 8px;
    font-size: 12px;
    border-radius: 6px;
    border: 1px solid var(--gray-300);
    background: white;
    cursor: pointer;
    transition: all 0.2s ease;
}

.asset-btn:hover {
    background: var(--gray-50);
}

.asset-btn--danger {
    color: var(--error);
    border-color: var(--error);
}

WordPress Admin Integration

Registering the Admin Page:

add_action('admin_menu', 'magic_seo_register_admin_page');

function magic_seo_register_admin_page() {
    add_menu_page(
        'Magic SEO',           // Page title
        'Magic SEO',           // Menu title
        'manage_options',      // Capability
        'magic-seo',           // Menu slug
        'magic_seo_render_page', // Callback
        'dashicons-superhero', // Icon (or custom SVG)
        30                     // Position
    );
}

function magic_seo_render_page() {
    ?>
    <div class="wrap magic-seo-wrap">
        <div id="magic-seo-root"></div>
    </div>
    <?php
}

Loading Custom Fonts:

function magic_seo_enqueue_fonts() {
    // Load Inter for number displays
    wp_enqueue_style(
        'google-fonts-inter',
        'https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700&display=swap',
        [],
        null
    );
}
add_action('admin_enqueue_scripts', 'magic_seo_enqueue_fonts');

Humanization Elements (2026 Anti-AI-Slop)

Philosophy: As AI-generated content floods the web, users crave authenticity. Humanization elements signal "real people made this" and create emotional connection.

Techniques:

  1. Hand-Drawn Accents (SVG):
// Underline effect - imperfect, organic
const HandDrawnUnderline = () => (
    <svg className="hand-underline" viewBox="0 0 200 10" preserveAspectRatio="none">
        <path
            d="M 0 5 Q 50 3, 100 5 T 200 5"
            stroke="var(--teal-400)"
            strokeWidth="2"
            fill="none"
            strokeLinecap="round"
        />
    </svg>
);

.hand-underline {
    position: absolute;
    bottom: -4px;
    left: 0;
    width: 100%;
    height: 10px;
    opacity: 0.6;
}

// Handwritten labels
.handwritten-note {
    font-family: 'Caveat', 'Permanent Marker', cursive;
    color: var(--teal-600);
    transform: rotate(-2deg);
    position: relative;
}
  1. Organic Shapes & Blobs:
/* Asymmetric, natural shapes */
.organic-panel {
    border-radius: 
        32% 68% 68% 32% / 
        52% 32% 68% 48%;
    background: linear-gradient(135deg, 
        var(--teal-50), 
        var(--cream)
    );
}

/* Animated morphing blob */
@keyframes morph {
    0%, 100% {
        border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
    }
    50% {
        border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%;
    }
}

.blob-accent {
    animation: morph 8s ease-in-out infinite;
}
  1. Imperfect Grids:
/* Fluid grid with intentional breaks */
.organic-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: clamp(16px, 3vw, 32px);
}

.organic-grid > :nth-child(3n) {
    grid-column: span 2;
}

.organic-grid > :nth-child(5n) {
    transform: translateY(20px);
}
  1. Textured Backgrounds (Subtle noise):
.textured-surface {
    background-image: 
        radial-gradient(circle at 20% 50%, var(--teal-50) 0%, transparent 50%),
        radial-gradient(circle at 80% 80%, var(--mint) 0%, transparent 50%),
        url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' /%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)' opacity='0.03'/%3E%3C/svg%3E");
    background-blend-mode: soft-light;
}
  1. Doodle Icons (Instead of perfect SVGs):
// Wobbly circle icon
const DoodleCircle = () => (
    <svg viewBox="0 0 100 100" className="doodle-icon">
        <path
            d="M 95 50 Q 95 20, 70 8 Q 50 0, 25 8 Q 5 20, 5 50 Q 5 75, 25 90 Q 50 100, 70 90 Q 95 75, 95 50"
            fill="none"
            stroke="var(--teal-500)"
            strokeWidth="3"
            strokeLinecap="round"
        />
    </svg>
);

.doodle-icon {
    width: 24px;
    height: 24px;
    filter: url(#rough);
}

/* SVG filter for hand-drawn effect */
<defs>
    <filter id="rough">
        <feTurbulence 
            type="turbulence" 
            baseFrequency="0.05" 
            numOctaves="2" 
            result="turbulence"
        />
        <feDisplacementMap 
            in2="turbulence" 
            in="SourceGraphic" 
            scale="2"
        />
    </filter>
</defs>

Critical Guidelines (2026)

Critical Guidelines (2026)

DO:

  • Use Transformative Teal as primary color (not purple/indigo)
  • Apply glassmorphism to create depth and hierarchy
  • Implement fluid, organic layouts (break the grid intentionally)
  • Add hand-drawn accents and imperfect elements for warmth
  • Use variable fonts with kinetic typography effects
  • Animate with spring physics (elastic, bounce easing)
  • Implement micro-delight interactions that surprise
  • Respect prefers-reduced-motion for accessibility
  • Use warm neutral backgrounds (cream, not pure white)
  • Layer transparent elements with backdrop-filter blur
  • Create asymmetric, natural border-radius values
  • Implement scroll-triggered reveals with Intersection Observer
  • Test dark mode with proper contrast ratios
  • Use gradient text for emphasis (background-clip: text)
  • Add subtle texture/noise to surfaces
  • Animate progress with morphing shapes

DON'T:

  • Use outdated purple/indigo gradients (2020-2024 AI clichΓ©)
  • Create flat interfaces without depth/transparency
  • Apply rigid 12-column grid systems without breaks
  • Use generic system fonts (Inter, Roboto, Arial)
  • Ignore glassmorphism accessibility (text must be readable)
  • Animate everything (purposeful motion only)
  • Use pure white (#ffffff) backgrounds
  • Create uniform border-radius (16px on all corners)
  • Forget about backdrop-filter browser support fallbacks
  • Use low-contrast neumorphism (accessibility issue)
  • Apply animations without performance consideration
  • Ignore environmental sustainability (optimize assets)
  • Use solid colors without transparency layers
  • Create generic, template-like designs
  • Overuse blur effects (performance impact)

2026-Specific Principles:

  1. Machine Experience (MX) Awareness: While designing for humans, ensure semantic HTML and proper structure for AI agents that may parse the interface

  2. Performance = Sustainability: Lighter code = less energy consumption. Optimize images, use modern formats (WebP, AVIF), lazy load

  3. Accessibility = Baseline: WCAG AAA contrast ratios, keyboard navigation, screen reader support, focus indicators

  4. Dark Mode Native: Design in dark mode first, then adapt to light mode (not reverse)

  5. Fluid Everything: Use clamp() for typography, spacing, sizing. No fixed pixel values

  6. Component Composition: Build with atomic design - small, reusable components that combine

  7. Progressive Enhancement: Core functionality works without JavaScript, enhance with interactions

Responsive Considerations

Breakpoints:

/* Mobile first approach */
.dashboard-cards {
    display: grid;
    grid-template-columns: 1fr;
    gap: 16px;
}

/* Tablet */
@media (min-width: 768px) {
    .dashboard-cards {
        grid-template-columns: repeat(2, 1fr);
    }
}

/* Desktop */
@media (min-width: 1024px) {
    .dashboard-cards {
        grid-template-columns: repeat(3, 1fr);
        gap: 20px;
    }
}

Success State Example

When "Run Magic Optimization" completes:

const SuccessState = ({ results }) => (
    <div className="success-state">
        <div className="success-icon">✨</div>
        <h3 className="success-title">Optimization Complete!</h3>
        
        <ComparisonCard
            label="Title Optimization"
            before={results.title.before}
            after={results.title.after}
        />
        
        {results.image && (
            <div className="success-image">
                <img src={results.image.url} alt="Generated featured image" />
                <p className="image-caption">AI-generated featured image</p>
            </div>
        )}
        
        <div className="success-actions">
            <button className="btn-primary">Publish Changes</button>
            <button className="btn-secondary">Generate Again</button>
        </div>
    </div>
);

Implementation Checklist (2026)

When implementing a WordPress plugin frontend using this skill:

Phase 1: Foundation

  1. βœ… Choose React (@wordpress/element) vs Vanilla JS
  2. βœ… Set up proper WordPress script enqueueing with dependencies
  3. βœ… Define Transformative Teal color system with CSS custom properties
  4. βœ… Load variable fonts (Outfit, Satoshi, or similar)
  5. βœ… Implement fluid type scale with clamp()
  6. βœ… Set up dark mode color tokens

Phase 2: Layout & Structure

  1. βœ… Create fluid, organic grid system (not rigid)
  2. βœ… Design glassmorphic card components
  3. βœ… Implement backdrop-filter with fallbacks
  4. βœ… Add asymmetric border-radius patterns
  5. βœ… Create blob background animations
  6. βœ… Build responsive breakpoint system

Phase 3: Interactions

  1. βœ… Implement liquid toggle switches
  2. βœ… Create haptic-feel button components
  3. βœ… Add morphing progress indicators
  4. βœ… Set up scroll-triggered reveals (Intersection Observer)
  5. βœ… Apply spring-based easing functions
  6. βœ… Add micro-delight animations

Phase 4: Humanization

  1. βœ… Add hand-drawn SVG accents
  2. βœ… Implement organic shape patterns
  3. βœ… Create textured backgrounds with noise
  4. βœ… Design doodle-style icons
  5. βœ… Add warm neutral color adjustments

Phase 5: Polish & Optimization

  1. βœ… Test glassmorphism text contrast (WCAG AAA)
  2. βœ… Implement prefers-reduced-motion support
  3. βœ… Optimize animations for 60fps
  4. βœ… Test dark mode thoroughly
  5. βœ… Add keyboard navigation
  6. βœ… Test with screen readers
  7. βœ… Optimize image formats (WebP, AVIF)
  8. βœ… Implement lazy loading
  9. βœ… Test across WordPress versions (6.4+)
  10. βœ… Validate semantic HTML structure (for AI/MX)
  11. βœ… Check Core Web Vitals scores

Phase 6: WordPress Integration

  1. βœ… Integrate with WordPress REST API
  2. βœ… Handle authentication/nonces properly
  3. βœ… Implement error boundaries (React)
  4. βœ… Add loading states for async operations
  5. βœ… Test AJAX fallbacks for non-REST environments
  6. βœ… Ensure RTL language support if needed

Performance Targets (2026)

  • Lighthouse Score: 95+ performance, 100 accessibility
  • Core Web Vitals:
    • LCP < 2.5s
    • FID < 100ms
    • CLS < 0.1
  • Bundle Size: < 150KB gzipped for main JS
  • First Paint: < 1.5s
  • Carbon Footprint: Grade A on Website Carbon Calculator

Example: Complete Dashboard Component

import { useState, useEffect } from '@wordpress/element';
import apiFetch from '@wordpress/api-fetch';

const MagicSEODashboard = () => {
    const [metrics, setMetrics] = useState(null);
    const [loading, setLoading] = useState(true);
    
    useEffect(() => {
        apiFetch({ path: '/magic-seo/v1/metrics' })
            .then(data => {
                setMetrics(data);
                setLoading(false);
            });
    }, []);
    
    if (loading) {
        return <SkeletonLoader />;
    }
    
    return (
        <div className="magic-seo-dashboard">
            <header className="dashboard-header">
                <h1>Magic SEO Command Center</h1>
                <StatusIndicator status="online" />
            </header>
            
            <div className="dashboard-metrics">
                <MetricCard
                    value={metrics.quickWins}
                    label="Quick Wins Available"
                    icon="πŸš€"
                />
                <MetricCard
                    value={`${metrics.decaying}/${metrics.dominating}`}
                    label="Decaying / Dominating"
                    icon="πŸ“‰"
                />
                <MetricCard
                    value="Claude 4.5 / Imagen 4"
                    label="Active AI Models"
                    icon="🧠"
                />
            </div>
            
            <OptimizationStation />
        </div>
    );
};

// Mount to WordPress
const root = document.getElementById('magic-seo-root');
if (root) {
    wp.element.render(<MagicSEODashboard />, root);
}

This skill will guide you to create a modern, distinctive WordPress plugin admin interface that feels premium, performs well, and delights users with its "Apple meets Outdoor Vlogging" aesthetic.