diabolic6045's picture
Upload 11 files
77873df verified
:root[data-theme="light"] {
--bg-primary: #f8f9fa;
--bg-secondary: #ffffff;
--text-primary: #2c3e50;
--text-secondary: #6c757d;
--accent: #3498db;
--border: #e9ecef;
--shadow: rgba(0,0,0,0.1);
--menu-bg: rgba(255, 255, 255, 0.95);
}
:root[data-theme="dark"] {
--bg-primary: #1a1a1a;
--bg-secondary: #121212;
--text-primary: #e9ecef;
--text-secondary: #adb5bd;
--accent: #61dafb;
--border: #404040;
--shadow: rgba(0, 0, 0, 0.3);
--menu-bg: rgba(18, 18, 18, 0.95);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
transition: background-color 0.3s, color 0.3s;
}
body {
font-family: 'Crimson Text', Georgia, serif;
line-height: 1.8;
background-color: var(--bg-primary);
color: var(--text-primary);
min-height: 100vh;
}
.menu-toggle {
position: fixed;
top: 1rem;
right: 1rem;
z-index: 1001;
background: none;
border: none;
color: var(--text-primary);
font-size: 1.5rem;
cursor: pointer;
width: 40px;
height: 40px;
border-radius: 50%;
background-color: var(--bg-secondary);
box-shadow: 0 2px 10px var(--shadow);
}
.settings-panel {
position: fixed;
top: 0;
right: -300px;
width: 300px;
height: 100vh;
background-color: var(--menu-bg);
padding: 2rem;
box-shadow: -5px 0 15px var(--shadow);
transition: right 0.3s ease;
z-index: 1000;
backdrop-filter: blur(10px);
}
.settings-panel.active {
right: 0;
}
.settings-header {
margin-bottom: 2rem;
text-align: center;
}
.settings-content {
display: flex;
flex-direction: column;
gap: 0.7rem;
}
select {
width: 100%;
padding: 0.8rem;
border: 2px solid var(--border);
border-radius: 8px;
background-color: var(--bg-secondary);
color: var(--text-primary);
font-size: 1rem;
cursor: pointer;
outline: none;
}
.theme-toggle {
background: none;
border: 2px solid var(--border);
color: var(--text-primary);
cursor: pointer;
padding: 0.8rem;
border-radius: 8px;
width: 100%;
font-size: 1rem;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
}
.story-container {
max-width: 800px;
margin: 0 auto;
padding: 2rem;
padding-top: 4rem;
}
.story-paragraph {
font-size: 1.2rem;
margin-bottom: 1.5rem;
line-height: 1.8;
opacity: 0;
transform: translateY(20px);
animation: fadeIn 0.8s ease-out forwards;
letter-spacing: 0.3px;
white-space: pre-wrap; /* Preserve whitespace and wrap text */
font-family: inherit; /* Use the same font as body */
background: none; /* Remove pre element's default background */
border: none; /* Remove pre element's default border */
overflow-x: hidden; /* Prevent horizontal scrolling */
width: 100%; /* Take full width of container */
}
.loading {
display: flex;
justify-content: center;
align-items: center;
padding: 2rem;
color: var(--text-secondary);
}
.loading-dots {
display: flex;
gap: 0.5rem;
}
.loading-dots span {
width: 8px;
height: 8px;
background-color: var(--accent);
border-radius: 50%;
animation: bounce 0.5s infinite alternate;
}
.loading-dots span:nth-child(2) { animation-delay: 0.2s; }
.loading-dots span:nth-child(3) { animation-delay: 0.4s; }
@keyframes fadeIn {
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes bounce {
to {
transform: translateY(-8px);
}
}
@media (max-width: 768px) {
.story-container {
padding: 1rem;
padding-top: 4rem;
}
.story-paragraph {
font-size: 1.1rem;
line-height: 1.7;
}
.settings-panel {
width: 100%;
right: -100%;
}
}
/* Reading Progress Bar */
.progress-bar {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 4px;
background-color: var(--border);
z-index: 1002;
}
.progress {
height: 100%;
background-color: var(--accent);
width: 0%;
transition: width 0.1s;
}
/* Font size controls */
.font-size-controls {
display: flex;
gap: 0.5rem;
margin-top: 1rem;
}
.font-size-btn {
padding: 0.5rem 1rem;
border: 1px solid var(--border);
background: var(--bg-secondary);
color: var(--text-primary);
border-radius: 4px;
cursor: pointer;
}
/* Reading Time Indicator */
.reading-info {
position: fixed;
bottom: 1rem;
right: 1rem;
background-color: var(--bg-secondary);
padding: 0.5rem 1rem;
border-radius: 20px;
box-shadow: 0 2px 10px var(--shadow);
font-size: 0.9rem;
color: var(--text-secondary);
z-index: 1000;
display: flex;
align-items: center;
gap: 0.5rem;
opacity: 0.8;
transition: opacity 0.3s;
}
.reading-info:hover {
opacity: 1;
}
/* Text-to-Speech Controls */
.tts-controls {
position: fixed;
bottom: 1rem;
right: 1rem;
display: flex;
gap: 0.5rem;
z-index: 1000;
}
.tts-btn {
width: 40px;
height: 40px;
border-radius: 50%;
background-color: var(--bg-secondary);
color: var(--text-primary);
border: none;
cursor: pointer;
box-shadow: 0 2px 10px var(--shadow);
display: flex;
align-items: center;
justify-content: center;
transition: transform 0.2s;
}
.tts-btn:hover {
transform: scale(1.1);
}
.tts-btn.active {
color: var(--accent);
}
/* Genre-specific themes */
.theme-group {
display: none;
}
.theme-group.active {
display: block;
}
/* Enhanced Settings Panel */
.settings-section {
margin-top: 1rem;
padding: 0.7rem;
background-color: var(--bg-secondary);
border-radius: 8px;
box-shadow: 0 2px 5px var(--shadow);
}
.appearance-controls {
display: flex;
flex-direction: column;
gap: 1rem;
}
.font-family-select {
width: 100%;
padding: 0.5rem;
border: 1px solid var(--border);
border-radius: 4px;
background-color: var(--bg-primary);
color: var(--text-primary);
}
.font-size-controls {
display: flex;
gap: 0.5rem;
justify-content: center;
}
.font-size-btn {
padding: 0.5rem 1rem;
border: 1px solid var(--border);
background: var(--bg-secondary);
color: var(--text-primary);
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
}
.font-size-btn:hover {
background: var(--accent);
color: var(--bg-secondary);
}
.theme-toggle {
width: 100%;
padding: 0.5rem;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
background: var(--bg-secondary);
border: 1px solid var(--border);
color: var(--text-primary);
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
}
.theme-toggle:hover {
background: var(--accent);
color: var(--bg-secondary);
}
/* Mobile Optimizations */
@media (max-width: 768px) {
.settings-panel {
width: 100%;
right: -100%;
}
.reading-info {
bottom: 4rem;
right: 1rem;
font-size: 0.8rem;
}
.appearance-controls {
gap: 0.8rem;
}
.font-size-controls {
justify-content: space-between;
}
.font-size-btn {
flex: 1;
}
}
/* Swipe Indicator */
.swipe-indicator {
position: fixed;
bottom: 50%;
left: 50%;
transform: translate(-50%, 50%);
background-color: var(--bg-secondary);
padding: 1rem;
border-radius: 10px;
box-shadow: 0 2px 10px var(--shadow);
display: none;
animation: fadeInOut 2s ease-in-out;
z-index: 1000;
}
@keyframes fadeInOut {
0%, 100% { opacity: 0; }
50% { opacity: 1; }
}
/* Add new styles for initial loading animation */
.initial-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 3rem;
text-align: center;
color: var(--text-secondary);
}
.initial-loading h3 {
margin-bottom: 1.5rem;
color: var(--text-primary);
}
.quill-loading {
width: 50px;
height: 50px;
margin-bottom: 1rem;
background: var(--accent);
mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M15.78 15.84S18.64 13 19.61 12c3.07-3.07 4.24-6.29 2.83-7.7s-4.63-.24-7.7 2.83l-3.84 3.84M9.63 8.88S6.77 11.74 5.8 12.73c-3.07 3.07-4.24 6.29-2.83 7.7s4.63.24 7.7-2.83l3.84-3.84'/%3E%3C/svg%3E") center/contain no-repeat;
animation: write 1s infinite;
}
@keyframes write {
0% { transform: translateX(-15px) rotate(-45deg); }
50% { transform: translateX(15px) rotate(-45deg); }
100% { transform: translateX(-15px) rotate(-45deg); }
}
.app-logo {
width: 4px; /* Adjust size as needed */
height: 4px;
object-fit: contain;
margin-right: 8px;
}
.app-name {
position: fixed;
top: 1rem;
left: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
text-decoration: none;
color: var(--text-primary);
font-size: 1rem;
font-weight: 600;
z-index: 1001;
padding: 0.5rem 1rem;
background: var(--bg-secondary);
border-radius: 20px;
box-shadow: 0 2px 10px var(--shadow);
transition: transform 0.2s;
}
.app-name:hover {
transform: translateY(-2px);
}
.app-icon {
font-size: 1rem;
}
/* Add these styles */
.app-name, .reading-info, .tts-controls {
transition: opacity 0.3s, visibility 0.3s;
}
.hide-ui .app-name,
.hide-ui .reading-info,
.hide-ui .tts-controls {
opacity: 0;
visibility: hidden;
}