""" 🎨 Hacker Theme - Cyberpunk/Matrix Style UI Modern, colorful, futuristic design for browser automation testing """ import gradio as gr # Cyberpunk Hacker Theme with Neon Colors hacker_theme = gr.themes.Base( primary_hue=gr.themes.colors.cyan, secondary_hue=gr.themes.colors.purple, neutral_hue=gr.themes.colors.slate, font=[ gr.themes.GoogleFont("Fira Code"), gr.themes.GoogleFont("JetBrains Mono"), "monospace" ], ).set( # Background colors - Dark cyberpunk body_background_fill="#0a0e27", body_background_fill_dark="#050814", # Panel backgrounds - Darker with glow block_background_fill="#0f1729", block_background_fill_dark="#0a0e1f", # Border colors - Neon cyan/purple block_border_color="#00ffff", block_border_color_dark="#ff00ff", block_border_width="2px", # Input fields - Dark with neon borders input_background_fill="#1a1f3a", input_background_fill_dark="#0f1429", input_border_color="#00ff88", input_border_color_dark="#ff0088", input_border_width="2px", # Buttons - Neon gradient style button_primary_background_fill="#00ff88", button_primary_background_fill_dark="#ff0088", button_primary_background_fill_hover="#00ffff", button_primary_background_fill_hover_dark="#ff00ff", button_primary_text_color="#000000", button_primary_text_color_dark="#000000", button_primary_border_color="#00ffff", button_secondary_background_fill="#1a1f3a", button_secondary_background_fill_dark="#0f1429", button_secondary_background_fill_hover="#2a2f4a", button_secondary_text_color="#00ff88", button_secondary_text_color_dark="#ff0088", button_secondary_border_color="#00ff88", # Text colors - Bright neon body_text_color="#00ffff", body_text_color_dark="#00ff88", # Link colors link_text_color="#ff00ff", link_text_color_dark="#00ffff", link_text_color_hover="#ffff00", # Slider colors slider_color="#00ff88", slider_color_dark="#ff0088", # Shadow effects for glow block_shadow="0 0 20px rgba(0, 255, 255, 0.3)", block_shadow_dark="0 0 20px rgba(255, 0, 255, 0.3)", # Tab colors block_label_background_fill="#00ff88", block_label_background_fill_dark="#ff0088", block_label_text_color="#000000", block_label_text_color_dark="#000000", # Checkbox/Radio checkbox_background_color="#1a1f3a", checkbox_background_color_selected="#00ff88", checkbox_background_color_selected_dark="#ff0088", checkbox_border_color="#00ffff", checkbox_border_color_dark="#ff00ff", # Table colors table_border_color="#00ff88", table_even_background_fill="#0f1729", table_odd_background_fill="#1a1f3a", # Code block code_background_fill="#0a0e1f", # Radius for modern look block_radius="8px", button_large_radius="8px", button_small_radius="6px", input_radius="6px", ) # Custom CSS for additional hacking effects hacker_css = """ /* Matrix-style background animation */ @keyframes matrix-rain { 0% { background-position: 0% 0%; } 100% { background-position: 0% 100%; } } /* Glowing text effect */ @keyframes glow { 0%, 100% { text-shadow: 0 0 5px #00ffff, 0 0 10px #00ffff, 0 0 15px #00ffff; } 50% { text-shadow: 0 0 10px #ff00ff, 0 0 20px #ff00ff, 0 0 30px #ff00ff; } } /* Neon border pulse */ @keyframes neon-pulse { 0%, 100% { border-color: #00ffff; box-shadow: 0 0 10px #00ffff; } 50% { border-color: #ff00ff; box-shadow: 0 0 20px #ff00ff; } } /* Apply to body */ body { background: linear-gradient(135deg, #0a0e27 0%, #1a0e3a 50%, #0a0e27 100%); background-size: 400% 400%; animation: matrix-rain 20s ease infinite; } /* Main container glow */ .gradio-container { box-shadow: 0 0 40px rgba(0, 255, 255, 0.2), 0 0 80px rgba(255, 0, 255, 0.1) !important; border: 2px solid rgba(0, 255, 255, 0.3) !important; border-radius: 12px !important; } /* Headers with glow effect */ h1, h2, h3 { animation: glow 3s ease-in-out infinite !important; font-family: 'Fira Code', 'JetBrains Mono', monospace !important; font-weight: 700 !important; letter-spacing: 2px !important; } /* Tab buttons */ .tab-nav button { background: linear-gradient(135deg, #1a1f3a 0%, #2a2f4a 100%) !important; border: 2px solid #00ff88 !important; color: #00ffff !important; font-family: 'Fira Code', monospace !important; font-weight: 600 !important; text-transform: uppercase !important; letter-spacing: 1px !important; transition: all 0.3s ease !important; } .tab-nav button:hover { background: linear-gradient(135deg, #00ff88 0%, #00ffff 100%) !important; color: #000000 !important; box-shadow: 0 0 20px #00ffff !important; transform: translateY(-2px) !important; } .tab-nav button.selected { background: linear-gradient(135deg, #00ff88 0%, #ff0088 100%) !important; color: #000000 !important; border-color: #ff00ff !important; box-shadow: 0 0 30px #ff00ff !important; } /* Input fields with neon glow */ input, textarea, select { background: rgba(26, 31, 58, 0.8) !important; border: 2px solid #00ff88 !important; color: #00ffff !important; font-family: 'Fira Code', monospace !important; transition: all 0.3s ease !important; } input:focus, textarea:focus, select:focus { border-color: #ff00ff !important; box-shadow: 0 0 15px #ff00ff, inset 0 0 10px rgba(255, 0, 255, 0.2) !important; background: rgba(26, 31, 58, 1) !important; } /* Buttons with cyberpunk style */ button { background: linear-gradient(135deg, #00ff88 0%, #00ffff 100%) !important; border: 2px solid #00ffff !important; color: #000000 !important; font-family: 'Fira Code', monospace !important; font-weight: 700 !important; text-transform: uppercase !important; letter-spacing: 1px !important; transition: all 0.3s ease !important; position: relative !important; overflow: hidden !important; } button:hover { background: linear-gradient(135deg, #ff0088 0%, #ff00ff 100%) !important; border-color: #ff00ff !important; box-shadow: 0 0 25px #ff00ff !important; transform: translateY(-2px) scale(1.02) !important; } button:active { transform: translateY(0px) scale(0.98) !important; } /* Primary action buttons */ button.primary { background: linear-gradient(135deg, #ff0088 0%, #ff00ff 100%) !important; animation: neon-pulse 2s ease-in-out infinite !important; } /* Code blocks */ code, pre { background: rgba(10, 14, 31, 0.9) !important; border: 1px solid #00ff88 !important; color: #00ffff !important; font-family: 'Fira Code', monospace !important; padding: 10px !important; border-radius: 6px !important; } /* Progress bars */ .progress-bar { background: linear-gradient(90deg, #00ff88 0%, #00ffff 50%, #ff00ff 100%) !important; animation: matrix-rain 3s linear infinite !important; } /* Checkboxes and radio buttons */ input[type="checkbox"], input[type="radio"] { accent-color: #00ff88 !important; border: 2px solid #00ffff !important; } /* Scrollbar styling */ ::-webkit-scrollbar { width: 12px !important; background: #0a0e27 !important; } ::-webkit-scrollbar-track { background: #0f1729 !important; border: 1px solid #00ff88 !important; } ::-webkit-scrollbar-thumb { background: linear-gradient(180deg, #00ff88 0%, #00ffff 100%) !important; border-radius: 6px !important; border: 1px solid #00ffff !important; } ::-webkit-scrollbar-thumb:hover { background: linear-gradient(180deg, #ff0088 0%, #ff00ff 100%) !important; } /* Labels with neon effect */ label { color: #00ffff !important; font-family: 'Fira Code', monospace !important; font-weight: 600 !important; text-transform: uppercase !important; letter-spacing: 1px !important; font-size: 0.9em !important; } /* Info boxes */ .info, .warning, .error { border-left: 4px solid #00ff88 !important; background: rgba(0, 255, 136, 0.1) !important; padding: 12px !important; border-radius: 6px !important; font-family: 'Fira Code', monospace !important; } .warning { border-left-color: #ffff00 !important; background: rgba(255, 255, 0, 0.1) !important; } .error { border-left-color: #ff0088 !important; background: rgba(255, 0, 136, 0.1) !important; } /* Ladybug Loading Animation */ .loading, .loader, [class*="loading"], .wrap.svelte-1cl284s { position: relative !important; width: 80px !important; height: 80px !important; border: none !important; background: transparent !important; } .loading::before, .loader::before, [class*="loading"]::before { content: "🐞" !important; position: absolute !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; font-size: 60px !important; animation: ladybug-crawl 2s ease-in-out infinite !important; filter: drop-shadow(0 0 10px #ff0088) !important; } .loading::after, .loader::after, [class*="loading"]::after { content: "Loading..." !important; position: absolute !important; bottom: -30px !important; left: 50% !important; transform: translateX(-50%) !important; color: #00ff88 !important; font-family: 'Fira Code', monospace !important; font-size: 12px !important; letter-spacing: 2px !important; text-shadow: 0 0 5px #00ff88 !important; animation: pulse-text 1.5s ease-in-out infinite !important; } @keyframes ladybug-crawl { 0%, 100% { transform: translate(-50%, -50%) rotate(0deg) scale(1); } 25% { transform: translate(-50%, -50%) rotate(-10deg) scale(1.1); } 50% { transform: translate(-50%, -50%) rotate(0deg) scale(1); } 75% { transform: translate(-50%, -50%) rotate(10deg) scale(1.1); } } @keyframes pulse-text { 0%, 100% { opacity: 0.6; text-shadow: 0 0 5px #00ff88; } 50% { opacity: 1; text-shadow: 0 0 15px #00ff88, 0 0 25px #00ff88; } } /* Gradio specific loading indicators */ .pending, .generating { position: relative !important; } .pending::before, .generating::before { content: "🐞" !important; font-size: 40px !important; animation: ladybug-crawl 2s ease-in-out infinite !important; filter: drop-shadow(0 0 10px #ff0088) !important; } /* Dropdown menus */ .dropdown { background: rgba(26, 31, 58, 0.95) !important; border: 2px solid #00ff88 !important; box-shadow: 0 8px 32px rgba(0, 255, 255, 0.3) !important; } .dropdown-item:hover { background: rgba(0, 255, 136, 0.2) !important; color: #00ffff !important; } /* File upload area */ .file-upload { border: 2px dashed #00ff88 !important; background: rgba(26, 31, 58, 0.5) !important; transition: all 0.3s ease !important; } .file-upload:hover { border-color: #ff00ff !important; background: rgba(255, 0, 255, 0.1) !important; box-shadow: 0 0 20px rgba(255, 0, 255, 0.3) !important; } /* Status indicators */ .status-success { color: #00ff88 !important; text-shadow: 0 0 10px #00ff88 !important; } .status-error { color: #ff0088 !important; text-shadow: 0 0 10px #ff0088 !important; } .status-warning { color: #ffff00 !important; text-shadow: 0 0 10px #ffff00 !important; } /* Terminal-style output */ .terminal-output { background: #0a0e1f !important; border: 2px solid #00ff88 !important; color: #00ff88 !important; font-family: 'Fira Code', monospace !important; padding: 15px !important; border-radius: 8px !important; box-shadow: inset 0 0 20px rgba(0, 255, 136, 0.1) !important; } /* Accordion/Collapsible sections */ .accordion-header { background: linear-gradient(135deg, #1a1f3a 0%, #2a2f4a 100%) !important; border: 2px solid #00ff88 !important; color: #00ffff !important; font-family: 'Fira Code', monospace !important; font-weight: 600 !important; } .accordion-header:hover { background: linear-gradient(135deg, #00ff88 0%, #00ffff 100%) !important; color: #000000 !important; box-shadow: 0 0 15px #00ffff !important; } /* Matrix-style text effect for headers */ .matrix-text { background: linear-gradient(90deg, #00ff88, #00ffff, #ff00ff, #00ff88); background-size: 200% auto; -webkit-background-clip: text; -webkit-text-fill-color: transparent; animation: matrix-rain 3s linear infinite; } /* Glitch effect for important elements */ @keyframes glitch { 0% { transform: translate(0); } 20% { transform: translate(-2px, 2px); } 40% { transform: translate(-2px, -2px); } 60% { transform: translate(2px, 2px); } 80% { transform: translate(2px, -2px); } 100% { transform: translate(0); } } .glitch-effect:hover { animation: glitch 0.3s ease-in-out !important; } /* Neon divider */ hr { border: none !important; height: 2px !important; background: linear-gradient(90deg, transparent, #00ffff, #ff00ff, #00ffff, transparent) !important; margin: 20px 0 !important; } /* Card-style containers */ .card { background: rgba(15, 23, 41, 0.8) !important; border: 2px solid #00ff88 !important; border-radius: 12px !important; padding: 20px !important; box-shadow: 0 0 30px rgba(0, 255, 255, 0.2) !important; transition: all 0.3s ease !important; } .card:hover { border-color: #ff00ff !important; box-shadow: 0 0 40px rgba(255, 0, 255, 0.3) !important; transform: translateY(-5px) !important; } """ def get_hacker_theme(): """Returns the hacker theme and CSS""" return hacker_theme, hacker_css