Spaces:
Runtime error
Runtime error
| /* ============================================================ | |
| FocusFriend — Custom Off-Brand Stylesheet | |
| Dark, cozy theme with amber/gold accents. | |
| Designed to feel like a warm room at night, not a corporate app. | |
| ============================================================ */ | |
| /* === CSS Variables === */ | |
| :root { | |
| --ff-bg: #1a1a2e; | |
| --ff-surface: #16213e; | |
| --ff-surface2: #0f3460; | |
| --ff-text: #e0d7c6; | |
| --ff-text-dim: #a89f91; | |
| --ff-accent: #e8b44b; | |
| --ff-accent-glow: rgba(232, 180, 75, 0.3); | |
| --ff-accent2: #d4756b; | |
| --ff-green: #7eb77f; | |
| --ff-border: #2a2a4a; | |
| --ff-pip-bg: #0d1117; | |
| --ff-radius: 8px; | |
| --ff-font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Courier New', monospace; | |
| --ff-font-sans: 'Inter', 'SF Pro Display', 'Segoe UI', system-ui, sans-serif; | |
| } | |
| /* === Global === */ | |
| .gradio-container { | |
| background: var(--ff-bg) ; | |
| font-family: var(--ff-font-sans) ; | |
| color: var(--ff-text) ; | |
| } | |
| h1, h2, h3, h4, h5, h6 { | |
| font-family: var(--ff-font-sans) ; | |
| color: var(--ff-accent) ; | |
| font-weight: 600 ; | |
| } | |
| a { | |
| color: var(--ff-accent) ; | |
| } | |
| /* === Header === */ | |
| .ff-header { | |
| text-align: center; | |
| padding: 24px 0 32px; | |
| } | |
| .ff-header h1 { | |
| font-size: 2.4em; | |
| margin: 0; | |
| background: linear-gradient(135deg, var(--ff-accent), var(--ff-accent2)); | |
| -webkit-background-clip: text; | |
| -webkit-text-fill-color: transparent; | |
| background-clip: text; | |
| } | |
| /* === Pip Display Panel === */ | |
| .ff-pip-panel { | |
| background: var(--ff-pip-bg); | |
| border: 2px solid var(--ff-border); | |
| border-radius: 12px; | |
| padding: 24px 20px; | |
| min-height: 320px; | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| justify-content: center; | |
| box-shadow: 0 0 40px var(--ff-accent-glow) inset; | |
| } | |
| .ff-pip-art { | |
| font-family: var(--ff-font-mono) ; | |
| font-size: 13px ; | |
| line-height: 1.35 ; | |
| color: var(--ff-accent) ; | |
| white-space: pre ; | |
| text-align: center ; | |
| background: transparent ; | |
| border: none ; | |
| padding: 16px ; | |
| min-height: 240px ; | |
| text-shadow: 0 0 20px var(--ff-accent-glow); | |
| } | |
| .ff-pip-art textarea { | |
| font-family: var(--ff-font-mono) ; | |
| color: var(--ff-accent) ; | |
| background: transparent ; | |
| border: none ; | |
| resize: none ; | |
| text-align: center ; | |
| } | |
| /* === Timer === */ | |
| .ff-timer { | |
| font-family: var(--ff-font-mono); | |
| font-size: 3.5em; | |
| text-align: center; | |
| color: var(--ff-accent); | |
| padding: 16px; | |
| letter-spacing: 4px; | |
| text-shadow: 0 0 30px var(--ff-accent-glow); | |
| } | |
| .ff-timer.warning { | |
| color: var(--ff-accent2); | |
| animation: pulse 1s ease-in-out infinite; | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { opacity: 1; } | |
| 50% { opacity: 0.5; } | |
| } | |
| /* === Mode Bar === */ | |
| .ff-mode-bar { | |
| display: flex; | |
| gap: 8px; | |
| padding: 12px; | |
| background: var(--ff-surface); | |
| border-radius: 12px; | |
| border: 1px solid var(--ff-border); | |
| margin-bottom: 16px; | |
| } | |
| .ff-mode-bar button { | |
| font-family: var(--ff-font-sans) ; | |
| font-weight: 500 ; | |
| font-size: 0.95em ; | |
| padding: 10px 20px ; | |
| border-radius: 8px ; | |
| border: 1px solid var(--ff-border) ; | |
| background: var(--ff-surface2) ; | |
| color: var(--ff-text-dim) ; | |
| cursor: pointer ; | |
| transition: all 0.25s ease ; | |
| flex: 1 ; | |
| } | |
| .ff-mode-bar button:hover { | |
| background: rgba(232, 180, 75, 0.15) ; | |
| color: var(--ff-accent) ; | |
| border-color: var(--ff-accent) ; | |
| transform: translateY(-1px); | |
| } | |
| .ff-mode-bar button.active, | |
| .ff-mode-bar button.selected { | |
| background: var(--ff-accent) ; | |
| color: var(--ff-bg) ; | |
| border-color: var(--ff-accent) ; | |
| font-weight: 600 ; | |
| box-shadow: 0 0 20px var(--ff-accent-glow); | |
| } | |
| /* === Chatbot === */ | |
| .ff-chatbot { | |
| border: 1px solid var(--ff-border) ; | |
| border-radius: 12px ; | |
| background: var(--ff-surface) ; | |
| overflow: hidden ; | |
| } | |
| .ff-chatbot .message-wrap { | |
| padding: 12px 16px ; | |
| } | |
| .ff-chatbot .user { | |
| background: var(--ff-surface2) ; | |
| border-radius: 8px ; | |
| margin: 4px 0 ; | |
| } | |
| .ff-chatbot .bot { | |
| background: var(--ff-pip-bg) ; | |
| border-left: 3px solid var(--ff-accent) ; | |
| border-radius: 0 8px 8px 0 ; | |
| margin: 4px 0 ; | |
| } | |
| .ff-chatbot .bot p { | |
| color: var(--ff-text) ; | |
| } | |
| /* === Chat Input === */ | |
| .ff-chat-input textarea { | |
| background: var(--ff-surface) ; | |
| border: 1px solid var(--ff-border) ; | |
| border-radius: 8px ; | |
| color: var(--ff-text) ; | |
| font-family: var(--ff-font-sans) ; | |
| padding: 12px ; | |
| resize: none ; | |
| } | |
| .ff-chat-input textarea:focus { | |
| border-color: var(--ff-accent) ; | |
| box-shadow: 0 0 15px var(--ff-accent-glow) ; | |
| } | |
| /* === Primary Buttons === */ | |
| button.primary, | |
| button[variant="primary"] { | |
| background: var(--ff-accent) ; | |
| color: var(--ff-bg) ; | |
| font-weight: 600 ; | |
| border: none ; | |
| border-radius: 8px ; | |
| padding: 10px 24px ; | |
| transition: all 0.25s ease ; | |
| font-size: 1em ; | |
| } | |
| button.primary:hover, | |
| button[variant="primary"]:hover { | |
| background: #f0c55a ; | |
| box-shadow: 0 4px 20px var(--ff-accent-glow) ; | |
| transform: translateY(-1px); | |
| } | |
| button.primary:active, | |
| button[variant="primary"]:active { | |
| transform: translateY(0); | |
| } | |
| /* === Secondary Buttons === */ | |
| button.secondary { | |
| background: var(--ff-surface2) ; | |
| color: var(--ff-text) ; | |
| border: 1px solid var(--ff-border) ; | |
| border-radius: 8px ; | |
| padding: 10px 24px ; | |
| transition: all 0.25s ease ; | |
| } | |
| button.secondary:hover { | |
| border-color: var(--ff-accent) ; | |
| color: var(--ff-accent) ; | |
| } | |
| /* === Dropdowns & Sliders === */ | |
| select, .dropdown { | |
| background: var(--ff-surface) ; | |
| border: 1px solid var(--ff-border) ; | |
| border-radius: 8px ; | |
| color: var(--ff-text) ; | |
| padding: 8px 12px ; | |
| } | |
| input[type="range"] { | |
| accent-color: var(--ff-accent); | |
| } | |
| /* === Group Panels === */ | |
| .gr-group { | |
| background: var(--ff-surface) ; | |
| border: 1px solid var(--ff-border) ; | |
| border-radius: 12px ; | |
| padding: 16px ; | |
| margin-bottom: 12px ; | |
| } | |
| /* === Accordion === */ | |
| .gr-accordion { | |
| background: var(--ff-surface) ; | |
| border: 1px solid var(--ff-border) ; | |
| border-radius: 12px ; | |
| } | |
| /* === Scrollbar === */ | |
| ::-webkit-scrollbar { | |
| width: 8px; | |
| height: 8px; | |
| } | |
| ::-webkit-scrollbar-track { | |
| background: var(--ff-bg); | |
| border-radius: 4px; | |
| } | |
| ::-webkit-scrollbar-thumb { | |
| background: var(--ff-border); | |
| border-radius: 4px; | |
| } | |
| ::-webkit-scrollbar-thumb:hover { | |
| background: var(--ff-accent); | |
| } | |
| /* === Footer (hide Gradio default) === */ | |
| footer { | |
| display: none ; | |
| } | |
| /* === Tabs (hidden for our custom UI) === */ | |
| .tabs { | |
| border: none ; | |
| } | |
| .tab-nav { | |
| display: none ; | |
| } | |
| /* === Responsive === */ | |
| @media (max-width: 768px) { | |
| .ff-pip-panel { | |
| min-height: 200px; | |
| padding: 12px; | |
| } | |
| .ff-pip-art { | |
| font-size: 10px ; | |
| min-height: 160px ; | |
| } | |
| .ff-mode-bar { | |
| flex-wrap: wrap; | |
| } | |
| .ff-mode-bar button { | |
| font-size: 0.85em ; | |
| padding: 8px 12px ; | |
| } | |
| .ff-timer { | |
| font-size: 2.5em; | |
| } | |
| } | |
| /* === Breathing animation === */ | |
| .ff-breathing-in { | |
| animation: breatheIn 4s ease-in-out; | |
| } | |
| .ff-breathing-out { | |
| animation: breatheOut 8s ease-in-out; | |
| } | |
| @keyframes breatheIn { | |
| from { transform: scale(1); } | |
| to { transform: scale(1.05); } | |
| } | |
| @keyframes breatheOut { | |
| from { transform: scale(1.05); } | |
| to { transform: scale(1); } | |
| } | |
| /* === Focus complete celebration === */ | |
| .ff-celebrate { | |
| animation: celebrate 0.5s ease-in-out 3; | |
| } | |
| @keyframes celebrate { | |
| 0%, 100% { transform: translateY(0); } | |
| 50% { transform: translateY(-10px); } | |
| } | |