project-halide / ui /theme.py
Lonelyguyse1's picture
Deploy Project Halide Gradio Space
908aa37 verified
Raw
History Blame Contribute Delete
27.1 kB
"""Custom Gradio theme for the Project Halide workbench."""
from __future__ import annotations
import gradio as gr
BRASS = "#d29a45"
BRASS_DARK = "#8c5a1f"
COPPER = "#be5f38"
TEAL = "#9aae6f"
VIOLET = "#8b5e4f"
RED = "#d85c45"
INK = "#100d0a"
CARBON = "#17110d"
SURFACE = "#1f1711"
SURFACE_SOFT = "#2b2118"
SURFACE_LIFT = "#3a2b1f"
PAPER = "#fff0d8"
PAPER_SOFT = "#e6d1b6"
MUTED = "#b89c77"
BORDER = "#5a432f"
BLACK = "#080604"
THEME_CSS = f"""
:root {{
--halide-brass: {BRASS};
--halide-brass-dark: {BRASS_DARK};
--halide-copper: {COPPER};
--halide-teal: {TEAL};
--halide-violet: {VIOLET};
--halide-red: {RED};
--halide-ink: {INK};
--halide-carbon: {CARBON};
--halide-surface: {SURFACE};
--halide-surface-soft: {SURFACE_SOFT};
--halide-surface-lift: {SURFACE_LIFT};
--halide-paper: {PAPER};
--halide-paper-soft: {PAPER_SOFT};
--halide-muted: {MUTED};
--halide-border: {BORDER};
--halide-black: {BLACK};
}}
html,
body,
.gradio-container {{
background: var(--halide-ink) !important;
color: var(--halide-paper) !important;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
"Segoe UI", sans-serif !important;
letter-spacing: 0 !important;
}}
body::before {{
content: "";
position: fixed;
inset: 0;
pointer-events: none;
background:
repeating-linear-gradient(
90deg,
rgba(255, 240, 216, 0.018) 0,
rgba(255, 240, 216, 0.018) 1px,
transparent 1px,
transparent 16px
);
opacity: 0.45;
}}
.gradio-container {{
max-width: none !important;
min-height: 100vh !important;
padding: 0 18px 18px !important;
}}
#halide-app {{
min-height: 100vh;
}}
#halide-header {{
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
max-width: 1720px;
margin: 0 auto;
padding: 18px 0 14px;
border-bottom: 1px solid rgba(197, 154, 82, 0.34);
}}
.halide-brand-lockup {{
display: flex;
align-items: center;
gap: 14px;
min-width: 0;
}}
.halide-brand-mark {{
width: 46px;
height: 46px;
border-radius: 8px;
object-fit: cover;
border: 1px solid rgba(197, 154, 82, 0.45);
background: var(--halide-black);
}}
#halide-header h1 {{
color: var(--halide-paper);
font-size: clamp(1.5rem, 2.2vw, 2.35rem);
line-height: 1.04;
margin: 2px 0 0;
font-weight: 860;
letter-spacing: 0 !important;
}}
.halide-kicker {{
color: var(--halide-teal);
display: inline-block;
font-size: 0.72rem;
font-weight: 840;
letter-spacing: 0.12em !important;
text-transform: uppercase;
}}
.halide-model-strip {{
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 10px;
min-width: min(42vw, 36rem);
}}
.halide-model-strip span,
.halide-model-strip a {{
border: 1px solid rgba(197, 154, 82, 0.32);
color: var(--halide-paper);
background: rgba(24, 23, 21, 0.92);
border-radius: 8px;
padding: 9px 13px;
font-size: 0.76rem;
font-weight: 780;
line-height: 1.08;
text-decoration: none;
white-space: nowrap;
}}
.halide-model-strip a {{
color: #f5dfac;
border-color: rgba(154, 174, 111, 0.42);
background: rgba(58, 43, 31, 0.92);
}}
.halide-workbench {{
max-width: 1720px;
margin: 14px auto 0 !important;
gap: 14px !important;
align-items: flex-start;
}}
.halide-main-stage,
.halide-inspector,
.halide-intake-panel {{
min-width: 0 !important;
}}
.halide-intake-panel,
.halide-inspector {{
background: rgba(17, 17, 17, 0.98);
border: 1px solid rgba(58, 53, 46, 0.95);
border-radius: 8px;
padding: 12px;
}}
.halide-panel-title {{
color: var(--halide-paper);
font-size: 0.76rem;
font-weight: 880;
letter-spacing: 0.1em !important;
text-transform: uppercase;
margin: 0 0 8px;
}}
.halide-rail-copy {{
color: var(--halide-muted);
font-size: 0.84rem;
line-height: 1.42;
margin: 0 0 12px;
}}
.halide-model-card {{
border: 1px solid rgba(154, 174, 111, 0.30);
background: rgba(154, 174, 111, 0.075);
border-radius: 8px;
padding: 12px;
margin-top: 12px;
}}
.halide-model-card span {{
color: var(--halide-teal);
display: block;
font-size: 0.68rem;
font-weight: 860;
letter-spacing: 0.11em !important;
text-transform: uppercase;
margin-bottom: 5px;
}}
.halide-model-card strong {{
color: var(--halide-paper);
display: block;
font-size: 0.98rem;
line-height: 1.2;
}}
.halide-model-card p {{
color: var(--halide-muted);
margin: 6px 0 0;
font-size: 0.82rem;
line-height: 1.35;
}}
.halide-run-state {{
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 5px;
border-radius: 8px;
padding: 13px 15px;
margin-bottom: 12px;
background: var(--halide-surface);
border: 1px solid rgba(197, 154, 82, 0.30);
min-height: 76px;
}}
.halide-run-state strong {{
color: var(--halide-paper);
font-size: clamp(1.08rem, 1.5vw, 1.45rem);
line-height: 1.1;
}}
.halide-run-state span:last-child {{
color: var(--halide-muted);
font-size: 0.84rem;
}}
.halide-run-state.active {{
border-color: rgba(154, 174, 111, 0.48);
}}
.halide-run-state.quiet {{
border-color: rgba(139, 94, 79, 0.38);
}}
.halide-run-eyebrow {{
color: var(--halide-brass);
font-size: 0.68rem;
font-weight: 860;
letter-spacing: 0.12em !important;
text-transform: uppercase;
}}
.halide-lighttable {{
background: #120d09 !important;
border: 1px solid rgba(197, 154, 82, 0.34) !important;
border-radius: 8px !important;
padding: 13px !important;
box-shadow: 0 22px 52px rgba(0, 0, 0, 0.42) !important;
}}
.halide-empty-lighttable {{
position: relative;
min-height: clamp(360px, 54vh, 760px);
overflow: hidden;
display: grid;
place-items: center;
border-radius: 7px;
border: 1px solid rgba(243, 234, 219, 0.26);
background:
linear-gradient(180deg, rgba(33, 31, 28, 0.76), rgba(5, 5, 5, 0.96)),
repeating-linear-gradient(
0deg,
rgba(243, 234, 219, 0.035) 0,
rgba(243, 234, 219, 0.035) 1px,
transparent 1px,
transparent 24px
);
}}
.halide-empty-lighttable::after {{
content: "";
position: absolute;
inset: 24px;
border: 1px solid rgba(243, 234, 219, 0.12);
box-shadow: inset 0 0 0 1px rgba(5, 5, 5, 0.82);
pointer-events: none;
}}
.halide-empty-frame-grid {{
position: absolute;
inset: 18px;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 1px;
opacity: 0.86;
}}
.halide-empty-frame-grid > div {{
position: relative;
min-width: 0;
background:
linear-gradient(135deg, rgba(17, 17, 17, 0.9), rgba(44, 41, 36, 0.46)),
repeating-linear-gradient(
90deg,
rgba(197, 154, 82, 0.06) 0,
rgba(197, 154, 82, 0.06) 1px,
transparent 1px,
transparent 38px
);
border: 1px solid rgba(58, 53, 46, 0.92);
}}
.halide-empty-frame-grid span {{
position: absolute;
top: 12px;
left: 12px;
color: rgba(243, 234, 219, 0.72);
font-size: 0.7rem;
font-weight: 860;
letter-spacing: 0.1em !important;
text-transform: uppercase;
}}
.halide-empty-center {{
position: relative;
z-index: 2;
display: grid;
gap: 8px;
min-width: min(22rem, calc(100% - 48px));
padding: 18px 20px;
text-align: center;
border-radius: 8px;
border: 1px solid rgba(197, 154, 82, 0.42);
background: rgba(10, 10, 10, 0.78);
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.46);
}}
.halide-empty-center span {{
color: var(--halide-brass);
font-size: 0.68rem;
font-weight: 880;
letter-spacing: 0.12em !important;
text-transform: uppercase;
}}
.halide-empty-center strong {{
color: var(--halide-paper);
font-size: clamp(1.05rem, 1.8vw, 1.6rem);
line-height: 1.12;
}}
.halide-empty-lighttable.active {{
border-color: rgba(154, 174, 111, 0.36);
}}
.halide-empty-lighttable.active .halide-empty-center {{
border-color: rgba(154, 174, 111, 0.44);
}}
.halide-empty-lighttable.active .halide-empty-center span {{
color: var(--halide-teal);
}}
.halide-section-header {{
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 12px;
margin-bottom: 12px;
}}
.halide-section-header span {{
color: var(--halide-brass);
display: block;
font-size: 0.68rem;
font-weight: 880;
letter-spacing: 0.12em !important;
text-transform: uppercase;
}}
.halide-section-header strong {{
color: var(--halide-paper);
display: block;
font-size: 1rem;
line-height: 1.2;
margin-top: 3px;
}}
.halide-section-header small {{
color: var(--halide-muted);
border: 1px solid rgba(197, 154, 82, 0.26);
border-radius: 999px;
padding: 5px 9px;
font-size: 0.72rem;
line-height: 1;
}}
.halide-review-gallery {{
background: var(--halide-black) !important;
}}
.halide-review-gallery {{
margin-top: 12px !important;
}}
.halide-upload img,
.halide-review-gallery img {{
background: var(--halide-black) !important;
object-fit: contain !important;
}}
#halide-compare {{
min-height: 0 !important;
}}
.halide-compare-viewer {{
display: grid;
gap: 12px;
background: var(--halide-black);
border: 1px solid rgba(255, 240, 216, 0.16);
border-radius: 8px;
padding: 12px;
}}
.halide-compare-stage {{
position: relative;
min-height: clamp(380px, 58vh, 720px);
overflow: hidden;
display: grid;
place-items: center;
background:
linear-gradient(180deg, rgba(31, 23, 17, 0.82), rgba(8, 6, 4, 0.98)),
repeating-linear-gradient(
90deg,
rgba(210, 154, 69, 0.055) 0,
rgba(210, 154, 69, 0.055) 1px,
transparent 1px,
transparent 34px
);
border-radius: 7px;
}}
.halide-compare-stage img {{
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: contain;
background: var(--halide-black);
}}
.halide-compare-overlay {{
position: absolute;
inset: 0;
clip-path: inset(0 calc(100% - var(--halide-split)) 0 0);
}}
.halide-compare-divider {{
position: absolute;
top: 0;
bottom: 0;
left: var(--halide-split);
width: 2px;
transform: translateX(-1px);
background: rgba(255, 240, 216, 0.88);
box-shadow: 0 0 0 1px rgba(8, 6, 4, 0.70), 0 0 18px rgba(190, 95, 56, 0.38);
}}
.halide-compare-label {{
position: absolute;
top: 12px;
z-index: 2;
border: 1px solid rgba(255, 240, 216, 0.20);
background: rgba(16, 13, 10, 0.78);
color: var(--halide-paper);
border-radius: 999px;
padding: 6px 9px;
font-size: 0.70rem;
font-weight: 820;
line-height: 1;
}}
.halide-compare-label.original {{
left: 12px;
}}
.halide-compare-label.overlay {{
right: 12px;
}}
.halide-compare-range {{
width: 100%;
accent-color: var(--halide-copper);
}}
#halide-run-button,
button.primary,
.primary button {{
background: var(--halide-copper) !important;
color: white !important;
border: 1px solid rgba(255, 255, 255, 0.16) !important;
border-radius: 8px !important;
font-weight: 860 !important;
letter-spacing: 0 !important;
min-height: 46px !important;
box-shadow: 0 16px 30px rgba(184, 95, 63, 0.24) !important;
}}
#halide-run-button:hover,
button.primary:hover,
.primary button:hover {{
background: #ca6f4c !important;
}}
button.secondary,
.secondary button,
button {{
border-radius: 8px !important;
font-weight: 760 !important;
}}
.halide-section-title {{
color: var(--halide-paper);
font-size: 0.76rem;
font-weight: 880;
letter-spacing: 0.1em !important;
text-transform: uppercase;
margin: 0 0 10px;
}}
.halide-subsection {{
color: var(--halide-muted);
font-size: 0.72rem;
font-weight: 860;
letter-spacing: 0.08em !important;
margin: 14px 0 7px;
text-transform: uppercase;
}}
.halide-muted {{
color: var(--halide-muted);
margin: 0;
}}
.halide-empty-card {{
background: rgba(33, 31, 28, 0.82);
border: 1px solid rgba(197, 154, 82, 0.28);
border-radius: 8px;
padding: 13px;
}}
.halide-empty-card span {{
color: var(--halide-brass);
display: block;
font-size: 0.68rem;
font-weight: 880;
letter-spacing: 0.12em !important;
text-transform: uppercase;
margin-bottom: 6px;
}}
.halide-empty-card strong {{
color: var(--halide-paper);
display: block;
font-size: 1rem;
line-height: 1.2;
}}
.halide-empty-card p {{
color: var(--halide-muted);
font-size: 0.84rem;
line-height: 1.4;
margin: 7px 0 0;
}}
.halide-notice {{
border-radius: 8px;
padding: 11px 12px;
border: 1px solid var(--halide-border);
color: var(--halide-paper);
background: rgba(33, 31, 28, 0.9);
font-size: 0.88rem;
line-height: 1.42;
margin-bottom: 10px;
}}
.halide-notice.good {{
border-color: rgba(154, 174, 111, 0.40);
background: rgba(154, 174, 111, 0.085);
}}
.halide-notice.caution {{
border-color: rgba(197, 154, 82, 0.48);
background: rgba(197, 154, 82, 0.08);
}}
.halide-notice.neutral {{
border-color: rgba(139, 94, 79, 0.38);
background: rgba(139, 94, 79, 0.085);
}}
.halide-stats {{
display: grid;
gap: 0;
}}
.halide-stats.compact {{
gap: 0;
}}
.halide-stat {{
display: grid;
grid-template-columns: minmax(7rem, 0.42fr) minmax(0, 1fr);
gap: 12px;
padding: 8px 0;
border-bottom: 1px solid rgba(58, 53, 46, 0.85);
color: var(--halide-paper);
min-width: 0;
}}
.halide-stat:last-child {{
border-bottom: 0;
}}
.halide-stat-label {{
color: var(--halide-muted);
font-weight: 780;
}}
.halide-stat span:last-child {{
overflow-wrap: anywhere;
text-align: right;
}}
.halide-report {{
display: grid;
gap: 10px;
}}
.halide-report-section {{
background: rgba(33, 31, 28, 0.82);
border: 1px solid rgba(58, 53, 46, 0.94);
border-left: 3px solid var(--halide-brass);
border-radius: 8px;
padding: 12px 13px;
}}
.halide-report-heading {{
color: var(--halide-paper);
font-size: 0.78rem;
font-weight: 880;
letter-spacing: 0.1em !important;
margin-bottom: 8px;
text-transform: uppercase;
}}
.halide-report-body {{
color: var(--halide-paper-soft);
font-size: 0.93rem;
line-height: 1.56;
}}
.halide-report-body p {{
margin: 0 0 8px;
}}
.halide-report-body p:last-child {{
margin-bottom: 0;
}}
.halide-report-body ul,
.halide-report-body ol {{
margin: 0;
padding-left: 1.15rem;
}}
.halide-report-body li {{
margin: 5px 0;
padding-left: 2px;
}}
.halide-pill-row {{
display: flex;
flex-wrap: wrap;
gap: 7px;
margin-bottom: 10px;
}}
.halide-defect-pill {{
display: inline-flex;
align-items: center;
gap: 6px;
background: rgba(184, 95, 63, 0.13);
color: #ffe4d8;
border: 1px solid rgba(184, 95, 63, 0.38);
padding: 6px 9px;
border-radius: 999px;
font-size: 0.78rem;
font-weight: 780;
white-space: nowrap;
}}
.halide-defect-pill strong {{
color: var(--halide-paper);
}}
.halide-defect-pill.dust {{
background: rgba(197, 154, 82, 0.13);
border-color: rgba(197, 154, 82, 0.38);
}}
.halide-defect-pill.dirt {{
background: rgba(184, 95, 63, 0.13);
border-color: rgba(184, 95, 63, 0.38);
}}
.halide-defect-pill.scratch {{
background: rgba(239, 93, 82, 0.14);
border-color: rgba(239, 93, 82, 0.42);
}}
.halide-defect-pill.long_hair {{
background: rgba(139, 94, 79, 0.14);
border-color: rgba(139, 94, 79, 0.40);
}}
.halide-defect-pill.short_hair {{
background: rgba(154, 174, 111, 0.12);
border-color: rgba(154, 174, 111, 0.38);
}}
.halide-defect-pill.emulsion_damage {{
background: rgba(215, 203, 184, 0.12);
border-color: rgba(215, 203, 184, 0.34);
}}
.halide-defect-pill.chemical_stain {{
background: rgba(154, 174, 111, 0.13);
border-color: rgba(154, 174, 111, 0.38);
}}
.halide-defect-pill.light_leak {{
background: rgba(244, 114, 182, 0.13);
border-color: rgba(244, 114, 182, 0.36);
}}
.halide-history-detail {{
display: grid;
gap: 8px;
}}
.halide-intake-panel .block,
.halide-inspector .block,
.halide-lighttable .block {{
background: rgba(24, 23, 21, 0.95) !important;
border-color: rgba(58, 53, 46, 0.95) !important;
border-radius: 8px !important;
box-shadow: none !important;
outline: none !important;
overflow: hidden !important;
}}
.halide-intake-panel .block:focus-within,
.halide-inspector .block:focus-within,
.halide-lighttable .block:focus-within {{
border-color: rgba(197, 154, 82, 0.48) !important;
box-shadow: 0 0 0 1px rgba(197, 154, 82, 0.16) !important;
}}
.halide-intake-panel .form,
.halide-inspector .form,
.halide-lighttable .form {{
background: transparent !important;
border-color: transparent !important;
overflow: visible !important;
}}
input,
textarea,
select,
.wrap,
.input-container,
.tokenizer,
.prose {{
background-color: var(--halide-surface-soft) !important;
color: var(--halide-paper) !important;
border-color: rgba(58, 53, 46, 0.95) !important;
outline: none !important;
}}
label,
.label,
.gradio-radio label,
.gradio-checkbox label {{
color: var(--halide-muted) !important;
font-weight: 760 !important;
}}
.label-wrap,
.label-wrap span,
label[data-testid="block-label"] {{
background: rgba(33, 31, 28, 0.98) !important;
border-color: rgba(197, 154, 82, 0.24) !important;
color: var(--halide-paper) !important;
border-radius: 6px !important;
font-weight: 780 !important;
box-shadow: none !important;
}}
label[data-testid="block-label"] span {{
color: var(--halide-paper) !important;
}}
label[data-testid$="-radio-label"] {{
background: rgba(33, 31, 28, 0.98) !important;
border: 1px solid rgba(243, 234, 219, 0.18) !important;
border-radius: 8px !important;
box-shadow: none !important;
opacity: 1 !important;
}}
label[data-testid$="-radio-label"].selected {{
background: rgba(197, 154, 82, 0.16) !important;
border-color: rgba(197, 154, 82, 0.5) !important;
}}
label[data-testid$="-radio-label"] span,
label[data-testid$="-radio-label"] input,
.gradio-checkbox label span {{
color: var(--halide-paper) !important;
opacity: 1 !important;
}}
label[data-testid$="-radio-label"] input {{
accent-color: var(--halide-brass);
}}
.tabs {{
gap: 4px !important;
}}
.tabs button {{
color: var(--halide-muted) !important;
font-weight: 820 !important;
border-radius: 8px !important;
}}
.tabs button.selected {{
color: var(--halide-paper) !important;
border-color: var(--halide-brass) !important;
background: rgba(197, 154, 82, 0.10) !important;
}}
table,
thead,
tbody,
tr,
td,
th {{
color: var(--halide-paper) !important;
}}
pre,
code {{
font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Consolas, monospace !important;
}}
footer {{
max-width: 1720px;
margin: 0 auto;
color: var(--halide-muted) !important;
text-align: center;
padding: 14px 8px 4px;
font-size: 0.82rem;
display: flex;
align-items: center;
justify-content: center;
flex-wrap: wrap;
gap: 10px 16px;
}}
footer a {{
color: var(--halide-amber-light) !important;
text-decoration: none;
border-bottom: 1px solid rgba(236, 177, 107, 0.35);
}}
footer a:hover {{
color: var(--halide-paper) !important;
border-bottom-color: rgba(236, 177, 107, 0.75);
}}
#halide-header {{
background: rgba(17, 17, 17, 0.86);
border: 1px solid rgba(197, 154, 82, 0.28);
border-top: 0;
border-radius: 0 0 8px 8px;
padding: 16px 18px 15px;
box-shadow: 0 18px 48px rgba(0, 0, 0, 0.35);
}}
.halide-inspector {{
position: sticky;
top: 14px;
max-height: calc(100vh - 32px);
overflow-y: auto;
scrollbar-color: rgba(197, 154, 82, 0.48) rgba(17, 17, 17, 0.88);
}}
.halide-intake-panel {{
align-self: flex-start;
height: auto !important;
overflow: visible !important;
}}
.halide-main-stage {{
align-self: stretch;
}}
.halide-lighttable {{
position: relative;
overflow: hidden;
padding: 16px 20px !important;
background:
linear-gradient(180deg, rgba(17, 17, 17, 0.98), rgba(5, 5, 5, 0.98)),
repeating-linear-gradient(
90deg,
rgba(243, 234, 219, 0.026) 0,
rgba(243, 234, 219, 0.026) 1px,
transparent 1px,
transparent 28px
) !important;
}}
.halide-lighttable::before {{
content: "";
position: absolute;
inset: 14px 8px;
pointer-events: none;
border-left: 1px solid rgba(197, 154, 82, 0.22);
border-right: 1px solid rgba(197, 154, 82, 0.22);
background:
repeating-linear-gradient(
0deg,
rgba(197, 154, 82, 0.24) 0,
rgba(197, 154, 82, 0.24) 7px,
transparent 7px,
transparent 22px
) left center / 5px 100% no-repeat,
repeating-linear-gradient(
0deg,
rgba(197, 154, 82, 0.24) 0,
rgba(197, 154, 82, 0.24) 7px,
transparent 7px,
transparent 22px
) right center / 5px 100% no-repeat;
opacity: 0.55;
}}
.halide-lighttable > * {{
position: relative;
z-index: 1;
}}
.halide-review-actions {{
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 12px;
}}
.halide-review-actions a,
.halide-history-preview-actions a {{
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 36px;
padding: 0 12px;
border-radius: 8px;
border: 1px solid rgba(154, 174, 111, 0.38);
background: rgba(154, 174, 111, 0.09);
color: #f5dfac !important;
text-decoration: none !important;
font-size: 0.78rem;
font-weight: 820;
}}
.halide-review-actions a:hover,
.halide-history-preview-actions a:hover {{
border-color: rgba(154, 174, 111, 0.62);
background: rgba(154, 174, 111, 0.14);
}}
.halide-report-subheading {{
color: var(--halide-teal);
font-size: 0.82rem;
font-weight: 860;
margin: 10px 0 6px;
}}
.halide-report-body strong {{
color: var(--halide-paper);
}}
.halide-report-body em {{
color: var(--halide-paper-soft);
}}
.halide-report-body code {{
color: #f5dfac;
background: rgba(154, 174, 111, 0.10);
border: 1px solid rgba(154, 174, 111, 0.24);
border-radius: 5px;
padding: 1px 5px;
}}
.halide-tab-note {{
color: var(--halide-muted);
font-size: 0.8rem;
line-height: 1.35;
margin: 0 0 8px;
}}
.halide-history-actions {{
gap: 8px !important;
margin: 6px 0 8px !important;
}}
.halide-history-actions button {{
min-height: 36px !important;
}}
.halide-history-table tbody tr {{
cursor: pointer;
}}
.halide-history-table table {{
table-layout: fixed !important;
}}
.halide-history-table th,
.halide-history-table td {{
font-size: 0.78rem !important;
line-height: 1.25 !important;
vertical-align: top !important;
}}
.halide-history-table th:nth-child(1),
.halide-history-table td:nth-child(1) {{
width: 24% !important;
}}
.halide-history-table th:nth-child(2),
.halide-history-table td:nth-child(2) {{
width: 31% !important;
}}
.halide-history-table th:nth-child(3),
.halide-history-table td:nth-child(3) {{
width: 14% !important;
text-align: center !important;
}}
.halide-history-table th:nth-child(4),
.halide-history-table td:nth-child(4) {{
width: 31% !important;
}}
.halide-history-table tbody tr:hover td {{
background: rgba(197, 154, 82, 0.10) !important;
}}
.halide-history-preview {{
border: 1px solid rgba(197, 154, 82, 0.26);
background: rgba(5, 5, 5, 0.74);
border-radius: 8px;
padding: 8px;
display: grid;
gap: 8px;
}}
.halide-history-preview img {{
width: 100%;
max-height: 220px;
object-fit: contain;
background: var(--halide-black);
border-radius: 6px;
}}
.halide-history-preview-actions {{
display: flex;
flex-wrap: wrap;
gap: 7px;
}}
.halide-inspector-tabs {{
min-width: 0;
}}
.halide-inspector-tabs .tab-nav,
.halide-inspector-tabs [role="tablist"] {{
overflow-x: auto;
}}
@media (max-width: 1380px) {{
.halide-workbench {{
flex-direction: column !important;
gap: 12px !important;
}}
.halide-intake-panel,
.halide-main-stage,
.halide-inspector {{
width: 100% !important;
}}
.halide-inspector {{
min-width: 0 !important;
}}
.halide-lighttable {{
padding: 11px !important;
}}
.halide-inspector {{
position: static;
max-height: none;
}}
}}
@media (max-width: 760px) {{
.gradio-container {{
padding: 0 10px 12px !important;
}}
#halide-header {{
align-items: flex-start;
flex-direction: column;
gap: 12px;
padding-top: 14px;
}}
#halide-header h1 {{
font-size: 1.42rem;
max-width: 11rem;
}}
.halide-model-strip {{
justify-content: flex-start;
min-width: 0;
width: 100%;
gap: 6px;
}}
.halide-model-strip span,
.halide-model-strip a {{
padding: 7px 8px;
font-size: 0.68rem;
}}
.halide-brand-mark {{
width: 40px;
height: 40px;
}}
.halide-intake-panel,
.halide-inspector {{
padding: 10px;
}}
.halide-run-state {{
min-height: 68px;
padding: 12px;
}}
.halide-empty-lighttable {{
min-height: 370px;
}}
.halide-empty-frame-grid {{
inset: 10px;
}}
.halide-empty-lighttable::after {{
inset: 16px;
}}
.halide-empty-frame-grid span {{
top: 10px;
left: 10px;
font-size: 0.62rem;
}}
.halide-empty-center {{
min-width: calc(100% - 40px);
padding: 15px 16px;
}}
.tabs button {{
min-height: 42px !important;
padding: 9px 10px !important;
}}
.halide-review-gallery {{
height: 190px !important;
}}
.halide-compare-stage {{
min-height: 360px !important;
}}
#halide-run-button,
button.primary,
.primary button {{
min-height: 48px !important;
}}
.halide-stat {{
grid-template-columns: 1fr;
gap: 3px;
}}
.halide-stat span:last-child {{
text-align: left;
}}
}}
"""
def build_theme() -> gr.Theme:
"""Build a compact custom workbench theme."""
return gr.themes.Base(
primary_hue=gr.themes.Color(
c50="#fff8ed",
c100="#f8ead2",
c200="#ebd1a3",
c300="#d9b36d",
c400=BRASS,
c500=BRASS,
c600=BRASS_DARK,
c700="#694a24",
c800="#4d361d",
c900="#332313",
c950="#1c1209",
),
secondary_hue=gr.themes.Color(
c50="#f8faec",
c100="#eef3d1",
c200="#dbe6a9",
c300=TEAL,
c400="#7f9857",
c500="#667a43",
c600="#506236",
c700="#3e4d2b",
c800="#303c22",
c900="#252f1b",
c950="#131a0d",
),
neutral_hue=gr.themes.Color(
c50="#fbf7ef",
c100=PAPER,
c200=PAPER_SOFT,
c300=MUTED,
c400="#85796a",
c500="#6e6357",
c600="#544d44",
c700=BORDER,
c800=SURFACE_SOFT,
c900=SURFACE,
c950=BLACK,
),
font=gr.themes.GoogleFont("Inter"),
font_mono=gr.themes.GoogleFont("JetBrains Mono"),
).set(
body_background_fill=INK,
body_background_fill_dark=INK,
body_text_color=PAPER,
body_text_color_dark=PAPER,
button_primary_background_fill=COPPER,
button_primary_background_fill_dark=COPPER,
button_primary_text_color="#ffffff",
button_primary_text_color_dark="#ffffff",
block_background_fill=SURFACE,
block_background_fill_dark=SURFACE,
block_border_color=BORDER,
block_border_color_dark=BORDER,
input_background_fill=SURFACE_SOFT,
input_background_fill_dark=SURFACE_SOFT,
input_border_color=BORDER,
input_border_color_dark=BORDER,
)