// ============================================================ // home.jsx — LANDING DE CAPTAÇÃO ("Em Breve" / lista de espera) // Página longa: a pessoa rola e lê; botões no meio dão scroll suave até o form. // ============================================================ // Rola suavemente até o formulário (#lista). const scrollToForm = (e) => { if (e) e.preventDefault(); const el = document.getElementById('lista'); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); }; // CTA que leva pra lista de espera (botão vermelho monumental). const JoinCTA = ({ tKey = 'lp_cta_join', large = false }) => { const { t } = useT(); return ( {t(tKey)} ); }; // Bloco de seção padrão: kicker + título 2 linhas + corpo. Reaproveitado em vários blocos. const LpBlock = ({ kicker, l1, l2, children, center = false, className = '' }) => (
{kicker}

{l1}
{l2}

{children}
); // Item de bullet com marcador losango dourado. const Bullet = ({ children }) => (
  • {children}
  • ); // Espaço reservado (placeholder) p/ prints — o dono adiciona as imagens depois. const MediaPlaceholder = ({ label, ratio = 'aspect-[4/3]' }) => (
    {label}
    ); // As 10 classes (bustos em assets/classes/). Nomes conforme pedido. const CLASSES = [ { img: '/assets/classes/arqueira.webp', nameKey: 'classe_arqueira' }, { img: '/assets/classes/assassina.webp', nameKey: 'classe_assassina' }, { img: '/assets/classes/cavaleiro.webp', nameKey: 'classe_cavaleiro' }, { img: '/assets/classes/mago.webp', nameKey: 'classe_mago' }, { img: '/assets/classes/mecanico.webp', nameKey: 'classe_mecanico' }, { img: '/assets/classes/sacerdotisa.webp', nameKey: 'classe_sacerdotisa' }, { img: '/assets/classes/atalanta.webp', nameKey: 'classe_atalanta' }, { img: '/assets/classes/lutador.webp', nameKey: 'classe_lutador' }, { img: '/assets/classes/pikeman.webp', nameKey: 'classe_pikeman' }, { img: '/assets/classes/xama.webp', nameKey: 'classe_xama' }, ]; // Card de classe estilo "seleção de personagem". // object-cover + object-top padroniza o enquadramento (inclusive o Mecânico, // que é paisagem) sem distorcer. Vignette + gradiente disfarçam o fundo off-white. const ClassCard = ({ img, name, index }) => (
    {name} {/* Vignette: escurece as bordas pra disfarçar o fundo off-white do busto */}
    {/* Gradiente vertical: transparente no topo → escuro embaixo (funde o personagem) */}
    {/* Cantos ornamentais */} {/* Faixa do nome */}
    {name}
    ); // Amostras de SKINS (prints in-game tratados, em assets/skins/). Sem legenda — só visual. const SKINS = [ '/assets/skins/skin-01.webp', '/assets/skins/skin-02.webp', '/assets/skins/skin-03.webp', '/assets/skins/skin-04.webp', '/assets/skins/skin-05.webp', '/assets/skins/skin-06.webp', '/assets/skins/skin-07.webp', '/assets/skins/skin-08.webp', ]; // Card de skin — mesmo estilo dos cards de classe (moldura dourada + hover brilho/zoom), // porém em paisagem (16:10) pra casar com os prints. Selo "SKIN" discreto no hover. const SkinCard = ({ img, index }) => (
    {/* Vignette sutil pra integrar com o tema escuro */}
    {/* Cantos ornamentais */} {/* Selo SKIN discreto (aparece no hover) */} SKIN
    ); // Fundo de seção: arte (assets/blocos/) com object-cover + overlay escuro // para manter o texto sempre legível. Use overflow-hidden + conteúdo relative z-10. const SectionBg = ({ src, position = 'object-center', overlayClass = 'bg-gradient-to-b from-stone-950/85 via-stone-950/80 to-stone-950/95' }) => (
    ); // Fundo de PATTERN (textura de armas) — SEMPRE sutil: pano de fundo, nunca protagonista. // Fórmula única usada em todas as seções "sem arte" (ajuste num lugar só). const PatternBg = () => (
    ); // ============================================================ // 1 · HERO — selo EM BREVE + título + sub + CTA // ============================================================ const LpHero = () => { const { t } = useT(); return (
    {/* Fundo */}
    {/* Selo EM BREVE */}
    {t('lp_badge_soon')}

    {t('lp_hero_title_l1')}
    {t('lp_hero_title_l2')}

    {t('lp_hero_sub')}

    ); }; // ============================================================ // 2 · CHEGA DE PAY TO WIN // ============================================================ const LpPayToWin = () => { const { t } = useT(); return (

    {t('lp_p2w_body')}

    ); }; // ============================================================ // 3 · FOCO É PVP E HUNT, NÃO XP + botão QUERO SER AVISADO // ============================================================ const LpFocus = () => { const { t } = useT(); return (

    {t('lp_focus_body')}

    ); }; // ============================================================ // 4 · O ARSENAL (bullets) + placeholders de skins e classes // ============================================================ const LpArsenal = () => { const { t } = useT(); return (

    {t('lp_arsenal_body')}

      {t('lp_arsenal_b1')} {t('lp_arsenal_b2')} {t('lp_arsenal_b3')} {t('lp_arsenal_b4')}
    {/* AS 10 CLASSES — grade estilo seleção de personagem */}
    {t('lp_arsenal_classes_title')}
    {CLASSES.map((c, i) => )}
    {/* SKINS — galeria de prints in-game (4 por linha no desktop, 2 no tablet/mobile) */}
    SKINS
    {SKINS.map((src, i) => )}
    ); }; // ============================================================ // 5 · MECÂNICAS + nota coins/coinshop + botão GARANTIR MEU LUGAR // ============================================================ const LpMechanics = () => { const { t } = useT(); return (

    {t('lp_mech_body')}

      {t('lp_mech_m1')} {t('lp_mech_m2')} {t('lp_mech_m3')} {t('lp_mech_m4')}
    {/* Nota sobre coins / coinshop */}

    {t('lp_mech_coins_note')}

    ); }; // ============================================================ // 6 · VIP QUE NÃO INTERFERE NO PVP // ============================================================ const LpVip = () => { const { t } = useT(); return (
    {/* Arte — coluna esquerda, num painel com moldura */}
    {/* Texto — coluna direita, alinhado à esquerda */}

    {t('lp_vip_body')}

      {t('lp_vip_b1')} {t('lp_vip_b2')} {t('lp_vip_b3')}
    ); }; // ============================================================ // 7 · FEITO PRA QUEM TEM POUCO TEMPO // ============================================================ const LpTime = () => { const { t } = useT(); return (

    {t('lp_time_body')}

    ); }; // ============================================================ // 8 · A RECOMPENSA (destaque) — 7 dias VIP + Box Skin Lendária // ============================================================ const LpReward = () => { const { t } = useT(); const RewardCard = ({ icon, iconSrc, title, desc }) => (
    {iconSrc ? : {icon}}
    {title}

    {desc}

    ); return (
    {/* Arte do Guardião (azulada): overlay forte + tint crimson pra casar com o tema */}
    {/* Brilho dourado de destaque */}

    {t('lp_reward_body')}

    {t('lp_reward_note')}

    ); }; // ============================================================ // 9 · FORMULÁRIO de captação (#lista) — alvo do scroll dos CTAs // (o estado "Você está na lista!" é renderizado dentro do LandingForm) // ============================================================ const LpFormSection = () => { const { t } = useT(); return (
    {t('lp_form_kicker')}

    {t('lp_form_title_l1')}
    {t('lp_form_title_l2')}

    {t('lp_form_sub')}

    ); }; // ============================================================ // BARRA DE REDES SOCIAIS FLUTUANTE (fixa, lateral direita, acompanha o scroll) // Desktop/tablet: vertical, centralizada à direita. Mobile: cluster discreto no canto inferior direito. // ============================================================ // SVGs inline (currentColor) — leves, sem imagens. const IgIcon = ({ className = '' }) => ( ); const FbIcon = ({ className = '' }) => ( ); const DiscordIcon = ({ className = '' }) => ( ); const WhatsIcon = ({ className = '' }) => ( ); const SocialRail = () => { // active:false => ícone pronto no código mas OCULTO. Para ativar Discord/WhatsApp: // basta preencher o href e trocar active para true. const socials = [ { key: 'instagram', label: 'Instagram', href: 'https://www.instagram.com/kingdomtale', Icon: IgIcon, active: true }, { key: 'facebook', label: 'Facebook', href: 'https://www.facebook.com/profile.php?id=61590575913044', Icon: FbIcon, active: true }, { key: 'discord', label: 'Discord', href: '#', Icon: DiscordIcon, active: false }, { key: 'whatsapp', label: 'WhatsApp', href: '#', Icon: WhatsIcon, active: false }, ]; // Oculta no mobile ( {socials.filter(s => s.active).map(({ key, label, href, Icon }) => ( ))}
    ); }; // ============================================================ // APP // ============================================================ const HomeApp = () => { // Se a pessoa chegou via /index.php#lista (vindo da Sobre), rola até o form. // O scroll nativo por hash falha porque o form é renderizado pelo React após o load. React.useEffect(() => { if (window.location.hash === '#lista') { setTimeout(() => { const el = document.getElementById('lista'); if (el) el.scrollIntoView({ behavior: 'smooth', block: 'start' }); }, 300); } }, []); return (
    ); }; const root = ReactDOM.createRoot(document.getElementById('root')); root.render();