// CENTRAL DA MARCA — Sanvi Activewear · Ferramentas funcionais (via window.claude.complete). // Roteiros · Stories · Legendas · Revisar textos · Planejar captações · Banco de hooks. // Exporta window.SV_Ferramentas (function () { const { useState } = React; const h = React.createElement; const { PageHead } = window.SV_UI; const VOZ = "Você trabalha para a Sanvi Activewear, marca de roupa fitness fundada pela Sabrina Sanches (@sabrinasanchees), influencer premiada como a mais lembrada da cidade. A Sanvi não vende só roupa: vende um estilo de vida ativo, leve e saudável. " + "Público: mulheres que treinam ou querem começar a se mover, de corpos e rotinas variados, que buscam conforto, autoestima e peças bonitas para o dia a dia ativo. " + "Tom de voz: energético, acolhedor, confiante, moderno, próximo e motivador. Fala de igual para igual, com leveza e verdade. " + "NUNCA reforce padrão de corpo único, culpa estética, pressão para emagrecer, comparação ou linguagem vulgar. Celebre corpo real, constância (não perfeição) e movimento do jeito de cada uma. " + "Sempre que fizer sentido, valorize conforto, caimento, tecido que não marca e versatilidade das peças. Considere collabs com a Sabrina e a parceria com a Agência Logue quando o contexto pedir. " + "Escreva sempre em português do Brasil e entregue o resultado PRONTO PARA USAR, sem pedir mais informações e sem explicar o que você fez."; const TOOLS = [ { id: "stories", nome: "Criar stories", ic: "❏", entrega: "Sequência de 6-7 telas (gancho → prova → convite) com texto e interação de cada tela.", ph: "Ex: sequência de stories aquecendo para a live provador com a Sabrina", label: "Tema ou objetivo", area: false, system: VOZ + " Você cria SEQUÊNCIAS DE STORIES. Dado o tema/objetivo, entregue uma sequência de 6 a 7 telas, cada uma com: rótulo da etapa (gancho, identificação, bastidor, prova/try-on, convite, encerramento), o texto exato para colocar na tela e a interação sugerida (enquete, caixinha, contagem regressiva, link/sticker de produto). Termine indicando para onde levar a pessoa. Energético e sem pressão." }, { id: "legenda", nome: "Escrever legendas", ic: "❝", blocks: true, entrega: "3 versões (curta, média, inspiradora) + hashtags prontas para copiar.", ph: "Ex: legenda para o carrossel '3 looks Sanvi para 3 tipos de treino'", label: "Tema ou conteúdo do post", area: false, system: VOZ + " Você escreve LEGENDAS. Entregue blocos prontos para copiar. Separe CADA bloco com uma linha contendo apenas §§§. A primeira linha de cada bloco é o rótulo; da segunda linha em diante vem APENAS o texto final. Entregue nesta ordem: (1) rótulo 'Versão curta'; (2) rótulo 'Versão média'; (3) rótulo 'Versão inspiradora'; (4) rótulo 'Hashtags' com 8 a 12 hashtags de moda fitness / estilo de vida ativo. Cada legenda abre com uma primeira linha que puxa a leitura, com energia e verdade." }, ]; function Bloco({ label, body }) { const [c, setC] = useState(false); function cp() { navigator.clipboard && navigator.clipboard.writeText(body); setC(true); setTimeout(() => setC(false), 1600); } return h("div", { className: "fer-out" }, h("div", { className: "fer-out-h" }, h("span", { className: "fer-out-l" }, label), h("button", { className: "fer-copy" + (c ? " ok" : ""), onClick: cp }, c ? "✓ Copiado" : "⧉ Copiar")), h("div", { className: "fer-text" }, body) ); } function Panel({ tool }) { const [tema, setTema] = useState(""); const [ctx, setCtx] = useState(""); const [loading, setLoading] = useState(false); const [out, setOut] = useState(""); const [err, setErr] = useState(""); const [copied, setCopied] = useState(false); async function gerar() { if (!tema.trim() || loading) return; setLoading(true); setErr(""); setOut(""); setCopied(false); try { if (!window.claude || typeof window.claude.complete !== "function") { throw new Error("A IA está disponível quando você abre a Central pelo link oficial. Se você abriu um arquivo baixado, use o link da central para gerar conteúdo."); } const userMsg = (tool.id === "revisar" ? "TEXTO:\n" : "TEMA: ") + tema.trim() + (ctx.trim() ? ("\nCONTEXTO (formato, objetivo, local): " + ctx.trim()) : ""); const text = await window.claude.complete({ model: "claude-sonnet-4-5", system: tool.system, max_tokens: 2000, messages: [{ role: "user", content: userMsg }] }); if (!text || !String(text).trim()) throw new Error("A resposta veio vazia. Tente de novo."); setOut(String(text)); } catch (e) { const msg = e && e.message ? e.message : String(e); setErr(/rate|limit|429/i.test(msg) ? "Muitas gerações seguidas. Espere alguns segundos e tente de novo." : msg); } setLoading(false); } function copiar() { navigator.clipboard && navigator.clipboard.writeText(out); setCopied(true); setTimeout(() => setCopied(false), 1600); } const blocos = tool.blocks && out ? out.split(/^\s*§§§\s*$/m).map((b) => b.trim()).filter(Boolean).map((b) => { const nl = b.indexOf("\n"); return nl === -1 ? { label: "Resultado", body: b } : { label: b.slice(0, nl).replace(/[*#:]/g, "").trim(), body: b.slice(nl + 1).trim() }; }) : null; return h("div", { className: "fer-panel" }, h("div", { className: "fer-panel-h" }, h("span", { className: "fer-panel-ic" }, tool.ic), h("div", null, h("div", { className: "fer-panel-t" }, tool.nome), h("div", { className: "fer-panel-s" }, "Pronto para usar, na voz da Sanvi")) ), h("div", { className: "fer-entrega" }, "Entrega: " + tool.entrega), h("div", { className: "fer-field" }, h("label", { className: "field-l" }, tool.label), h("textarea", { className: "input area", style: tool.area ? { minHeight: 150 } : { minHeight: 70 }, placeholder: tool.ph, value: tema, onChange: (e) => setTema(e.target.value), onKeyDown: (e) => { if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) gerar(); } }) ), tool.id !== "revisar" && h("div", { className: "fer-field" }, h("label", { className: "field-l" }, "Contexto (opcional) — formato, objetivo, local"), h("input", { className: "input", placeholder: "Ex: Reels · desejo de produto · gravar no estúdio", value: ctx, onChange: (e) => setCtx(e.target.value) }) ), h("div", { className: "fer-run" }, h("button", { className: "btn btn-pri", onClick: gerar, disabled: !tema.trim() || loading }, loading ? "Gerando…" : "✦ Gerar"), h("span", { className: "fer-hint" }, "⌘/Ctrl + Enter") ), err && h("div", { className: "fer-err" }, err), loading && h("div", { className: "fer-loading" }, h("span", { className: "spin" }), " Preparando com energia…"), blocos && blocos.length ? h("div", { className: "fer-blocks" }, blocos.map((b, i) => h(Bloco, { key: i, label: b.label, body: b.body }))) : out && h("div", { className: "fer-out" }, h("div", { className: "fer-out-h" }, h("span", { className: "fer-out-l" }, "Resultado"), h("button", { className: "fer-copy" + (copied ? " ok" : ""), onClick: copiar }, copied ? "✓ Copiado" : "⧉ Copiar")), h("div", { className: "fer-text" }, out) ) ); } function Ferramentas() { const [sel, setSel] = useState(TOOLS[0].id); const tool = TOOLS.find((t) => t.id === sel); return h("div", { className: "page" }, h(PageHead, { eyebrow: "Recursos", titulo: "Ferramentas", sub: "Crie roteiros, stories e legendas, revise textos e planeje captações — sempre na voz da Sanvi." }), h("div", { className: "fer" }, h("div", { className: "fer-tools" }, TOOLS.map((t) => h("button", { key: t.id, className: "fer-tool" + (sel === t.id ? " on" : ""), onClick: () => setSel(t.id) }, h("span", { className: "fer-tool-ic" }, t.ic), h("div", null, h("div", { className: "fer-tool-n" }, t.nome), h("div", { className: "fer-tool-d" }, t.entrega.split(":")[0])) ))), h(Panel, { key: sel, tool }) ) ); } window.SV_Ferramentas = Ferramentas; })();