// ───────────────────────────────────────────────────────────── // 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 (
  1. ); })}
{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 (
{STORAGE_RULES.map((r) => (
{r.code}
{r.where}
{r.label}
{r.body}
))}
); } // =========================================================== // CALCULADORA DE DILUIÇÃO // =========================================================== function PeptideoCalculadora({ t }) { const [mg, setMg] = useState(""); // mg no frasco const [ml, setMl] = useState(""); // ml de água bact. const [dose, setDose] = useState(""); // valor numérico da dose const [doseUnit, setDoseUnit] = useState("mcg"); // "mcg" | "mg" const calc = useMemo(() => { const mgN = parseFloat(mg); const mlN = parseFloat(ml); const doseN = parseFloat(dose); if (!mgN || !mlN || !doseN) return null; // Normaliza a dose para mcg const doseMcg = doseUnit === "mg" ? doseN * 1000 : doseN; const totalMcg = mgN * 1000; const concPorMl = totalMcg / mlN; const volumeMl = doseMcg / concPorMl; const ui = volumeMl * 100; const aplicacoes = Math.floor(totalMcg / doseMcg); return { totalMcg, concPorMl, volumeMl, ui, aplicacoes, }; }, [mg, ml, dose, doseUnit]); return ( {/* Inputs */}
{/* Resultado */}
Resultado
{calc ? ( <>
{calc.ui.toFixed(0)}
UI na seringa U-100
{calc.volumeMl.toFixed(2)} ml
Volume por aplicação
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) => (
  1. {step}
  2. ))}
); } // =========================================================== // 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 (
); } Object.assign(window, { PeptideoChecklist, PeptideoArmazenamento, PeptideoCalculadora, PeptideoFerramentas, CalcDoseInput, });