onToggle(quest.name)}
style={{
display: "flex", alignItems: "flex-start", gap: "8px",
padding: indent ? "4px 0" : "5px 6px",
borderRadius: "5px", cursor: "pointer",
marginBottom: indent ? "2px" : "3px",
opacity: completed ? 0.6 : 1,
transition: "all 0.12s",
}}
onMouseEnter={e => {
(e.currentTarget as HTMLElement).style.background = "rgba(255,255,255,0.04)";
}}
onMouseLeave={e => {
(e.currentTarget as HTMLElement).style.background = "transparent";
}}
>
onToggle(quest.name)}
onClick={e => e.stopPropagation()}
style={{ marginTop: "2px", flexShrink: 0 }}
/>
{quest.name}
{quest.url && (
{ e.stopPropagation(); openUrl(quest.url!); }}
style={{
fontSize: "10px", color: "#4a9eff", cursor: "pointer",
opacity: 0.7, flexShrink: 0, lineHeight: 1,
}}
onMouseEnter={e => (e.currentTarget as HTMLElement).style.opacity = "1"}
onMouseLeave={e => (e.currentTarget as HTMLElement).style.opacity = "0.7"}
>
🔗
)}
{quest.combat_indicators.length > 0 && (
{quest.combat_indicators.map((ci, i) => (
{ci.combat_type} {ci.count}
))}
)}
{quest.note && (
→ {quest.note}
)}
);
}
function collectAllQuests(sections: import("../types").Section[] | undefined): string[] {
if (!sections) return [];
const names: string[] = [];
for (const section of sections) {
for (const item of section.items) {
if (item.type === "Quest") names.push(item.name);
else if (item.type === "Group") item.quests.forEach((q: import("../types").QuestItem) => names.push(q.name));
}
}
return names;
}