// domain-pages.jsx — The three Knowledge Governance domain pages on one shared skeleton. // Per Minerva Domain Pages Build Spec v1.0. Situation-first, not capability-first. // Blocks: A Hero · B Situation · C How the integrated practice resolves it · // D Domain framework · (PD only) Sustaining phase · E Capability rows · // F Proof/outcome · G Closing band. // Global rules: no em-dashes, American spelling, no services/consulting language, // compliant describes the discipline, human in command. NavBar + Footer come from SiteChrome.jsx. const SPECTRUM = 'linear-gradient(90deg,#D51C29,#E0542A,#E0A230,#F2D12E,#8FBF3F,#069848,#1AA89A,#3FB1E5,#1C4DA1,#4A3BA8,#8B2CA8,#D20F8C)'; const KG_HOME = '/knowledge-governance/'; // Each discipline now has its own page; chips link straight to it. const DISCIPLINE_HREF = { 'Knowledge Management': '/knowledge-management/', 'Risk Management': '/risk-management/', 'Visualization': '/visualization/', 'Digitalization': '/digitalization/', }; function MinervaWayStrip({onDark}) { return (
the Minerva way
); } // ---------- DATA: the three domains ---------- const DOMAINS = { 'product-development': { accent: '#1C4DA1', icon: 'product-development.svg', heroImage: 'pd-hero.png', title: 'Product Development', tagline: 'Knowledge that holds from first principle to commercial product.', situation: { headline: 'Decisions are made fast, by people who understand why.', center: true, paras: [ 'Captured where the next person can find it, it keeps working after the team changes, ready when a tech transfer, an audit, or a change order asks the question years later.\nThat is knowledge that compounds across the lifecycle.', ], }, resolve: 'Visualization makes the process and its decisions legible to multidisciplinary teams, digitalization makes requirements and reasoning traceable and reusable, knowledge management governs that rationale from raw data to decision so it carries across handoffs, and risk management stays bound to the design.', hideResolvePills: true, disciplines: ['Visualization', 'Digitalization', 'Knowledge Management', 'Risk Management'], framework: { kind: 'lifecycle', eyebrow: 'The lifecycle frame', headline: '', intro: 'The product development lifecycle runs in phases, from first pitch to commercial product, and four activities run across every one: planning, requirements, risk, and deliverables. Governance is built into its shape, with a Design Line and a Design Lock that set when change is allowed.\n\nThis is the span the reasoning holds across.', phases: ['Definition', 'Concept', 'Feasibility', 'Design', 'Verification & Validation', 'Commercialization', 'Sustaining'], note: 'Planning, requirements, risk, and deliverables management run across every phase.', }, sustaining: { headline: 'Improvement is not a separate project. It is the lifecycle continuing.', body: 'Once a product or process is commercial, the same governed knowledge drives data-based optimization, capacity increase, and continuous improvement, risk-based and traceable, so the product keeps getting better without losing its history.', }, resolveImages: [ { img: 'pd-visual-mapping.png', caption: 'Visual-digital process mapping' }, ], rowsAsCards: true, rowsLead: 'Each activity runs across every phase of the PDP, on governed Visual-Digital Knowledge\u2122.', rows: [ { title: 'Planning and project management', color: '#1C4DA1', img: 'pd-planning.png', noFade: true, imgInset: true, body: 'Planning and project management run on shared operational data, so multidisciplinary teams work from one aligned view of the work.' }, { title: 'Requirements management', color: '#E0A230', img: 'pd-requirements.jpg', noFade: true, body: 'Requirements are visual, digitally connected, and tied to risk and validation, so traceability holds across the lifecycle and verification is ready when you are.' }, { title: 'Risk management', color: '#D20F8C', img: 'pd-risk.png', noFade: true, body: 'One connected risk view spans design, process, software, and use-related risk, so decisions stay risk-based and the reasoning is shared, not siloed.' }, { title: 'Deliverables management', color: '#069348', img: 'pd-process-knowledge.jpg', noFade: true, imgInset: true, body: 'Every deliverable is created, revised, approved, and archived under one governed system, so nothing loses its history across the lifecycle.' }, ], outcome: 'Reasoning travels with the work, data stays queryable, and changes resolve against governed history. Nothing gets lost between projects.', outcomeImg: 'pd-whatchanges.jpg', proof: 'Built on a track record across biotech and medical devices, where development knowledge has to survive tech transfer and hold up years later.', proofImg: 'pd-proof.jpg', closing: 'From concept to commercial,\nand better every cycle.', }, 'quality-improvement': { accent: '#069348', icon: 'quality-improvement.svg', heroImage: 'qi-hero.png', title: 'Quality Improvement', tagline: 'Quality that compounds, instead of repeating.', situation: { headline: 'A quality system grows every year.', paras: [ 'More procedures, more CAPAs, more records. When the lesson from one fix reaches the next team, when CAPA records are easy to query, and when past attempts are remembered by the system rather than a few people, quality compounds, improvement shows and fixes stay solved.', ], }, resolve: 'The four disciplines applied to the quality system: visualization makes the system legible end to end, digitalization makes every change traceable and inspection-ready, knowledge management connects the quality knowledge so it is reusable, and risk management tiers controls to real risk.', archImg: 'qi-quality-architecture.png', archImgAlt: 'Minerva Phase-Appropriate Quality System Architecture', disciplines: ['Visualization', 'Digitalization', 'Knowledge Management', 'Risk Management'], framework: { kind: 'pillars', eyebrow: 'The improvement frame', headline: 'Phase-appropriate quality, framed as improvement that holds.', pillars: [ ['Architecture matched to the stage', 'Quality architecture matched to the lifecycle stage, so the system fits the work.\nBuilt to improve decision-making, from early development through commercialization.', 'qi-architecture.jpg'], ['Sustained through surveillance', 'Structured, traceable control documentation and integrated knowledge.\nKeep the system audit-ready as conditions change, improvement that holds under inspection.', 'qi-compliance.jpg', 'right'], ['Governed, not one-off', '\nRapid, structured inspection response and remediation that resolve gaps and leave the quality system measurably stronger, not just compliant for a day.', 'qi-remediation.jpg'], ], }, rows: [ ], outcome: 'Lessons carry across teams, CAPA history is queryable, and improvement is demonstrable.', outcomeImg: 'qi-whatchanges.jpg', proof: 'Built on hundreds of quality and process improvements that hold under the next inspection.', proofImg: 'qi-proof.jpg', closing: 'Better quality, maintained.', }, 'investigations': { accent: '#E0A230', icon: 'investigations.svg', heroImage: 'investigations-hero.png', title: 'Investigations', tagline: 'Root cause, found faster, reused next time.', situation: { headline: 'An investigation is open and the clock is running.', paras: [ 'You need root cause, and often the answer already lives in an investigation you have done before. Past investigations hold answers worth remembering. When the lesson is captured where the next investigator can find it, recurring root causes get closed for good and each investigation makes the next one faster.', ], }, resolve: 'The four disciplines applied to issue resolution: visualization makes root cause legible, digitalization makes the investigation queryable and traceable, knowledge management keeps the finding usable, and risk management drives risk-based impact and prioritization.', disciplines: ['Visualization', 'Digitalization', 'Knowledge Management', 'Risk Management'], framework: { kind: 'frames', eyebrow: 'The R3 and C3 frames', headline: 'Two frames, one resolution.', frames: [ ['R3', 'Quality investigations', 'Response, Resolution, Reduction. Rapid, integrated resolution of deviations and quality events, with the knowledge and risk visibility to reduce future recurrence and backlog.', 'r3-quality.png'], ['C3', 'Technical investigations', 'Characterization, Comprehension, Communication. Complex technical findings structured into scientific and operational knowledge that supports faster, more consistent decisions.', 'c3-technical.png'], ], }, rowsAsCards: true, rows: [ { title: 'Digitalized root-cause analysis', img: 'inv-rootcause-crop.png', imgPos: 'center 38%', imgFramed: true, flush: true, body: 'Cause-and-effect, Five Whys, fault tree, FMEA, and Pareto, run as structured digital methods that find the most probable cause with precision.' }, { title: 'Technically-supported CAPAs', img: 'inv-capa-new.png', imgPos: 'center 40%', flush: true, body: 'Corrective and preventive actions grounded in targeted laboratory and scientific assessment, not desktop analysis, so they hold.' }, { title: 'Risk-based solutions and remediation', img: 'inv-risk-new.png', flush: true, body: 'Findings turned into digital risk files, FMEAs, and Five Whys that strengthen future risk assessment across process, design, and use.' }, ], outcome: 'Recurring causes close for good, and each investigation accelerates the next.', outcomeImg: 'inv-whatchanges.jpg', proof: '1,000+ technical investigations across cell therapy products, root cause found and made reusable.', proofImg: 'inv-rootcause-methods.png', closing: 'Resolve it once, and prevent the next.', }, }; // ---------- A. HERO BAND ---------- function DomainHero({d}) { return (
{d.heroImage && ( )}

{d.title}

{d.tagline}

); } // ---------- B. THE SITUATION (merged with "Where the value is") ---------- function Situation({d}) { return (
The situation

{d.situation.headline}

{d.situation.paras.map((p, i) => (

{String(p).split('\n').map((seg,si,arr)=> si] : seg)}

))}
{d.value && (
Where the value is

{d.value.headline}

{d.value.body}

)}
); } // ---------- C. HOW THE INTEGRATED PRACTICE RESOLVES IT ---------- function WhereValue({d}) { return null; } function ResolvePill({name, href}) { const [hover, setHover] = React.useState(false); return ( setHover(true)} onMouseLeave={() => setHover(false)} style={{display:'inline-flex', alignItems:'center', gap:7, fontSize:14, fontWeight:700, color:'var(--minerva-blue)', textDecoration:'none', background:'#fff', border:'1px solid ' + (hover ? 'var(--minerva-blue)' : 'var(--border)'), padding:'9px 16px', borderRadius:999, transform: hover ? 'translateY(-3px)' : 'translateY(0)', boxShadow: hover ? '0 8px 18px rgba(15,26,46,0.12)' : '0 1px 2px rgba(15,26,46,0.05)', transition: 'transform .15s cubic-bezier(0.2,0.8,0.2,1), box-shadow .15s cubic-bezier(0.2,0.8,0.2,1), border-color .15s'}}>{name} ); } function Resolve({d}) { const hasImages = d.resolveImages && d.resolveImages.length; const images = hasImages && (
1 ? '1fr 1fr' : '1fr', gap:20}}> {d.resolveImages.map(im => (
{im.caption}{const f=e.currentTarget.closest('figure'); if(f) f.style.display='none';}} style={{width:'100%', height:220, objectFit:'contain', display:'block'}}/>
{im.caption}
))}
); return (
{d.archImg && (
{d.archImgAlt
)} {hasImages ? (
How the integrated practice resolves it

{d.resolve}

{!d.hideResolvePills && (
{d.disciplines.map(name => ( ))}
)}
{images}
) : (
How the integrated practice resolves it

{d.resolve}

{!d.hideResolvePills && (
{d.disciplines.map(name => ( ))}
)}

Every domain is the four disciplines applied to one arena.

)}
); } // ---------- PDP lifecycle matrix (replaces the plain phase-box flow) ---------- // Recreated from the "Product Development Process Activities" diagram in the // Minerva KG visual language: rounded mk-card matrix, brand-spectrum activity // columns, hairline grid, the Design / Design Lock lines, and a deliverables // flow column on the right. function FlowArrow({color}) { return (
); } function DeliverGroup({title, items, arrow, note}) { return (
{title}
    {items.map(it =>
  • – {it}
  • )}
{note &&
{note}
}
); } function LifecycleMatrix() { const border = '1px solid var(--border)'; const ACT = [ { label:'Planning and Project Management', text:'#1C4DA1', chip:'rgba(28,77,161,0.13)', bar:'rgba(28,77,161,0.55)' }, { label:'Requirements Management', text:'#9A6E12', chip:'rgba(224,162,48,0.18)', bar:'rgba(224,162,48,0.72)' }, { label:'Risk Management', text:'#B00B77', chip:'rgba(210,15,140,0.13)', bar:'rgba(210,15,140,0.45)' }, { label:'Deliverables Management', text:'#069348', chip:'rgba(6,147,72,0.14)', bar:'rgba(6,147,72,0.52)' }, ]; // grid rows: 1 header · 2-4 above · 5 design line · 6 design · 7 lock line · 8 V&V · 9 commercialization const PH = [ { n:'1', name:'Definition (Pitch)', row:2, bars:1, mh:38 }, { n:'2', name:'Concept', row:3, bars:1, mh:38 }, { n:'3', name:'Feasibility', row:4, bars:1, mh:38 }, { n:'4', name:'Design', row:6, bars:1, mh:62 }, { n:'5', name:'Verification and Validation', row:8, bars:3, mh:84 }, { n:'6', name:'Commercialization', row:9, bars:1, mh:38 }, ]; return (
{/* matrix card background behind the four activity columns */}
{/* header labels */}
Phases
{ACT.map((a, ci) => (
{a.label}
))}
Deliverables
{/* band labels (left) */}
Above
the Line
Below
the Line
Change
Control
Required
{/* phase name + activity cells */} {PH.map((ph) => (
{ph.n}. {ph.name}
{ACT.map((a, ci) => (
{Array.from({length:ph.bars}).map((_, bi) => (
))}
))}
))} {/* deliverables flow groups (right) */}
{/* Design Line */}
Design Line
{/* Design Lock Line + lock — nudged down by ~1 line (its own font size) */}
Design Lock Line After Design Lock
); } // ---------- D. DOMAIN FRAMEWORK (three renderers) ---------- function Framework({d}) { const f = d.framework; const isFrames = f.kind === 'frames'; return (
{f.kind !== 'lifecycle' && (
{f.eyebrow}
{f.headline &&

{f.headline}

} {f.intro &&

{f.intro}

}
)} {f.kind === 'lifecycle' && (
Product Development Process activities across the lifecycle. Planning, requirements, risk, and deliverables management run across all six phases, from Definition through Commercialization, split by the Design Line and Design Lock Line, with the deliverables flow from design inputs to V and V outputs.

The Product Development Process (PDP)

{f.eyebrow}
{f.headline &&

{f.headline}

} {f.intro &&

{String(f.intro).split('\n').map((seg,si,arr)=> si] : seg)}

}
)} {f.kind === 'pillars' && (
{f.pillars.map(([t, b, img, pos], i) => (

{t}

{String(b).split('\n').map((seg,si,arr)=> si] : seg)}

{img && ( )}
))}
)} {f.kind === 'frames' && (
{f.frames.map(([code, label, body, img]) => (
{ e.currentTarget.style.transform='translateY(-3px)'; e.currentTarget.style.boxShadow='0 10px 26px rgba(15,26,46,0.12)'; }} onMouseLeave={(e)=>{ e.currentTarget.style.transform='translateY(0)'; e.currentTarget.style.boxShadow=''; }}>
{code} {label}
{img && (
{`${code}
)}

{body}

))}
)}
); } // ---------- (PD only) SUSTAINING PHASE ---------- function Sustaining({d}) { if (!d.sustaining) return null; return (
Where improvement lives

{d.sustaining.headline}

{d.sustaining.body}

); } // ---------- E. CAPABILITY ROWS ---------- function CapabilityRows({d}) { const rows = d.rows || []; const [active, setActive] = React.useState(-1); const close = () => setActive(-1); const go = (dir) => setActive(a => (a + dir + rows.length) % rows.length); React.useEffect(() => { if (active < 0) return; const onKey = (e) => { if (e.key === 'Escape') close(); else if (e.key === 'ArrowRight') go(1); else if (e.key === 'ArrowLeft') go(-1); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [active, rows.length]); if (rows.length === 0) return null; const cur = active >= 0 ? rows[active] : null; const lightbox = cur && (
e.stopPropagation()} style={{maxWidth:1080, width:'100%', textAlign:'center'}}>
{d.title}

{cur.title}

{cur.title}

{cur.body}

{rows.map((_, i) => (
); if (d.rowsAsCards) { const four = d.rows.length === 4; const cols = four ? 'repeat(4,1fr)' : 'repeat(3,1fr)'; return (
{d.rowsLead &&

{d.rowsLead}

}
{d.rows.map((row, i) => (
row.img && setActive(i)} style={{padding:'26px 24px 24px', borderTop:`4px solid ${row.color || d.accent}`, overflow:'hidden', display:'flex', flexDirection:'column', cursor: row.img ? 'zoom-in' : 'default', transition:'transform .15s cubic-bezier(0.2,0.8,0.2,1), box-shadow .15s cubic-bezier(0.2,0.8,0.2,1)'}} onMouseEnter={(e)=>{ e.currentTarget.style.transform='translateY(-3px)'; e.currentTarget.style.boxShadow='0 10px 26px rgba(15,26,46,0.12)'; }} onMouseLeave={(e)=>{ e.currentTarget.style.transform='translateY(0)'; e.currentTarget.style.boxShadow=''; }}>

{row.title}

{row.body}

{row.img && ( {e.currentTarget.style.display='none';}} style={row.noFade ? {width: row.imgInset ? 'calc(100% + 24px)' : 'calc(100% + 48px)', height:170, objectFit:'contain', objectPosition: row.imgPos || 'center bottom', marginLeft: row.imgInset ? -12 : -24, marginRight: row.imgInset ? -12 : -24, marginBottom: row.flush ? -24 : 0, marginTop:'auto', display:'block'} : {width:'calc(100% + 48px)', height:170, objectFit:'cover', objectPosition: row.imgPos || 'center', marginLeft:-24, marginRight:-24, marginBottom: row.flush ? -24 : 0, marginTop:'auto', display:'block', WebkitMaskImage:'linear-gradient(to bottom, transparent 0, #000 32%)', maskImage:'linear-gradient(to bottom, transparent 0, #000 32%)'}} /> )}
))}
{lightbox}
); } return (
{d.rows.map((row, i) => { const flip = i % 2 === 1; const img = (
{row.title}
); const text = (
{`0${i+1}`}

{row.title}

{row.body}

); return (
{flip ? <>{text}{img} : <>{img}{text}}
); })}
); } // ---------- F. PROOF / OUTCOME ---------- function OutcomeProofBox({eyebrow, eyebrowColor, text, size, img}) { const [hover, setHover] = React.useState(false); return (
setHover(true)} onMouseLeave={() => setHover(false)} style={{flex:'1 1 0', minWidth:0, background:'#fff', border:'1px solid ' + (hover ? 'var(--minerva-blue)' : 'var(--border)'), borderRadius:14, padding:'34px 34px', textAlign:'left', transform: hover ? 'translateY(-4px)' : 'translateY(0)', boxShadow: hover ? '0 12px 28px rgba(15,26,46,0.12)' : '0 1px 2px rgba(15,26,46,0.05)', transition: 'transform .15s cubic-bezier(0.2,0.8,0.2,1), box-shadow .15s cubic-bezier(0.2,0.8,0.2,1), border-color .15s'}}>
{eyebrow}

{text}

{img && (
)}
); } function Outcome({d}) { if (!d.outcome && !d.proof) return null; return (
The payoff
{d.outcome && } {d.proof && }
); } // ---------- F2. PROOF (merged into Outcome) ---------- function ProofBlock({d}) { return null; } // ---------- G. CLOSING BAND ---------- function Closing({d}) { return (

{String(d.closing).split('\n').map((seg,si,arr)=> si] : seg)}

Start a Diagnostic →
); } function DomainPage({slug}) { const d = DOMAINS[slug]; return ( <> {d.framework && d.framework.kind !== 'pillars' ? : null} {d.framework && d.framework.kind === 'pillars' ? : null} ); } Object.assign(window, { DomainPage, DOMAINS });