// 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 (
);
}
function CheckList({ items }) {
return (
{items.map((it, i) => (
{it}
))}
);
}
// Vertical numbered stepper for service pages
function StepsVertical({ steps }) {
return (
{steps.map((s, i) => (
{i + 1}
{i < steps.length - 1 ?
: null}
))}
);
}
function FaqList({ items }) {
const [open, setOpen] = React.useState(0);
return (
{items.map((it, i) => {
const isOpen = open === i;
return (
setOpen(isOpen ? -1 : i)} style={{ width: "100%", display: "flex", alignItems: "center", justifyContent: "space-between", gap: 16, background: "transparent", border: "none", cursor: "pointer", padding: "18px 20px", textAlign: "left" }}>
{it.q}
+
{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 (
);
}
// ---- 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 (
);
}
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) => (
{h}
))}
{rows.map((r, ri) => (
{r.map((c, ci) => (
{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 (
{items.map((it, i) => (
{it}
))}
);
}
// ---- 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) => (
))}
);
}
// ---- 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 });