/* global React, Icon, Origin, SyncChip, Meter, CB, JobChip, Portrait, Tag, Empty, Seg, useRoute */ // ============================================================ // Screens 3-4: Dashboard + Relic tracker (hero screens) // ============================================================ const { useState: useS34, useMemo: useM34 } = React; // -------------------- 3. Individual Dashboard -------------------- function ScreenDashboard({ density }) { const { go } = useRoute(); const character = { name: "Aerith Nightsong", world: 'Sargatanas', dc: 'Aether', title: 'Warrior of Light', gc: 'Maelstrom · Storm Captain', fc: 'Whispers of Hydaelyn «WoH»', race: 'Au Ra · Xaela', ilvl: 720, bisTarget: 740, }; const jobs = [ { job: 'PLD', lvl: 100, cap: true }, { job: 'WAR', lvl: 100, cap: true }, { job: 'DRK', lvl: 92 }, { job: 'GNB', lvl: 90 }, { job: 'WHM', lvl: 100, cap: true }, { job: 'SCH', lvl: 100, cap: true }, { job: 'AST', lvl: 88 }, { job: 'SGE', lvl: 92 }, { job: 'NIN', lvl: 100, cap: true }, { job: 'SAM', lvl: 96 }, { job: 'BRD', lvl: 100, cap: true }, { job: 'BLM', lvl: 100, cap: true }, { job: 'RDM', lvl: 95 }, { job: 'DNC', lvl: 88 }, { job: 'PCT', lvl: 94 }, { job: 'VPR', lvl: 91 }, ]; const relics = [ { name: 'Zodiac · Animus', job: 'PLD', value: 7, total: 19 }, { name: 'Anima · Reborn', job: 'BRD', value: 3, total: 12 }, { name: 'Eureka · Pyros', job: 'WAR', value: 11, total: 14 }, { name: 'Resistance · Recollection', job: 'BLM', value: 1, total: 5 }, ]; const collections = [ { name: 'Mounts', v: 184, t: 312 }, { name: 'Minions', v: 312, t: 540 }, { name: 'Achievements', v: 1842, t: 3210 }, { name: 'Orchestrion', v: 218, t: 825 }, ]; return (

Good evening, jakob

Here's where your characters and grinds stand tonight.
{/* Character header card */}
{character.title}

{character.name}

{character.world} · {character.dc} · {character.race} · {character.gc}
FC {character.fc}
Next auto-sync in 2h 14m
Item level
720
→ 740 BiS ·
Jobs at cap
7/22
15 in progress
Time played
4,318h
since A Realm Reborn
All jobs
{jobs.map(j => )}
{/* At-a-glance grid */}
{/* Relics — hero */}
go('relics')} style={{ cursor: 'pointer' }}>
Relics
    {relics.map(r => (
  • {r.name}
  • ))}
{/* Collections */}
Collections
{collections.map(c => ( ))}
2 niche trackers active
{/* Current gear / BiS */}
Current gear
PLD · Tank
Average item level
720
BiS target
740
} tone="status" />
{['MH','OH','HD','BD','HN','GV','BT','FT','EAR','NK','BR','RG','RG','WP'].map((s, i) => (
{s}
))}
5 pieces to go · Earrings, Necklace, Bracelet, Ring (×2)
{/* Statics */}
My statics
go('static')}>
Aether Crystals
M4S — Savage · Tue/Thu 8–11 PM ET
Active
} />
Looking for a second static?
Create one or join with an invite code.
); } // -------------------- 4. Relic tracker -------------------- function ScreenRelics() { const { go } = useRoute(); const [activeStage, setActiveStage] = useS34(3); // 0..n const [activeJob, setActiveJob] = useS34('PLD'); const stages = [ { name: 'Relic', done: true, pct: 100 }, { name: 'Zenith', done: true, pct: 100 }, { name: 'Atma', done: true, pct: 100 }, { name: 'Animus', done: false, pct: 37, current: true }, { name: 'Novus', done: false, pct: 0 }, { name: 'Nexus', done: false, pct: 0 }, { name: 'Braves', done: false, pct: 0 }, { name: 'Zeta', done: false, pct: 0 }, ]; const trackedJobs = ['PLD','WAR','DRK','BRD','WHM']; const tasks = [ { zone: 'Northern Thanalan', region: 'Thanalan', items: [ { name: 'Bomb baron', type: 'Enemy', loc: 'X: 14.2 Y: 22.8', done: true }, { name: 'Lampyre', type: 'Enemy', loc: 'X: 17.5 Y: 16.4', done: true }, { name: 'FATE: Foul Play', type: 'FATE', loc: 'X: 21.3 Y: 24.0', done: false }, ], }, { zone: 'Eastern La Noscea', region: 'La Noscea', items: [ { name: 'Sahuagin warrior', type: 'Enemy', loc: 'X: 31.1 Y: 30.4', done: true }, { name: 'Sea wasp', type: 'Enemy', loc: 'X: 25.6 Y: 33.2', done: true }, { name: 'Levequest: Storm in a Teacup', type: 'Leve', loc: 'Costa del Sol', done: false }, { name: 'FATE: A Pirate\'s Life', type: 'FATE', loc: 'X: 33.6 Y: 31.8', done: false }, ], }, { zone: 'Coerthas Central Highlands', region: 'Coerthas', items: [ { name: 'Biast', type: 'Enemy', loc: 'X: 13.5 Y: 18.7', done: true }, { name: 'FATE: The Boulder Beheld', type: 'FATE', loc: 'X: 20.2 Y: 21.6', done: false }, { name: 'Dungeon: Stone Vigil', type: 'Dungeon', loc: 'Level 41 · Trial', done: true }, ], }, { zone: 'Outer La Noscea', region: 'La Noscea', items: [ { name: 'Goblin pugilist', type: 'Enemy', loc: 'X: 16.7 Y: 18.3', done: false }, { name: 'FATE: Trial by Claw', type: 'FATE', loc: 'X: 14.4 Y: 20.2', done: true }, ], }, { zone: 'Mor Dhona', region: 'Mor Dhona', items: [ { name: 'FATE: The Four Winds', type: 'FATE', loc: 'X: 23.5 Y: 11.2', done: false }, { name: 'Dungeon: Castrum Meridianum', type: 'Dungeon', loc: 'Level 50 · Trial', done: false }, ], }, ]; const [done, setDone] = useS34(() => { const m = {}; tasks.forEach((g, gi) => g.items.forEach((it, ii) => { m[`${gi}-${ii}`] = it.done; })); return m; }); const totalCount = tasks.reduce((a, g) => a + g.items.length, 0); const doneCount = Object.values(done).filter(Boolean).length; return (
Series · Zodiac 2.x · A Realm Reborn

Zodiac weapon

The eight-stage relic chain. Stages complete left to right.
{/* Job selector */}
Tracking
{trackedJobs.map(j => ( ))}
Each job tracks its own task list.
{/* Stage stepper */}
{stages.map((s, i) => ( {i < stages.length - 1 && (
)}
))}
{/* Active stage detail */}
{activeStage + 1}
Stage 4 of 8

Animus

Twelve books, each unlocked by completing a list of tasks in a specific zone. Check tasks as you go — your progress is local to {activeJob}.

Last updated 3m ago ·
{tasks.map((zone, gi) => { const zDone = zone.items.filter((_, ii) => done[`${gi}-${ii}`]).length; return (
{zone.region}
{zone.zone}
{zDone} / {zone.items.length}
    {zone.items.map((it, ii) => { const key = `${gi}-${ii}`; const isDone = !!done[key]; return (
  • setDone(d => ({ ...d, [key]: v }))} />
    {it.name}
    {it.loc}
    {it.type}
  • ); })}
); })}
); } Object.assign(window, { ScreenDashboard, ScreenRelics });