Spaces:
Runtime error
Runtime error
| /* CSS Custom Properties for Consistent Design */ | |
| :root { | |
| /* Color Palette - Soft, Calming Colors */ | |
| --primary-bg: #d9e7f5; | |
| --secondary-bg: #ebeef1; | |
| --card-bg: #ffffff; | |
| --border-color: #e1e5e9; | |
| --text-primary: #2c3e50; | |
| --text-secondary: #5a6c7d; | |
| --text-muted: #8b9dc3; | |
| --accent-blue: #6c9bd1; | |
| --accent-green: #7fb069; | |
| --accent-soft: #b8d4f0; | |
| --success-color: #27ae60; | |
| --warning-color: #f39c12; | |
| --error-color: #e74c3c; | |
| --shadow-light: rgba(0, 0, 0, 0.05); | |
| --shadow-medium: rgba(0, 0, 0, 0.1); | |
| --shadow-strong: rgba(0, 0, 0, 0.15); | |
| /* Typography */ | |
| --font-primary: 'Lexend Deca', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; | |
| --font-dyslexia: 'OpenDyslexic', 'Lexend Deca', sans-serif; | |
| --font-size-base: 16px; | |
| --font-size-large: 18px; | |
| --font-size-small: 14px; | |
| --line-height-base: 1.6; | |
| --line-height-relaxed: 1.8; | |
| /* Spacing */ | |
| --spacing-xs: 0.25rem; | |
| --spacing-sm: 0.5rem; | |
| --spacing-md: 1rem; | |
| --spacing-lg: 1.5rem; | |
| --spacing-xl: 2rem; | |
| --spacing-xxl: 3rem; | |
| /* Border Radius */ | |
| --radius-sm: 6px; | |
| --radius-md: 12px; | |
| --radius-lg: 16px; | |
| --radius-xl: 20px; | |
| /* Transitions */ | |
| --transition-fast: 0.2s ease; | |
| --transition-normal: 0.3s ease; | |
| --transition-slow: 0.5s ease; | |
| } | |
| /* Reset and Base Styles */ | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| html { | |
| scroll-behavior: smooth; | |
| } | |
| body { | |
| font-family: var(--font-primary); | |
| font-size: var(--font-size-base); | |
| line-height: var(--line-height-base); | |
| color: var(--text-primary); | |
| background-color: var(--primary-bg); | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| } | |
| /* Focus Styles for Accessibility */ | |
| *:focus { | |
| outline: 2px solid var(--accent-blue); | |
| outline-offset: 2px; | |
| } | |
| *:focus:not(:focus-visible) { | |
| outline: none; | |
| } | |
| /* Navigation */ | |
| .navbar { | |
| background: var(--card-bg); | |
| border-bottom: 1px solid var(--border-color); | |
| box-shadow: 0 2px 8px var(--shadow-light); | |
| position: sticky; | |
| top: 0; | |
| z-index: 100; | |
| } | |
| .nav-container { | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| padding: var(--spacing-md) var(--spacing-lg); | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| } | |
| .nav-brand { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--spacing-sm); | |
| } | |
| .nav-brand i { | |
| color: var(--accent-blue); | |
| font-size: 1.5rem; | |
| } | |
| .nav-brand h1 { | |
| font-size: 1.5rem; | |
| font-weight: 600; | |
| color: var(--text-primary); | |
| } | |
| .info-btn { | |
| background: none; | |
| border: none; | |
| color: var(--text-secondary); | |
| font-size: 1.2rem; | |
| cursor: pointer; | |
| padding: var(--spacing-sm); | |
| border-radius: var(--radius-sm); | |
| transition: all var(--transition-fast); | |
| } | |
| .info-btn:hover { | |
| color: var(--accent-blue); | |
| background-color: var(--accent-soft); | |
| } | |
| /* Info Tooltip */ | |
| .info-tooltip { | |
| position: fixed; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%) scale(0); | |
| background: var(--card-bg); | |
| border: 1px solid var(--border-color); | |
| border-radius: var(--radius-lg); | |
| box-shadow: 0 10px 30px var(--shadow-strong); | |
| padding: var(--spacing-xl); | |
| max-width: 500px; | |
| width: 90%; | |
| z-index: 1000; | |
| transition: transform var(--transition-normal); | |
| } | |
| .info-tooltip.show { | |
| transform: translate(-50%, -50%) scale(1); | |
| } | |
| .tooltip-content h3 { | |
| color: var(--text-primary); | |
| margin-bottom: var(--spacing-md); | |
| font-size: 1.25rem; | |
| } | |
| .tooltip-content p { | |
| color: var(--text-secondary); | |
| line-height: var(--line-height-relaxed); | |
| margin-bottom: var(--spacing-lg); | |
| } | |
| .close-tooltip { | |
| position: absolute; | |
| top: var(--spacing-md); | |
| right: var(--spacing-md); | |
| background: none; | |
| border: none; | |
| color: var(--text-muted); | |
| font-size: 1.2rem; | |
| cursor: pointer; | |
| padding: var(--spacing-xs); | |
| border-radius: var(--radius-sm); | |
| transition: color var(--transition-fast); | |
| } | |
| .close-tooltip:hover { | |
| color: var(--text-primary); | |
| } | |
| /* Main Content */ | |
| .main-content { | |
| min-height: calc(100vh - 140px); | |
| padding: var(--spacing-xl) 0; | |
| } | |
| .container { | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| padding: 0 var(--spacing-lg); | |
| } | |
| /* App Header */ | |
| .app-header { | |
| text-align: center; | |
| margin-bottom: var(--spacing-xxl); | |
| } | |
| .app-header h2 { | |
| font-size: 2.5rem; | |
| font-weight: 600; | |
| color: var(--text-primary); | |
| margin-bottom: var(--spacing-md); | |
| line-height: 1.3; | |
| } | |
| .subtitle { | |
| font-size: var(--font-size-large); | |
| color: var(--text-secondary); | |
| max-width: 600px; | |
| margin: 0 auto; | |
| line-height: var(--line-height-relaxed); | |
| } | |
| /* Controls Section */ | |
| .controls-section { | |
| margin-bottom: var(--spacing-xl); | |
| } | |
| .control-group { | |
| display: flex; | |
| gap: var(--spacing-md); | |
| justify-content: center; | |
| flex-wrap: wrap; | |
| } | |
| .control-btn { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--spacing-sm); | |
| padding: var(--spacing-md) var(--spacing-lg); | |
| background: var(--card-bg); | |
| border: 2px solid var(--border-color); | |
| border-radius: var(--radius-md); | |
| color: var(--text-primary); | |
| font-family: var(--font-primary); | |
| font-size: var(--font-size-base); | |
| font-weight: 500; | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| box-shadow: 0 2px 4px var(--shadow-light); | |
| } | |
| .control-btn:hover { | |
| border-color: var(--accent-blue); | |
| background-color: var(--accent-soft); | |
| transform: translateY(-1px); | |
| box-shadow: 0 4px 8px var(--shadow-medium); | |
| } | |
| .control-btn:active { | |
| transform: translateY(0); | |
| } | |
| .control-btn[aria-pressed="true"] { | |
| background-color: var(--accent-blue); | |
| border-color: var(--accent-blue); | |
| color: white; | |
| } | |
| .tts-controls { | |
| display: flex; | |
| gap: var(--spacing-sm); | |
| } | |
| /* Text Section */ | |
| .text-section { | |
| margin-bottom: var(--spacing-xl); | |
| } | |
| .text-container { | |
| display: grid; | |
| gap: var(--spacing-xl); | |
| max-width: 1000px; | |
| margin: 0 auto; | |
| } | |
| .text-box-container { | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--spacing-sm); | |
| } | |
| .text-label { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--spacing-sm); | |
| font-weight: 600; | |
| color: var(--text-primary); | |
| font-size: var(--font-size-large); | |
| } | |
| .text-label i { | |
| color: var(--accent-blue); | |
| } | |
| .text-box-wrapper { | |
| position: relative; | |
| background: var(--card-bg); | |
| border: 2px solid var(--border-color); | |
| border-radius: var(--radius-lg); | |
| box-shadow: 0 4px 12px var(--shadow-light); | |
| transition: all var(--transition-fast); | |
| } | |
| .text-box-wrapper:focus-within { | |
| border-color: var(--accent-blue); | |
| box-shadow: 0 4px 20px var(--shadow-medium); | |
| } | |
| .text-box { | |
| width: 100%; | |
| padding: var(--spacing-lg); | |
| border: none; | |
| background: transparent; | |
| font-family: var(--font-primary); | |
| font-size: var(--font-size-base); | |
| line-height: var(--line-height-relaxed); | |
| color: var(--text-primary); | |
| resize: vertical; | |
| min-height: 200px; | |
| border-radius: var(--radius-lg); | |
| } | |
| .text-box:focus { | |
| outline: none; | |
| } | |
| .text-box::placeholder { | |
| color: var(--text-muted); | |
| font-style: italic; | |
| } | |
| .text-box-actions { | |
| position: absolute; | |
| top: var(--spacing-md); | |
| right: var(--spacing-md); | |
| display: flex; | |
| gap: var(--spacing-xs); | |
| opacity: 0; | |
| transition: opacity var(--transition-fast); | |
| } | |
| .text-box-wrapper:hover .text-box-actions { | |
| opacity: 1; | |
| } | |
| .action-btn { | |
| background: var(--card-bg); | |
| border: 1px solid var(--border-color); | |
| border-radius: var(--radius-sm); | |
| color: var(--text-secondary); | |
| padding: var(--spacing-sm); | |
| cursor: pointer; | |
| transition: all var(--transition-fast); | |
| box-shadow: 0 2px 4px var(--shadow-light); | |
| } | |
| .action-btn:hover { | |
| background: var(--accent-soft); | |
| color: var(--accent-blue); | |
| transform: translateY(-1px); | |
| } | |
| /* Process Section */ | |
| .process-section { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| gap: var(--spacing-sm); | |
| } | |
| .process-btn { | |
| position: relative; | |
| background: linear-gradient(135deg, var(--accent-blue), var(--accent-green)); | |
| border: none; | |
| border-radius: var(--radius-xl); | |
| color: white; | |
| font-family: var(--font-primary); | |
| font-size: var(--font-size-large); | |
| font-weight: 600; | |
| padding: var(--spacing-lg) var(--spacing-xxl); | |
| cursor: pointer; | |
| transition: all var(--transition-normal); | |
| box-shadow: 0 6px 20px var(--shadow-medium); | |
| overflow: hidden; | |
| } | |
| .process-btn:hover { | |
| transform: translateY(-2px); | |
| box-shadow: 0 8px 25px var(--shadow-strong); | |
| } | |
| .process-btn:active { | |
| transform: translateY(0); | |
| } | |
| .process-btn:disabled { | |
| opacity: 0.7; | |
| cursor: not-allowed; | |
| transform: none; | |
| } | |
| .btn-text { | |
| display: flex; | |
| align-items: center; | |
| gap: var(--spacing-sm); | |
| } | |
| .loading-spinner { | |
| position: absolute; | |
| top: 50%; | |
| left: 50%; | |
| transform: translate(-50%, -50%); | |
| opacity: 0; | |
| transition: opacity var(--transition-fast); | |
| } | |
| .process-btn.loading .btn-text { | |
| opacity: 0; | |
| } | |
| .process-btn.loading .loading-spinner { | |
| opacity: 1; | |
| } | |
| .spinner { | |
| width: 24px; | |
| height: 24px; | |
| border: 3px solid rgba(255, 255, 255, 0.3); | |
| border-top: 3px solid white; | |
| border-radius: 50%; | |
| animation: spin 1s linear infinite; | |
| } | |
| @keyframes spin { | |
| 0% { transform: rotate(0deg); } | |
| 100% { transform: rotate(360deg); } | |
| } | |
| /* Help Text */ | |
| .help-text { | |
| font-size: var(--font-size-small); | |
| color: var(--text-muted); | |
| font-style: italic; | |
| } | |
| /* Status Messages */ | |
| .status-messages { | |
| position: fixed; | |
| top: var(--spacing-xl); | |
| right: var(--spacing-xl); | |
| z-index: 1000; | |
| } | |
| .status-message { | |
| background: var(--card-bg); | |
| border: 1px solid var(--border-color); | |
| border-radius: var(--radius-md); | |
| padding: var(--spacing-md) var(--spacing-lg); | |
| box-shadow: 0 4px 12px var(--shadow-medium); | |
| margin-bottom: var(--spacing-sm); | |
| transform: translateX(100%); | |
| transition: transform var(--transition-normal); | |
| max-width: 300px; | |
| } | |
| .status-message.show { | |
| transform: translateX(0); | |
| } | |
| .status-message.success { | |
| border-left: 4px solid var(--success-color); | |
| } | |
| .status-message.error { | |
| border-left: 4px solid var(--error-color); | |
| } | |
| .status-message.warning { | |
| border-left: 4px solid var(--warning-color); | |
| } | |
| /* Footer */ | |
| .footer { | |
| background: var(--card-bg); | |
| border-top: 1px solid var(--border-color); | |
| padding: var(--spacing-xl) 0; | |
| text-align: center; | |
| margin-top: var(--spacing-xxl); | |
| } | |
| .footer-content p { | |
| color: var(--text-secondary); | |
| margin-bottom: var(--spacing-xs); | |
| } | |
| .heart { | |
| color: var(--error-color); | |
| animation: heartbeat 2s ease-in-out infinite; | |
| } | |
| @keyframes heartbeat { | |
| 0%, 100% { transform: scale(1); } | |
| 50% { transform: scale(1.1); } | |
| } | |
| .footer-subtitle { | |
| font-size: var(--font-size-small); | |
| color: var(--text-muted); | |
| } | |
| /* Dyslexia-Friendly Styles */ | |
| .dyslexia-friendly { | |
| font-family: var(--font-dyslexia) ; | |
| letter-spacing: 0.1em ; | |
| word-spacing: 0.2em ; | |
| line-height: 1.8 ; | |
| } | |
| .dyslexia-friendly .text-box { | |
| font-family: var(--font-dyslexia) ; | |
| font-weight: 500 ; | |
| letter-spacing: 0.12em ; | |
| word-spacing: 0.25em ; | |
| line-height: 1.9 ; | |
| font-size: 1.1em ; | |
| color: var(--text-primary) ; | |
| background-color: #fefefe ; | |
| border: 2px solid var(--accent-blue) ; | |
| } | |
| .dyslexia-friendly .text-box::first-letter { | |
| font-weight: 700 ; | |
| font-size: 1.2em ; | |
| } | |
| .dyslexia-friendly .text-box::placeholder { | |
| font-family: var(--font-dyslexia) ; | |
| letter-spacing: 0.1em ; | |
| word-spacing: 0.2em ; | |
| } | |
| /* Enhanced dyslexia-friendly text styling */ | |
| .dyslexia-friendly .text-box { | |
| text-shadow: 0.5px 0.5px 0px rgba(0, 0, 0, 0.1) ; | |
| text-rendering: optimizeLegibility ; | |
| -webkit-font-smoothing: antialiased ; | |
| -moz-osx-font-smoothing: grayscale ; | |
| } | |
| /* Apply dyslexia-friendly styles to all text elements */ | |
| .dyslexia-friendly .text-label, | |
| .dyslexia-friendly .help-text, | |
| .dyslexia-friendly .status-message, | |
| .dyslexia-friendly h1, | |
| .dyslexia-friendly h2, | |
| .dyslexia-friendly h3, | |
| .dyslexia-friendly p { | |
| font-family: var(--font-dyslexia) ; | |
| letter-spacing: 0.08em ; | |
| word-spacing: 0.15em ; | |
| line-height: 1.7 ; | |
| } | |
| /* Dyslexia-friendly button text */ | |
| .dyslexia-friendly .control-btn span, | |
| .dyslexia-friendly .process-btn .btn-text { | |
| font-family: var(--font-dyslexia) ; | |
| letter-spacing: 0.05em ; | |
| word-spacing: 0.1em ; | |
| } | |
| /* Responsive Design */ | |
| @media (max-width: 768px) { | |
| .container { | |
| padding: 0 var(--spacing-md); | |
| } | |
| .nav-container { | |
| padding: var(--spacing-md); | |
| } | |
| .nav-brand h1 { | |
| font-size: 1.25rem; | |
| } | |
| .app-header h2 { | |
| font-size: 2rem; | |
| } | |
| .subtitle { | |
| font-size: var(--font-size-base); | |
| } | |
| .control-group { | |
| flex-direction: column; | |
| align-items: center; | |
| } | |
| .tts-controls { | |
| width: 100%; | |
| justify-content: center; | |
| } | |
| .text-box { | |
| min-height: 150px; | |
| font-size: var(--font-size-large); | |
| } | |
| .process-btn { | |
| width: 100%; | |
| max-width: 300px; | |
| } | |
| .status-messages { | |
| top: var(--spacing-md); | |
| right: var(--spacing-md); | |
| left: var(--spacing-md); | |
| } | |
| .status-message { | |
| max-width: none; | |
| } | |
| } | |
| @media (max-width: 480px) { | |
| .main-content { | |
| padding: var(--spacing-lg) 0; | |
| } | |
| .app-header { | |
| margin-bottom: var(--spacing-xl); | |
| } | |
| .app-header h2 { | |
| font-size: 1.75rem; | |
| } | |
| .text-box { | |
| padding: var(--spacing-md); | |
| font-size: var(--font-size-large); | |
| } | |
| .text-box-actions { | |
| position: static; | |
| opacity: 1; | |
| margin-top: var(--spacing-sm); | |
| justify-content: center; | |
| } | |
| .info-tooltip { | |
| width: 95%; | |
| padding: var(--spacing-lg); | |
| } | |
| } | |
| /* High Contrast Mode Support */ | |
| @media (prefers-contrast: high) { | |
| :root { | |
| --border-color: #000000; | |
| --text-primary: #000000; | |
| --text-secondary: #333333; | |
| --shadow-light: rgba(0, 0, 0, 0.2); | |
| --shadow-medium: rgba(0, 0, 0, 0.3); | |
| } | |
| } | |
| /* Reduced Motion Support */ | |
| @media (prefers-reduced-motion: reduce) { | |
| * { | |
| animation-duration: 0.01ms ; | |
| animation-iteration-count: 1 ; | |
| transition-duration: 0.01ms ; | |
| } | |
| html { | |
| scroll-behavior: auto; | |
| } | |
| } | |
| /* Print Styles */ | |
| @media print { | |
| .navbar, | |
| .controls-section, | |
| .text-box-actions, | |
| .process-section, | |
| .footer { | |
| display: none; | |
| } | |
| .text-box { | |
| border: 1px solid #000; | |
| box-shadow: none; | |
| } | |
| } | |