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>
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')}
|
||||
/>
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -82,11 +82,11 @@ export function AdminForumManager({ initial }: { initial: Group[] }) {
|
||||
call(`/api/admin/forum/category/${category.id}`, 'PUT', { name: editCat.name, nameEn: editCat.nameEn, order: Number(editCat.order) }).then((ok) => ok && setEditCat(null))
|
||||
}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn"
|
||||
className="ns-tool-btn"
|
||||
>
|
||||
{t('save')}
|
||||
</button>{' '}
|
||||
<button onClick={() => setEditCat(null)} className="nw-tool-btn">{t('cancel')}</button>
|
||||
<button onClick={() => setEditCat(null)} className="ns-tool-btn">{t('cancel')}</button>
|
||||
</div>
|
||||
) : (
|
||||
<div className="title-content-h3">
|
||||
@@ -97,14 +97,14 @@ export function AdminForumManager({ initial }: { initial: Group[] }) {
|
||||
<button
|
||||
onClick={() => setEditCat({ id: category.id, name: category.name, nameEn: category.name_en, order: String(category.order) })}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn"
|
||||
className="ns-tool-btn"
|
||||
>
|
||||
{t('edit')}
|
||||
</button>{' '}
|
||||
<button
|
||||
onClick={() => confirm(t('confirmDelete')) && call(`/api/admin/forum/category/${category.id}`, 'DELETE')}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn red-info2"
|
||||
className="ns-tool-btn red-info2"
|
||||
>
|
||||
{t('delete')}
|
||||
</button>
|
||||
@@ -141,11 +141,11 @@ export function AdminForumManager({ initial }: { initial: Group[] }) {
|
||||
}).then((ok) => ok && setEditForum(null))
|
||||
}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn"
|
||||
className="ns-tool-btn"
|
||||
>
|
||||
{t('save')}
|
||||
</button>{' '}
|
||||
<button onClick={() => setEditForum(null)} className="nw-tool-btn">{t('cancel')}</button>
|
||||
<button onClick={() => setEditForum(null)} className="ns-tool-btn">{t('cancel')}</button>
|
||||
</td>
|
||||
</tr>
|
||||
) : (
|
||||
@@ -160,21 +160,21 @@ export function AdminForumManager({ initial }: { initial: Group[] }) {
|
||||
<button
|
||||
onClick={() => setEditForum({ id: f.id, name: f.name, nameEn: f.name_en, description: f.description, descriptionEn: f.description_en, order: String(f.order), visibility: f.visibility })}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn"
|
||||
className="ns-tool-btn"
|
||||
>
|
||||
{t('edit')}
|
||||
</button>{' '}
|
||||
<button
|
||||
onClick={() => call(`/api/admin/forum/${f.id}`, 'PATCH', { visibility: f.visibility === 0 })}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn"
|
||||
className="ns-tool-btn"
|
||||
>
|
||||
{f.visibility === 0 ? t('show') : t('hide')}
|
||||
</button>{' '}
|
||||
<button
|
||||
onClick={() => confirm(t('confirmDelete')) && call(`/api/admin/forum/${f.id}`, 'DELETE')}
|
||||
disabled={busy}
|
||||
className="nw-tool-btn red-info2"
|
||||
className="ns-tool-btn red-info2"
|
||||
>
|
||||
{t('delete')}
|
||||
</button>
|
||||
|
||||
@@ -69,7 +69,7 @@ export function AdminGoldManager({ initial }: { initial: GoldOption[] }) {
|
||||
<p className="third-brown small-font">{o.price.toFixed(2)} €</p>
|
||||
</td>
|
||||
<td className="real-info-box">
|
||||
<button onClick={() => remove(o.id)} className="nw-tool-btn red-info2">
|
||||
<button onClick={() => remove(o.id)} className="ns-tool-btn red-info2">
|
||||
{t('delete')}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
@@ -109,10 +109,10 @@ export function AdminNewsManager({ initialNews }: { initialNews: NewsItem[] }) {
|
||||
<input value={edit.tituloEn} onChange={(e) => setEdit({ ...edit, tituloEn: e.target.value })} placeholder={t('newsTitleEn')} maxLength={200} />
|
||||
<textarea value={edit.contenidoEn} onChange={(e) => setEdit({ ...edit, contenidoEn: e.target.value })} placeholder={t('newsContentEn')} rows={4} />
|
||||
<input value={edit.enlace} onChange={(e) => setEdit({ ...edit, enlace: e.target.value })} placeholder={t('newsLink')} />
|
||||
<button onClick={() => save(n.id)} disabled={busy} className="nw-tool-btn">
|
||||
<button onClick={() => save(n.id)} disabled={busy} className="ns-tool-btn">
|
||||
{busy ? t('saving') : t('save')}
|
||||
</button>{' '}
|
||||
<button onClick={() => setEditId(null)} className="nw-tool-btn">
|
||||
<button onClick={() => setEditId(null)} className="ns-tool-btn">
|
||||
{t('cancel')}
|
||||
</button>
|
||||
</td>
|
||||
@@ -124,10 +124,10 @@ export function AdminNewsManager({ initialNews }: { initialNews: NewsItem[] }) {
|
||||
{n.fecha && <p className="third-brown small-font">{new Date(n.fecha).toLocaleString(locale)}</p>}
|
||||
</td>
|
||||
<td className="real-info-box">
|
||||
<button onClick={() => startEdit(n)} className="nw-tool-btn">
|
||||
<button onClick={() => startEdit(n)} className="ns-tool-btn">
|
||||
{t('edit')}
|
||||
</button>{' '}
|
||||
<button onClick={() => remove(n.id)} className="nw-tool-btn red-info2">
|
||||
<button onClick={() => remove(n.id)} className="ns-tool-btn red-info2">
|
||||
{t('delete')}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
@@ -44,7 +44,7 @@ function Row({ row }: { row: PriceRow }) {
|
||||
onChange={(e) => setValue(e.target.value)}
|
||||
style={{ width: 90, textAlign: 'right' }}
|
||||
/>{' '}
|
||||
<button onClick={save} disabled={busy} className="nw-tool-btn">
|
||||
<button onClick={save} disabled={busy} className="ns-tool-btn">
|
||||
{t('save')}
|
||||
</button>{' '}
|
||||
{saved && <span className="green-info small-font">{t('saved')}</span>}
|
||||
|
||||
@@ -135,8 +135,8 @@ function PromoRow({ promo, onDelete }: { promo: PromoCode; onDelete: () => void
|
||||
<label className="small-font"><input type="checkbox" checked={active} onChange={(e) => setActive(e.target.checked)} /> {t('promoActive')}</label>
|
||||
</td>
|
||||
<td className="real-info-box">
|
||||
<button onClick={save} disabled={busy} className="nw-tool-btn">{saved ? t('saved') : t('save')}</button>{' '}
|
||||
<button onClick={onDelete} className="nw-tool-btn red-info2">{t('delete')}</button>
|
||||
<button onClick={save} disabled={busy} className="ns-tool-btn">{saved ? t('saved') : t('save')}</button>{' '}
|
||||
<button onClick={onDelete} className="ns-tool-btn red-info2">{t('delete')}</button>
|
||||
</td>
|
||||
</tr>
|
||||
)
|
||||
|
||||
@@ -90,7 +90,7 @@ export function AdminRecruitManager({ initial }: { initial: RecruitReward[] }) {
|
||||
</p>
|
||||
</td>
|
||||
<td className="real-info-box">
|
||||
<button onClick={() => remove(r.id)} className="nw-tool-btn red-info2">
|
||||
<button onClick={() => remove(r.id)} className="ns-tool-btn red-info2">
|
||||
{t('delete')}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
@@ -90,11 +90,11 @@ export function AdminUsersManager() {
|
||||
</td>
|
||||
<td className="real-info-box">
|
||||
{a.banned ? (
|
||||
<button onClick={() => act(a, 'unban')} className="nw-tool-btn green-info">
|
||||
<button onClick={() => act(a, 'unban')} className="ns-tool-btn green-info">
|
||||
{t('unban')}
|
||||
</button>
|
||||
) : (
|
||||
<button onClick={() => act(a, 'ban')} className="nw-tool-btn red-info2">
|
||||
<button onClick={() => act(a, 'ban')} className="ns-tool-btn red-info2">
|
||||
{t('ban')}
|
||||
</button>
|
||||
)}
|
||||
|
||||
@@ -70,7 +70,7 @@ export function AdminVotesManager({ initial }: { initial: VoteSite[] }) {
|
||||
</p>
|
||||
</td>
|
||||
<td className="real-info-box">
|
||||
<button onClick={() => remove(s.id)} className="nw-tool-btn red-info2">
|
||||
<button onClick={() => remove(s.id)} className="ns-tool-btn red-info2">
|
||||
{t('delete')}
|
||||
</button>
|
||||
</td>
|
||||
|
||||
@@ -4,8 +4,8 @@ import { useState } from 'react'
|
||||
import { useTranslations } from 'next-intl'
|
||||
import { Link } from '@/i18n/navigation'
|
||||
|
||||
const LOGOS = '/nw-themes/nw-ryu/nw-images/nw-logos'
|
||||
const RANKS = '/nw-themes/nw-ryu/nw-images/nw-ranks'
|
||||
const LOGOS = '/ns-themes/ns-ryu/ns-images/ns-logos'
|
||||
const RANKS = '/ns-themes/ns-ryu/ns-images/ns-ranks'
|
||||
|
||||
type TabId = 'Info' | 'Stripe' | 'SumUp'
|
||||
|
||||
|
||||
@@ -23,18 +23,18 @@ export async function Pagination({
|
||||
const pages: number[] = []
|
||||
for (let p = from; p <= to; p++) pages.push(p)
|
||||
|
||||
const cls = (active: boolean) => `nw-page-link${active ? ' nw-page-current' : ''}`
|
||||
const cls = (active: boolean) => `ns-page-link${active ? ' ns-page-current' : ''}`
|
||||
|
||||
return (
|
||||
<nav className="centered separate" aria-label="pagination">
|
||||
{page > 1 && (
|
||||
<Link href={hrefFor(page - 1)} className="nw-page-link">
|
||||
<Link href={hrefFor(page - 1)} className="ns-page-link">
|
||||
← {t('prev')}
|
||||
</Link>
|
||||
)}
|
||||
{from > 1 && (
|
||||
<>
|
||||
<Link href={hrefFor(1)} className="nw-page-link">
|
||||
<Link href={hrefFor(1)} className="ns-page-link">
|
||||
1
|
||||
</Link>
|
||||
{from > 2 && <span className="third-brown">…</span>}
|
||||
@@ -48,13 +48,13 @@ export async function Pagination({
|
||||
{to < totalPages && (
|
||||
<>
|
||||
{to < totalPages - 1 && <span className="third-brown">…</span>}
|
||||
<Link href={hrefFor(totalPages)} className="nw-page-link">
|
||||
<Link href={hrefFor(totalPages)} className="ns-page-link">
|
||||
{totalPages}
|
||||
</Link>
|
||||
</>
|
||||
)}
|
||||
{page < totalPages && (
|
||||
<Link href={hrefFor(page + 1)} className="nw-page-link">
|
||||
<Link href={hrefFor(page + 1)} className="ns-page-link">
|
||||
{t('next')} →
|
||||
</Link>
|
||||
)}
|
||||
|
||||
@@ -92,13 +92,13 @@ export function PostActions({
|
||||
<div className="separate">
|
||||
<RichTextArea value={text} onChange={setText} rows={4} />
|
||||
<br />
|
||||
<button type="button" onClick={save} disabled={busy} className="nw-tool-btn">
|
||||
<button type="button" onClick={save} disabled={busy} className="ns-tool-btn">
|
||||
{busy ? t('sending') : t('save')}
|
||||
</button>{' '}
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => { setEditing(false); setText(initialText); setError(null) }}
|
||||
className="nw-tool-btn"
|
||||
className="ns-tool-btn"
|
||||
>
|
||||
{t('cancel')}
|
||||
</button>
|
||||
@@ -110,7 +110,7 @@ export function PostActions({
|
||||
if (deleted) {
|
||||
return (
|
||||
<div className="separate small-font">
|
||||
<button type="button" onClick={restore} disabled={busy} className="nw-tool-btn green-info">
|
||||
<button type="button" onClick={restore} disabled={busy} className="ns-tool-btn green-info">
|
||||
{t('restore')}
|
||||
</button>
|
||||
{error && <span className="red-info2"> {error}</span>}
|
||||
|
||||
@@ -128,7 +128,7 @@ export function RecruitPanel({
|
||||
{r.claimed ? (
|
||||
<span className="green-info"><i className="fas fa-check"></i> {t('recruit.claimed')}</span>
|
||||
) : eligible ? (
|
||||
<button type="button" className="nw-tool-btn" onClick={() => claim(r)} disabled={busyId !== null}>
|
||||
<button type="button" className="ns-tool-btn" onClick={() => claim(r)} disabled={busyId !== null}>
|
||||
{busyId === r.id ? '…' : t('recruit.claim')}
|
||||
</button>
|
||||
) : (
|
||||
|
||||
@@ -46,28 +46,28 @@ export function RichTextArea({
|
||||
return (
|
||||
<div>
|
||||
<div className="lefted">
|
||||
<button type="button" onClick={() => surround('<strong>', '</strong>')} className="nw-tool-btn" title={t('bold')}>
|
||||
<button type="button" onClick={() => surround('<strong>', '</strong>')} className="ns-tool-btn" title={t('bold')}>
|
||||
<b>B</b>
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => surround('<em>', '</em>')} className="nw-tool-btn" title={t('italic')}>
|
||||
<button type="button" onClick={() => surround('<em>', '</em>')} className="ns-tool-btn" title={t('italic')}>
|
||||
<i>I</i>
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => surround('<u>', '</u>')} className="nw-tool-btn" title={t('underline')}>
|
||||
<button type="button" onClick={() => surround('<u>', '</u>')} className="ns-tool-btn" title={t('underline')}>
|
||||
<u>U</u>
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => surround('<s>', '</s>')} className="nw-tool-btn" title={t('strike')}>
|
||||
<button type="button" onClick={() => surround('<s>', '</s>')} className="ns-tool-btn" title={t('strike')}>
|
||||
<s>S</s>
|
||||
</button>{' '}
|
||||
<button type="button" onClick={insertLink} className="nw-tool-btn" title={t('link')}>
|
||||
<button type="button" onClick={insertLink} className="ns-tool-btn" title={t('link')}>
|
||||
🔗
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => surround('<blockquote>', '</blockquote>', t('quoteText'))} className="nw-tool-btn" title={t('quote')}>
|
||||
<button type="button" onClick={() => surround('<blockquote>', '</blockquote>', t('quoteText'))} className="ns-tool-btn" title={t('quote')}>
|
||||
❝
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => surround('<ul>\n<li>', '</li>\n</ul>', t('listItem'))} className="nw-tool-btn" title={t('list')}>
|
||||
<button type="button" onClick={() => surround('<ul>\n<li>', '</li>\n</ul>', t('listItem'))} className="ns-tool-btn" title={t('list')}>
|
||||
•
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => surround('<code>', '</code>')} className="nw-tool-btn" title={t('code')}>
|
||||
<button type="button" onClick={() => surround('<code>', '</code>')} className="ns-tool-btn" title={t('code')}>
|
||||
{'</>'}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -12,7 +12,7 @@ const SERVER_NAME = 'NightSpire'
|
||||
* `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 `nwNavBar()` de nw-scripts.js.
|
||||
* que en Django. El toggle móvil replica `nwNavBar()` de ns-scripts.js.
|
||||
*/
|
||||
export function SiteHeader({
|
||||
loggedIn,
|
||||
@@ -34,7 +34,7 @@ export function SiteHeader({
|
||||
return (
|
||||
<header>
|
||||
<div className="nav-wrapper">
|
||||
<div className={open ? 'nav-bar responsive' : 'nav-bar'} id="nw-nav-bar">
|
||||
<div className={open ? 'nav-bar responsive' : 'nav-bar'} id="ns-nav-bar">
|
||||
<a
|
||||
role="button"
|
||||
tabIndex={0}
|
||||
@@ -135,16 +135,16 @@ export function SiteHeader({
|
||||
{/* eslint-disable @next/next/no-img-element */}
|
||||
<Link href="/">
|
||||
<img
|
||||
className="nw-long-logo"
|
||||
src="/nw-themes/nw-ryu/nw-images/nw-logos/nw-long-logo.webp"
|
||||
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="nw-logo"
|
||||
src="/nw-themes/nw-ryu/nw-images/nw-logos/nw-logo.webp"
|
||||
className="ns-logo"
|
||||
src="/ns-themes/ns-ryu/ns-images/ns-logos/ns-logo.webp"
|
||||
alt="NW"
|
||||
title="NW"
|
||||
/>
|
||||
|
||||
@@ -12,7 +12,7 @@ import type { StoreCategory, StoreItem } from '@/lib/store'
|
||||
const ICON_FALLBACK = 'inv_misc_questionmark'
|
||||
|
||||
/** Renders de los ítems de la tienda (public/), para el preview en hover. */
|
||||
const STORE_DISPLAY_PATH = '/nw-themes/nw-ryu/nw-images/nw-displays'
|
||||
const STORE_DISPLAY_PATH = '/ns-themes/ns-ryu/ns-images/ns-displays'
|
||||
|
||||
/**
|
||||
* Importe en euros en el idioma de la web ("2,00 €", "0,125 €").
|
||||
@@ -100,16 +100,16 @@ function CategoryNode({
|
||||
<div className="item-box" key={it.id}>
|
||||
{/* Previsualización del render al pasar el ratón, como el original:
|
||||
solo la tienen los ítems equipables (los demás no tienen
|
||||
apariencia). El CSS (nw-st-tooltip-w, nw-img-display) ya viene
|
||||
apariencia). El CSS (ns-st-tooltip-w, ns-img-display) ya viene
|
||||
en el tema. */}
|
||||
{it.preview && (
|
||||
<div className="second-brown nw-st-tooltip-w">
|
||||
<div className="second-brown ns-st-tooltip-w">
|
||||
{/* `fas`, no el `fa` suelto del original: cargamos Font Awesome 6,
|
||||
donde solo .fas/.fa-solid activan la fuente (el `fa` de FA4/5
|
||||
no pinta nada sin el shim de compatibilidad). */}
|
||||
<i className="fas fa-image" />
|
||||
<span className="nw-st-img-tooltip">
|
||||
<ins className="nw-img-display" style={{ backgroundImage: `url(${STORE_DISPLAY_PATH}/${it.preview}.png)` }} />
|
||||
<span className="ns-st-img-tooltip">
|
||||
<ins className="ns-img-display" style={{ backgroundImage: `url(${STORE_DISPLAY_PATH}/${it.preview}.png)` }} />
|
||||
</span>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -49,7 +49,7 @@ export function TopicModBar({
|
||||
return (
|
||||
<div className="info-box-light separate">
|
||||
<span className="red-info2">{t('deletedMark')}</span>{' '}
|
||||
<button type="button" onClick={() => act('restore')} disabled={busy} className="nw-tool-btn green-info">
|
||||
<button type="button" onClick={() => act('restore')} disabled={busy} className="ns-tool-btn green-info">
|
||||
{t('restoreTopic')}
|
||||
</button>
|
||||
</div>
|
||||
@@ -59,10 +59,10 @@ export function TopicModBar({
|
||||
return (
|
||||
<div className="info-box-light separate">
|
||||
<span className="yellow-info">{t('moderation')}:</span>{' '}
|
||||
<button type="button" onClick={() => act(locked ? 'unlock' : 'lock')} disabled={busy} className="nw-tool-btn">
|
||||
<button type="button" onClick={() => act(locked ? 'unlock' : 'lock')} disabled={busy} className="ns-tool-btn">
|
||||
{locked ? t('unlock') : t('lock')}
|
||||
</button>{' '}
|
||||
<button type="button" onClick={() => act(sticky ? 'unsticky' : 'sticky')} disabled={busy} className="nw-tool-btn">
|
||||
<button type="button" onClick={() => act(sticky ? 'unsticky' : 'sticky')} disabled={busy} className="ns-tool-btn">
|
||||
{sticky ? t('unpin') : t('pin')}
|
||||
</button>{' '}
|
||||
{moveForums.length > 0 && (
|
||||
@@ -87,7 +87,7 @@ export function TopicModBar({
|
||||
))}
|
||||
</select>
|
||||
)}{' '}
|
||||
<button type="button" onClick={() => act('delete', undefined, t('confirmDeleteTopic'))} disabled={busy} className="nw-tool-btn red-info2">
|
||||
<button type="button" onClick={() => act('delete', undefined, t('confirmDeleteTopic'))} disabled={busy} className="ns-tool-btn red-info2">
|
||||
{t('deleteTopic')}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { useState } from 'react'
|
||||
import { useTranslations } from 'next-intl'
|
||||
|
||||
const LOGOS = '/nw-themes/nw-ryu/nw-images/nw-logos'
|
||||
const LOGOS = '/ns-themes/ns-ryu/ns-images/ns-logos'
|
||||
|
||||
type Msg = { success: boolean; text: string } | null
|
||||
|
||||
|
||||
@@ -4,18 +4,18 @@ const SERVER_NAME = 'NightSpire'
|
||||
|
||||
/**
|
||||
* Bloque de vídeo de cabecera — réplica del partial Django `partials/video.html`
|
||||
* (logo principal + vídeo de fondo en bucle). Clases del tema real: div-nw-video,
|
||||
* nw-main-logo, nw-video.
|
||||
* (logo principal + vídeo de fondo en bucle). Clases del tema real: div-ns-video,
|
||||
* ns-main-logo, ns-video.
|
||||
*/
|
||||
export function Video() {
|
||||
return (
|
||||
<div className="div-nw-video">
|
||||
<div className="nw-main-logo">
|
||||
<div className="div-ns-video">
|
||||
<div className="ns-main-logo">
|
||||
<Link href="/">
|
||||
{/* eslint-disable-next-line @next/next/no-img-element */}
|
||||
<img
|
||||
className="nw_main_logo_img"
|
||||
src="/nw-themes/nw-ryu/nw-images/nw-logos/nightspire-main-logo-transparent.webp"
|
||||
src="/ns-themes/ns-ryu/ns-images/ns-logos/nightspire-main-logo-transparent.webp"
|
||||
alt={SERVER_NAME}
|
||||
title={SERVER_NAME}
|
||||
/>
|
||||
@@ -28,8 +28,8 @@ export function Video() {
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<video className="nw-video" autoPlay loop muted playsInline>
|
||||
<source src="/nw-themes/nw-ryu/nw-videos/nw-logo.mp4" />
|
||||
<video className="ns-video" autoPlay loop muted playsInline>
|
||||
<source src="/ns-themes/ns-ryu/ns-videos/ns-logo.mp4" />
|
||||
</video>
|
||||
</div>
|
||||
)
|
||||
|
||||
@@ -5,7 +5,7 @@ import { useTranslations, useLocale } from 'next-intl'
|
||||
import { useRouter } from '@/i18n/navigation'
|
||||
import type { VoteSiteStatus } from '@/lib/vote'
|
||||
|
||||
const REFRESH_ICON = '/nw-themes/nw-ryu/nw-images/nw-icons/refresh.webp'
|
||||
const REFRESH_ICON = '/ns-themes/ns-ryu/ns-images/ns-icons/refresh.webp'
|
||||
|
||||
export function VotePanel({ sites, canVote }: { sites: VoteSiteStatus[]; canVote: boolean }) {
|
||||
const t = useTranslations('Vote')
|
||||
|
||||
@@ -16,7 +16,7 @@ const RANK_MIN = [0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 5000, 10
|
||||
export function getAccountRank(dp: number): { level: number; image: string } {
|
||||
let idx = 0
|
||||
for (let i = 0; i < RANK_MIN.length; i++) if (dp >= RANK_MIN[i]) idx = i
|
||||
return { level: idx + 1, image: `/nw-themes/nw-ryu/nw-images/nw-ranks/${RANK_FILES[idx]}.svg` }
|
||||
return { level: idx + 1, image: `/ns-themes/ns-ryu/ns-images/ns-ranks/${RANK_FILES[idx]}.svg` }
|
||||
}
|
||||
|
||||
export interface Character {
|
||||
|
||||
@@ -101,7 +101,7 @@ function layout(label: string, title: string, rows: string[], locale = 'es'): st
|
||||
<td align="center" style="padding:0;Margin:0">
|
||||
<table cellspacing="0" cellpadding="0" align="center" style="border-collapse:collapse;border-spacing:0px;background-color:transparent;width:600px">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td align="left" background="${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-footer.jpg" style="Margin:0;padding-top:10px;padding-bottom:10px;padding-left:10px;padding-right:10px;background-image:url(${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-footer.jpg);background-repeat:no-repeat;background-position:left top">
|
||||
<td align="left" background="${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-footer.jpg" style="Margin:0;padding-top:10px;padding-bottom:10px;padding-left:10px;padding-right:10px;background-image:url(${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-footer.jpg);background-repeat:no-repeat;background-position:left top">
|
||||
|
||||
<table cellspacing="0" cellpadding="0" align="left" style="border-collapse:collapse;border-spacing:0px;float:left">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
@@ -145,14 +145,14 @@ function layout(label: string, title: string, rows: string[], locale = 'es'): st
|
||||
<td align="center" valign="top" style="padding:0;Margin:0;width:600px">
|
||||
<table cellpadding="0" cellspacing="0" width="100%" role="presentation" style="border-collapse:collapse;border-spacing:0px">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td align="center" style="padding:0;Margin:0;font-size:0px"><a href="${site}/${locale}/" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#b58a60" target="_blank"><img src="${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-logo.png" alt="" style="display:block;border:0;outline:none;text-decoration:none" width="600" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td align="center" style="padding:0;Margin:0;font-size:0px"><a href="${site}/${locale}/" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#b58a60" target="_blank"><img src="${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-logo.png" alt="" style="display:block;border:0;outline:none;text-decoration:none" width="600" class="CToWUd" data-bit="iit"></a></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
<tr style="border-collapse:collapse">
|
||||
<td align="left" background="${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-body.jpg" style="Margin:0;padding-top:40px;padding-bottom:40px;padding-left:40px;padding-right:40px;background-image:url(${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-body.jpg);background-repeat:repeat;background-position:left top">
|
||||
<td align="left" background="${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-body.jpg" style="Margin:0;padding-top:40px;padding-bottom:40px;padding-left:40px;padding-right:40px;background-image:url(${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-body.jpg);background-repeat:repeat;background-position:left top">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border-spacing:0px">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;width:520px">
|
||||
@@ -176,7 +176,7 @@ function layout(label: string, title: string, rows: string[], locale = 'es'): st
|
||||
<table width="100%" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border-spacing:0px">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;width:600px">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" background="${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-footer.jpg" style="border-collapse:collapse;border-spacing:0px;background-image:url(${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-footer.jpg);background-repeat:no-repeat;background-position:left top" role="presentation">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" background="${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-footer.jpg" style="border-collapse:collapse;border-spacing:0px;background-image:url(${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-footer.jpg);background-repeat:no-repeat;background-position:left top" role="presentation">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td align="center" style="padding:0;Margin:0;padding-top:10px"><p style="Margin:0;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';line-height:21px;color:#ffffff">SÍGUENOS EN</p></td>
|
||||
</tr>
|
||||
@@ -184,10 +184,10 @@ function layout(label: string, title: string, rows: string[], locale = 'es'): st
|
||||
<td align="center" style="padding:0;Margin:0;padding-top:15px;padding-bottom:15px;font-size:0">
|
||||
<table cellspacing="0" cellpadding="0" role="presentation" style="border-collapse:collapse;border-spacing:0px">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;padding-right:20px"><a href="https://www.facebook.com/NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Facebook" src="${site}/nw-themes/nw-ryu/nw-images/nw-mails/facebook-logo-gray.png" alt="Fb" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;padding-right:20px"><a href="https://www.instagram.com/NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Instagram" src="${site}/nw-themes/nw-ryu/nw-images/nw-mails/instagram-logo-gray.png" alt="Ig" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;padding-right:20px"><a href="https://twitter.com/NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Twitter" src="${site}/nw-themes/nw-ryu/nw-images/nw-mails/twitter-logo-gray.png" alt="Tw" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0"><a href="https://www.youtube.com/@NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Youtube" src="${site}/nw-themes/nw-ryu/nw-images/nw-mails/youtube-logo-gray.png" alt="Yt" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;padding-right:20px"><a href="https://www.facebook.com/NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Facebook" src="${site}/ns-themes/ns-ryu/ns-images/ns-mails/facebook-logo-gray.png" alt="Fb" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;padding-right:20px"><a href="https://www.instagram.com/NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Instagram" src="${site}/ns-themes/ns-ryu/ns-images/ns-mails/instagram-logo-gray.png" alt="Ig" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;padding-right:20px"><a href="https://twitter.com/NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Twitter" src="${site}/ns-themes/ns-ryu/ns-images/ns-mails/twitter-logo-gray.png" alt="Tw" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
<td valign="top" align="center" style="padding:0;Margin:0"><a href="https://www.youtube.com/@NightSpire" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:underline;color:#333333" target="_blank"><img title="Youtube" src="${site}/ns-themes/ns-ryu/ns-images/ns-mails/youtube-logo-gray.png" alt="Yt" width="32" height="32" style="display:block;border:0;outline:none;text-decoration:none" class="CToWUd" data-bit="iit"></a></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
@@ -200,7 +200,7 @@ function layout(label: string, title: string, rows: string[], locale = 'es'): st
|
||||
<table width="100%" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border-spacing:0px">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td valign="top" align="center" style="padding:0;Margin:0;width:600px">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" background="${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-body.jpg" style="border-collapse:collapse;border-spacing:0px;background-image:url(${site}/nw-themes/nw-ryu/nw-images/nw-mails/nw-mail-body.jpg);background-repeat:no-repeat;background-position:left top" role="presentation">
|
||||
<table width="100%" cellspacing="0" cellpadding="0" background="${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-body.jpg" style="border-collapse:collapse;border-spacing:0px;background-image:url(${site}/ns-themes/ns-ryu/ns-images/ns-mails/ns-mail-body.jpg);background-repeat:no-repeat;background-position:left top" role="presentation">
|
||||
<tbody><tr style="border-collapse:collapse">
|
||||
<td align="center" style="padding:0;Margin:0;padding-top:10px;padding-bottom:15px"><p style="Margin:0;font-size:14px;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';line-height:21px;color:#5c4c44"><a href="${site}/${locale}/terms-and-conditions" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:none;color:#2471a9" target="_blank">Términos y Condiciones</a> | <a href="${site}/${locale}/refund-policy" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:none;color:#2471a9" target="_blank">Política de Reembolso</a> | <a href="${site}/${locale}/privacy-policy" style="font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-size:14px;text-decoration:none;color:#2471a9" target="_blank">Política de Privacidad</a><br>${SERVER_NAME} © ${year}</p></td>
|
||||
</tr>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import type { RowDataPacket } from 'mysql2'
|
||||
import { db, DB } from './db'
|
||||
|
||||
const IMG = '/nw-themes/nw-ryu/nw-images'
|
||||
const IMG = '/ns-themes/ns-ryu/ns-images'
|
||||
|
||||
// Clases (orden del original) → slug de color + etiqueta.
|
||||
export const CLASS_ORDER = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11]
|
||||
@@ -33,17 +33,17 @@ export const RACE_INFO: Record<number, { key: string; label: string; faction: 'a
|
||||
}
|
||||
|
||||
export function classChest(id: number) {
|
||||
return `${IMG}/nw-classes/${CLASS_INFO[id]?.key ?? 'warrior'}-chest.webp`
|
||||
return `${IMG}/ns-classes/${CLASS_INFO[id]?.key ?? 'warrior'}-chest.webp`
|
||||
}
|
||||
export function classMedium(id: number) {
|
||||
return `${IMG}/nw-classes/${CLASS_INFO[id]?.key ?? 'warrior'}-medium.jpg`
|
||||
return `${IMG}/ns-classes/${CLASS_INFO[id]?.key ?? 'warrior'}-medium.jpg`
|
||||
}
|
||||
export function raceBig(race: number, gender: number) {
|
||||
return `${IMG}/nw-races/big-${RACE_INFO[race]?.key ?? 'human'}-${gender === 0 ? 'male' : 'female'}.webp`
|
||||
return `${IMG}/ns-races/big-${RACE_INFO[race]?.key ?? 'human'}-${gender === 0 ? 'male' : 'female'}.webp`
|
||||
}
|
||||
export const ALLIANCE_ICON = `${IMG}/nw-icons/alliance-no-border.webp`
|
||||
export const HORDE_ICON = `${IMG}/nw-icons/horde-no-border.webp`
|
||||
export const ACH80_ICON = `${IMG}/nw-icons/achievement-level-80.jpg`
|
||||
export const ALLIANCE_ICON = `${IMG}/ns-icons/alliance-no-border.webp`
|
||||
export const HORDE_ICON = `${IMG}/ns-icons/horde-no-border.webp`
|
||||
export const ACH80_ICON = `${IMG}/ns-icons/achievement-level-80.jpg`
|
||||
|
||||
// Logro «Nivel 80» (logros de nivel WotLK: 6=Nv10, 7=Nv20 … 12=Nv70, 13=Nv80).
|
||||
const ACH_LEVEL80 = 13
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
|
||||
@font-face {
|
||||
font-family: "FuturaEF-Book";
|
||||
src: url('../nw-font/FuturaEF-Book.eot');
|
||||
src: url('../nw-font/FuturaEF-Book.otf') format('otf'),
|
||||
url('../nw-font/FuturaEF-Book.woff') format('woff'),
|
||||
url('../nw-font/FuturaEF-Book.ttf') format('truetype');
|
||||
src: url('../ns-font/FuturaEF-Book.eot');
|
||||
src: url('../ns-font/FuturaEF-Book.otf') format('otf'),
|
||||
url('../ns-font/FuturaEF-Book.woff') format('woff'),
|
||||
url('../ns-font/FuturaEF-Book.ttf') format('truetype');
|
||||
}
|
||||
|
||||
* {
|
||||
@@ -60,12 +60,12 @@ hr {
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
margin: 5px auto;
|
||||
background-image: url(../nw-images/nw-general/nw-divider.png);
|
||||
background-image: url(../ns-images/ns-general/ns-divider.png);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
hr {
|
||||
background-image: url(../nw-images/nw-general/nw-divider-mini.webp);
|
||||
background-image: url(../ns-images/ns-general/ns-divider-mini.webp);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -111,7 +111,7 @@ legend {
|
||||
background-blend-mode: saturation;
|
||||
background-position: left;
|
||||
background-size: 200%;
|
||||
background-image: url(../nw-images/nw-general/account-info.png);
|
||||
background-image: url(../ns-images/ns-general/account-info.png);
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
@@ -434,12 +434,12 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
}
|
||||
|
||||
/* nw logos */
|
||||
.nw-logo {
|
||||
.ns-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
.nw-logo {
|
||||
.ns-logo {
|
||||
width: 46px;
|
||||
display: inline-block;
|
||||
float: right;
|
||||
@@ -447,12 +447,12 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
}
|
||||
}
|
||||
|
||||
.nw-long-logo {
|
||||
.ns-long-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
.nw-long-logo {
|
||||
.ns-long-logo {
|
||||
display: inline-block;
|
||||
background-color: #130c09;
|
||||
z-index: 2;
|
||||
@@ -465,7 +465,7 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
}
|
||||
}
|
||||
|
||||
.nw-main-logo {
|
||||
.ns-main-logo {
|
||||
z-index: 2;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
@@ -477,7 +477,7 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
.nw-main-logo {
|
||||
.ns-main-logo {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@@ -488,7 +488,7 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
|
||||
|
||||
/* Video */
|
||||
.div-nw-video{
|
||||
.div-ns-video{
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
@@ -496,12 +496,12 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
.div-nw-video {
|
||||
.div-ns-video {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.nw-video {
|
||||
.ns-video {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
z-index: -1;
|
||||
@@ -705,70 +705,70 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
}
|
||||
|
||||
.char-box-death-knight {
|
||||
background-image: url(../nw-images/nw-classes/wow-death-knight.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-death-knight.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-druid {
|
||||
background-image: url(../nw-images/nw-classes/wow-druid.png);
|
||||
background-image: url(../ns-images/ns-classes/wow-druid.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-hunter {
|
||||
background-image: url(../nw-images/nw-classes/wow-hunter.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-hunter.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-mage {
|
||||
background-image: url(../nw-images/nw-classes/wow-mage.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-mage.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-paladin {
|
||||
background-image: url(../nw-images/nw-classes/wow-paladin.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-paladin.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-priest {
|
||||
background-image: url(../nw-images/nw-classes/wow-priest.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-priest.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-rogue {
|
||||
background-image: url(../nw-images/nw-classes/wow-rogue.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-rogue.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-shaman {
|
||||
background-image: url(../nw-images/nw-classes/wow-shaman.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-shaman.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-warlock {
|
||||
background-image: url(../nw-images/nw-classes/wow-warlock.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-warlock.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.char-box-warrior {
|
||||
background-image: url(../nw-images/nw-classes/wow-warrior.webp);
|
||||
background-image: url(../ns-images/ns-classes/wow-warrior.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: right bottom;
|
||||
position: relative;
|
||||
@@ -859,7 +859,7 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
/* acc panels */
|
||||
#account-settings, #character-settings, #account-history {
|
||||
background: hsla(0, 100%, 0%, 0.7);
|
||||
background-image: url(../nw-images/nw-general/account-info.png);
|
||||
background-image: url(../ns-images/ns-general/account-info.png);
|
||||
background-repeat: no-repeat;
|
||||
background-blend-mode: saturation;
|
||||
background-position: right;
|
||||
@@ -889,7 +889,7 @@ textarea:focus, select:focus, input[type=password]:focus, input[type=number]:foc
|
||||
|
||||
/* acc icons */
|
||||
.acc-icon {
|
||||
background-image: url(../nw-images/nw-icons/account-icons.png);
|
||||
background-image: url(../ns-images/ns-icons/account-icons.png);
|
||||
display: table-cell;
|
||||
width: 80px;
|
||||
height: 68px;
|
||||
@@ -2087,37 +2087,37 @@ th {
|
||||
}
|
||||
|
||||
/* tooltips */
|
||||
.nw-st-tooltip {
|
||||
.ns-st-tooltip {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
margin-left: 15px;
|
||||
}
|
||||
|
||||
.nw-st-tooltip-w {
|
||||
.ns-st-tooltip-w {
|
||||
display: inline-block;
|
||||
float: right;
|
||||
margin-left: -14%;
|
||||
}
|
||||
|
||||
.nw-st-img-tooltip {
|
||||
.ns-st-img-tooltip {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
/* Tooltip text */
|
||||
.nw-st-tooltip .nw-st-img-tooltip, .nw-st-tooltip-w .nw-st-img-tooltip {
|
||||
.ns-st-tooltip .ns-st-img-tooltip, .ns-st-tooltip-w .ns-st-img-tooltip {
|
||||
visibility: hidden;
|
||||
position: absolute;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.nw-st-tooltip:hover .nw-st-img-tooltip, .nw-st-tooltip-w:hover .nw-st-img-tooltip {
|
||||
.ns-st-tooltip:hover .ns-st-img-tooltip, .ns-st-tooltip-w:hover .ns-st-img-tooltip {
|
||||
visibility: visible;
|
||||
bottom: 100%;
|
||||
margin-left: -98px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
.nw-st-tooltip .nw-st-img-tooltip::after, .nw-st-tooltip-w .nw-st-img-tooltip::after {
|
||||
.ns-st-tooltip .ns-st-img-tooltip::after, .ns-st-tooltip-w .ns-st-img-tooltip::after {
|
||||
content: " ";
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
@@ -2128,7 +2128,7 @@ th {
|
||||
border-color: #352e2b transparent transparent transparent;
|
||||
}
|
||||
|
||||
.nw-img-display {
|
||||
.ns-img-display {
|
||||
background-size: 210px;
|
||||
background-repeat: no-repeat;
|
||||
width: 210px;
|
||||
@@ -2137,7 +2137,7 @@ th {
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1024px) {
|
||||
.nw-st-tooltip, .nw-st-tooltip-w, .nw-img-display {
|
||||
.ns-st-tooltip, .ns-st-tooltip-w, .ns-img-display {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@@ -2313,21 +2313,21 @@ th {
|
||||
}
|
||||
|
||||
.cc-youtube {
|
||||
background-image: url(../nw-images/nw-logos/youtube.webp);
|
||||
background-image: url(../ns-images/ns-logos/youtube.webp);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 100% 45%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.cc-facebook {
|
||||
background-image: url(../nw-images/nw-logos/facebook.png);
|
||||
background-image: url(../ns-images/ns-logos/facebook.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 100% 45%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.cc-twitch {
|
||||
background-image: url(../nw-images/nw-logos/twitch.png);
|
||||
background-image: url(../ns-images/ns-logos/twitch.png);
|
||||
background-repeat: no-repeat;
|
||||
background-position: 100% 45%;
|
||||
position: relative;
|
||||
@@ -2400,7 +2400,7 @@ th {
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
.nw-rank {
|
||||
.ns-rank {
|
||||
display: inline;
|
||||
float: right;
|
||||
width: 52px;
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 85 KiB After Width: | Height: | Size: 85 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 82 KiB After Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 4.0 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 338 B After Width: | Height: | Size: 338 B |
|
Before Width: | Height: | Size: 314 B After Width: | Height: | Size: 314 B |
|
Before Width: | Height: | Size: 310 B After Width: | Height: | Size: 310 B |
|
Before Width: | Height: | Size: 342 B After Width: | Height: | Size: 342 B |
|
Before Width: | Height: | Size: 332 B After Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 354 B After Width: | Height: | Size: 354 B |
|
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 294 B |
|
Before Width: | Height: | Size: 441 B After Width: | Height: | Size: 441 B |
|
Before Width: | Height: | Size: 402 B After Width: | Height: | Size: 402 B |
|
Before Width: | Height: | Size: 222 B After Width: | Height: | Size: 222 B |
|
Before Width: | Height: | Size: 326 B After Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 364 B After Width: | Height: | Size: 364 B |
|
Before Width: | Height: | Size: 116 KiB After Width: | Height: | Size: 116 KiB |
|
Before Width: | Height: | Size: 165 KiB After Width: | Height: | Size: 165 KiB |
|
Before Width: | Height: | Size: 115 KiB After Width: | Height: | Size: 115 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 123 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 118 KiB After Width: | Height: | Size: 118 KiB |
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 112 KiB After Width: | Height: | Size: 112 KiB |
|
Before Width: | Height: | Size: 120 KiB After Width: | Height: | Size: 120 KiB |
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
|
Before Width: | Height: | Size: 141 KiB After Width: | Height: | Size: 141 KiB |
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
|
Before Width: | Height: | Size: 99 KiB After Width: | Height: | Size: 99 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 124 KiB |
|
Before Width: | Height: | Size: 114 KiB After Width: | Height: | Size: 114 KiB |
|
Before Width: | Height: | Size: 174 KiB After Width: | Height: | Size: 174 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 147 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 129 KiB After Width: | Height: | Size: 129 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |