feat: World Builder, Item Forge, Quest Designer + sidebar navigation

- World Builder: AI-generated worlds with regions, landmarks, conflicts, cultures
- Item Forge: AI magic item generator with rarity-colored headers, mechanical/lore sections
- Quest Designer: AI quest generator with step-through navigation, choices, twist, reward
- Sidebar now navigates to dedicated full-screen views for every tool
- Bento dashboard cards have 'Expand' buttons opening detail views
- Back arrow (←) in title bar returns to dashboard
- Dashboard grid expanded to 5 rows to accommodate Item Forge
- All three new tools also work in compact dashboard mode
- Full production build clean
This commit is contained in:
itsamejms
2026-06-28 22:50:50 +01:00
parent a44de0e4bb
commit ea827ff20e
5 changed files with 559 additions and 33 deletions
+34 -13
View File
@@ -9,6 +9,7 @@ import {
Volume2,
Calendar,
Maximize2,
Wand2,
} from "lucide-react";
import { BentoCard } from "./BentoCard";
import type { View } from "../App";
@@ -19,17 +20,18 @@ interface DashboardProps {
export function Dashboard({ onNavigate }: DashboardProps) {
return (
<div className="grid grid-cols-4 grid-rows-4 gap-3 p-4 h-full bg-[var(--color-bg-deep)]">
<div className="grid grid-cols-4 grid-rows-5 gap-3 p-4 h-full bg-[var(--color-bg-deep)] overflow-y-auto">
{/* World Map — 2×2 */}
<BentoCard title="World Map" icon={<Map size={16} />} span="col-span-2 row-span-2">
<div className="flex flex-col items-center justify-center h-full text-[var(--color-text-dim)] text-sm gap-2">
<Map size={48} className="opacity-30" />
<p>Map canvas coming soon</p>
<BentoCard title="World Builder" icon={<Map size={16} />} span="col-span-2 row-span-2">
<div className="flex flex-col h-full">
<div className="flex-1 overflow-hidden">
<WorldBuilder />
</div>
<button
onClick={() => onNavigate("world")}
className="text-[var(--color-gold-bright)] hover:text-[var(--color-gold-muted)] text-xs flex items-center gap-1 cursor-pointer transition-colors"
className="text-[var(--color-gold-bright)] hover:text-[var(--color-gold-muted)] text-xs flex items-center justify-center gap-1 cursor-pointer transition-colors mt-1 pt-2 border-t border-[var(--color-border-subtle)]"
>
<Maximize2 size={12} /> Open full view
<Maximize2 size={12} /> Expand
</button>
</div>
</BentoCard>
@@ -96,14 +98,15 @@ export function Dashboard({ onNavigate }: DashboardProps) {
{/* Quest Designer — 2×1 */}
<BentoCard title="Quest Designer" icon={<Sparkles size={16} />} span="col-span-2 row-span-1">
<div className="flex flex-col items-center justify-center h-full text-[var(--color-text-dim)] text-sm gap-2">
<Sparkles size={32} className="opacity-30" />
<p>Quest flowchart coming soon</p>
<div className="flex flex-col h-full">
<div className="flex-1 overflow-hidden">
<QuestDesigner />
</div>
<button
onClick={() => onNavigate("quest")}
className="text-[var(--color-gold-bright)] hover:text-[var(--color-gold-muted)] text-xs flex items-center gap-1 cursor-pointer transition-colors"
className="text-[var(--color-gold-bright)] hover:text-[var(--color-gold-muted)] text-xs flex items-center justify-center gap-1 cursor-pointer transition-colors mt-1 pt-2 border-t border-[var(--color-border-subtle)]"
>
<Maximize2 size={12} /> Open
<Maximize2 size={12} /> Expand
</button>
</div>
</BentoCard>
@@ -160,6 +163,21 @@ export function Dashboard({ onNavigate }: DashboardProps) {
<p>Soundboard coming soon</p>
</div>
</BentoCard>
{/* Item Forge — 2×1 */}
<BentoCard title="Item Forge" icon={<Wand2 size={16} />} span="col-span-2 row-span-1">
<div className="flex flex-col h-full">
<div className="flex-1 overflow-hidden">
<ItemForge />
</div>
<button
onClick={() => onNavigate("items")}
className="text-[var(--color-gold-bright)] hover:text-[var(--color-gold-muted)] text-xs flex items-center justify-center gap-1 cursor-pointer transition-colors mt-1 pt-2 border-t border-[var(--color-border-subtle)]"
>
<Maximize2 size={12} /> Expand
</button>
</div>
</BentoCard>
</div>
);
}
@@ -171,4 +189,7 @@ import { SessionLogger } from "./SessionLogger";
import { EncounterBuilder } from "./EncounterBuilder";
import { InitiativeTracker } from "./InitiativeTracker";
import { RandomTables } from "./RandomTables";
import { CalendarWidget } from "./CalendarWidget";
import { CalendarWidget } from "./CalendarWidget";
import { WorldBuilder } from "./WorldBuilder";
import { QuestDesigner } from "./QuestDesigner";
import { ItemForge } from "./ItemForge";