diff --git a/website/agb/src/app/examples/[example]/emulator.tsx b/website/agb/src/app/examples/[example]/emulator.tsx
new file mode 100644
index 00000000..13dc489f
--- /dev/null
+++ b/website/agb/src/app/examples/[example]/emulator.tsx
@@ -0,0 +1,22 @@
+"use client";
+
+import MgbaWrapper from "@/components/mgba/mgbaWrapper";
+import { Examples } from "@/roms/examples/examples";
+import { slugify } from "@/sluggify";
+import { useMemo } from "react";
+
+function gameUrl(exampleName: string) {
+ const example = Examples.find((x) => slugify(x.example_name) === exampleName);
+ console.log(exampleName);
+ if (!example) {
+ throw new Error(`cannot find example ${exampleName}`);
+ }
+
+ return example.url;
+}
+
+export function Emulator({ exampleName }: { exampleName: string }) {
+ const example = useMemo(() => gameUrl(exampleName), [exampleName]);
+
+ return ;
+}
diff --git a/website/agb/src/app/examples/[example]/page.tsx b/website/agb/src/app/examples/[example]/page.tsx
new file mode 100644
index 00000000..f9572cff
--- /dev/null
+++ b/website/agb/src/app/examples/[example]/page.tsx
@@ -0,0 +1,26 @@
+import { Examples } from "@/roms/examples/examples";
+import { slugify } from "@/sluggify";
+import { Emulator } from "./emulator";
+import { ContentBlock } from "@/components/contentBlock";
+
+export async function generateStaticParams() {
+ return Examples.map((example) => ({
+ example: slugify(example.example_name),
+ }));
+}
+
+export default function Page({ params }: { params: { example: string } }) {
+ return (
+ <>
+
+ Example: {params.example}
+
+
+
+
+
+ <>>
+
+ >
+ );
+}
diff --git a/website/agb/src/app/examples/page.tsx b/website/agb/src/app/examples/page.tsx
new file mode 100644
index 00000000..1a256403
--- /dev/null
+++ b/website/agb/src/app/examples/page.tsx
@@ -0,0 +1,42 @@
+import { Metadata } from "next";
+import { ContentBlock } from "@/components/contentBlock";
+import { slugify } from "@/sluggify";
+import { GameDisplay, GameGrid, GameImage } from "./styles";
+import { Examples } from "@/roms/examples/examples";
+
+export const metadata: Metadata = {
+ title: "Examples - agb",
+};
+
+export default function ShowcasePage() {
+ return (
+ <>
+
+ Examples
+
+
+
+ {Examples.map((example, idx) => (
+
+ ))}
+
+
+ >
+ );
+}
+
+function Game({ example }: { example: (typeof Examples)[number] }) {
+ const screenshot = example.screenshot;
+ return (
+
+
+ {example.example_name}
+
+ );
+}
diff --git a/website/agb/src/app/examples/styles.tsx b/website/agb/src/app/examples/styles.tsx
new file mode 100644
index 00000000..6eac2dae
--- /dev/null
+++ b/website/agb/src/app/examples/styles.tsx
@@ -0,0 +1,34 @@
+"use client";
+
+import Link from "next/link";
+import styled from "styled-components";
+import Image from "next/image";
+
+export const GameGrid = styled.div`
+ display: grid;
+ grid-template-columns: repeat(auto-fit, min(100vw, 600px));
+ justify-content: center;
+ gap: 48px;
+`;
+
+export const GameImage = styled(Image)`
+ width: 100%;
+ width: max(
+ round(down, 100%, calc(240 * var(--device-pixel))),
+ min(calc(240 * var(--device-pixel)), 100vw)
+ );
+ height: auto;
+ image-rendering: pixelated;
+`;
+
+export const GameDisplay = styled(Link)`
+ width: 100%;
+ text-align: center;
+ color: black;
+ text-decoration: none;
+
+ h2 {
+ margin: 0;
+ margin-top: 8px;
+ }
+`;