/* MedSpaCopy v4 — Content Plan screen. Reuses primitives + palette from screens-v4.jsx (P4, FONT_*, Marker_v4, MonoKicker_v4, Wordmark_v4, NavGroup, NavItem). No new visual language. Output: ContentPlan_v4 */ function ContentPlan_v4() { const ink = P4.ink, accent = P4.accent; /* Status badge — text-glyph + tinted background. Same vocabulary as ResearchDashboard's table. */ const StatusBadge = ({ kind }) => { const map = { delivered: { label: '+ delivered', fg: P4.good, bg: `color-mix(in oklab, ${P4.good} 12%, transparent)` }, inprogress:{ label: '~ in progress', fg: P4.accent, bg: `color-mix(in oklab, ${P4.accent} 10%, transparent)` }, notordered:{ label: '[ ] not ordered', fg: P4.inkSoft, bg: `color-mix(in oklab, ${P4.inkSoft} 10%, transparent)` }, }; const m = map[kind]; return ( {m.label} ); }; /* Topic card — three width modes: full (recommended), normal, delivered (deemphasized) */ const TopicCard = ({ t, recommended }) => { const isDelivered = t.status === 'delivered'; const isInProgress = t.status === 'inprogress'; const isOrderable = t.status === 'notordered'; return (
{/* Recommended ribbon — sits ON the card top edge */} {recommended && ( ★ Recommended next )} {/* Header row: status + service + progress (if any) */}
{t.service} {isInProgress && ( {t.progressLabel} )}
{/* Title — Fraunces, restrained */}

{t.title}

{/* Target keyword — mono + label */}
Target {t.target}
{/* Why this matters — single sentence */}

Why {t.why}

{/* In-progress detail rail — only on in-progress cards */} {isInProgress && (
{[ { l: 'Research', done: true }, { l: 'Drafting', done: true }, { l: 'Doctor review',done: false, active: true }, { l: 'Delivery', done: false }, ].map((s, i, arr) => (
{`0${i + 1}`}
{s.l}
))}
)} {/* Footer — cost / review / action */}
$250 · per article
R Clinical review included
{isOrderable && ( )} {isInProgress && ( )} {isDelivered && ( )}
); }; /* Month group header — kicker + count + thin rule */ const MonthHeader = ({ kicker, title, count, priority, status }) => (
{kicker}

{title}

{count} {status && ( {status} )}
); return (
{/* Sidebar — same as ResearchDashboard */} {/* Main */}
{/* Topbar */}
Workspace / Content plan
Search topics, services, claims… ⌘K
SM
{/* Page content */}
{/* LEFT */}
{/* Page header */}
Strategy Audit · Apr 2026 · 90-day plan

Content plan

Fourteen articles, prioritized by patient intent and visibility gap. Order one at a time. Every article is doctor-reviewed before it reaches a patient.

{/* Summary strip */}
{[ { v: '14', l: 'Topics in plan', sub: 'across 90 days' }, { v: '01', l: 'Delivered', sub: 'in your library', kind: 'good' }, { v: '01', l: 'In progress', sub: 'doctor review', kind: 'progress' }, { v: '12', l: 'Not ordered', sub: '11 weeks ahead', kind: 'queued' }, { v: '$1,250', l: 'Wallet balance', sub: '≈ 5 articles', warm: true }, ].map((s, i) => (
{s.v}
{s.l}
{s.sub}
))}
{/* Filter row */}
{[ { l: 'All', n: 14, active: true }, { l: 'Recommended', n: 1, warm: true }, { l: 'Not ordered', n: 12 }, { l: 'In progress', n: 1 }, { l: 'Delivered', n: 1 }, ].map((t, i) => ( {t.l} {String(t.n).padStart(2, '0')} ))}
Service All services
{/* === MONTH 1 === */}
{/* === MONTH 2 === */}
{[ { title: 'CoolSculpting candidacy: who it works for, who it doesn\u2019t', target: 'coolsculpting candidacy', why: 'Pre-consult filter. Reduces low-fit consultations.', service: 'CoolSculpting' }, { title: 'Lip filler styles: subtle, defined, full — visual guide', target: 'lip filler styles', why: 'Highest-intent comparison query. Drives consults.', service: 'Fillers' }, { title: 'Hydrafacial vs medical-grade facial: what\u2019s different', target: 'hydrafacial vs facial', why: 'Common confusion query. Owns local search.', service: 'Facials' }, { title: 'Choosing your injector: 7 questions patients should ask', target: 'how to choose injector', why: 'Trust-building. Differentiates your team.', service: 'Trust' }, ].map((t, i) => ( ))}
{/* === MONTH 3 === */}
{[ { title: 'Best med spa in Westlake: what to look for', target: 'med spa westlake', why: 'Underserved geo within your service radius.', service: 'Local' }, { title: 'Sun damage repair: treatment options compared', target: 'sun damage treatment', why: 'Seasonal high-intent. Pre-summer demand spike.', service: 'Skin' }, { title: 'Botox vs Dysport vs Xeomin: a clinician\u2019s read', target: 'botox vs dysport', why: 'Comparison query patients ask after consult.', service: 'Botox' }, { title: 'Body contouring without surgery: what actually works', target: 'non-surgical body contouring', why: 'Adjacent expansion category.', service: 'Body' }, ].map((t, i) => ( ))}
{/* RIGHT — workflow side panel */}
); } Object.assign(window, { ContentPlan_v4 });