beba7301a1
- 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>
68 lines
1.8 KiB
TypeScript
68 lines
1.8 KiB
TypeScript
'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>
|
|
)
|
|
}
|