Prefijos del tema nw- y uw- -> ns- (carpetas, ficheros, clases y rutas)

Renombrado completo de los prefijos heredados: 19 carpetas, 11 ficheros y 318
referencias en 35 ficheros de código, más las clases y las rutas url() de dentro
del CSS del tema. Se usa git mv para conservar el historial.

También fuera del código, que un sed no ve:
- BD: votesite.image_url (4 filas) apuntaba a /nw-themes/...
- Ficheros con la marca vieja en el NOMBRE: novawow-maintenance.webp ->
  nightspire-maintenance.webp (lo usa la página de mantenimiento) y
  store_novawow_response.js.

⚠ Alias en Caddy /nw-themes/* -> /ns-themes/*: los correos ENVIADOS antes del
rebranding llevan esas rutas escritas y están en las bandejas de los usuarios.
Sin el alias, sus imágenes se romperían. Verificado que las rutas viejas siguen
sirviendo 200.

Nota: ns-js/ y ns-js-handlers/ son CÓDIGO MUERTO (manejadores jQuery del portal
Django, que ya se borró). Se midió en el navegador: la web no pide ni un solo JS
del tema. Se renombran igualmente por consistencia, pero son candidatos a
borrarse.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-15 15:50:43 +00:00
parent 5362787a34
commit fa7897c195
729 changed files with 169 additions and 169 deletions
@@ -17,7 +17,7 @@ export async function generateMetadata({ params }: { params: Promise<{ locale: s
return { title: t('title') }
}
const GOLD_ICON = '/nw-themes/nw-ryu/nw-images/nw-icons/money-gold.gif'
const GOLD_ICON = '/ns-themes/ns-ryu/ns-images/ns-icons/money-gold.gif'
function GoldCell({ amount }: { amount: number }) {
return (
@@ -53,7 +53,7 @@ export default async function DownloadAddonsPage() {
<p className="third-brown small-font">{t(`downloadAddons.${a.descKey}`)}</p>
</td>
<td className="real-info-box no-wrap-td">
<a href={a.url} target="_blank" rel="noopener noreferrer" className="nw-tool-btn">
<a href={a.url} target="_blank" rel="noopener noreferrer" className="ns-tool-btn">
{t('downloadAddons.download')}
</a>
</td>
@@ -17,7 +17,7 @@ export async function generateMetadata({ params }: { params: Promise<{ locale: s
return { title: t('title') }
}
const GOLD_ICON = '/nw-themes/nw-ryu/nw-images/nw-icons/money-gold.gif'
const GOLD_ICON = '/ns-themes/ns-ryu/ns-images/ns-icons/money-gold.gif'
export default async function GoldCharacterPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
+2 -2
View File
@@ -65,8 +65,8 @@ export default async function LocaleLayout({
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.6.0/css/all.min.css"
/>
{/* Tema real de NightSpire (nw-ryu). Va el ÚLTIMO para ganar la cascada. */}
<link rel="stylesheet" href="/nw-themes/nw-ryu/nw-css/nightspire-style.css?v=2" />
{/* Tema real de NightSpire (ns-ryu). Va el ÚLTIMO para ganar la cascada. */}
<link rel="stylesheet" href="/ns-themes/ns-ryu/ns-css/nightspire-style.css?v=2" />
{/* Config de los tooltips de wowhead (debe definirse antes de tooltips.js).
OJO con el `window.`: tooltips.js lee `window.whTooltips`, y un `const` a
nivel de script queda en el ámbito léxico del script (no crea propiedad en
+1 -1
View File
@@ -36,7 +36,7 @@ export default async function MaintenancePage({ params }: { params: Promise<{ lo
</p>
{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src="/nw-themes/nw-ryu/nw-images/nw-general/nightspire-maintenance.webp"
src="/ns-themes/ns-ryu/ns-images/ns-general/nightspire-maintenance.webp"
width={437}
alt={t('maintenance.pageTitle')}
/>
+2 -2
View File
@@ -29,7 +29,7 @@ function wowAccountName(username: string): string {
return i >= 0 ? `WOW${username.slice(i + 1)}` : username
}
const ICONS = '/nw-themes/nw-ryu/nw-images/nw-icons'
const ICONS = '/ns-themes/ns-ryu/ns-images/ns-icons'
export default async function AccountPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
@@ -82,7 +82,7 @@ export default async function AccountPage({ params }: { params: Promise<{ locale
<legend>{t('accountState')}</legend>
<div className="separate account-info">
{/* eslint-disable-next-line @next/next/no-img-element */}
<img src={rank.image} className="nw-rank" alt={`${t('level')} ${rank.level}`} title={`${t('level')} ${rank.level}`} />
<img src={rank.image} className="ns-rank" alt={`${t('level')} ${rank.level}`} title={`${t('level')} ${rank.level}`} />
<p><i className="fa-solid fa-coins account-ficon third-brown"></i> <span className="dp-color">{t('dp')}</span>: <span>{data.dp}</span> | <span className="vp-color">{t('vp')}</span>: <span>{data.vp}</span></p>
<p><i className="fa-solid fa-shield-halved account-ficon third-brown"></i> {t('securityToken')}: <span>{data.securityTokenDate ? t('requested') : t('notRequested')}</span></p>
<p><i className="fa-solid fa-lock-open red-info account-ficon"></i> {t('twofaLabel')}: <span> {t('twofaOff')}</span></p>
@@ -14,7 +14,7 @@ export async function generateMetadata({ params }: { params: Promise<{ locale: s
return { title: t('twofaLogin.pageTitle') }
}
const IMG = '/nw-themes/nw-ryu/nw-images'
const IMG = '/ns-themes/ns-ryu/ns-images'
export default async function Security2faLoginPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
@@ -40,7 +40,7 @@ export default async function Security2faLoginPage({ params }: { params: Promise
<div className="twofa-login-info">
<img
className="twofa-login-preview"
src={`${IMG}/nw-general/nw-authenticator-preview.png`}
src={`${IMG}/ns-general/ns-authenticator-preview.png`}
alt={t('twofaLogin.previewAlt')}
/>
<div className="twofa-login-info-text">
+1 -1
View File
@@ -100,7 +100,7 @@ async function PlatformBox({
)
}
const LOGO_BASE = '/nw-themes/nw-ryu/nw-images/nw-logos'
const LOGO_BASE = '/ns-themes/ns-ryu/ns-images/ns-logos'
export default async function TransHistoryPage({ params }: { params: Promise<{ locale: string }> }) {
const { locale } = await params
+30 -30
View File
@@ -2,14 +2,14 @@
/* Tokens de diseño NightSpire (paleta oscura fantasía WotLK). */
@theme {
--color-nw-bg: #140d08;
--color-nw-panel: #241812;
--color-nw-panel-2: #2c1e14;
--color-nw-border: #4a3320;
--color-nw-gold: #d79602;
--color-nw-gold-light: #f0b93f;
--color-nw-text: #e8dccb;
--color-nw-muted: #b1997f;
--color-ns-bg: #140d08;
--color-ns-panel: #241812;
--color-ns-panel-2: #2c1e14;
--color-ns-border: #4a3320;
--color-ns-gold: #d79602;
--color-ns-gold-light: #f0b93f;
--color-ns-text: #e8dccb;
--color-ns-muted: #b1997f;
}
:root {
@@ -17,10 +17,10 @@
}
/* El fondo, la tipografía (FuturaEF-Book) y los estilos base del <body>
los controla el tema real nw-ryu (nightspire-style.css), cargado en el <head>
los controla el tema real ns-ryu (nightspire-style.css), cargado en el <head>
del layout. No los redefinimos aquí para que el tema Django quede idéntico. */
/* El tema nw-ryu se diseñó para los defaults del navegador (igual que la web
/* El tema ns-ryu se diseñó para los defaults del navegador (igual que la web
Django, que NO usa Tailwind). El preflight de Tailwind rompe dos cosas:
1) box-sizing:border-box hace que la height fija de los inputs incluya el
padding → campos aplastados. Volvemos a content-box SOLO en los inputs de
@@ -102,20 +102,20 @@ img {
/* Componentes reutilizables */
@layer components {
.nw-btn {
@apply inline-flex items-center justify-center rounded-md bg-nw-gold px-5 py-2.5 font-semibold text-[#1b120b] transition hover:bg-nw-gold-light;
.ns-btn {
@apply inline-flex items-center justify-center rounded-md bg-ns-gold px-5 py-2.5 font-semibold text-[#1b120b] transition hover:bg-ns-gold-light;
}
.nw-btn-ghost {
@apply inline-flex items-center justify-center rounded-md border border-nw-border px-5 py-2.5 font-semibold text-nw-text transition hover:border-nw-gold hover:text-nw-gold-light;
.ns-btn-ghost {
@apply inline-flex items-center justify-center rounded-md border border-ns-border px-5 py-2.5 font-semibold text-ns-text transition hover:border-ns-gold hover:text-ns-gold-light;
}
.nw-card {
@apply rounded-xl border border-nw-border/70 bg-nw-panel/80 p-5 shadow-lg shadow-black/30 backdrop-blur;
.ns-card {
@apply rounded-xl border border-ns-border/70 bg-ns-panel/80 p-5 shadow-lg shadow-black/30 backdrop-blur;
}
.nw-heading {
@apply bg-gradient-to-b from-nw-gold-light to-nw-gold bg-clip-text font-extrabold tracking-wide text-transparent;
.ns-heading {
@apply bg-gradient-to-b from-ns-gold-light to-ns-gold bg-clip-text font-extrabold tracking-wide text-transparent;
}
.nw-input {
@apply w-full rounded-md border border-nw-border bg-nw-panel-2 px-3 py-2 text-nw-text outline-none transition focus:border-nw-gold;
.ns-input {
@apply w-full rounded-md border border-ns-border bg-ns-panel-2 px-3 py-2 text-ns-text outline-none transition focus:border-ns-gold;
}
}
@@ -124,7 +124,7 @@ img {
color: #7cc0f7;
}
/* Foro: textarea con el look del tema real (el tema nw-ryu no estiliza textarea base). */
/* Foro: textarea con el look del tema real (el tema ns-ryu no estiliza textarea base). */
textarea {
width: 100%;
background-color: #000;
@@ -140,7 +140,7 @@ textarea:focus {
}
/* Foro: barra de herramientas del editor y paginación (colores del tema). */
.nw-tool-btn {
.ns-tool-btn {
border: 2px solid #352e2b;
background: hsla(0, 0%, 100%, 0.05);
color: #ebdec2;
@@ -148,14 +148,14 @@ textarea:focus {
cursor: pointer;
transition: 0.3s;
}
.nw-tool-btn:hover {
.ns-tool-btn:hover {
background: hsla(0, 0%, 100%, 0.1);
color: #fff;
}
/* Paginación con el estilo de los botones del tema (borde + fondo tenue + hover).
Los selectores :link/:visited elevan la especificidad para ganar a las reglas
`a`/`a:visited` del tema (que si no dejan los enlaces visitados en azul). */
.nw-page-link {
.ns-page-link {
display: inline-block;
min-width: 42px;
padding: 9px 14px;
@@ -165,17 +165,17 @@ textarea:focus {
text-align: center;
transition: 0.3s;
}
.nw-page-link:link,
.nw-page-link:visited {
.ns-page-link:link,
.ns-page-link:visited {
color: #ebdec2;
}
.nw-page-link:hover {
.ns-page-link:hover {
background: hsla(0, 0%, 100%, 0.1);
color: #fff;
}
.nw-page-current,
.nw-page-current:link,
.nw-page-current:visited {
.ns-page-current,
.ns-page-current:link,
.ns-page-current:visited {
border-color: #b17c02;
color: #d79602;
background: hsla(40, 90%, 45%, 0.12);