From 0ac0b88f8c19830a7e6afb749bcf91a9ea575bc4 Mon Sep 17 00:00:00 2001 From: Alexander Harding Date: Fri, 31 Jul 2026 22:31:43 -0400 Subject: [PATCH] Added Character Sheet and evolved Dice roller --- src/app/ManualDiceLayout.tsx | 53 +- src/app/charactercreator/Wizard.tsx | 4 +- src/app/charactersheet/CharacterSheet.tsx | 878 ++++++++++++++++++++++ src/app/charactersheet/page.tsx | 18 +- src/app/globals.css | 9 + src/app/layout.tsx | 11 +- src/components/DiceContext.tsx | 2 +- src/components/DiceSelector.tsx | 9 +- src/components/RollHistoryContext.tsx | 110 +++ src/components/RollHistorySidebar.tsx | 87 +++ src/components/RollToasts.tsx | 76 ++ src/lib/applyFeatures.ts | 38 +- 12 files changed, 1225 insertions(+), 70 deletions(-) create mode 100644 src/app/charactersheet/CharacterSheet.tsx create mode 100644 src/components/RollHistoryContext.tsx create mode 100644 src/components/RollHistorySidebar.tsx create mode 100644 src/components/RollToasts.tsx diff --git a/src/app/ManualDiceLayout.tsx b/src/app/ManualDiceLayout.tsx index f71bd88..6050043 100644 --- a/src/app/ManualDiceLayout.tsx +++ b/src/app/ManualDiceLayout.tsx @@ -1,51 +1,22 @@ +"use client"; + import { useDiceContext } from "@/components/DiceContext"; -import { RollOutcome } from "@/components/DiceRoller"; import { Button } from "@/components/DiceSelector"; -import RollCard from "@/components/RollCard"; -import React, { useCallback, useEffect, useState } from "react"; - -interface DisplayRoll extends RollOutcome { - id: number; -} - -let nextId = 0; +import React from "react"; export default function ManualDiceLayout({ - children + children, }: Readonly<{ - children: React.ReactNode + children: React.ReactNode; }>) { - const { rollerRef, onRollComplete } = useDiceContext(); - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const [history, setHistory] = useState([]); - const [displayed, setDisplayed] = useState([]); - - useEffect(() => { - return onRollComplete((outcome) => { - setHistory((prev) => [...prev, outcome]); - setDisplayed((prev) => [...prev, { ...outcome, id: nextId++ }]); - }); - }, [onRollComplete]); - - const removeDisplay = useCallback((id: number) => { - setDisplayed((prev) => prev.filter((r) => r.id !== id)); - }, []); + const { rollerRef } = useDiceContext(); return ( -
-
+ <> + {children} +
-
- {displayed.map((item) => ( - removeDisplay(item.id)} - /> - ))} -
-
- ) -} \ No newline at end of file + + ); +} diff --git a/src/app/charactercreator/Wizard.tsx b/src/app/charactercreator/Wizard.tsx index 2e41580..2b81f5e 100644 --- a/src/app/charactercreator/Wizard.tsx +++ b/src/app/charactercreator/Wizard.tsx @@ -121,8 +121,8 @@ function WizardInner() { }; return ( -
-