Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
2adea0c
Refactor minion damage and improve UI feedback
cursoragent Sep 8, 2025
4cdddbe
Disable GitHub Actions auto-deploy, use manual deployment instead
cursoragent Sep 8, 2025
276eb14
Add manual deployment script for GitHub Pages
cursoragent Sep 8, 2025
215f643
Improve minion damage indicator with consistent layout
Splinter714 Sep 8, 2025
250e00b
Re-enable GitHub Actions auto-deploy to GitHub Pages
Splinter714 Sep 8, 2025
d87019c
Revert to proper GitHub Actions deployment workflow
Splinter714 Sep 8, 2025
e9c3c93
Try personal_token instead of github_token for Pages deployment
Splinter714 Sep 8, 2025
b6e4a61
Use official GitHub Pages deployment workflow
Splinter714 Sep 8, 2025
a3d2c0e
Create static.yml
Splinter714 Sep 8, 2025
c935bc9
Simplify to use working npm run deploy method
Splinter714 Sep 8, 2025
fb96d92
Merge remote changes and complete GitHub Actions setup
Splinter714 Sep 8, 2025
3fca962
Clean up auto-deployment files and update todo
Splinter714 Sep 8, 2025
02945a7
UI improvements: remove section dividers, fix alignment, add padding
Splinter714 Sep 9, 2025
69c27d1
Major browser table improvements
Splinter714 Sep 9, 2025
2567058
Major browser table improvements
Splinter714 Sep 9, 2025
1a2c9b4
Mobile UX improvements and section management
Splinter714 Sep 9, 2025
46c41d2
Major mobile UX improvements and drawer enhancements
Splinter714 Sep 9, 2025
ffa996e
Fix remaining mobile drawer issues
Splinter714 Sep 9, 2025
894a15e
Add version display with git commit hash
Splinter714 Sep 9, 2025
ebc4f0f
Implement robust JavaScript-based touch handling solution
Splinter714 Sep 9, 2025
3376931
Separate touch handling strategies for different drawer types
Splinter714 Sep 9, 2025
a70d5c1
Fix expanded card drawer swipe-to-dismiss from scrollable content
Splinter714 Sep 9, 2025
39aad29
Fix pull-to-refresh in browser drawer non-table areas
Splinter714 Sep 10, 2025
3f9c215
Fix browser drawer pull-to-refresh logic
Splinter714 Sep 10, 2025
fddefea
Browser filters and dropdowns
Splinter714 Sep 10, 2025
891d78b
Browser improvements and drawer fixes
Splinter714 Sep 10, 2025
c7e5094
Update App.jsx and Browser.jsx components
Splinter714 Sep 10, 2025
b74fcdd
Refactor: fix Creator duplicate countdown type; extract countdownEngi…
Splinter714 Sep 10, 2025
d58f52f
Refactor infra: swipe drawer hook; lazy-load Browser/Creator; dynamic…
Splinter714 Sep 10, 2025
fff05de
State UX: add usePersistentState; persist Browser filters/sort and se…
Splinter714 Sep 10, 2025
c393ab6
Refactor components and infra: ARIA labels; split CountdownCard; pers…
Splinter714 Sep 10, 2025
607851b
Build/test: fix dynamic JSON default; Suspense fallbacks; add Vitest …
Splinter714 Sep 10, 2025
f37b41f
chore: prep dirs for component restructure (common, game, cards)
Splinter714 Sep 10, 2025
0cf8dee
Major refactor: modularize components, fix mobile drawer issues, add …
Splinter714 Sep 10, 2025
d2d484d
Complete major refactor and bug fixes
Splinter714 Sep 11, 2025
9bcad17
Update bottom bar icons - pencil for edit mode, trashcan for delete
Splinter714 Sep 11, 2025
0d219b3
Update README with comprehensive project overview and remove emojis
Splinter714 Sep 11, 2025
c3a0238
Refine help flyout styling - remove hover from version, add subtle se…
Splinter714 Sep 11, 2025
33b3e1a
Redesign expanded adversary card layout
Splinter714 Sep 11, 2025
4453520
Bump version to 0.1.1
Splinter714 Sep 11, 2025
f506d3c
Fix mobile drawer scrolling and help flyout overflow
Splinter714 Sep 11, 2025
5a4bbcb
Fix mobile drawer scrolling and bump to 0.1.2
Splinter714 Sep 11, 2025
d77ddfd
Implement PWA (Progressive Web App) features
Splinter714 Sep 11, 2025
3e29be1
Fix mobile drawer scrolling - allow independent scroll directions
Splinter714 Sep 11, 2025
2a141b2
Bump version to 0.1.4 for mobile drawer scroll testing
Splinter714 Sep 11, 2025
241bf31
Fix mobile drawer scrolling - single scroll container approach
Splinter714 Sep 11, 2025
6ff5fc4
Fix mobile drawer scrolling and stress overflow
Splinter714 Sep 11, 2025
5dcfd8b
Tighten stats row spacing and shorten Difficulty to Diff
Splinter714 Sep 11, 2025
e4e2a0c
Add OSS license, DPCGL attribution, and Community Content logos
Splinter714 Sep 11, 2025
eea5289
Major edit mode implementation and complete DPCGL legal compliance
Splinter714 Sep 11, 2025
c6d7e7c
Fix logo display and attribution text overflow
Splinter714 Sep 11, 2025
957b15c
Fix DPCGL logo path - change from /assets/logos/ to /logos/
Splinter714 Sep 11, 2025
1b40153
Improve DPCGL logo visibility and fix text wrapping
Splinter714 Sep 11, 2025
8f089b6
Improve core stats block UI and attack modifier handling
Splinter714 Sep 12, 2025
6c7100b
Refactor Daggerheart logo and add mobile styling
cursoragent Sep 12, 2025
86fd87e
Bump version to 0.1.9
cursoragent Sep 12, 2025
e1c8f1b
Fix logo loading issue by importing image and using black logo for be…
cursoragent Sep 12, 2025
840aea0
Fix logo styling: use white logo, fill width, add separator line
cursoragent Sep 12, 2025
eab23ba
feat: Conditionally render right panel based on rightColumnMode
cursoragent Sep 12, 2025
6dd6113
Fix adversary creator to use CardEditLayout + AdversaryEditForm
cursoragent Sep 12, 2025
dc54fa4
Add debugging to CardEditLayout to investigate mobile issue
cursoragent Sep 12, 2025
514f09f
Add visual debugging to CardEditLayout to identify which layout is re…
cursoragent Sep 12, 2025
647b127
Checkpoint before follow-up message
cursoragent Sep 12, 2025
4b766e7
Add aggressive visual debugging to identify rendering issue
cursoragent Sep 12, 2025
474b838
Add CSS debug classes to override any existing styles
cursoragent Sep 12, 2025
9923e22
Remove debugging styles - sophisticated adversary layout is working c…
cursoragent Sep 12, 2025
d190e9d
Fix Creator to use same inline editing as AdversaryDetails
cursoragent Sep 12, 2025
74eba96
Increment version to 0.1.11 - ensure latest Creator changes are deployed
cursoragent Sep 12, 2025
e40552d
Fix Creator feature editing layout to match AdversaryDetails
cursoragent Sep 12, 2025
2a13498
Simplify Creator to use CardEditLayout + AdversaryEditForm for all types
cursoragent Sep 12, 2025
977bc70
Fix Creator to use AdversaryDetails for adversaries (same as expanded…
cursoragent Sep 12, 2025
90103c6
Before CSS refactor, some unfinished changes to expanded cards
Splinter714 Sep 14, 2025
54360bd
Increment version to 0.1.14
Splinter714 Sep 14, 2025
e40e209
Major architectural refactor: consolidate components, simplify state …
Splinter714 Sep 15, 2025
14f5235
Fix CSS imports and deploy path for v0.2.0 deployment
Splinter714 Sep 15, 2025
faf63e6
Improve adversary card layouts and spacing
Splinter714 Sep 15, 2025
e96e9ec
Fix version display in help menu
Splinter714 Sep 15, 2025
bfe2d9f
Update UI styling and reset adversary HP values
Splinter714 Sep 15, 2025
8335abc
Fix zoom-triggered mobile view by using CSS media queries instead of …
Splinter714 Sep 15, 2025
dacef91
Re-implement mobile drawer with proper functionality and disable hove…
Splinter714 Sep 15, 2025
c393da2
0.2.3
Splinter714 Sep 15, 2025
8f096b7
Tighten pip spacing and remove type badge from compact adversary view
Splinter714 Sep 16, 2025
080a11c
Major UI improvements and edit mode enhancements
Splinter714 Sep 16, 2025
1881e3c
UI improvements: reduce delete button rounding, remove grey boxes, im…
cursoragent Sep 16, 2025
a205aa2
Fix: Update deploy path and version
cursoragent Sep 16, 2025
dd2954f
Checkpoint before follow-up message
cursoragent Sep 16, 2025
9248e03
Additional UI improvements: clear mode toggle, better colors, improve…
cursoragent Sep 16, 2025
fb750e8
Checkpoint before follow-up message
cursoragent Sep 16, 2025
ba3a521
Final UI polish: improved clear mode behavior and mobile layout
cursoragent Sep 16, 2025
cc73403
Checkpoint before follow-up message
cursoragent Sep 16, 2025
a049e87
Major UI changes: remove edit mode, mobile fear bar, fix browser colors
cursoragent Sep 16, 2025
a02247d
Make damage input popups single line layout
cursoragent Sep 16, 2025
5ea7520
Checkpoint before follow-up message
cursoragent Sep 16, 2025
30b522b
Checkpoint before follow-up message
cursoragent Sep 16, 2025
d5beed6
Fix damage popup click-away behavior
cursoragent Sep 16, 2025
d666a6a
Fix damage input popup click-away behavior
cursoragent Sep 16, 2025
1f2563c
Auto-exit clear mode when no items remain
cursoragent Sep 16, 2025
0091693
Fix useEffect reference error in DeleteClear
cursoragent Sep 16, 2025
0fe3eae
Move fear bar to center of bottom bar
cursoragent Sep 16, 2025
513b324
Fix fear bar positioning - mobile only in bottom bar
cursoragent Sep 16, 2025
782123b
Fix useEffect import and mobile layout issues
cursoragent Sep 16, 2025
1fe485c
Fix bottom bar taking entire screen
cursoragent Sep 16, 2025
4406907
Add PWA safe area padding and floating pip menu
cursoragent Sep 16, 2025
dc778e8
Fix floating menu button styles and flyout directions
cursoragent Sep 16, 2025
a391090
Fix flyout positioning and remove adversary padding
cursoragent Sep 16, 2025
cab8f5c
Add more PWA bottom padding and fix flyout directions
cursoragent Sep 16, 2025
1500fb7
Center flyout buttons above main floating menu button
cursoragent Sep 16, 2025
74feea3
Fix grey box around help icon in floating menu
cursoragent Sep 16, 2025
0caa359
Fix damage input styling and confirm button
cursoragent Sep 16, 2025
c064243
Add PWA detection for conditional bottom padding
cursoragent Sep 16, 2025
8d69a39
Fix damage input styling and floating menu interference
cursoragent Sep 16, 2025
73bed9d
Make damage input button dynamic cancel/confirm
cursoragent Sep 16, 2025
67de88d
Make floating menu main button border more visible
cursoragent Sep 16, 2025
a37d8d0
Fix damage input positioning and floating menu improvements
cursoragent Sep 16, 2025
287e6d2
Fix floating menu button border color
cursoragent Sep 16, 2025
2fcf1cf
Increase floating menu z-index to appear above damage input popups
cursoragent Sep 16, 2025
222406a
Fix minion damage input defaulting to 1
cursoragent Sep 16, 2025
f251002
Fix minion damage input default and floating menu popup behavior
cursoragent Sep 16, 2025
adbb0e6
Checkpoint before follow-up message
cursoragent Sep 16, 2025
00526da
Fix clear mode state management in floating menu
cursoragent Sep 16, 2025
9ad8efd
Fix variable spacing between difficulty badge and right side of compa…
cursoragent Sep 16, 2025
662c2ef
Fix clear button not exiting clear mode when tapped again
cursoragent Sep 16, 2025
fb0ecec
Fix inconsistent spacing caused by variable type text length
cursoragent Sep 16, 2025
82eb9ec
Fix type badge width to accommodate longest type text and remove padding
cursoragent Sep 16, 2025
c4d3217
Reduce spacing between HP/stress pips and type/difficulty badges
cursoragent Sep 16, 2025
a71a9da
Expand tap targets for better mobile usability
cursoragent Sep 16, 2025
9abf05d
Fix tap target visual areas and HP/stress gap
cursoragent Sep 16, 2025
1dc28cc
Add SortButton component to floating menu
cursoragent Sep 16, 2025
8a2e1e6
Add more tappable area to the right of HP and stress pips
cursoragent Sep 16, 2025
4b4a435
Checkpoint before follow-up message
cursoragent Sep 16, 2025
9fcb616
Fix sort functionality and implement radial floating menu
cursoragent Sep 16, 2025
c593b89
Move fear bar to always be on bottom bar and remove top bar entirely
cursoragent Sep 16, 2025
caf62a0
Move fear bar to bottom only and add custom scrollbar styling
cursoragent Sep 16, 2025
be2864d
Fix radial menu direction and reduce radius
cursoragent Sep 16, 2025
6f6dbc2
Fix radial menu coordinate system for proper up-left direction
cursoragent Sep 16, 2025
9b25395
Fix radial menu angle range to proper 90° to 180°
cursoragent Sep 16, 2025
ce976bf
Fix radial menu direction, compact card height, and sort functionality
cursoragent Sep 16, 2025
40b4906
Fix radial menu centering and spacing
cursoragent Sep 16, 2025
6a0d1da
Remove top and bottom padding from compact cards
cursoragent Sep 16, 2025
de583db
Checkpoint before follow-up message
cursoragent Sep 16, 2025
cc9d12e
Switch positions of delete/clear and help buttons in radial menu
cursoragent Sep 16, 2025
9a6fb9a
Fix adversary sorting functionality completely
cursoragent Sep 16, 2025
78fd93b
Update adversary type sort order with new priorities
cursoragent Sep 16, 2025
c509153
Remove 'Other' from type priority system
cursoragent Sep 16, 2025
bc2fa46
Update adversary type sort order to new sequence
cursoragent Sep 16, 2025
41bc78f
Fix HP and stress pips flashing when interacting
cursoragent Sep 16, 2025
be77045
Fix stress pip flashing by removing transitions from Pips component
cursoragent Sep 16, 2025
7f18340
Ignore Firebase and API key files
cursoragent Sep 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions .cursorrules
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
# Daggerheart Project Organization Rules

## Core Principle: Component-Based Co-Location
Organize files by **domain/component** rather than by **file type**. Keep related functionality together.

## Directory Structure Rules

### 1. Component Organization
```
src/
├── state/ # Global state management only
│ ├── GameStateContext.jsx
│ ├── useGameState.js
│ ├── state.json
│ └── usePersistentState.js
├── components/ # All UI components + their utilities
│ ├── Layout/ # App layout + layout-specific utilities
│ │ ├── Layout.jsx
│ │ ├── Layout.css
│ │ ├── usePreventPullToRefresh.js # Layout-specific
│ │ ├── TopBar/
│ │ ├── BottomBar/
│ │ │ └── logo.png # Co-located asset
│ │ ├── LeftPanel/
│ │ ├── RightPanel/
│ │ │ └── useRightPanelSync.js # Panel-specific
│ │ └── Drawer/
│ │ └── useSwipeDrawer.js # Drawer-specific
│ ├── Browser/ # Database browsing + browser utilities
│ │ └── useBrowser.js # Browser-specific
│ ├── GameBoard/ # Game interface + game utilities
│ │ └── ids.js # Used by game entities
│ ├── Adversaries/ # Adversary domain (data + logic + utilities)
│ │ ├── adversaries.json # Data co-located with logic
│ │ ├── adversaries.js # Actions
│ │ └── useAdversaryHandlers.js # Adversary-specific
│ ├── Environments/ # Environment domain
│ │ ├── environments.json
│ │ ├── environments.js
│ │ └── [environment utilities]
│ ├── Countdowns/ # Countdown domain
│ │ ├── countdowns.js
│ │ ├── countdownEngine.js
│ │ └── countdownEngine.test.js
│ ├── Fear/ # Fear component + utilities
│ └── PWAInstallPrompt/ # PWA component
└── styles/ # Global styles (to be migrated)
```

### 2. Co-Location Rules

#### A. Utilities Go With Their Users
- **useRightPanelSync** → `RightPanel/` (used only by RightPanel)
- **useSwipeDrawer** → `Drawer/` (used only by Drawer)
- **useBrowser** → `Browser/` (used only by Browser)
- **useAdversaryHandlers** → `Adversaries/` (adversary-specific)

#### B. Data Goes With Logic
- **adversaries.json** → `Adversaries/` (with adversaries.js)
- **environments.json** → `Environments/` (with environments.js)
- **logo.png** → `BottomBar/` (used only by help button)

#### C. Domain-Specific Utilities
- **ids.js** → `GameBoard/` (generates IDs for game entities)
- **countdownEngine.js** → `Countdowns/` (countdown-specific logic)

### 3. What Goes in `state/` vs `components/`
- **`state/`**: Only truly global state management (GameStateContext, useGameState, state.json, usePersistentState)
- **`components/`**: Everything else, organized by domain/component

## Migration Guidelines

### When Adding New Files:
1. **Ask**: "Which component/domain uses this?"
2. **Place**: In that component's directory
3. **Exception**: Only put in `state/` if used by multiple domains

### When Moving Files:
1. **Use VSCode refactoring tools** (drag & drop, F2 rename) - they auto-update imports
2. **Update import paths** if manual moves are needed
3. **Verify** all imports are working

### File Naming Conventions:
- **Components**: `ComponentName.jsx` + `ComponentName.css`
- **Utilities**: `useUtilityName.js` or `utilityName.js`
- **Data**: `domain.json` (co-located with domain logic)
- **Assets**: Co-located with the component that uses them

## Benefits of This Structure:
- ✅ **Intuitive**: "Need adversary stuff? Go to Adversaries/"
- ✅ **Co-located**: Everything related is together
- ✅ **Scalable**: Easy to add new domains/components
- ✅ **Maintainable**: Changes stay within domain boundaries
- ✅ **Non-coder friendly**: Logical organization

## Anti-Patterns to Avoid:
- ❌ Grouping by file type (`hooks/`, `utils/`, `data/`)
- ❌ Deep nesting (keep it flat under `components/`)
- ❌ Global directories for domain-specific code
- ❌ Scattered related functionality
25 changes: 25 additions & 0 deletions .eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"env": {
"browser": true,
"es2021": true
},
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:react-hooks/recommended"
],
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
"plugins": ["react", "react-hooks"],
"settings": {
"react": { "version": "detect" }
},
"rules": {
"react/prop-types": "off",
"no-unused-vars": ["error", { "argsIgnorePattern": "^_", "varsIgnorePattern": "^_" }]
}
}


34 changes: 0 additions & 34 deletions .github/workflows/deploy.yml

This file was deleted.

11 changes: 11 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,14 @@ jspm_packages/

# TernJS port file
.tern-port

# Firebase and API keys
firebase-config.js
firebase-config.json
src/firebase/config.js
src/firebase/sessionService.js
**/firebase/**
**/*firebase*
**/*api-key*
**/*secret*
**/*credential*
8 changes: 8 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"singleQuote": true,
"semi": false,
"printWidth": 100,
"trailingComma": "es5"
}


Binary file added Darrington-Press-CGL.pdf
Binary file not shown.
21 changes: 21 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2025 Splinter714

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
151 changes: 133 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,32 @@
# 🎲 Daggerheart GM Dashboard
# Daggerheart GM Dashboard

A static web application for Game Masters to manage their Daggerheart RPG sessions with local state management.
A modern, mobile-optimized web application for Game Masters to manage their Daggerheart RPG sessions with intelligent state management and intuitive UX.

## Features

### Core Game Management
- **Smart Countdown System**: Create countdowns up to 100 pips with intelligent 5-pip grouping for easy reading
- **Adversary Tracking**: Complete HP/stress management with damage input system and threshold calculations
- **Environment Management**: Track location effects and environmental aspects
- **Fear & Hope Tracking**: Simple fear/hope countdowns with advancement triggers

### Mobile-First Design
- **Swipeable Drawers**: Smooth mobile navigation with swipe-to-close gestures
- **Touch-Optimized**: All interactions work perfectly on mobile devices
- **Responsive Layout**: Adapts seamlessly from phone to desktop
- **Pull-to-Refresh Prevention**: Smart prevention of accidental page refreshes

### Modern UX
- **Intuitive Icons**: Pencil for edit mode, trashcan for delete, wrench for tools
- **Smart Grouping**: Countdown pips automatically group in sets of 5 for readability
- **Persistent State**: Game state and filters save automatically across sessions
- **Drag & Drop**: Reorder adversaries and environments with touch-friendly drag controls

### Database Integration
- **Full Database Browser**: Browse complete adversary and environment databases
- **Smart Filtering**: Persistent filters with search and tier/type filtering
- **Quick Add**: Add items directly from database to your game
- **Custom Creation**: Create custom adversaries and environments

## Quick Start

Expand All @@ -16,37 +42,126 @@ A static web application for Game Masters to manage their Daggerheart RPG sessio

3. **Access the dashboard:**
- **GM Dashboard**: `http://localhost:5173`
- **Live Demo**: [https://splinter714.github.io/Daggerheart/](https://splinter714.github.io/Daggerheart/)

4. **Build for production:**
```bash
npm run build
```

## Features
5. **Deploy:**
```bash
./deploy.sh
```

## Architecture

### Project Structure
```
src/
├── components/
│ ├── browser/ # Database browsing components
│ ├── cards/ # Card display components
│ ├── controls/ # UI controls (buttons, badges)
│ ├── countdown/ # Countdown management
│ ├── editor/ # Creation/editing forms
│ ├── game/ # Game board sections
│ ├── panels/ # Main layout panels
│ └── ui/ # Reusable UI components
├── hooks/ # Custom React hooks
├── state/ # State management
└── utils/ # Utility functions
```

### Tech Stack
- **React 18** with modern hooks and concurrent features
- **Vite** for fast development and optimized builds
- **Lucide React** for consistent iconography
- **CSS Variables** for theming and customization
- **localStorage** for persistent state management

## Mobile Experience

The app is designed mobile-first with several key optimizations:

- **Swipe Navigation**: Swipe drawers open/close naturally
- **Touch Gestures**: All interactions optimized for touch
- **Responsive Design**: Adapts to any screen size
- **Performance**: Optimized for mobile devices
- **Offline Ready**: Works without internet connection

## Usage Guide

- **Fear Management**: Track and display fear levels
- **Countdown Tracks**: Create and manage multiple countdown timers
- **Adversary HP**: Track enemy health with damage/healing controls
- **Environment Elements**: Manage location aspects and effects
- **Damage Thresholds**: Calculate damage based on Daggerheart rules
- **Auto-save**: State automatically saves to browser localStorage
- **Mobile Responsive**: Works on all device sizes
- **Database Browser**: Full adversary and environment database
### Countdown Management
- **Create**: Use the "+" button in countdown sections
- **Advance**: Use Rest/Crit Success buttons or manual +/- controls
- **Smart Grouping**: Pips automatically group in sets of 5 for easy counting
- **Types**: Standard, Progress, Consequence, Long-term, Fear, Hope

## Static Hosting
### Adversary Tracking
- **Add**: Browse database or create custom adversaries
- **Damage**: Click difficulty shield for damage input system
- **HP/Stress**: Tap pips to increment/decrement
- **Reorder**: Drag to reorder in edit mode

### Environment Management
- **Add**: Browse database or create custom environments
- **Effects**: Track environmental effects and aspects
- **Reorder**: Drag to reorder in edit mode

## Deployment

This app can be hosted on any static hosting service:

- **GitHub Pages**: `./deploy.sh` (configured)
- **Vercel**: `vercel --prod`
- **Netlify**: Drag and drop the `dist` folder
- **GitHub Pages**: Deploy from the `dist` folder
- **Firebase Hosting**: `firebase deploy`

## State Management
## Contributing

We welcome contributions! Check out our [GitHub Issues](https://github.com/Splinter714/Daggerheart/issues) for areas that need work:

- **UX Improvements**: Better mobile interactions, design refinements
- **Feature Enhancements**: New functionality and game mechanics
- **Performance**: Optimization and code improvements
- **Accessibility**: Better a11y support

- **localStorage**: All game state is saved to your browser
## Privacy & Data

- **Local Storage**: All data stays in your browser
- **No Tracking**: No analytics or data collection
- **Private**: Each user has their own separate game state
- **Persistent**: State survives browser restarts
- **No server required**: Completely client-side
- **Offline**: Works without internet connection

## Recent Updates

- **Smart Countdown Grouping**: 5-pip groups for better readability
- **Mobile Optimization**: Smooth swipe gestures and touch interactions
- **Component Refactor**: Organized, modular codebase
- **Persistent Filters**: Browser filters save across sessions
- **Damage Input System**: Restored with threshold calculations
- **Icon Updates**: Intuitive pencil/trashcan/wrench icons
- **Performance**: Optimized rendering and state management

---

Happy gaming!

*Built with love for the Daggerheart community*

---

## Daggerheart™ Compatibility

![Community Content Logo](assets/logos/Darrington%20Press%20Community%20Content%20Logos/Daggerheart/PNGs/DH_CGL_logos_final_full_color.png)

This project uses only **Public Game Content** from the **Daggerheart SRD 1.0** and follows the
**Darrington Press Community Gaming License (DPCGL)**.

> This product includes materials from the Daggerheart System Reference Document 1.0, © Critical Role, LLC, under the terms of the Darrington Press Community Gaming (DPCGL) License. More information can be found at https://www.daggerheart.com. There are no previous modifications by others.

- The DPCGL (PDF) is included at `Darrington-Press-CGL.pdf`.
- This project is **unofficial** and **not endorsed** by Darrington Press or Critical Role.
- Per the DPCGL, "Daggerheart" is not used in the product title; compatibility is stated here in descriptive text.

Happy gaming! 🎲✨
Loading