Armería: PvP campos de batalla, logros por categoría, bandas/mazmorras y página de hermandad
- PvP: pestaña Campos de batalla (pvpstats) con resultado, stats por partida y fecha/hora. - Logros: rejilla por categoría con anillos de progreso + detalle por categoría (datos de Achievement.db2 + Achievement_Category.db2, iconos vía wowhead). - Bandas: progreso por dificultad (10/25/heroico) con jefes reales de DungeonEncounter.db2 y tooltip de jefes; agrupado por expansión (Clásico/TBC/WotLK). - Mazmorras: mismo sistema, Normal + Heroico, Clásico/TBC/WotLK. - Página de hermandad estilo armería: cabecera (emblema, puntos = unión de logros de miembros sin duplicar, nº miembros, fundada), pestañas Hermandad/Logros, roster con iconos de clase/raza, columna Función (rol por spec), filtros clase/función, orden por rango/puntos/nivel de objeto/nivel/nombre, paginación. - Barra lateral: mensaje diario con login (iron-session, gated por pertenencia), logros recientes y desgloses de clases y funciones. - Cabecera de personaje: enlace a la hermandad + nombre del reino. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
'use client'
|
||||
|
||||
import { useState } from 'react'
|
||||
import { WowheadRefresh } from './WowheadRefresh'
|
||||
import { ArmoryTalents, type TalentGroupView } from './ArmoryTalents'
|
||||
|
||||
/**
|
||||
* Pestaña de talentos con conmutador Primaria/Secundaria (doble especialización).
|
||||
* Cada grupo trae su propio árbol y sus propios glifos, así que al conmutar cambian
|
||||
* ambos. Marca cuál es la spec activa del personaje.
|
||||
*/
|
||||
export function ArmoryTalentTab({
|
||||
groups,
|
||||
activeIndex,
|
||||
spellIcons,
|
||||
locale,
|
||||
labels,
|
||||
}: {
|
||||
groups: TalentGroupView[]
|
||||
activeIndex: number
|
||||
spellIcons: Record<number, string>
|
||||
locale: string
|
||||
labels: {
|
||||
distribution: string
|
||||
glyphs: string
|
||||
majorGlyphs: string
|
||||
minorGlyphs: string
|
||||
primary: string
|
||||
secondary: string
|
||||
activeSpec: string
|
||||
}
|
||||
}) {
|
||||
const [active, setActive] = useState(activeIndex)
|
||||
const groupLabel = (i: number) => (i === 0 ? labels.primary : labels.secondary)
|
||||
const g = groups[active] ?? groups[0]
|
||||
if (!g) return null
|
||||
|
||||
return (
|
||||
<div className="armory-panel armory-talents-panel">
|
||||
<WowheadRefresh dep={`talents-${active}`} />
|
||||
|
||||
{groups.length > 1 && (
|
||||
<div className="armory-spec-toggle">
|
||||
{groups.map((_, i) => (
|
||||
<button key={i} type="button" className={i === active ? 'active' : ''} onClick={() => setActive(i)}>
|
||||
{groupLabel(i)}
|
||||
{i === activeIndex ? <span className="armory-spec-toggle-dot"> • {labels.activeSpec}</span> : null}
|
||||
</button>
|
||||
))}
|
||||
</div>
|
||||
)}
|
||||
|
||||
<ArmoryTalents
|
||||
group={g}
|
||||
spellIcons={spellIcons}
|
||||
locale={locale}
|
||||
labels={{
|
||||
distribution: labels.distribution,
|
||||
groupLabel: groupLabel(active),
|
||||
glyphs: labels.glyphs,
|
||||
majorGlyphs: labels.majorGlyphs,
|
||||
minorGlyphs: labels.minorGlyphs,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
Reference in New Issue
Block a user