diff --git a/apps/gui/public/background.png b/apps/gui/public/background.png
new file mode 100644
index 0000000..0f5d767
Binary files /dev/null and b/apps/gui/public/background.png differ
diff --git a/apps/gui/public/logo-shadow.png b/apps/gui/public/logo-shadow.png
new file mode 100644
index 0000000..2640f04
Binary files /dev/null and b/apps/gui/public/logo-shadow.png differ
diff --git a/apps/gui/public/output.webm b/apps/gui/public/output.webm
new file mode 100644
index 0000000..1559c2f
Binary files /dev/null and b/apps/gui/public/output.webm differ
diff --git a/apps/gui/src/app/layout.tsx b/apps/gui/src/app/layout.tsx
index 3daadea..d67b030 100644
--- a/apps/gui/src/app/layout.tsx
+++ b/apps/gui/src/app/layout.tsx
@@ -1,6 +1,6 @@
"use client";
-import type { ReactNode } from "react";
+import { useEffect, type ReactNode } from "react";
import { Jersey_25, JetBrains_Mono, Space_Mono } from "next/font/google";
import Link from "next/link";
import { usePathname } from "next/navigation";
@@ -40,22 +40,43 @@ const links = [
export default function RootLayout({ children }: { children: ReactNode }) {
const pathname = usePathname();
+ useEffect(() => {
+ document.title = "Omnia";
+ }, []);
+
return (
-
+
+ {!pathname?.startsWith("/play") && (
+
+ )}
-
- {children}
-
+ {children}
);
diff --git a/apps/gui/src/components/config/ConfigView.tsx b/apps/gui/src/components/config/ConfigView.tsx
index 5651eab..f4ec9ee 100644
--- a/apps/gui/src/components/config/ConfigView.tsx
+++ b/apps/gui/src/components/config/ConfigView.tsx
@@ -102,8 +102,8 @@ export function ConfigView() {
};
return (
-
-
+
+
Configuration
diff --git a/apps/gui/src/components/play/DashboardView.tsx b/apps/gui/src/components/play/DashboardView.tsx
index 282bf54..f79e7bf 100644
--- a/apps/gui/src/components/play/DashboardView.tsx
+++ b/apps/gui/src/components/play/DashboardView.tsx
@@ -41,14 +41,22 @@ export function DashboardView() {
const [error, setError] = useState("");
const [savedSessions, setSavedSessions] = useState
([]);
- const [scenarios, setScenarios] = useState<{ path: string; name: string; description: string }[]>([]);
+ const [scenarios, setScenarios] = useState<
+ { path: string; name: string; description: string }[]
+ >([]);
const [, setProviderInstances] = useState([]);
// Modal State
- const [scenarioForModal, setScenarioForModal] = useState<{ path: string; name: string } | null>(null);
- const [modalEntities, setModalEntities] = useState<{ id: string; name: string }[]>([]);
+ const [scenarioForModal, setScenarioForModal] = useState<{
+ path: string;
+ name: string;
+ } | null>(null);
+ const [modalEntities, setModalEntities] = useState<
+ { id: string; name: string }[]
+ >([]);
const [loadingEntities, setLoadingEntities] = useState(false);
- const [selectedEntityForModal, setSelectedEntityForModal] = useState("");
+ const [selectedEntityForModal, setSelectedEntityForModal] =
+ useState("");
const loadSavedSessions = useCallback(async () => {
try {
@@ -108,7 +116,8 @@ export function DashboardView() {
const handleDelete = async (id: string, e: React.MouseEvent) => {
e.stopPropagation();
- if (!confirm("Are you sure you want to delete this simulation session?")) return;
+ if (!confirm("Are you sure you want to delete this simulation session?"))
+ return;
setLoading(true);
try {
const res = await deleteSimulation(id);
@@ -118,13 +127,18 @@ export function DashboardView() {
await loadSavedSessions();
}
} catch (err) {
- setError(err instanceof Error ? err.message : "Failed to delete session.");
+ setError(
+ err instanceof Error ? err.message : "Failed to delete session.",
+ );
} finally {
setLoading(false);
}
};
- const handleScenarioClick = async (scenario: { path: string; name: string }) => {
+ const handleScenarioClick = async (scenario: {
+ path: string;
+ name: string;
+ }) => {
setScenarioForModal(scenario);
setLoadingEntities(true);
setSelectedEntityForModal(""); // Reset selection to Spectator
@@ -164,204 +178,242 @@ export function DashboardView() {
router.push(`/play?simId=${result.snapshot.id}`);
} catch (err) {
setError(
- err instanceof Error
- ? err.message
- : "Failed to start simulation.",
+ err instanceof Error ? err.message : "Failed to start simulation.",
);
setLoading(false);
}
};
return (
-
-
-
- {/* Centered Big Logo */}
-
-

-
Simulation Engine
-
-
- {error && (
-
- {error}
+
+
+
+ {/* Centered Big Logo */}
+
+
- )}
- {/* Simulations Section */}
-
- Simulations
- {loadingData ? (
-
- {Array.from({ length: 3 }).map((_, index) => (
-
- ))}
-
- ) : savedSessions.length === 0 ? (
- No saved simulations found. Start a new one below!
- ) : (
-
- {savedSessions.map((s) => (
-
handleResume(s.id)}
- className="flex-shrink-0 w-72 border border-border/30 bg-card p-5 cursor-pointer shadow-sm hover:-translate-y-0.5 hover:shadow-md active:translate-y-0 active:shadow-sm transition-all relative group"
- >
-
- {s.scenarioName}
-
- Turn {s.turn} · {s.entities.length} entities · {s.status}
-
-
- ID: {s.id.substring(0, 8)}...
-
-
-
- Resume
-
-
-
- ))}
+ {error && (
+
+ {error}
)}
-
- {/* Scenarios Section */}
-
- Scenarios
- {loadingData ? (
-
-
-
-
-
Build a scenario
-
Create a custom simulation starting point
+ {/* Simulations Section */}
+
+
+ Simulations
+
+ {loadingData ? (
+
+ {Array.from({ length: 3 }).map((_, index) => (
+
-
- +
- Create New
+ ))}
+
+ ) : savedSessions.length === 0 ? (
+
+ No saved simulations found. Start a new one below!
+
+ ) : (
+
+ {savedSessions.map((s) => (
+
handleResume(s.id)}
+ className="flex-shrink-0 w-72 border border-border/30 bg-card p-5 cursor-pointer shadow-sm hover:-translate-y-0.5 hover:shadow-md active:translate-y-0 active:shadow-sm transition-all relative group"
+ >
+
+
+ {s.scenarioName}
+
+
+ Turn {s.turn} · {s.entities.length} entities
+ · {s.status}
+
+
+ ID: {s.id.substring(0, 8)}...
+
+
+
+
+ Resume
+
+
+
-
-
- {Array.from({ length: 3 }).map((_, index) => (
-
- ))}
-
- ) : (
-
-
-
-
- Build a scenario
- Create a custom simulation starting point
-
-
- +
- Create New
-
-
-
- {scenarios.map((s) => (
-
handleScenarioClick(s)}
- />
- ))}
-
- )}
-
+ ))}
+
+ )}
+
- {/* Start Scenario Selection Modal */}
- {scenarioForModal && (
-
-
);
}