// PSM Expert — shared primitives (v3) function SectionTitle({ children, sub, light }) { return (

{children}

{sub ?

{sub}

: null}
); } // Page hero used by service / institutional pages function PageHero({ kicker, title, subtitle, badges }) { return (
{kicker ?
{kicker}
: null}

{title}

{subtitle ?

{subtitle}

: null} {badges && badges.length ? (
{badges.map((b) => {b})}
) : null}
); } const ph = { wrap: { background: "linear-gradient(150deg,#071C36 0%,#06172C 100%)" }, inner: { maxWidth: 900, margin: "0 auto", padding: "64px 32px 56px" }, kicker: { fontFamily: "'IBM Plex Mono', monospace", fontSize: 12.5, letterSpacing: ".12em", textTransform: "uppercase", color: "#F5A623", marginBottom: 16 }, h1: { fontFamily: "'Barlow Condensed', sans-serif", fontWeight: 700, fontSize: 54, lineHeight: 1.04, color: "#fff", margin: 0, textTransform: "uppercase", textWrap: "balance" }, sub: { fontFamily: "'IBM Plex Sans', sans-serif", fontSize: 18, lineHeight: 1.6, color: "rgba(255,255,255,.74)", margin: "20px 0 0", maxWidth: 680 }, badges: { display: "flex", flexWrap: "wrap", gap: 9, marginTop: 26 }, badge: { fontFamily: "'IBM Plex Mono', monospace", fontSize: 12, color: "#fff", background: "#0C2747", border: "1px solid #F5A623", borderRadius: 6, padding: "6px 12px" }, }; function Callout({ kind = "info", children }) { const k = kind === "alert" ? { bg: "#FEF4E2", bar: "#F5A623", ic: "⚠" } : { bg: "#EEF2F7", bar: "#17304D", ic: "ℹ" }; return (
{k.ic}
{children}
); } function CheckList({ items }) { return ( ); } // Vertical numbered stepper for service pages function StepsVertical({ steps }) { return (
{steps.map((s, i) => (
{i + 1}
{i < steps.length - 1 ?
: null}

{s.t}

{s.d}

))}
); } function FaqList({ items }) { const [open, setOpen] = React.useState(0); return (
{items.map((it, i) => { const isOpen = open === i; return (
{isOpen ?
{it.a}
: null}
); })}
); } function CtaFinal({ title = "Precisa de apoio técnico?", sub = "Fale com nossa equipe. Atendimento imediato.", micro = "Sem compromisso · Proposta técnica detalhada · Todo o Brasil" }) { return (

{title}

{sub}

Chamar no WhatsApp Solicitar proposta
{micro}
); } // ---- Shared building blocks for service pages ---- function Section({ title, intro, children, bg = "#fff" }) { return (
{title ?

{title}

: null} {intro ?

{intro}

: null} {children}
); } function P({ children }) { return

{children}

; } function DeliverableGrid({ items }) { return (
{items.map((it) => (

{it.t}

{it.d}

))}
); } function NormTable({ rows }) { return (
{rows.map((r) => (
{r.n} {r.d}
))}
); } const pr = { h2: { fontFamily: "'Barlow Condensed', sans-serif", fontWeight: 700, fontSize: 34, color: "#071C36", margin: "0 0 18px", textTransform: "uppercase", letterSpacing: ".01em" }, intro: { fontFamily: "'IBM Plex Sans', sans-serif", fontSize: 17, lineHeight: 1.65, color: "#6B7785", margin: "0 0 22px", maxWidth: 760 }, p: { fontFamily: "'IBM Plex Sans', sans-serif", fontSize: 16, lineHeight: 1.72, color: "#1A2332", margin: "0 0 16px" }, deliv: { background: "#fff", border: "1px solid #E8ECF1", borderLeft: "3px solid #F5A623", borderRadius: 10, padding: "20px 22px" }, delivIcon: { width: 44, height: 44, borderRadius: 10, background: "#F4F6F8", display: "flex", alignItems: "center", justifyContent: "center", marginBottom: 12 }, delivT: { fontFamily: "'Barlow Condensed', sans-serif", fontWeight: 700, fontSize: 20, color: "#071C36", margin: "0 0 6px", textTransform: "uppercase" }, delivD: { fontFamily: "'IBM Plex Sans', sans-serif", fontSize: 13.5, lineHeight: 1.55, color: "#6B7785", margin: 0 }, normRow: { display: "flex", alignItems: "center", gap: 16, background: "#fff", border: "1px solid #E8ECF1", borderRadius: 8, padding: "12px 16px" }, normTag: { flex: "none", fontFamily: "'IBM Plex Mono', monospace", fontSize: 12.5, fontWeight: 500, color: "#071C36", background: "#EEF2F7", borderRadius: 5, padding: "6px 10px", minWidth: 150, textAlign: "center" }, normDesc: { fontFamily: "'IBM Plex Sans', sans-serif", fontSize: 14.5, color: "#6B7785" }, }; // ---- Data table: petroleum header, zebra rows (brand table spec) ---- function DataTable({ head, rows }) { return (
{head.map((h, i) => ( ))} {rows.map((r, ri) => ( {r.map((c, ci) => ( ))} ))}
{h}
{c}
); } // ---- Norm reference blocks: mono tag + bold title + description ---- function NormBadgeList({ items }) { return (
{items.map((it, i) => (
{it.tag} {it.title ? {it.title} : null}

{it.desc}

))}
); } // ---- Plain bullet list (neutral, e.g. “problemas comuns”) ---- function BulletList({ items }) { return ( ); } // ---- Tag flow: wrapping chips (sectors, keywords) ---- function TagFlow({ items }) { return (
{items.map((it, i) => ( {it} ))}
); } // ---- Numbered list: enumerated items (not sequential steps) ---- function NumberedList({ items }) { return (
{items.map((it, i) => (
{i + 1}

{it.t}

{it.d}

))}
); } // ---- Pillar cards: framework pillars / components (icon + title + sub-items) ---- function PillarCards({ pillars }) { return (
{pillars.map((p, i) => (
{p.tag}

{p.t}

    {p.items.map((el, j) => (
  • {el}
  • ))}
))}
); } const ALL_SERVICES = [ { t: "HAZOP", href: "hazop.html" }, { t: "QRA", href: "qra.html" }, { t: "EAR", href: "ear.html" }, { t: "Detectores", href: "analise-dispersao-detectores.html" }, { t: "LOPA", href: "lopa.html" }, { t: "SIS / SIF / SIL", href: "sil-sis-sif.html" }, { t: "PSM", href: "psm.html" }, { t: "Bow-Tie", href: "bowtie.html" }, { t: "PGR", href: "pgr.html" }, { t: "PAE", href: "pae.html" }, { t: "Gestão de Riscos", href: "gerenciamento-de-riscos.html" }, ]; function RelatedServices({ exclude }) { const items = ALL_SERVICES.filter((s) => s.href !== exclude); return (
Serviços relacionados: {items.map((s) => ( {s.t} ))}
); } Object.assign(window, { SectionTitle, PageHero, Callout, CheckList, StepsVertical, FaqList, CtaFinal, Section, P, DeliverableGrid, NormTable, RelatedServices, DataTable, NormBadgeList, TagFlow, NumberedList, PillarCards, BulletList });