/* Import Google Fonts for a modern look */ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@400;700&display=swap'); @import url('https://fonts.googleapis.com/css2?family=Source+Code+Pro:wght@400;600&display=swap'); /* --- :ROOT VARIABLES --- */ :root { --font-primary: 'Poppins', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; --font-serif: 'Roboto Slab', serif; --font-monospace: 'Source Code Pro', monospace; -webkit-tap-highlight-color: transparent; /* Light Theme - Clean, professional, and airy */ --bg-gradient-light: linear-gradient(135deg, #f5f7fa 0%, #e9edf2 100%); --card-bg-light: rgba(255, 255, 255, 0.75); --text-color-light: #1d2a39; --text-secondary-light: #5b6a7a; --border-color-light: #dce1e8; --accent-color-light: #007BFF; --shadow-light: 0 8px 32px rgba(18, 38, 63, 0.1); /* Dark Theme - Deep, focused, and premium */ --bg-gradient-dark: linear-gradient(135deg, #1a1a1a 0%, #2c2c2c 100%); --card-bg-dark: rgba(34, 34, 34, 0.75); --text-color-dark: #e8eaed; --text-secondary-dark: #b0b8c2; --border-color-dark: rgba(255, 255, 255, 0.12); --accent-color-dark: #00aaff; --shadow-dark: 0 8px 32px rgba(0, 0, 0, 0.3); /* Universal Variables - Default to Light Theme */ --bg-gradient: var(--bg-gradient-light); --card-bg: var(--card-bg-light); --text-color: var(--text-color-light); --text-secondary: var(--text-secondary-light); --border-color: var(--border-color-light); --accent-color: var(--accent-color-light); --shadow-color: var(--shadow-light); --settings-bg: rgba(0, 0, 0, 0.04); /* Reading Preference Variables */ --story-font-size: 1.1rem; --story-line-height: 1.9; --story-font-family: var(--font-primary); } [data-theme="dark"] { --bg-gradient: var(--bg-gradient-dark); --card-bg: var(--card-bg-dark); --text-color: var(--text-color-dark); --text-secondary: var(--text-secondary-dark); --border-color: var(--border-color-dark); --accent-color: var(--accent-color-dark); --shadow-color: var(--shadow-dark); --settings-bg: rgba(255, 255, 255, 0.08); } /* --- GENERAL STYLES --- */ * { margin: 0; padding: 0; box-sizing: border-box; } html { scroll-behavior: smooth; } body { font-family: var(--font-primary); background: var(--bg-gradient); background-attachment: fixed; min-height: 100vh; color: var(--text-color); transition: background 0.4s ease, color 0.4s ease; } .container { max-width: 1200px; /* NEW: Wider default max-width */ margin: 0 auto; padding: 2rem 1rem; transition: max-width 0.4s ease-in-out; /* NEW: Smooth transition for width change */ } /* NEW: Class to narrow container for reading */ .container.reading-mode { max-width: 800px; } /* --- CARD & LAYOUT --- */ .card { background: var(--card-bg); border-radius: 24px; box-shadow: var(--shadow-color); border: 1px solid var(--border-color); overflow: hidden; transition: background 0.4s ease, box-shadow 0.4s ease; -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); } /* --- HEADER --- */ .header { background: transparent; color: var(--text-color); padding: 1rem 1.5rem; display: flex; align-items: center; justify-content: space-between; border-bottom: 1px solid var(--border-color); gap: 1rem; } .title { flex-grow: 1; text-align: center; font-size: 1.2rem; font-weight: 600; margin: 0 1rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .header-btn, .theme-toggle { background: transparent; border: none; color: var(--text-secondary); width: 44px; height: 44px; border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease, color 0.2s ease, transform 0.2s ease; flex-shrink: 0; } .header-btn:hover, .theme-toggle:hover { background: var(--settings-bg); color: var(--text-color); transform: scale(1.05); } .theme-toggle .moon { display: none; } .theme-toggle .sun { display: block; } [data-theme="dark"] .theme-toggle .moon { display: block; } [data-theme="dark"] .theme-toggle .sun { display: none; } /* --- INPUT & BUTTONS --- */ .input-section { padding: 2rem; } .input-group { margin-bottom: 1.75rem; } .input-group:last-child { margin-bottom: 0; } .input-group label { display: block; margin-bottom: 0.6rem; font-weight: 600; color: var(--text-secondary); font-size: 0.95rem; } .input-field { width: 100%; padding: 0.9rem 1rem; border: 1px solid var(--border-color); background: var(--settings-bg); color: var(--text-color); border-radius: 12px; font-size: 1rem; font-family: var(--font-primary); transition: border-color 0.3s ease, box-shadow 0.3s ease; } textarea.input-field { height: 200px; resize: vertical; line-height: 1.6; } .input-field:focus { outline: none; border-color: var(--accent-color); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-color) 15%, transparent); } .btn { background: var(--settings-bg); color: var(--text-color); border: 1px solid var(--border-color); padding: 0.5rem 1rem; border-radius: 10px; font-size: 0.9em; font-weight: 600; cursor: pointer; transition: all 0.2s ease; } .btn:hover { border-color: var(--accent-color); color: var(--accent-color); background: color-mix(in srgb, var(--accent-color) 10%, transparent); } .btn-primary-action { background: var(--accent-color); color: white; border: none; padding: 1rem; width: 100%; border-radius: 12px; font-size: 1.1rem; font-weight: 600; cursor: pointer; transition: transform 0.2s ease, filter 0.2s ease; } .btn-primary-action:hover { transform: translateY(-2px); filter: brightness(1.1); } .btn-primary-action:disabled { opacity: 0.6; cursor: not-allowed; transform: none; box-shadow: none; filter: none; } .file-input-label { display: flex; justify-content: space-between; align-items: center; width: 100%; padding: 0.9rem 1rem; border: 1px solid var(--border-color); background: var(--settings-bg); border-radius: 12px; cursor: pointer; transition: border-color 0.2s ease; } .file-input-label:hover { border-color: var(--accent-color); } .input-note { display: block; margin-bottom: 0.6rem; font-weight: 600; color: var(--text-secondary); font-size: 0.95rem; user-select: none; -webkit-user-select: none; cursor: default; } .file-name-display { color: var(--text-secondary); font-size: 0.9rem; font-style: italic; } .divider { display: flex; align-items: center; text-align: center; margin: 1rem 0; } .divider::before, .divider::after { content: ''; flex-grow: 1; background: var(--border-color); height: 1px; } .divider span { padding: 0 1rem; font-size: 0.85em; font-weight: 600; letter-spacing: 0.5px; color: var(--text-secondary); } .divider-text { text-align: center; font-size: 0.9rem; font-weight: 600; color: var(--text-secondary); margin: 1.5rem 0; } /* --- LIBRARY STYLES --- */ #librarySection { padding: 2rem; } .library-actions { margin-bottom: 2rem; display: flex; justify-content: space-between; align-items: center; gap: 1rem; } .view-mode-switcher { display: flex; background: transparent; border-radius: 10px; border: 1px solid var(--border-color); } .view-mode-btn { background: transparent; border: none; width: 44px; height: 40px; border-radius: 8px; cursor: pointer; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; transition: background 0.2s ease, color 0.2s ease; } .view-mode-btn:hover { color: var(--text-color); } .view-mode-btn.active { background: var(--accent-color); color: white; } .view-mode-btn:first-child { border-top-right-radius: 0; border-bottom-right-radius: 0; } .view-mode-btn:last-child { border-top-left-radius: 0; border-bottom-left-radius: 0; } .library-actions .btn-primary-action { margin-top: 0; width: auto; padding: 0.75rem 1.5rem; font-size: 1rem; } #libraryGrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 1.5rem; } .library-card { background: var(--settings-bg); border-radius: 16px; border: 1px solid var(--border-color); padding: 1.5rem; display: flex; flex-direction: column; transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease; } .library-card:hover { transform: translateY(-5px); box-shadow: var(--shadow-color); border-color: color-mix(in srgb, var(--border-color) 50%, var(--accent-color)); } .library-card-content { flex-grow: 1; } .library-card-title { font-size: 1.1rem; font-weight: 600; margin-bottom: 0.5rem; color: var(--text-color); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } .library-card-source { font-size: 0.85rem; color: var(--text-secondary); margin-bottom: 1.5rem; word-break: break-all; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; } .library-card-actions { display: flex; gap: 0.75rem; align-items: center; } .library-card .btn { flex-grow: 1; } .library-card .delete-btn { background: transparent; border: none; color: var(--text-secondary); cursor: pointer; padding: 5px; border-radius: 50%; width: 32px; height: 32px; display: flex; align-items: center; justify-content: center; transition: color 0.2s ease, background 0.2s ease; flex-shrink: 0; } .library-card .delete-btn:hover { color: #e74c3c; background: rgba(231, 76, 60, 0.1); } #libraryGrid.list-view { display: flex; flex-direction: column; gap: 1rem; } .list-view .library-card { flex-direction: row; align-items: center; padding: 1rem 1.5rem; } .list-view .library-card-source { margin-bottom: 0; } .list-view .library-card-actions { margin-left: auto; padding-left: 1rem; } .empty-state { text-align: center; padding: 3rem 1rem; color: var(--text-secondary); } .empty-state h2 { font-size: 1.5rem; margin-bottom: 0.5rem; color: var(--text-color); } /* --- SETTINGS PANEL (Used by Popup) --- */ .settings-panel { padding: 1rem 1.5rem 1.5rem 1.5rem; } .settings-group { margin-bottom: 1.5rem; } .settings-group:last-child { margin-bottom: 0; } .group-title { display: block; font-weight: 600; color: var(--text-secondary); margin-bottom: 1rem; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.5px; } .settings-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; } .settings-row:last-child { margin-bottom: 0; } .settings-row label, .settings-row span { font-weight: 500; color: var(--text-color); flex-shrink: 0; margin-right: 1rem; font-size: 1rem; } .settings-row-condensed { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-bottom: 1.5rem; flex-wrap: wrap; } .settings-row-condensed > label { font-weight: 500; color: var(--text-color); width: 100%; margin-bottom: -0.5rem; } .toggle-switch { position: relative; width: 50px; height: 28px; background: color-mix(in srgb, var(--text-color) 15%, transparent); border-radius: 14px; cursor: pointer; transition: background 0.3s; border: 1px solid var(--border-color); } .toggle-switch.active { background: var(--accent-color); border-color: var(--accent-color); } .toggle-slider { position: absolute; top: 3px; left: 3px; width: 20px; height: 20px; background: white; border-radius: 50%; transition: transform 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); box-shadow: 0 1px 3px rgba(0,0,0,0.2); } .toggle-switch.active .toggle-slider { transform: translateX(22px); } .select-field { padding: 0.5rem 1rem; border: 1px solid var(--border-color); border-radius: 10px; font-size: 0.9rem; min-width: 120px; background: var(--settings-bg); color: var(--text-color); font-family: var(--font-primary); -webkit-appearance: none; appearance: none; background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right 0.75rem center; background-size: 16px 12px; transition: border-color 0.2s, box-shadow 0.2s; } .select-field:focus { outline: none; border-color: var(--accent-color); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent-color) 15%, transparent); } [data-theme="dark"] .select-field { background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23e8eaed' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); } .select-field option { background: var(--card-bg); color: var(--text-color); } /* --- READING CUSTOMIZATION CONTROLS --- */ .display-control { display: flex; align-items: center; gap: 8px; background: var(--settings-bg); padding: 4px; border-radius: 8px; border: 1px solid var(--border-color); } .control-btn { background: transparent; border: none; width: 32px; height: 32px; border-radius: 6px; font-size: 1.2rem; font-weight: 600; cursor: pointer; color: var(--text-secondary); display: flex; align-items: center; justify-content: center; transition: background 0.2s ease, color 0.2s ease; } .control-btn:hover { background: color-mix(in srgb, var(--accent-color) 15%, transparent); color: var(--text-color); } .display-value { font-weight: 600; min-width: 40px; text-align: center; color: var(--text-color); font-size: 0.9rem; } .alignment-control { display: flex; background: var(--settings-bg); border-radius: 8px; border: 1px solid var(--border-color); padding: 4px; gap: 4px; } .align-btn { background: transparent; border: none; width: 40px; height: 36px; border-radius: 6px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.2s ease; } .align-btn svg { width: 22px; height: 22px; fill: var(--text-secondary); transition: fill 0.2s; } .align-btn:hover { background: color-mix(in srgb, var(--text-color) 15%, transparent); } .align-btn.active { background: var(--accent-color); } .align-btn.active svg { fill: white; } /* ADDED: Styles for new color picker */ .color-picker-wrapper { display: flex; align-items: center; gap: 12px; } .color-input { -webkit-appearance: none; -moz-appearance: none; appearance: none; width: 40px; height: 32px; background-color: transparent; border: 1px solid var(--border-color); border-radius: 8px; cursor: pointer; padding: 0; } .color-input::-webkit-color-swatch-wrapper { padding: 2px; border-radius: inherit; } .color-input::-webkit-color-swatch { border: none; border-radius: 6px; } .color-input::-moz-color-swatch { border: none; border-radius: 6px; } .btn-reset { background: transparent; border: none; font-size: 1.5rem; font-weight: bold; color: var(--text-secondary); cursor: pointer; padding: 0 5px; transition: color 0.2s ease, transform 0.2s ease; line-height: 1; } .btn-reset:hover { color: var(--accent-color); transform: rotate(90deg); } /* --- CONTENT & STORY --- */ .content-section { padding: 1rem; min-height: 400px; position: relative; } .story-content { font-size: var(--story-font-size); line-height: var(--story-line-height); font-family: var(--story-font-family); color: var(--text-color); white-space: pre-wrap; min-height: 200px; transition: color 0.3s ease, background-color 0.3s ease; padding: 1rem; border-radius: 12px; } /* --- NAVIGATION --- */ .navigation { display: grid; grid-template-columns: auto 1fr auto; align-items: center; padding: 1rem 1.5rem; background: var(--settings-bg); border-top: 1px solid var(--border-color); gap: 1rem; } .nav-btn { background: transparent; color: var(--text-color); border: 1px solid var(--border-color); padding: 0.6rem 1.2rem; border-radius: 10px; font-size: 0.95rem; font-weight: 600; cursor: pointer; flex-shrink: 0; display: flex; align-items: center; justify-content: center; gap: 8px; transition: all 0.2s ease; } .nav-btn:hover:not(:disabled) { background: var(--accent-color); border-color: var(--accent-color); color: white; transform: translateY(-2px); box-shadow: 0 4px 10px color-mix(in srgb, var(--accent-color) 20%, transparent); } .nav-btn:disabled { opacity: 0.5; cursor: not-allowed; } .nav-center { display: flex; justify-content: center; align-items: center; gap: 1rem; } .nav-btn.retranslate { color: var(--accent-color); border-color: currentColor; } .nav-btn.retranslate:hover:not(:disabled) { color: white; background: var(--accent-color); border-color: var(--accent-color); } .nav-select { flex-grow: 1; max-width: 300px; text-align: center; padding-right: 2.5rem; /* for arrow */ } /* --- STATUS INDICATORS (Loading, Error, etc.) --- */ .loading { display: flex; flex-direction: column; justify-content: center; align-items: center; padding: 40px; color: var(--text-secondary); min-height: 300px; } .spinner { display: inline-block; width: 40px; height: 40px; border: 4px solid color-mix(in srgb, var(--text-color) 10%, transparent); border-top-color: var(--accent-color); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 10px; } @keyframes spin { to { transform: rotate(360deg); } } .error { text-align: center; padding: 1rem; border-radius: 12px; margin: 1rem; font-weight: 600; color: #e74c3c; background: rgba(231, 76, 60, 0.1); border: 1px solid rgba(231, 76, 60, 0.2); } /* --- FLOATING BUTTON & POPUP --- */ .floating-settings-btn { position: fixed; bottom: 25px; right: 25px; width: 35px; height: 35px; background: var(--accent-color); color: white; border: none; border-radius: 50%; display: none; /* Hidden by default */ align-items: center; justify-content: center; cursor: pointer; box-shadow: 0 4px 20px color-mix(in srgb, var(--accent-color) 40%, transparent); z-index: 1000; transition: transform 0.2s ease, filter 0.2s ease; } .floating-settings-btn svg { width: 24px; height: 24px; } .floating-settings-btn:hover { transform: scale(1.1); filter: brightness(1.1); } .settings-popup { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.3); display: none; align-items: center; justify-content: center; z-index: 1100; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); } .settings-popup-content { background: var(--card-bg); border-radius: 20px; box-shadow: var(--shadow-color); border: 1px solid var(--border-color); width: 90%; max-width: 500px; overflow: hidden; animation: popup-fade-in 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); } .popup-actions { margin-top: 1.5rem; text-align: right; } @keyframes popup-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } /* --- RESPONSIVE DESIGN --- */ @media (max-width: 768px) { .container { padding: 0.5rem; max-width: 100% !important; /* Override all max-width on mobile */ } .header { padding: 0.75rem 1rem; } .title { font-size: 1.1rem; margin: 0 0.5rem; } .header-btn, .theme-toggle { width: 40px; height: 40px; } .input-section, #librarySection, .content-section { padding: 1rem; } /* FIXED: Mobile library actions layout */ .library-actions { flex-direction: row; /* Set back to row */ justify-content: space-between; /* Space out items */ align-items: center; gap: 1rem; } .library-actions .btn-primary-action { width: auto; /* Let the button shrink */ padding: 0.75rem 1.2rem; /* Adjust padding for mobile */ font-size: 0.9rem; } #libraryGrid { grid-template-columns: 1fr; } .story-content { padding: 0.5rem; } /* Smarter navigation layout for mobile */ .navigation { display: flex; flex-wrap: wrap; justify-content: space-between; padding: 0.75rem 0.5rem; gap: 0.75rem; } .navigation .nav-btn { font-size: 1rem; padding: 0.75rem; flex-grow: 1; flex-basis: 0; } .navigation .nav-center { width: 100%; order: 1; justify-content: center; } .navigation .nav-select { flex-grow: 1; min-width: 0; text-align: left; } .navigation .retranslate { flex-grow: 0; flex-shrink: 0; } .settings-popup-content { width: calc(100% - 2rem); max-height: 90vh; overflow-y: auto; } .settings-panel { padding: 1.2rem; } .settings-row { flex-direction: column; align-items: flex-start; gap: 12px; } .settings-row span, .settings-row label { font-size: 0.95rem; } .settings-row-condensed { flex-direction: column; align-items: stretch; } .settings-row .select-field, .settings-row-condensed .select-field, .settings-row-condensed .display-control, .settings-row-condensed .alignment-control, .color-picker-wrapper { width: 100%; justify-content: space-between; } .control-btn, .align-btn { min-height: 44px; } .display-control, .alignment-control { justify-content: space-between; } .floating-settings-btn { bottom: 15px; right: 15px; width: 48px; height: 48px; } .floating-settings-btn svg { width: 24px; height: 24px; } }