feat: Complete character system, animated login, WebSocket sync

Character System:
- Inventory system with 5,482 equipment items
- Feats tab with categories and details
- Actions tab with 99 PF2e actions
- Item detail modal with equipment info
- Feat detail modal with descriptions
- Edit character modal with image cropping

Auth & UI:
- Animated login screen with splash → form transition
- Letter-by-letter "DIMENSION 47" animation
- Starfield background with floating orbs
- Logo tap glow effect
- "Remember me" functionality (localStorage/sessionStorage)

Real-time Sync:
- WebSocket gateway for character updates
- Live sync for HP, conditions, inventory, equipment status, money, level

Database:
- Added credits field to characters
- Added custom fields for items
- Added feat fields and relations
- Included full database backup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Alexander Zielonka
2026-01-19 15:36:29 +01:00
parent e60a8df4f0
commit 55419d3896
53 changed files with 70462 additions and 475 deletions

View File

@@ -184,6 +184,9 @@ model Character {
// Experience
experiencePoints Int @default(0)
// Currency (Ironvale uses Credits instead of Gold/Silver/Copper)
credits Int @default(0)
// Pathbuilder Import Data (JSON blob for original import)
pathbuilderData Json?
@@ -266,6 +269,17 @@ model CharacterItem {
containerId String? // For containers
notes String?
// Player-editable: Alias/Nickname for the item
alias String?
// GM-editable: Custom overrides for item properties
customName String? // Override display name
customDamage String? // Override damage dice (e.g. "2d6")
customDamageType String? // Override damage type (e.g. "fire")
customTraits String[] // Override/add traits
customRange String? // Override range
customHands String? // Override hands requirement
character Character @relation(fields: [characterId], references: [id], onDelete: Cascade)
equipment Equipment? @relation(fields: [equipmentId], references: [id])
}
@@ -466,16 +480,43 @@ model NoteShare {
// ==========================================
model Feat {
id String @id @default(uuid())
name String @unique
traits String[]
summary String?
actions String?
url String?
level Int?
sourceBook String?
id String @id @default(uuid())
name String @unique
traits String[]
summary String?
description String? // Full feat description/benefit text
actions String? // "1", "2", "3", "free", "reaction", null for passive
url String?
level Int? // Minimum level requirement
sourceBook String?
// Feat classification
featType String? // "General", "Skill", "Class", "Ancestry", "Archetype", "Heritage"
rarity String? // "Common", "Uncommon", "Rare", "Unique"
// Prerequisites
prerequisites String? // Text description of prerequisites
// For class/archetype feats
className String? // "Fighter", "Wizard", etc.
archetypeName String? // "Sentinel", "Medic", etc.
// For ancestry feats
ancestryName String? // "Human", "Elf", etc.
// For skill feats
skillName String? // "Acrobatics", "Athletics", etc.
// Cached German translation
nameGerman String?
summaryGerman String?
characterFeats CharacterFeat[]
@@index([featType])
@@index([className])
@@index([ancestryName])
@@index([level])
}
model Equipment {