handlePipClick(pipIndex, isFilled) : undefined}
+ title={`${pipIndex + 1} of ${effectiveMaxValue}`}
+ />
+ )
+ } else {
+ // Symbol-based pips
+ const IconComponent = config.icon
+ const isFontAwesome = IconComponent && typeof IconComponent === 'object' && IconComponent.iconName
+
+ const currentColor = isFilled ? filledColor : config.emptyColor
+ return (
+
handlePipClick(pipIndex, isFilled) : undefined}
+ title={`${pipIndex + 1} of ${effectiveMaxValue}`}
+ >
+ {isFontAwesome ? (
+
+ ) : (
+
+ )}
+
+ )
+ }
+ })}
+
+ ))}
+
+ {showTooltip && (
+
+
+
{config.tooltipTitle}
+ {config.tooltipInstructions.map((instruction, idx) => (
+
+ {instruction.text} {instruction.description}
+
+ ))}
+
+
+ )}
+ >
+ )
+
+ // Always use two-layer structure: click container + pip container
+ return (
+
{
+ e.stopPropagation()
+ e.preventDefault()
+ if (enableBoundaryClick) {
+ handleBoundaryClick(e)
+ }
+ }}
+ onMouseEnter={() => setShowTooltip(showTooltip)}
+ onMouseLeave={() => setShowTooltip(false)}
+ >
+
+ {renderPips()}
+
+
+ )
+}
+
+export default Pips
\ No newline at end of file
diff --git a/src/components/SortButton.jsx b/src/components/SortButton.jsx
new file mode 100644
index 0000000..2b2b88d
--- /dev/null
+++ b/src/components/SortButton.jsx
@@ -0,0 +1,97 @@
+import React, { useState } from 'react'
+import { ArrowUpDown } from 'lucide-react'
+
+const SortButton = ({ adversaries, onSortAdversaries }) => {
+ const [isSorting, setIsSorting] = useState(false)
+
+ const handleSort = () => {
+ if (!adversaries || adversaries.length === 0) return
+
+ setIsSorting(true)
+
+ // Sort by type priority first, then by name (including duplicate numbers)
+ const sortedAdversaries = [...adversaries].sort((a, b) => {
+ // Define type priority order
+ const typePriority = {
+ 'Solo': 1,
+ 'Bruiser': 2,
+ 'Leader': 3,
+ 'Horde': 4,
+ 'Standard': 5,
+ 'Ranged': 6,
+ 'Skulk': 7,
+ 'Support': 8,
+ 'Minion': 9,
+ 'Social': 10
+ }
+
+ // Primary sort by type priority
+ const priorityA = typePriority[a.type] || 999 // Unknown types go to end
+ const priorityB = typePriority[b.type] || 999 // Unknown types go to end
+
+ if (priorityA !== priorityB) {
+ return priorityA - priorityB
+ }
+
+ // Secondary sort by name (including duplicate numbers)
+ const nameA = a.name || ''
+ const nameB = b.name || ''
+
+ // Extract base name and duplicate number for robust sorting
+ const parseName = (name) => {
+ const match = name.match(/^(.*)\s\((\d+)\)$/)
+ if (match) {
+ return { base: match[1], num: parseInt(match[2]) }
+ }
+ return { base: name, num: 0 } // Assume 0 for non-duplicated names
+ }
+
+ const parsedA = parseName(nameA)
+ const parsedB = parseName(nameB)
+
+ if (parsedA.base < parsedB.base) return -1
+ if (parsedA.base > parsedB.base) return 1
+
+ return parsedA.num - parsedB.num
+ })
+
+ // Apply the sorted order
+ onSortAdversaries(sortedAdversaries)
+
+ // Reset sorting state after a brief delay
+ setTimeout(() => {
+ setIsSorting(false)
+ }, 500)
+ }
+
+ const hasAdversaries = adversaries && adversaries.length > 0
+
+ return (
+
+ )
+}
+
+export default SortButton
\ No newline at end of file
diff --git a/src/components/Toolbars.jsx b/src/components/Toolbars.jsx
new file mode 100644
index 0000000..376daa8
--- /dev/null
+++ b/src/components/Toolbars.jsx
@@ -0,0 +1,50 @@
+import React from 'react'
+
+const Bar = ({
+ position = 'top', // 'top' or 'bottom'
+ children,
+ onClick,
+ className = '',
+ style = {}
+}) => {
+ const isTop = position === 'top'
+
+ // Detect if running as PWA
+ const isPWA = window.matchMedia('(display-mode: standalone)').matches ||
+ window.navigator.standalone === true ||
+ document.referrer.includes('android-app://')
+
+ const baseStyle = {
+ background: 'var(--bg-primary)',
+ borderTop: isTop ? 'none' : '1px solid var(--border)',
+ borderBottom: isTop ? '1px solid var(--border)' : 'none',
+ padding: isTop ? '0.25rem 0' : '0.5rem',
+ paddingBottom: isTop ? '0.25rem' : (isPWA ? 'calc(0.5rem + env(safe-area-inset-bottom) + 1rem)' : 'calc(0.5rem + env(safe-area-inset-bottom))'),
+ position: 'sticky',
+ [isTop ? 'top' : 'bottom']: 0,
+ zIndex: isTop ? 10 : 100,
+ order: isTop ? 1 : 3,
+ flexShrink: 0,
+ touchAction: 'manipulation',
+ userSelect: 'none',
+ display: 'flex',
+ flexDirection: isTop ? 'column' : 'row',
+ justifyContent: isTop ? 'stretch' : 'center',
+ alignItems: isTop ? 'stretch' : 'center',
+ gap: isTop ? '0' : '1rem',
+ height: isTop ? 'auto' : '60px',
+ ...style
+ }
+
+ return (
+
+ {children}
+
+ )
+}
+
+export default Bar
diff --git a/src/data/README.md b/src/data/README.md
deleted file mode 100644
index 3fd5d95..0000000
--- a/src/data/README.md
+++ /dev/null
@@ -1,210 +0,0 @@
-# Daggerheart Game Data Database
-
-This database contains comprehensive environment and adversary stat blocks extracted from the Daggerheart rulebook, following the official structure and formatting.
-
-## Contents
-
-- **Environments**: Location-based challenges and narrative elements
-- **Adversaries**: Enemy stat blocks with HP/Stress tracking
-
-## Database Structure
-
-### Environment Object
-Each environment contains the following fields:
-
-```javascript
-{
- id: string, // Unique identifier (e.g., 'cult-ritual')
- name: string, // Environment name (e.g., 'CULT RITUAL')
- tier: number, // Tier level (1-4)
- type: string, // Environment type (Exploration, Social, Traversal, Event)
- description: string, // Flavor text description
- impulses: string[], // Array of narrative impulses/themes
- difficulty: number|string, // Difficulty rating or special condition
- potentialAdversaries: string[], // Array of adversary types
- features: Feature[] // Array of environment features
-}
-```
-
-### Feature Object
-Each feature contains:
-
-```javascript
-{
- name: string, // Feature name (e.g., 'Desecrated Ground')
- type: string, // Feature type (Passive, Action, Reaction, Environment Change)
- description: string, // Detailed mechanical description
- prompts: string[] // Array of GM prompts/questions
-}
-```
-
-## Environment Types
-
-- **Exploration**: Wondrous locations with mysteries and marvels to discover
-- **Social**: Locations that primarily present interpersonal challenges
-- **Traversal**: Dangerous locations where moving around the space itself is a challenge
-- **Event**: Defined more by the activity taking place than the space they take place in
-
-## Adversary Database Structure
-
-### Adversary Object
-Each adversary contains the following fields:
-
-```javascript
-{
- id: string, // Unique identifier (e.g., 'acid-burrower')
- name: string, // Adversary name (e.g., 'Acid Burrower')
- tier: number, // Tier level (1-4)
- type: string, // Adversary type (Solo, Bruiser, Horde, Minion, Social)
- description: string, // Flavor text description
- motives: string[], // Array of narrative motives/behaviors
- difficulty: number, // Difficulty rating for combat
- thresholds: { // Damage thresholds
- major: number, // Major damage threshold
- severe: number // Severe damage threshold
- },
- hp: number, // Current HP
- hpMax: number, // Maximum HP
- stress: number, // Current stress
- stressMax: number, // Maximum stress
- damageThreshold: number, // Damage threshold for reactions
- atk: number, // Attack bonus
- weapon: string, // Weapon name
- range: string, // Attack range
- damage: string, // Damage dice and type
- experience: string[], // Array of experience bonuses
- features: Feature[] // Array of adversary features
-}
-```
-
-### Adversary Types
-
-- **Solo**: Powerful single enemies that can challenge the entire party
-- **Bruiser**: Tough enemies that can take and deal heavy damage
-- **Horde**: Multiple weak enemies that work together
-- **Minion**: Weak enemies that serve stronger ones
-- **Social**: Non-combat enemies that present social challenges
-
-### Adversary Features
-Each feature contains:
-
-```javascript
-{
- name: string, // Feature name (e.g., 'Relentless (3)')
- type: string, // Feature type (Passive, Action, Reaction)
- description: string // Detailed mechanical description
-}
-```
-
-## Environment Tiers
-
-| Tier | Level Range | Difficulty Range | Damage Range |
-|------|-------------|------------------|--------------|
-| 1 | 1 | 10-12 | 1d6+1 to 1d8+3 |
-| 2 | 2-4 | 13-15 | 2d8+3 to 2d10+8 |
-| 3 | 5-7 | 16-18 | 3d8+3 to 3d10+10 |
-| 4 | 8-10 | 19-20 | 4d8+3 to 4d10+10 |
-
-## Available Adversaries
-
-### Tier 1 (Level 1)
-- **Acid Burrower** (Solo) - Horse-sized insect with acidic blood and burrowing abilities
-- **Bear** (Bruiser) - Large bear with thick fur and powerful claws
-- **Cave Ogre** (Solo) - Massive humanoid who sees all sapient life as food
-- **Construct** (Solo) - Stone and steel being animated by magic
-- **Courtier** (Social) - Ambitious socialite who schemes and manipulates
-
-## Available Environments
-
-### Tier 1 (Level 1)
-- **ABANDONED GROVE** (Exploration) - A former druidic grove reclaimed by nature
-- **AMBUSHERS** (Event) - PCs set an ambush for adversaries
-- **BUSTLING MARKETPLACE** (Social) - Economic heart of a settlement
-- **AMBUSHED** (Event) - PCs are caught in an ambush
-- **CLIFFSIDE ASCENT** (Traversal) - Dangerous cliffside climbing
-- **LOCAL TAVERN** (Social) - Social hub of a town
-- **OUTPOST TOWN** (Social) - Small town near adventuring destinations
-- **RAGING RIVER** (Traversal) - Swift-moving river without bridges
-
-### Tier 2 (Levels 2-4)
-- **CULT RITUAL** (Event) - Fallen cult performing dark rituals
-- **HALLOWED TEMPLE** (Social) - Sacred temple providing healing and services
-- **HAUNTED CITY** (Exploration) - Abandoned city with restless spirits
-- **MOUNTAIN PASS** (Traversal) - Treacherous mountain passage with magical weather
-
-### Tier 3 (Levels 5-7)
-- **BURNING HEART OF THE WOODS** (Exploration) - Corrupted forest with eternal blue flames
-- **CASTLE SIEGE** (Event) - Active siege of a fortified castle
-- **PITCHED BATTLE** (Event) - Massive combat between large groups
-
-### Tier 4 (Levels 8-10)
-- **CHAOS REALM** (Traversal) - Otherworldly space with unstable reality
-- **DIVINE USURPATION** (Event) - Massive ritual to unseat the New Gods
-- **IMPERIAL COURT** (Social) - Majestic domain of a powerful empire
-- **NECROMANCER'S OSSUARY** (Exploration) - Crypt with library and undead
-
-## Data Format
-
-Both environments and adversaries are stored in JSON format for consistency and easy editing:
-
-- **`environments.json`** - Contains all environment data
-- **`adversaries.json`** - Contains all adversary data
-
-The JSON format provides:
-- Easy human readability and editing
-- Consistent structure across all data types
-- Simple parsing and validation
-- Version control friendly
-
-## Usage Examples
-
-### Get environments by tier
-```javascript
-import { getEnvironmentsByTier } from './environments.js';
-
-const tier1Environments = getEnvironmentsByTier(1);
-```
-
-### Get environments by type
-```javascript
-import { getEnvironmentsByType, ENVIRONMENT_TYPES } from './environments.js';
-
-const socialEnvironments = getEnvironmentsByType(ENVIRONMENT_TYPES.SOCIAL);
-```
-
-### Search environments
-```javascript
-import { searchEnvironments } from './environments.js';
-
-const results = searchEnvironments('cult');
-```
-
-### Get specific environment
-```javascript
-import { getEnvironmentById } from './environments.js';
-
-const cultRitual = getEnvironmentById('cult-ritual');
-```
-
-## Feature Types
-
-- **Passive**: Always active effects or conditions
-- **Action**: Features that can be activated by spending Fear
-- **Reaction**: Features that trigger in response to specific conditions
-- **Environment Change**: Features that fundamentally alter the environment
-
-## GM Prompts
-
-Each feature includes italicized questions designed to:
-- Inspire plot hooks
-- Provide ideas to fuel the scene
-- Help connect the scene to other story elements
-- Guide narrative interpretation
-
-## Notes
-
-- Environments are designed to interact with adversaries both mechanically and narratively
-- Fear Features are powerful, scene-defining effects that require spending Fear to activate
-- The framework is designed to be inspiring and practical, not prescriptive
-- GMs can customize environments or create new ones as needed
-- Daggerheart is enjoyable with or without this environment system
diff --git a/src/data/adversaries.json b/src/data/adversaries.json
index b1a8ea9..b299a5a 100644
--- a/src/data/adversaries.json
+++ b/src/data/adversaries.json
@@ -42,7 +42,7 @@
"major": 8,
"severe": 15
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 3,
@@ -89,7 +89,7 @@
"major": 9,
"severe": 17
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 2,
@@ -132,7 +132,7 @@
"major": 8,
"severe": 15
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 3,
@@ -179,7 +179,7 @@
"major": 7,
"severe": 15
},
- "hp": 9,
+ "hp": 0,
"hpMax": 9,
"stress": 0,
"stressMax": 4,
@@ -229,7 +229,7 @@
"major": 4,
"severe": 8
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 4,
@@ -266,7 +266,7 @@
"major": 8,
"severe": 14
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 3,
@@ -303,7 +303,7 @@
"major": 5,
"severe": 9
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -340,7 +340,7 @@
"major": 5,
"severe": 9
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -379,7 +379,7 @@
"motives": "Burrow, hunger, scavenge, wear down",
"difficulty": 10,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -416,7 +416,7 @@
"major": 7,
"severe": 13
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -458,7 +458,7 @@
"major": 6,
"severe": 10
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -498,7 +498,7 @@
"major": 5,
"severe": 9
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 3,
@@ -535,7 +535,7 @@
"major": 4,
"severe": 8
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 2,
@@ -567,7 +567,7 @@
"major": 5,
"severe": 9
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 2,
@@ -604,7 +604,7 @@
"major": 7,
"severe": 13
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 3,
@@ -647,7 +647,7 @@
"major": 8,
"severe": 14
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -684,7 +684,7 @@
"major": 5,
"severe": 9
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 4,
@@ -721,7 +721,7 @@
"major": 7,
"severe": 14
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 4,
@@ -756,7 +756,7 @@
"motives": "Escape, profit, throw smoke",
"difficulty": 9,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -793,7 +793,7 @@
"major": 7,
"severe": 14
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -840,7 +840,7 @@
"major": 4,
"severe": 8
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 3,
@@ -877,7 +877,7 @@
"major": 4,
"severe": 7
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 2,
@@ -909,7 +909,7 @@
"major": 4,
"severe": 8
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 3,
@@ -946,7 +946,7 @@
"major": 7,
"severe": 14
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 3,
@@ -996,7 +996,7 @@
"major": 7,
"severe": 15
},
- "hp": 9,
+ "hp": 0,
"hpMax": 9,
"stress": 0,
"stressMax": 3,
@@ -1046,7 +1046,7 @@
"major": 8,
"severe": 15
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 4,
@@ -1093,7 +1093,7 @@
"motives": "Crush, overwhelm, protect",
"difficulty": 10,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -1128,7 +1128,7 @@
"major": 5,
"severe": 10
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 2,
@@ -1175,7 +1175,7 @@
"major": 4,
"severe": null
},
- "hp": 2,
+ "hp": 0,
"hpMax": 2,
"stress": 0,
"stressMax": 1,
@@ -1205,7 +1205,7 @@
"major": 6,
"severe": 11
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -1247,7 +1247,7 @@
"major": 5,
"severe": null
},
- "hp": 2,
+ "hp": 0,
"hpMax": 2,
"stress": 0,
"stressMax": 1,
@@ -1277,7 +1277,7 @@
"major": 6,
"severe": 10
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 5,
@@ -1319,7 +1319,7 @@
"major": 7,
"severe": 14
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -1367,7 +1367,7 @@
"major": 5,
"severe": 11
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -1404,7 +1404,7 @@
"major": 8,
"severe": 15
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -1438,7 +1438,7 @@
"motives": "Charge, lacerate, overwhelm, profit",
"difficulty": 10,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -1473,7 +1473,7 @@
"major": 4,
"severe": 7
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 2,
@@ -1505,7 +1505,7 @@
"motives": "Fall apart, overwhelm, play dead, steal skin",
"difficulty": 8,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -1540,7 +1540,7 @@
"major": 7,
"severe": 13
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 2,
@@ -1580,7 +1580,7 @@
"major": 4,
"severe": 8
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 2,
@@ -1615,7 +1615,7 @@
"major": 8,
"severe": 14
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -1662,7 +1662,7 @@
"major": 6,
"severe": 10
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 2,
@@ -1697,7 +1697,7 @@
"major": 6,
"severe": 11
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 2,
@@ -1739,7 +1739,7 @@
"major": 6,
"severe": 11
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -1778,7 +1778,7 @@
"motives": "Combine, drain, entangle",
"difficulty": 11,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -1818,7 +1818,7 @@
"major": 8,
"severe": 15
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -1858,7 +1858,7 @@
"major": 6,
"severe": 11
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 2,
@@ -1900,7 +1900,7 @@
"major": 8,
"severe": 15
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 4,
@@ -1943,7 +1943,7 @@
"major": 8,
"severe": 15
},
- "hp": 10,
+ "hp": 0,
"hpMax": 10,
"stress": 0,
"stressMax": 3,
@@ -1988,7 +1988,7 @@
"motives": "Eat flesh, hunger, maul, surround",
"difficulty": 8,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -2023,7 +2023,7 @@
"major": 4,
"severe": 6
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 1,
@@ -2058,7 +2058,7 @@
"major": 6,
"severe": 12
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -2093,7 +2093,7 @@
"major": 8,
"severe": 16
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -2130,7 +2130,7 @@
"motives": "Act reckless, kill, prove their worth, show off",
"difficulty": 13,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -2167,7 +2167,7 @@
"major": 8,
"severe": 16
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 4,
@@ -2209,7 +2209,7 @@
"major": 12,
"severe": 25
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -2257,7 +2257,7 @@
"major": 10,
"severe": 20
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 6,
@@ -2304,7 +2304,7 @@
"major": 8,
"severe": 16
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 4,
@@ -2346,7 +2346,7 @@
"motives": "Follow orders, gang up, survive",
"difficulty": 12,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -2381,7 +2381,7 @@
"major": 7,
"severe": 13
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 4,
@@ -2414,7 +2414,7 @@
"major": 9,
"severe": 18
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 6,
@@ -2462,7 +2462,7 @@
"major": 9,
"severe": 17
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 4,
@@ -2494,7 +2494,7 @@
"motives": "Follow orders, gain power, seek forbidden knowledge",
"difficulty": 13,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -2529,7 +2529,7 @@
"major": 11,
"severe": 23
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -2571,7 +2571,7 @@
"major": 10,
"severe": 20
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -2606,7 +2606,7 @@
"major": 9,
"severe": 18
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -2641,7 +2641,7 @@
"major": 12,
"severe": 23
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 3,
@@ -2683,7 +2683,7 @@
"major": 12,
"severe": 24
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 5,
@@ -2725,7 +2725,7 @@
"major": 14,
"severe": 28
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 4,
@@ -2764,7 +2764,7 @@
"motives": "Batter, make a living, overwhelm, terrify",
"difficulty": 13,
"thresholds": null,
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 2,
@@ -2799,7 +2799,7 @@
"major": 8,
"severe": 19
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 4,
@@ -2844,7 +2844,7 @@
"major": 13,
"severe": 25
},
- "hp": 9,
+ "hp": 0,
"hpMax": 9,
"stress": 0,
"stressMax": 3,
@@ -2896,7 +2896,7 @@
"major": 13,
"severe": 26
},
- "hp": 10,
+ "hp": 0,
"hpMax": 10,
"stress": 0,
"stressMax": 5,
@@ -2941,7 +2941,7 @@
"major": 13,
"severe": 26
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 4,
@@ -2990,7 +2990,7 @@
"major": 8,
"severe": 17
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 5,
@@ -3027,7 +3027,7 @@
"major": 9,
"severe": 19
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -3065,7 +3065,7 @@
"major": 14,
"severe": 27
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -3107,7 +3107,7 @@
"major": 15,
"severe": 27
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 4,
@@ -3154,7 +3154,7 @@
"major": 8,
"severe": 15
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 3,
@@ -3197,7 +3197,7 @@
"major": 13,
"severe": 26
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 4,
@@ -3245,7 +3245,7 @@
"major": 14,
"severe": 28
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 3,
@@ -3287,7 +3287,7 @@
"major": 9,
"severe": 18
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -3324,7 +3324,7 @@
"major": 6,
"severe": 14
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 3,
@@ -3361,7 +3361,7 @@
"major": 13,
"severe": 26
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 4,
@@ -3408,7 +3408,7 @@
"major": 7,
"severe": 15
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -3445,7 +3445,7 @@
"major": 8,
"severe": 17
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -3482,7 +3482,7 @@
"major": 11,
"severe": 22
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -3529,7 +3529,7 @@
"major": 11,
"severe": 23
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 6,
@@ -3582,7 +3582,7 @@
"major": 20,
"severe": 35
},
- "hp": 12,
+ "hp": 0,
"hpMax": 12,
"stress": 0,
"stressMax": 6,
@@ -3642,7 +3642,7 @@
"major": 15,
"severe": 29
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 5,
@@ -3684,7 +3684,7 @@
"major": 18,
"severe": 35
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 5,
@@ -3731,7 +3731,7 @@
"major": 18,
"severe": 36
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -3783,7 +3783,7 @@
"major": 17,
"severe": 30
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 6,
@@ -3830,7 +3830,7 @@
"major": 22,
"severe": 40
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -3877,7 +3877,7 @@
"major": 16,
"severe": 30
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -3919,7 +3919,7 @@
"major": 24,
"severe": 38
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 5,
@@ -3961,7 +3961,7 @@
"major": null,
"severe": null
},
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -3996,7 +3996,7 @@
"major": 22,
"severe": 40
},
- "hp": 10,
+ "hp": 0,
"hpMax": 10,
"stress": 0,
"stressMax": 4,
@@ -4046,7 +4046,7 @@
"major": 17,
"severe": 34
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 5,
@@ -4086,7 +4086,7 @@
"major": 15,
"severe": 30
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 4,
@@ -4133,7 +4133,7 @@
"major": 19,
"severe": 35
},
- "hp": 10,
+ "hp": 0,
"hpMax": 10,
"stress": 0,
"stressMax": 5,
@@ -4183,7 +4183,7 @@
"major": 16,
"severe": 32
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 5,
@@ -4226,7 +4226,7 @@
"major": 19,
"severe": 36
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -4268,7 +4268,7 @@
"major": 22,
"severe": 40
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 4,
@@ -4310,7 +4310,7 @@
"major": null,
"severe": null
},
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -4345,7 +4345,7 @@
"major": 22,
"severe": 42
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 6,
@@ -4397,7 +4397,7 @@
"major": 18,
"severe": 35
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 4,
@@ -4434,7 +4434,7 @@
"major": 19,
"severe": 33
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 3,
@@ -4469,7 +4469,7 @@
"major": 21,
"severe": 40
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 3,
@@ -4514,7 +4514,7 @@
"major": 20,
"severe": 32
},
- "hp": 5,
+ "hp": 0,
"hpMax": 5,
"stress": 0,
"stressMax": 4,
@@ -4559,7 +4559,7 @@
"major": 21,
"severe": 41
},
- "hp": 10,
+ "hp": 0,
"hpMax": 10,
"stress": 0,
"stressMax": 6,
@@ -4621,7 +4621,7 @@
"major": 33,
"severe": 66
},
- "hp": 9,
+ "hp": 0,
"hpMax": 9,
"stress": 0,
"stressMax": 8,
@@ -4674,7 +4674,7 @@
"major": null,
"severe": null
},
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -4714,7 +4714,7 @@
"major": 26,
"severe": 42
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 5,
@@ -4761,7 +4761,7 @@
"major": 36,
"severe": 66
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 5,
@@ -4820,7 +4820,7 @@
"major": 35,
"severe": 58
},
- "hp": 11,
+ "hp": 0,
"hpMax": 11,
"stress": 0,
"stressMax": 5,
@@ -4884,7 +4884,7 @@
"major": 25,
"severe": 45
},
- "hp": 3,
+ "hp": 0,
"hpMax": 3,
"stress": 0,
"stressMax": 2,
@@ -4919,7 +4919,7 @@
"major": null,
"severe": null
},
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 2,
@@ -4959,7 +4959,7 @@
"major": 37,
"severe": 70
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -5011,7 +5011,7 @@
"major": 35,
"severe": 70
},
- "hp": 11,
+ "hp": 0,
"hpMax": 11,
"stress": 0,
"stressMax": 8,
@@ -5063,7 +5063,7 @@
"major": 38,
"severe": 68
},
- "hp": 11,
+ "hp": 0,
"hpMax": 11,
"stress": 0,
"stressMax": 10,
@@ -5120,7 +5120,7 @@
"major": 35,
"severe": 71
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -5165,7 +5165,7 @@
"major": 27,
"severe": 47
},
- "hp": 4,
+ "hp": 0,
"hpMax": 4,
"stress": 0,
"stressMax": 3,
@@ -5200,7 +5200,7 @@
"major": null,
"severe": null
},
- "hp": 1,
+ "hp": 0,
"hpMax": 1,
"stress": 0,
"stressMax": 1,
@@ -5235,7 +5235,7 @@
"major": 33,
"severe": 65
},
- "hp": 6,
+ "hp": 0,
"hpMax": 6,
"stress": 0,
"stressMax": 5,
@@ -5292,7 +5292,7 @@
"major": 30,
"severe": 58
},
- "hp": 7,
+ "hp": 0,
"hpMax": 7,
"stress": 0,
"stressMax": 5,
@@ -5354,7 +5354,7 @@
"major": 29,
"severe": 55
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 5,
@@ -5416,7 +5416,7 @@
"major": 40,
"severe": 70
},
- "hp": 9,
+ "hp": 0,
"hpMax": 9,
"stress": 0,
"stressMax": 4,
@@ -5460,7 +5460,7 @@
"major": 25,
"severe": 45
},
- "hp": 8,
+ "hp": 0,
"hpMax": 8,
"stress": 0,
"stressMax": 5,
diff --git a/src/data/environments.json b/src/data/environments.json
index 8dc79ce..c620cca 100644
--- a/src/data/environments.json
+++ b/src/data/environments.json
@@ -44,7 +44,7 @@
"tier": 1,
"type": "Exploration",
"description": "A former druidic grove lying fallow and fully reclaimed by nature.",
- "impulses": ["Draw in the curious", "Echo the past"],
+ "impulses": "Draw in the curious, Echo the past",
"difficulty": 11,
"potentialAdversaries": [
"Beasts (Bear, Dire Wolf, Glass Snake)",
@@ -101,9 +101,11 @@
"tier": 1,
"type": "Event",
"description": "An ambush is set to catch an unsuspecting party off-guard.",
- "impulses": ["Overwhelm", "scatter", "surround"],
- "difficulty": "Special (see Relative Strength)",
- "potentialAdversaries": ["Any"],
+ "impulses": "Overwhelm, scatter, surround",
+ "difficulty": "~",
+ "potentialAdversaries": [
+ "Any"
+ ],
"features": [
{
"name": "Relative Strength",
@@ -131,9 +133,11 @@
"tier": 1,
"type": "Event",
"description": "An ambush is set by the PCs to catch unsuspecting adversaries off-guard.",
- "impulses": ["Escape", "group up", "protect the most vulnerable"],
- "difficulty": "Special (see Relative Strength)",
- "potentialAdversaries": ["Any"],
+ "impulses": "Escape, group up, protect the most vulnerable",
+ "difficulty": "~",
+ "potentialAdversaries": [
+ "Any"
+ ],
"features": [
{
"name": "Relative Strength",
@@ -161,7 +165,7 @@
"tier": 1,
"type": "Social",
"description": "The economic heart of the settlement, with local artisans, traveling merchants, and patrons across social classes.",
- "impulses": ["Buy low and sell high", "tempt and tantalize with wares from near and far"],
+ "impulses": "Buy low and sell high, tempt and tantalize with wares from near and far",
"difficulty": 10,
"potentialAdversaries": [
"Guards (Bladed Guard, Head Guard)",
@@ -212,7 +216,7 @@
"tier": 1,
"type": "Traversal",
"description": "A steep, rocky cliff side tall enough to make traversal dangerous.",
- "impulses": ["Cast the unready down to a rocky doom", "draw people in with promise of what lies at the top"],
+ "impulses": "Cast the unready down to a rocky doom, draw people in with promise of what lies at the top",
"difficulty": 12,
"potentialAdversaries": [
"Construct",
@@ -256,7 +260,7 @@
"tier": 1,
"type": "Social",
"description": "A lively tavern that serves as the social hub for its town.",
- "impulses": ["Provide opportunities for adventurers", "nurture community"],
+ "impulses": "Provide opportunities for adventurers, nurture community",
"difficulty": 10,
"potentialAdversaries": [
"Guards (Bladed Guard, Head Guard)",
@@ -325,7 +329,7 @@
"tier": 1,
"type": "Social",
"description": "A small town on the outskirts of a nation or region, close to a dungeon, tombs, or other adventuring destinations.",
- "impulses": ["Drive the desperate to certain doom", "profit off of ragged hope"],
+ "impulses": "Drive the desperate to certain doom, profit off of ragged hope",
"difficulty": 12,
"potentialAdversaries": [
"Jagged Knife Bandits (Hexer, Kneebreaker, Lackey, Lieutenant, Shadow, Sniper)",
@@ -383,7 +387,7 @@
"tier": 1,
"type": "Traversal",
"description": "A swift-moving river without a bridge crossing, deep enough to sweep away most people.",
- "impulses": ["Bar crossing", "carry away the unready", "divide the land"],
+ "impulses": "Bar crossing, carry away the unready, divide the land",
"difficulty": 10,
"potentialAdversaries": [
"Beasts (Bear, Glass Snake)",
@@ -425,7 +429,7 @@
"tier": 2,
"type": "Event",
"description": "A Fallen cult assembles around a sigil of the defeated gods and a bonfire that burns a sickly shade of green.",
- "impulses": ["Profane the land", "unite the Mortal Realm with the Circles Below"],
+ "impulses": "Profane the land, unite the Mortal Realm with the Circles Below",
"difficulty": 14,
"potentialAdversaries": [
"Cult of the Fallen (Cult Adept, Cult Fang, Cult Initiate, Secret-Keeper)"
@@ -474,7 +478,7 @@
"tier": 2,
"type": "Social",
"description": "A bustling but well-kept temple that provides healing and hosts regular services, overseen by a priest or seraph.",
- "impulses": ["Connect the Mortal Realm with the Hallows Above", "display the power of the divine", "provide aid and succor to the faithful"],
+ "impulses": "Connect the Mortal Realm with the Hallows Above, display the power of the divine, provide aid and succor to the faithful",
"difficulty": 13,
"potentialAdversaries": [
"Guards (Archer Guard, Bladed Guard, Head Guard)"
@@ -523,7 +527,7 @@
"tier": 2,
"type": "Exploration",
"description": "An abandoned city populated by the restless spirits of eras past.",
- "impulses": ["Misdirect and disorient", "replay apocalypses both public and personal"],
+ "impulses": "Misdirect and disorient, replay apocalypses both public and personal",
"difficulty": 14,
"potentialAdversaries": [
"Ghosts (Spectral Archer, Spectral Captain, Spectral Guardian)",
@@ -575,7 +579,7 @@
"tier": 2,
"type": "Traversal",
"description": "Stony peaks that pierce the clouds, with a twisting path winding its way up and over through many switchbacks.",
- "impulses": ["Exact a chilling toll in supplies and stamina", "reveal magical tampering", "slow down travel"],
+ "impulses": "Exact a chilling toll in supplies and stamina, reveal magical tampering, slow down travel",
"difficulty": 15,
"potentialAdversaries": [
"Beasts (Bear, Giant Eagle, Glass Snake)",
@@ -629,7 +633,7 @@
"tier": 3,
"type": "Exploration",
"description": "A vast repository of forgotten knowledge, with towering shelves and ancient tomes.",
- "impulses": ["Reveal hidden truths", "tempt with forbidden knowledge"],
+ "impulses": "Reveal hidden truths, tempt with forbidden knowledge",
"difficulty": 17,
"potentialAdversaries": [
"Constructs (Guardian Golem, Knowledge Keeper)",
@@ -671,7 +675,7 @@
"tier": 3,
"type": "Exploration",
"description": "A corrupted woodland where nature has been twisted by dark magic.",
- "impulses": ["Corrupt the pure", "spread blight"],
+ "impulses": "Corrupt the pure, spread blight",
"difficulty": 16,
"potentialAdversaries": [
"Corrupted Beasts (Blight Wolf, Twisted Bear)",
@@ -713,7 +717,7 @@
"tier": 3,
"type": "Exploration",
"description": "A network of caves filled with luminescent crystals that pulse with magical energy.",
- "impulses": ["Amplify magic", "drain the unwary"],
+ "impulses": "Amplify magic, drain the unwary",
"difficulty": 18,
"potentialAdversaries": [
"Elementals (Crystal Golem, Energy Wisp)",
@@ -755,7 +759,7 @@
"tier": 3,
"type": "Traversal",
"description": "A series of islands suspended in the sky, connected by precarious bridges and magical currents.",
- "impulses": ["Separate the party", "test balance and courage"],
+ "impulses": "Separate the party, test balance and courage",
"difficulty": 17,
"potentialAdversaries": [
"Flying Creatures (Harpy, Wyvern)",
@@ -797,7 +801,7 @@
"tier": 4,
"type": "Exploration",
"description": "A plane of pure light and divine energy, where the laws of reality bend to celestial will.",
- "impulses": ["Purify the impure", "test mortal worth"],
+ "impulses": "Purify the impure, test mortal worth",
"difficulty": 20,
"potentialAdversaries": [
"Celestials (Solar, Seraphim)",
@@ -839,7 +843,7 @@
"tier": 4,
"type": "Event",
"description": "A gateway to the Abyss, spewing forth demonic energy and corrupting all it touches.",
- "impulses": ["Corrupt and destroy", "spread chaos"],
+ "impulses": "Corrupt and destroy, spread chaos",
"difficulty": 19,
"potentialAdversaries": [
"Demons (Balor, Marilith)",
@@ -881,7 +885,7 @@
"tier": 4,
"type": "Event",
"description": "A region where time flows differently, creating temporal anomalies and paradoxes.",
- "impulses": ["Manipulate time", "create paradoxes"],
+ "impulses": "Manipulate time, create paradoxes",
"difficulty": 20,
"potentialAdversaries": [
"Temporal Entities (Time Elemental, Paradox Walker)",
@@ -923,7 +927,7 @@
"tier": 4,
"type": "Exploration",
"description": "A tear in reality leading to the void between worlds, where nothingness consumes all.",
- "impulses": ["Consume existence", "spread void"],
+ "impulses": "Consume existence, spread void",
"difficulty": 20,
"potentialAdversaries": [
"Void Entities (Void Walker, Nothingness)",
@@ -960,4 +964,4 @@
]
}
]
-}
+}
\ No newline at end of file
diff --git a/src/index.css b/src/index.css
index 96137fa..5e8339d 100644
--- a/src/index.css
+++ b/src/index.css
@@ -1,35 +1,80 @@
-:root {
- /* Minimal Color Palette */
- --light: #ffffff; /* Pure white */
- --dark: #1a1a1a; /* Almost black */
- --purple: #4f46e5; /* Purple accent */
- --red: #ef4444; /* Red for danger/delete actions */
-
- /* Greyscale System */
- --grey-light: #a3a3a3; /* Light grey for secondary text */
- --grey: #6b7280; /* Medium grey for borders, empty states */
- --grey-dark: #404040; /* Dark grey for backgrounds */
-
- /* Derived colors - keep minimal */
- --bg-dark: var(--dark);
- --bg-card: #262626; /* Slightly lighter than dark for contrast */
- --bg-card-hover: var(--grey-dark); /* Use grey-dark for hover */
- --text-primary: var(--light);
- --text-secondary: var(--grey-light);
- --border: var(--grey);
-
- /* Button system variables */
- --btn-border-radius: 0.25rem; /* 4px - subtle button rounding */
- --btn-border-radius-compact: 0.125rem; /* 2px - minimal compact button rounding */
-
- /* Responsive breakpoints */
- --mobile: 800px;
- --tablet: 768px;
- --desktop: 1024px;
- --wide: 1280px;
-
+/* ========================================
+ CSS VARIABLES - Simplified and Clean
+ ======================================== */
-}
+:root {
+ /* Core colors - just what you actually use */
+ --white: #ffffff;
+ --black: #000000;
+ --purple: #4f46e5;
+ --red: #ef4444;
+ --gold: #eab308;
+
+ /* Status colors */
+ --success: #28a745;
+ --danger: #dc3545;
+ --warning: #ffc107;
+ --info: #17a2b8;
+
+ /* Gray scale - systematic numbering */
+ --gray-100: #e6e6e6; /* lightest - 90% lightness, straight grayscale */
+ --gray-200: #cccccc; /* 80% lightness, straight grayscale */
+ --gray-300: #b3b3b3; /* 70% lightness, straight grayscale */
+ --gray-400: #999999; /* 60% lightness, straight grayscale */
+ --gray-500: #808080; /* 50% lightness, straight grayscale */
+ --gray-600: #666666; /* 40% lightness, straight grayscale */
+ --gray-700: #4d4d4d; /* 30% lightness, straight grayscale */
+ --gray-800: #333333; /* 20% lightness, straight grayscale */
+ --gray-900: #1a1a1a; /* darkest - 10% lightness, straight grayscale */
+
+ /* Legacy grays - to be removed */
+ --gray-light: var(--gray-400);
+ --gray: var(--gray-500);
+ --gray-dark: var(--gray-800);
+
+ /* Use grays for backgrounds instead of derived colors */
+ --bg-primary: var(--black);
+ --bg-secondary: var(--gray-800);
+ --bg-card: var(--gray-900);
+ --bg-card-hover: var(--gray-900);
+ --text-primary: var(--white);
+ --text-secondary: var(--gray-400);
+ --border: var(--gray-800);
+ --border-hover: var(--gray-600);
+
+ /* Spacing */
+ --space-xs: 0.25rem;
+ --space-sm: 0.5rem;
+ --space-md: 1rem;
+ --space-lg: 1.5rem;
+ --space-xl: 2rem;
+
+ /* Layout */
+ --topbar-height: 48px;
+ --bottombar-height: 60px;
+ --min-height-input: 60px;
+
+ /* Border radius */
+ --radius-sm: 0.25rem;
+ --radius-md: 0.5rem;
+ --radius-lg: 0.75rem;
+
+ /* Line Heights */
+ --line-height-tight: 1.2;
+ --line-height-normal: 1.5;
+ --line-height-relaxed: 1.6;
+
+ /* Text sizes */
+ --text-xs: 0.75rem;
+ --text-sm: 0.875rem;
+ --text-base: 1rem;
+ --text-lg: 1.125rem;
+ --text-xl: 1.25rem;
+}
+
+/* ========================================
+ BASE STYLES - Reset, Typography, Utilities
+ ======================================== */
* {
margin: 0;
@@ -37,6120 +82,720 @@
box-sizing: border-box;
}
+html, body {
+ height: 100%;
+ height: 100dvh; /* Use dynamic viewport height for better mobile support */
+ overflow: auto; /* Allow scrolling when content exceeds viewport */
+}
+
+/* Safari mobile viewport fixes */
+@supports (height: 100dvh) {
+ html, body {
+ height: 100dvh;
+ }
+}
+
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
- background: var(--bg-dark);
+ background: var(--bg-primary);
color: var(--text-primary);
line-height: 1.6;
}
-.container {
- max-width: 1200px;
- margin: 0 auto;
- padding: 1rem;
-}
+/* ========================================
+ TEXT SELECTION CONTROL
+ ======================================== */
-.btn {
- padding: 0.5rem 1rem;
- border: none;
- border-radius: 0.5rem;
- font-size: 0.875rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s;
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
+/* Global text selection prevention - allow only in input fields */
+* {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
}
-.btn-primary {
- background: var(--purple);
- color: var(--text-primary);
+/* Allow text selection in input fields */
+input,
+textarea,
+[contenteditable="true"],
+[contenteditable="true"] * {
+ user-select: text;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
}
-.btn-primary:hover {
- background: var(--primary-dark);
+/* Allow text selection in error messages and debug content */
+.error-text,
+.debug-text,
+pre,
+code,
+.error-message,
+.error-content,
+.vite-error-overlay,
+[data-vite-dev-tool],
+#vite-error-overlay,
+div[style*="position: fixed"],
+div[style*="z-index: 9999"],
+div[style*="background: rgba(0, 0, 0, 0.8)"],
+div[style*="color: rgb(255, 255, 255)"],
+*[class*="error"],
+*[class*="overlay"] {
+ user-select: text !important;
+ -webkit-user-select: text !important;
+ -moz-user-select: text !important;
+ -ms-user-select: text !important;
+}
+
+/* Utility classes for selective text selection control */
+.text-selectable {
+ user-select: text;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
}
-.btn-secondary {
- background: var(--grey);
- color: var(--text-primary);
+.text-not-selectable {
+ user-select: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
}
-.btn-secondary:hover {
- background: var(--grey-dark); /* Darker muted gray */
+/* ========================================
+ UTILITY CLASSES
+ ======================================== */
+
+/* Text utilities */
+.text-xs { font-size: var(--text-xs); }
+.text-sm { font-size: var(--text-sm); }
+.text-base { font-size: var(--text-base); }
+.text-lg { font-size: var(--text-lg); }
+.text-xl { font-size: var(--text-xl); }
+
+.font-normal { font-weight: 400; }
+.font-medium { font-weight: 500; }
+.font-semibold { font-weight: 600; }
+.font-bold { font-weight: 700; }
+
+.text-primary { color: var(--text-primary); }
+.text-secondary { color: var(--text-secondary); }
+.text-muted { color: var(--gray); }
+.text-red { color: var(--red); }
+
+.bg-primary { background: var(--bg-primary); }
+.bg-secondary { background: var(--bg-secondary); }
+
+/* Border utilities */
+.border { border: 2px solid var(--border); }
+.border-t { border-top: 2px solid var(--border); }
+.border-b { border-bottom: 2px solid var(--border); }
+.border-l { border-left: 2px solid var(--border); }
+.border-r { border-right: 2px solid var(--border); }
+
+/* Border hover utilities */
+.border-hover { border-color: var(--border-hover); }
+
+.rounded-sm { border-radius: var(--radius-sm); }
+.rounded-md { border-radius: var(--radius-md); }
+.rounded-lg { border-radius: var(--radius-lg); }
+
+/* Spacing utilities */
+.p-xs { padding: var(--space-xs); }
+.p-sm { padding: var(--space-sm); }
+.p-md { padding: var(--space-md); }
+.p-lg { padding: var(--space-lg); }
+.p-xl { padding: var(--space-xl); }
+
+.m-xs { margin: var(--space-xs); }
+.m-sm { margin: var(--space-sm); }
+.m-md { margin: var(--space-md); }
+.m-lg { margin: var(--space-lg); }
+.m-xl { margin: var(--space-xl); }
+
+.mb-sm { margin-bottom: var(--space-sm); }
+.mb-md { margin-bottom: var(--space-md); }
+.mb-lg { margin-bottom: var(--space-lg); }
+
+/* Flex utilities */
+.flex { display: flex; }
+.flex-col { display: flex; flex-direction: column; }
+.flex-row { display: flex; flex-direction: row; }
+
+.justify-start { justify-content: flex-start; }
+.justify-end { justify-content: flex-end; }
+.justify-center { justify-content: center; }
+.justify-between { justify-content: space-between; }
+.justify-around { justify-content: space-around; }
+
+.items-start { align-items: flex-start; }
+.items-end { align-items: flex-end; }
+.items-center { align-items: center; }
+.items-baseline { align-items: baseline; }
+.items-stretch { align-items: stretch; }
+
+.flex-1 { flex: 1 1 0%; }
+.flex-auto { flex: 1 1 auto; }
+.flex-initial { flex: 0 1 auto; }
+.flex-none { flex: none; }
+
+.gap-xs { gap: var(--space-xs); }
+.gap-sm { gap: var(--space-sm); }
+.gap-md { gap: var(--space-md); }
+.gap-lg { gap: var(--space-lg); }
+.gap-xl { gap: var(--space-xl); }
+
+.flex-center { display: flex; align-items: center; justify-content: center; }
+.flex-between { display: flex; align-items: center; justify-content: space-between; }
+.flex-start { display: flex; align-items: center; justify-content: flex-start; }
+.flex-end { display: flex; align-items: center; justify-content: flex-end; }
+
+/* Size utilities */
+.w-full { width: 100%; }
+.h-full { height: 100%; }
+.h-auto { height: auto; }
+.h-screen { height: 100vh; }
+
+.cursor-pointer { cursor: pointer; }
+.cursor-default { cursor: default; }
+.cursor-not-allowed { cursor: not-allowed; }
+
+.transition { transition: all 0.2s ease; }
+.opacity-50 { opacity: 0.5; }
+
+
+/* ========================================
+ MOBILE SPECIFIC STYLES
+ ======================================== */
+
+/* Prevent mobile auto-zoom on all input elements */
+@media (max-width: 768px) {
+ input[type="text"],
+ input[type="number"],
+ input[type="email"],
+ input[type="password"],
+ input[type="search"],
+ input[type="tel"],
+ input[type="url"],
+ textarea,
+ select {
+ font-size: 16px !important;
+ }
+
+ /* Mobile utilities */
+ .mobile-hidden { display: none !important; }
+ .mobile-full-width { width: 100% !important; }
+ .mobile-stack { flex-direction: column !important; }
+ .mobile-center { text-align: center !important; }
+ .mobile-p-sm { padding: var(--space-sm) !important; }
+ .mobile-p-md { padding: var(--space-md) !important; }
+ .mobile-gap-sm { gap: var(--space-sm) !important; }
+ .mobile-gap-md { gap: var(--space-md) !important; }
+}
+
+/* Disable pull-to-refresh on entire gameboard/left panel on mobile */
+@media (max-width: 768px) {
+ body {
+ overscroll-behavior-y: none !important;
+ }
+
+ .left-panel,
+ .gameboard,
+ .gameboard * {
+ overscroll-behavior: none !important;
+ overscroll-behavior-y: none !important;
+ touch-action: pan-y !important; /* Allow vertical scrolling but prevent PTR */
+ }
}
-.btn-danger {
- background: var(--red);
- color: var(--text-primary);
+/* Remove number input arrows */
+input[type="number"]::-webkit-outer-spin-button,
+input[type="number"]::-webkit-inner-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
}
-.btn-danger:hover {
- background: var(--red); /* Even darker red on hover */
+input[type="number"] {
+ -moz-appearance: textfield;
+ appearance: textfield;
}
-.btn-success {
- background: var(--success);
- color: var(--text-primary);
-}
+/* ========================================
+ PWA SPECIFIC STYLES
+ ======================================== */
-.btn-success:hover {
- background: var(--purple); /* Darker indigo on hover */
+@media (display-mode: standalone) {
+ .pwa-install-prompt {
+ display: none;
+ }
}
-.btn-sm {
- padding: 0.25rem 0.5rem;
- font-size: 0.75rem;
+/* ========================================
+ ANIMATIONS
+ ======================================== */
+
+/* Pulse animation for confirmation states */
+@keyframes pulse {
+ 0%, 100% {
+ opacity: 1;
+ }
+ 50% {
+ opacity: 0.8;
+ }
}
-.btn-md {
- padding: 0.5rem 1rem;
- font-size: 0.875rem;
+/* Loading animation */
+@keyframes loading {
+ 0% { background-position: 200% 0; }
+ 100% { background-position: -200% 0; }
}
-.btn-lg {
- padding: 0.75rem 1.5rem;
- font-size: 1rem;
+/* Spin animation for loading spinners */
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(360deg); }
}
-.btn-xl {
- padding: 1rem 2rem;
- font-size: 1.125rem;
+/* Confirmation state */
+.confirming {
+ background: var(--red) !important;
+ color: white !important;
}
-/* Disabled button states */
-.btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
- pointer-events: none;
+/* ========================================
+ COMPONENT IMPORTS
+ ======================================== */
+
+
+/* ========================================
+ LAYOUT STYLES
+ ======================================== */
+
+/* Main app container */
+.app {
+ height: 100vh;
+ height: 100dvh; /* Use dynamic viewport height for better mobile support */
+ background: var(--bg-primary);
+ display: flex;
+ flex-direction: column;
+ overflow: hidden; /* Prevent jittering and scrolling */
+ position: fixed; /* Prevent Safari from scrolling the entire app */
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
}
-.btn:disabled:hover {
- background: inherit;
+/* Main content area - takes up remaining space */
+.main-content {
+ display: flex;
+ flex: 1;
+ min-height: 0;
+ height: calc(100vh - 60px); /* Only subtract bottom bar (60px) */
+ height: calc(100dvh - 60px); /* Use dynamic viewport height */
+ order: 2; /* Ensure main content appears after top bar */
}
-/* Button click feedback */
-.btn:active {
- transform: translateY(1px);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
+@media (max-width: 800px) {
+ .main-content {
+ height: calc(100vh - 60px); /* Mobile: only subtract bottom bar (60px) */
+ height: calc(100dvh - 60px); /* Use dynamic viewport height */
+ }
}
-/* Global text selection prevention - allow only in input fields */
-* {
- user-select: none;
- -webkit-user-select: none;
- -moz-user-select: none;
- -ms-user-select: none;
+/* Bottom Bar Container */
+.bottom-bar-container {
+ order: 3; /* Ensure bottom bar appears after main content */
+ flex-shrink: 0; /* Don't shrink */
+ position: sticky; /* Use sticky instead of fixed to prevent Safari issues */
+ bottom: 0;
+ z-index: 100;
+ touch-action: manipulation; /* Prevent zooming */
+ user-select: none; /* Prevent text selection */
}
-/* Allow text selection in input fields */
-input,
-textarea,
-[contenteditable="true"],
-[contenteditable="true"] * {
- user-select: text;
- -webkit-user-select: text;
- -moz-user-select: text;
- -ms-user-select: text;
+/* Panel styles */
+.left-panel {
+ flex: 1;
+ min-width: 0;
+ background: var(--bg-primary);
+ overflow-y: auto;
+ height: 100%;
}
-/* Sortable item positioning for drag handles */
-.sortable-item {
- position: relative;
- margin-bottom: 0.25rem;
+.right-panel {
+ flex: 1;
+ min-width: 0;
+ background: var(--bg-primary);
+ overflow-y: auto;
+ overflow-x: hidden; /* Prevent horizontal spill outside column */
+ display: flex;
+ flex-direction: column;
+ height: 100%;
}
-/* Confirmation state - only change color, keep everything else the same */
-.confirming {
- background: var(--red) !important;
- color: white !important;
+/* Mobile responsive adjustments */
+@media (max-width: 800px) {
+ .bottom-bar-container {
+ /* Ensure toolbar is above Safari's bottom UI */
+ padding-bottom: env(safe-area-inset-bottom);
+ }
+
+ /* Make panels full width in mobile */
+ .left-panel,
+ .right-panel {
+ width: 100%;
+ min-width: 0;
+ }
}
-/* Initial delete button state - red to indicate destructive action */
-.btn[data-action="delete"],
-.btn[data-action="remove"] {
- background: var(--red) !important;
- color: white !important;
+/* Mobile hidden utility */
+.mobile-hidden {
+ display: none !important;
+ visibility: hidden !important;
+ opacity: 0 !important;
+ width: 0 !important;
+ min-width: 0 !important;
+ flex: 0 !important;
}
-/* Bulk clear buttons get the same initial styling */
-.btn[data-action="bulk-clear"] {
- background: var(--secondary-dark) !important;
- color: white !important;
+/* More specific selectors for mobile panel behavior */
+.left-panel.mobile-hidden,
+.right-panel.mobile-hidden {
+ display: none !important;
+ visibility: hidden !important;
+ opacity: 0 !important;
+ width: 0 !important;
+ min-width: 0 !important;
+ flex: 0 !important;
}
+.main-content .right-panel.mobile-hidden {
+ display: none !important;
+ flex: 0 !important;
+ width: 0 !important;
+ min-width: 0 !important;
+ max-width: 0 !important;
+ overflow: hidden !important;
+ visibility: hidden !important;
+ opacity: 0 !important;
+}
+/* When right panel is hidden, left panel takes full width and removes border */
+.main-content .left-panel:not(.mobile-hidden) {
+ flex: 1 !important;
+ width: 100% !important;
+ border-right: none !important;
+}
-/* Confirmation state - ONLY change background color, nothing else */
-.btn.confirming {
- background: var(--red) !important;
- color: white !important;
+@media (max-width: 800px) {
+ .main-content .left-panel:not(.mobile-hidden) {
+ flex: 1 !important;
+ width: 100% !important;
+ max-width: 100% !important;
+ }
}
-/* Ensure confirming bulk clear buttons maintain their dimensions */
-.btn.confirming[data-action="bulk-clear"] {
- min-width: 6rem !important;
- width: 6rem !important;
- text-align: center !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
+/* Panel content styles */
+.panel-header {
+ padding: 0.5rem;
+ border-bottom: 2px solid var(--border);
+ background: var(--bg-primary);
}
-/* Ensure ONLY bulk clear buttons maintain consistent dimensions */
-.btn[data-action="bulk-clear"] {
- min-width: 6rem !important; /* 96px - enough for "Clear All" text */
- width: 6rem !important;
- text-align: center !important;
- box-sizing: border-box !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
+.panel-content {
+ flex: 1;
+ overflow-y: auto;
+ padding: 0.25rem;
+ min-height: 0; /* Allow shrinking below content size */
}
-/* Button shapes - All buttons are now rectangular */
-/* Round button styles removed for consistency */
+/* Remove padding for database content since Browser has its own styling */
+.database-display {
+ padding: 0;
+ margin: 0;
+ height: 100%; /* Fill the panel-content completely */
+ overflow: hidden; /* Prevent spilling */
+}
-/* Standardize all button corner rounding */
-.btn {
- border-radius: var(--btn-border-radius) !important; /* 8px - consistent across all buttons */
+/* When panel-content contains database-display, it should not scroll itself */
+.panel-content:has(.database-display) {
+ overflow-y: hidden;
+ height: 100%; /* Take full height of parent */
}
-/* Special button variants that need different rounding */
-.btn-compact {
- border-radius: var(--btn-border-radius-compact) !important; /* 6px - slightly less rounded for compact buttons */
+.panel-footer {
+ padding: 1rem;
+ border-top: 2px solid var(--border);
+ background: var(--bg-primary);
}
-/* Round button styles removed - all buttons are now rectangular */
+/* Button styles */
-/* Stat controls styling for expanded cards */
-.stat-row {
- display: flex;
+.btn-icon {
+ width: 1.5rem;
+ height: 1.5rem;
+ border: 2px solid var(--border);
+ border-radius: var(--radius-sm);
+ background: var(--bg-primary);
+ color: var(--text-primary);
+ cursor: pointer;
+ transition: all 0.2s ease;
+ display: inline-flex;
align-items: center;
- justify-content: space-between;
- margin-bottom: 1rem;
- padding: 0.5rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
+ justify-content: center;
+ font-size: var(--text-sm);
+ user-select: none;
}
-.stat-label {
- font-weight: 600;
- color: var(--text-primary);
- min-width: 4rem;
+.btn-icon:hover {
+ background: var(--gray-dark);
}
-.stat-controls {
- display: flex;
- align-items: center;
- gap: 0.5rem;
+.btn-icon[data-color="purple"] {
+ background: var(--purple) !important;
+ color: white !important;
+ border-color: var(--purple) !important;
}
-.stat-value {
- font-weight: 600;
- color: var(--text-primary);
- min-width: 3rem;
- text-align: center;
+.btn-icon[data-color="purple"]:hover {
+ background: var(--gray-dark) !important;
}
-/* Add Item Button - styled like an empty card with dotted outline */
- .add-item-button {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0.75rem;
- background: var(--bg-dark);
- border: 2px dashed var(--border);
- border-radius: 0.5rem;
- cursor: pointer;
- transition: all 0.2s ease;
- min-height: 3.5rem;
- margin-bottom: 0.5rem;
- }
+/* Component-specific forms and overrides - removed non-existent imports */
+
+/* ========================================
+ FEAR PIPS STYLES
+ ======================================== */
-.add-item-button:hover {
- background: var(--bg-card);
- border-color: var(--purple);
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
+.fear-pip {
+ transition: color 0.2s ease;
+ cursor: pointer;
+ display: inline-block;
+ width: 1.5rem;
+ height: 1.5rem;
+ text-align: center;
+ line-height: 1.5rem;
}
- .add-item-content {
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 0.5rem;
- color: var(--text-secondary);
- }
+.fear-pip.filled {
+ color: var(--purple);
+ opacity: 1;
+}
-.add-item-icon {
- font-size: 1.5rem;
- font-weight: 600;
- color: var(--text-secondary);
+.fear-pip.empty {
+ color: var(--gray-dark);
}
- .add-item-text {
- font-size: 0.875rem;
- font-weight: 500;
- text-transform: lowercase;
+/* ========================================
+ MOBILE DRAWER STYLES
+ ======================================== */
+
+@media (max-width: 800px) {
+ .mobile-drawer {
+ position: fixed;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ z-index: 1100; /* Higher than bottom bar and flyouts */
+ pointer-events: none;
}
- /* Compact state when list has items */
- .add-item-button.has-items {
- min-height: 2.5rem;
- padding: 0.5rem;
+ .mobile-drawer.open {
+ pointer-events: auto;
}
- .add-item-button.has-items .add-item-icon {
- font-size: 1.25rem;
+ .drawer-backdrop {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: transparent; /* No background shadow */
+ opacity: 0;
+ pointer-events: none; /* Prevent backdrop from receiving events when hidden */
+ visibility: hidden; /* Ensure backdrop is completely hidden when not open */
}
- .add-item-button.has-items .add-item-text {
- font-size: 0.75rem;
+ .mobile-drawer.open .drawer-backdrop {
+ opacity: 1;
+ pointer-events: auto; /* Allow backdrop events only when drawer is open */
+ visibility: visible; /* Make backdrop visible when drawer is open */
}
- /* Grid-based Action Bar */
- .unified-action-bar {
- display: grid;
- grid-template-columns: 1fr auto;
- gap: 0.75rem;
- align-items: start;
- }
-
- .edit-button-section {
- display: flex;
- align-items: center;
- justify-content: flex-start;
+ .drawer-content {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: var(--bg-primary);
+ border-top: 2px solid var(--border);
+ border-radius: 16px 16px 0 0;
+ height: 100%; /* Use full height of container */
+ overflow: hidden;
+ pointer-events: none; /* Prevent content from receiving events when hidden */
+ visibility: hidden; /* Ensure content is completely hidden when not open */
+ overscroll-behavior: none !important; /* Prevent pull-to-refresh */
+ overscroll-behavior-y: none !important; /* Prevent vertical pull-to-refresh */
+ touch-action: none !important; /* Prevent all touch gestures to stop pull-to-refresh */
+ will-change: transform; /* Optimize for transform animations */
}
-
- .edit-mode-controls {
+
+ .drawer-body {
+ padding: 0;
+ height: calc(100% - 60px); /* Adjusted for actual header height */
display: flex;
- gap: 0.25rem;
- flex-wrap: nowrap;
- width: 100%;
- justify-content: space-between;
- align-items: center;
+ flex-direction: column;
+ overflow-y: auto; /* Allow scrolling on drawer body */
+ -webkit-overflow-scrolling: touch; /* Smooth scrolling on iOS */
+ overscroll-behavior: none !important; /* Prevent pull-to-refresh */
+ overscroll-behavior-y: none !important; /* Prevent vertical pull-to-refresh */
+ touch-action: pan-y !important; /* Allow vertical scrolling and taps */
}
-
- .clear-buttons {
- display: flex;
- gap: 0.375rem;
- flex: 1;
- margin: 0 0.5rem;
- justify-content: center;
- align-items: center;
+
+ .mobile-drawer.open .drawer-content {
+ pointer-events: auto; /* Allow content events only when drawer is open */
+ visibility: visible; /* Make content visible when drawer is open */
+ overscroll-behavior: none !important; /* Ensure PTR prevention when open */
+ overscroll-behavior-y: none !important; /* Ensure vertical PTR prevention when open */
+ touch-action: pan-y !important; /* Allow vertical scrolling and taps when open */
}
-
- .clear-buttons .btn {
- min-width: 2.25rem;
- height: 2.5rem;
- font-size: 0.875rem;
- padding: 0;
- border-radius: 0.5rem;
+
+ .drawer-header {
display: flex;
align-items: center;
justify-content: center;
- flex-shrink: 0;
+ padding: 1rem 0; /* Increased padding for larger swipe area */
+ border-bottom: 2px solid var(--border);
+ position: relative;
+ overscroll-behavior: none !important; /* Prevent pull-to-refresh */
+ overscroll-behavior-y: none !important; /* Prevent vertical pull-to-refresh */
+ touch-action: none !important; /* Prevent all touch gestures to stop pull-to-refresh */
+ cursor: pointer; /* Make it clear the header is clickable */
+ min-height: 60px; /* Ensure adequate touch target */
+ }
+
+ .drawer-handle {
+ width: 40px;
+ height: 4px;
+ background: var(--border);
+ border-radius: 2px;
+ cursor: pointer;
+ margin: 0.5rem auto; /* Add vertical margin for better touch target */
+ overscroll-behavior: none; /* Prevent pull-to-refresh */
+ overscroll-behavior-y: none; /* Prevent vertical pull-to-refresh */
+ touch-action: none; /* Prevent all touch actions except our custom handling */
}
-
- .edit-mode-controls .btn {
- flex: 1;
- min-width: 0;
- white-space: nowrap;
+
+ /* Mobile drawer browser specific styles */
+ .drawer-body .browser-container {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
overflow: hidden;
- text-overflow: ellipsis;
- /* Override the large button styles */
- min-width: auto !important;
- height: auto !important;
- font-size: 0.875rem !important;
- font-weight: normal !important;
- padding: 0.5rem 0.75rem !important;
- border-radius: 0.5rem !important;
- display: inline-flex !important;
- align-items: center !important;
- justify-content: center !important;
- text-align: center !important;
- }
-
- /* Ensure the edit button maintains its size when transitioning */
- .edit-button-section .btn {
- transition: all 0.2s ease;
}
- .add-button-section {
- display: flex;
- align-items: center;
- justify-content: flex-end;
+ /* BROWSER/CREATOR DRAWER: Let entire browser content scroll */
+ .drawer-body .browser-content {
+ flex: 1;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ overscroll-behavior: none !important; /* Prevent pull-to-refresh */
+ overscroll-behavior-y: none !important; /* Prevent vertical pull-to-refresh */
+ touch-action: pan-y !important; /* Allow vertical scrolling only */
}
+ /* BROWSER/CREATOR DRAWER: Prevent pull-to-refresh in header */
+ .drawer-body .browser-header {
+ overscroll-behavior: none !important; /* Prevent pull-to-refresh */
+ overscroll-behavior-y: none !important; /* Prevent vertical pull-to-refresh */
+ touch-action: none !important; /* Block PTR in header area; taps still work */
+ }
-
- /* Disabled button styling */
- .btn:disabled {
- opacity: 0.4;
- cursor: not-allowed;
- background: var(--bg-secondary) !important;
- color: var(--text-secondary) !important;
+ /* EXPANDED CARD DRAWER: Avoid nested scrollers; drawer-body scrolls */
+ .drawer-body .expanded-card,
+ .drawer-body .expanded-content {
+ overflow: visible !important;
+ height: auto !important;
+ max-height: none !important;
}
- .btn:disabled:hover {
- transform: none !important;
- box-shadow: none !important;
+ /* Prevent PTR on table header area inside drawer */
+ .drawer-body .browser-content thead,
+ .drawer-body .browser-content th {
+ overscroll-behavior: none !important;
+ overscroll-behavior-y: none !important;
+ touch-action: none !important;
}
- /* Dropdown Menu Styles */
- .dropdown-container {
- position: relative;
+ /* Ensure pull-to-refresh is disabled even when drawer content isn't scrollable */
+ .mobile-drawer .drawer-content,
+ .mobile-drawer .drawer-body {
+ overscroll-behavior: none !important;
+ overscroll-behavior-y: none !important;
}
- .dropdown-trigger {
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- padding: 0.5rem 0.75rem;
- color: var(--text-primary);
- cursor: pointer;
- font-size: 0.875rem;
- display: flex;
- align-items: center;
- gap: 0.5rem;
- transition: all 0.2s ease;
+ .mobile-drawer .drawer-content {
+ overscroll-behavior: none !important;
+ overscroll-behavior-y: none !important;
+ touch-action: pan-y !important; /* Allow vertical scrolling and taps */
}
- .dropdown-trigger:hover {
- background: var(--bg-card-hover);
- border-color: var(--purple);
+ .mobile-drawer .drawer-header {
+ overscroll-behavior: none !important;
+ overscroll-behavior-y: none !important;
+ touch-action: none !important; /* Prevent PTR; taps still work */
}
- .dropdown-backdrop {
- position: fixed;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- z-index: 1000;
- }
-
- .dropdown-menu {
- position: absolute;
- top: 100%;
- right: 0;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
- min-width: 220px;
- z-index: 1001;
- margin-top: 0.25rem;
- }
-
-
-
- .dropdown-items {
- padding: 0.5rem 0;
- }
-
- .dropdown-item {
- width: 100%;
- background: none;
- border: none;
- padding: 0.75rem;
- text-align: left;
- color: var(--text-primary);
- cursor: pointer;
- font-size: 0.875rem;
- display: flex;
- align-items: center;
- justify-content: space-between;
- transition: all 0.2s ease;
- }
-
- .dropdown-item:hover:not(.disabled) {
- background: var(--bg-dark);
- }
-
- .dropdown-item.disabled {
- color: var(--text-secondary);
- cursor: not-allowed;
- opacity: 0.6;
- }
-
- .item-count {
- color: var(--text-secondary);
- font-size: 0.75rem;
- font-weight: 500;
- }
-
-
-
-
-
-/* Expanded card styles */
-.expanded-card {
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- overflow: hidden;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-}
-
-.expanded-card.edit-mode {
- background: var(--bg-darker);
- border-color: var(--purple);
-}
-
-.expanded-header {
- background: var(--bg-darker);
- padding: 1rem;
- border-bottom: 1px solid var(--border);
-}
-
-.expanded-header h2 {
- margin: 0;
- color: var(--text-primary);
- font-size: 1.5rem;
- font-weight: 600;
-}
-
-.expanded-content {
- padding: 1rem;
-}
-
-/* Browser inline expansion */
-.expanded-card-row {
- background: var(--bg-card);
-}
-
-.expanded-card-cell {
- padding: 0 !important;
- border: none;
-}
-
-.expanded-card-container {
- padding: 1rem;
- border-top: 1px solid var(--border);
-}
-
-/* Adversary Details - simplified expanded view */
-.adversary-details {
- padding: 1rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.adversary-details .motives-section,
-.adversary-details .core-stats-section,
-.adversary-details .experience-section,
-.adversary-details .description-section,
-.adversary-details .features-section,
-.adversary-details .abilities-section,
-.adversary-details .traits-section {
- margin-bottom: 1.5rem;
-}
-
-.adversary-details .motives-section:last-child,
-.adversary-details .core-stats-section:last-child,
-.adversary-details .experience-section:last-child,
-.adversary-details .description-section:last-child,
-.adversary-details .features-section:last-child,
-.adversary-details .abilities-section:last-child,
-.adversary-details .traits-section:last-child {
- margin-bottom: 0;
-}
-
-.adversary-details h3 {
- margin: 0 0 0.75rem 0;
- color: var(--text-primary);
- font-size: 1rem;
- font-weight: 600;
-}
-
-.adversary-details p {
- margin: 0;
- color: var(--text-secondary);
- line-height: 1.5;
-}
-
-.adversary-details ul {
- margin: 0;
- padding-left: 1.5rem;
- color: var(--text-secondary);
-}
-
-.adversary-details li {
- margin-bottom: 0.25rem;
- line-height: 1.4;
-}
-
-/* Core Stats Grid */
-.adversary-details .stats-grid {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 0.75rem;
-}
-
-.adversary-details .stat-item {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 0.5rem;
- background: var(--bg-card);
- border-radius: 0.25rem;
- border: 1px solid var(--border);
-}
-
-.adversary-details .stat-label {
- font-weight: 500;
- color: var(--text-primary);
-}
-
-.adversary-details .stat-value {
- font-weight: 600;
- color: var(--text-primary);
-}
-
-/* Features */
-.adversary-details .feature-type-group {
- margin-bottom: 1.5rem;
-}
-
-.adversary-details .feature-type-group:last-child {
- margin-bottom: 0;
-}
-
-.adversary-details .feature-type-title {
- margin: 0 0 0.75rem 0;
- color: var(--text-primary);
- font-size: 0.875rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- border-bottom: 1px solid var(--border);
- padding-bottom: 0.25rem;
-}
-
-.adversary-details .feature-item {
- margin-bottom: 0.75rem;
- padding: 0.75rem;
- background: var(--bg-card);
- border-radius: 0.25rem;
- border: 1px solid var(--border);
- transition: border-color 0.2s ease;
-}
-
-.adversary-details .feature-item:last-child {
- margin-bottom: 0;
-}
-
-.adversary-details .feature-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 0.5rem;
-}
-
-.adversary-details .feature-name {
- color: var(--text-primary);
-}
-
-
-.adversary-details .feature-description {
- margin: 0;
- color: var(--text-secondary);
- line-height: 1.5;
-}
-
-/* Interactive Mechanics */
-.interactive-mechanic {
- cursor: pointer;
- padding: 0.125rem 0.25rem;
- border-radius: 0.25rem;
- font-weight: 600;
- transition: all 0.2s ease;
- border: 1px solid transparent;
-}
-
-.interactive-mechanic:hover {
- transform: translateY(-1px);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
-}
-
-.interactive-mechanic.spend-fear {
- background: rgba(220, 38, 127, 0.1);
- color: #dc267f;
- border-color: rgba(220, 38, 127, 0.3);
-}
-
-.interactive-mechanic.spend-fear:hover {
- background: rgba(220, 38, 127, 0.2);
- border-color: rgba(220, 38, 127, 0.5);
-}
-
-.interactive-mechanic.mark-stress {
- background: rgba(245, 158, 11, 0.1);
- color: #f59e0b;
- border-color: rgba(245, 158, 11, 0.3);
-}
-
-.interactive-mechanic.mark-stress:hover {
- background: rgba(245, 158, 11, 0.2);
- border-color: rgba(245, 158, 11, 0.5);
-}
-
-.interactive-mechanic.gain-fear {
- background: rgba(139, 92, 246, 0.1);
- color: var(--purple);
- border-color: rgba(139, 92, 246, 0.3);
-}
-
-.interactive-mechanic.gain-fear:hover {
- background: rgba(139, 92, 246, 0.2);
- border-color: rgba(139, 92, 246, 0.5);
-}
-
-.interactive-mechanic.countdown {
- background: rgba(34, 197, 94, 0.1);
- color: #22c55e;
- border-color: rgba(34, 197, 94, 0.3);
-}
-
-.interactive-mechanic.countdown:hover {
- background: rgba(34, 197, 94, 0.2);
- border-color: rgba(34, 197, 94, 0.5);
-}
-
-.interactive-mechanic.token {
- background: rgba(59, 130, 246, 0.1);
- color: #3b82f6;
- border-color: rgba(59, 130, 246, 0.3);
-}
-
-.interactive-mechanic.token:hover {
- background: rgba(59, 130, 246, 0.2);
- border-color: rgba(59, 130, 246, 0.5);
-}
-
-.card {
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.75rem;
- padding: 1rem;
- margin-bottom: 1rem;
-}
-
-.card:hover {
- background: var(--bg-card-hover);
-}
-
-/* Professional Stat Block Styling */
-.stat-block {
- background: var(--bg-card);
- border: 2px solid var(--border);
- border-radius: 0.75rem;
- padding: 1.5rem;
- margin-bottom: 1.5rem;
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
-}
-
-.stat-block-header {
- border-bottom: 2px solid var(--border);
- padding-bottom: 1rem;
- margin-bottom: 1.5rem;
-}
-
-.stat-block-name {
- font-size: 1.75rem;
- font-weight: 700;
- color: var(--purple);
- margin: 0;
- text-align: center;
-}
-
-.stat-block-meta {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
- gap: 1rem;
- margin-bottom: 1.5rem;
-}
-
-.stat-block-tier {
- font-size: 1rem;
- font-weight: 600;
- color: var(--grey);
- margin: 0;
- text-align: center;
- padding: 0.5rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.stat-block-description {
- font-style: italic;
- color: var(--text-secondary);
- margin: 0;
- text-align: center;
- padding: 0.5rem;
-}
-
-.stat-block-motives {
- font-size: 0.9rem;
- color: var(--text-secondary);
- margin: 0;
- text-align: center;
- padding: 0.5rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.stat-block-stats {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- gap: 1rem;
- margin-bottom: 1.5rem;
- padding: 1rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.stat-block-difficulty,
-.stat-block-thresholds {
- text-align: center;
- padding: 0.5rem;
-}
-
-.stat-block-difficulty strong,
-.stat-block-thresholds strong {
- color: var(--purple);
- display: block;
- margin-bottom: 0.25rem;
-}
-
-.resource-tracker {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 0.5rem;
-}
-
-.resource-tracker strong {
- color: var(--purple);
- font-size: 0.9rem;
-}
-
-.input-number-tracker-container {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- background: var(--bg-card);
- padding: 0.5rem;
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.tracker-subtract-button,
-.tracker-add-button {
- width: 2rem;
- height: 2rem;
- border-radius: 50%;
- border: 1px solid var(--border);
- background: var(--bg-dark);
- color: var(--text-primary);
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- font-weight: bold;
- transition: all 0.2s ease;
-}
-
-.tracker-subtract-button:hover:not(:disabled),
-.tracker-add-button:hover:not(:disabled) {
- background: var(--purple);
- color: var(--text-primary);
- border-color: var(--purple);
-}
-
-
-.input-number-tracker-center-container {
- flex: 1;
- text-align: center;
-}
-
-.input-block__input {
- width: 100%;
- max-width: 4rem;
- text-align: center;
- padding: 0.25rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.9rem;
-}
-
-.stat-block-divider {
- color: var(--text-secondary);
- font-weight: bold;
- margin: 0;
- text-align: center;
-}
-
-.basic-attack-container {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
- gap: 1rem;
- margin-bottom: 1.5rem;
- padding: 1rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.simple-action-button {
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 0.75rem;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- cursor: pointer;
- transition: all 0.2s ease;
- text-align: center;
-}
-
-.simple-action-button:hover {
- background: var(--purple);
- color: var(--text-primary);
- border-color: var(--purple);
-}
-
-.simple-action-button-top-label {
- font-size: 1.1rem;
- font-weight: 600;
- color: var(--purple);
- margin-bottom: 0.25rem;
-}
-
-.simple-action-button-bottom-label {
- font-size: 0.8rem;
- color: var(--text-secondary);
-}
-
-.stat-block-features {
- margin-bottom: 1.5rem;
-}
-
-.stat-block-feature {
- color: var(--purple);
- font-size: 1.1rem;
- font-weight: 600;
- margin: 0 0 1rem 0;
- text-align: center;
- padding: 0.5rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.adversary-feature {
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- padding: 1rem;
- margin-bottom: 1rem;
-}
-
-.single-feature-description {
- margin: 0 0 1rem 0;
- line-height: 1.6;
-}
-
-.single-feature-description strong {
- color: var(--purple);
-}
-
-.single-feature-description em {
- color: var(--grey);
-}
-
-.interactive-actions-main-holder {
- display: flex;
- gap: 0.5rem;
- margin-bottom: 1rem;
-}
-
-.multi-action-button {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-.resource-cost-action-button {
- background: var(--red);
- color: var(--text-primary);
- border: 1px solid var(--red);
- border-radius: 0.25rem;
- padding: 0.25rem 0.5rem;
- font-size: 0.8rem;
- font-weight: 600;
- text-align: center;
- min-width: 2rem;
-}
-
-.dice-action-button {
- background: var(--grey);
- color: var(--text-primary);
- border: 1px solid var(--grey);
- border-radius: 0.25rem;
- padding: 0.25rem 0.5rem;
- font-size: 0.8rem;
- font-weight: 600;
- text-align: center;
- min-width: 3rem;
-}
-
-.stat-block-experiences,
-.stat-block-conditions {
- text-align: center;
- padding: 0.5rem;
- margin-bottom: 1rem;
-}
-
-.stat-block-experiences strong,
-.stat-block-conditions strong {
- color: var(--purple);
- display: block;
- margin-bottom: 0.5rem;
-}
-
-.single-experience {
- display: inline-block;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- padding: 0.25rem 0.5rem;
- margin: 0.25rem;
- font-size: 0.9rem;
-}
-
-.conditions-values {
- color: var(--text-secondary);
- font-style: italic;
-}
-
-.multi-add-buttons-container {
- text-align: center;
- margin-top: 1rem;
-}
-
-.multi-add-buttons--button {
- background: var(--purple);
- color: var(--text-primary);
- border: 1px solid var(--purple);
- border-radius: 0.5rem;
- padding: 0.5rem 1rem;
- font-size: 0.9rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.2s ease;
-}
-
-.multi-add-buttons--button:hover {
- background: var(--primary-dark);
- border-color: var(--primary-dark);
-}
-
-/* HP and Stress Dots */
-.hp-dots-container,
-.stress-dots-container {
- display: flex;
- flex-wrap: wrap;
- gap: 2px;
- justify-content: center;
- margin-bottom: 4px;
- max-width: 120px;
-}
-
-.hp-dot,
-.stress-dot {
- width: 8px;
- height: 8px;
- border-radius: 50%;
- border: 1px solid var(--border);
- transition: all 0.2s ease;
-}
-
-.hp-dot.filled {
- background: var(--red);
- border-color: var(--red);
- box-shadow: 0 0 4px rgba(239, 68, 68, 0.5);
-}
-
-.hp-dot.empty {
- background: var(--bg-dark);
- border-color: var(--border);
-}
-
-.stress-dot.filled {
- background: var(--purple);
- border-color: var(--purple);
- box-shadow: 0 0 4px rgba(139, 92, 246, 0.5);
-}
-
-.stress-dot.empty {
- background: var(--bg-dark);
- border-color: var(--border);
-}
-
-.hp-text,
-.stress-text {
- font-size: 0.75rem;
- color: var(--text-secondary);
- text-align: center;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-.basic-attack-container {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
- gap: 0.5rem;
- align-items: center;
- margin-bottom: 1.5rem;
- padding: 1rem;
- background: rgba(139, 115, 85, 0.1);
- border-radius: 0.5rem;
- border: 1px solid var(--grey-dark);
- position: relative;
- z-index: 1;
-}
-
-.stat-block-attack,
-.stat-block-damage {
- display: flex;
- flex-direction: column;
- align-items: center;
- gap: 0.5rem;
-}
-
-.simple-action-button {
- display: flex;
- flex-direction: column;
- align-items: center;
- padding: 0.5rem;
- border: 1px solid var(--grey-dark);
- border-radius: 0.5rem;
- cursor: pointer;
- transition: all 0.2s ease;
- text-align: center;
- min-width: 3rem;
-}
-
-.simple-action-button.attack-dice-action-button {
- background: var(--purple);
- color: var(--text-primary);
- border-color: var(--purple);
-}
-
-.simple-action-button.damage-dice-action-button {
- background: var(--purple);
- color: var(--text-primary);
- border-color: var(--purple);
-}
-
-.simple-action-button.resource-cost-action-button {
- background: var(--dark);
- color: var(--text-primary);
- border-color: var(--grey-dark);
-}
-
-.simple-action-button:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
-}
-
-.simple-action-button-top-label {
- font-size: 0.9rem;
- font-weight: 600;
- margin-bottom: 0.25rem;
-}
-
-.simple-action-button-bottom-label {
- font-size: 0.7rem;
- opacity: 0.8;
- text-transform: uppercase;
-}
-
-.stat-block-experiences,
-.stat-block-conditions {
- text-align: center;
- padding: 0.75rem;
- margin-bottom: 1rem;
- background: rgba(139, 115, 85, 0.1);
- border-radius: 0.5rem;
- border: 1px solid var(--grey-dark);
- position: relative;
- z-index: 1;
-}
-
-.stat-block-experiences strong,
-.stat-block-conditions strong {
- color: var(--grey-dark);
- display: block;
- margin-bottom: 0.5rem;
- font-size: 0.9rem;
-}
-
-.experiences-list {
- display: flex;
- flex-wrap: wrap;
- gap: 0.5rem;
- justify-content: center;
-}
-
-.single-experience {
- display: inline-block;
- background: var(--grey-dark);
- border: 1px solid var(--grey-dark);
- border-radius: 0.25rem;
- padding: 0.25rem 0.5rem;
- font-size: 0.8rem;
- color: var(--grey);
-}
-
-.conditions-values {
- color: var(--grey-light);
- font-style: italic;
- font-size: 0.9rem;
-}
-
-.stat-block-features {
- margin-bottom: 1.5rem;
- position: relative;
- z-index: 1;
-}
-
-.stat-block-feature {
- color: var(--grey-dark);
- font-size: 1.1rem;
- font-weight: 600;
- margin: 0 0 1rem 0;
- text-align: center;
- padding: 0.75rem;
- background: rgba(139, 115, 85, 0.1);
- border-radius: 0.5rem;
- border: 1px solid var(--grey-dark);
-}
-
-.adversary-feature {
- background: var(--grey-dark);
- border: 1px solid var(--grey-dark);
- border-radius: 0.5rem;
- padding: 1rem;
- margin-bottom: 1rem;
-}
-
-.single-feature-description {
- margin: 0 0 1rem 0;
- line-height: 1.6;
- color: var(--grey);
-}
-
-.single-feature-description strong {
- color: var(--grey-dark);
-}
-
-.single-feature-description em {
- color: #6b5742;
-}
-
-.interactive-actions-main-holder {
- display: flex;
- gap: 0.5rem;
- margin-bottom: 0.5rem;
-}
-
-.multi-action-button {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-
-/* New Layout Styles */
-.top-bar {
- background: var(--bg-dark);
- border-bottom: 1px solid var(--border);
- padding: 0.125rem 0;
- height: 48px; /* Match sidebar header height */
- position: fixed;
- top: 0;
- left: 0; /* No sidebar offset needed */
- right: 0;
- z-index: 100;
- display: flex;
- align-items: center;
-}
-
-/* Mobile override for top bar positioning */
-@media (max-width: 800px) {
- .top-bar {
- left: 0; /* No sidebar offset in mobile */
- }
-
- /* Fix mobile drag handle and scrolling issues */
- .drag-handle {
- /* Reduce drag handle width on mobile to minimize interference */
- width: 1.5rem;
- font-size: 0.7rem;
- /* Allow both dragging and scrolling on mobile */
- touch-action: manipulation;
- /* Make drag handle more touch-friendly */
- min-height: 44px; /* iOS recommended touch target size */
- }
-
- /* Ensure content doesn't shift when drag handles appear */
- .simple-list-row {
- /* Prevent horizontal shifting */
- overflow: hidden;
- /* Ensure consistent layout */
- min-height: 3rem;
- }
-
- /* Improve touch scrolling for mobile */
- .left-column,
- .right-column {
- /* Better touch scrolling */
- -webkit-overflow-scrolling: touch;
- /* Prevent horizontal scrolling */
- overflow-x: hidden;
- /* Ensure content stays in place */
- position: relative;
- }
-
- /* Prevent content from shifting when drag handles appear/disappear */
- .row-content {
- /* Ensure consistent left margin */
- margin-left: 0;
- /* Prevent shifting */
- transition: none;
- }
-}
-
-/* Sidebar Styles */
-.sidebar {
- position: fixed;
- bottom: 0; /* Bottom bar for both desktop and mobile */
- left: 0;
- right: 0;
- width: 100%; /* Full width */
- height: 60px; /* Fixed height */
- background: var(--bg-dark);
- border-top: 1px solid var(--border);
- z-index: 100;
- overflow: visible; /* Allow flyouts to show outside sidebar */
-}
-
-/* Removed sidebar expansion styles - using bottom bar only */
-
-/* Apply backdrop when flyouts are open on collapsed sidebar */
-.sidebar.flyout-open {
- box-shadow: 2px 0 12px rgba(0, 0, 0, 0.4);
- z-index: 110; /* Higher z-index to overlay content */
-}
-
-/* Removed backdrop blur effect */
-
-
-
-
-.sidebar-nav {
- display: flex;
- flex-direction: row; /* Horizontal layout */
- justify-content: space-around; /* Evenly distribute buttons */
- align-items: center;
- height: 100%;
- padding: 0 1rem;
- gap: 0.5rem;
-}
-
-.sidebar-nav-item {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0.5rem;
- color: var(--text-primary);
- text-decoration: none;
- cursor: pointer;
- transition: all 0.2s ease;
- border: none;
- background: none;
- width: 60px;
- height: 60px;
- text-align: center;
- position: relative; /* For flyout positioning */
-}
-
-.sidebar-nav-item .sidebar-nav-icon {
- width: 20px;
- height: 20px;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-shrink: 0;
-}
-
-/* Removed expanded sidebar styles */
-
-.sidebar-nav-item:hover {
- background: var(--bg-card-hover);
-}
-
-.sidebar-nav-item.active {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.sidebar-nav-item.delete-active {
- background: var(--red);
- color: var(--text-primary);
-}
-
-.sidebar-nav-item.disabled {
- opacity: 0.4;
- cursor: not-allowed;
- pointer-events: none;
-}
-
-
-.sidebar-nav-text {
- white-space: nowrap;
- opacity: 1; /* Always visible in bottom bar */
- font-size: 10px;
- line-height: 1;
-}
-
-/* Flyout Menu Styles - position relative already set above */
-
-.flyout-menu {
- position: absolute;
- bottom: 100%; /* Fly upward from bottom bar */
- left: 50%;
- transform: translateX(-50%); /* Center horizontally */
- background: #1a1a1a; /* Explicit dark background to match sidebar exactly */
- border: 1px solid var(--border);
- border-radius: 8px;
- box-shadow: 0 -4px 12px rgba(0, 0, 0, 0.4); /* Shadow above */
- z-index: 1000;
- opacity: 0;
- visibility: hidden;
- margin-bottom: 8px; /* Small gap from bottom bar */
- pointer-events: none;
- display: flex;
- flex-direction: column; /* Stack vertically */
- overflow: visible; /* Allow content to show */
- white-space: nowrap;
- min-width: 120px; /* Minimum width for text */
-}
-
-.flyout-menu.show {
- opacity: 1;
- visibility: visible;
- transform: translateX(-50%); /* Keep centered when shown */
- pointer-events: auto;
-}
-
-.flyout-menu-item {
- display: flex;
- align-items: center;
- justify-content: flex-start;
- padding: 0.75rem 1rem;
- color: var(--text-primary);
- text-decoration: none;
- cursor: pointer;
- border: none;
- background: none;
- text-align: left;
- font-size: 0.875rem;
- white-space: nowrap;
- height: 48px; /* Match sidebar button height exactly */
-}
-
-
-.flyout-menu-item:hover {
- background: var(--bg-card-hover);
-}
-
-.flyout-menu-item.delete-flyout-item:hover {
- background: var(--red);
- color: var(--text-primary);
-}
-
-/* Countdown Control Panel */
-.countdown-control-panel {
- padding: 1rem;
- min-width: 150px;
- max-width: 150px;
- overflow: visible; /* Allow all buttons to show */
-}
-
-.countdown-control-panel h4 {
- margin: 0 0 1rem 0;
- font-size: 0.875rem;
- font-weight: 600;
- color: var(--text-primary);
- text-transform: uppercase;
-}
-
-.countdown-actions {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.countdown-action-btn {
- padding: 0.5rem 0.75rem;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 4px;
- color: var(--text-primary);
- cursor: pointer;
- transition: all 0.2s ease;
- font-size: 0.8rem;
- text-align: center;
-}
-
-.countdown-action-btn:hover {
- background: var(--bg-card-hover);
- border-color: var(--purple);
-}
-
-/* Roll Result Button Styling */
-.countdown-action-btn.success-fear {
- border-color: var(--purple);
- color: var(--purple);
-}
-
-.countdown-action-btn.fail-fear {
- border-color: var(--purple);
- color: var(--purple);
-}
-
-.countdown-action-btn.success-hope {
- border-color: #f59e0b;
- color: #f59e0b;
-}
-
-.countdown-action-btn.fail-hope {
- border-color: #f59e0b;
- color: #f59e0b;
-}
-
-.countdown-action-btn.crit-success {
- border-color: var(--text-primary);
- color: var(--text-primary);
- font-weight: 600;
-}
-
-.countdown-action-btn.short-rest {
- border-color: var(--text-secondary);
- color: var(--text-secondary);
-}
-
-.countdown-action-btn.long-rest {
- border-color: var(--text-secondary);
- color: var(--text-secondary);
-}
-
-/* Top-bar stays fixed - sidebar overlays */
-
-.compact-top-bar {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 2rem;
- padding: 0.5rem 1rem;
- background: rgba(30, 41, 59, 0.8);
- border-radius: 0.5rem;
- border: 1px solid var(--grey);
-}
-
-.fear-section {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0.125rem;
- width: 100%;
- height: 60%;
-}
-
-.fear-controls {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 100%;
- gap: 1rem;
-}
-
-.fear-label {
- font-weight: 700;
- color: #f1f5f9;
- font-size: 1.125rem;
- letter-spacing: 0.05em;
-}
-
-.fear-skulls {
- display: flex;
- gap: 0.125rem;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 100%;
- padding: 0.125rem;
-}
-
-.fear-skull {
- flex: 1;
- height: 100%;
- transition: all 0.2s ease;
- display: flex;
- align-items: center;
- justify-content: center;
- color: var(--grey-dark);
- max-width: calc(8.33% - 0.125rem); /* 12 skulls with gaps */
- image-rendering: -webkit-optimize-contrast;
- image-rendering: crisp-edges;
-}
-
-.fear-skull.empty {
- color: var(--grey-dark);
-}
-
-.fear-skull.filled {
- opacity: 1;
- color: var(--purple);
- filter: none;
-}
-
-.fear-skull.filled:hover {
- transform: scale(1.02);
-}
-
-/* Ensure fear skull hover effects are isolated from tooltip effects */
-.fear-skulls .fear-skull.filled:hover {
- transform: scale(1.02);
- /* Removed purple text-shadow */
-}
-
-/* Fear add buttons */
-.fear-add-buttons {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-/* Element Control Buttons */
-.element-controls {
- display: flex;
- gap: 0.5rem;
- align-items: center;
- justify-content: center;
- padding: 0.25rem 0;
-}
-
-.element-controls .btn {
- min-width: 2.5rem;
- height: 2rem;
- padding: 0.25rem;
- font-size: 0.75rem;
- font-weight: 600;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-/* Mobile responsive element controls */
-@media (max-width: 800px) {
- .element-controls {
- flex-wrap: wrap;
- gap: 0.25rem;
- padding: 0.25rem 0;
- }
-
- .element-controls .btn {
- min-width: 2rem;
- height: 1.75rem;
- font-size: 0.7rem;
- padding: 0.125rem;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-}
-
-.fear-tooltip {
- position: relative;
- cursor: help;
-}
-
-.fear-tooltip-content {
- position: absolute;
- bottom: 100%;
- left: 50%;
- transform: translateX(-50%);
- background: rgba(15, 23, 42, 0.95);
- border: 1px solid var(--grey);
- border-radius: 0.5rem;
- padding: 1rem;
- min-width: 250px;
- z-index: 1000;
- opacity: 0;
- visibility: hidden;
- transition: all 0.2s ease;
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.5);
-}
-
-.fear-tooltip:hover .fear-tooltip-content {
- opacity: 1;
- visibility: visible;
- transform: translateX(-50%) translateY(-5px);
-}
-
-.fear-tooltip-title {
- font-weight: 600;
- color: #e2e8f0;
- margin-bottom: 0.75rem;
- font-size: 0.875rem;
-}
-
-.fear-tooltip-option {
- margin-bottom: 0.5rem;
- font-size: 0.8rem;
- color: #cbd5e1;
- line-height: 1.4;
-}
-
-.fear-tooltip-option strong {
- color: #e2e8f0;
-}
-
-.cursor-help {
- cursor: help;
-}
-
-.fear-buttons {
- display: flex;
- gap: 0.75rem;
- align-items: center;
-}
-
-.countdowns-section {
- display: flex;
- align-items: center;
- gap: 1rem;
-}
-
-.countdowns-list {
- display: flex;
- gap: 1rem;
- align-items: center;
-}
-
-.countdown-item-compact {
- background: rgba(51, 65, 85, 0.6);
- border: 1px solid var(--grey-light);
- border-radius: 0.375rem;
- padding: 0.375rem 0.5rem; /* Reduced from 0.5rem 0.75rem */
- min-width: 200px;
-}
-
-.countdown-controls {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 0.5rem; /* Reduced from 0.75rem */
-}
-
-.countdown-name {
- font-size: 0.875rem;
- font-weight: 500;
- color: #e2e8f0;
- min-width: 60px;
-}
-
-.countdown-symbols {
- display: flex;
- gap: 0.0625rem; /* Reduced from 0.125rem */
- flex-wrap: wrap;
- align-content: flex-start;
- row-gap: 0.125rem;
-}
-
-.countdown-symbol {
- font-size: 0.875rem; /* Reduced from 1rem */
- transition: all 0.2s ease;
- cursor: default;
-}
-
-.countdown-symbol.filled {
- color: var(--purple);
- text-shadow: 0 0 4px rgba(59, 130, 246, 0.5);
-}
-
-.countdown-symbol.empty {
- color: var(--grey);
-}
-
-.countdown-symbol:hover {
- transform: scale(1.1);
-}
-
-.countdown-buttons {
- display: flex;
- align-items: center;
- gap: 0.25rem;
-}
-
-/* Mobile responsive layout - consolidated with main mobile rules */
-
- .main-content {
- margin-top: 50px; /* Just space for fear tracker */
- /* margin-left handled in App.css for desktop/mobile */
- }
-
- .main-content-layout {
- margin-left: 0; /* No sidebar on mobile */
- }
-
- .compact-top-bar {
- flex-direction: column;
- gap: 1rem;
- padding: 0.75rem;
- }
-
- .fear-section,
- .countdowns-section {
- width: 100%;
- justify-content: center;
- padding: 0.0625rem;
- gap: 0.25rem;
- }
-
- .countdowns-list {
- flex-direction: column;
- gap: 0.5rem;
- width: 100%;
- }
-
- .countdown-item-compact {
- width: 100%;
- min-width: auto;
- }
-
- .container {
- padding: 0.5rem;
- }
-
- .main-content-layout {
- flex-direction: column;
- gap: 1rem;
- }
-
- .left-column {
- width: 100%;
- max-width: none;
- }
-
- .right-column {
- width: 100%;
- max-width: none;
- }
-
- .search-filter-controls {
- padding: 0.75rem;
- }
-
- .filter-section {
- flex-direction: column;
- gap: 0.5rem;
- }
-
- .filter-select {
- min-width: auto;
- width: 100%;
- }
-
- .data-management-section {
- flex-direction: column;
- gap: 0.5rem;
- }
-
- .data-management-btn {
- width: 100%;
- justify-content: center;
- }
-
- .bulk-clear-controls {
- flex-direction: column;
- gap: 0.5rem;
- }
-
- .bulk-clear-btn {
- width: 100%;
- justify-content: center;
- }
-
-
-.countdown-creator-compact {
- display: flex;
- align-items: center;
-}
-
-.countdown-creator-trigger {
- width: 2rem;
- height: 2rem;
- border-radius: 50%;
- background: var(--grey);
- color: #94a3b8;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- font-size: 1.25rem;
- font-weight: bold;
- transition: all 0.2s;
-}
-
-.countdown-creator-trigger:hover {
- background: var(--grey-light);
- color: #e2e8f0;
-}
-
-.countdown-form-compact {
- background: rgba(51, 65, 85, 0.9);
- border: 1px solid var(--grey-light);
- border-radius: 0.375rem;
- padding: 0.5rem;
-}
-
-.form-row {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-/* GM Control Panel Styles */
-.gm-control-panel {
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- padding: 1rem;
- margin-bottom: 1rem;
-}
-
-.control-panel-title {
- color: var(--text-primary);
- font-size: 1rem;
- font-weight: 600;
- margin-bottom: 1rem;
- border-bottom: 1px solid var(--border);
- padding-bottom: 0.5rem;
-}
-
-.trigger-group {
- margin-bottom: 1rem;
-}
-
-.trigger-group:last-child {
- margin-bottom: 0;
-}
-
-.trigger-group h5 {
- color: var(--text-secondary);
- font-size: 0.875rem;
- font-weight: 500;
- margin-bottom: 0.5rem;
-}
-
-.trigger-buttons {
- display: flex;
- gap: 0.5rem;
- flex-wrap: wrap;
-}
-
-
-
-
-
-.input-compact {
- background: #1e293b;
- border: 1px solid var(--grey);
- border-radius: 0.25rem;
- padding: 0.25rem 0.5rem;
- color: #f1f5f9;
- font-size: 0.875rem;
-}
-
-.input-compact:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 1px var(--purple);
-}
-
-.btn-compact {
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- font-size: 0.875rem;
- font-weight: 500;
- border: none;
- cursor: pointer;
- transition: all 0.2s;
-}
-
-.btn-compact.btn-primary {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.btn-compact.btn-primary:hover:not(:disabled) {
- background: var(--purple);
-}
-
-.btn-compact.btn-primary:disabled {
- background: var(--grey-light);
- cursor: not-allowed;
-}
-
-.btn-compact.btn-secondary {
- background: var(--grey-light);
- color: #e2e8f0;
-}
-
-.btn-compact.btn-secondary:hover {
- background: var(--grey);
-}
-
-.btn-compact.btn-danger {
- background: var(--red);
- color: var(--text-primary);
-}
-
-.btn-compact.btn-danger:hover {
- background: var(--red); /* Even darker red on hover */
-}
-
-/* Single Row Countdown Form */
-.countdown-form-single-row {
- display: flex;
- gap: 0.5rem;
- align-items: center;
- flex-wrap: wrap;
- background: rgba(51, 65, 85, 0.9);
- border: 1px solid var(--grey-light);
- border-radius: 0.375rem;
- padding: 0.5rem;
-}
-
-.countdown-form-single-row .input-compact {
- flex: 1;
- min-width: 120px;
- padding: 0.5rem;
- border: 1px solid var(--grey);
- border-radius: 0.375rem;
- font-size: 0.875rem;
- background: #1e293b;
- color: #f1f5f9;
-}
-
-.countdown-form-single-row .input-compact:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
-}
-
-.countdown-form-single-row select.input-compact {
- min-width: 140px;
-}
-
-.countdown-form-single-row .btn {
- flex-shrink: 0;
-}
-
-/* Horizontal Countdown Creator in Browser */
-.countdown-creator-horizontal {
- background: rgba(51, 65, 85, 0.9);
- border: 1px solid var(--grey-light);
- border-radius: 0.375rem;
- padding: 0.75rem;
- margin-bottom: 1rem;
-}
-
-.countdown-creator-header {
- margin-bottom: 0.5rem;
-}
-
-.countdown-creator-label {
- font-weight: 600;
- color: #e2e8f0;
- font-size: 0.875rem;
-}
-
-.countdown-form-horizontal {
- display: flex;
- gap: 0.5rem;
- align-items: center;
- flex-wrap: wrap;
-}
-
-.countdown-form-horizontal .input-compact {
- flex: 1;
- min-width: 120px;
- padding: 0.5rem;
- border: 1px solid var(--grey);
- border-radius: 0.375rem;
- font-size: 0.875rem;
- background: #1e293b;
- color: #f1f5f9;
-}
-
-.countdown-form-horizontal .input-compact:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
-}
-
-
-
-.countdown-form-horizontal select.input-compact {
- min-width: 140px;
-}
-
-.countdown-form-horizontal .btn {
- flex-shrink: 0;
-}
-
-/* Name input container and character counter */
-.name-input-container {
- position: relative;
- flex: 1;
- min-width: 120px;
-}
-
-.char-counter {
- position: absolute;
- top: -0.75rem;
- right: 0.5rem;
- font-size: 0.75rem;
- color: #94a3b8;
- background: #1e293b;
- padding: 0.125rem 0.25rem;
- border-radius: 0.25rem;
- border: 1px solid var(--grey);
-}
-
-/* Two-row countdown layout */
-.countdown-two-row {
- flex-direction: row !important; /* Changed back to row to allow buttons on the right */
- gap: 0.5rem !important;
-}
-
-.countdown-content-section {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
-}
-
-.countdown-top-row {
- width: 100%;
- justify-content: flex-start;
- gap: 0.5rem;
-}
-
-.countdown-bottom-row {
- width: 100%;
- display: flex;
- justify-content: flex-start;
- align-items: center;
-}
-
-.countdown-progress {
- display: flex;
- gap: 0.0625rem;
- justify-content: flex-start;
- flex-wrap: wrap;
-}
-
-/* Countdown error styling */
-.countdown-error {
- margin-top: 0.5rem;
- padding: 0.5rem;
- background: rgba(239, 68, 68, 0.1);
- border: 1px solid rgba(239, 68, 68, 0.3);
- border-radius: 0.375rem;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.error-text {
- color: var(--red);
- font-size: 0.875rem;
- font-weight: 500;
-}
-
-/* Card actions for compact list items */
-.card-actions {
- display: flex;
- align-items: center;
- justify-content: center;
- gap: 0.25rem;
- margin-left: auto;
- position: relative;
-}
-
-
-.countdown-control-buttons {
- display: flex;
- gap: 0.25rem; /* Same gap as the main container */
- align-items: center;
-}
-
-/* Compact adversary layout - uses countdown structure for perfect alignment */
-.simple-list-row.compact.adversary .countdown-control-buttons {
- display: flex !important;
- flex-direction: column !important;
- gap: 0.5rem !important; /* Tighter vertical spacing */
- align-items: flex-end !important; /* Right-align the trackers */
-}
-
-/* Compact countdown layout - horizontal buttons */
-.simple-list-row.compact.countdown .countdown-control-buttons {
- display: flex !important;
- flex-direction: row !important;
- gap: 0.25rem !important;
- align-items: center !important;
-}
-
-.simple-list-row.compact.countdown .card-actions {
- display: flex !important;
- flex-direction: row !important;
- align-items: center !important;
- justify-content: flex-end !important;
- gap: 0.5rem !important;
-}
-
-.simple-list-row.compact.adversary .card-actions {
- display: flex !important;
- flex-direction: row !important;
- align-items: center !important;
- justify-content: flex-end !important;
- gap: 0.5rem !important;
-}
-
-.simple-list-row.compact.adversary .hp-section,
-.simple-list-row.compact.adversary .stress-section,
-.simple-list-row.compact.adversary .difficulty-section {
- display: flex;
- align-items: center;
- gap: 0.75rem;
-}
-
-.countdown-delete-space {
- width: 0; /* No space when not in edit mode */
- height: 1.5rem;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: width 0.2s ease; /* Smooth transition */
-}
-
-/* When in edit mode, expand to show delete button */
-.simple-list-row.edit-mode .countdown-delete-space {
- width: 1.5rem; /* Reserve space for delete button */
-}
-
-.card-actions .btn {
- min-width: 1.5rem;
- height: 1.5rem;
- padding: 0;
- font-size: 0.75rem;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
- text-align: center !important;
- line-height: 1 !important;
-}
-
-.drag-handle {
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 2rem;
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: grab;
- color: var(--text-secondary);
- font-size: 0.75rem;
- background: var(--bg-secondary);
- /* Removed vertical line border-right */
- transition: all 0.2s ease;
- z-index: 10;
- /* Allow both dragging and scrolling */
- touch-action: manipulation;
- pointer-events: auto;
-}
-
-.drag-handle:hover {
- background: var(--bg-hover);
- /* Removed purple border-color */
-}
-
-.drag-handle:active {
- cursor: grabbing;
-}
-
-.drag-handle-compact {
- cursor: grab;
- color: #94a3b8;
- font-size: 0.875rem;
- padding: 0.125rem;
- position: absolute;
- right: 0;
- top: 0;
- bottom: 0;
- width: 2rem; /* 32px wide drag area */
- z-index: 10;
- background: transparent;
- border-radius: 0;
- opacity: 0;
- transition: opacity 0.2s ease;
- display: flex;
- align-items: center;
- justify-content: center;
- border-left: 1px solid transparent;
- transition: all 0.2s ease;
-}
-
-.drag-handle-compact:hover {
- opacity: 1;
- background: rgba(148, 163, 184, 0.1); /* Subtle highlight */
- border-left-color: var(--border);
-}
-
-.drag-handle-compact:active {
- cursor: grabbing;
-}
-
-.main-content-layout {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 0.5rem;
- min-height: 600px;
- margin-top: 48px; /* Space for fear tracker */
-}
-
-/* Removed conflicting grid layout - using flex layout from App.css instead */
-
-/* Main content stays fixed - sidebar overlays */
-
-.left-column {
- background: var(--bg-card);
- border-radius: 0.5rem;
- padding: 1rem;
- overflow-y: auto;
- max-height: 80vh;
-}
-
-.right-column {
- background: var(--bg-card);
- border-radius: 0.5rem;
- padding: 1rem;
- overflow-y: auto;
- max-height: 80vh;
-}
-
-/* Database and Creator Display Styles */
-.database-display,
-.creator-display {
- height: 100%;
- overflow-y: auto;
-}
-
-.database-display h2,
-.creator-display h2 {
- color: var(--text-primary);
- font-size: 1.5rem;
- font-weight: 600;
- margin-bottom: 1.5rem;
- border-bottom: 2px solid var(--purple);
- padding-bottom: 0.5rem;
-}
-
-/* Simplified Card Styles */
-.simplified-adversary-card,
-.simplified-environment-card {
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.75rem;
- padding: 1.5rem;
- margin-bottom: 1rem;
- transition: all 0.2s ease;
-}
-
-.simplified-adversary-card:hover,
-.simplified-environment-card:hover {
- border-color: var(--purple);
- box-shadow: 0 4px 12px rgba(139, 92, 246, 0.1);
-}
-
-.card-header {
- display: flex;
- justify-content: space-between;
- align-items: flex-start;
- margin-bottom: 1rem;
-}
-
-.card-title-section {
- flex: 1;
-}
-
-.card-title {
- font-size: 1.25rem;
- font-weight: 600;
- color: var(--text-primary);
- margin: 0 0 0.5rem 0;
-}
-
-.card-badges {
- display: flex;
- gap: 0.5rem;
- flex-wrap: wrap;
-}
-
-.tier-badge,
-.type-badge,
-.difficulty-badge {
- padding: 0.25rem 0.5rem;
- border-radius: 0.375rem;
- font-size: 0.75rem;
- font-weight: 500;
- background: var(--bg-card);
- border: 1px solid var(--border);
-}
-
-.tier-badge {
- color: var(--text-secondary);
-}
-
-.card-actions {
- display: flex;
- gap: 0.5rem;
- flex-shrink: 0;
-}
-
-.card-description {
- color: var(--text-secondary);
- margin-bottom: 1rem;
- line-height: 1.5;
-}
-
-.card-stats {
- display: flex;
- gap: 1.5rem;
- margin-bottom: 1rem;
- flex-wrap: wrap;
-}
-
-.stat-item {
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.stat-label {
- color: var(--text-secondary);
- font-size: 0.875rem;
-}
-
-.stat-value {
- color: var(--text-primary);
- font-weight: 500;
-}
-
-.expanded-details {
- border-top: 1px solid var(--border);
- padding-top: 1rem;
- margin-top: 1rem;
-}
-
-.detail-section {
- margin-bottom: 1.5rem;
-}
-
-.detail-title {
- font-size: 1rem;
- font-weight: 600;
- color: var(--text-primary);
- margin-bottom: 0.5rem;
-}
-
-.detail-content {
- color: var(--text-secondary);
- line-height: 1.5;
-}
-
-.feature-item {
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- padding: 1rem;
- margin-bottom: 0.75rem;
-}
-
-.feature-header {
- display: flex;
- align-items: center;
- gap: 0.75rem;
- margin-bottom: 0.5rem;
-}
-
-.feature-name {
- font-weight: 600;
- color: var(--text-primary);
-}
-
-.feature-type {
- padding: 0.125rem 0.375rem;
- border-radius: 0.25rem;
- font-size: 0.75rem;
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.feature-description {
- color: var(--text-secondary);
- line-height: 1.5;
-}
-
-.feature-gm-prompt {
- margin-top: 0.75rem;
- padding: 0.75rem;
- background: var(--bg-light);
- border-left: 3px solid var(--purple);
- border-radius: 0.25rem;
-}
-
-.gm-label {
- font-weight: 600;
- color: var(--purple);
-}
-
-.threshold-item {
- display: inline-block;
- margin-right: 1rem;
-}
-
-.threshold-label {
- font-weight: 500;
- color: var(--text-secondary);
-}
-
-.selected-item-display {
- height: 100%;
- position: relative;
-}
-
-.close-selection-btn {
- position: absolute;
- top: 0.5rem;
- right: 0.5rem;
- background: var(--red);
- color: var(--text-primary);
- border: none;
- border-radius: 50%;
- width: 2rem;
- height: 2rem;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 1rem;
- transition: all 0.2s ease;
- z-index: 10;
-}
-
-.close-selection-btn:hover {
- background: var(--red);
- transform: scale(1.1);
-}
-
-
-/* Simple List Styles */
-.simple-lists-container {
- display: flex;
- flex-direction: column;
- gap: 1rem;
-}
-
-
-/* Section Headers */
-.section-header {
- margin-bottom: 0.75rem;
- position: relative;
- padding-left: 1rem; /* Add space from left border */
-}
-
-.section-header::before {
- content: '';
- position: absolute;
- top: 0;
- left: -1.25rem;
- right: -1.25rem;
- height: 0;
- border-top: 1px solid var(--border);
- opacity: 0.6;
-}
-
-/* Hide top border for the first section */
-.game-section:first-child .section-header::before {
- display: none;
-}
-
-.section-title {
- font-size: 0.875rem;
- font-weight: 600;
- color: var(--text-secondary);
- margin: 0 0 0.5rem 0;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- padding-top: 0.75rem;
- margin-top: 0;
-}
-
-
-
-
-
-
-
-.simple-list {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.simple-list-row {
- display: flex;
- align-items: center;
- padding: 0.5rem; /* Reduced from 0.75rem */
- padding-left: 1rem; /* More space between left edge and content */
- padding-right: 0.5rem; /* Reduced from 0.75rem */
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- cursor: pointer;
- transition: all 0.2s ease;
- position: relative;
-}
-
-/* When in edit mode, add space for drag handle */
-.simple-list-row.edit-mode {
- padding-left: 2.25rem; /* Space for drag handle, closer to content */
-}
-
-/* Special height for countdown rows to accommodate two rows */
-.simple-list-row.countdown-two-row {
- align-items: stretch;
- min-height: 4rem; /* Ensure enough height for two rows */
-}
-
-/* Compact countdown specific styles - title and pips stacked like the old design */
-.simple-list-row.compact.countdown .row-content {
- display: flex;
- align-items: center;
- gap: 1rem;
- width: 100%;
-}
-
-.simple-list-row.compact.countdown .row-main {
- flex: 1;
- min-width: 0;
- display: flex;
- flex-direction: column;
- gap: 0.0625rem; /* Much tighter spacing between name and pips */
- align-items: flex-start;
-}
-
-.simple-list-row.compact.countdown .countdown-symbols {
- display: flex;
- gap: 0.125rem;
- flex-wrap: wrap;
- align-content: flex-start;
- row-gap: 0.125rem;
-}
-
-.simple-list-row.compact.countdown .countdown-symbol {
- font-size: 0.875rem;
- transition: all 0.2s ease;
- cursor: default;
- color: var(--text-secondary);
-}
-
-.simple-list-row.compact.countdown .countdown-symbol.filled {
- color: var(--purple);
- text-shadow: 0 0 4px rgba(59, 130, 246, 0.5);
-}
-
-.simple-list-row.compact.countdown .countdown-symbol.empty {
- color: var(--text-secondary);
- opacity: 0.6;
-}
-
-.simple-list-row.compact.countdown .countdown-symbol:hover {
- transform: scale(1.1);
-}
-
-.simple-list-row.compact.countdown .row-meta {
- flex-shrink: 0;
-}
-
-.simple-list-row.compact.countdown .progress-badge {
- font-size: 0.75rem;
- font-weight: 600;
- color: var(--text-secondary);
- background: var(--bg-card);
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- border: 1px solid var(--border);
-}
-
-.simple-list-row.compact.adversary .hp-symbols,
-.simple-list-row.compact.adversary .stress-symbols {
- display: flex;
- gap: 0.125rem;
- flex-wrap: wrap;
- align-content: flex-start;
- row-gap: 0.125rem;
-}
-
-.simple-list-row.compact.adversary .hp-controls,
-.simple-list-row.compact.adversary .stress-controls {
- display: flex;
- align-items: center;
- gap: 0.25rem;
-}
-
-/* HP and Stress symbol colors */
-.simple-list-row.compact.adversary .hp-symbols .countdown-symbol.filled {
- color: var(--red);
- text-shadow: 0 0 4px rgba(220, 38, 38, 0.5);
-}
-
-.simple-list-row.compact.adversary .stress-symbols .countdown-symbol.filled {
- color: #f59e0b;
- text-shadow: 0 0 4px rgba(245, 158, 11, 0.5);
-}
-
-/* Overflow icon styling */
-.simple-list-row.compact.adversary .stress-symbols .countdown-symbol.overflow {
- color: var(--red);
- text-shadow: 0 0 4px rgba(220, 38, 38, 0.5);
- border: 1px solid var(--red);
- border-radius: 50%;
- background: rgba(220, 38, 38, 0.1);
-}
-
-.simple-list-row:hover {
- background: var(--bg-card);
- /* Removed purple border-color */
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
-}
-
-.simple-list-row:hover .drag-handle {
- background: var(--bg-hover);
- /* Removed purple border-color */
-}
-
-.simple-list-row.selected {
- background: var(--purple);
- border-color: var(--purple);
- color: var(--text-primary);
-}
-
-.simple-list-row.selected .row-title,
-.simple-list-row.selected .description-text,
-.simple-list-row.selected .no-description {
- color: var(--text-primary);
-}
-
-.simple-list-row.selected .tier-badge,
-.simple-list-row.selected .type-badge {
- background: var(--grey-dark);
- color: var(--text-primary);
-}
-
-/* Dead adversary styling */
-.simple-list-row.dead {
- opacity: 0.7;
- background: rgba(107, 114, 128, 0.15);
- border-color: rgba(107, 114, 128, 0.4);
- position: relative;
-}
-
-.simple-list-row.dead .row-title,
-.simple-list-row.dead .row-meta,
-.simple-list-row.dead .row-status {
- color: rgba(156, 163, 175, 0.8);
-}
-
-/* Dead text overlay (no badge container) */
-.simple-list-row.dead::after {
- content: 'DEAD';
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- color: var(--text-primary); /* Full white for better visibility */
- font-size: 1rem;
- font-weight: 600;
- text-transform: uppercase;
- letter-spacing: 0.05em;
- z-index: 10;
- pointer-events: none;
- text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.5);
-}
-
-/* Cross-out lines for dead adversaries */
-.simple-list-row.dead::before {
- content: '';
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: repeating-linear-gradient(
- 45deg,
- transparent,
- transparent 2px,
- rgba(107, 114, 128, 0.3) 2px,
- rgba(107, 114, 128, 0.3) 4px
- );
- pointer-events: none;
- z-index: 5;
-}
-
-/* Mute HP and stress trackers when dead */
-.simple-list-row.dead .hp-symbols .countdown-symbol,
-.simple-list-row.dead .stress-symbols .countdown-symbol {
- opacity: 0.4;
- color: var(--text-secondary) !important; /* Override red/yellow colors when dead */
-}
-
-/* Override hover effects for dead adversaries to keep pips colorless */
-.simple-list-row.dead:hover .hp-symbols .countdown-symbol,
-.simple-list-row.dead:hover .stress-symbols .countdown-symbol {
- color: var(--text-secondary) !important; /* Keep colorless even on hover */
-}
-
-/* Remove all glow effects and colors for dead adversary pips */
-.simple-list-row.dead .hp-symbols .countdown-symbol.filled,
-.simple-list-row.dead .stress-symbols .countdown-symbol.filled {
- color: var(--text-secondary) !important;
- text-shadow: none !important;
-}
-
-.simple-list-row.dead:hover .hp-symbols .countdown-symbol.filled,
-.simple-list-row.dead:hover .stress-symbols .countdown-symbol.filled {
- color: var(--text-secondary) !important;
- text-shadow: none !important;
-}
-
-.simple-list-row.dead .hp-controls button,
-.simple-list-row.dead .stress-controls button {
- opacity: 0.5;
-}
-
-/* Only disable stress controls when dead, keep HP controls functional */
-.simple-list-row.dead .stress-controls button {
- pointer-events: none; /* Disable stress buttons for dead adversaries */
-}
-
-/* Database Browser Column Layout */
-.database-browser-row {
- display: flex;
- align-items: center;
- width: 100%;
-}
-
-.database-browser-row .column-name {
- width: 12rem; /* w-48 = 192px */
- flex-shrink: 0;
-}
-
-.database-browser-row .column-tier {
- width: 5rem; /* w-20 = 80px */
- flex-shrink: 0;
- display: flex;
- justify-content: flex-start;
-}
-
-.database-browser-row .column-type {
- width: 6rem; /* w-24 = 96px */
- flex-shrink: 0;
- display: flex;
- justify-content: center;
-}
-
-.database-browser-row .column-description {
- flex: 1;
- min-width: 0;
-}
-
-.database-browser-row .column-action {
- width: 5rem; /* w-20 = 80px */
- flex-shrink: 0;
- display: flex;
- justify-content: center;
-}
-
-
-
-/* Search and Filter Controls */
-.search-filter-controls {
- display: flex;
- flex-direction: column;
- gap: 1rem;
- margin-bottom: 1rem;
- padding: 1rem;
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
-}
-
-.search-section {
- display: flex;
- justify-content: center;
-}
-
-.search-input {
- width: 100%;
- max-width: 400px;
- padding: 0.75rem;
- border: 1px solid var(--border);
- border-radius: 0.375rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.875rem;
- transition: all 0.2s ease;
-}
-
-.search-input:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
-}
-
-.search-input::placeholder {
- color: var(--text-secondary);
-}
-
-.filter-section {
- display: flex;
- gap: 0.75rem;
- justify-content: center;
- flex-wrap: wrap;
-}
-
-.filter-select {
- padding: 0.5rem 0.75rem;
- border: 1px solid var(--border);
- border-radius: 0.375rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.875rem;
- cursor: pointer;
- transition: all 0.2s ease;
- min-width: 120px;
-}
-
-.filter-select:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
-}
-
-.filter-select option {
- background: var(--bg-dark);
- color: var(--text-primary);
-}
-
-.results-info {
- text-align: center;
- color: var(--text-secondary);
- font-size: 0.875rem;
- font-style: italic;
-}
-
-.data-management-section {
- display: flex;
- gap: 0.75rem;
- justify-content: center;
- flex-wrap: wrap;
-}
-
-.data-management-btn {
- padding: 0.5rem 1rem;
- border: none;
- border-radius: 0.375rem;
- font-size: 0.875rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- text-decoration: none;
-}
-
-.export-btn {
- background: var(--success);
- color: var(--text-primary);
-}
-
-.export-btn:hover {
- background: var(--purple); /* Darker indigo on hover */
- transform: translateY(-1px);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-}
-
-.import-btn {
- background: var(--grey);
- color: var(--text-primary);
-}
-
-.import-btn:hover {
- background: var(--grey-dark); /* Darker muted gray on hover */
- transform: translateY(-1px);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-}
-
-.undo-btn {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.undo-btn:hover:not(.disabled) {
- background: var(--primary-dark);
- transform: translateY(-1px);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-}
-
-.undo-btn.disabled {
- background: var(--text-secondary);
- cursor: not-allowed;
- opacity: 0.6;
-}
-
-.redo-btn {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.redo-btn:hover:not(.disabled) {
- background: var(--primary-dark);
- transform: translateY(-1px);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-}
-
-.redo-btn.disabled {
- background: var(--text-secondary);
- cursor: not-allowed;
- opacity: 0.6;
-}
-
-/* Error Boundary */
-.error-boundary {
- display: flex;
- align-items: center;
- justify-content: center;
- min-height: 100vh;
- padding: 2rem;
- background: var(--bg-dark);
-}
-
-.error-content {
- max-width: 600px;
- padding: 2rem;
- background: var(--bg-card);
- border: 1px solid var(--red);
- border-radius: 0.75rem;
- text-align: center;
-}
-
-.error-content h2 {
- color: var(--red);
- margin-bottom: 1rem;
- font-size: 1.5rem;
-}
-
-.error-content p {
- color: var(--text-primary);
- margin-bottom: 1.5rem;
-}
-
-.error-details {
- margin: 1.5rem 0;
- text-align: left;
-}
-
-.error-details summary {
- cursor: pointer;
- color: var(--text-secondary);
- font-weight: 500;
- margin-bottom: 0.5rem;
-}
-
-.error-stack {
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.375rem;
- padding: 1rem;
- font-size: 0.75rem;
- color: var(--text-secondary);
- overflow-x: auto;
- white-space: pre-wrap;
- max-height: 200px;
-}
-
-.error-actions {
- display: flex;
- gap: 1rem;
- justify-content: center;
- flex-wrap: wrap;
-}
-
-.error-btn {
- padding: 0.75rem 1.5rem;
- border: none;
- border-radius: 0.375rem;
- font-size: 0.875rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
-}
-
-.error-btn.primary {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.error-btn.primary:hover {
- background: var(--primary-dark);
- transform: translateY(-1px);
-}
-
-.error-btn.secondary {
- background: var(--text-secondary);
- color: var(--text-primary);
-}
-
-.error-btn.secondary:hover {
- background: var(--text-primary);
- transform: translateY(-1px);
-}
-
-/* Loading Spinner */
-.loading-spinner-container {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- gap: 1rem;
- padding: 2rem;
-}
-
-.loading-spinner {
- position: relative;
- display: inline-block;
-}
-
-.spinner-ring {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- border: 3px solid transparent;
- border-top: 3px solid currentColor;
- border-radius: 50%;
- animation: spin 1s linear infinite;
-}
-
-.loading-text {
- color: var(--text-secondary);
- font-size: 0.875rem;
- margin: 0;
- text-align: center;
-}
-
-@keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
-}
-
-/* Empty State and Add Button Styles */
-.empty-state {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 2rem 1.5rem;
- background: var(--bg-card);
- border: 2px dashed var(--border);
- border-radius: 1rem;
- text-align: center;
- transition: all 0.2s ease;
-}
-
-.empty-state.clickable {
- cursor: pointer;
- position: relative;
- overflow: hidden;
-}
-
-.empty-state.clickable:hover {
- border-color: var(--purple);
- background: var(--bg-light);
- transform: translateY(-2px);
- box-shadow: 0 8px 25px rgba(139, 92, 246, 0.15);
-}
-
-.empty-state.clickable:active {
- transform: translateY(0);
- box-shadow: 0 4px 15px rgba(139, 92, 246, 0.2);
-}
-
-.empty-state-content {
- max-width: 400px;
-}
-
-.empty-state-icon {
- font-size: 2.5rem;
- margin-bottom: 0.75rem;
- opacity: 0.7;
-}
-
-.empty-state-title {
- font-size: 1.125rem;
- font-weight: 600;
- color: var(--text-primary);
- margin-bottom: 0.5rem;
-}
-
-.empty-state-description {
- color: var(--text-secondary);
- margin-bottom: 1rem;
- line-height: 1.5;
-}
-
-.empty-state-hint {
- color: var(--purple);
- font-size: 0.875rem;
- font-weight: 500;
- opacity: 0.8;
- font-style: italic;
-}
-
-.empty-state-actions {
- display: flex;
- gap: 1rem;
- justify-content: center;
- flex-wrap: wrap;
-}
-
-.empty-state-btn {
- display: inline-flex;
- align-items: center;
- gap: 0.5rem;
- padding: 0.75rem 1.5rem;
- border: none;
- border-radius: 0.5rem;
- font-size: 0.875rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- text-decoration: none;
-}
-
-.empty-state-btn.primary {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.empty-state-btn.primary:hover {
- background: var(--primary-dark);
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(139, 92, 246, 0.3);
-}
-
-.empty-state-btn.secondary {
- background: var(--bg-light);
- color: var(--text-primary);
- border: 1px solid var(--border);
-}
-
-.empty-state-btn.secondary:hover {
- background: var(--border);
- transform: translateY(-2px);
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
-}
-
-.btn-icon {
- font-size: 1rem;
-}
-
-/* Add Entry Row - Styled like list entries */
-.add-entry-row {
- background: transparent !important;
- border: 1px dashed var(--text-secondary) !important;
- cursor: pointer;
- transition: all 0.2s ease;
- margin-top: 0.5rem; /* Same spacing as between list items */
- opacity: 0.6;
-}
-
-.add-entry-row:hover {
- background: var(--bg-card) !important;
- border-color: var(--text-primary) !important;
- opacity: 1;
-}
-
-.add-entry-title {
- color: var(--text-secondary) !important;
- font-weight: normal;
- font-size: 0.875rem;
-}
-
-/* Modal Tab Buttons */
-.modal-header-actions {
- display: flex;
- gap: 0.5rem;
- margin-bottom: 1.5rem;
- padding: 0.5rem;
- background: var(--bg-light);
- border-radius: 0.5rem;
- justify-content: center;
-}
-
-.modal-tab-btn {
- padding: 0.5rem 1rem;
- border: none;
- border-radius: 0.375rem;
- font-size: 0.875rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- background: transparent;
- color: var(--text-secondary);
-}
-
-.modal-tab-btn:hover {
- background: var(--bg-card);
- color: var(--text-primary);
-}
-
-.modal-tab-btn.active {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.modal-tab-btn.active:hover {
- background: var(--primary-dark);
-}
-
-/* Loading states for components */
-.loading-overlay {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- bottom: 0;
- background: rgba(0, 0, 0, 0.5);
- display: flex;
- align-items: center;
- justify-content: center;
- z-index: 10;
- border-radius: inherit;
-}
-
-.loading-skeleton {
- background: linear-gradient(90deg, var(--bg-light) 25%, var(--bg-card) 50%, var(--bg-light) 75%);
- background-size: 200% 100%;
- animation: loading 1.5s infinite;
- border-radius: 0.375rem;
-}
-
-@keyframes loading {
- 0% { background-position: 200% 0; }
- 100% { background-position: -200% 0; }
-}
-
-/* Combined Action Bar */
-.combined-action-bar {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
- padding: 0.75rem;
- background: transparent;
-}
-
-.action-bar-left {
- display: flex;
- align-items: center;
- flex: 1; /* Take up remaining space */
-}
-
-.action-bar-right {
- display: flex;
- gap: 0.25rem;
- flex-shrink: 0; /* Don't shrink, maintain button sizes */
-}
-
-.action-bar-right:not(:empty) {
- margin-left: 0.5rem; /* Gap only when right section has content */
-}
-
-.action-bar-title {
- font-weight: 600;
- color: var(--text-primary);
- font-size: 0.875rem;
-}
-
-.add-entry-btn {
- background: transparent;
- border: 1px dashed var(--text-secondary);
- border-radius: 0.375rem;
- padding: 0.375rem 0.75rem;
- color: var(--text-secondary);
- font-size: 0.75rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- width: 100%; /* Fill the available width */
- text-align: center;
-}
-
-.add-entry-btn:hover {
- background: var(--bg-card);
- border-color: var(--purple);
- color: var(--purple);
-}
-
-/* Bulk Clear Controls (now part of action bar) */
-.bulk-clear-controls {
- display: flex;
- gap: 0.75rem;
- margin-bottom: 1rem;
- padding: 0.75rem;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- justify-content: center;
-}
-
-.bulk-clear-btn {
- padding: 0.375rem 0.75rem;
- border: 1px solid var(--text-secondary);
- border-radius: 0.375rem;
- font-size: 0.75rem;
- font-weight: 500;
- cursor: pointer;
- transition: all 0.2s ease;
- display: inline-flex;
- align-items: center;
- justify-content: center;
- text-decoration: none;
- background: transparent;
- color: var(--text-secondary);
- white-space: nowrap;
- min-width: 4.5rem; /* Fixed width to prevent layout shift */
-}
-
-.bulk-clear-btn:hover {
- border-color: var(--text-primary);
- color: var(--text-primary);
-}
-
-
-
-/* Confirmation state styles - More red after first click */
-.bulk-clear-btn.confirming {
- background: var(--red);
- border-color: var(--red);
- color: var(--text-primary);
- animation: pulse 1.5s ease-in-out infinite;
-}
-
-.bulk-clear-btn.confirming:hover {
- background: var(--red);
- border-color: var(--red);
- transform: translateY(-1px);
- box-shadow: 0 4px 12px rgba(239, 68, 68, 0.4);
-}
-
-.confirm-icon {
- font-size: 1rem;
- font-weight: bold;
-}
-
-.confirm-text {
- font-weight: 500;
-}
-
-.button-icon {
- font-size: 1rem;
-}
-
-.button-text {
- font-weight: 500;
-}
-
-@keyframes pulse {
- 0%, 100% {
- opacity: 1;
- }
- 50% {
- opacity: 0.8;
- }
-}
-
-/* New left-positioned dead indicator as removal button */
-.dead-indicator-left {
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 0.5rem;
- position: relative;
- background: none;
- border: none;
- cursor: pointer;
- padding: 0;
- transition: all 0.2s ease;
- min-width: 3rem;
- min-height: 1.5rem;
-}
-
-.dead-label {
- color: var(--red);
- font-size: 0.75rem;
- font-weight: 700;
- background: rgba(239, 68, 68, 0.1);
- border: 1px solid rgba(239, 68, 68, 0.3);
- border-radius: 0.25rem;
- padding: 0.125rem 0.375rem;
- text-transform: uppercase;
- letter-spacing: 0.025em;
- transition: all 0.2s ease;
- pointer-events: none;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
-}
-
-.dead-clear-btn {
- opacity: 0;
- color: var(--red);
- font-size: 1rem;
- font-weight: bold;
- transition: all 0.2s ease;
- pointer-events: none;
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%) scale(0.8);
-}
-
-.dead-indicator-left:hover .dead-label {
- opacity: 0;
- transform: translate(-50%, -50%) scale(0.8);
-}
-
-.dead-indicator-left:hover .dead-clear-btn {
- opacity: 1;
- transform: translate(-50%, -50%) scale(1);
- color: var(--red);
-}
-
-.drag-handle {
- cursor: grab;
- opacity: 0.6;
- transition: opacity 0.2s ease;
- color: var(--text-secondary);
- font-size: 1.2rem;
- padding: 0.25rem;
- border-radius: 0.25rem;
-}
-
-.drag-handle:hover {
- opacity: 1;
- background: var(--bg-card);
-}
-
-.drag-handle:active {
- cursor: grabbing;
-}
-
-.row-content {
- flex: 1;
- display: flex;
- flex-direction: row;
- align-items: center;
- gap: 0.375rem; /* Reduced from 0.5rem */
-}
-
-.row-header {
- display: flex;
- align-items: center;
- justify-content: center;
- position: relative;
-}
-
-.row-title.centered {
- text-align: center;
- flex: 1;
-}
-
-.row-status-line {
- display: flex;
- align-items: center;
- justify-content: space-between;
- gap: 1rem;
-}
-
-.row-main {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- gap: 0.25rem;
-}
-
-.row-title {
- font-size: 1.1rem;
- font-weight: 600;
- color: var(--text-primary);
- margin: 0;
-}
-
-.row-meta {
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
-}
-
-.type-badge {
- padding: 0.125rem 0.375rem;
- border-radius: 0.25rem;
- font-size: 0.7rem;
- font-weight: 400;
- background: transparent;
- color: var(--text-muted);
- border: none;
-}
-
-.tier-badge {
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- font-size: 0.75rem;
- font-weight: 500;
- background: var(--bg-card);
- color: var(--text-secondary);
- border: 1px solid var(--border);
-}
-
-.difficulty-badge {
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- font-size: 0.75rem;
- font-weight: 500;
- border: 1px solid var(--border);
-}
-
-.difficulty-easy {
- background: #22c55e;
- color: var(--text-primary);
- border-color: #16a34a;
-}
-
-.difficulty-medium {
- background: #eab308;
- color: var(--text-primary);
- border-color: #ca8a04;
-}
-
-.difficulty-hard {
- background: #f97316;
- color: var(--text-primary);
- border-color: #ea580c;
-}
-
-.difficulty-deadly {
- background: var(--red);
- color: var(--text-primary);
- border-color: var(--red);
-}
-
-.difficulty-unknown {
- background: var(--bg-card);
- color: var(--text-secondary);
- border-color: var(--border);
-}
-
-.row-description {
- min-height: 1.5rem;
-}
-
-.description-text {
- font-size: 0.9rem;
- color: var(--text-secondary);
- margin: 0;
- line-height: 1.4;
-}
-
-.no-description {
- font-size: 0.9rem;
- color: var(--text-secondary);
- font-style: italic;
-}
-
-.row-status {
- display: flex;
- gap: 1rem;
- font-size: 0.8rem;
- color: var(--text-secondary);
-}
-
-.hp-indicator,
-.stress-indicator {
- padding: 0.25rem 0.5rem;
- background: var(--bg-card);
- border-radius: 0.25rem;
- border: 1px solid var(--border);
-}
-
-/* Quick Control Styles */
-.hp-controls, .stress-controls {
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.quick-controls {
- display: flex;
- gap: 0.25rem;
-}
-
-.quick-btn {
- width: 1.5rem;
- height: 1.5rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-card);
- color: var(--text-primary);
- font-size: 0.75rem;
- font-weight: bold;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.2s ease;
-}
-
-.quick-btn:hover {
- background: var(--bg-hover);
- border-color: var(--purple);
-}
-
-.quick-btn:active {
- transform: scale(0.95);
-}
-
-.quick-damage {
- background: rgba(239, 68, 68, 0.2);
- border-color: rgba(239, 68, 68, 0.5);
-}
-
-.quick-damage:hover {
- background: rgba(239, 68, 68, 0.3);
- border-color: rgba(239, 68, 68, 0.7);
-}
-
-.quick-heal {
- background: rgba(34, 197, 94, 0.2);
- border-color: rgba(34, 197, 94, 0.5);
-}
-
-.quick-heal:hover {
- background: rgba(34, 197, 94, 0.3);
- border-color: rgba(34, 197, 94, 0.7);
-}
-
-.quick-stress-up {
- background: rgba(245, 158, 11, 0.2);
- border-color: rgba(245, 158, 11, 0.5);
-}
-
-.quick-stress-up:hover {
- background: rgba(245, 158, 11, 0.3);
- border-color: rgba(245, 158, 11, 0.7);
-}
-
-.quick-stress-down {
- background: rgba(59, 130, 246, 0.2);
- border-color: rgba(59, 130, 246, 0.5);
-}
-
-.quick-stress-down:hover {
- background: rgba(59, 130, 246, 0.3);
- border-color: rgba(59, 130, 246, 0.7);
-}
-
-/* Damage Input Styles */
-.damage-input-section {
- margin: 1rem 0;
- padding: 1rem;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
-}
-
-.damage-input-container {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.damage-input-label {
- color: var(--text-primary);
- font-size: 0.9rem;
-}
-
-.damage-input-controls {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-.damage-input-field {
- flex: 1;
- padding: 0.5rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.9rem;
-}
-
-.damage-input-field:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
-}
-
-.damage-apply-btn {
- padding: 0.5rem 1rem;
- background: var(--purple);
- color: var(--text-primary);
- border: none;
- border-radius: 0.25rem;
- cursor: pointer;
- font-weight: 500;
- transition: all 0.2s ease;
-}
-
-.damage-apply-btn:hover {
- background: var(--primary-dark);
- transform: translateY(-1px);
-}
-
-.damage-thresholds-info {
- display: flex;
- gap: 1rem;
- font-size: 0.8rem;
- color: var(--text-secondary);
-}
-
-.threshold-info {
- padding: 0.25rem 0.5rem;
- background: var(--bg-dark);
- border-radius: 0.25rem;
- border: 1px solid var(--border);
-}
-
-/* Compact Damage Input for List View */
-.quick-damage-input {
- display: flex;
- gap: 0.25rem;
- align-items: center;
-}
-
-.damage-input-compact {
- width: 3rem;
- height: 1.5rem;
- padding: 0.25rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.75rem;
- text-align: center;
-}
-
-.damage-input-compact:focus {
- outline: none;
- border-color: var(--purple);
-}
-
-/* Remove number input arrows */
-.damage-input-compact::-webkit-outer-spin-button,
-.damage-input-compact::-webkit-inner-spin-button {
- -webkit-appearance: none;
- margin: 0;
-}
-
-.damage-input-compact[type=number] {
- -moz-appearance: textfield;
- appearance: textfield;
-}
-
-.damage-indicators {
- display: flex;
- align-items: center;
- gap: 0.25rem;
-}
-
-.damage-drop {
- display: flex;
- align-items: center;
- justify-content: center;
- cursor: pointer;
- color: var(--text-muted);
- transition: color 0.2s ease;
-}
-
-.damage-drop:hover {
- color: var(--text-primary);
-}
-
-.damage-drop.active {
- color: #dc2626;
-}
-
-.damage-submit-btn {
- display: flex;
- align-items: center;
- justify-content: center;
- width: 1.5rem;
- height: 1.5rem;
- background: var(--bg-muted);
- border: none;
- border-radius: 0.25rem;
- color: var(--text-muted);
- cursor: pointer;
- transition: all 0.2s ease;
-}
-
-.damage-submit-btn:hover:not(:disabled) {
- background: var(--bg-card);
- color: var(--text-primary);
-}
-
-.damage-submit-btn:disabled {
- background: var(--bg-muted);
- color: var(--text-muted);
- cursor: not-allowed;
-}
-
-/* Countdown Trigger Controls */
-.countdown-trigger-controls {
- display: flex;
- gap: 0.25rem;
- align-items: center;
- flex-wrap: wrap;
- padding: 0.375rem 0.75rem;
- background: transparent;
- border: none;
- margin-bottom: 0.25rem;
- justify-content: center;
-}
-
-.trigger-btn {
- padding: 0.25rem 0.375rem;
- border: none;
- border-radius: 0.25rem;
- background: transparent;
- color: var(--text-color);
- font-size: 0.75rem;
- font-weight: 500;
- cursor: pointer;
- transition: none;
- text-align: center;
- white-space: nowrap;
-}
-
-.trigger-btn:hover {
- background: var(--bg-muted);
- opacity: 0.8;
-}
-
-/* Color just the fear and hope icons */
-.trigger-btn.simple-fear svg,
-.trigger-btn.success-fear svg,
-.trigger-btn.fail-fear svg {
- color: var(--purple); /* Standard app purple for fear */
-}
-
-.trigger-btn.simple-hope svg,
-.trigger-btn.success-hope svg,
-.trigger-btn.fail-hope svg,
-.trigger-btn.critical-success svg {
- color: #f59e0b; /* Same gold as stress pips */
-}
-
-.trigger-btn.toggle-long-term {
- /* Remove specific styling to match other buttons */
-}
-
-/* Long-term rest controls */
-.long-term-rest-controls {
- display: flex;
- gap: 0.5rem;
- padding: 0.75rem 1rem;
- background: var(--bg-muted);
- border-bottom: 1px solid var(--border);
- margin-bottom: 0.5rem;
-}
-
-/* Countdown pip colors based on type */
-.countdown-symbol.filled[data-countdown-type="progress"],
-.countdown-symbol.filled[data-countdown-type="dynamic-progress"],
-.countdown-symbol.filled[data-countdown-type="simple-hope"] {
- color: #f59e0b !important; /* Gold for hope/progress */
- text-shadow: 0 0 4px rgba(245, 158, 11, 0.5) !important;
-}
-
-.countdown-symbol.filled[data-countdown-type="consequence"],
-.countdown-symbol.filled[data-countdown-type="dynamic-consequence"],
-.countdown-symbol.filled[data-countdown-type="simple-fear"] {
- color: var(--purple) !important; /* Purple for fear/consequence */
- text-shadow: 0 0 4px rgba(59, 130, 246, 0.5) !important;
-}
-
-.countdown-symbol.filled[data-countdown-type="long-term"],
-.countdown-symbol.filled[data-countdown-type="standard"] {
- color: var(--text-secondary) !important; /* Neutral for simple/long-term */
- text-shadow: 0 0 4px rgba(163, 163, 163, 0.5) !important; /* Subtle grey glow */
-}
-
-/* Styling for countdowns at max value - color based on type */
-.simple-list-row.compact.countdown.at-max {
- background: var(--bg-card);
- border-radius: 0 0.25rem 0.25rem 0; /* Only round right corners */
-}
-
-/* Fear/Consequence countdowns at max - purple highlighting */
-.simple-list-row.compact.countdown.at-max[data-countdown-type="consequence"],
-.simple-list-row.compact.countdown.at-max[data-countdown-type="dynamic-consequence"],
-.simple-list-row.compact.countdown.at-max[data-countdown-type="simple-fear"] {
- position: relative;
-}
-
-.simple-list-row.compact.countdown.at-max[data-countdown-type="consequence"]::before,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="dynamic-consequence"]::before,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="simple-fear"]::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 4px;
- background: var(--purple);
- border-radius: 0 2px 2px 0;
-}
-
-.simple-list-row.compact.countdown.at-max[data-countdown-type="consequence"] .row-title,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="dynamic-consequence"] .row-title,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="simple-fear"] .row-title {
- font-weight: 600;
-}
-
-/* Hope/Progress countdowns at max - gold highlighting */
-.simple-list-row.compact.countdown.at-max[data-countdown-type="progress"],
-.simple-list-row.compact.countdown.at-max[data-countdown-type="dynamic-progress"],
-.simple-list-row.compact.countdown.at-max[data-countdown-type="simple-hope"] {
- position: relative;
-}
-
-.simple-list-row.compact.countdown.at-max[data-countdown-type="progress"]::before,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="dynamic-progress"]::before,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="simple-hope"]::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 4px;
- background: #f59e0b;
- border-radius: 0 2px 2px 0;
-}
-
-.simple-list-row.compact.countdown.at-max[data-countdown-type="progress"] .row-title,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="dynamic-progress"] .row-title,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="simple-hope"] .row-title {
- font-weight: 600;
-}
-
-/* Neutral countdowns at max - grey highlighting */
-.simple-list-row.compact.countdown.at-max[data-countdown-type="long-term"],
-.simple-list-row.compact.countdown.at-max[data-countdown-type="standard"] {
- position: relative;
-}
-
-.simple-list-row.compact.countdown.at-max[data-countdown-type="long-term"]::before,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="standard"]::before {
- content: '';
- position: absolute;
- left: 0;
- top: 0;
- bottom: 0;
- width: 4px;
- background: var(--text-secondary);
- border-radius: 0 2px 2px 0;
-}
-
-.simple-list-row.compact.countdown.at-max[data-countdown-type="long-term"] .row-title,
-.simple-list-row.compact.countdown.at-max[data-countdown-type="standard"] .row-title {
- font-weight: 600;
-}
-
-.simple-list-row.compact.countdown.at-max {
- background: var(--bg-card);
- border-radius: 0.25rem;
-}
-
-.damage-apply-btn-compact {
- width: 1.5rem;
- height: 1.5rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--purple);
- color: var(--text-primary);
- font-size: 0.75rem;
- font-weight: bold;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.2s ease;
-}
-
-.damage-apply-btn-compact:hover {
- background: var(--primary-dark);
- transform: scale(1.05);
-}
-
-/* HP & Stress Display - Simple Numbers */
-.hp-display, .stress-display {
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.hp-number.clickable {
- cursor: pointer;
- padding: 0.25rem 0.5rem;
- border-radius: 0.25rem;
- transition: all 0.2s ease;
-}
-
-.hp-number.clickable:hover {
- background: var(--bg-hover);
- color: var(--purple);
-}
-
-.stress-number {
- color: var(--text-secondary);
-}
-
-.stress-plus-btn {
- width: 1.25rem;
- height: 1.25rem;
- border: 1px solid var(--text-secondary);
- border-radius: 50%;
- background: transparent;
- color: var(--text-secondary);
- font-size: 0.75rem;
- font-weight: bold;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.2s ease;
-}
-
-.stress-plus-btn:hover {
- border-color: var(--warning);
- color: var(--warning);
- background: var(--warning);
- color: var(--text-primary);
-}
-
-.row-actions {
- display: flex;
- gap: 0.5rem;
- align-items: center;
- margin-left: auto;
- opacity: 0;
- transition: opacity 0.2s ease;
-}
-
-.simple-list-row:hover .row-actions {
- opacity: 1;
-}
-
-.visibility-btn,
-.edit-btn,
-.delete-btn {
- width: 2rem;
- height: 2rem;
- border: none;
- border-radius: 0.25rem;
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 0.9rem;
- transition: all 0.2s ease;
-}
-
-.visibility-btn.visible {
- background: #22c55e;
- color: var(--text-primary);
-}
-
-.visibility-btn.hidden {
- background: var(--bg-secondary);
- color: var(--text-secondary);
-}
-
-.edit-btn {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.delete-btn {
- background: var(--red);
- color: var(--text-primary);
-}
-
-.visibility-btn:hover,
-.edit-btn:hover,
-.delete-btn:hover {
- transform: scale(1.1);
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
-}
-
-.input {
- padding: 0.5rem;
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- background: var(--bg-card);
- color: var(--text-primary);
- font-size: 0.875rem;
- width: 100%;
-}
-
-.input:focus {
- outline: none;
- border-color: var(--purple);
-}
-
-.grid {
- display: grid;
- gap: 1rem;
-}
-
-.grid-2 {
- grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
-}
-
-.grid-3 {
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
-}
-
-.flex {
- display: flex;
- align-items: center;
- gap: 0.5rem;
-}
-
-.flex-between {
- justify-content: space-between;
-}
-
-.flex-center {
- justify-content: center;
-}
-
-.text-center {
- text-align: center;
-}
-
-.mb-2 {
- margin-bottom: 0.5rem;
-}
-
-.mb-4 {
- margin-bottom: 1rem;
-}
-
-.mt-4 {
- margin-top: 1rem;
-}
-
-.gap-2 {
- gap: 0.5rem;
-}
-
-.gap-4 {
- gap: 1rem;
-}
-
-.text-lg {
- font-size: 1.125rem;
-}
-
-.text-xl {
- font-size: 1.25rem;
-}
-
-.text-2xl {
- font-size: 1.5rem;
-}
-
-.text-3xl {
- font-size: 1.875rem;
-}
-
-.font-bold {
- font-weight: 700;
-}
-
-.text-secondary {
- color: var(--text-secondary);
-}
-
-.badge {
- padding: 0.25rem 0.5rem;
- border-radius: 9999px;
- font-size: 0.75rem;
- font-weight: 500;
-}
-
-.badge-primary {
- background: var(--purple);
- color: var(--text-primary);
-}
-
-.badge-secondary {
- background: var(--grey);
- color: var(--text-primary);
-}
-
-.badge-danger {
- background: var(--red);
- color: var(--text-primary);
-}
-
-.badge-success {
- background: var(--success);
- color: var(--text-primary);
-}
-
-.progress-bar {
- width: 100%;
- height: 1rem;
- background: var(--bg-card);
- border-radius: 0.5rem;
- overflow: hidden;
-}
-
-.progress-fill {
- height: 100%;
- background: var(--purple);
- transition: width 0.3s ease;
-}
-
-.progress-fill.danger {
- background: var(--red);
-}
-
-.progress-fill.warning {
- background: var(--warning);
-}
-
-.progress-fill.success {
- background: var(--success);
-}
-
-@media (max-width: 768px) {
- .container {
- padding: 0.5rem;
- }
-
- .grid-2,
- .grid-3 {
- grid-template-columns: 1fr;
- }
-}
-
-/* UnifiedButton Component Styles */
-.unified-button {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- font-weight: 500;
- cursor: pointer;
- border: 2px solid;
- transition: all 0.2s ease-in-out;
- font-family: inherit;
- text-decoration: none;
- outline: none;
-}
-
-.unified-button:focus {
- outline: none;
- box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.3);
-}
-
-.unified-button:disabled {
- opacity: 0.5;
- cursor: not-allowed;
-}
-
-/* Size variants */
-.unified-button--size-xs {
- padding: 0.25rem 0.5rem;
- font-size: 0.75rem;
- gap: 0.25rem;
-}
-
-.unified-button--size-sm {
- padding: 0.375rem 0.75rem;
- font-size: 0.875rem;
- gap: 0.375rem;
-}
-
-.unified-button--size-md {
- padding: 0.5rem 1rem;
- font-size: 0.875rem;
- gap: 0.5rem;
-}
-
-.unified-button--size-lg {
- padding: 0.75rem 1.5rem;
- font-size: 1rem;
- gap: 0.5rem;
-}
-
-.unified-button--size-xl {
- padding: 1rem 2rem;
- font-size: 1.125rem;
- gap: 0.75rem;
-}
-
-/* Shape variants */
-.unified-button--shape-square {
- border-radius: 0.375rem;
-}
-
-.unified-button--shape-round {
- border-radius: 0.5rem;
- min-width: 2.5rem;
- height: 2.5rem;
- padding: 0 0.75rem;
-}
-
-.unified-button--shape-round.unified-button--size-xs {
- min-width: 1.5rem;
- height: 1.5rem;
- padding: 0 0.5rem;
-}
-
-.unified-button--shape-round.unified-button--size-sm {
- min-width: 2rem;
- height: 2rem;
- padding: 0 0.625rem;
-}
-
-.unified-button--shape-round.unified-button--size-md {
- min-width: 2.5rem;
- height: 2.5rem;
- padding: 0 0.75rem;
-}
-
-.unified-button--shape-round.unified-button--size-lg {
- min-width: 3rem;
- height: 3rem;
- padding: 0 1rem;
-}
-
-.unified-button--shape-round.unified-button--size-xl {
- min-width: 4rem;
- height: 4rem;
- padding: 0 1.5rem;
-}
-
-.unified-button--shape-pill {
- border-radius: 9999px;
-}
-
-.unified-button--shape-sharp {
- border-radius: 0;
-}
-
-/* Action variants (default colors) */
-.unified-button--action-add {
- background: var(--success);
- border-color: var(--success);
- color: var(--text-primary);
-}
-
-.unified-button--action-add:hover:not(:disabled) {
- background: var(--success-dark);
- border-color: var(--success-dark);
-}
-
-.unified-button--action-edit {
- background: var(--purple);
- border-color: var(--purple);
- color: var(--text-primary);
-}
-
-.unified-button--action-edit:hover:not(:disabled) {
- background: #1d4ed8;
- border-color: #1d4ed8;
-}
-
-.unified-button--action-delete {
- background: var(--red);
- border-color: var(--red);
- color: var(--text-primary);
-}
-
-.unified-button--action-delete:hover:not(:disabled) {
- background: var(--red); /* Darker red on hover */
- border-color: var(--red);
-}
-
-.unified-button--action-remove {
- background: #ea580c;
- border-color: #ea580c;
- color: var(--text-primary);
-}
-
-.unified-button--action-remove:hover:not(:disabled) {
- background: #c2410c;
- border-color: #c2410c;
-}
-
-.unified-button--action-toggle {
- background: #9333ea;
- border-color: #9333ea;
- color: var(--text-primary);
-}
-
-.unified-button--action-toggle:hover:not(:disabled) {
- background: var(--purple);
- border-color: var(--purple);
-}
-
-.unified-button--action-close {
- background: #6b7280;
- border-color: #6b7280;
- color: var(--text-primary);
-}
-
-.unified-button--action-close:hover:not(:disabled) {
- background: var(--grey-dark);
- border-color: var(--grey-dark);
-}
-
-.unified-button--action-confirm {
- background: var(--success);
- border-color: var(--success);
- color: var(--text-primary);
-}
-
-.unified-button--action-confirm:hover:not(:disabled) {
- background: var(--success-dark);
- border-color: var(--success-dark);
-}
-
-.unified-button--action-default {
- background: #6b7280;
- border-color: #6b7280;
- color: var(--text-primary);
-}
-
-.unified-button--action-default:hover:not(:disabled) {
- background: var(--grey-dark);
- border-color: var(--grey-dark);
-}
-
-/* Color variants (override action colors) */
-.unified-button--color-primary {
- background: var(--purple);
- border-color: var(--purple);
- color: var(--text-primary);
-}
-
-.unified-button--color-primary:hover:not(:disabled) {
- background: var(--primary-dark);
- border-color: var(--primary-dark);
-}
-
-.unified-button--color-secondary {
- background: var(--grey);
- border-color: var(--grey);
- color: var(--text-primary);
-}
-
-.unified-button--color-secondary:hover:not(:disabled) {
- background: var(--grey-dark); /* Darker muted gray on hover */
- border-color: var(--grey-dark);
-}
-
-.unified-button--color-success {
- background: var(--success);
- border-color: var(--success);
- color: var(--text-primary);
-}
-
-.unified-button--color-success:hover:not(:disabled) {
- background: var(--success-dark);
- border-color: var(--success-dark);
-}
-
-.unified-button--color-danger {
- background: var(--red);
- border-color: var(--red);
- color: var(--text-primary);
-}
-
-.unified-button--color-danger:hover:not(:disabled) {
- background: var(--red); /* Darker red on hover */
- border-color: var(--red);
-}
-
-.unified-button--color-warning {
- background: var(--warning);
- border-color: var(--warning);
- color: var(--text-primary);
-}
-
-.unified-button--color-warning:hover:not(:disabled) {
- background: var(--grey-dark); /* Darker muted gray on hover */
- border-color: var(--grey-dark);
-}
-
-.unified-button--color-info {
- background: #0891b2;
- border-color: #0891b2;
- color: var(--text-primary);
-}
-
-.unified-button--color-info:hover:not(:disabled) {
- background: #0e7490;
- border-color: #0e7490;
-}
-
-/* Button content */
-.unified-button__icon {
- font-size: 1em;
- line-height: 1;
-}
-
-.unified-button__text {
- line-height: 1;
-}
-
-/* Clear buttons section */
-.clear-buttons-section {
- margin-bottom: 1rem;
- padding: 0.75rem;
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
-}
-
-.clear-buttons-row {
- display: flex;
- gap: 0.5rem;
- margin-bottom: 0.5rem;
-}
-
-.clear-buttons-row:last-child {
- margin-bottom: 0;
-}
-
-.clear-buttons-section .btn {
- flex: 1;
- justify-content: center;
-}
-
-/* Database Browser Add Button */
-.item-add-button {
- text-align: center;
- padding: 0.25rem;
- width: 50px;
-}
-
-.item-add-button .btn {
- min-width: 1.5rem;
- width: 1.5rem;
- height: 1.5rem;
- font-size: 0.875rem;
- font-weight: bold;
- padding: 0;
- border-radius: 50%;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.item-add-button .btn:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
-}
-
-/* Database Browser Compact Rows */
-.browser-table tbody tr {
- height: 2.5rem;
-}
-
-.browser-table td {
- padding: 0.375rem 0.5rem;
- vertical-align: middle;
-}
-
-.browser-table th {
- padding: 0.5rem;
- vertical-align: middle;
-}
-
-/* Database Browser Category Icons */
-.item-category {
- text-align: center;
- width: 50px;
-}
-
-.category-icon {
- width: 1.25rem !important;
- height: 1.25rem !important;
- display: inline-block !important;
- color: var(--text-primary) !important;
- transition: all 0.2s ease !important;
- background: none !important;
- border: none !important;
- border-radius: 0 !important;
- padding: 0 !important;
- margin: 0 !important;
-}
-
-.category-icon:hover {
- transform: scale(1.1) !important;
- filter: brightness(1.2) !important;
-}
-
-/* FontAwesome specific styling */
-.item-category .fa-dagger {
- color: var(--red) !important;
-}
-
-.item-category .fa-leaf {
- color: #059669 !important;
-}
-
-/* Clean up old icon references */
-.item-category .fa-shield,
-.item-category .fa-map,
-.item-category .fa-crosshairs {
- display: none !important;
-}
-
-/* Database Browser Combined Type Column */
-.item-type {
- text-align: left;
- padding: 0.375rem 0.5rem;
- vertical-align: middle;
-}
-
-/* Tier column - centered */
-.tier-column {
- text-align: center;
- padding: 0.375rem 0.5rem;
- vertical-align: middle;
-}
-
-.type-content {
- display: flex;
- align-items: center;
- gap: 0.5rem;
- line-height: 1;
-}
-
-.type-content .category-icon {
- width: 1rem !important;
- height: 1rem !important;
- display: inline-flex !important;
- align-items: center !important;
- justify-content: center !important;
- color: var(--text-primary) !important;
- transition: all 0.2s ease !important;
- background: none !important;
- border: none !important;
- border-radius: 0 !important;
- padding: 0 !important;
- margin: 0 !important;
- flex-shrink: 0;
- line-height: 1;
-}
-
-.type-content .type-text {
- font-size: 0.875rem;
- color: var(--text-primary);
- line-height: 1;
- display: flex;
- align-items: center;
-}
-
-.edit-button-section .btn,
-.add-button-section .btn {
- min-width: 3rem;
- width: 3rem;
- height: 3rem;
- font-size: 1.5rem;
- font-weight: bold;
- padding: 0;
- border-radius: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- text-align: center;
- flex-shrink: 0;
- transition: all 0.2s ease;
-}
-
-.edit-button-section .btn:hover,
-.add-button-section .btn:hover {
- transform: translateY(-1px);
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
-}
-
-/* Ensure edit mode controls don't inherit large button styles */
-.edit-mode-controls > .btn:first-child {
- min-width: 3rem !important;
- width: 3rem !important;
- height: 3rem !important;
- font-size: 1.5rem !important;
- font-weight: bold !important;
- padding: 0 !important;
- border-radius: 0 !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
- text-align: center !important;
- flex-shrink: 0 !important;
- flex: 0 0 3rem !important;
-}
-
-/* FontAwesome specific styling */
-.item-category .fa-skull {
- color: var(--red) !important;
-}
-
-.item-category .fa-leaf {
- color: #059669 !important;
-}
-
-/* FontAwesome specific styling */
-.item-category .fa-user {
- color: var(--red) !important;
-}
-
-.item-category .fa-leaf {
- color: #059669 !important;
-}
-
-/* Lucide React icon styling */
-.category-icon svg {
- width: 1.25rem !important;
- height: 1.25rem !important;
- display: inline-block !important;
- transition: all 0.2s ease !important;
- background: none !important;
- border: none !important;
- border-radius: 0 !important;
- padding: 0 !important;
- margin: 0 !important;
-}
-
-/* Adversary icon (Sword) - no color */
-.category-icon svg[title="Adversary"] {
- color: var(--text-primary) !important;
-}
-
-/* Environment icon (TreePine) - no color */
-.category-icon svg[title="Environment"] {
- color: var(--text-primary) !important;
-}
-
-.category-icon:hover svg {
- transform: scale(1.1) !important;
- filter: brightness(1.2) !important;
-}
-
-/* Clean up old FontAwesome styles - no longer needed */
-.item-category .fa-shield,
-.item-category .fa-map,
-.item-category .fa-crosshairs,
-.item-category .fa-skull,
-.item-category .fa-user,
-.item-category .fa-leaf {
- display: none !important;
-}
-
-/* Center tier and difficulty columns */
-.browser-table th:nth-child(4),
-.browser-table td:nth-child(4),
-.browser-table th:nth-child(5),
-.browser-table td:nth-child(5) {
- text-align: center !important;
-}
-
-/* Countdowns Section - Top of GameBoard */
-.countdowns-section-top {
- margin-bottom: 1.5rem;
- width: 100%;
-}
-
-/* Countdown-specific styling */
-.countdown-badge {
- background: var(--purple);
- color: var(--text-primary);
- padding: 0.25rem 0.5rem;
- border-radius: 0.375rem;
- font-size: 0.75rem;
- font-weight: 500;
-}
-
-.description-badge {
- background: var(--bg-secondary);
- color: var(--text-secondary);
- padding: 0.25rem 0.5rem;
- border-radius: 0.375rem;
- font-size: 0.75rem;
- font-weight: 500;
- max-width: 200px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.countdown-symbols {
- display: flex;
- align-items: center;
- gap: 0.25rem;
- margin-top: 0.5rem;
- flex-wrap: wrap;
- align-content: flex-start;
- row-gap: 0.25rem;
-}
-
-.countdown-symbol {
- font-size: 1.25rem;
- line-height: 1;
- transition: all 0.2s ease;
-}
-
-.countdown-symbol.filled {
- color: var(--purple);
-}
-
-.countdown-symbol.empty {
- color: var(--text-secondary);
- opacity: 0.6;
-}
-
-.countdown-symbols-section {
- margin-bottom: 1.5rem;
-}
-
-/* Countdown Trigger Badges */
-.countdown-trigger-badge {
- margin-top: 0.5rem;
- padding: 0.25rem 0.5rem;
- background: rgba(139, 92, 246, 0.1);
- border: 1px solid rgba(139, 92, 246, 0.3);
- border-radius: 0.25rem;
- font-size: 0.75rem;
- color: var(--purple);
- display: flex;
- align-items: center;
- gap: 0.25rem;
-}
-
-.countdown-trigger-badge.compact {
- margin-top: 0.25rem;
- font-size: 0.7rem;
- padding: 0.125rem 0.375rem;
-}
-
-.countdown-trigger-badge .trigger-label {
- font-weight: 600;
- color: var(--text-secondary);
-}
-
-.countdown-trigger-badge .trigger-condition {
- font-weight: 500;
- color: var(--purple);
-}
-
-.creator-form {
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
- overflow-y: auto;
- width: 100%;
- flex: 1;
-}
-
-.creator-layout {
- display: grid;
- grid-template-columns: 1fr 1fr;
- gap: 2rem;
- height: calc(100vh - 200px);
-}
-
-.preview-column {
- display: flex;
- flex-direction: column;
- gap: 1rem;
- overflow-y: auto;
-}
-
-.preview-column h3 {
- color: var(--text-primary);
- margin-bottom: 1rem;
- font-size: 1.1rem;
-}
-
-/* Creator Left Column */
-.creator-left-column {
- height: 100%;
- display: flex;
- flex-direction: column;
- width: 100%;
- background: var(--bg-primary);
- border-radius: 0.5rem;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
-}
-
-.creator-left-column .creator-header {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 0.5rem;
- border-bottom: 1px solid var(--border-color);
- background: var(--bg-secondary);
-}
-
-.creator-left-column .creator-header h3 {
- margin: 0;
- color: var(--text-primary);
-}
-
-/* Preview Right Column */
-.preview-right-column {
- height: 100%;
- overflow-y: auto;
- background: var(--bg-primary);
- border-radius: 0.5rem;
- box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
- display: flex;
- flex-direction: column;
-}
-
-.preview-right-column .creator-header {
- display: flex;
- justify-content: center;
- align-items: center;
- padding: 0.5rem;
- border-bottom: 1px solid var(--border-color);
- background: var(--bg-secondary);
- margin-bottom: 1rem;
-}
-
-.preview-right-column .creator-header h3 {
- margin: 0;
- color: var(--text-primary);
-}
-
-.preview-section {
- flex: 1;
- overflow-y: auto;
- padding: 1rem;
-}
-
-.preview-right-column h3 {
- color: var(--text-primary);
- margin-bottom: 1rem;
- font-size: 1.1rem;
-}
-
-.form-section {
- background: var(--bg-secondary);
- padding: 0.125rem;
- border-radius: 0.125rem;
- border: 1px solid var(--border-color);
- margin-bottom: 0.125rem;
-}
-
-.form-section h3 {
- color: var(--text-primary);
- margin-bottom: 1rem;
- font-size: 1.1rem;
-}
-
-.form-section h4 {
- color: var(--text-primary);
- margin-bottom: 0.5rem;
- font-size: 1rem;
-}
-
-.form-section h5 {
- color: var(--text-secondary);
- margin-bottom: 0.5rem;
- font-size: 0.9rem;
-}
-
-.form-row {
- display: flex;
- gap: 0.25rem;
- margin-bottom: 0.25rem;
-}
-
-.form-group {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 0.25rem;
-}
-
-/* Experience form specific sizing */
-.experience-form .form-row .form-group:first-child {
- flex: 3;
-}
-
-.experience-form .form-row .form-group:nth-child(2) {
- flex: 1;
- max-width: 80px;
-}
-
-.form-group label {
- font-size: 0.875rem;
- font-weight: 600;
- color: var(--text-secondary);
-}
-
-.form-group input,
-.form-group select,
-.form-group textarea {
- padding: 0.5rem;
- border: 1px solid var(--border-color);
- border-radius: 0.25rem;
- background: var(--bg-primary);
- color: var(--text-primary);
- font-size: 0.875rem;
-}
-
-.form-group input:focus,
-.form-group select:focus,
-.form-group textarea:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 2px rgba(139, 92, 246, 0.2);
-}
-
-.feature-form {
- background: var(--bg-primary);
- padding: 0.25rem;
- border-radius: 0.25rem;
- border: 1px solid var(--border-color);
- margin-bottom: 0.25rem;
-}
-
-.feature-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
-}
-
-.mechanic-form {
- background: rgba(139, 92, 246, 0.05);
- padding: 1rem;
- border-radius: 0.25rem;
- border: 1px solid rgba(139, 92, 246, 0.2);
- margin-bottom: 1rem;
-}
-
-.mechanic-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
-}
-
-.mechanics-section {
- margin-top: 1rem;
- padding-top: 1rem;
- border-top: 1px solid var(--border-color);
-}
-
-.remove-button,
-.add-mechanic-button,
-.add-feature-button {
- padding: 0.5rem 1rem;
- border: none;
- border-radius: 0.25rem;
- font-size: 0.875rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.2s ease;
-}
-
-.remove-button {
- background: rgba(239, 68, 68, 0.1);
- color: #ef4444;
- border: 1px solid rgba(239, 68, 68, 0.3);
-}
-
-.remove-button:hover {
- background: rgba(239, 68, 68, 0.2);
- border-color: rgba(239, 68, 68, 0.5);
-}
-
-.add-mechanic-button,
-.add-feature-button {
- background: rgba(139, 92, 246, 0.1);
- color: var(--purple);
- border: 1px solid rgba(139, 92, 246, 0.3);
-}
-
-.add-mechanic-button:hover,
-.add-feature-button:hover {
- background: rgba(139, 92, 246, 0.2);
- border-color: rgba(139, 92, 246, 0.5);
-}
-
-.experience-form {
- background: var(--bg-primary);
- padding: 0.25rem;
- border-radius: 0.25rem;
- border: 1px solid var(--border-color);
- margin-bottom: 0.25rem;
-}
-
-.experience-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 1rem;
-}
-
-.add-experience-button {
- padding: 0.5rem 1rem;
- border: none;
- border-radius: 0.25rem;
- font-size: 0.875rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.2s ease;
- background: rgba(139, 92, 246, 0.1);
- color: var(--purple);
- border: 1px solid rgba(139, 92, 246, 0.3);
-}
-
-.add-experience-button:hover {
- background: rgba(139, 92, 246, 0.2);
- border-color: rgba(139, 92, 246, 0.5);
-}
-
-/* Style the new form inputs (last form-row in each section) */
-.form-section .form-row:last-of-type .form-group input,
-.form-section .form-row:last-of-type .form-group textarea,
-.form-section .form-row:last-of-type .form-group select {
- border-color: var(--border);
- background: var(--bg-card);
- border-width: 2px;
-}
-
-.form-section .form-row:last-of-type .form-group input:focus,
-.form-section .form-row:last-of-type .form-group textarea:focus,
-.form-section .form-row:last-of-type .form-group select:focus {
- border-color: var(--purple);
- box-shadow: 0 0 0 2px rgba(79, 70, 229, 0.1);
- background: var(--bg-primary);
-}
-
-.add-experience-button,
-.add-feature-button {
- background: var(--purple);
- color: white;
- border: 1px solid var(--purple);
- padding: 0.5rem 1rem;
- border-radius: 0.25rem;
- cursor: pointer;
- font-size: 0.875rem;
- font-weight: 500;
- margin-top: 0.5rem;
- transition: all 0.2s ease;
-}
-
-.add-experience-button:hover,
-.add-feature-button:hover {
- background: var(--purple-dark);
- border-color: var(--purple-dark);
-}
-
-.remove-button-small {
- background: rgba(239, 68, 68, 0.1);
- color: #ef4444;
- border: 1px solid rgba(239, 68, 68, 0.3);
- border-radius: 0.25rem;
- padding: 0.25rem;
- font-size: 0.75rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.2s ease;
- width: 1.5rem;
- height: 1.5rem;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.remove-button-small:hover:not(.disabled) {
- background: rgba(239, 68, 68, 0.2);
- border-color: rgba(239, 68, 68, 0.5);
-}
-
-.remove-button-small.disabled {
- background: rgba(107, 114, 128, 0.1);
- color: rgba(107, 114, 128, 0.5);
- border-color: rgba(107, 114, 128, 0.2);
- cursor: not-allowed;
-}
-
-.submit-button {
- background: rgba(34, 197, 94, 0.1);
- color: #22c55e;
- border: 1px solid rgba(34, 197, 94, 0.3);
- border-radius: 0.25rem;
- padding: 0.5rem 1rem;
- font-size: 0.875rem;
- font-weight: 600;
- cursor: pointer;
- transition: all 0.2s ease;
- margin-left: auto;
-}
-
-.submit-button:hover:not(:disabled) {
- background: rgba(34, 197, 94, 0.2);
- border-color: rgba(34, 197, 94, 0.5);
-}
-
-.submit-button:disabled {
- background: rgba(107, 114, 128, 0.1);
- color: #6b7280;
- border-color: rgba(107, 114, 128, 0.3);
- cursor: not-allowed;
-}
-
-.preview-section {
- background: var(--bg-primary);
- padding: 1rem;
- border-radius: 0.25rem;
- border: 1px solid var(--border-color);
- max-height: 400px;
- overflow-y: auto;
-}
-
-.preview-section pre {
- margin: 0;
- font-size: 0.75rem;
- color: var(--text-primary);
- white-space: pre-wrap;
- word-break: break-word;
-}
-
-.card-preview {
- margin-bottom: 1.5rem;
-}
-
-.card-preview h4 {
- margin-bottom: 0.5rem;
- color: var(--text-secondary);
- font-size: 0.875rem;
- font-weight: 600;
-}
-
-.card-preview:last-child {
- margin-bottom: 0;
-}
-
-/* Mockup Container */
-.mockup-container {
- height: 100%;
- overflow-y: auto;
- background: var(--bg-primary);
-}
-
-.mockup-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- padding: 1rem;
- border-bottom: 1px solid var(--border-color);
- background: var(--bg-secondary);
-}
-
-.mockup-header h3 {
- margin: 0;
- color: var(--text-primary);
-}
-
-.close-mockup {
- background: none;
- border: none;
- font-size: 1.5rem;
- color: var(--text-secondary);
- cursor: pointer;
- padding: 0.25rem;
- border-radius: 0.25rem;
-}
-
-.close-mockup:hover {
- background: rgba(239, 68, 68, 0.1);
- color: #ef4444;
-}
-
-.countdowns-list {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
- width: 100%;
-}
-
-/* Ensure countdown cards use the same structure as List component */
-.countdowns-section-top {
- width: 100%;
- min-width: 100%;
-}
-
-/* Debug borders removed - countdowns now use same structure as List component */
-
-
-
-.countdown-expanded {
- margin-top: 1rem;
- padding: 1rem;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
-}
-
-/* Countdown-specific styling */
-.countdown-badge {
- background: var(--purple);
- color: var(--text-primary);
- padding: 0.25rem 0.5rem;
- border-radius: 0.375rem;
- font-size: 0.75rem;
- font-weight: 500;
-}
-
-.countdown-progress {
- display: flex;
- align-items: center;
- gap: 0.125rem;
- flex-shrink: 0;
-}
-
-.countdown-symbol {
- font-size: 0.875rem;
- line-height: 1;
- transition: all 0.2s ease;
-}
-
-.countdown-symbol.filled {
- color: var(--purple);
-}
-
-.countdown-symbol.empty {
- color: var(--text-secondary);
- opacity: 0.6;
-}
-
-.description-badge {
- background: var(--bg-secondary);
- color: var(--text-secondary);
- padding: 0.25rem 0.5rem;
- border-radius: 0.375rem;
- font-size: 0.75rem;
- font-weight: 500;
- max-width: 200px;
- overflow: hidden;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-
-/* Compact countdown creator */
-.countdown-compact {
- padding: 0.5rem;
-}
-
-.countdown-row {
- display: flex;
- gap: 0.5rem;
- align-items: end;
- flex-wrap: wrap;
-}
-
-.countdown-row .form-group {
- flex: 1;
- min-width: 120px;
-}
-
-.countdown-row .form-group:last-child {
- flex: 0 0 auto;
-}
-
-.countdown-row label {
- font-size: 0.75rem;
- margin-bottom: 0.25rem;
-}
-
-.countdown-row .form-input {
- font-size: 0.875rem;
- padding: 0.375rem 0.5rem;
-}
-
-
-
-/* Updated compact countdown creator */
-.countdown-compact {
- padding: 0.5rem;
-}
-
-.countdown-stack {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.countdown-stack .form-input {
- font-size: 0.875rem;
- padding: 0.5rem;
-}
-
-.countdown-row {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-.countdown-row .form-input {
- flex: 1;
-}
-
-.countdown-row .form-input:first-child {
- flex: 0 0 80px;
-}
-
-.countdown-row button {
- flex: 0 0 auto;
-}
-
-/* Browser Component Redesign */
-.browser-wrapper {
- display: flex;
- flex-direction: column;
- gap: 1rem;
- padding: 1rem;
- background: var(--bg-primary);
- border-radius: 0.5rem;
- height: 100%;
- max-width: 100%;
- overflow: hidden;
-}
-
-.browser-top-row {
- display: flex;
- align-items: center;
- gap: 0.75rem;
- padding: 0.75rem;
-}
-
-.browser-search-input {
- flex: 1;
- padding: 0.75rem;
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- color: var(--text-primary);
- font-size: 1rem;
-}
-
-.browser-search-input:focus {
- outline: none;
- border-color: var(--purple);
- box-shadow: 0 0 0 2px rgba(139, 92, 246, 0.2);
-}
-
-.browser-top-row .btn {
- flex-shrink: 0;
-}
-
-.browser-back-btn {
- min-width: 40px !important;
- width: 40px !important;
- padding: 0.5rem !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
-}
-
-.browser-add-btn {
- min-width: 40px !important;
- width: 40px !important;
- padding: 0.5rem !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
- background: var(--purple) !important;
- color: var(--text-primary) !important;
- border-color: var(--purple) !important;
-}
-
-.browser-add-btn:hover {
- background: var(--primary-dark) !important;
- border-color: var(--primary-dark) !important;
-}
-
-.table-add-btn {
- min-width: 32px !important;
- width: 32px !important;
- padding: 0.375rem !important;
- display: flex !important;
- align-items: center !important;
- justify-content: center !important;
- background: var(--purple) !important;
- color: var(--text-primary) !important;
- border-color: var(--purple) !important;
-}
-
-.table-add-btn:hover {
- background: var(--primary-dark) !important;
- border-color: var(--primary-dark) !important;
-}
-
-.browser-filters {
- display: flex;
- gap: 0.5rem;
- flex-wrap: wrap;
- padding: 0.5rem;
- background: var(--bg-dark);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
-}
-
-.browser-table-container {
- flex: 1;
- overflow: visible;
- background: var(--bg-card);
- border-radius: 0.5rem;
- border: 1px solid var(--border);
- max-width: 100%;
-}
-
-.browser-table {
- width: 100%;
- border-collapse: collapse;
-}
-
-/* Mobile table - clean card layout with !important to override desktop styles */
-@media (max-width: 800px) {
- .browser-table-container {
- overflow: visible !important;
- }
-
- .browser-table {
- display: block !important;
- width: 100% !important;
- border-collapse: separate !important;
- border-spacing: 0 !important;
- }
-
- .browser-table thead {
- display: none !important;
- }
-
- .browser-table tbody {
- display: block !important;
- }
-
- .browser-table tbody tr {
- display: block !important;
- border: 1px solid var(--border) !important;
- border-radius: 0.5rem !important;
- margin-bottom: 0.75rem !important;
- padding: 0.75rem !important;
- background: var(--bg-dark) !important;
- width: 100% !important;
- box-sizing: border-box !important;
- height: auto !important;
- border-bottom: none !important;
- }
-
- .browser-table tbody tr:hover {
- background: var(--bg-hover) !important;
- }
-
- .browser-table td {
- display: block !important;
- border: none !important;
- position: relative !important;
- padding: 0.5rem 0.75rem 0.5rem 40% !important;
- white-space: normal !important;
- text-align: left !important;
- width: 100% !important;
- box-sizing: border-box !important;
- min-width: auto !important;
- }
-
- .browser-table td:before {
- content: attr(data-label) ": " !important;
- position: absolute !important;
- left: 0.75rem !important;
- width: 35% !important;
- padding-right: 0.5rem !important;
- white-space: nowrap !important;
- font-weight: 600 !important;
- color: var(--text-secondary) !important;
- }
-
- .browser-table td:last-child {
- text-align: center !important;
- padding-left: 0.75rem !important;
- }
-
- .browser-table td:last-child:before {
- display: none !important;
- }
-}
-
-.browser-table th {
- background: var(--bg-dark);
- color: var(--text-primary);
- font-weight: 600;
- padding: 0.75rem 0.5rem;
- text-align: left;
- border-bottom: 1px solid var(--border);
- cursor: pointer;
- user-select: none;
- position: relative;
- min-width: 100px;
-}
-
-.browser-table th:hover {
- background: var(--bg-hover);
-}
-
-.browser-table th.sortable {
- padding-right: 2rem;
-}
-
-.browser-table th.sortable::after {
- content: '↕';
- position: absolute;
- right: 0.5rem;
- top: 50%;
- transform: translateY(-50%);
- opacity: 0.5;
- font-size: 0.875rem;
- width: 1rem;
- text-align: center;
-}
-
-.browser-table th.sortable.active::after {
- opacity: 1;
- color: var(--text-primary);
-}
-
-.browser-table th.sortable.active.asc::after {
- content: '↑';
-}
-
-.browser-table th.sortable.active.desc::after {
- content: '↓';
-}
-
-.browser-table tbody tr {
- border-bottom: 1px solid var(--border);
- transition: background-color 0.2s ease;
-}
-
-.browser-table tbody tr:hover {
- background: var(--bg-hover);
-}
-
-.browser-table tbody tr:last-child {
- border-bottom: none;
-}
-
-.browser-table th,
-.browser-table td {
- padding: 0.75rem 0.5rem;
- vertical-align: middle;
- color: var(--text-primary);
- white-space: nowrap;
-}
-
-.browser-table th:first-child,
-.browser-table td:first-child {
- min-width: 150px;
-}
-
-.browser-table th:nth-child(2),
-.browser-table td:nth-child(2) {
- min-width: 60px;
- text-align: center;
-}
-
-.browser-table th:nth-child(3),
-.browser-table td:nth-child(3) {
- min-width: 100px;
-}
-
-.browser-table th:nth-child(4),
-.browser-table td:nth-child(4) {
- min-width: 100px;
- text-align: center;
-}
-
-.browser-table th:last-child,
-.browser-table td:last-child {
- min-width: 80px;
- text-align: center;
-}
-
-.browser-row {
- cursor: pointer;
-}
-
-.expanded-card-row {
- background: var(--bg-dark);
-}
-
-.expanded-card-cell {
- padding: 0 !important;
- border: none !important;
-}
-
-.expanded-card-container {
- padding: 1rem;
-}
-
-.filter-dropdown {
- position: absolute;
- top: 100%;
- left: 0;
- background: var(--bg-card);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
- z-index: 1000;
- min-width: 150px;
-}
-
-.filter-option {
- padding: 0.75rem 1rem;
- cursor: pointer;
- color: var(--text-primary);
- transition: background-color 0.2s ease;
-}
-
-.filter-option:hover {
- background: var(--bg-hover);
-}
-
-.filter-option:first-child {
- border-radius: 0.5rem 0.5rem 0 0;
-}
-
-.filter-option:last-child {
- border-radius: 0 0 0.5rem 0.5rem;
-}
-
-/* Mobile responsiveness for browser */
-@media (max-width: 800px) {
- .browser-wrapper {
- padding: 0.5rem;
- gap: 0.75rem;
- overflow: hidden;
- }
-
- .browser-top-row {
- gap: 0.5rem;
- padding: 0.5rem;
- }
-
- .browser-back-btn {
- min-width: 36px !important;
- width: 36px !important;
+ .mobile-drawer .drawer-handle {
+ overscroll-behavior: none !important;
+ overscroll-behavior-y: none !important;
+ touch-action: none !important; /* Prevent PTR on handle drag */
}
-
- .browser-add-btn {
- min-width: 36px !important;
- width: 36px !important;
- }
-
- .table-add-btn {
- min-width: 28px !important;
- width: 28px !important;
- }
-
- .browser-filters {
- flex-direction: column;
- gap: 0.25rem;
- }
-}
-
-/* Campaign Countdowns - Compact Section */
-.campaign-countdowns {
- margin-top: 1rem;
-}
-
-.countdowns-compact {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
}
-
-.countdown-symbols {
- display: flex;
- gap: 0.25rem;
+/* Custom Scrollbar Styling */
+/* Webkit browsers (Chrome, Safari, Edge) */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
}
-
-/* Inline Countdown Creator */
-.inline-countdown-creator {
+::-webkit-scrollbar-track {
background: transparent;
- border: none;
- border-radius: 0;
- padding: 0.75rem 0;
- margin-bottom: 1rem;
-}
-
-.inline-countdown-form {
- display: flex;
- flex-direction: column;
- gap: 0.5rem;
-}
-
-.inline-countdown-main-row {
- display: flex;
- gap: 0.5rem;
- align-items: center;
-}
-
-.inline-input {
- padding: 0.5rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.9rem;
-}
-
-.inline-input:focus {
- outline: none;
- border-color: var(--purple);
-}
-
-.inline-number {
- width: 4rem;
- padding: 0.5rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.9rem;
- text-align: center;
-}
-
-.inline-select {
- padding: 0.5rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- font-size: 0.9rem;
- min-width: 6rem;
-}
-
-.inline-countdown-actions {
- display: flex;
- gap: 0.5rem;
- justify-content: flex-end;
-}
-
-.inline-btn {
- width: 2rem;
- height: 2rem;
- border: 1px solid var(--border);
- border-radius: 0.25rem;
- background: var(--bg-dark);
- color: var(--text-primary);
- cursor: pointer;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: all 0.2s ease;
-}
-
-.inline-btn:hover:not(:disabled) {
- background: var(--purple);
- border-color: var(--purple);
-}
-
-.inline-btn:disabled {
- opacity: 0.5;
- cursor: not-allowed;
}
-.inline-btn.cancel:hover:not(:disabled) {
- background: var(--red);
- border-color: var(--red);
-}
-
-.inline-btn.save:hover:not(:disabled) {
- background: var(--green);
- border-color: var(--green);
-}
-
-/* Section Headers with Multiple Buttons */
-.section-header {
- display: flex; justify-content: space-between; align-items: center;
-}
-
-.section-header-buttons {
- display: flex; gap: 0.5rem; align-items: center;
+::-webkit-scrollbar-thumb {
+ background: var(--gray-700);
+ border-radius: 4px;
+ border: 2px solid transparent;
+ background-clip: content-box;
}
-/* Section Countdowns - Inline at top of sections */
-.section-countdowns {
- display: flex;
- flex-wrap: wrap;
- gap: 0.75rem;
- margin-bottom: 1rem;
+::-webkit-scrollbar-thumb:hover {
+ background: var(--gray-600);
+ background-clip: content-box;
}
-.countdown-inline {
- display: flex;
- flex-direction: column;
- align-items: flex-start;
- gap: 0;
- padding: 0.5rem;
- padding-left: 1rem;
- padding-right: 0.5rem;
- width: 100%;
- background: var(--bg-dark);
- border: 1px solid var(--border);
- border-radius: 0.5rem;
- cursor: pointer;
- transition: all 0.2s ease;
- position: relative;
+::-webkit-scrollbar-corner {
+ background: transparent;
}
-.countdown-inline:hover {
- border-color: var(--purple);
- background: var(--bg-dark);
+/* Firefox */
+* {
+ scrollbar-width: thin;
+ scrollbar-color: var(--gray-700) transparent;
}
-.countdown-symbols {
- display: flex;
- gap: 0.25rem;
- justify-content: flex-start;
- margin: 0;
- padding: 0;
+/* For elements that should have invisible scrollbars */
+.invisible-scrollbar {
+ scrollbar-width: none; /* Firefox */
+ -ms-overflow-style: none; /* IE and Edge */
}
-
-.countdown-name-display {
- font-size: 1.1rem;
- font-weight: 600;
- color: var(--text-primary);
- text-align: left;
- flex: 1;
- margin: 0;
+.invisible-scrollbar::-webkit-scrollbar {
+ display: none; /* Webkit browsers */
}
-.countdown-label {
- font-weight: 500;
- color: var(--text-primary);
- font-size: 0.85rem;
- white-space: nowrap;
-}
+/* Specialized styles */
\ No newline at end of file
diff --git a/src/index.html b/src/index.html
index 2546e32..08d812e 100644
--- a/src/index.html
+++ b/src/index.html
@@ -4,28 +4,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
Daggerheart GM Dashboard
-
+
-
+
+