Spaces:
Paused
Paused
import gradio as gr | |
from gradio.themes.base import Base | |
from gradio.themes.utils import colors, fonts, sizes | |
def get_cyberpunk_theme(): | |
"""Create cyberpunk-themed Gradio theme""" | |
theme = gr.themes.Base( | |
primary_hue=colors.green, | |
secondary_hue=colors.purple, | |
neutral_hue=colors.gray, | |
font=[fonts.GoogleFont("Orbitron"), "monospace", "sans-serif"], | |
radius_size=sizes.Size( | |
xxs="2px", | |
xs="3px", | |
sm="4px", | |
md="6px", | |
lg="8px", | |
xl="10px", | |
xxl="12px" | |
) | |
).set( | |
# Background colors | |
body_background_fill="linear-gradient(135deg, #0a0a0a, #1a0033, #001122)", | |
body_background_fill_dark="linear-gradient(135deg, #050505, #0d001a, #000811)", | |
# Text colors | |
body_text_color="#00ff41", | |
body_text_color_dark="#00ff41", | |
body_text_color_subdued="#8A2BE2", | |
body_text_color_subdued_dark="#8A2BE2", | |
# Component colors | |
background_fill_primary="rgba(0, 255, 65, 0.1)", | |
background_fill_primary_dark="rgba(0, 255, 65, 0.05)", | |
background_fill_secondary="rgba(138, 43, 226, 0.1)", | |
background_fill_secondary_dark="rgba(138, 43, 226, 0.05)", | |
# Borders | |
border_color_primary="#00ff41", | |
border_color_primary_dark="#00ff41", | |
border_color_accent="#8A2BE2", | |
border_color_accent_dark="#8A2BE2", | |
# Shadows | |
shadow_drop="0 0 20px rgba(0, 255, 65, 0.5)", | |
shadow_drop_lg="0 0 30px rgba(138, 43, 226, 0.5)", | |
# Buttons | |
button_primary_background_fill="linear-gradient(45deg, #00ff41, #8A2BE2)", | |
button_primary_background_fill_hover="linear-gradient(45deg, #00ff41, #9932CC)", | |
button_primary_background_fill_dark="linear-gradient(45deg, #00cc33, #7B68EE)", | |
button_primary_text_color="#000000", | |
button_primary_text_color_dark="#000000", | |
# Inputs | |
input_background_fill="rgba(0, 0, 0, 0.8)", | |
input_background_fill_dark="rgba(0, 0, 0, 0.9)", | |
input_border_color="#00ff41", | |
input_border_color_dark="#00ff41", | |
input_border_color_focus="#8A2BE2", | |
input_border_color_focus_dark="#8A2BE2", | |
# Other elements | |
block_background_fill="rgba(0, 0, 0, 0.6)", | |
block_background_fill_dark="rgba(0, 0, 0, 0.8)", | |
block_border_color="#00ff41", | |
block_border_color_dark="#00ff41", | |
block_border_width="2px", | |
block_shadow="0 0 15px rgba(0, 255, 65, 0.3)", | |
) | |
return theme | |
# Custom CSS for additional cyberpunk styling | |
CYBERPUNK_CSS = """ | |
/* Import cyberpunk font */ | |
@import url('https://fonts.googleapis.com/css2?family=Orbitron:wght@400;700;900&display=swap'); | |
/* Global styles */ | |
* { | |
font-family: 'Orbitron', monospace !important; | |
} | |
/* Animated background */ | |
.gradio-container { | |
background: linear-gradient(135deg, #0a0a0a, #1a0033, #001122); | |
background-size: 400% 400%; | |
animation: gradient-shift 15s ease infinite; | |
} | |
@keyframes gradient-shift { | |
0% { background-position: 0% 50%; } | |
50% { background-position: 100% 50%; } | |
100% { background-position: 0% 50%; } | |
} | |
/* Cyber header */ | |
.cyber-header { | |
background: linear-gradient(135deg, rgba(0,0,0,0.9), rgba(26,0,51,0.9)); | |
border: 2px solid #00ff41; | |
border-radius: 10px; | |
padding: 30px; | |
margin-bottom: 30px; | |
position: relative; | |
overflow: hidden; | |
box-shadow: 0 0 30px rgba(0,255,65,0.5), inset 0 0 30px rgba(0,255,65,0.1); | |
} | |
.cyber-header::before { | |
content: ''; | |
position: absolute; | |
top: -2px; | |
left: -2px; | |
right: -2px; | |
bottom: -2px; | |
background: linear-gradient(45deg, #00ff41, #8A2BE2, #00ff41); | |
z-index: -1; | |
animation: border-glow 3s linear infinite; | |
filter: blur(5px); | |
} | |
@keyframes border-glow { | |
0%, 100% { opacity: 1; } | |
50% { opacity: 0.5; } | |
} | |
/* Glitch text effect */ | |
.glitch-text { | |
position: relative; | |
color: #00ff41; | |
font-size: 3em; | |
font-weight: 900; | |
text-transform: uppercase; | |
text-shadow: | |
0 0 10px #00ff41, | |
0 0 20px #00ff41, | |
0 0 40px #00ff41; | |
animation: text-glow 2s ease-in-out infinite alternate; | |
} | |
@keyframes text-glow { | |
from { text-shadow: 0 0 10px #00ff41, 0 0 20px #00ff41, 0 0 40px #00ff41; } | |
to { text-shadow: 0 0 20px #00ff41, 0 0 30px #00ff41, 0 0 50px #00ff41; } | |
} | |
.glitch-text::before, | |
.glitch-text::after { | |
content: attr(data-text); | |
position: absolute; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
} | |
.glitch-text::before { | |
animation: glitch-1 0.5s infinite; | |
color: #8A2BE2; | |
z-index: -1; | |
} | |
.glitch-text::after { | |
animation: glitch-2 0.5s infinite; | |
color: #00ff41; | |
z-index: -2; | |
} | |
@keyframes glitch-1 { | |
0% { clip: rect(44px, 450px, 56px, 0); transform: translate(0); } | |
20% { clip: rect(20px, 450px, 30px, 0); transform: translate(-2px, 2px); } | |
40% { clip: rect(85px, 450px, 95px, 0); transform: translate(2px, -2px); } | |
60% { clip: rect(10px, 450px, 20px, 0); transform: translate(-1px, 1px); } | |
80% { clip: rect(60px, 450px, 70px, 0); transform: translate(1px, -1px); } | |
100% { clip: rect(44px, 450px, 56px, 0); transform: translate(0); } | |
} | |
@keyframes glitch-2 { | |
0% { clip: rect(65px, 450px, 75px, 0); transform: translate(0); } | |
20% { clip: rect(30px, 450px, 40px, 0); transform: translate(2px, -2px); } | |
40% { clip: rect(90px, 450px, 100px, 0); transform: translate(-2px, 2px); } | |
60% { clip: rect(15px, 450px, 25px, 0); transform: translate(1px, -1px); } | |
80% { clip: rect(70px, 450px, 80px, 0); transform: translate(-1px, 1px); } | |
100% { clip: rect(65px, 450px, 75px, 0); transform: translate(0); } | |
} | |
/* Cyber subtitle */ | |
.cyber-subtitle { | |
color: #8A2BE2; | |
font-size: 1.2em; | |
text-transform: uppercase; | |
letter-spacing: 2px; | |
text-shadow: 0 0 10px #8A2BE2; | |
} | |
/* Pulse line */ | |
.pulse-line { | |
height: 2px; | |
background: linear-gradient(90deg, transparent, #00ff41, transparent); | |
margin: 20px 0; | |
animation: pulse-width 2s ease-in-out infinite; | |
} | |
@keyframes pulse-width { | |
0%, 100% { transform: scaleX(0.5); opacity: 0.5; } | |
50% { transform: scaleX(1); opacity: 1; } | |
} | |
/* Cyber containers */ | |
.cyber-container { | |
background: rgba(0, 0, 0, 0.8); | |
border: 2px solid #00ff41; | |
border-radius: 8px; | |
padding: 20px; | |
position: relative; | |
box-shadow: | |
0 0 20px rgba(0, 255, 65, 0.3), | |
inset 0 0 20px rgba(0, 255, 65, 0.1); | |
animation: container-pulse 4s ease-in-out infinite; | |
} | |
@keyframes container-pulse { | |
0%, 100% { | |
border-color: #00ff41; | |
box-shadow: 0 0 20px rgba(0, 255, 65, 0.3), inset 0 0 20px rgba(0, 255, 65, 0.1); | |
} | |
50% { | |
border-color: #8A2BE2; | |
box-shadow: 0 0 30px rgba(138, 43, 226, 0.5), inset 0 0 20px rgba(138, 43, 226, 0.1); | |
} | |
} | |
/* Cyber buttons */ | |
.cyber-button { | |
background: linear-gradient(45deg, #00ff41, #8A2BE2); | |
border: none; | |
color: #000; | |
font-weight: bold; | |
text-transform: uppercase; | |
letter-spacing: 1px; | |
padding: 12px 24px; | |
border-radius: 6px; | |
position: relative; | |
overflow: hidden; | |
transition: all 0.3s ease; | |
box-shadow: 0 0 20px rgba(0, 255, 65, 0.5); | |
} | |
.cyber-button::before { | |
content: ''; | |
position: absolute; | |
top: 50%; | |
left: 50%; | |
width: 0; | |
height: 0; | |
background: rgba(255, 255, 255, 0.3); | |
border-radius: 50%; | |
transform: translate(-50%, -50%); | |
transition: width 0.6s, height 0.6s; | |
} | |
.cyber-button:hover::before { | |
width: 300px; | |
height: 300px; | |
} | |
.cyber-button:hover { | |
transform: translateY(-2px); | |
box-shadow: 0 5px 30px rgba(0, 255, 65, 0.7); | |
} | |
/* Generate button special */ | |
.generate-button { | |
font-size: 1.2em; | |
animation: generate-pulse 2s ease-in-out infinite; | |
} | |
@keyframes generate-pulse { | |
0%, 100% { box-shadow: 0 0 20px rgba(0, 255, 65, 0.5); } | |
50% { box-shadow: 0 0 40px rgba(0, 255, 65, 0.8), 0 0 60px rgba(138, 43, 226, 0.5); } | |
} | |
/* Cyber inputs */ | |
.cyber-input input, | |
.cyber-input textarea { | |
background: rgba(0, 0, 0, 0.9) !important; | |
border: 2px solid #00ff41 !important; | |
color: #00ff41 !important; | |
font-family: 'Orbitron', monospace !important; | |
transition: all 0.3s ease; | |
} | |
.cyber-input input:focus, | |
.cyber-input textarea:focus { | |
border-color: #8A2BE2 !important; | |
box-shadow: 0 0 20px rgba(138, 43, 226, 0.5) !important; | |
outline: none !important; | |
} | |
/* Monster display */ | |
.monster-display { | |
background: rgba(0, 0, 0, 0.9); | |
border: 2px solid #00ff41; | |
border-radius: 10px; | |
padding: 20px; | |
position: relative; | |
overflow: hidden; | |
} | |
.monster-display::before { | |
content: ''; | |
position: absolute; | |
top: 0; | |
left: -100%; | |
width: 100%; | |
height: 100%; | |
background: linear-gradient(90deg, transparent, rgba(0, 255, 65, 0.2), transparent); | |
animation: scan-line 3s linear infinite; | |
} | |
@keyframes scan-line { | |
0% { left: -100%; } | |
100% { left: 100%; } | |
} | |
/* Evolution display */ | |
.evolution-display { | |
background: linear-gradient(135deg, rgba(138, 43, 226, 0.2), rgba(0, 255, 65, 0.2)); | |
border: 2px solid #8A2BE2; | |
border-radius: 8px; | |
padding: 15px; | |
margin: 10px 0; | |
animation: evolution-glow 2s ease-in-out infinite; | |
} | |
@keyframes evolution-glow { | |
0%, 100% { box-shadow: 0 0 20px rgba(138, 43, 226, 0.5); } | |
50% { box-shadow: 0 0 40px rgba(138, 43, 226, 0.8); } | |
} | |
/* Cyber dialogue */ | |
.cyber-dialogue { | |
font-size: 1.5em; | |
text-align: center; | |
color: #00ff41; | |
text-shadow: 0 0 10px currentColor; | |
} | |
/* Cyber stats */ | |
.cyber-stats { | |
font-family: 'Orbitron', monospace; | |
color: #00ff41; | |
} | |
.cyber-stats .label { | |
color: #8A2BE2; | |
} | |
/* Tab styling */ | |
.cyber-tabs .tab-nav { | |
background: rgba(0, 0, 0, 0.8); | |
border-bottom: 2px solid #00ff41; | |
} | |
.cyber-tabs .tab-nav button { | |
color: #00ff41 !important; | |
background: transparent !important; | |
border: none !important; | |
transition: all 0.3s ease; | |
} | |
.cyber-tabs .tab-nav button:hover { | |
background: rgba(0, 255, 65, 0.1) !important; | |
text-shadow: 0 0 10px #00ff41; | |
} | |
.cyber-tabs .tab-nav button.selected { | |
background: rgba(0, 255, 65, 0.2) !important; | |
border-bottom: 3px solid #00ff41 !important; | |
} | |
/* Loading animation */ | |
.loading { | |
display: inline-block; | |
width: 20px; | |
height: 20px; | |
border: 3px solid rgba(0, 255, 65, 0.3); | |
border-radius: 50%; | |
border-top-color: #00ff41; | |
animation: spin 1s ease-in-out infinite; | |
} | |
@keyframes spin { | |
to { transform: rotate(360deg); } | |
} | |
/* Scrollbar styling */ | |
::-webkit-scrollbar { | |
width: 10px; | |
height: 10px; | |
} | |
::-webkit-scrollbar-track { | |
background: rgba(0, 0, 0, 0.5); | |
border: 1px solid #00ff41; | |
} | |
::-webkit-scrollbar-thumb { | |
background: linear-gradient(45deg, #00ff41, #8A2BE2); | |
border-radius: 5px; | |
} | |
::-webkit-scrollbar-thumb:hover { | |
background: linear-gradient(45deg, #00ff41, #9932CC); | |
} | |
/* Mobile responsiveness */ | |
@media (max-width: 768px) { | |
.glitch-text { | |
font-size: 2em; | |
} | |
.cyber-container { | |
padding: 15px; | |
} | |
.cyber-button { | |
padding: 10px 20px; | |
font-size: 0.9em; | |
} | |
} | |
""" |