/* 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
{/* Collections */}
{collections.map(c => (
))}
2 niche trackers active
{/* Current gear / BiS */}
Current gear
PLD · Tank
} 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}.
{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.type}
);
})}
);
})}
);
}
Object.assign(window, { ScreenDashboard, ScreenRelics });