Files
initiative/README.md
Lukas b6e052f198 Overhaul bottom bar: batch add, custom fields, stat block viewer
Unify the action bar into a single search input with inline bestiary
dropdown. Clicking a dropdown entry queues it with +/- count controls
and a confirm button; Enter or confirm adds N copies to combat.

When no bestiary match exists, optional Init/AC/MaxHP fields appear
for custom creatures. The eye icon opens a separate search dropdown
to preview stat blocks without leaving the add flow.

Fix batch-add bug where only the last creature got a creatureId by
using store.save() instead of setEncounter() in addFromBestiary.
Prevent dropdown buttons from stealing input focus so Enter confirms
the queued batch.

Remove the now-redundant BestiarySearch component.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 15:27:06 +01:00

1.9 KiB

Encounter Console

A local-first initiative tracker and encounter manager for tabletop RPGs (D&D 5e / 2024). Runs entirely in the browser — no server, no account, no data leaves your machine.

What it does

  • Initiative tracking — add combatants (batch-add from bestiary, custom creatures with optional stats), roll initiative (manual or d20), cycle turns and rounds
  • Encounter state — HP, AC, conditions, concentration tracking with visual status indicators
  • Bestiary integration — import bestiary JSON sources, search creatures, and view full stat blocks
  • Persistent — encounters survive page reloads via localStorage; bestiary data cached in IndexedDB

Prerequisites

  • Node.js 22+
  • pnpm 10.6+

Getting Started

pnpm install
pnpm --filter web dev

Open http://localhost:5173.

Scripts

Command Description
pnpm --filter web dev Start the dev server
pnpm --filter web build Production build
pnpm test Run all tests (Vitest)
pnpm check Full merge gate (knip, biome, typecheck, test, jscpd)

Project Structure

apps/web/          React 19 + Vite — UI components, hooks, adapters
packages/domain/   Pure functions — state transitions, types, validation
packages/app/      Use cases — orchestrates domain via port interfaces
data/bestiary/     Bestiary index for creature search
scripts/           Build tooling (layer boundary checks, index generation)
specs/             Feature specifications (spec → plan → tasks)

Architecture

Strict layered architecture with enforced dependency direction:

apps/web (adapters)  →  packages/application (use cases)  →  packages/domain (pure logic)

Domain is pure — no I/O, no randomness, no framework imports. Layer boundaries are enforced by automated import checks that run as part of the test suite. See CLAUDE.md for full conventions.