// ─────────────────────────────────────────────────────────────
// FERRAMENTAS DA SESSÃO PEPTÍDEOS
// Vivem dentro da tela Lista quando type === "peptideo".
// 1. Checklist Pré-Uso (6 itens)
// 2. Guia de Armazenamento (4 regras)
// 3. Calculadora de Diluição (mg + ml + mcg → ml + UI)
// ─────────────────────────────────────────────────────────────
const { useState, useEffect, useMemo } = React;
// ===========================================================
// CHECKLIST PRÉ-USO
// ===========================================================
const CHECKLIST_ITEMS = [
"Tenho prescrição médica com nome do peptídeo, dose e ciclo",
"O peptídeo veio de farmácia de manipulação de referência",
"Tenho seringa de insulina U-100 e água bacteriostática",
"Sei onde e como armazenar após diluição (geladeira 4°C, não freezer)",
"Calculei quantas UI na seringa equivalem à minha dose",
"Sei o que observar nos primeiros dias e quando contactar o médico",
];
function PeptideoChecklist({ t }) {
const [checked, setChecked] = useState(() => {
try { return JSON.parse(localStorage.getItem("pept_checklist") || "[]"); }
catch { return []; }
});
useEffect(() => {
localStorage.setItem("pept_checklist", JSON.stringify(checked));
}, [checked]);
const toggle = (i) => {
setChecked((arr) => arr.includes(i) ? arr.filter(x => x !== i) : [...arr, i]);
};
const reset = () => setChecked([]);
const done = checked.length === CHECKLIST_ITEMS.length;
return (
{CHECKLIST_ITEMS.map((item, i) => {
const on = checked.includes(i);
return (
);
})}
{done ? "✓ Tudo pronto" : `${checked.length} de ${CHECKLIST_ITEMS.length}`}
);
}
// ===========================================================
// GUIA DE ARMAZENAMENTO
// ===========================================================
const STORAGE_RULES = [
{ code: "01", label: "Frasco lacrado", where: "Freezer ou geladeira", body: "−20°C a 4°C. Longe de luz. Validade conforme fabricante." },
{ code: "02", label: "Após diluição", where: "Geladeira a 4°C", body: "Nunca freezer. Usar em até 30 dias." },
{ code: "03", label: "Em transporte", where: "Bolsa térmica", body: "Máximo 8h fora da geladeira. Evite luz solar direta." },
{ code: "04", label: "Descarte imediato", where: "Cor ou turvação", body: "Reconstituído é transparente. Cor ou partícula significa descarte." },
];
function PeptideoArmazenamento({ t }) {
return (
Concentração de {Math.round(calc.concPorMl)} mcg/ml. Rende aproximadamente {calc.aplicacoes} aplicações por frasco.
>
) : (
Preencha os três campos acima para ver o cálculo.
)}
{/* Como funciona */}
Como o cálculo funciona
{[
<>1 mg do frasco equivale a 1.000 mcg.>,
<>Total de mcg dividido por ml de água é a concentração por ml.>,
<>Dose dividida pela concentração é o volume em ml.>,
<>Volume vezes 100 é a UI na seringa U-100 (UI não é dose, é volume).>,
].map((step, i) => (
{step}
))}
);
}
// ===========================================================
// PRIMITIVES DAS FERRAMENTAS
// ===========================================================
// Frame editorial usado pelas 3 ferramentas — agora gaveta (drawer) recolhida por padrão
function ToolFrame({ eyebrow, title, lede, desc, children, t }) {
const [open, setOpen] = useState(false);
return (
{open && (
{lede && (
{lede}
)}
{desc && (
{desc}
)}
{children}
)}
);
}
// Input numérico com label, sub e unidade
function CalcInput({ label, sub, placeholder, unit, value, onChange, t }) {
return (
);
}
// Input numérico com toggle de unidade (mcg / mg)
function CalcDoseInput({ label, sub, placeholder, unit, onUnitChange, value, onChange, t }) {
return (
);
}
// ===========================================================
// WRAPPER — todas as 3 ferramentas empilhadas
// ===========================================================
function PeptideoFerramentas({ t }) {
return (