perry-alchemist / magic_theme.py
meemeealm's picture
Upload 7 files
633c7e9 verified
Raw
History Blame Contribute Delete
13.3 kB
from __future__ import annotations
from gradio.themes.base import Base
from gradio.themes.utils import colors, fonts, sizes
class Magic(Base):
def __init__(
self,
*,
primary_hue=colors.amber,
secondary_hue=colors.orange,
neutral_hue=colors.stone,
spacing_size=sizes.spacing_md,
radius_size=sizes.radius_none,
text_size=sizes.text_md,
font=(
fonts.GoogleFont("Grenze Gotisch"),
"Georgia",
"Times New Roman",
"serif",
),
font_mono=(
"Consolas",
"Courier New",
"monospace",
),
):
super().__init__(
primary_hue=primary_hue,
secondary_hue=secondary_hue,
neutral_hue=neutral_hue,
spacing_size=spacing_size,
radius_size=radius_size,
text_size=text_size,
font=font,
font_mono=font_mono,
)
self.name = "magic"
super().set(
# --------------------------------------------------
# BODY
# --------------------------------------------------
body_background_fill="#fdfbf7",
body_background_fill_dark="#17130e",
body_text_color="#362d22",
body_text_color_dark="#efe4cf",
body_text_color_subdued="#5a4c3d",
body_text_color_subdued_dark="#c8b89f",
# --------------------------------------------------
# BACKGROUNDS
# --------------------------------------------------
background_fill_primary="#fdfbf7",
background_fill_primary_dark="#211b14",
background_fill_secondary="#f4ecdf",
background_fill_secondary_dark="#2b2318",
# --------------------------------------------------
# BLOCKS
# --------------------------------------------------
block_background_fill="#fdfbf7",
block_background_fill_dark="#2b2318",
block_border_width="2px",
block_border_color="#362d22",
block_border_color_dark="#d4c4a3",
block_shadow="4px 4px 0 #362d22",
block_shadow_dark="4px 4px 0 #000000",
# --------------------------------------------------
# LABELS
# --------------------------------------------------
block_label_background_fill="#efe4cf",
block_label_background_fill_dark="#3a3024",
block_label_text_color="#362d22",
block_label_text_color_dark="#efe4cf",
block_label_text_weight="700",
block_title_background_fill="#efe4cf",
block_title_background_fill_dark="#3a3024",
block_title_text_color="#362d22",
block_title_text_color_dark="#efe4cf",
block_title_text_weight="700",
# --------------------------------------------------
# INPUTS
# --------------------------------------------------
input_background_fill="#fdfbf7",
input_background_fill_dark="#31271d",
input_border_width="2px",
input_border_color="#362d22",
input_border_color_dark="#d4c4a3",
input_border_color_focus="#8a6a38",
input_border_color_focus_dark="#eac88a",
input_shadow="none",
input_shadow_focus="0 0 0 2px rgba(234,200,138,.35)",
input_shadow_focus_dark="0 0 0 2px rgba(234,200,138,.5)",
# --------------------------------------------------
# PRIMARY BUTTON
# --------------------------------------------------
button_primary_background_fill="#362d22",
button_primary_background_fill_hover="#504333",
button_primary_background_fill_dark="#4a3d2e",
button_primary_background_fill_hover_dark="#5d4f3d",
button_primary_text_color="#fdfbf7",
button_primary_text_color_dark="#fffdf0",
button_primary_border_color="#362d22",
button_primary_border_color_dark="#d4c4a3",
# button_primary_border_width="2px",
button_primary_shadow="2px 2px 0 rgba(0,0,0,.25)",
button_primary_shadow_hover="2px 2px 0 rgba(0,0,0,.35)",
# --------------------------------------------------
# SECONDARY BUTTON
# --------------------------------------------------
button_secondary_background_fill="#fdfbf7",
button_secondary_background_fill_dark="#31271d",
button_secondary_background_fill_hover="#eadeca",
button_secondary_background_fill_hover_dark="#433528",
button_secondary_text_color="#362d22",
button_secondary_text_color_dark="#efe4cf",
button_secondary_border_color="#362d22",
button_secondary_border_color_dark="#d4c4a3",
# --------------------------------------------------
# CHECKBOXES
# --------------------------------------------------
checkbox_background_color_selected="#8a6a38",
checkbox_background_color_selected_dark="#eac88a",
checkbox_border_color="#362d22",
checkbox_border_color_dark="#d4c4a3",
checkbox_border_color_selected="#8a6a38",
checkbox_border_color_selected_dark="#eac88a",
checkbox_label_background_fill="#fdfbf7",
checkbox_label_background_fill_dark="#31271d",
checkbox_label_background_fill_hover="#efe4cf",
checkbox_label_background_fill_hover_dark="#433528",
checkbox_label_background_fill_selected="#8a6a38",
checkbox_label_background_fill_selected_dark="#5a4729",
checkbox_label_text_color_selected="#ffffff",
checkbox_label_text_color_selected_dark="#fff8e7",
# --------------------------------------------------
# SLIDERS
# --------------------------------------------------
slider_color="#b58b4f",
slider_color_dark="#eac88a",
# --------------------------------------------------
# ACCENTS
# --------------------------------------------------
color_accent="#b58b4f",
color_accent_soft="#efe4cf",
color_accent_soft_dark="#433528",
# --------------------------------------------------
# TABLES
# --------------------------------------------------
table_even_background_fill="#fdfbf7",
table_even_background_fill_dark="#2b2318",
table_odd_background_fill="#f4ecdf",
table_odd_background_fill_dark="#211b14",
table_border_color="#362d22",
table_border_color_dark="#d4c4a3",
table_row_focus="#efe4cf",
table_row_focus_dark="#433528",
# --------------------------------------------------
# PANELS
# --------------------------------------------------
panel_border_width="2px",
panel_border_color="#362d22",
panel_border_color_dark="#d4c4a3",
# --------------------------------------------------
# LOADER
# --------------------------------------------------
loader_color="#b58b4f",
loader_color_dark="#eac88a",
)
MAGIC_CSS = """
.gradio-container {
background: linear-gradient(135deg, #2b2318 0%, #17130e 100%) !important;
font-family: Georgia, "Times New Roman", serif;
position: relative;
overflow-x: hidden;
min-height: 100vh !important;
}
.gradio-container::before,
.gradio-container::after,
.container::before {
content: "";
position: absolute;
inset: 0;
pointer-events: none;
background-repeat: repeat;
z-index: 0;
}
.gradio-container::before {
background-image:
radial-gradient(circle at 10% 15%, #fffdf0 1.5px, transparent 1.5px),
radial-gradient(circle at 45% 65%, #fffdf0 1px, transparent 1px),
radial-gradient(circle at 85% 35%, #fffdf0 2px, transparent 2px),
radial-gradient(circle at 30% 85%, #fffdf0 1px, transparent 1px);
background-size: 300px 300px;
animation: magicTwinkle 2s infinite ease-in-out;
}
.gradio-container::after {
background-image:
radial-gradient(circle at 70% 15%, rgba(234, 200, 138, 0.9) 2px, transparent 2px),
radial-gradient(circle at 20% 50%, rgba(255, 255, 255, 0.8) 1.5px, transparent 1.5px),
radial-gradient(circle at 60% 90%, rgba(234, 200, 138, 0.9) 2.5px, transparent 2.5px);
background-size: 250px 250px;
animation: magicTwinkle 3s infinite ease-in-out alternate;
animation-delay: 0.7s;
}
.container::before {
background-image:
radial-gradient(circle at 50% 25%, #fffdf0 1.5px, transparent 1.5px),
radial-gradient(circle at 90% 75%, #fffdf0 2px, transparent 2px);
background-size: 200px 200px;
animation: magicTwinkle 4s infinite ease-in-out reverse;
animation-delay: 1.3s;
}
@keyframes magicTwinkle {
0%, 100% { opacity: 0.2; transform: scale(0.98); }
50% { opacity: 1; transform: scale(1.02); }
}
.container {
max-width: 950px !important;
margin: 30px auto !important;
padding: 20px !important;
background: rgba(244, 237, 222, 0.03) !important;
border: 1px solid rgba(212, 196, 163, 0.15) !important;
border-radius: 8px !important;
position: relative;
z-index: 1;
}
.block {
background: #fdfbf7 !important;
border: 2px solid #362d22 !important;
border-radius: 0 !important;
box-shadow: 4px 4px 0 #362d22 !important;
padding: 12px !important;
}
.gradio-container .gr-group {
background: #fdfbf7 !important;
border: 2px solid #362d22 !important;
box-shadow: 4px 4px 0 #362d22 !important;
padding: 12px !important;
border-radius: 0 !important;
margin-bottom: 15px !important;
}
.gradio-container .gr-group textarea {
border: none !important;
background: transparent !important;
box-shadow: none !important;
padding: 5px 0 !important;
}
h1, h2, h3, p, label, span {
color: #362d22 !important;
font-family: Georgia, "Times New Roman", serif !important;
}
h1 {
text-transform: uppercase;
letter-spacing: 1px;
border-bottom: 4px double #362d22;
padding-bottom: 5px;
margin-bottom: 20px !important;
text-align: center;
}
button.primary {
background: #362d22 !important;
color: #fdfbf7 !important;
border: none !important;
border-radius: 0 !important;
box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.3);
font-weight: bold;
}
button.primary:hover {
background: #504333 !important;
}
.filter-btn {
background: #fdfbf7 !important;
color: #362d22 !important;
border: 2px solid #362d22 !important;
border-radius: 0 !important;
font-weight: bold;
box-shadow: 2px 2px 0 rgba(0, 0, 0, 0.1);
}
.filter-btn:hover {
background: #eadeca !important;
}
centered-button-row {
display: flex !important;
justify-content: center !important;
align-items: center !important;
width: 100% !important;
}
.greeter-shell {
position: fixed;
inset: 0;
z-index: 9999;
display: flex;
align-items: center;
justify-content: center;
padding: 24px;
background:
radial-gradient(circle at top, rgba(234, 200, 138, 0.18), transparent 42%),
rgba(18, 13, 9, 0.88);
backdrop-filter: blur(8px);
}
.workspace-unlocked .greeter-shell {
backdrop-filter: none !important;
background: transparent !important;
opacity: 0 !important;
pointer-events: none !important;
}
.greeter-card {
width: min(920px, 100%);
display: grid;
grid-template-columns: minmax(240px, 320px) 1fr;
gap: 24px;
padding: 24px;
background: #fdfbf7;
border: 3px solid #362d22;
box-shadow: 10px 10px 0 #362d22;
}
.greeter-portrait {
border: 2px solid #362d22;
background: #efe4cf;
padding: 8px;
}
.greeter-portrait img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
}
.greeter-copy {
display: flex;
flex-direction: column;
justify-content: center;
gap: 14px;
}
.greeter-copy h2 {
margin: 0;
font-size: 2rem;
}
.greeter-copy p {
margin: 0;
font-size: 1.05rem;
line-height: 1.6;
}
.greeter-badge {
display: inline-block;
width: fit-content;
padding: 6px 10px;
border: 2px solid #362d22;
background: #eadeca;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 0.82rem;
}
.greeter-actions {
display: flex;
gap: 12px;
flex-wrap: wrap;
margin-top: 6px;
}
.greeter-note {
font-size: 0.92rem;
opacity: 0.9;
}
@media (max-width: 760px) {
.greeter-card {
grid-template-columns: 1fr;
}
}
"""