// Sections for "Chamado dos Aventureiros" page const { useState, useEffect, useMemo } = React; // ---------- Form data ---------- const FORM_DATA = { faixa: ["Jovem", "Adulto", "Veterano"], raca: ["Humano", "Elfo", "Meio-Elfo", "Anão", "Meio-Dragão", "Demônio", "Outra raça"], classe: ["Cavaleiro", "Guerreiro", "Feiticeiro", "Arqueiro", "Mago", "Sacerdote", "Lanceiro", "Assassino", "Monge", "Bardo", "Druida", "Samurai"], arma: ["Espada", "Duas Espadas", "Espada de Duas Mãos", "Katana", "Duas Katanas", "Maça", "Lança", "Cajado", "Livro de Magias", "Orbe Mágico", "Cetro", "Manoplas", "Arco e Flecha", "Adagas Duplas", "Katar Dupla"], escudo: ["Sim", "Não"], elemento: [ { name: "Fogo", glyph: "△" }, { name: "Água", glyph: "▽" }, { name: "Terra", glyph: "▽̄" }, { name: "Vento", glyph: "△̄" }, { name: "Raio Amarelo", glyph: "⚡" }, { name: "Luz", glyph: "✦" }, { name: "Escuridão", glyph: "✶" }, ], tracos: ["Corajoso", "Frio e calculista", "Impulsivo", "Leal", "Cético", "Honrado", "Sarcástico", "Reservado", "Protetor", "Ambicioso"], passado: ["Órfão da guerra", "Ex-soldado", "Aprendiz renegado", "Sobrevivente de uma tragédia", "Herdeiro relutante", "Criado pela guilda", "Passado desconhecido"], proposito: ["Redenção", "Glória", "Vingança", "Proteção de alguém ou algo", "Busca por conhecimento", "Dever com o reino", "Sobrevivência acima de tudo"], ligacao: [ "A Guilda dos Aventureiros", "A Ordem dos Cavaleiros da Chama Sagrada", "A Catedral dos 7 Elementos", "Aliança da Rosa Prateada", "Um aventureiro lendário (indiretamente)", "Um grande evento histórico do reino", "Nenhuma ligação conhecida", ], }; const EMPTY_FORM = { nome: "", faixa: "", raca: "", classe: "", arma: "", escudo: "", elemento: "", tracos: [], passado: "", proposito: "", ligacao: [], termos: false, }; // ---------- Hero ---------- function ChamadoHero() { return (
Pergaminho · Os Recrutados

Chamado dos
Aventureiros

Bem-vindo ao Chamado dos Aventureiros. Este pergaminho permite que leitores inspirem a criação de um aventureiro dentro do universo de O Legado do Fogo.

As respostas enviadas serão tratadas como inspirações criativas. A criação final do personagem — sua história, habilidades e papel no universo — pertence ao autor da obra. Nem todos os aventureiros serão escolhidos. Mas alguns… poderão entrar para a história.

Início / Chamado dos Aventureiros
Atenda ao chamado
); } // ---------- Field primitives ---------- function FieldHeader({ num, title, hint, of }) { return (
{num} {of && / {of}}

{title}

{hint &&

{hint}

}
); } function TextField({ value, onChange, placeholder, maxLength = 80 }) { return (
onChange(e.target.value)} placeholder={placeholder} maxLength={maxLength} />
); } function RadioGroup({ name, options, value, onChange, columns = 2, renderOption }) { return (
{options.map((opt) => { const optValue = typeof opt === "string" ? opt : opt.name; const checked = value === optValue; return ( ); })}
); } function CheckboxGroup({ options, value, onChange, max, columns = 2 }) { const count = value.length; const atMax = max != null && count >= max; const toggle = (opt) => { if (value.includes(opt)) onChange(value.filter((v) => v !== opt)); else if (!atMax) onChange([...value, opt]); }; return ( <> {max != null && (
Selecionados {count} de até {max}
)}
{options.map((opt) => { const checked = value.includes(opt); const disabled = !checked && atMax; return ( ); })}
); } // ---------- Form sections ---------- function FormStep({ romanIndex, kicker, title, children }) { return (
{kicker}

{title}

{children}
); } // ---------- The Form ---------- function ChamadoForm() { const [form, setForm] = useState(() => { try { const saved = JSON.parse(localStorage.getItem("oldf-chamado") || "null"); return saved && typeof saved === "object" ? { ...EMPTY_FORM, ...saved } : EMPTY_FORM; } catch { return EMPTY_FORM; } }); const [submitted, setSubmitted] = useState(false); const [submitting, setSubmitting] = useState(false); const [error, setError] = useState(null); useEffect(() => { localStorage.setItem("oldf-chamado", JSON.stringify(form)); }, [form]); const set = (k) => (v) => { setForm((f) => ({ ...f, [k]: v })); setError(null); }; const requiredFields = [ ["nome", "Nome do Aventureiro"], ["faixa", "Faixa Etária"], ["raca", "Raça"], ["classe", "Classe"], ["arma", "Arma"], ["escudo", "Escudo"], ["elemento", "Elemento Principal"], ["passado", "Arquétipo de Passado"], ["proposito", "Propósito"], ]; const scrollToField = (k) => { const el = document.querySelector(`[data-field="${k}"]`); if (!el) return; const rect = el.getBoundingClientRect(); const y = window.scrollY + rect.top - 120; window.scrollTo({ top: y, behavior: "smooth" }); }; const onSubmit = async (e) => { e.preventDefault(); if (submitting) return; for (const [k, label] of requiredFields) { if (!form[k] || (Array.isArray(form[k]) && form[k].length === 0)) { setError(`Preencha: ${label}`); scrollToField(k); return; } } if (form.tracos.length === 0) { setError("Escolha pelo menos um traço de personalidade."); scrollToField("tracos"); return; } if (!form.termos) { setError("Você precisa concordar com os termos de participação."); scrollToField("termos"); return; } setError(null); setSubmitting(true); const email = window.CHAMADO_EMAIL || "olegadodofogooficial@gmail.com"; const payload = { _subject: `🔥 Novo Chamado — ${form.nome || "Aventureiro sem nome"}`, _template: "table", _captcha: "false", "Nome do Aventureiro": form.nome, "Faixa Etária": form.faixa, "Raça": form.raca, "Classe": form.classe, "Arma": form.arma, "Usará escudo": form.escudo, "Elemento Principal": form.elemento, "Traços de Personalidade": form.tracos.join(" · "), "Arquétipo de Passado": form.passado, "Propósito": form.proposito, "Ligações com o Mundo": form.ligacao.length ? form.ligacao.join(" · ") : "—", "Termos aceitos": form.termos ? "Sim" : "Não", "Enviado em": new Date().toLocaleString("pt-BR"), }; try { const res = await fetch(`https://formsubmit.co/ajax/${encodeURIComponent(email)}`, { method: "POST", headers: { "Content-Type": "application/json", "Accept": "application/json" }, body: JSON.stringify(payload), }); const data = await res.json().catch(() => ({})); if (!res.ok || (data && data.success === "false")) { throw new Error((data && data.message) || "Falha ao enviar o chamado."); } setSubmitted(true); window.scrollTo({ top: 0, behavior: "smooth" }); } catch (err) { setError( "Não foi possível enviar o pergaminho agora. Verifique sua conexão e tente novamente." ); console.error("[Chamado] submit failed:", err); } finally { setSubmitting(false); } }; const onReset = () => { if (!confirm("Tem certeza? Isso apagará todas as respostas atuais.")) return; setForm(EMPTY_FORM); localStorage.removeItem("oldf-chamado"); setSubmitted(false); setError(null); }; if (submitted) { return ; } return (
{/* Step I */}
{/* Step II */}
( {o.glyph} {o.name} )} />
{/* Step III */}
{/* Step IV */}
{/* Step V */}

Termos de Participação

  • Minhas respostas são inspirações criativas.
  • O personagem final é criação do universo O Legado do Fogo.
  • Não há coautoria, vínculo comercial ou direito sobre a obra.
  • O nome sugerido pode ser adaptado.
{error && (
{error}
)}

Suas respostas ficam salvas localmente no seu navegador enquanto você preenche. Ao enviar, o pergaminho é selado.

); } // ---------- Confirmation ---------- function ChamadoConfirm({ form, onAnother }) { return (
Pergaminho · Selado

O Chamado foi atendido

Caso seu aventureiro seja escolhido para avançar, o anúncio será feito pelos canais oficiais de O Legado do Fogo.

Que a chama guie seu caminho.

Resumo do aventureiro · Inspiração registrada
{form.ligacao.length > 0 && }
Voltar ao início
); } function SummaryRow({ label, value }) { return (
{label}
{value || "—"}
); } // ---------- Wrapper ---------- function ChamadoBody() { return (
); } Object.assign(window, { ChamadoHero, ChamadoBody });