No description
  • Vue 59.8%
  • TypeScript 39.2%
  • JavaScript 0.7%
  • CSS 0.1%
Find a file
Thom Werring 38009d4f11
All checks were successful
Build and Push Docker Image / build (push) Successful in 26s
fix(subclass-modal): recover omitted features, animate each one independently
Some upstream subclass entries omit a feature from their reference list
even though its full definition exists elsewhere in the same data file
(e.g. Warlock Genie patron's level-1 vessel/wrath features). Cross-check
against the already-loaded feature-detail lookup and recover any match,
guarded by source + classSource so an unrelated edition's variant of the
same feature name can't get pulled in.

Also give each feature at a level its own line and its own accordion
transition, instead of sharing one detail panel per level — switching
between two features in the same level now collapses/expands smoothly
instead of hard-cutting the shared panel's content.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-16 10:13:42 +02:00
.forgejo/workflows Added build pipeline 2026-04-25 09:49:21 +02:00
public Initial commit 2026-02-02 11:30:47 +01:00
scripts Improved typing and better rendering of entries 2026-04-28 08:50:38 +02:00
src fix(subclass-modal): recover omitted features, animate each one independently 2026-08-16 10:13:42 +02:00
.dockerignore Added build pipeline 2026-04-25 09:49:21 +02:00
.gitignore WIP select subclasses, races, sourcebooks, etc 2026-02-06 23:44:29 +01:00
.nvmrc Initial commit 2026-02-02 11:30:47 +01:00
AGENTS.md docs: add AGENTS.md notes for local @data vs fetch 2026-04-20 09:33:07 +02:00
AGENTS.original.md docs: add AGENTS.md notes for local @data vs fetch 2026-04-20 09:33:07 +02:00
Dockerfile fix(nginx): add SPA fallback to fix direct route 404s 2026-05-12 23:36:24 +02:00
index.html Initial commit 2026-02-02 11:30:47 +01:00
LICENSE chore: add MIT LICENSE file 2026-05-14 10:07:43 +02:00
nginx.conf fix(nginx): add SPA fallback to fix direct route 404s 2026-05-12 23:36:24 +02:00
package-lock.json Improved typing and better rendering of entries 2026-04-28 08:50:38 +02:00
package.json Improved typing and better rendering of entries 2026-04-28 08:50:38 +02:00
PROJECT_STATUS.md feat(wizard): class features tab, base abilities, flexible spells 2026-05-14 09:54:10 +02:00
README.md docs(readme): align with wizard, mechanics, AGENTS pointers. 2026-05-14 10:00:15 +02:00
tsconfig.app.json Initial commit 2026-02-02 11:30:47 +01:00
tsconfig.json Initial commit 2026-02-02 11:30:47 +01:00
tsconfig.node.json Initial commit 2026-02-02 11:30:47 +01:00
vite.config.ts Initial commit 2026-02-02 11:30:47 +01:00

D&D 5e Character Builder

Vue 3 + TypeScript app for creating D&D 5th Edition characters using 5e.tools-shaped JSON. Characters and fetched rules data live in the browser (IndexedDB); no backend.

See PROJECT_STATUS.md for feature depth, gaps, and roadmap. Contributor/agent notes (local mirror vs GitHub fetch, key paths): AGENTS.md.

Features (high level)

  • Character creation wizard — 9 steps: Basic Info → Class (subclass + Features tab: optional features, ASI / feat at ASI levels) → Race → Background → Abilities → Skills → Spells → Equipment → Features (general feats).
  • Edition filtering — 5e vs 2024 / One D&D visibility (filterByEdition, source overlap pickers).
  • Ability scores — Manual, standard array, point buy (8–15), or debug preset; baseAbilities vs final abilities (base + recorded ASIs, cap 20); switching method does not discard ASIs from the class step.
  • Skills — Class / background / race choices, overlap handling, Expertise when the class grants it.
  • Spells — Class-list filtering by progression and limits; Flexible picks tab for Magical Secrets–style choices parsed from additionalSpells (spellFlexiblePicks, universal pool).
  • Character sheet & list — Saved characters, sheet view (limits noted in PROJECT_STATUS.md: e.g. HP/AC, feat mechanics).
  • Level-up wizard — Partial flow (see status doc); creation path is ahead on ASI/spells UX in places.
  • Data — Fetch from configurable mirror (default GitHub raw); Dexie cache + TTL; stale cache used if fetch fails.

Tech stack

Vue 3 (Composition API), TypeScript, Vite, Vue Router, Pinia, Dexie, @vueform/multiselect, Ajv (dev validation for some payloads).

Getting started

Requirements: Node.js 18+, npm.

npm install
npm run dev          # http://localhost:5173 (typical Vite port)
npm run build        # vue-tsc -b && vite build
npm run preview      # preview production build

Optional: npm run generate:5etools-types — codegen/types for mirrored JSON (see script).

Repository layout (abbrev.)

src/
├── components/
│   ├── CharacterWizard/     # Step*.vue, OptionalFeaturesPicker, AsiBlock
│   ├── LevelUpWizard/
│   ├── CharacterSheet.vue
│   └── …
├── db/index.ts             # Dexie schema + Character shape (baseAbilities, spells, …)
├── services/
│   ├── dataLoader.ts       # Fetch + cache 5e.tools paths
│   ├── featureCalculator.ts
│   ├── featureParser.ts
│   ├── characterRules.ts
│   ├── abilityScores.ts    # Base + ASI → finals
│   ├── spellFlexiblePicks.ts
│   └── characterService.ts
├── stores/                 # character.ts, data.ts
├── router/
├── types/                  # 5etools.ts, generated/, …
└── views/

Data source

Rules content is loaded like 5e.tools: races, classes (data/class/), subclasses, backgrounds, spells (data/spells/), items, feats, skills, optional features, etc. Default remote root is configurable in src/services/dataLoader.ts (DATA_BASE_URL). Agents doing JSON inspection can use the local mirror under external/5etools-src/data/ when present (see AGENTS.md).

License

MIT