fagun18's picture
Fix loading screen to auto-hide after 2 seconds
337118a verified
"""
🤖 Fagun Browser Automation Testing Agent - Web Interface
=========================================================
Web UI components for the Fagun Browser Automation Testing Agent.
Author: Mejbaur Bahar Fagun
Role: Software Engineer in Test
LinkedIn: https://www.linkedin.com/in/mejbaur/
"""
import gradio as gr
from src.webui.webui_manager import WebuiManager
from src.webui.components.agent_settings_tab import create_agent_settings_tab
from src.webui.components.browser_settings_tab import create_browser_settings_tab
from src.webui.components.browser_use_agent_tab import create_browser_use_agent_tab
from src.webui.hacker_theme import get_hacker_theme
theme_map = {
"Default": gr.themes.Default(),
"Soft": gr.themes.Soft(),
"Monochrome": gr.themes.Monochrome(),
"Glass": gr.themes.Glass(),
"Origin": gr.themes.Origin(),
"Citrus": gr.themes.Citrus(),
"Ocean": gr.themes.Ocean(),
"Base": gr.themes.Base(),
"Hacker": get_hacker_theme()[0]
}
def create_ui(theme_name="Hacker"):
# Get hacker theme CSS
hacker_theme, hacker_css = get_hacker_theme()
css = hacker_css + """
/* Custom Page Loading Screen */
#loading-screen {
position: fixed !important;
top: 0 !important;
left: 0 !important;
width: 100vw !important;
height: 100vh !important;
background: linear-gradient(135deg, #0a0e27 0%, #1a0e3a 100%) !important;
display: flex !important;
flex-direction: column !important;
justify-content: center !important;
align-items: center !important;
z-index: 99999 !important;
opacity: 1 !important;
transition: opacity 0.5s ease-out !important;
}
#loading-screen.hidden {
opacity: 0 !important;
pointer-events: none !important;
}
.ladybug-loader {
font-size: 100px;
animation: ladybug-bounce 1.5s ease-in-out infinite;
filter: drop-shadow(0 0 20px #ff0088);
}
@keyframes ladybug-bounce {
0%, 100% {
transform: translateY(0) rotate(0deg);
}
25% {
transform: translateY(-30px) rotate(-15deg);
}
50% {
transform: translateY(0) rotate(0deg);
}
75% {
transform: translateY(-15px) rotate(15deg);
}
}
.loading-text {
margin-top: 30px;
color: #00ff88;
font-family: 'Fira Code', monospace;
font-size: 24px;
letter-spacing: 4px;
text-shadow: 0 0 10px #00ff88;
animation: pulse-glow 2s ease-in-out infinite;
}
.loading-subtext {
margin-top: 15px;
color: #00ffff;
font-family: 'Fira Code', monospace;
font-size: 16px;
letter-spacing: 2px;
text-shadow: 0 0 8px #00ffff;
opacity: 0.8;
}
.loading-dots {
margin-top: 10px;
display: flex;
gap: 5px;
justify-content: center;
}
.loading-dots span {
color: #ff00ff;
font-size: 30px;
animation: dot-bounce 1.4s ease-in-out infinite;
text-shadow: 0 0 10px #ff00ff;
}
.loading-dots span:nth-child(1) {
animation-delay: 0s;
}
.loading-dots span:nth-child(2) {
animation-delay: 0.2s;
}
.loading-dots span:nth-child(3) {
animation-delay: 0.4s;
}
@keyframes dot-bounce {
0%, 80%, 100% {
transform: translateY(0);
opacity: 0.5;
}
40% {
transform: translateY(-20px);
opacity: 1;
}
}
@keyframes pulse-glow {
0%, 100% {
opacity: 0.6;
text-shadow: 0 0 10px #00ff88;
}
50% {
opacity: 1;
text-shadow: 0 0 20px #00ff88, 0 0 30px #00ff88;
}
}
.gradio-container {
width: 85vw !important;
max-width: 85% !important;
margin-left: auto !important;
margin-right: auto !important;
padding-top: 120px !important;
}
.header-text {
text-align: center;
margin-bottom: 20px;
position: fixed !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
z-index: 1000 !important;
background: linear-gradient(135deg, #0a0e27 0%, #1a0e3a 100%) !important;
padding: 25px 0 !important;
border-bottom: 3px solid #00ff88 !important;
box-shadow: 0 4px 20px rgba(0, 255, 255, 0.3) !important;
box-shadow: 0 2px 4px rgba(0,0,0,0.1) !important;
line-height: 1.2 !important;
}
.header-text h1 {
margin: 0 0 10px 0 !important;
font-size: 2.5em !important;
line-height: 1.1 !important;
}
.header-text h3 {
margin: 0 !important;
font-size: 1.2em !important;
line-height: 1.2 !important;
opacity: 0.9 !important;
}
.tab-header-text {
text-align: center;
}
.theme-section {
margin-bottom: 10px;
padding: 15px;
border-radius: 10px;
}
/* Hide default Gradio footer */
.gradio-container footer {
display: none !important;
}
.gradio-container .footer {
display: none !important;
}
/* Override hide-container behavior for header */
.hide-container {
display: block !important;
visibility: visible !important;
opacity: 1 !important;
}
/* Ensure header is always visible */
.header-text, .header-text * {
display: block !important;
visibility: visible !important;
opacity: 1 !important;
position: fixed !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
z-index: 1000 !important;
}
/* Override any Gradio hiding classes for header */
.header-text.hide-container,
.header-text.svelte-11xb1hd,
.header-text.padded,
.header-text.auto-margin {
display: block !important;
visibility: visible !important;
opacity: 1 !important;
position: fixed !important;
top: 0 !important;
left: 0 !important;
right: 0 !important;
z-index: 1000 !important;
}
"""
# dark mode in default + loading screen
js_func = """
function refresh() {
const url = new URL(window.location);
if (url.searchParams.get('__theme') !== 'dark') {
url.searchParams.set('__theme', 'dark');
window.location.href = url.href;
}
// Hide loading screen after page loads
setTimeout(function() {
const loadingScreen = document.getElementById('loading-screen');
if (loadingScreen) {
loadingScreen.classList.add('hidden');
setTimeout(function() {
loadingScreen.style.display = 'none';
}, 500);
}
}, 2000);
// Also hide on any interaction
document.addEventListener('DOMContentLoaded', function() {
setTimeout(function() {
const loadingScreen = document.getElementById('loading-screen');
if (loadingScreen) {
loadingScreen.classList.add('hidden');
setTimeout(function() {
loadingScreen.style.display = 'none';
}, 500);
}
}, 2000);
});
}
"""
ui_manager = WebuiManager()
with gr.Blocks(
title="Bug Matrix SQA TESTING LAB", theme=theme_map[theme_name], css=css, js=js_func,
head="""
<link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>🤖</text></svg>">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
""",
) as demo:
# Loading Screen
gr.HTML("""
<div id="loading-screen">
<div style="display: flex; gap: 40px; align-items: center; justify-content: center;">
<div class="ladybug-loader" style="animation-delay: 0s;">🐞</div>
<div class="ladybug-loader" style="animation-delay: 0.3s;">🐞</div>
</div>
<div class="loading-text" style="margin-top: 40px;">INITIALIZING BUG MATRIX...</div>
<div class="loading-subtext">Loading Testing Environment</div>
<div class="loading-dots">
<span>.</span><span>.</span><span>.</span>
</div>
</div>
""")
with gr.Row():
gr.HTML(
"""
<div class="header-text matrix-text">
<h1 style="font-size: 3em; margin: 0; 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;">
⚡ Bug Matrix SQA TESTING LAB ⚡
</h1>
<h3 style="margin: 10px 0 0 0; color: #00ffff; text-shadow: 0 0 10px #00ffff; letter-spacing: 3px;">
[ BROWSER AUTOMATION • SECURITY TESTING • AI POWERED ]
</h3>
<p style="margin: 5px 0 0 0; color: #00ff88; font-size: 0.9em; letter-spacing: 2px;">
>> SYSTEM STATUS: <span style="color: #00ffff; text-shadow: 0 0 5px #00ffff;">ONLINE</span> <<
</p>
</div>
""",
elem_classes=["header-text"],
)
with gr.Tabs() as tabs:
with gr.TabItem("⚙️ AGENT CONFIG"):
create_agent_settings_tab(ui_manager)
with gr.TabItem("🌐 BROWSER SETUP"):
create_browser_settings_tab(ui_manager)
with gr.TabItem("⚡ EXECUTE MISSION"):
create_browser_use_agent_tab(ui_manager)
# Custom Footer
with gr.Row():
gr.HTML(
"""
<div style="text-align: center; margin-top: 30px; padding: 20px; border-top: 2px solid #00ff88; background: linear-gradient(135deg, rgba(0, 255, 136, 0.05), rgba(0, 255, 255, 0.05));">
<p style="margin: 10px 0; color: #00ffff; font-size: 0.9em; letter-spacing: 1px;">
>> CONNECT WITH THE ARCHITECT <<
</p>
<p style="margin: 10px 0; font-weight: bold; font-size: 1.3em; 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; letter-spacing: 2px;">
MEJBAUR BAHAR FAGUN
</p>
<p style="margin: 10px 0; color: #ff00ff; font-size: 1em; text-shadow: 0 0 5px #ff00ff; letter-spacing: 1px;">
[ SOFTWARE ENGINEER IN TEST ]
</p>
<p style="margin: 15px 0;">
<a href="https://www.linkedin.com/in/mejbaur/" target="_blank" style="text-decoration: none; color: #00ff88; font-weight: 600; padding: 10px 20px; border: 2px solid #00ff88; border-radius: 6px; display: inline-block; transition: all 0.3s ease; letter-spacing: 1px;">
🔗 LINKEDIN PROFILE
</a>
</p>
<p style="margin: 10px 0; color: #00ffff; font-size: 0.8em; font-family: 'Fira Code', monospace;">
>> SYSTEM BUILD: v2.0.0 | STATUS: OPERATIONAL | UPTIME: 99.9% <<
</p>
</div>
<style>
@keyframes gradientShift {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
</style>
"""
)
return demo