/* uglytool.dev — Clean Room theme (v1) * See README.md for drop-in instructions for Gradio + Streamlit. * You bought this file. Modify whatever you want — tweak the blue, * swap the font, remove the credit. It's yours now. */ @import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap'); /* ============================================================ * Part 1 — Theme variables * ============================================================ */ :root, :root.dark, .gradio-container, .gradio-container.dark, body.dark { --cr-bg: #ffffff; --cr-surface: #f7f8fa; --cr-surface-2: #eceef1; --cr-border: rgba(17, 24, 39, 0.1); --cr-border-soft: rgba(17, 24, 39, 0.05); --cr-border-focus: #2563a8; --cr-blue: #2563a8; --cr-blue-soft: rgba(37, 99, 168, 0.08); --cr-blue-dim: rgba(37, 99, 168, 0.25); --cr-ink: #111827; --cr-muted: #6b7280; --cr-dim: #9ca3af; --body-background-fill: var(--cr-bg); --background-fill-primary: var(--cr-surface); --background-fill-secondary: var(--cr-surface-2); --body-text-color: var(--cr-ink); --body-text-color-subdued: var(--cr-muted); --color-accent: var(--cr-blue); --color-accent-soft: var(--cr-blue-soft); --border-color-primary: var(--cr-border); --border-color-accent: var(--cr-blue); --block-background-fill: var(--cr-surface); --block-border-color: var(--cr-border); --block-border-width: 1px; --block-radius: 3px; --block-shadow: none; --block-title-background-fill: transparent; --block-title-border-color: transparent; --block-title-text-color: var(--cr-ink); --block-title-text-size: 0.78rem; --block-title-text-weight: 600; --block-label-background-fill: transparent; --block-label-border-color: transparent; --block-label-text-color: var(--cr-ink); --block-label-text-size: 0.75rem; --block-label-text-weight: 600; --input-background-fill: var(--cr-bg); --input-background-fill-focus: var(--cr-bg); --input-border-color: var(--cr-border); --input-border-color-focus: var(--cr-blue); --input-text-size: 0.92rem; --input-radius: 3px; --button-primary-background-fill: var(--cr-blue); --button-primary-background-fill-hover: #1f5596; --button-primary-text-color: var(--cr-bg); --button-primary-text-color-hover: var(--cr-bg); --button-primary-border-color: var(--cr-blue); --button-secondary-background-fill: var(--cr-bg); --button-secondary-background-fill-hover: var(--cr-blue-soft); --button-secondary-text-color: var(--cr-blue); --button-secondary-text-color-hover: var(--cr-blue); --button-secondary-border-color: var(--cr-border); --button-large-text-size: 0.82rem; --button-large-text-weight: 600; --button-large-radius: 3px; --slider-color: var(--cr-blue); --font: 'Plus Jakarta Sans', ui-sans-serif, system-ui, sans-serif; --font-mono: 'JetBrains Mono', ui-monospace, monospace; --radius-xxs: 1px; --radius-xs: 2px; --radius-sm: 3px; --radius-md: 4px; --radius-lg: 6px; } /* ============================================================ * Part 2 — Root containers * ============================================================ */ html body, html body.dark, html body .gradio-container, html body .gradio-container.dark, html body .stApp, html body .stApp > div, html body [data-testid="stAppViewContainer"] { background: var(--cr-bg) !important; color: var(--cr-ink) !important; font-family: 'Plus Jakarta Sans', ui-sans-serif, system-ui, sans-serif !important; -webkit-font-smoothing: antialiased !important; } html body .main .block-container, html body .stApp [data-testid="stVerticalBlock"] { background: var(--cr-bg) !important; } /* ============================================================ * Part 3 — Typography * Headings: Plus Jakarta bold, ink color. * Labels: all-caps Plus Jakarta at 0.75rem, ink color, 0.1em tracking. * Blue is reserved for indices, focus states, buttons. * ============================================================ */ html body h1, html body h2, html body h3, html body h4, html body h5, html body h6, html body .gradio-container h1, html body .gradio-container h2, html body .gradio-container h3, html body .gradio-container h4, html body .gradio-container h5, html body .gradio-container h6, html body .gradio-container h1 *, html body .gradio-container h2 *, html body .gradio-container h3 *, html body .prose h1, html body .prose h2, html body .prose h3, html body .prose h4, html body .prose h1 *, html body .prose h2 *, html body .prose h3 *, html body .markdown h1, html body .markdown h2, html body .markdown h3, html body .markdown h1 *, html body .markdown h2 *, html body .markdown h3 *, html body .gr-markdown h1, html body .gr-markdown h2, html body .gr-markdown h3, html body .gr-markdown h1 *, html body .gr-markdown h2 *, html body .gr-markdown h3 *, html body .stApp h1, html body .stApp h2, html body .stApp h3, html body [data-testid="stMarkdownContainer"] h1, html body [data-testid="stMarkdownContainer"] h2, html body [data-testid="stMarkdownContainer"] h3, html body [data-testid="stMarkdownContainer"] h1 *, html body [data-testid="stMarkdownContainer"] h2 *, html body [data-testid="stMarkdownContainer"] h3 * { font-family: 'Plus Jakarta Sans', ui-sans-serif, sans-serif !important; font-weight: 700 !important; letter-spacing: -0.02em !important; color: var(--cr-ink) !important; -webkit-text-fill-color: var(--cr-ink) !important; background-image: none !important; background-clip: unset !important; -webkit-background-clip: unset !important; line-height: 1.15 !important; } /* Labels — all-caps Plus Jakarta, ink, narrow tracking. */ html body .gradio-container .block-label, html body .gradio-container .block-label *, html body .gradio-container label, html body .gradio-container label > *, html body .gradio-container [class*="label-wrap"], html body .gradio-container [class*="label-wrap"] *, html body .gradio-container [data-testid*="label"], html body .gradio-container .wrap > label, html body .stApp label, html body .stApp [data-testid="stWidgetLabel"], html body .stApp [data-testid="stWidgetLabel"] > *, html body .stApp [data-testid="stWidgetLabel"] p { font-family: 'Plus Jakarta Sans', ui-sans-serif, sans-serif !important; font-size: 0.75rem !important; color: var(--cr-ink) !important; letter-spacing: 0.1em !important; text-transform: uppercase !important; font-weight: 600 !important; background: transparent !important; } /* ============================================================ * Part 4 — Blocks / cards * ============================================================ */ html body .gradio-container .block, html body .gradio-container .gr-block, html body .gradio-container .gr-padded, html body .gradio-container .gr-form, html body .gradio-container .gr-box, html body .gradio-container .wrap, html body .stApp [data-testid="stForm"], html body .stApp [data-testid="stExpander"] { background: var(--cr-surface) !important; border: 1px solid var(--cr-border) !important; border-radius: 3px !important; } /* ============================================================ * Part 5 — Inputs * ============================================================ */ html body .gradio-container input[type="text"], html body .gradio-container input[type="number"], html body .gradio-container input[type="email"], html body .gradio-container input[type="password"], html body .gradio-container input[type="search"], html body .gradio-container textarea, html body .gradio-container select, html body .gradio-container .gr-textbox, html body .gradio-container .gr-textbox textarea, html body .gradio-container .gr-textbox input, html body .stApp input[type="text"], html body .stApp input[type="number"], html body .stApp textarea, html body .stApp [data-baseweb="select"] > div, html body .stApp [data-baseweb="input"] { background: var(--cr-bg) !important; border: 1px solid var(--cr-border) !important; border-radius: 3px !important; color: var(--cr-ink) !important; font-family: 'Plus Jakarta Sans', ui-sans-serif, sans-serif !important; font-size: 0.92rem !important; caret-color: var(--cr-blue) !important; padding: 10px 12px !important; line-height: 1.5 !important; } html body .gradio-container textarea, html body .stApp textarea { min-height: 130px !important; background: var(--cr-surface) !important; } html body .gradio-container input:focus, html body .gradio-container textarea:focus, html body .gradio-container select:focus, html body .stApp input:focus, html body .stApp textarea:focus { border-color: var(--cr-blue) !important; outline: none !important; box-shadow: 0 0 0 3px var(--cr-blue-soft) !important; } html body .gradio-container ::placeholder, html body .stApp ::placeholder { color: var(--cr-dim) !important; } /* ============================================================ * Part 6 — Buttons (blue, uppercase Plus Jakarta, small radius) * ============================================================ */ html body .gradio-container button, html body .gradio-container .gr-button, html body .gradio-container [class*="gr-button"], html body .gradio-container button.primary, html body .gradio-container .primary, html body .stApp .stButton > button, html body .stApp button[kind="primary"] { background: var(--cr-blue) !important; color: var(--cr-bg) !important; font-family: 'Plus Jakarta Sans', ui-sans-serif, sans-serif !important; font-weight: 600 !important; font-size: 0.82rem !important; letter-spacing: 0.12em !important; text-transform: uppercase !important; border: 1px solid var(--cr-blue) !important; border-radius: 3px !important; padding: 12px 20px !important; cursor: pointer !important; transition: background 150ms, transform 100ms !important; } html body .gradio-container button:hover, html body .gradio-container .gr-button:hover, html body .stApp .stButton > button:hover { background: #1f5596 !important; border-color: #1f5596 !important; color: var(--cr-bg) !important; } html body .gradio-container button:active, html body .stApp .stButton > button:active { transform: scale(0.996) !important; } html body .gradio-container button.secondary, html body .gradio-container .secondary, html body .stApp button[kind="secondary"] { background: var(--cr-bg) !important; color: var(--cr-blue) !important; border: 1px solid var(--cr-border) !important; } /* ============================================================ * Part 7 — Sliders, checkboxes, radios * ============================================================ */ html body input[type="range"] { accent-color: var(--cr-blue) !important; } html body input[type="range"]::-webkit-slider-thumb { background: var(--cr-blue) !important; border: 2px solid var(--cr-bg) !important; box-shadow: 0 0 0 1px var(--cr-blue-dim) !important; } html body input[type="range"]::-moz-range-thumb { background: var(--cr-blue) !important; border: 2px solid var(--cr-bg) !important; } html body input[type="checkbox"], html body input[type="radio"] { accent-color: var(--cr-blue) !important; } /* ============================================================ * Part 8 — File uploads * ============================================================ */ html body .gradio-container .gr-file-upload, html body .gradio-container input[type="file"], html body .stApp [data-testid="stFileUploader"], html body .stApp [data-testid="stFileUploaderDropzone"] { background: var(--cr-surface) !important; border: 1px dashed var(--cr-border) !important; border-radius: 3px !important; color: var(--cr-ink) !important; } html body input[type="file"]::file-selector-button { background: var(--cr-bg) !important; color: var(--cr-blue) !important; border: 1px solid var(--cr-border) !important; border-radius: 3px !important; padding: 5px 12px !important; margin-right: 12px !important; font-family: 'Plus Jakarta Sans', ui-sans-serif, sans-serif !important; font-weight: 500 !important; font-size: 0.78rem !important; text-transform: uppercase !important; letter-spacing: 0.08em !important; cursor: pointer !important; } /* ============================================================ * Part 9 — Markdown, code, links * ============================================================ */ html body .gradio-container .markdown, html body .gradio-container .gr-markdown, html body .gradio-container .prose, html body .stApp [data-testid="stMarkdownContainer"] { color: var(--cr-ink) !important; font-family: 'Plus Jakarta Sans', ui-sans-serif, sans-serif !important; line-height: 1.55 !important; } html body .gradio-container a, html body .stApp a { color: var(--cr-blue) !important; } html body code, html body .gradio-container code, html body .stApp code { background: var(--cr-blue-soft) !important; color: var(--cr-blue) !important; font-family: 'JetBrains Mono', ui-monospace, monospace !important; padding: 2px 6px !important; border-radius: 2px !important; } /* ============================================================ * Part 10 — Scrollbars + Streamlit chrome * ============================================================ */ html body ::-webkit-scrollbar { width: 8px; height: 8px; } html body ::-webkit-scrollbar-track { background: var(--cr-bg); } html body ::-webkit-scrollbar-thumb { background: var(--cr-border); border-radius: 3px; } html body ::-webkit-scrollbar-thumb:hover { background: var(--cr-blue-dim); } html body .stApp header[data-testid="stHeader"] { background: var(--cr-bg) !important; border-bottom: 1px solid var(--cr-border) !important; } html body .stApp [data-testid="stSidebar"] { background: var(--cr-surface) !important; border-right: 1px solid var(--cr-border) !important; }