"""Fallout / RobCo Terminal UI theme constants for the Alien Obfuscator. This module holds CSS stylesheets, JavaScript timer/state snippets, and font-loading HTML that together produce the retro terminal aesthetic. """ # --------------------------------------------------------------------------- # JavaScript timer & localStorage bridge # --------------------------------------------------------------------------- TIMER_HTML = """ """ # --------------------------------------------------------------------------- # Main Fallout / RobCo terminal CSS # --------------------------------------------------------------------------- FALLOUT_CSS = """ @import url('https://fonts.googleapis.com/css2?family=VT323&display=swap'); :root { --terminal-color: #33ff33; --terminal-color-glow: rgba(51, 255, 51, 0.8); --terminal-color-glow-low: rgba(51, 255, 51, 0.5); --terminal-color-glow-container: rgba(51, 255, 51, 0.25); --terminal-color-glow-container-outer: rgba(51, 255, 51, 0.15); --terminal-bg-glow: #0d1f0d; --terminal-bg: #030703; --terminal-placeholder: #1a5c1a; --terminal-disabled-bg: #010301; --terminal-disabled-color: #114411; --terminal-border-dim: #22aa22; } /* Apply VT323 retro font and scanline styles to all components */ body, .gradio-container, .gradio-container * { font-family: 'VT323', 'Courier New', Courier, monospace !important; font-size: 1.25rem !important; border-radius: 0px !important; box-shadow: none !important; line-height: 1.3 !important; } body { background-color: var(--terminal-bg) !important; color: var(--terminal-color) !important; margin: 0; padding: 0; } /* Subtle scanlines overlay simulating CRT screen */ body::before { content: " "; display: block; position: fixed; top: 0; left: 0; bottom: 0; right: 0; background: linear-gradient( rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.22) 50% ); background-size: 100% 4px; z-index: 99999; pointer-events: none; } /* Container framing with classic terminal border and CRT glow */ .gradio-container { background-color: var(--terminal-bg) !important; border: 3px solid var(--terminal-color) !important; box-shadow: 0 0 25px var(--terminal-color-glow-container) inset, 0 0 15px var(--terminal-color-glow-container-outer) !important; max-width: 950px !important; margin: 40px auto !important; padding: 25px !important; } /* Headers with glow effects */ h1, h2, h3, h4, h5, h6 { color: var(--terminal-color) !important; text-shadow: 0 0 8px var(--terminal-color-glow) !important; font-weight: bold !important; text-transform: uppercase !important; } h1 { font-size: 2.4rem !important; } h2 { font-size: 1.9rem !important; } h3 { font-size: 1.6rem !important; } /* Plain text and label adjustments */ p, span, li { color: var(--terminal-color) !important; text-shadow: 0 0 3px var(--terminal-color-glow-low) !important; } /* Flat solid terminal panels for all Gradio blocks */ .block, .form, .panel, .gr-box, .gr-panel, .gr-block { background-color: #000000 !important; border: 1px solid var(--terminal-color) !important; padding: 15px !important; margin-bottom: 12px !important; } /* Text Inputs, textareas, and select menus */ input, textarea, select, .gr-input, .gr-textarea { background-color: #000000 !important; color: var(--terminal-color) !important; border: 1px solid var(--terminal-color) !important; font-family: 'VT323', monospace !important; padding: 8px !important; text-shadow: 0 0 3px var(--terminal-color-glow-low) !important; } input::placeholder, textarea::placeholder { color: var(--terminal-placeholder) !important; text-shadow: none !important; } input:focus, textarea:focus, select:focus { border-color: var(--terminal-color) !important; box-shadow: 0 0 10px var(--terminal-color-glow) !important; outline: none !important; } /* Dropdown menus & wrappers */ .dropdown-menu, .options, .select-wrap, .dropdown, select { background-color: #000000 !important; color: var(--terminal-color) !important; border: 1px solid var(--terminal-color) !important; } /* Retro buttons with glowing hover state */ button, .gr-button { background-color: var(--terminal-bg-glow) !important; color: var(--terminal-color) !important; border: 1px solid var(--terminal-color) !important; text-transform: uppercase !important; font-weight: bold !important; font-family: 'VT323', monospace !important; padding: 8px 16px !important; cursor: pointer !important; transition: all 0.15s ease-in-out !important; text-shadow: 0 0 3px var(--terminal-color-glow-low) !important; } button:hover, .gr-button:hover { background-color: var(--terminal-color) !important; color: #000000 !important; box-shadow: 0 0 12px var(--terminal-color-glow) !important; text-shadow: none !important; } button:disabled, .gr-button:disabled { background-color: var(--terminal-disabled-bg) !important; color: var(--terminal-disabled-color) !important; border-color: var(--terminal-disabled-color) !important; cursor: not-allowed !important; text-shadow: none !important; } /* Tab bar customization */ .tab-nav, [role="tablist"], .tabs { border-bottom: 2px solid var(--terminal-color) !important; background-color: #000000 !important; margin-bottom: 15px !important; } .tab-nav button, [role="tab"], .tabs button { background-color: transparent !important; color: var(--terminal-border-dim) !important; border: none !important; font-size: 1.5rem !important; padding: 10px 18px !important; } .tab-nav button:hover, [role="tab"]:hover, .tabs button:hover { color: var(--terminal-color) !important; } .tab-nav button.selected, [aria-selected="true"], .tabs button.selected, .tabitem.selected { color: var(--terminal-color) !important; border: 1px solid var(--terminal-color) !important; border-bottom: 1px solid var(--terminal-bg) !important; background-color: var(--terminal-bg-glow) !important; text-shadow: 0 0 6px var(--terminal-color-glow) !important; } /* Header style specifically for terminal branding */ .terminal-header { border-bottom: 2px dashed var(--terminal-color) !important; margin-bottom: 20px !important; padding-bottom: 10px !important; } .terminal-header-text { font-family: 'VT323', monospace !important; color: var(--terminal-color) !important; text-shadow: 0 0 5px var(--terminal-color-glow) !important; line-height: 1.2 !important; white-space: pre; } /* Text labels on panels and widgets */ .block-label, .gr-block-label, label, label span { background-color: #000000 !important; color: var(--terminal-color) !important; font-family: 'VT323', monospace !important; text-transform: uppercase !important; font-weight: bold !important; } /* Custom styles for checkboxes and radios */ .gr-radio, input[type="radio"], input[type="checkbox"] { accent-color: var(--terminal-color) !important; } .gr-radio label, .radio-group label { border: 1px solid var(--terminal-border-dim) !important; color: var(--terminal-border-dim) !important; background-color: #000000 !important; } .gr-radio label.selected, .radio-group label.selected { border-color: var(--terminal-color) !important; color: var(--terminal-color) !important; background-color: var(--terminal-bg-glow) !important; text-shadow: 0 0 4px var(--terminal-color-glow-low) !important; } /* Inner elements for custom look */ .copy-btn, button.svelte-custom { background-color: var(--terminal-bg-glow) !important; border: 1px solid var(--terminal-color) !important; color: var(--terminal-color) !important; } """ # --------------------------------------------------------------------------- # Google Font preconnect / load # --------------------------------------------------------------------------- GOOGLE_FONT_HTML = """ """ # --------------------------------------------------------------------------- # Inline CSS used inside the Gradio Blocks constructor # --------------------------------------------------------------------------- DISABLED_RADIO_CSS = """ input[type="radio"]:disabled { opacity: 0.35; } """