Files
rpg-companion-sillytavern/style.css
T
Lucas 'Paperboy' Rose-Winters aca7478bcc fix: resolve panel collapse animation and import errors
- Fix chevron button positioning to move with collapsed panel edge
- Replace broken dynamic imports with static imports in ensureHtmlCleaningRegex
- Add smooth bidirectional expand/collapse animations
- Implement positioning-based layout for smooth transitions
- Add content opacity fade synchronized with panel width changes

This fixes the chevron button remaining stationary during collapse,
eliminates "Failed to fetch dynamically imported module" errors,
and provides smooth animations in both expand and collapse directions.
2025-10-15 15:47:13 +11:00

3050 lines
68 KiB
CSS

/* Ensure chat stays centered when panel is visible */
body:has(.rpg-panel.rpg-position-right) #sheld {
margin: auto !important;
}
body:has(.rpg-panel.rpg-position-left) #sheld {
margin: auto !important;
}
/* ============================================
RPG COMPANION - GAME-LIKE UI - RESPONSIVE
============================================ */
/* CSS Variables for Theming - Default uses SillyTavern's variables */
.rpg-panel,
#rpg-thought-panel,
#rpg-thought-icon {
--rpg-bg: var(--SmartThemeBlurTintColor, rgba(26, 26, 46, 0.9));
--rpg-accent: var(--black30a, rgba(22, 33, 62, 0.9));
--rpg-text: var(--SmartThemeBodyColor, #eaeaea);
--rpg-highlight: var(--SmartThemeQuoteColor, #e94560);
--rpg-border: var(--SmartThemeBorderColor, #0f3460);
--rpg-shadow: rgba(0, 0, 0, 0.5);
}
/* Main Panel Container - Fills available margin space */
.rpg-panel {
position: fixed;
top: var(--topBarBlockSize);
bottom: 0;
width: auto;
background: var(--rpg-bg);
box-shadow: 0 0 20px var(--rpg-shadow);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
box-sizing: border-box;
z-index: 1000;
color: var(--rpg-text);
display: flex;
flex-direction: column;
overflow: visible;
transition: width 0.3s ease, left 0.3s ease, right 0.3s ease, transform 0.3s ease;
}
/* Collapsed state */
.rpg-panel.rpg-collapsed {
max-width: 40px !important;
min-width: 40px !important;
}
/* Fix positioning when collapsed - panel should stick to correct edge */
.rpg-panel.rpg-position-right.rpg-collapsed {
left: calc(100vw - 40px);
right: 0;
}
.rpg-panel.rpg-position-left.rpg-collapsed {
right: calc(100vw - 40px);
left: 0;
}
.rpg-panel.rpg-collapsed .rpg-game-container {
opacity: 0;
pointer-events: none;
}
/* Collapse/Expand Toggle Button */
.rpg-collapse-toggle {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 30px;
height: 80px;
background: var(--rpg-accent);
border: 2px solid var(--rpg-border);
color: var(--rpg-highlight);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: 10001;
transition: all 0.3s ease;
font-size: 16px;
box-shadow: 0 0 10px var(--rpg-shadow);
pointer-events: auto;
}
.rpg-collapse-toggle:hover {
background: var(--rpg-highlight);
color: var(--rpg-bg);
box-shadow: 0 0 15px var(--rpg-highlight);
}
/* Position collapse button on the left side for right panel */
.rpg-panel.rpg-position-right .rpg-collapse-toggle {
left: -32px;
border-radius: 8px 0 0 8px;
}
/* Position collapse button on the right side for left panel */
.rpg-panel.rpg-position-left .rpg-collapse-toggle {
right: -32px;
border-radius: 0 8px 8px 0;
}
/* Hide collapse button for top position */
.rpg-panel.rpg-position-top .rpg-collapse-toggle {
display: none;
}
/* Right Position (Default) - Panel fills right margin */
.rpg-panel.rpg-position-right {
right: 0;
left: var(--sheldWidth, calc(100vw - 380px));
min-width: 280px;
border-left: 3px solid var(--rpg-border);
box-shadow: -5px 0 20px var(--rpg-shadow);
}
/* Left Position - Panel fills left margin */
.rpg-panel.rpg-position-left {
left: 0;
right: var(--sheldWidth, calc(100vw - 380px));
min-width: 280px;
border-right: 3px solid var(--rpg-border);
box-shadow: 5px 0 20px var(--rpg-shadow);
}
/* Top Position */
.rpg-panel.rpg-position-top {
left: 0;
right: 0;
bottom: auto;
width: 100%;
max-width: 100%;
height: auto;
max-height: 300px;
border-bottom: 3px solid var(--rpg-border);
box-shadow: 0 5px 20px var(--rpg-shadow);
}
/* Top Position Layout Adjustments */
.rpg-panel.rpg-position-top .rpg-content-box {
display: flex;
flex-direction: row;
gap: 15px;
}
.rpg-panel.rpg-position-top .rpg-section {
flex: 1;
min-width: 0;
}
.rpg-panel.rpg-position-top .rpg-divider {
display: none;
}
.rpg-panel.rpg-position-top .rpg-stats-grid {
gap: 8px;
}
.rpg-panel.rpg-position-top .rpg-stat-row {
gap: 8px;
}
.rpg-panel.rpg-position-top .rpg-stat-label {
min-width: 90px;
}
.rpg-panel.rpg-position-top .rpg-stat-bar {
height: 18px;
}
/* Mobile Responsiveness */
@media (max-width: 1024px) {
.rpg-panel.rpg-position-right,
.rpg-panel.rpg-position-left {
min-width: 260px;
}
}
@media (max-width: 768px) {
.rpg-panel.rpg-position-right,
.rpg-panel.rpg-position-left {
min-width: 240px;
}
.rpg-section-title {
font-size: 1em;
}
}
@media (max-width: 480px) {
.rpg-panel.rpg-position-right,
.rpg-panel.rpg-position-left {
left: 0 !important;
right: 0 !important;
width: 100%;
height: 50vh;
top: auto;
bottom: 0;
}
.rpg-panel.rpg-position-top {
max-height: 40vh;
}
}
.rpg-panel.rpg-position-top .rpg-stats-title {
font-size: 14px;
}
.rpg-panel.rpg-position-top .rpg-mood {
font-size: 11px;
padding: 6px;
}
.rpg-panel.rpg-position-top .rpg-classic-stats {
margin-top: 8px;
padding: 8px;
}
.rpg-panel.rpg-position-top .rpg-classic-stats-title {
font-size: 11px;
margin-bottom: 8px;
}
.rpg-panel.rpg-position-top .rpg-classic-stats-grid {
gap: 6px;
}
.rpg-panel.rpg-position-top .rpg-classic-stat {
padding: 4px;
}
.rpg-panel.rpg-position-top .rpg-classic-stat-label {
font-size: 9px;
}
.rpg-panel.rpg-position-top .rpg-classic-stat-value {
font-size: 14px;
}
/* ============================================
ANIMATIONS
============================================ */
/* Only apply animations when enabled */
.rpg-panel.rpg-animations-enabled .rpg-stat-fill {
transition: width 0.8s cubic-bezier(0.4, 0, 0.2, 1);
}
.rpg-panel.rpg-animations-enabled .rpg-stat-bar {
transition: all 0.3s ease;
}
.rpg-panel.rpg-animations-enabled .rpg-info-content,
.rpg-panel.rpg-animations-enabled .rpg-thoughts-content {
transition: opacity 0.4s ease, transform 0.4s ease;
}
.rpg-panel.rpg-animations-enabled .rpg-info-line {
animation: slideInFromLeft 0.5s ease-out backwards;
}
.rpg-panel.rpg-animations-enabled .rpg-info-line:nth-child(1) { animation-delay: 0.1s; }
.rpg-panel.rpg-animations-enabled .rpg-info-line:nth-child(2) { animation-delay: 0.2s; }
.rpg-panel.rpg-animations-enabled .rpg-info-line:nth-child(3) { animation-delay: 0.3s; }
.rpg-panel.rpg-animations-enabled .rpg-info-line:nth-child(4) { animation-delay: 0.4s; }
.rpg-panel.rpg-animations-enabled .rpg-info-line:nth-child(5) { animation-delay: 0.5s; }
.rpg-panel.rpg-animations-enabled .rpg-thoughts-overlay {
animation: fadeInScale 0.6s ease-out;
}
.rpg-panel.rpg-animations-enabled .rpg-mood-value {
transition: all 0.3s ease;
}
.rpg-panel.rpg-animations-enabled .rpg-dice-animation {
animation: none; /* Control separately */
}
/* Disable dice animation when animations are off */
.rpg-panel:not(.rpg-animations-enabled) .rpg-dice-rolling i {
animation: none !important;
}
.rpg-panel:not(.rpg-animations-enabled) .rpg-dice-result-value {
animation: none !important;
}
@keyframes slideInFromLeft {
from {
opacity: 0;
transform: translateX(-20px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
@keyframes fadeInScale {
from {
opacity: 0;
transform: scale(0.95);
}
to {
opacity: 1;
transform: scale(1);
}
}
/* Add updating class for smooth content changes */
.rpg-panel.rpg-animations-enabled .rpg-content-updating {
animation: contentPulse 0.5s ease;
}
@keyframes contentPulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.6;
}
}
.rpg-panel.rpg-position-top .rpg-classic-stat-btn {
padding: 2px;
font-size: 12px;
}
.rpg-panel.rpg-position-top .rpg-info-content,
.rpg-panel.rpg-position-top .rpg-thoughts-content {
font-size: 12px;
max-height: 150px;
}
/* Custom Scrollbar */
.rpg-panel::-webkit-scrollbar,
#rpg-panel-content::-webkit-scrollbar,
.rpg-content-box::-webkit-scrollbar {
width: 8px;
}
.rpg-panel::-webkit-scrollbar-track,
#rpg-panel-content::-webkit-scrollbar-track,
.rpg-content-box::-webkit-scrollbar-track {
background: var(--rpg-accent);
}
.rpg-panel::-webkit-scrollbar-thumb,
#rpg-panel-content::-webkit-scrollbar-thumb,
.rpg-content-box::-webkit-scrollbar-thumb {
background: var(--rpg-highlight);
border-radius: 4px;
}
.rpg-panel::-webkit-scrollbar-thumb:hover,
#rpg-panel-content::-webkit-scrollbar-thumb:hover,
.rpg-content-box::-webkit-scrollbar-thumb:hover {
background: var(--rpg-border);
}
/* Game Container - Full height flex container */
.rpg-game-container {
padding: 12px;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
transition: opacity 0.3s ease;
}
/* Panel Content - Main scrollable area */
#rpg-panel-content {
flex: 1;
display: flex;
flex-direction: column;
gap: 6px;
overflow-y: hidden;
overflow-x: hidden;
min-height: 0;
}
/* Header - Fixed size, doesn't grow */
.rpg-panel-header {
display: flex;
justify-content: space-between;
align-items: center;
margin: 0;
margin-bottom: 8px;
padding: 0;
border-bottom: 2px solid var(--rpg-border);
flex-shrink: 0;
}
.rpg-panel-header h3 {
margin: 0;
font-size: 18px;
font-weight: bold;
display: flex;
align-items: center;
gap: 8px;
color: var(--rpg-highlight);
text-shadow: 0 0 8px var(--rpg-highlight);
letter-spacing: 0.5px;
}
.rpg-btn-icon {
padding: 8px 12px;
background: var(--rpg-accent);
border: 2px solid var(--rpg-border);
border-radius: 8px;
cursor: pointer;
color: var(--rpg-text);
transition: all 0.3s ease;
}
.rpg-btn-icon:hover {
background: var(--rpg-highlight);
border-color: var(--rpg-highlight);
transform: scale(1.05);
}
/* Loading Indicator - Fixed size */
.rpg-loading {
text-align: center;
padding: 15px;
background: var(--rpg-accent);
border-radius: 12px;
color: var(--rpg-highlight);
font-size: 14px;
font-weight: bold;
animation: pulseGlow 1.5s ease-in-out infinite;
flex-shrink: 0;
}
@keyframes pulseGlow {
0%, 100% {
opacity: 1;
box-shadow: 0 0 10px var(--rpg-highlight);
}
50% {
opacity: 0.7;
box-shadow: 0 0 20px var(--rpg-highlight);
}
}
/* Dice Roll Display - More compact */
.rpg-dice-display {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 8px;
background: rgba(0, 0, 0, 0.3);
border-radius: 8px;
border: 2px solid var(--rpg-border);
font-size: 11px;
font-weight: bold;
color: var(--rpg-text);
cursor: pointer;
transition: all 0.3s ease;
flex-shrink: 0;
}
.rpg-dice-display:hover {
background: var(--rpg-accent);
border-color: var(--rpg-highlight);
transform: scale(1.02);
}
.rpg-dice-display i {
color: var(--rpg-highlight);
font-size: 14px;
}
/* Clear dice roll button */
.rpg-clear-dice-btn {
background: rgba(255, 0, 0, 0.2);
border: 1px solid rgba(255, 0, 0, 0.4);
border-radius: 4px;
color: #ff6b6b;
font-size: 16px;
font-weight: bold;
width: 20px;
height: 20px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.2s ease;
padding: 0;
line-height: 1;
margin-left: auto;
}
.rpg-clear-dice-btn:hover {
background: rgba(255, 0, 0, 0.4);
border-color: #ff6b6b;
transform: scale(1.1);
}
.rpg-clear-dice-btn:active {
transform: scale(0.95);
}
/* Unified Content Box - Contains all sections, scales to fit viewport */
.rpg-content-box {
background: linear-gradient(135deg, var(--rpg-accent) 0%, var(--rpg-bg) 100%);
border: 2px solid var(--rpg-border);
border-radius: 10px;
padding: 8px;
box-shadow: 0 4px 18px var(--rpg-shadow), inset 0 0 12px rgba(0, 0, 0, 0.3);
display: flex;
flex-direction: column;
gap: 6px;
flex: 1;
min-height: 0;
overflow: hidden;
}
/* Section Styling - Flexible to scale with available space */
.rpg-section {
margin: 0;
padding: 0;
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow-y: auto;
overflow-x: hidden;
}
.rpg-section:empty {
display: none;
}
/* Divider - More compact */
.rpg-divider {
width: 100%;
height: 1px;
background: linear-gradient(to right, transparent, var(--rpg-highlight), transparent);
margin: 8px 0;
position: relative;
flex-shrink: 0;
}
.rpg-divider::after {
display: none; /* Remove diamond decoration for more space */
}
/* ============================================
USER STATS SECTION
============================================ */
.rpg-stats-section {
text-align: center;
display: flex;
flex-direction: column;
min-height: 0;
flex: 1;
overflow-y: auto;
overflow-x: hidden;
}
.rpg-stats-header {
display: flex;
align-items: stretch;
justify-content: space-between;
gap: clamp(6px, 1.2vh, 12px);
margin: 0 !important;
margin-bottom: 0 !important;
flex-shrink: 0;
}
.rpg-stats-header-left {
display: flex;
align-items: center;
gap: clamp(4px, 1vh, 8px);
}
.rpg-user-portrait {
width: clamp(24px, 4vh, 45px);
height: clamp(24px, 4vh, 45px);
border-radius: 50%;
border: 2px solid var(--rpg-highlight);
box-shadow: 0 0 10px var(--rpg-highlight);
object-fit: cover;
transition: transform 0.3s ease;
}
.rpg-user-portrait:hover {
transform: scale(1.1) rotate(5deg);
}
.rpg-stats-title {
font-size: clamp(8px, 1.6vh, 12px);
font-weight: bold;
color: var(--rpg-highlight);
text-shadow: 0 0 8px var(--rpg-highlight);
line-height: 1.2;
}
/* Inventory Box - Styled like a treasure chest */
.rpg-inventory-box {
flex: 1;
display: flex;
flex-direction: column;
position: relative;
background: linear-gradient(135deg, var(--rpg-accent) 0%, var(--rpg-bg) 100%);
border: 2px solid var(--rpg-highlight);
border-radius: clamp(4px, 0.8vh, 8px);
padding: clamp(4px, 0.8vh, 8px);
max-width: 200px;
max-height: clamp(60px, 8vh, 80px);
min-height: clamp(50px, 6vh, 60px);
box-shadow:
inset 0 2px 4px rgba(255, 255, 255, 0.1),
inset 0 -2px 4px rgba(0, 0, 0, 0.3),
0 2px 8px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
/* Add decorative chest details with pseudo-elements */
.rpg-inventory-box::before {
content: '';
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
width: 60%;
height: 2px;
background: var(--rpg-highlight);
opacity: 0.5;
}
.rpg-inventory-box::after {
content: '';
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
width: 80%;
height: 1px;
background: var(--rpg-highlight);
opacity: 0.3;
}
.rpg-inventory-items {
font-size: clamp(6px, 1.1vh, 9px);
color: var(--rpg-text);
line-height: 1.4;
overflow-y: auto;
flex: 1;
padding: clamp(2px, 0.4vh, 4px);
text-align: left;
}
.rpg-inventory-items::-webkit-scrollbar {
width: 3px;
}
.rpg-inventory-items::-webkit-scrollbar-track {
background: var(--rpg-bg);
border-radius: 2px;
}
.rpg-inventory-items::-webkit-scrollbar-thumb {
background: var(--rpg-highlight);
border-radius: 2px;
}
.rpg-inventory-items::-webkit-scrollbar-thumb:hover {
background: var(--rpg-text);
}
/* Stats Content - Two-column layout */
.rpg-stats-content {
display: flex;
gap: clamp(4px, 0.8vh, 8px);
flex: 1;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
}
/* Stats Left - Bars and mood */
.rpg-stats-left {
flex: 1;
display: flex;
flex-direction: column;
gap: clamp(2px, 0.4vh, 4px);
min-height: 0;
}
/* Stats Right - Attributes */
.rpg-stats-right {
flex: 1;
display: flex;
flex-direction: column;
min-height: 0;
}
.rpg-stats-grid {
display: flex;
flex-direction: column;
gap: clamp(2px, 0.4vh, 4px);
flex: 1;
min-height: 0;
}
.rpg-stat-row {
display: flex;
align-items: center;
gap: 4px;
flex: 1;
min-height: 0;
}
.rpg-stat-label {
min-width: 65px;
font-size: clamp(7px, 1.4vh, 9px);
font-weight: 600;
text-align: left;
color: var(--rpg-text);
text-transform: uppercase;
letter-spacing: 0.3px;
}
.rpg-stat-bar {
flex: 1;
height: 12px;
min-height: 8px;
max-height: 16px;
position: relative;
border-radius: 6px;
overflow: hidden;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.rpg-stat-fill {
position: absolute;
right: 0;
top: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.7);
/* Transition moved to .rpg-animations-enabled */
}
.rpg-stat-value {
color: #fff;
font-size: 9px;
font-weight: bold;
min-width: 30px;
text-align: right;
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.8);
}
.rpg-mood {
margin: 0 !important;
margin-top: 0 !important;
display: flex;
align-items: center;
gap: 6px;
font-size: 9px;
padding: 4px 6px;
background: rgba(0, 0, 0, 0.3);
border-radius: 4px;
border: 1px solid var(--rpg-border);
flex-shrink: 0;
}
.rpg-mood-emoji {
font-size: 16px;
flex-shrink: 0;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.5));
}
.rpg-mood-conditions {
flex: 1;
min-width: 0;
line-height: 1.2;
color: var(--rpg-text);
font-weight: 600;
}
/* Classic RPG Stats - Will match height of stats box automatically */
.rpg-classic-stats {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
}
.rpg-classic-stats-title {
text-align: center;
font-size: 9px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.6px;
color: var(--rpg-highlight);
margin-bottom: 4px;
flex-shrink: 0;
}
.rpg-classic-stats-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: clamp(3px, 0.5vh, 5px);
flex: 1;
align-content: stretch;
min-height: 0;
}
.rpg-classic-stat {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-evenly;
gap: clamp(1px, 0.2vh, 2px);
padding: clamp(4px, 0.6vh, 6px);
background: rgba(0, 0, 0, 0.3);
border-radius: 4px;
border: 1px solid var(--rpg-border);
box-sizing: border-box;
min-height: 0;
height: 100%;
}
.rpg-classic-stat-label {
font-size: clamp(7px, 0.9vh, 8px);
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.1px;
color: var(--rpg-text);
line-height: 1;
flex-shrink: 0;
}
.rpg-classic-stat-value {
font-size: clamp(11px, 1.4vh, 14px);
font-weight: bold;
color: var(--rpg-highlight);
text-align: center;
line-height: 1;
flex-shrink: 0;
}
.rpg-classic-stat-buttons {
display: flex;
gap: clamp(3px, 0.4vh, 5px);
align-items: center;
justify-content: center;
flex-shrink: 0;
width: 100%;
}
.rpg-classic-stat-btn {
width: clamp(18px, 2.2vh, 24px);
height: clamp(16px, 2vh, 20px);
padding: 0;
background: var(--rpg-accent);
border: 1px solid var(--rpg-border);
border-radius: 2px;
color: var(--rpg-text);
font-size: clamp(9px, 1.1vh, 12px);
font-weight: bold;
cursor: pointer;
transition: all 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
line-height: 1;
flex: 0 0 auto;
}
.rpg-classic-stat-btn:hover {
background: var(--rpg-highlight);
border-color: var(--rpg-highlight);
transform: scale(1.05);
}
.rpg-classic-stat-btn:active {
transform: scale(0.95);
}
/* ============================================
INFO BOX SECTION
============================================ */
.rpg-info-header {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
color: var(--rpg-highlight);
text-shadow: 0 0 8px var(--rpg-highlight);
flex-shrink: 0;
}
.rpg-info-content {
font-size: 12px;
line-height: 1.5;
text-align: left;
flex: 1;
min-height: 0;
overflow-y: auto;
}
/* ============================================
INFO BOX - VISUAL DASHBOARD
============================================ */
.rpg-info-section {
background: rgba(0, 0, 0, 0.2);
border: 2px solid var(--rpg-border);
border-radius: 12px;
padding: 6px;
margin-bottom: 0;
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
gap: 4px;
align-items: stretch;
width: 100%;
overflow-y: auto;
overflow-x: hidden;
}
.rpg-dashboard {
display: flex;
gap: 4px;
flex: 1;
min-height: 0;
}
/* Row 1: 4 equal-width widgets */
.rpg-dashboard-row-1 {
flex: 1;
min-height: 0;
}
.rpg-dashboard-row-1 .rpg-dashboard-widget {
flex: 1 1 0;
min-width: 0;
height: 100%;
}
/* Row 2: Full-width location */
.rpg-dashboard-row-2 {
flex: 1;
min-height: 0;
}
.rpg-dashboard-row-2 .rpg-dashboard-widget {
flex: 1;
width: 100%;
height: 100%;
}
.rpg-dashboard-widget {
background: rgba(0, 0, 0, 0.5);
border: 2px solid var(--rpg-border);
border-radius: 6px;
padding: 4px;
transition: transform 0.2s ease, box-shadow 0.2s ease;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
}
.rpg-dashboard-widget:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px var(--rpg-shadow);
}
/* Location widget - flexible height */
.rpg-location-widget {
height: 100%;
}
/* Calendar Widget */
.rpg-calendar-widget {
padding: 3px;
}
.rpg-calendar-top {
background: var(--rpg-highlight);
color: var(--rpg-bg);
font-size: clamp(6px, 1.2vh, 8px);
font-weight: bold;
padding: 2px 6px;
border-radius: 3px 3px 0 0;
width: 100%;
text-align: center;
}
.rpg-calendar-day {
background: rgba(255, 255, 255, 0.1);
color: var(--rpg-text);
font-size: clamp(8px, 1.5vw, 14px);
font-weight: bold;
padding: 6px;
width: 100%;
text-align: center;
border: 2px solid var(--rpg-highlight);
border-top: none;
flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
.rpg-calendar-year {
font-size: 7px;
color: var(--rpg-text);
opacity: 0.7;
margin-top: 1px;
}
/* Weather Widget Icon */
.rpg-weather-icon {
font-size: clamp(16px, 3vw, 32px);
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.5));
}
.rpg-weather-forecast {
font-size: 7px;
text-align: center;
margin: 0;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.2px;
opacity: 0.85;
line-height: 1;
word-wrap: break-word;
max-width: 100%;
}
.rpg-weather-forecast.rpg-editable {
margin-top: 0;
}
/* Temperature Widget - Thermometer */
.rpg-temp-widget {
gap: 3px;
}
.rpg-thermometer {
position: relative;
width: 20px;
height: 40px;
display: flex;
flex-direction: column;
align-items: center;
}
.rpg-thermometer-tube {
position: relative;
width: 8px;
height: 28px;
background: rgba(255, 255, 255, 0.1);
border: 2px solid var(--rpg-border);
border-radius: 10px 10px 0 0;
overflow: hidden;
display: flex;
align-items: flex-end;
}
.rpg-thermometer-fill {
width: 100%;
background: linear-gradient(to top, #e94560, #ff6b6b);
transition: height 0.5s ease;
border-radius: 8px 8px 0 0;
}
.rpg-thermometer-bulb {
position: absolute;
bottom: 0;
width: 14px;
height: 14px;
background: var(--rpg-highlight);
border: 2px solid var(--rpg-border);
border-radius: 50%;
z-index: 1;
}
.rpg-temp-value {
font-size: clamp(7px, 1.5vh, 9px);
font-weight: bold;
color: var(--rpg-text);
text-align: center;
}
/* Clock Widget */
.rpg-clock-widget {
gap: 3px;
}
.rpg-clock {
width: 42px;
height: 42px;
border-radius: 50%;
background: rgba(0, 0, 0, 0.4);
border: 3px solid var(--rpg-border);
box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5);
position: relative;
}
.rpg-clock-face {
width: 100%;
height: 100%;
position: relative;
}
.rpg-clock-hour,
.rpg-clock-minute {
position: absolute;
background: var(--rpg-highlight);
transform-origin: bottom center;
left: 50%;
bottom: 50%;
border-radius: 2px 2px 0 0;
}
.rpg-clock-hour {
width: 3px;
height: 12px;
margin-left: -1.5px;
opacity: 0.9;
}
.rpg-clock-minute {
width: 2px;
height: 16px;
margin-left: -1px;
}
.rpg-clock-center {
position: absolute;
width: 5px;
height: 5px;
background: var(--rpg-highlight);
border-radius: 50%;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 2;
}
.rpg-time-value {
font-size: 8px;
font-weight: bold;
color: var(--rpg-text);
}
/* Location Widget - Map */
.rpg-map-bg {
width: 100%;
height: 30px;
margin: 0;
margin-bottom: 0 !important;
background:
linear-gradient(45deg, rgba(255,255,255,0.05) 25%, transparent 25%),
linear-gradient(-45deg, rgba(255,255,255,0.05) 25%, transparent 25%),
linear-gradient(45deg, transparent 75%, rgba(255,255,255,0.05) 75%),
linear-gradient(-45deg, transparent 75%, rgba(255,255,255,0.05) 75%);
background-size: 6px 6px;
background-position: 0 0, 0 3px, 3px -3px, -3px 0px;
background-color: rgba(0, 0, 0, 0.3);
border: 2px solid var(--rpg-border);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
flex-shrink: 0;
margin-bottom: 3px;
}
.rpg-map-marker {
font-size: 16px;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.8));
animation: markerPulse 2s ease-in-out infinite;
}
@keyframes markerPulse {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-2px); }
}
.rpg-location-text {
font-size: clamp(7px, 1.4vh, 9px);
font-weight: bold;
color: var(--rpg-text);
text-align: center;
line-height: 1.2;
padding: 2px 4px;
margin: 0;
word-wrap: break-word;
overflow-wrap: break-word;
hyphens: auto;
}
/* Character Status Cards */
.rpg-character-status {
display: flex;
flex-direction: column;
gap: 4px;
margin: 0;
padding: 0;
flex-shrink: 0;
}
.rpg-character-status-card {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 6px;
background: rgba(0, 0, 0, 0.3);
border-left: 3px solid var(--rpg-highlight);
border-radius: 4px;
transition: all 0.2s ease;
}
.rpg-character-status-card:hover {
background: rgba(0, 0, 0, 0.5);
transform: translateX(3px);
}
.rpg-char-emoji {
font-size: clamp(14px, 2.5vh, 18px);
flex-shrink: 0;
filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.5));
}
.rpg-char-details {
flex: 1;
min-width: 0;
}
.rpg-char-name {
font-size: clamp(8px, 1.5vh, 10px);
font-weight: bold;
color: var(--rpg-highlight);
margin-bottom: 1px;
}
.rpg-char-traits {
font-size: clamp(7px, 1.3vh, 9px);
color: var(--rpg-text);
opacity: 0.8;
line-height: 1.2;
}/* Old info line styles (legacy) */
.rpg-info-line {
margin: 6px 0;
padding: 6px 10px;
background: rgba(0, 0, 0, 0.2);
border-left: 2px solid var(--rpg-highlight);
border-radius: 4px;
transition: all 0.3s ease;
}
.rpg-info-line:hover {
background: rgba(0, 0, 0, 0.4);
transform: translateX(5px);
}
/* ============================================
CHARACTER THOUGHTS SECTION
============================================ */
.rpg-thoughts-section {
text-align: center;
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
overflow-y: auto;
overflow-x: hidden;
}
.rpg-thoughts-header {
font-size: 14px;
font-weight: bold;
margin-bottom: 10px;
color: var(--rpg-highlight);
text-shadow: 0 0 8px var(--rpg-highlight);
flex-shrink: 0;
}
.rpg-thoughts-content {
position: relative;
padding: 8px;
border-radius: 8px;
border-left: 3px solid var(--rpg-highlight);
box-shadow: inset 0 0 8px rgba(0, 0, 0, 0.3);
text-align: left;
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
gap: clamp(6px, 1vh, 8px);
overflow-y: auto;
overflow-x: hidden;
/* Remove centering for multiple character cards */
}
/* Individual thought item */
.rpg-thought-item {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 8px;
margin-bottom: 8px;
background: rgba(0, 0, 0, 0.3);
border-radius: 6px;
width: 100%; /* Ensure items take full width */
box-sizing: border-box; /* Include padding in width calculation */
}
.rpg-thought-item:last-child {
margin-bottom: 0;
}
/* Character avatar with thought bubbles */
.rpg-thought-avatar {
position: relative;
flex-shrink: 0;
}
.rpg-thought-avatar img {
width: clamp(30px, 5vh, 40px);
height: clamp(30px, 5vh, 40px);
border-radius: 50%;
border: 2px solid var(--rpg-highlight);
object-fit: cover;
}
/* Thought bubbles - Left side, ascending size from bottom-left to top-right */
.rpg-thought-bubbles {
position: absolute;
bottom: -4px;
left: -8px;
display: flex;
flex-direction: column;
gap: 2px;
align-items: flex-start;
}
.rpg-bubble {
background: var(--rpg-highlight);
border-radius: 50%;
opacity: 0.8;
}
.rpg-bubble-1 {
width: 8px;
height: 8px;
}
.rpg-bubble-2 {
width: 6px;
height: 6px;
margin-left: 2px;
}
/* Thought content */
.rpg-thought-content {
flex: 1;
min-width: 0;
}
.rpg-thought-name {
font-weight: bold;
color: var(--rpg-highlight);
font-size: clamp(8px, 1.5vh, 10px);
margin-bottom: 3px;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.rpg-thought-name::before,
.rpg-thought-name::after {
content: none !important;
}
.rpg-thought-text {
font-size: clamp(9px, 1.6vh, 11px);
font-style: italic;
line-height: 1.3;
color: var(--rpg-text);
opacity: 0.9;
}
.rpg-thought-text::before {
content: ''; /* Explicitly ensure no emoji */
}
/* Overlay to fade the background portrait and provide contrast */
.rpg-thoughts-content::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(
135deg,
rgba(0, 0, 0, 0.85) 0%,
rgba(0, 0, 0, 0.75) 50%,
rgba(0, 0, 0, 0.85) 100%
);
z-index: 1;
display: none; /* Hide background overlay for new format */
}
/* Content wrapper to sit above the background */
.rpg-thoughts-overlay {
position: relative;
z-index: 2;
display: flex;
align-items: flex-start;
gap: 8px;
font-size: 12px;
font-style: italic;
line-height: 1.4;
}
/* Present Characters - Character Cards */
.rpg-character-card {
display: flex;
align-items: flex-start;
gap: clamp(8px, 1vw, 12px);
padding: clamp(6px, 1vh, 8px);
background: rgba(0, 0, 0, 0.3);
border-radius: clamp(4px, 0.5vh, 6px);
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.2s ease;
width: 100%; /* Ensure cards take full width */
box-sizing: border-box; /* Include padding and border in width calculation */
flex-shrink: 0; /* Prevent cards from shrinking */
}
.rpg-character-card:hover {
background: rgba(0, 0, 0, 0.4);
border-color: var(--rpg-highlight);
}
/* Character avatar container with relationship badge */
.rpg-character-avatar {
position: relative;
flex-shrink: 0;
}
.rpg-character-avatar img {
width: clamp(35px, 6vh, 45px);
height: clamp(35px, 6vh, 45px);
border-radius: 50%;
border: 2px solid var(--rpg-highlight);
object-fit: cover;
display: block; /* Prevent inline spacing issues */
}
/* Relationship badge in top-right corner */
.rpg-relationship-badge {
position: absolute;
top: -2px;
right: -2px;
background: var(--rpg-bg);
border: 1px solid var(--rpg-highlight);
border-radius: 50%;
width: clamp(16px, 2.5vh, 20px);
height: clamp(16px, 2.5vh, 20px);
display: flex;
align-items: center;
justify-content: center;
font-size: clamp(8px, 1.2vh, 12px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
/* Character info section */
.rpg-character-info {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: clamp(3px, 0.5vh, 5px);
overflow: hidden; /* Prevent content from overflowing */
}
/* Character header with emoji and name */
.rpg-character-header {
display: flex;
align-items: center;
gap: clamp(4px, 0.5vw, 6px);
flex-wrap: nowrap; /* Prevent wrapping */
}
.rpg-character-emoji {
font-size: clamp(12px, 2vh, 16px);
flex-shrink: 0;
}
.rpg-character-name {
font-weight: bold;
color: var(--rpg-highlight);
font-size: clamp(9px, 1.5vh, 12px);
text-transform: uppercase;
letter-spacing: 0.5px;
white-space: nowrap; /* Prevent name from wrapping */
overflow: hidden;
text-overflow: ellipsis;
}
/* Character traits/status line */
.rpg-character-traits {
font-size: clamp(8px, 1.3vh, 10px);
color: var(--rpg-text);
opacity: 0.8;
line-height: 1.3;
overflow-wrap: break-word; /* Allow long text to wrap */
word-wrap: break-word;
}
/* Placeholder styles for empty sections */
.rpg-thoughts-placeholder,
.rpg-placeholder-widget {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: clamp(12px, 2vh, 20px);
text-align: center;
opacity: 0.6;
}
.rpg-placeholder-text {
font-size: clamp(10px, 1.6vh, 14px);
color: var(--rpg-text);
font-weight: bold;
margin-bottom: clamp(4px, 0.6vh, 6px);
}
.rpg-placeholder-hint {
font-size: clamp(8px, 1.2vh, 10px);
color: var(--rpg-text);
opacity: 0.7;
font-style: italic;
}
/* Editable field styles */
.rpg-editable,
.rpg-editable-stat {
cursor: text;
transition: all 0.2s ease;
border-radius: 2px;
padding: 1px 2px;
}
.rpg-editable:hover,
.rpg-editable-stat:hover {
background: var(--rpg-accent);
outline: 1px solid var(--rpg-highlight);
}
.rpg-editable:focus,
.rpg-editable-stat:focus {
background: var(--rpg-bg);
outline: 2px solid var(--rpg-highlight);
box-shadow: 0 0 8px var(--rpg-highlight);
}
/* Edit button container and styling */
.rpg-edit-button-container {
display: flex;
justify-content: center;
padding: clamp(4px, 0.8vh, 8px);
margin-top: clamp(4px, 0.8vh, 8px);
}
.rpg-edit-button {
background: var(--rpg-accent);
border: 1px solid var(--rpg-highlight);
color: var(--rpg-text);
padding: clamp(3px, 0.6vh, 6px) clamp(6px, 1.2vh, 12px);
border-radius: clamp(3px, 0.6vh, 6px);
font-size: clamp(7px, 1.2vh, 10px);
cursor: pointer;
display: flex;
align-items: center;
gap: clamp(2px, 0.4vh, 4px);
transition: all 0.2s ease;
}
.rpg-edit-button:hover {
background: var(--rpg-highlight);
color: var(--rpg-bg);
transform: translateY(-1px);
box-shadow: 0 2px 8px var(--rpg-highlight);
}
.rpg-edit-button:active {
transform: translateY(0);
}
.rpg-edit-button i {
font-size: clamp(7px, 1.2vh, 10px);
}
/* Removed emoji icon styling - no longer needed */
/* Settings Styling */
.rpg-settings {
margin-top: 10px;
padding-top: 8px;
border-top: 1px solid #444;
}
.rpg-settings summary {
cursor: pointer;
font-weight: bold;
padding: 6px;
background: rgba(0, 0, 0, 0.2);
border-radius: 4px;
margin-bottom: 8px;
display: flex;
align-items: center;
gap: 6px;
font-size: 12px;
}
.rpg-settings summary:hover {
background: rgba(255, 255, 255, 0.1);
}
.rpg-settings-content {
padding: 8px;
}
.rpg-settings-content label {
display: block;
margin: 6px 0;
}
.rpg-setting-row {
margin: 8px 0;
}
.rpg-setting-row label {
display: block;
margin-bottom: 3px;
font-size: 11px;
}
.rpg-setting-row input[type="number"] {
width: 100%;
padding: 4px;
border: 1px solid #444;
border-radius: 3px;
background: rgba(0, 0, 0, 0.3);
color: inherit;
font-size: 11px;
}
.rpg-setting-row small {
display: block;
margin-top: 3px;
color: #888;
font-size: 10px;
}
#rpg-manual-update {
width: 100%;
margin-top: 8px;
padding: 6px;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
font-size: 12px;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.rpg-panel {
max-width: 100%;
}
.rpg-stat-label {
min-width: 80px;
font-size: 12px;
}
}
/* Animation for stats updates */
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.6;
}
}
.rpg-stat-row.updating {
animation: pulse 0.5s ease-in-out;
}
/* ============================================
SETTINGS SECTION
============================================ */
.rpg-settings {
margin-top: 15px;
padding-top: 15px;
border-top: 2px solid var(--rpg-border);
}
.rpg-settings summary {
cursor: pointer;
font-weight: bold;
padding: 12px;
background: var(--rpg-accent);
border: 2px solid var(--rpg-border);
border-radius: 10px;
margin-bottom: 15px;
display: flex;
align-items: center;
gap: 10px;
transition: all 0.3s ease;
}
.rpg-settings summary:hover {
background: var(--rpg-highlight);
border-color: var(--rpg-highlight);
transform: translateX(5px);
}
.rpg-settings-content {
padding: 15px;
background: var(--rpg-accent);
border-radius: 10px;
}
.rpg-settings-group {
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid var(--rpg-border);
}
.rpg-settings-group:last-child {
border-bottom: none;
}
.rpg-settings-group h4 {
margin: 0 0 12px 0;
font-size: 16px;
color: var(--rpg-highlight);
display: flex;
align-items: center;
gap: 8px;
}
.rpg-setting-row {
margin: 12px 0;
}
.rpg-setting-row label {
display: block;
margin-bottom: 6px;
font-size: 13px;
font-weight: 600;
}
.rpg-select,
.rpg-input {
width: 100%;
padding: 8px;
border: 2px solid var(--rpg-border);
border-radius: 6px;
background: var(--rpg-bg);
color: var(--rpg-text);
font-size: 14px;
transition: all 0.3s ease;
}
.rpg-select:focus,
.rpg-input:focus {
outline: none;
border-color: var(--rpg-highlight);
box-shadow: 0 0 10px var(--rpg-highlight);
}
.rpg-setting-row input[type="color"] {
width: 100%;
height: 40px;
padding: 4px;
border: 2px solid var(--rpg-border);
border-radius: 6px;
background: var(--rpg-bg);
cursor: pointer;
transition: all 0.3s ease;
}
.rpg-setting-row input[type="color"]:hover {
border-color: var(--rpg-highlight);
}
.rpg-setting-row small {
display: block;
margin-top: 4px;
color: #999;
font-size: 11px;
font-style: italic;
}
.rpg-custom-colors {
margin-top: 10px;
padding: 15px;
background: rgba(0, 0, 0, 0.2);
border-radius: 8px;
border: 1px solid var(--rpg-border);
}
.checkbox_label {
display: flex;
align-items: center;
gap: 8px;
margin: 10px 0;
cursor: pointer;
transition: all 0.3s ease;
}
.checkbox_label:hover {
color: var(--rpg-highlight);
}
.rpg-btn-primary {
width: 100%;
padding: 12px;
background: var(--rpg-accent);
border: 2px solid var(--rpg-border);
border-radius: 10px;
color: var(--rpg-text);
font-size: 15px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
transition: all 0.3s ease;
box-shadow: 0 4px 15px var(--rpg-shadow);
}
.rpg-btn-primary:hover {
background: var(--rpg-highlight);
border-color: var(--rpg-highlight);
transform: translateY(-2px);
box-shadow: 0 6px 20px var(--rpg-shadow);
}
.rpg-btn-primary:active {
transform: translateY(0);
}
/* Clear Cache Button - Danger style */
.rpg-btn-clear-cache {
width: 100%;
padding: 10px;
background: rgba(220, 53, 69, 0.2);
border: 2px solid rgba(220, 53, 69, 0.5);
border-radius: 8px;
color: #ff6b6b;
font-size: 13px;
font-weight: 600;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
transition: all 0.3s ease;
}
.rpg-btn-clear-cache:hover {
background: rgba(220, 53, 69, 0.3);
border-color: rgba(220, 53, 69, 0.8);
color: #ff8787;
transform: translateY(-1px);
}
.rpg-btn-clear-cache:active {
transform: translateY(0);
}
/* ============================================
THEME VARIATIONS
============================================ */
/* Sci-Fi / Synthwave Theme */
.rpg-panel[data-theme="sci-fi"] {
--rpg-bg: #0a0e27;
--rpg-accent: #1a1f3a;
--rpg-text: #00fff9;
--rpg-highlight: #ff006e;
--rpg-border: #8b00ff;
--rpg-shadow: rgba(139, 0, 255, 0.5);
}
/* Apply sci-fi theme to thought panel */
#rpg-thought-panel[data-theme="sci-fi"],
#rpg-thought-icon[data-theme="sci-fi"] {
--rpg-bg: #0a0e27;
--rpg-accent: #1a1f3a;
--rpg-text: #00fff9;
--rpg-highlight: #ff006e;
--rpg-border: #8b00ff;
--rpg-shadow: rgba(139, 0, 255, 0.5);
}
.rpg-panel[data-theme="sci-fi"] .rpg-content-box {
background: linear-gradient(135deg, #1a1f3a 0%, #0a0e27 100%);
box-shadow: 0 0 40px rgba(139, 0, 255, 0.4), inset 0 0 30px rgba(0, 0, 0, 0.5);
border: 2px solid #8b00ff;
}
.rpg-panel[data-theme="sci-fi"] .rpg-panel-header h3,
.rpg-panel[data-theme="sci-fi"] .rpg-stats-title,
.rpg-panel[data-theme="sci-fi"] .rpg-info-header,
.rpg-panel[data-theme="sci-fi"] .rpg-thoughts-header {
text-shadow: 0 0 20px #ff006e, 0 0 40px #8b00ff;
}
.rpg-panel[data-theme="sci-fi"] .rpg-divider {
background: linear-gradient(to right, transparent, #8b00ff, #ff006e, #8b00ff, transparent);
}
.rpg-panel[data-theme="sci-fi"] .rpg-thoughts-content::before {
background: linear-gradient(
135deg,
rgba(10, 14, 39, 0.9) 0%,
rgba(26, 31, 58, 0.8) 50%,
rgba(10, 14, 39, 0.9) 100%
);
}
/* Fantasy / Rustic Parchment Theme */
.rpg-panel[data-theme="fantasy"] {
--rpg-bg: #2b1810;
--rpg-accent: #3d2414;
--rpg-text: #f4e8d0;
--rpg-highlight: #d4af37;
--rpg-border: #8b6914;
--rpg-shadow: rgba(0, 0, 0, 0.7);
}
/* Apply fantasy theme to thought panel */
#rpg-thought-panel[data-theme="fantasy"],
#rpg-thought-icon[data-theme="fantasy"] {
--rpg-bg: #2b1810;
--rpg-accent: #3d2414;
--rpg-text: #f4e8d0;
--rpg-highlight: #d4af37;
--rpg-border: #8b6914;
--rpg-shadow: rgba(0, 0, 0, 0.7);
}
.rpg-panel[data-theme="fantasy"] {
background-image:
linear-gradient(rgba(43, 24, 16, 0.9), rgba(43, 24, 16, 0.9)),
url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><filter id="noise"><feTurbulence type="fractalNoise" baseFrequency="0.9" numOctaves="4" /></filter><rect width="100" height="100" filter="url(%23noise)" opacity="0.1"/></svg>');
}
.rpg-panel[data-theme="fantasy"] .rpg-content-box {
background: linear-gradient(135deg, #3d2414 0%, #2b1810 100%);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.8), inset 0 0 40px rgba(139, 105, 20, 0.2);
border: 3px solid #8b6914;
border-style: ridge;
}
.rpg-panel[data-theme="fantasy"] .rpg-panel-header h3,
.rpg-panel[data-theme="fantasy"] .rpg-stats-title,
.rpg-panel[data-theme="fantasy"] .rpg-info-header,
.rpg-panel[data-theme="fantasy"] .rpg-thoughts-header {
font-family: 'Georgia', serif;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
}
.rpg-panel[data-theme="fantasy"] .rpg-divider::after {
content: '❦';
font-size: 16px;
}
.rpg-panel[data-theme="fantasy"] .rpg-thoughts-content::before {
background: linear-gradient(
135deg,
rgba(43, 24, 16, 0.92) 0%,
rgba(61, 36, 20, 0.88) 50%,
rgba(43, 24, 16, 0.92) 100%
);
}
/* Cyberpunk / Neon Grid Theme */
.rpg-panel[data-theme="cyberpunk"] {
--rpg-bg: #000000;
--rpg-accent: #0d0d0d;
--rpg-text: #00ff41;
--rpg-highlight: #ff2a6d;
--rpg-border: #05d9e8;
--rpg-shadow: rgba(5, 217, 232, 0.5);
}
/* Apply cyberpunk theme to thought panel */
#rpg-thought-panel[data-theme="cyberpunk"],
#rpg-thought-icon[data-theme="cyberpunk"] {
--rpg-bg: #000000;
--rpg-accent: #0d0d0d;
--rpg-text: #00ff41;
--rpg-highlight: #ff2a6d;
--rpg-border: #05d9e8;
--rpg-shadow: rgba(5, 217, 232, 0.5);
}
.rpg-panel[data-theme="cyberpunk"] {
background: linear-gradient(rgba(0, 0, 0, 0.95), rgba(0, 0, 0, 0.95)),
repeating-linear-gradient(0deg, rgba(5, 217, 232, 0.1) 0px, transparent 1px, transparent 2px, rgba(5, 217, 232, 0.1) 3px),
repeating-linear-gradient(90deg, rgba(5, 217, 232, 0.1) 0px, transparent 1px, transparent 2px, rgba(5, 217, 232, 0.1) 3px);
background-size: 100% 100%, 30px 30px, 30px 30px;
}
.rpg-panel[data-theme="cyberpunk"] .rpg-content-box {
background: linear-gradient(135deg, rgba(13, 13, 13, 0.9) 0%, rgba(0, 0, 0, 0.9) 100%);
box-shadow: 0 0 40px rgba(255, 42, 109, 0.4), inset 0 0 30px rgba(5, 217, 232, 0.2);
border: 2px solid #05d9e8;
}
.rpg-panel[data-theme="cyberpunk"] .rpg-panel-header h3,
.rpg-panel[data-theme="cyberpunk"] .rpg-stats-title,
.rpg-panel[data-theme="cyberpunk"] .rpg-info-header,
.rpg-panel[data-theme="cyberpunk"] .rpg-thoughts-header {
text-shadow: 0 0 10px #ff2a6d, 0 0 20px #05d9e8, 0 0 30px #ff2a6d;
font-family: 'Courier New', monospace;
letter-spacing: 2px;
}
.rpg-panel[data-theme="cyberpunk"] .rpg-divider {
background: linear-gradient(to right, transparent, #05d9e8, #ff2a6d, #05d9e8, transparent);
height: 3px;
}
.rpg-panel[data-theme="cyberpunk"] .rpg-thoughts-content::before {
background: linear-gradient(
135deg,
rgba(0, 0, 0, 0.92) 0%,
rgba(13, 13, 13, 0.85) 50%,
rgba(0, 0, 0, 0.92) 100%
);
}
/* ============================================
RESPONSIVE DESIGN
============================================ */
@media (max-width: 768px) {
.rpg-panel {
width: 100%;
max-width: 100%;
}
body:has(.rpg-panel) #sheld {
margin-right: 0;
}
.rpg-user-portrait {
width: 60px;
height: 60px;
}
.rpg-stats-title {
font-size: 16px;
}
}
/* ============================================
ANIMATIONS
============================================ */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.rpg-section {
animation: fadeIn 0.5s ease-out;
}
.rpg-stat-row {
animation: fadeIn 0.3s ease-out;
animation-fill-mode: both;
}
.rpg-stat-row:nth-child(1) { animation-delay: 0.1s; }
.rpg-stat-row:nth-child(2) { animation-delay: 0.15s; }
.rpg-stat-row:nth-child(3) { animation-delay: 0.2s; }
.rpg-stat-row:nth-child(4) { animation-delay: 0.25s; }
.rpg-stat-row:nth-child(5) { animation-delay: 0.3s; }
/* ============================================
DICE ROLL POPUP
============================================ */
.rpg-dice-popup {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
}
.rpg-dice-popup-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(5px);
}
.rpg-dice-popup-content {
position: relative;
width: 90%;
max-width: 500px;
background: var(--rpg-bg);
border: 3px solid var(--rpg-border);
border-radius: 15px;
box-shadow: 0 10px 50px rgba(0, 0, 0, 0.9);
overflow: hidden;
animation: popupSlideIn 0.3s ease-out;
color: var(--rpg-text);
}
@keyframes popupSlideIn {
from {
opacity: 0;
transform: translateY(-50px) scale(0.9);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.rpg-dice-popup-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20px;
background: var(--rpg-accent);
border-bottom: 2px solid var(--rpg-border);
}
.rpg-dice-popup-header h3 {
margin: 0;
font-size: 20px;
color: var(--rpg-highlight);
display: flex;
align-items: center;
gap: 10px;
}
.rpg-dice-popup-body {
padding: 25px;
}
.rpg-dice-selector-container {
padding: 20px;
background: rgba(0, 0, 0, 0.3);
border-radius: 12px;
border: 2px solid var(--rpg-border);
margin-bottom: 20px;
}
.rpg-dice-selector {
display: flex;
gap: 15px;
margin-bottom: 15px;
}
.rpg-dice-input-group {
flex: 1;
}
.rpg-dice-input-group label {
display: block;
margin-bottom: 8px;
font-size: 13px;
font-weight: bold;
color: var(--rpg-text);
}
.rpg-dice-input-group input,
.rpg-dice-input-group select {
width: 100%;
padding: 10px;
border: 2px solid var(--rpg-border);
border-radius: 8px;
background: var(--rpg-accent);
color: var(--rpg-text);
font-size: 16px;
font-weight: bold;
text-align: center;
transition: all 0.3s ease;
}
.rpg-dice-input-group input:focus,
.rpg-dice-input-group select:focus {
outline: none;
border-color: var(--rpg-highlight);
box-shadow: 0 0 10px var(--rpg-highlight);
background: rgba(0, 0, 0, 0.5);
}
#rpg-dice-roll-btn {
width: 100%;
padding: 12px 20px;
background: linear-gradient(135deg, var(--rpg-highlight), var(--rpg-accent));
border: 2px solid var(--rpg-highlight);
border-radius: 10px;
color: var(--rpg-text);
font-size: 16px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.4);
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
}
#rpg-dice-roll-btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px var(--rpg-highlight);
background: var(--rpg-highlight);
}
#rpg-dice-roll-btn:active {
transform: translateY(0);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.4);
}
.rpg-dice-animation {
text-align: center;
padding: 40px 20px;
}
.rpg-dice-rolling i {
font-size: 80px;
color: var(--rpg-highlight);
animation: diceRoll 0.8s ease-in-out infinite;
}
@keyframes diceRoll {
0%, 100% {
transform: rotate(0deg) scale(1);
}
25% {
transform: rotate(90deg) scale(1.1);
}
50% {
transform: rotate(180deg) scale(1);
}
75% {
transform: rotate(270deg) scale(1.1);
}
}
.rpg-dice-rolling-text {
margin-top: 20px;
font-size: 18px;
font-weight: bold;
color: var(--rpg-highlight);
animation: pulseGlow 1s ease-in-out infinite;
}
.rpg-dice-result {
text-align: center;
padding: 30px 20px;
background: rgba(0, 0, 0, 0.3);
border-radius: 12px;
border: 2px solid var(--rpg-border);
}
.rpg-dice-result-label {
font-size: 14px;
color: var(--rpg-text);
margin-bottom: 10px;
text-transform: uppercase;
letter-spacing: 1px;
}
.rpg-dice-result-value {
font-size: 60px;
font-weight: bold;
color: var(--rpg-highlight);
text-shadow: 0 0 20px var(--rpg-highlight);
animation: resultPop 0.5s ease-out;
}
@keyframes resultPop {
0% {
transform: scale(0);
opacity: 0;
}
50% {
transform: scale(1.2);
}
100% {
transform: scale(1);
opacity: 1;
}
}
.rpg-dice-result-details {
margin-top: 15px;
font-size: 14px;
color: var(--rpg-text);
opacity: 0.8;
}
.rpg-dice-save-btn {
margin-top: 20px;
width: 100%;
max-width: 200px;
padding: 10px 20px;
background: linear-gradient(135deg, #28a745, #20c997);
border: 2px solid #28a745;
border-radius: 10px;
color: white;
font-size: 15px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(40, 167, 69, 0.4);
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.rpg-dice-save-btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(40, 167, 69, 0.6);
background: #28a745;
}
.rpg-dice-save-btn:active {
transform: translateY(0);
box-shadow: 0 2px 10px rgba(40, 167, 69, 0.4);
}
/* Theme-specific popup styles */
.rpg-dice-popup[data-theme="sci-fi"] .rpg-dice-popup-content {
--rpg-bg: #0a0e27;
--rpg-accent: #1a1f3a;
--rpg-text: #00fff9;
--rpg-highlight: #ff006e;
--rpg-border: #00fff9;
}
.rpg-dice-popup[data-theme="fantasy"] .rpg-dice-popup-content {
--rpg-bg: #2c1810;
--rpg-accent: #3d2817;
--rpg-text: #f4e8d0;
--rpg-highlight: #d4af37;
--rpg-border: #8b7355;
}
.rpg-dice-popup[data-theme="cyberpunk"] .rpg-dice-popup-content {
--rpg-bg: #0d0221;
--rpg-accent: #1a0b2e;
--rpg-text: #00ff9f;
--rpg-highlight: #ff00ff;
--rpg-border: #ff00ff;
}
/* ============================================
HTML PROMPT TOGGLE
============================================ */
.rpg-toggle-container {
padding: 8px;
background: rgba(0, 0, 0, 0.2);
border-radius: 5px;
margin: 0;
}
.rpg-toggle-label {
display: flex;
align-items: center;
cursor: pointer;
user-select: none;
}
.rpg-toggle-label input[type="checkbox"] {
margin: 0 8px 0 0;
cursor: pointer;
}
.rpg-toggle-label i {
margin-right: 6px;
}
/* ============================================
MANUAL UPDATE BUTTON
============================================ */
.rpg-manual-update-btn {
width: 353px;
height: 33px;
margin: 0 !important;
margin-top: 0 !important;
margin-bottom: 0 !important;
padding: 0;
background: linear-gradient(135deg, var(--rpg-highlight), var(--rpg-accent));
border: 2px solid var(--rpg-highlight);
border-radius: 8px;
color: var(--rpg-text);
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
flex-shrink: 0;
box-sizing: border-box;
}
.rpg-manual-update-btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px var(--rpg-highlight);
background: var(--rpg-highlight);
}
.rpg-manual-update-btn:active {
transform: translateY(0);
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}
/* ============================================
SETTINGS BUTTON
============================================ */
.rpg-btn-settings {
width: 353px;
height: 33px;
margin: 0;
padding: 0;
background: var(--rpg-accent);
border: 2px solid var(--rpg-border);
border-radius: 8px;
color: var(--rpg-text);
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
flex-shrink: 0;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
box-sizing: border-box;
}
.rpg-btn-settings:hover {
background: var(--rpg-highlight);
border-color: var(--rpg-highlight);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
}
.rpg-btn-settings:active {
transform: translateY(0);
}
/* ============================================
SETTINGS POPUP
============================================ */
.rpg-settings-popup {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 10000;
display: flex;
align-items: center;
justify-content: center;
}
.rpg-settings-popup-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.7);
backdrop-filter: blur(5px);
}
.rpg-settings-popup-content {
position: relative;
background: var(--rpg-bg);
border: 3px solid var(--rpg-border);
border-radius: 15px;
max-width: 500px;
width: 90%;
max-height: 80vh;
overflow: hidden;
display: flex;
flex-direction: column;
box-shadow: 0 10px 50px rgba(0, 0, 0, 0.9);
animation: popupSlideIn 0.3s ease-out;
color: var(--rpg-text);
}
.rpg-settings-popup-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px 20px;
background: var(--rpg-accent);
border-bottom: 1px solid var(--rpg-border);
}
.rpg-settings-popup-header h3 {
margin: 0;
font-size: 18px;
color: var(--rpg-highlight);
display: flex;
align-items: center;
gap: 10px;
}
.rpg-popup-close {
background: transparent;
border: none;
color: var(--rpg-text);
font-size: 24px;
cursor: pointer;
padding: 0;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
transition: all 0.2s ease;
}
.rpg-popup-close:hover {
background: rgba(255, 255, 255, 0.1);
color: var(--rpg-highlight);
}
.rpg-settings-popup-body {
padding: 20px;
overflow-y: auto;
flex: 1;
}
.rpg-settings-group {
margin-bottom: 20px;
padding-bottom: 20px;
border-bottom: 1px solid var(--rpg-border);
}
.rpg-settings-group:last-child {
border-bottom: none;
}
.rpg-settings-group h4 {
margin: 0 0 15px 0;
font-size: 15px;
color: var(--rpg-highlight);
display: flex;
align-items: center;
gap: 8px;
}
/* Apply theme to settings popup */
#rpg-settings-popup[data-theme="sci-fi"] .rpg-settings-popup-content {
--rpg-bg: #0a0e27;
--rpg-accent: #1a1f3a;
--rpg-text: #00ffff;
--rpg-highlight: #ff00ff;
--rpg-border: #00ffff;
}
#rpg-settings-popup[data-theme="fantasy"] .rpg-settings-popup-content {
--rpg-bg: #2b1810;
--rpg-accent: #3d2516;
--rpg-text: #f4e4c1;
--rpg-highlight: #d4af37;
--rpg-border: #8b6914;
}
#rpg-settings-popup[data-theme="cyberpunk"] .rpg-settings-popup-content {
--rpg-bg: #0d0221;
--rpg-accent: #1a0b2e;
--rpg-text: #00ff9f;
--rpg-highlight: #ff00ff;
--rpg-border: #ff00ff;
}
/* ============================================
CHAT THOUGHT OVERLAYS
============================================ */
/* Container for thought overlay on chat messages */
/* Floating thought panel - positioned next to character avatar */
#rpg-thought-panel {
position: fixed;
z-index: 1000; /* Lower z-index to stay below dropdown menus */
pointer-events: auto;
max-width: 350px;
transform: translateY(-50%);
animation: thoughtPanelFadeIn 0.4s ease-out;
}
/* Close button */
.rpg-thought-close {
position: absolute;
top: -8px;
right: -8px;
width: 24px;
height: 24px;
border-radius: 50%;
background: var(--rpg-highlight, #e94560);
color: white;
border: 2px solid var(--rpg-bg, rgba(30, 30, 50, 0.95));
font-size: 18px;
line-height: 1;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: 10001;
transition: all 0.2s ease;
}
.rpg-thought-close:hover {
transform: scale(1.1);
background: var(--rpg-text, #eaeaea);
color: var(--rpg-highlight, #e94560);
}
/* Collapsed thought icon */
#rpg-thought-icon {
position: fixed;
z-index: 1000; /* Lower z-index to stay below dropdown menus */
width: 36px;
height: 36px;
border-radius: 50%;
background: var(--rpg-bg, rgba(30, 30, 50, 0.95));
border: 2px solid var(--rpg-highlight, #e94560);
display: flex;
align-items: center;
justify-content: center;
font-size: 20px;
cursor: pointer;
animation: thoughtIconPulse 2s ease-in-out infinite;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
backdrop-filter: blur(10px);
}
#rpg-thought-icon:hover {
transform: scale(1.1);
animation: none;
}
@keyframes thoughtIconPulse {
0%, 100% {
transform: scale(1);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
}
50% {
transform: scale(1.05);
box-shadow: 0 6px 20px rgba(233, 69, 96, 0.3);
}
}
/* Thought circles floating from avatar */
.rpg-thought-circles {
position: absolute;
display: flex;
flex-direction: column-reverse; /* Reverse so circles go upward */
align-items: flex-end; /* Align to the right side */
gap: 12px;
z-index: 1;
}
.rpg-thought-circle {
background: var(--rpg-bg, rgba(30, 30, 50, 0.8));
border: 2px solid var(--rpg-highlight, #e94560);
border-radius: 50%;
animation: thoughtCirclePulse 1.5s ease-in-out infinite;
}
.rpg-circle-1 {
width: 8px;
height: 8px;
animation-delay: 0s;
align-self: flex-end; /* Circle 1 on the far right (at avatar) */
}
.rpg-circle-2 {
width: 12px;
height: 12px;
animation-delay: 0.2s;
align-self: flex-end;
margin-right: 4px; /* Move slightly left from circle 1 */
}
.rpg-circle-3 {
width: 16px;
height: 16px;
animation-delay: 0.4s;
align-self: flex-end;
margin-right: 8px; /* Move more left from circle 1 */
}
/* Thought bubble main container */
.rpg-thought-bubble {
background: var(--rpg-bg, rgba(30, 30, 50, 0.95));
border: 2px solid var(--rpg-highlight, #e94560);
border-radius: clamp(10px, 1.5vh, 14px);
padding: clamp(10px, 1.5vh, 14px);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
position: relative;
backdrop-filter: blur(15px);
max-height: 60vh;
overflow-y: auto;
overflow-x: hidden;
}
/* Custom scrollbar for thought bubble */
.rpg-thought-bubble::-webkit-scrollbar {
width: 6px;
}
.rpg-thought-bubble::-webkit-scrollbar-track {
background: rgba(0, 0, 0, 0.2);
border-radius: 3px;
}
.rpg-thought-bubble::-webkit-scrollbar-thumb {
background: var(--rpg-highlight, #e94560);
border-radius: 3px;
opacity: 0.5;
}
.rpg-thought-bubble::-webkit-scrollbar-thumb:hover {
background: var(--rpg-highlight, #e94560);
opacity: 0.8;
}
/* Individual thought item (for multiple characters) */
.rpg-thought-item {
display: flex;
gap: clamp(10px, 1.5vh, 12px);
align-items: flex-start;
}
/* Emoji box on the left */
.rpg-thought-emoji-box {
flex-shrink: 0;
width: clamp(32px, 4vh, 40px);
height: clamp(32px, 4vh, 40px);
display: flex;
align-items: center;
justify-content: center;
background: var(--rpg-accent, rgba(50, 50, 70, 0.8));
border: 1px solid var(--rpg-highlight, #e94560);
border-radius: clamp(6px, 1vh, 8px);
font-size: clamp(16px, 2vh, 20px);
}
/* Thought content on the right */
.rpg-thought-content {
flex: 1;
font-size: clamp(10px, 1.4vh, 12px);
line-height: 1.5;
color: var(--rpg-text, #eaeaea);
font-style: italic;
opacity: 0.95;
word-wrap: break-word;
overflow-wrap: break-word;
hyphens: auto;
}
/* Divider between multiple thoughts */
.rpg-thought-divider {
height: 1px;
background: linear-gradient(to right, transparent, var(--rpg-highlight, #e94560), transparent);
margin: clamp(8px, 1vh, 10px) 0;
opacity: 0.5;
}
/* Arrow pointing right (when panel is on left) */
#rpg-thought-panel.rpg-thought-panel-left .rpg-thought-bubble::after {
content: '';
position: absolute;
top: 50%;
right: -12px;
transform: translateY(-50%);
width: 0;
height: 0;
border-style: solid;
border-width: 10px 0 10px 12px;
border-color: transparent transparent transparent var(--rpg-highlight, #e94560);
}
#rpg-thought-panel.rpg-thought-panel-left .rpg-thought-bubble::before {
content: '';
position: absolute;
top: 50%;
right: -9px;
transform: translateY(-50%);
width: 0;
height: 0;
border-style: solid;
border-width: 8px 0 8px 10px;
border-color: transparent transparent transparent var(--rpg-bg, rgba(30, 30, 50, 0.95));
z-index: 1;
}
/* Arrow pointing left (when panel is on right) */
#rpg-thought-panel.rpg-thought-panel-right .rpg-thought-bubble::after {
content: '';
position: absolute;
top: 50%;
left: -12px;
transform: translateY(-50%);
width: 0;
height: 0;
border-style: solid;
border-width: 10px 12px 10px 0;
border-color: transparent var(--rpg-highlight, #e94560) transparent transparent;
}
#rpg-thought-panel.rpg-thought-panel-right .rpg-thought-bubble::before {
content: '';
position: absolute;
top: 50%;
left: -9px;
transform: translateY(-50%);
width: 0;
height: 0;
border-style: solid;
border-width: 8px 10px 8px 0;
border-color: transparent var(--rpg-bg, rgba(30, 30, 50, 0.95)) transparent transparent;
z-index: 1;
}
/* Animations */
@keyframes thoughtPanelFadeIn {
from {
opacity: 0;
transform: translateY(-50%) scale(0.9);
}
to {
opacity: 1;
transform: translateY(-50%) scale(1);
}
}
@keyframes thoughtCirclePulse {
0%, 100% {
opacity: 0.3;
transform: scale(0.8);
}
50% {
opacity: 0.8;
transform: scale(1.1);
}
}
/* Responsive positioning for mobile/narrow screens */
@media (max-width: 768px) {
#rpg-thought-panel {
position: fixed !important;
max-width: 90vw !important;
left: 50% !important;
transform: translateX(-50%) translateY(-50%) !important;
}
.rpg-thought-circles {
display: none !important;
}
#rpg-thought-panel .rpg-thought-bubble::after,
#rpg-thought-panel .rpg-thought-bubble::before {
display: none !important;
}
.rpg-thought-content {
font-size: clamp(9px, 1.2vh, 11px);
}
}
/* ============================================
MOBILE TOGGLE BUTTON (FAB)
============================================ */
/* Hide mobile toggle on desktop, show on mobile */
.rpg-mobile-toggle {
display: none;
position: fixed;
bottom: 80px;
right: 20px;
width: 56px;
height: 56px;
border-radius: 50%;
background: var(--rpg-accent, #2c3e50);
border: 3px solid var(--rpg-border, #34495e);
color: var(--rpg-text, #ecf0f1);
font-size: 24px;
cursor: pointer;
z-index: 999;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
}
.rpg-mobile-toggle:hover {
transform: scale(1.1);
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
}
.rpg-mobile-toggle:active {
transform: scale(0.95);
}
.rpg-mobile-toggle.active {
background: var(--rpg-highlight, #e74c3c);
transform: rotate(180deg);
}
/* Mobile overlay backdrop */
.rpg-mobile-overlay {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 998;
backdrop-filter: blur(2px);
}
/* Mobile-specific panel behavior */
@media (max-width: 768px) {
/* Show the FAB on mobile */
.rpg-mobile-toggle {
display: flex;
align-items: center;
justify-content: center;
}
/* Show overlay when needed */
body:has(.rpg-panel.rpg-mobile-open) .rpg-mobile-overlay {
display: block;
}
/* Hide panel by default on mobile */
.rpg-panel {
transform: translateY(100%);
transition: transform 0.3s ease-in-out;
}
/* Show panel when opened */
.rpg-panel.rpg-mobile-open {
transform: translateY(0);
z-index: 999;
}
/* On mobile, panel is always at bottom */
.rpg-panel.rpg-position-right,
.rpg-panel.rpg-position-left,
.rpg-panel.rpg-position-top {
position: fixed;
top: var(--topBarBlockSize);
bottom: 0;
left: 0;
right: 0;
width: 100%;
max-width: 100%;
border-radius: 20px 20px 0 0;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
}
/* Extra small screens - adjust FAB position */
@media (max-width: 480px) {
.rpg-mobile-toggle {
bottom: 70px;
right: 15px;
width: 52px;
height: 52px;
font-size: 22px;
}
}
/* Touch-friendly improvements for mobile */
@media (max-width: 768px) {
/* Larger touch targets for buttons */
.rpg-classic-stat-btn {
min-width: 44px;
min-height: 44px;
font-size: 18px;
}
/* More padding for editable fields */
.rpg-editable {
padding: 8px;
min-height: 44px;
}
/* Larger close buttons */
.rpg-thought-close {
min-width: 44px;
min-height: 44px;
font-size: 24px;
}
}