Add YAML-driven quest system with context-aware offering:
Core Implementation:
- Quest data models (Quest, QuestObjective, QuestReward, QuestTriggers)
- QuestService for YAML loading and caching
- QuestEligibilityService with level, location, and probability filtering
- LoreService stub (MockLoreService) ready for Phase 6 Weaviate integration
Quest Content:
- 5 example quests across difficulty tiers (2 easy, 2 medium, 1 hard)
- Quest-centric design: quests define their NPC givers
- Location-based probability weights for natural quest offering
AI Integration:
- Quest offering section in npc_dialogue.j2 template
- Response parser extracts [QUEST_OFFER:quest_id] markers
- AI naturally weaves quest offers into NPC conversations
API Endpoints:
- POST /api/v1/quests/accept - Accept quest offer
- POST /api/v1/quests/decline - Decline quest offer
- POST /api/v1/quests/progress - Update objective progress
- POST /api/v1/quests/complete - Complete quest, claim rewards
- POST /api/v1/quests/abandon - Abandon active quest
- GET /api/v1/characters/{id}/quests - List character quests
- GET /api/v1/quests/{quest_id} - Get quest details
Frontend:
- Quest tracker sidebar with HTMX integration
- Quest offer modal for accept/decline flow
- Quest detail modal for viewing progress
- Combat service integration for kill objective tracking
Testing:
- Unit tests for Quest models and serialization
- Integration tests for full quest lifecycle
- Comprehensive test coverage for eligibility service
Documentation:
- Reorganized docs into /docs/phases/ structure
- Added Phase 5-12 planning documents
- Updated ROADMAP.md with new structure
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2665 lines
50 KiB
CSS
2665 lines
50 KiB
CSS
/**
|
|
* Code of Conquest - Play Screen Stylesheet
|
|
* 3-column layout for immersive gameplay
|
|
*/
|
|
|
|
/* ===== PLAY SCREEN VARIABLES ===== */
|
|
:root {
|
|
/* Play-specific backgrounds (inherit from main.css theme) */
|
|
--play-bg-panel: var(--bg-secondary);
|
|
--play-bg-content: var(--bg-tertiary);
|
|
--play-border: var(--border-primary);
|
|
|
|
/* Action tier colors */
|
|
--action-free: #3b82f6;
|
|
--action-free-hover: #2563eb;
|
|
--action-premium: #8b5cf6;
|
|
--action-premium-hover: #7c3aed;
|
|
--action-elite: var(--accent-gold);
|
|
--action-elite-hover: var(--accent-gold-hover);
|
|
|
|
/* Resource bars */
|
|
--hp-bar-fill: #ef4444;
|
|
--hp-bar-bg: #7f1d1d;
|
|
--mp-bar-fill: #3b82f6;
|
|
--mp-bar-bg: #1e3a5f;
|
|
--xp-bar-fill: #10b981;
|
|
--xp-bar-bg: #065f46;
|
|
|
|
/* Panel sizing */
|
|
--sidebar-left-width: 280px;
|
|
--sidebar-right-width: 320px;
|
|
}
|
|
|
|
/* ===== MAIN LAYOUT ===== */
|
|
.play-container {
|
|
display: grid;
|
|
grid-template-columns: var(--sidebar-left-width) minmax(500px, 1fr) var(--sidebar-right-width);
|
|
gap: 1rem;
|
|
height: calc(100vh - 140px);
|
|
padding: 1rem;
|
|
max-width: 2400px;
|
|
margin: 0 auto;
|
|
}
|
|
|
|
/* Override base main styles for play screen */
|
|
.play-page main {
|
|
padding: 0;
|
|
align-items: stretch;
|
|
justify-content: stretch;
|
|
}
|
|
|
|
/* ===== PANEL BASE STYLES ===== */
|
|
.play-panel {
|
|
background: var(--play-bg-panel);
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.play-sidebar {
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.play-main {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
/* ===== LEFT SIDEBAR - CHARACTER PANEL ===== */
|
|
.character-panel {
|
|
padding: 1rem;
|
|
}
|
|
|
|
/* Character Header */
|
|
.character-header {
|
|
text-align: center;
|
|
padding-bottom: 1rem;
|
|
border-bottom: 1px solid var(--play-border);
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.character-name {
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-xl);
|
|
color: var(--accent-gold);
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.character-info {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.character-class {
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.character-level {
|
|
color: var(--accent-gold);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Resource Bars */
|
|
.resource-bars {
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.resource-bar {
|
|
margin-bottom: 0.75rem;
|
|
}
|
|
|
|
.resource-bar-label {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: var(--text-xs);
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.resource-bar-name {
|
|
color: var(--text-secondary);
|
|
text-transform: uppercase;
|
|
letter-spacing: 1px;
|
|
}
|
|
|
|
.resource-bar-value {
|
|
color: var(--text-primary);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.resource-bar-track {
|
|
height: 8px;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.resource-bar-fill {
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
transition: width 0.3s ease;
|
|
}
|
|
|
|
.resource-bar--hp .resource-bar-fill {
|
|
background: linear-gradient(90deg, var(--hp-bar-fill), #f87171);
|
|
}
|
|
|
|
.resource-bar--mp .resource-bar-fill {
|
|
background: linear-gradient(90deg, var(--mp-bar-fill), #60a5fa);
|
|
}
|
|
|
|
/* Panel Accordion (for character panel) */
|
|
.panel-accordion {
|
|
margin-bottom: 0.75rem;
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 6px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.panel-accordion-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
padding: 0.5rem 0.75rem;
|
|
background: var(--bg-tertiary);
|
|
border: none;
|
|
color: var(--accent-gold);
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-xs);
|
|
text-transform: uppercase;
|
|
letter-spacing: 1px;
|
|
cursor: pointer;
|
|
transition: background 0.2s ease;
|
|
}
|
|
|
|
.panel-accordion-header:hover {
|
|
background: var(--bg-input);
|
|
}
|
|
|
|
.panel-accordion-icon {
|
|
font-size: 10px;
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.panel-accordion.collapsed .panel-accordion-icon {
|
|
transform: rotate(-90deg);
|
|
}
|
|
|
|
.panel-accordion-content {
|
|
padding: 0.75rem;
|
|
background: var(--bg-secondary);
|
|
}
|
|
|
|
.panel-accordion.collapsed .panel-accordion-content {
|
|
display: none;
|
|
}
|
|
|
|
/* Stats Grid */
|
|
.stats-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(3, 1fr);
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.stat-item {
|
|
text-align: center;
|
|
padding: 0.5rem;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.stat-abbr {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.stat-value {
|
|
font-size: var(--text-lg);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
/* Quick Actions (Equipment, NPC, Travel) */
|
|
.quick-actions {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
margin-bottom: 1rem;
|
|
padding-bottom: 1rem;
|
|
border-bottom: 1px solid var(--play-border);
|
|
}
|
|
|
|
/* Actions Section */
|
|
.actions-section {
|
|
flex: 1;
|
|
}
|
|
|
|
.actions-title {
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-xs);
|
|
color: var(--accent-gold);
|
|
text-transform: uppercase;
|
|
letter-spacing: 1px;
|
|
margin-bottom: 0.75rem;
|
|
}
|
|
|
|
.actions-tier {
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.actions-tier-label {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
margin-bottom: 0.5rem;
|
|
padding-left: 0.25rem;
|
|
}
|
|
|
|
.actions-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
/* Action Buttons */
|
|
.action-btn {
|
|
width: 100%;
|
|
padding: 0.625rem 0.75rem;
|
|
font-family: var(--font-body);
|
|
font-size: var(--text-sm);
|
|
font-weight: 500;
|
|
text-align: left;
|
|
border: none;
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
color: white;
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.action-btn:hover:not(:disabled) {
|
|
transform: translateX(2px);
|
|
box-shadow: var(--shadow-sm);
|
|
}
|
|
|
|
.action-btn:disabled {
|
|
opacity: 0.5;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
.action-btn--free {
|
|
background: var(--action-free);
|
|
}
|
|
|
|
.action-btn--free:hover:not(:disabled) {
|
|
background: var(--action-free-hover);
|
|
}
|
|
|
|
.action-btn--premium {
|
|
background: var(--action-premium);
|
|
}
|
|
|
|
.action-btn--premium:hover:not(:disabled) {
|
|
background: var(--action-premium-hover);
|
|
}
|
|
|
|
.action-btn--elite {
|
|
background: var(--action-elite);
|
|
color: var(--bg-primary);
|
|
}
|
|
|
|
.action-btn--elite:hover:not(:disabled) {
|
|
background: var(--action-elite-hover);
|
|
}
|
|
|
|
.action-btn--locked {
|
|
background: var(--bg-input);
|
|
color: var(--text-muted);
|
|
border: 1px dashed var(--play-border);
|
|
}
|
|
|
|
.action-btn--locked:hover {
|
|
transform: none;
|
|
box-shadow: none;
|
|
}
|
|
|
|
.action-btn-icon {
|
|
font-size: var(--text-base);
|
|
}
|
|
|
|
.action-btn-lock {
|
|
margin-left: auto;
|
|
font-size: var(--text-xs);
|
|
}
|
|
|
|
/* Special Action Button Style */
|
|
.action-btn--special {
|
|
background: var(--bg-tertiary);
|
|
border: 1px solid var(--play-border);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.action-btn--special:hover:not(:disabled) {
|
|
border-color: var(--accent-gold);
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
/* ===== MIDDLE - NARRATIVE PANEL ===== */
|
|
.narrative-panel {
|
|
display: flex;
|
|
flex-direction: column;
|
|
height: 100%;
|
|
}
|
|
|
|
/* Location Header */
|
|
.location-header {
|
|
padding: 1rem 1.25rem;
|
|
background: var(--bg-tertiary);
|
|
border-bottom: 1px solid var(--play-border);
|
|
}
|
|
|
|
.location-top {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.location-type-badge {
|
|
padding: 0.25rem 0.5rem;
|
|
font-size: var(--text-xs);
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
border-radius: 4px;
|
|
background: var(--accent-gold);
|
|
color: var(--bg-primary);
|
|
}
|
|
|
|
.location-type-badge--wilderness {
|
|
background: var(--accent-green);
|
|
}
|
|
|
|
.location-type-badge--dungeon {
|
|
background: var(--accent-red);
|
|
}
|
|
|
|
.location-type-badge--town {
|
|
background: var(--accent-blue);
|
|
}
|
|
|
|
.location-name {
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-xl);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.location-meta {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 1rem;
|
|
font-size: var(--text-sm);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.location-region::before {
|
|
content: '';
|
|
}
|
|
|
|
.turn-counter {
|
|
color: var(--accent-gold);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Ambient Details */
|
|
.ambient-section {
|
|
padding: 0.75rem 1.25rem;
|
|
background: rgba(0, 0, 0, 0.2);
|
|
border-bottom: 1px solid var(--play-border);
|
|
}
|
|
|
|
.ambient-toggle {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
background: none;
|
|
border: none;
|
|
color: var(--text-muted);
|
|
font-size: var(--text-sm);
|
|
cursor: pointer;
|
|
padding: 0;
|
|
}
|
|
|
|
.ambient-toggle:hover {
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.ambient-icon {
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.ambient-section.collapsed .ambient-icon {
|
|
transform: rotate(-90deg);
|
|
}
|
|
|
|
.ambient-content {
|
|
margin-top: 0.75rem;
|
|
font-size: var(--text-sm);
|
|
color: var(--text-secondary);
|
|
font-style: italic;
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.ambient-section.collapsed .ambient-content {
|
|
display: none;
|
|
}
|
|
|
|
/* DM Response Area */
|
|
.narrative-content {
|
|
flex: 1;
|
|
padding: 1.25rem;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
.dm-response {
|
|
font-size: var(--text-base);
|
|
line-height: 1.8;
|
|
color: var(--text-primary);
|
|
white-space: pre-wrap;
|
|
}
|
|
|
|
.dm-response p {
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.dm-response p:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
/* ===== PLAYER INPUT AREA ===== */
|
|
.player-input-area {
|
|
padding: 1rem 1.25rem;
|
|
background: var(--bg-tertiary);
|
|
border-top: 1px solid var(--play-border);
|
|
}
|
|
|
|
.player-input-form {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.player-input-label {
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-sm);
|
|
color: var(--accent-gold);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.player-input-row {
|
|
display: flex;
|
|
gap: 0.75rem;
|
|
align-items: flex-end;
|
|
}
|
|
|
|
.player-input-textarea {
|
|
flex: 1;
|
|
padding: 0.75rem 1rem;
|
|
background: var(--bg-input);
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 6px;
|
|
color: var(--text-primary);
|
|
font-family: var(--font-body);
|
|
font-size: var(--text-sm);
|
|
line-height: 1.5;
|
|
resize: none;
|
|
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
}
|
|
|
|
.player-input-textarea::placeholder {
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.player-input-textarea:focus {
|
|
outline: none;
|
|
border-color: var(--accent-gold);
|
|
box-shadow: 0 0 0 2px rgba(243, 156, 18, 0.2);
|
|
}
|
|
|
|
.player-input-submit {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.75rem 1.25rem;
|
|
background: var(--accent-gold);
|
|
border: none;
|
|
border-radius: 6px;
|
|
color: var(--bg-primary);
|
|
font-family: var(--font-body);
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.player-input-submit:hover:not(:disabled) {
|
|
background: var(--accent-gold-hover);
|
|
transform: translateX(2px);
|
|
}
|
|
|
|
.player-input-submit:disabled {
|
|
opacity: 0.6;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
.submit-icon {
|
|
font-size: var(--text-base);
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.player-input-submit:hover:not(:disabled) .submit-icon {
|
|
transform: translateX(3px);
|
|
}
|
|
|
|
.player-input-hint {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
font-style: italic;
|
|
}
|
|
|
|
/* Loading state for player input */
|
|
.player-input-area.htmx-request .player-input-textarea,
|
|
.player-input-area.htmx-request .player-input-submit {
|
|
opacity: 0.6;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* Error state */
|
|
.dm-response.error {
|
|
color: var(--accent-red);
|
|
padding: 1rem;
|
|
background: rgba(239, 68, 68, 0.1);
|
|
border-radius: 6px;
|
|
border-left: 3px solid var(--accent-red);
|
|
}
|
|
|
|
/* Responsive adjustments */
|
|
@media (max-width: 768px) {
|
|
.player-input-row {
|
|
flex-direction: column;
|
|
align-items: stretch;
|
|
}
|
|
|
|
.player-input-submit {
|
|
justify-content: center;
|
|
}
|
|
}
|
|
|
|
/* Player Action Echo - Shows player's submitted action */
|
|
.player-action-echo {
|
|
padding: 1rem;
|
|
margin-bottom: 1rem;
|
|
background: rgba(59, 130, 246, 0.1);
|
|
border-radius: 6px;
|
|
border-left: 3px solid var(--action-free);
|
|
}
|
|
|
|
.player-action-label {
|
|
display: block;
|
|
font-size: var(--text-xs);
|
|
color: var(--action-free);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.player-action-text {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-primary);
|
|
font-style: italic;
|
|
}
|
|
|
|
/* Loading State */
|
|
.loading-state {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
justify-content: center;
|
|
padding: 3rem;
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.loading-spinner-large {
|
|
width: 40px;
|
|
height: 40px;
|
|
border: 3px solid var(--bg-input);
|
|
border-top-color: var(--accent-gold);
|
|
border-radius: 50%;
|
|
animation: spin 1s linear infinite;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.loading-text {
|
|
font-style: italic;
|
|
}
|
|
|
|
/* ===== RIGHT SIDEBAR - ACCORDIONS ===== */
|
|
.accordion-panel {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
|
|
.accordion {
|
|
border-bottom: 1px solid var(--play-border);
|
|
}
|
|
|
|
.accordion:last-child {
|
|
border-bottom: none;
|
|
}
|
|
|
|
.accordion-header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
width: 100%;
|
|
padding: 0.875rem 1rem;
|
|
background: var(--bg-tertiary);
|
|
border: none;
|
|
color: var(--accent-gold);
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-sm);
|
|
text-transform: uppercase;
|
|
letter-spacing: 1px;
|
|
cursor: pointer;
|
|
transition: background 0.2s ease;
|
|
}
|
|
|
|
.accordion-header:hover {
|
|
background: var(--bg-input);
|
|
}
|
|
|
|
.accordion-icon {
|
|
font-size: var(--text-xs);
|
|
transition: transform 0.2s ease;
|
|
}
|
|
|
|
.accordion.collapsed .accordion-icon {
|
|
transform: rotate(-90deg);
|
|
}
|
|
|
|
.accordion-content {
|
|
padding: 0.75rem 1rem;
|
|
max-height: 300px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
/* History accordion gets more height */
|
|
[data-accordion="history"] .accordion-content {
|
|
max-height: 330px;
|
|
}
|
|
|
|
.accordion.collapsed .accordion-content {
|
|
display: none;
|
|
}
|
|
|
|
.accordion-count {
|
|
font-family: var(--font-body);
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
margin-left: 0.5rem;
|
|
}
|
|
|
|
/* History Items */
|
|
.history-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.history-item {
|
|
padding: 0.75rem;
|
|
background: var(--bg-input);
|
|
border-radius: 6px;
|
|
border-left: 3px solid var(--accent-gold);
|
|
}
|
|
|
|
.history-item-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.history-turn {
|
|
font-size: var(--text-xs);
|
|
color: var(--accent-gold);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.history-action {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-primary);
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.history-response {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
line-height: 1.4;
|
|
display: -webkit-box;
|
|
-webkit-line-clamp: 2;
|
|
-webkit-box-orient: vertical;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.history-load-more {
|
|
margin-top: 0.75rem;
|
|
text-align: center;
|
|
}
|
|
|
|
.btn-load-more {
|
|
padding: 0.5rem 1rem;
|
|
font-size: var(--text-xs);
|
|
background: transparent;
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 4px;
|
|
color: var(--text-secondary);
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
}
|
|
|
|
.btn-load-more:hover {
|
|
border-color: var(--accent-gold);
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
/* Quest Items */
|
|
.quest-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.quest-item {
|
|
padding: 0.75rem;
|
|
background: var(--bg-input);
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.quest-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: flex-start;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.quest-name {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.quest-difficulty {
|
|
font-size: var(--text-xs);
|
|
padding: 0.125rem 0.375rem;
|
|
border-radius: 3px;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.quest-difficulty--easy {
|
|
background: rgba(16, 185, 129, 0.2);
|
|
color: #10b981;
|
|
}
|
|
|
|
.quest-difficulty--medium {
|
|
background: rgba(245, 158, 11, 0.2);
|
|
color: #f59e0b;
|
|
}
|
|
|
|
.quest-difficulty--hard {
|
|
background: rgba(239, 68, 68, 0.2);
|
|
color: #ef4444;
|
|
}
|
|
|
|
.quest-giver {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.quest-objectives {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.375rem;
|
|
}
|
|
|
|
.quest-objective {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
font-size: var(--text-xs);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.quest-objective-check {
|
|
width: 14px;
|
|
height: 14px;
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 3px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: 10px;
|
|
}
|
|
|
|
.quest-objective-check.completed {
|
|
background: var(--accent-green);
|
|
border-color: var(--accent-green);
|
|
color: white;
|
|
}
|
|
|
|
.quest-objective-progress {
|
|
margin-left: auto;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.quest-empty {
|
|
text-align: center;
|
|
padding: 1rem;
|
|
color: var(--text-muted);
|
|
font-size: var(--text-sm);
|
|
font-style: italic;
|
|
}
|
|
|
|
/* NPC Items */
|
|
.npc-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.npc-item {
|
|
padding: 0.625rem 0.75rem;
|
|
background: var(--bg-input);
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
border: 1px solid transparent;
|
|
}
|
|
|
|
.npc-item:hover {
|
|
border-color: var(--accent-gold);
|
|
transform: translateX(2px);
|
|
}
|
|
|
|
.npc-name {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
margin-bottom: 0.125rem;
|
|
}
|
|
|
|
.npc-role {
|
|
font-size: var(--text-xs);
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.npc-appearance {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
margin-top: 0.25rem;
|
|
}
|
|
|
|
.npc-tags {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.375rem;
|
|
margin-top: 0.375rem;
|
|
overflow: hidden;
|
|
max-height: 3.5em; /* Limit to roughly 2 rows of tags */
|
|
}
|
|
|
|
.npc-tag {
|
|
font-size: 10px;
|
|
padding: 0.125rem 0.375rem;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 3px;
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
/* Map Items */
|
|
.map-region {
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.map-region:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.map-region-name {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
margin-bottom: 0.5rem;
|
|
padding-left: 0.25rem;
|
|
}
|
|
|
|
.map-locations {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.375rem;
|
|
}
|
|
|
|
.map-location {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.5rem 0.625rem;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
border: 1px solid transparent;
|
|
}
|
|
|
|
.map-location:hover {
|
|
border-color: var(--play-border);
|
|
}
|
|
|
|
.map-location.current {
|
|
border-color: var(--accent-gold);
|
|
background: rgba(243, 156, 18, 0.1);
|
|
}
|
|
|
|
.map-location-icon {
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.map-location-name {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.map-location-type {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
margin-left: auto;
|
|
}
|
|
|
|
/* ===== MODALS ===== */
|
|
.modal-overlay {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background: rgba(0, 0, 0, 0.8);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
z-index: 1000;
|
|
animation: fadeIn 0.2s ease;
|
|
}
|
|
|
|
@keyframes fadeIn {
|
|
from { opacity: 0; }
|
|
to { opacity: 1; }
|
|
}
|
|
|
|
.modal-content {
|
|
background: var(--bg-secondary);
|
|
border: 2px solid var(--border-ornate);
|
|
border-radius: 8px;
|
|
width: 90%;
|
|
max-width: 500px;
|
|
max-height: 80vh;
|
|
overflow: hidden;
|
|
display: flex;
|
|
flex-direction: column;
|
|
animation: slideUp 0.2s ease;
|
|
}
|
|
|
|
/* Modal Size Variants */
|
|
.modal-content--sm { max-width: 400px; }
|
|
.modal-content--md { max-width: 500px; }
|
|
.modal-content--lg { max-width: 700px; }
|
|
.modal-content--xl { max-width: 1000px; } /* Expanded for 3-column NPC chat */
|
|
|
|
@keyframes slideUp {
|
|
from { transform: translateY(20px); opacity: 0; }
|
|
to { transform: translateY(0); opacity: 1; }
|
|
}
|
|
|
|
.modal-header {
|
|
padding: 1rem 1.25rem;
|
|
background: var(--bg-tertiary);
|
|
border-bottom: 1px solid var(--play-border);
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
|
|
.modal-title {
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-lg);
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.modal-close {
|
|
background: none;
|
|
border: none;
|
|
color: var(--text-muted);
|
|
font-size: var(--text-xl);
|
|
cursor: pointer;
|
|
padding: 0.25rem;
|
|
line-height: 1;
|
|
}
|
|
|
|
.modal-close:hover {
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.modal-body {
|
|
padding: 1rem 1.25rem;
|
|
overflow-y: auto;
|
|
flex: 1;
|
|
}
|
|
|
|
.modal-footer {
|
|
padding: 0.75rem 1.25rem;
|
|
background: var(--bg-tertiary);
|
|
border-top: 1px solid var(--play-border);
|
|
display: flex;
|
|
justify-content: flex-end;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
/* Travel Modal */
|
|
.travel-destinations {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.travel-destination {
|
|
padding: 0.75rem 1rem;
|
|
background: var(--bg-input);
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
text-align: left;
|
|
width: 100%;
|
|
}
|
|
|
|
.travel-destination:hover {
|
|
border-color: var(--accent-gold);
|
|
background: rgba(243, 156, 18, 0.1);
|
|
}
|
|
|
|
.travel-destination-name {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.travel-destination-meta {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
margin-top: 0.25rem;
|
|
}
|
|
|
|
/* Monster Selection Modal */
|
|
.monster-modal {
|
|
max-width: 500px;
|
|
}
|
|
|
|
.monster-modal-location {
|
|
color: var(--text-secondary);
|
|
margin-bottom: 1rem;
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.monster-modal-hint {
|
|
color: var(--text-muted);
|
|
margin-top: 1rem;
|
|
text-align: center;
|
|
}
|
|
|
|
.encounter-options {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.encounter-option {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
padding: 0.75rem 1rem;
|
|
background: var(--bg-input);
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 6px;
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
text-align: left;
|
|
width: 100%;
|
|
border-left: 4px solid var(--text-muted);
|
|
}
|
|
|
|
.encounter-option:hover {
|
|
transform: translateX(4px);
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
|
|
}
|
|
|
|
/* Challenge level border colors */
|
|
.encounter-option--easy {
|
|
border-left-color: #2ecc71; /* Green for easy */
|
|
}
|
|
|
|
.encounter-option--easy:hover {
|
|
border-color: #2ecc71;
|
|
background: rgba(46, 204, 113, 0.1);
|
|
}
|
|
|
|
.encounter-option--medium {
|
|
border-left-color: #f39c12; /* Gold/orange for medium */
|
|
}
|
|
|
|
.encounter-option--medium:hover {
|
|
border-color: #f39c12;
|
|
background: rgba(243, 156, 18, 0.1);
|
|
}
|
|
|
|
.encounter-option--hard {
|
|
border-left-color: #e74c3c; /* Red for hard */
|
|
}
|
|
|
|
.encounter-option--hard:hover {
|
|
border-color: #e74c3c;
|
|
background: rgba(231, 76, 60, 0.1);
|
|
}
|
|
|
|
.encounter-option--boss {
|
|
border-left-color: #9b59b6; /* Purple for boss */
|
|
}
|
|
|
|
.encounter-option--boss:hover {
|
|
border-color: #9b59b6;
|
|
background: rgba(155, 89, 182, 0.1);
|
|
}
|
|
|
|
.encounter-info {
|
|
flex: 1;
|
|
}
|
|
|
|
.encounter-name {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.encounter-enemies {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.25rem;
|
|
}
|
|
|
|
.enemy-badge {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
background: var(--bg-card);
|
|
padding: 0.125rem 0.375rem;
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.encounter-challenge {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
padding: 0.25rem 0.5rem;
|
|
border-radius: 4px;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.challenge--easy {
|
|
color: #2ecc71;
|
|
background: rgba(46, 204, 113, 0.15);
|
|
}
|
|
|
|
.challenge--medium {
|
|
color: #f39c12;
|
|
background: rgba(243, 156, 18, 0.15);
|
|
}
|
|
|
|
.challenge--hard {
|
|
color: #e74c3c;
|
|
background: rgba(231, 76, 60, 0.15);
|
|
}
|
|
|
|
.challenge--boss {
|
|
color: #9b59b6;
|
|
background: rgba(155, 89, 182, 0.15);
|
|
}
|
|
|
|
.encounter-empty {
|
|
text-align: center;
|
|
padding: 2rem;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.encounter-empty p {
|
|
margin: 0.5rem 0;
|
|
}
|
|
|
|
/* Combat action button highlight */
|
|
.action-btn--combat {
|
|
background: linear-gradient(135deg, rgba(231, 76, 60, 0.2), rgba(155, 89, 182, 0.2));
|
|
border-color: rgba(231, 76, 60, 0.4);
|
|
}
|
|
|
|
.action-btn--combat:hover {
|
|
background: linear-gradient(135deg, rgba(231, 76, 60, 0.3), rgba(155, 89, 182, 0.3));
|
|
border-color: rgba(231, 76, 60, 0.6);
|
|
}
|
|
|
|
/* NPC Chat Modal */
|
|
.npc-chat-header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 1rem;
|
|
}
|
|
|
|
.npc-chat-avatar {
|
|
width: 48px;
|
|
height: 48px;
|
|
background: var(--bg-input);
|
|
border-radius: 50%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-size: var(--text-xl);
|
|
}
|
|
|
|
.npc-chat-info h3 {
|
|
font-family: var(--font-heading);
|
|
font-size: var(--text-lg);
|
|
color: var(--accent-gold);
|
|
margin: 0;
|
|
}
|
|
|
|
.npc-chat-info p {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-secondary);
|
|
margin: 0;
|
|
}
|
|
|
|
.chat-history {
|
|
min-height: 200px;
|
|
max-height: 300px;
|
|
overflow-y: auto;
|
|
margin-bottom: 1rem;
|
|
padding: 0.5rem;
|
|
background: var(--bg-input);
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.chat-message {
|
|
padding: 0.5rem 0.75rem;
|
|
margin-bottom: 0.5rem;
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.chat-message:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.chat-message--player {
|
|
background: rgba(59, 130, 246, 0.2);
|
|
margin-left: 1rem;
|
|
}
|
|
|
|
.chat-message--npc {
|
|
background: rgba(243, 156, 18, 0.1);
|
|
margin-right: 1rem;
|
|
border-left: 2px solid var(--accent-gold);
|
|
}
|
|
|
|
.chat-message strong {
|
|
font-size: var(--text-sm);
|
|
display: block;
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.chat-message--player strong {
|
|
color: var(--action-free);
|
|
}
|
|
|
|
.chat-message--npc strong {
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.chat-input-form {
|
|
display: flex;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.chat-input {
|
|
flex: 1;
|
|
padding: 0.625rem 0.875rem;
|
|
background: var(--bg-input);
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 6px;
|
|
color: var(--text-primary);
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.chat-input:focus {
|
|
outline: none;
|
|
border-color: var(--accent-gold);
|
|
}
|
|
|
|
.chat-send-btn {
|
|
padding: 0.625rem 1rem;
|
|
background: var(--accent-gold);
|
|
border: none;
|
|
border-radius: 6px;
|
|
color: var(--bg-primary);
|
|
font-weight: 600;
|
|
cursor: pointer;
|
|
transition: background 0.2s ease;
|
|
}
|
|
|
|
.chat-send-btn:hover {
|
|
background: var(--accent-gold-hover);
|
|
}
|
|
|
|
.chat-greet-btn {
|
|
padding: 0.625rem 1rem;
|
|
background: transparent;
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 6px;
|
|
color: var(--text-secondary);
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
}
|
|
|
|
.chat-greet-btn:hover {
|
|
border-color: var(--accent-gold);
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
/* ===== RESPONSIVE DESIGN ===== */
|
|
@media (max-width: 1200px) {
|
|
.play-container {
|
|
grid-template-columns: var(--sidebar-left-width) 1fr 280px;
|
|
}
|
|
}
|
|
|
|
@media (max-width: 1024px) {
|
|
.play-container {
|
|
grid-template-columns: 1fr 280px;
|
|
height: auto;
|
|
min-height: calc(100vh - 140px);
|
|
}
|
|
|
|
.play-sidebar--left {
|
|
display: none; /* Will be slide-out drawer on tablet */
|
|
}
|
|
|
|
/* Mobile menu toggle would go here */
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.play-container {
|
|
grid-template-columns: 1fr;
|
|
gap: 0.75rem;
|
|
padding: 0.75rem;
|
|
}
|
|
|
|
.play-sidebar--right {
|
|
order: 3;
|
|
}
|
|
|
|
.play-main {
|
|
order: 1;
|
|
}
|
|
|
|
.location-name {
|
|
font-size: var(--text-lg);
|
|
}
|
|
|
|
.accordion-content {
|
|
max-height: 200px;
|
|
}
|
|
}
|
|
|
|
/* ===== EQUIPMENT MODAL ===== */
|
|
.equipment-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(2, 1fr);
|
|
gap: 0.75rem;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.equipment-slot {
|
|
padding: 0.75rem;
|
|
border-radius: 6px;
|
|
background: var(--bg-input);
|
|
transition: all 0.2s ease;
|
|
}
|
|
|
|
.equipment-slot--equipped {
|
|
border: 1px solid var(--accent-gold);
|
|
}
|
|
|
|
.equipment-slot--empty {
|
|
border: 1px dashed var(--play-border);
|
|
}
|
|
|
|
.slot-header {
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.slot-label {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.slot-item {
|
|
display: flex;
|
|
gap: 0.75rem;
|
|
align-items: flex-start;
|
|
}
|
|
|
|
.slot-icon {
|
|
font-size: var(--text-xl);
|
|
line-height: 1;
|
|
}
|
|
|
|
.slot-icon--empty {
|
|
opacity: 0.3;
|
|
}
|
|
|
|
.slot-details {
|
|
flex: 1;
|
|
min-width: 0;
|
|
}
|
|
|
|
.slot-item-name {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
margin-bottom: 0.25rem;
|
|
}
|
|
|
|
.slot-stats {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.375rem;
|
|
}
|
|
|
|
.slot-stats span {
|
|
font-size: var(--text-xs);
|
|
padding: 0.125rem 0.375rem;
|
|
border-radius: 3px;
|
|
background: var(--bg-tertiary);
|
|
}
|
|
|
|
.stat-damage {
|
|
color: var(--accent-red);
|
|
}
|
|
|
|
.stat-defense {
|
|
color: var(--accent-blue);
|
|
}
|
|
|
|
.stat-bonus {
|
|
color: var(--accent-green);
|
|
}
|
|
|
|
.slot-empty {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
padding: 0.5rem;
|
|
}
|
|
|
|
.slot-empty-text {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
font-style: italic;
|
|
margin-top: 0.25rem;
|
|
}
|
|
|
|
/* Equipment Summary */
|
|
.equipment-summary {
|
|
padding: 0.75rem;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 6px;
|
|
border-left: 3px solid var(--accent-gold);
|
|
}
|
|
|
|
.summary-title {
|
|
font-size: var(--text-xs);
|
|
color: var(--accent-gold);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.summary-stats {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.summary-stat {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--accent-green);
|
|
padding: 0.25rem 0.5rem;
|
|
background: rgba(16, 185, 129, 0.1);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.summary-none {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-muted);
|
|
font-style: italic;
|
|
}
|
|
|
|
/* ===== EXPANDED NPC MODAL ===== */
|
|
.npc-modal-body {
|
|
display: flex;
|
|
gap: 1.25rem;
|
|
min-height: 400px;
|
|
}
|
|
|
|
/* 3-column layout for chat modal with history sidebar */
|
|
.npc-modal-body--three-col {
|
|
padding: 0; /* Let container handle padding */
|
|
max-height: 70vh;
|
|
}
|
|
|
|
/* Apply grid to the actual container holding the three columns */
|
|
.npc-modal-body--three-col .npc-chat-container {
|
|
display: grid;
|
|
grid-template-columns: 200px 1fr 280px; /* Profile | Chat | History */
|
|
gap: 1rem;
|
|
padding: 1rem 1.25rem;
|
|
height: 100%;
|
|
}
|
|
|
|
/* Override hardcoded widths for grid children - let grid define sizes */
|
|
.npc-modal-body--three-col .npc-profile {
|
|
width: auto;
|
|
}
|
|
|
|
/* Ensure history panel is visible in modal grid */
|
|
.npc-modal-body--three-col .npc-history-panel {
|
|
min-height: 200px;
|
|
overflow-y: auto;
|
|
}
|
|
|
|
/* NPC Profile (Left Column) */
|
|
.npc-profile {
|
|
width: 200px;
|
|
flex-shrink: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 1rem;
|
|
}
|
|
|
|
.npc-portrait {
|
|
width: 100%;
|
|
aspect-ratio: 1;
|
|
border-radius: 8px;
|
|
overflow: hidden;
|
|
background: var(--bg-input);
|
|
border: 2px solid var(--play-border);
|
|
}
|
|
|
|
.npc-portrait img {
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
|
|
.npc-portrait-placeholder {
|
|
width: 100%;
|
|
height: 100%;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
font-family: var(--font-heading);
|
|
font-size: 4rem;
|
|
color: var(--accent-gold);
|
|
background: linear-gradient(135deg, var(--bg-tertiary), var(--bg-input));
|
|
}
|
|
|
|
.npc-profile-info {
|
|
text-align: center;
|
|
}
|
|
|
|
.npc-profile-role {
|
|
font-size: var(--text-sm);
|
|
color: var(--accent-gold);
|
|
font-weight: 600;
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.npc-profile-appearance {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-secondary);
|
|
margin-top: 0.25rem;
|
|
line-height: 1.4;
|
|
}
|
|
|
|
.npc-profile-tags {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.375rem;
|
|
justify-content: center;
|
|
}
|
|
|
|
.npc-profile-tag {
|
|
font-size: 10px;
|
|
padding: 0.125rem 0.375rem;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 3px;
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
/* Relationship Meter */
|
|
.npc-relationship {
|
|
padding: 0.75rem;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.relationship-header {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.relationship-label {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
letter-spacing: 0.5px;
|
|
}
|
|
|
|
.relationship-value {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-secondary);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.relationship-bar {
|
|
height: 8px;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.relationship-fill {
|
|
height: 100%;
|
|
border-radius: 4px;
|
|
background: linear-gradient(90deg, var(--accent-gold), #f59e0b);
|
|
transition: width 0.3s ease;
|
|
}
|
|
|
|
.relationship-status {
|
|
text-align: center;
|
|
font-size: var(--text-xs);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.status-friendly {
|
|
color: var(--accent-green);
|
|
}
|
|
|
|
.status-neutral {
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.status-unfriendly {
|
|
color: var(--accent-red);
|
|
}
|
|
|
|
/* Interaction Stats */
|
|
.npc-interaction-stats {
|
|
padding: 0.5rem;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.interaction-stat {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: var(--text-xs);
|
|
}
|
|
|
|
.interaction-stat .stat-label {
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.interaction-stat .stat-value {
|
|
color: var(--text-primary);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* NPC Conversation (Middle Column) */
|
|
.npc-conversation {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-width: 0;
|
|
min-height: 0; /* Important for grid child to enable scrolling */
|
|
}
|
|
|
|
.npc-conversation .chat-history {
|
|
flex: 1;
|
|
min-height: 250px;
|
|
max-height: 500px; /* Set max height to enable scrolling */
|
|
overflow-y: auto; /* Enable vertical scroll */
|
|
}
|
|
|
|
.chat-empty-state {
|
|
text-align: center;
|
|
color: var(--text-muted);
|
|
padding: 2rem;
|
|
font-style: italic;
|
|
}
|
|
|
|
/* ===== NPC CHAT HISTORY SIDEBAR ===== */
|
|
.npc-history-panel {
|
|
display: flex;
|
|
flex-direction: column;
|
|
border-left: 1px solid var(--play-border);
|
|
padding-left: 1rem;
|
|
overflow-y: auto;
|
|
max-height: 70vh;
|
|
}
|
|
|
|
.history-header {
|
|
font-size: 0.875rem;
|
|
font-weight: 600;
|
|
color: var(--text-muted);
|
|
text-transform: uppercase;
|
|
margin-bottom: 0.75rem;
|
|
letter-spacing: 0.05em;
|
|
}
|
|
|
|
.history-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
/* Compact history cards */
|
|
.history-card {
|
|
background: var(--bg-secondary);
|
|
border: 1px solid var(--play-border);
|
|
border-radius: 4px;
|
|
padding: 0.5rem;
|
|
font-size: 0.8rem;
|
|
transition: background 0.2s;
|
|
}
|
|
|
|
.history-card:hover {
|
|
background: var(--bg-tertiary);
|
|
}
|
|
|
|
.history-timestamp {
|
|
font-size: 0.7rem;
|
|
color: var(--text-muted);
|
|
margin-bottom: 0.25rem;
|
|
font-style: italic;
|
|
}
|
|
|
|
.history-player {
|
|
color: var(--text-primary);
|
|
margin-bottom: 0.125rem;
|
|
line-height: 1.4;
|
|
}
|
|
|
|
.history-player strong {
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.history-npc {
|
|
color: var(--text-primary);
|
|
line-height: 1.4;
|
|
}
|
|
|
|
.history-npc strong {
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.history-empty {
|
|
text-align: center;
|
|
color: var(--text-muted);
|
|
font-size: 0.875rem;
|
|
padding: 2rem 0;
|
|
font-style: italic;
|
|
}
|
|
|
|
.loading-state-small {
|
|
text-align: center;
|
|
color: var(--text-muted);
|
|
font-size: 0.875rem;
|
|
padding: 1rem 0;
|
|
font-style: italic;
|
|
}
|
|
|
|
/* HTMX Loading Indicator - visible by default, replaced by HTMX response */
|
|
.history-loading {
|
|
text-align: center;
|
|
color: var(--text-muted);
|
|
font-size: 0.875rem;
|
|
padding: 1rem 0;
|
|
font-style: italic;
|
|
}
|
|
|
|
/* Responsive NPC Modal */
|
|
@media (max-width: 700px) {
|
|
.npc-modal-body {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.npc-profile {
|
|
width: 100%;
|
|
flex-direction: row;
|
|
flex-wrap: wrap;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.npc-portrait {
|
|
width: 80px;
|
|
height: 80px;
|
|
}
|
|
|
|
.npc-portrait-placeholder {
|
|
font-size: 2rem;
|
|
}
|
|
|
|
.npc-profile-info {
|
|
flex: 1;
|
|
text-align: left;
|
|
min-width: 120px;
|
|
}
|
|
|
|
.npc-relationship {
|
|
width: 100%;
|
|
}
|
|
|
|
.npc-profile-tags {
|
|
width: 100%;
|
|
justify-content: flex-start;
|
|
}
|
|
|
|
.npc-interaction-stats {
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
/* Responsive: 3-column modal stacks on smaller screens */
|
|
@media (max-width: 1024px) {
|
|
.npc-modal-body--three-col .npc-chat-container {
|
|
grid-template-columns: 1fr; /* Single column */
|
|
grid-template-rows: auto 1fr auto;
|
|
}
|
|
|
|
.npc-modal-body--three-col .npc-profile {
|
|
order: 1;
|
|
width: 100%;
|
|
flex-direction: row;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.npc-modal-body--three-col .npc-conversation {
|
|
order: 2;
|
|
}
|
|
|
|
.npc-modal-body--three-col .npc-history-panel {
|
|
order: 3;
|
|
border-left: none;
|
|
border-top: 1px solid var(--play-border);
|
|
padding-left: 0;
|
|
padding-top: 1rem;
|
|
max-height: 200px; /* Shorter on mobile */
|
|
}
|
|
}
|
|
|
|
/* ===== UTILITY CLASSES FOR PLAY SCREEN ===== */
|
|
.play-hidden {
|
|
display: none !important;
|
|
}
|
|
|
|
.play-loading {
|
|
opacity: 0.6;
|
|
pointer-events: none;
|
|
}
|
|
|
|
/* Custom scrollbar for play panels */
|
|
.play-panel::-webkit-scrollbar,
|
|
.accordion-content::-webkit-scrollbar,
|
|
.narrative-content::-webkit-scrollbar,
|
|
.chat-history::-webkit-scrollbar {
|
|
width: 6px;
|
|
}
|
|
|
|
.play-panel::-webkit-scrollbar-track,
|
|
.accordion-content::-webkit-scrollbar-track,
|
|
.narrative-content::-webkit-scrollbar-track,
|
|
.chat-history::-webkit-scrollbar-track {
|
|
background: var(--bg-tertiary);
|
|
}
|
|
|
|
.play-panel::-webkit-scrollbar-thumb,
|
|
.accordion-content::-webkit-scrollbar-thumb,
|
|
.narrative-content::-webkit-scrollbar-thumb,
|
|
.chat-history::-webkit-scrollbar-thumb {
|
|
background: var(--play-border);
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.play-panel::-webkit-scrollbar-thumb:hover,
|
|
.accordion-content::-webkit-scrollbar-thumb:hover,
|
|
.narrative-content::-webkit-scrollbar-thumb:hover,
|
|
.chat-history::-webkit-scrollbar-thumb:hover {
|
|
background: var(--text-muted);
|
|
}
|
|
|
|
/* ===== NPC CHAT DEDICATED PAGE ===== */
|
|
/* Mobile-friendly full page view for NPC conversations */
|
|
|
|
.npc-chat-page {
|
|
min-height: 100vh;
|
|
display: flex;
|
|
flex-direction: column;
|
|
background: var(--bg-secondary);
|
|
}
|
|
|
|
/* Page Header with Back Button */
|
|
.npc-chat-header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 1rem;
|
|
padding: 1rem;
|
|
background: var(--bg-primary);
|
|
border-bottom: 2px solid var(--play-border);
|
|
position: sticky;
|
|
top: 0;
|
|
z-index: 100;
|
|
}
|
|
|
|
.npc-chat-back-btn {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.5rem 1rem;
|
|
background: var(--bg-input);
|
|
color: var(--text-primary);
|
|
text-decoration: none;
|
|
border-radius: 4px;
|
|
border: 1px solid var(--play-border);
|
|
font-family: var(--font-heading);
|
|
font-size: 0.9rem;
|
|
transition: all 0.2s ease;
|
|
}
|
|
|
|
.npc-chat-back-btn:hover {
|
|
background: var(--bg-tertiary);
|
|
border-color: var(--accent-gold);
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.npc-chat-back-btn svg {
|
|
width: 20px;
|
|
height: 20px;
|
|
}
|
|
|
|
.npc-chat-title {
|
|
flex: 1;
|
|
margin: 0;
|
|
font-family: var(--font-heading);
|
|
font-size: 1.5rem;
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
/* Chat Container - Full Height Layout */
|
|
.npc-chat-page .npc-chat-container {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
padding: 1rem;
|
|
gap: 1rem;
|
|
overflow: hidden;
|
|
}
|
|
|
|
/* Responsive Layout for NPC Chat Content */
|
|
/* Desktop: 3-column grid */
|
|
@media (min-width: 1025px) {
|
|
.npc-chat-page .npc-chat-container {
|
|
display: grid;
|
|
grid-template-columns: 250px 1fr 300px;
|
|
gap: 1.5rem;
|
|
max-width: 1400px;
|
|
margin: 0 auto;
|
|
width: 100%;
|
|
}
|
|
}
|
|
|
|
/* Mobile: Stacked layout */
|
|
@media (max-width: 1024px) {
|
|
.npc-chat-page .npc-chat-container {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 1rem;
|
|
}
|
|
|
|
/* Compact profile on mobile */
|
|
.npc-chat-page .npc-profile {
|
|
flex-direction: row;
|
|
flex-wrap: wrap;
|
|
align-items: flex-start;
|
|
gap: 1rem;
|
|
}
|
|
|
|
.npc-chat-page .npc-portrait {
|
|
width: 80px;
|
|
height: 80px;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.npc-chat-page .npc-profile-info {
|
|
flex: 1;
|
|
min-width: 150px;
|
|
}
|
|
|
|
.npc-chat-page .npc-relationship,
|
|
.npc-chat-page .npc-profile-tags,
|
|
.npc-chat-page .npc-interaction-stats {
|
|
width: 100%;
|
|
}
|
|
|
|
/* Conversation takes most of the vertical space */
|
|
.npc-chat-page .npc-conversation {
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
min-height: 400px;
|
|
}
|
|
|
|
/* History panel is collapsible on mobile */
|
|
.npc-chat-page .npc-history-panel {
|
|
max-height: 200px;
|
|
overflow-y: auto;
|
|
border-top: 1px solid var(--play-border);
|
|
padding-top: 1rem;
|
|
}
|
|
}
|
|
|
|
/* Ensure chat history fills available space on page */
|
|
.npc-chat-page .chat-history {
|
|
flex: 1;
|
|
overflow-y: auto;
|
|
min-height: 300px;
|
|
}
|
|
|
|
/* Fix chat input to bottom on mobile */
|
|
@media (max-width: 1024px) {
|
|
.npc-chat-page .chat-input-form {
|
|
position: sticky;
|
|
bottom: 0;
|
|
background: var(--bg-secondary);
|
|
padding: 0.75rem 0;
|
|
border-top: 1px solid var(--play-border);
|
|
margin-top: 0.5rem;
|
|
}
|
|
}
|
|
|
|
|
|
/* ===== QUEST MODAL STYLES ===== */
|
|
|
|
/* Quest Offer Modal */
|
|
.quest-offer-modal {
|
|
max-width: 550px;
|
|
}
|
|
|
|
.quest-offer-header-info,
|
|
.quest-detail-header-info {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
flex: 1;
|
|
}
|
|
|
|
.quest-offer-body,
|
|
.quest-detail-body {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 1rem;
|
|
}
|
|
|
|
/* Quest Giver Section */
|
|
.quest-offer-giver,
|
|
.quest-detail-giver {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.75rem;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.quest-giver-icon {
|
|
font-size: 1.25rem;
|
|
}
|
|
|
|
.quest-giver-name {
|
|
font-weight: 600;
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.quest-giver-says {
|
|
color: var(--text-muted);
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.quest-giver-label {
|
|
color: var(--text-muted);
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
/* Quest Dialogue */
|
|
.quest-offer-dialogue {
|
|
padding: 1rem;
|
|
background: rgba(243, 156, 18, 0.1);
|
|
border-left: 3px solid var(--accent-gold);
|
|
border-radius: 0 6px 6px 0;
|
|
}
|
|
|
|
.quest-dialogue-text {
|
|
margin: 0;
|
|
color: var(--text-secondary);
|
|
font-style: italic;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
/* Quest Description */
|
|
.quest-offer-description,
|
|
.quest-detail-description {
|
|
color: var(--text-secondary);
|
|
line-height: 1.6;
|
|
}
|
|
|
|
.quest-offer-description p,
|
|
.quest-detail-description p {
|
|
margin: 0;
|
|
}
|
|
|
|
/* Quest Sections */
|
|
.quest-offer-section,
|
|
.quest-detail-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.quest-section-title {
|
|
font-size: var(--text-sm);
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
margin: 0;
|
|
padding-bottom: 0.375rem;
|
|
border-bottom: 1px solid var(--play-border);
|
|
}
|
|
|
|
/* Quest Objectives in Modal */
|
|
.quest-offer-objectives {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.5rem;
|
|
}
|
|
|
|
.quest-offer-objective {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.5rem;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.objective-bullet {
|
|
color: var(--accent-gold);
|
|
font-size: 1.25rem;
|
|
}
|
|
|
|
.objective-text {
|
|
flex: 1;
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.objective-count {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
/* Quest Detail Objectives with Progress */
|
|
.quest-detail-objectives {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.quest-detail-objective {
|
|
padding: 0.75rem;
|
|
background: var(--bg-input);
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.quest-detail-objective.objective-complete {
|
|
background: rgba(16, 185, 129, 0.1);
|
|
border: 1px solid rgba(16, 185, 129, 0.3);
|
|
}
|
|
|
|
.objective-header {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.objective-check {
|
|
width: 18px;
|
|
height: 18px;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
border: 2px solid var(--play-border);
|
|
border-radius: 50%;
|
|
font-size: 12px;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
.objective-complete .objective-check {
|
|
background: #10b981;
|
|
border-color: #10b981;
|
|
color: white;
|
|
}
|
|
|
|
.text-complete,
|
|
.text-strikethrough {
|
|
text-decoration: line-through;
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
/* Progress Bar */
|
|
.objective-progress {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.progress-bar {
|
|
flex: 1;
|
|
height: 8px;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 4px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.progress-fill {
|
|
height: 100%;
|
|
background: linear-gradient(90deg, var(--accent-gold), var(--accent-gold-hover));
|
|
border-radius: 4px;
|
|
transition: width 0.3s ease;
|
|
}
|
|
|
|
.progress-text {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
min-width: 40px;
|
|
text-align: right;
|
|
}
|
|
|
|
/* Quest Rewards Grid */
|
|
.quest-rewards-grid {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
gap: 0.75rem;
|
|
}
|
|
|
|
.quest-reward-item {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.375rem;
|
|
padding: 0.5rem 0.75rem;
|
|
background: var(--bg-input);
|
|
border-radius: 4px;
|
|
}
|
|
|
|
.reward-icon {
|
|
font-size: 1rem;
|
|
}
|
|
|
|
.reward-icon--xp {
|
|
color: #10b981;
|
|
}
|
|
|
|
.reward-icon--gold {
|
|
color: var(--accent-gold);
|
|
}
|
|
|
|
.reward-icon--item {
|
|
color: #8b5cf6;
|
|
}
|
|
|
|
.reward-value {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
/* Quest Status Bar */
|
|
.quest-status-bar {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.75rem;
|
|
padding: 0.75rem 1rem;
|
|
border-radius: 6px;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.quest-status-bar--active {
|
|
background: rgba(59, 130, 246, 0.15);
|
|
border: 1px solid rgba(59, 130, 246, 0.3);
|
|
}
|
|
|
|
.quest-status-bar--ready {
|
|
background: rgba(16, 185, 129, 0.15);
|
|
border: 1px solid rgba(16, 185, 129, 0.3);
|
|
}
|
|
|
|
.status-icon {
|
|
font-size: 1.25rem;
|
|
}
|
|
|
|
.quest-status-bar--active .status-icon {
|
|
color: #3b82f6;
|
|
}
|
|
|
|
.quest-status-bar--ready .status-icon {
|
|
color: #10b981;
|
|
}
|
|
|
|
.status-text {
|
|
font-weight: 600;
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.status-hint {
|
|
font-size: var(--text-sm);
|
|
color: var(--text-muted);
|
|
margin-left: auto;
|
|
}
|
|
|
|
/* Quest Warning */
|
|
.quest-offer-warning {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 0.75rem 1rem;
|
|
background: rgba(239, 68, 68, 0.15);
|
|
border: 1px solid rgba(239, 68, 68, 0.3);
|
|
border-radius: 6px;
|
|
color: #ef4444;
|
|
}
|
|
|
|
.warning-icon {
|
|
font-size: 1.25rem;
|
|
}
|
|
|
|
.warning-text {
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
/* Quest Meta Info */
|
|
.quest-detail-meta {
|
|
display: flex;
|
|
gap: 0.5rem;
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
padding-top: 0.5rem;
|
|
border-top: 1px solid var(--play-border);
|
|
}
|
|
|
|
/* Quest Footer Actions */
|
|
.quest-offer-footer,
|
|
.quest-detail-footer {
|
|
display: flex;
|
|
gap: 0.75rem;
|
|
justify-content: flex-end;
|
|
}
|
|
|
|
/* Quest Success/Complete/Abandon Modals */
|
|
.quest-success-modal,
|
|
.quest-complete-modal,
|
|
.quest-abandon-modal,
|
|
.quest-error-modal {
|
|
max-width: 400px;
|
|
text-align: center;
|
|
}
|
|
|
|
.quest-success-text,
|
|
.quest-complete-title {
|
|
font-size: var(--text-lg);
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.quest-success-hint {
|
|
color: var(--text-muted);
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.quest-level-up {
|
|
padding: 0.75rem;
|
|
background: rgba(243, 156, 18, 0.2);
|
|
border: 1px solid var(--accent-gold);
|
|
border-radius: 6px;
|
|
color: var(--accent-gold);
|
|
font-weight: 600;
|
|
margin: 0.75rem 0;
|
|
}
|
|
|
|
.quest-rewards-received {
|
|
text-align: left;
|
|
padding: 1rem;
|
|
background: var(--bg-input);
|
|
border-radius: 6px;
|
|
}
|
|
|
|
.quest-rewards-received h4 {
|
|
margin: 0 0 0.5rem 0;
|
|
font-size: var(--text-sm);
|
|
color: var(--text-primary);
|
|
}
|
|
|
|
.quest-rewards-received ul {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 0.375rem;
|
|
}
|
|
|
|
.quest-rewards-received li {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
font-size: var(--text-sm);
|
|
color: var(--text-secondary);
|
|
}
|
|
|
|
.quest-error-text {
|
|
color: #ef4444;
|
|
}
|
|
|
|
/* ===== ENHANCED SIDEBAR QUEST STYLES ===== */
|
|
|
|
/* Clickable Quest Items */
|
|
.quest-item {
|
|
cursor: pointer;
|
|
transition: all 0.2s ease;
|
|
border: 1px solid transparent;
|
|
}
|
|
|
|
.quest-item:hover {
|
|
border-color: var(--accent-gold);
|
|
transform: translateX(2px);
|
|
}
|
|
|
|
.quest-item:focus {
|
|
outline: 2px solid var(--accent-gold);
|
|
outline-offset: 2px;
|
|
}
|
|
|
|
.quest-item:active {
|
|
transform: translateX(1px);
|
|
}
|
|
|
|
/* Ready to Complete State */
|
|
.quest-item--ready {
|
|
border: 1px solid rgba(16, 185, 129, 0.5);
|
|
background: rgba(16, 185, 129, 0.1);
|
|
}
|
|
|
|
.quest-item--ready:hover {
|
|
border-color: #10b981;
|
|
}
|
|
|
|
/* Ready Banner in Sidebar */
|
|
.quest-ready-banner {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.375rem;
|
|
padding: 0.375rem 0.5rem;
|
|
background: rgba(16, 185, 129, 0.2);
|
|
border-radius: 4px;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.ready-icon {
|
|
color: #10b981;
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.ready-text {
|
|
color: #10b981;
|
|
font-size: var(--text-xs);
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* Overall Quest Progress Bar */
|
|
.quest-overall-progress {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
margin-top: 0.5rem;
|
|
padding-top: 0.5rem;
|
|
border-top: 1px solid var(--play-border);
|
|
}
|
|
|
|
.mini-progress-bar {
|
|
flex: 1;
|
|
height: 4px;
|
|
background: var(--bg-tertiary);
|
|
border-radius: 2px;
|
|
overflow: hidden;
|
|
}
|
|
|
|
.mini-progress-fill {
|
|
height: 100%;
|
|
background: var(--accent-gold);
|
|
border-radius: 2px;
|
|
transition: width 0.3s ease;
|
|
}
|
|
|
|
.mini-progress-text {
|
|
font-size: var(--text-xs);
|
|
color: var(--text-muted);
|
|
}
|
|
|
|
/* Empty Quest State */
|
|
.quest-empty {
|
|
display: flex;
|
|
flex-direction: column;
|
|
align-items: center;
|
|
gap: 0.5rem;
|
|
padding: 1.5rem 1rem;
|
|
}
|
|
|
|
.empty-icon {
|
|
font-size: 2rem;
|
|
opacity: 0.5;
|
|
}
|
|
|
|
.empty-text {
|
|
margin: 0;
|
|
color: var(--text-secondary);
|
|
font-size: var(--text-sm);
|
|
}
|
|
|
|
.empty-hint {
|
|
margin: 0;
|
|
color: var(--text-muted);
|
|
font-size: var(--text-xs);
|
|
}
|
|
|
|
/* Difficulty Epic (for future quests) */
|
|
.quest-difficulty--epic {
|
|
background: rgba(139, 92, 246, 0.2);
|
|
color: #8b5cf6;
|
|
}
|
|
|
|
/* Danger Button for Abandon */
|
|
.btn--danger {
|
|
background: rgba(239, 68, 68, 0.2);
|
|
color: #ef4444;
|
|
border: 1px solid #ef4444;
|
|
}
|
|
|
|
.btn--danger:hover {
|
|
background: #ef4444;
|
|
color: white;
|
|
}
|