9a240fe69e
De los 11 css/js del tema solo se usa uno: ns-css/nightspire-style.css, que carga layout.tsx. Los 10 .js no los pide nadie. Medido en un navegador sobre 10 rutas de producción, no deducido con grep: la web no solicita ni un solo JS del tema. Son los manejadores jQuery del portal Django, que se borró hoy; los sustituyeron los componentes React. Dos detalles que el grep no habría resuelto: - ns-scripts.js parecía referenciado desde SiteHeader.tsx, pero la coincidencia era un COMENTARIO que documenta de dónde salió el toggle móvil, no una carga. Se ajusta el comentario, que si no citaría un fichero inexistente. - power.js era la copia que UltimoWoW tenía de los tooltips de Wowhead, con g_host = 'https://wotlk.novawow.com' (dominio muerto) escrito dentro. La web usa el oficial de zamimg, que carga layout.tsx. Verificado tras borrar: build limpio, 7 rutas sin errores 4xx ni de JS, el tema se sigue aplicando y el menú móvil (lo que replicaba nwNavBar) despliega bien. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
158 lines
4.8 KiB
TypeScript
158 lines
4.8 KiB
TypeScript
'use client'
|
|
|
|
import { useState } from 'react'
|
|
import { useLocale, useTranslations } from 'next-intl'
|
|
import { Link } from '@/i18n/navigation'
|
|
import { wowheadWotlkHome } from '@/lib/wowhead'
|
|
|
|
const SERVER_NAME = 'NightSpire'
|
|
|
|
/**
|
|
* Cabecera / barra de navegación — réplica EXACTA del partial Django
|
|
* `home/templates/partials/header.html` con las clases del tema real
|
|
* (nav-wrapper, nav-bar, nav-dropdown...). Los enlaces internos que ya
|
|
* existen en web-next usan <Link> (next-intl); el resto se mantiene igual
|
|
* que en Django. El toggle móvil replica el `nwNavBar()` que traía el JS del
|
|
* tema (ns-scripts.js), borrado por muerto: la web no cargaba ningún JS del
|
|
* tema. Está en el historial de git si hace falta consultarlo.
|
|
*/
|
|
export function SiteHeader({
|
|
loggedIn,
|
|
accountLabel,
|
|
realmName,
|
|
realmHref,
|
|
playersHref,
|
|
}: {
|
|
loggedIn: boolean
|
|
accountLabel: string
|
|
realmName: string
|
|
realmHref: string
|
|
playersHref: string
|
|
}) {
|
|
const locale = useLocale()
|
|
const t = useTranslations('UI')
|
|
const [open, setOpen] = useState(false)
|
|
|
|
return (
|
|
<header>
|
|
<div className="nav-wrapper">
|
|
<div className={open ? 'nav-bar responsive' : 'nav-bar'} id="ns-nav-bar">
|
|
<a
|
|
role="button"
|
|
tabIndex={0}
|
|
className={open ? 'icon change' : 'icon'}
|
|
id="menu-icon"
|
|
onClick={() => setOpen((v) => !v)}
|
|
>
|
|
<div className="bar1"></div>
|
|
<div className="bar2"></div>
|
|
<div className="bar3"></div>
|
|
</a>
|
|
|
|
{loggedIn ? (
|
|
<Link href="/">{t('header.home')}</Link>
|
|
) : (
|
|
<Link href="/create-account">{t('header.register')}</Link>
|
|
)}
|
|
|
|
<div className="nav-dropdown">
|
|
<div className="nav-dropdown-btn">
|
|
{t('header.downloads')} <i className="fas fa-caret-down"></i>
|
|
</div>
|
|
<div className="nav-dropdown-content">
|
|
<p>
|
|
<Link href="/download-client">{t('header.client')}</Link>
|
|
</p>
|
|
<p>
|
|
<Link href="/download-addons">{t('header.addons')}</Link>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="nav-dropdown">
|
|
<div className="nav-dropdown-btn">
|
|
{realmName.toUpperCase()} <i className="fas fa-caret-down"></i>
|
|
</div>
|
|
<div className="nav-dropdown-content">
|
|
<p>
|
|
<Link href="/changelogs">{t('header.changelog')}</Link>
|
|
</p>
|
|
<p>
|
|
<Link href={realmHref}>{t('header.realm')}</Link>
|
|
</p>
|
|
{loggedIn && (
|
|
<p>
|
|
<Link href={playersHref}>{t('header.players')}</Link>
|
|
</p>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
<div className="nav-dropdown">
|
|
<div className="nav-dropdown-btn">
|
|
{t('header.community')} <i className="fas fa-caret-down"></i>
|
|
</div>
|
|
<div className="nav-dropdown-content">
|
|
<p>
|
|
<Link href="/forum">{t('header.forums')}</Link>
|
|
</p>
|
|
<p>
|
|
<a href={wowheadWotlkHome(locale)} target="_blank" rel="noopener noreferrer">
|
|
{t('header.wotlkDb')}
|
|
</a>
|
|
</p>
|
|
<p>
|
|
<Link href="/content-creators">{t('header.videos')}</Link>
|
|
</p>
|
|
{loggedIn && (
|
|
<p>
|
|
<Link href="/help">{t('header.help')}</Link>
|
|
</p>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
{loggedIn ? (
|
|
<div className="nav-dropdown">
|
|
<div className="nav-dropdown-btn">
|
|
{accountLabel} <i className="fas fa-caret-down"></i>
|
|
</div>
|
|
<div className="nav-dropdown-content">
|
|
<p>
|
|
<Link href="/my-account">{t('header.myAccount')}</Link>
|
|
</p>
|
|
<p>
|
|
<a href={`/${locale}/log-out`}>{t('header.logout')}</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
) : (
|
|
<Link href="/log-in" className="last">
|
|
{t('header.login')}
|
|
</Link>
|
|
)}
|
|
</div>
|
|
</div>
|
|
|
|
{/* eslint-disable @next/next/no-img-element */}
|
|
<Link href="/">
|
|
<img
|
|
className="ns-long-logo"
|
|
src="/ns-themes/ns-ryu/ns-images/ns-logos/ns-long-logo.webp"
|
|
alt={SERVER_NAME}
|
|
title={SERVER_NAME}
|
|
/>
|
|
</Link>
|
|
<Link href="/">
|
|
<img
|
|
className="ns-logo"
|
|
src="/ns-themes/ns-ryu/ns-images/ns-logos/ns-logo.webp"
|
|
alt="NW"
|
|
title="NW"
|
|
/>
|
|
</Link>
|
|
{/* eslint-enable @next/next/no-img-element */}
|
|
</header>
|
|
)
|
|
}
|