// ============================================================
// 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 }) => (
{/* 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 (
);
};
// ============================================================
// 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 (
);
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 (