Spaces:
Sleeping
Sleeping
| @import url('https://fonts.googleapis.com/css2?family=Syne:wght@500;600;700;800&family=DM+Sans:ital,wght@0,300;0,400;0,500;1,400&family=DM+Mono:wght@400;500&display=swap'); | |
| /* uglytool.dev — After Hours theme (v5) | |
| * You bought this file. Modify whatever you want — tweak the amber, | |
| * swap the font, remove the credit. It's yours now. | |
| */ | |
| :root, | |
| :root.dark, | |
| .gradio-container, | |
| .gradio-container.dark, | |
| body.dark { | |
| --ut-bg: #151412; | |
| --ut-bg-deep: #0f0e0d; | |
| --ut-bg-tint: #23201b; | |
| --ut-panel: #25221e; | |
| --ut-surface: rgba(35, 32, 28, 0.78); | |
| --ut-surface-solid: #2b2721; | |
| --ut-surface-hover: #342f2a; | |
| --ut-surface-nested: rgba(36, 34, 32, 0.40); | |
| --ut-border: rgba(255, 218, 159, 0.12); | |
| --ut-border-strong: rgba(255, 218, 159, 0.24); | |
| --ut-ink: #f3eee6; | |
| --ut-ink-strong: #fdfbf6; | |
| --ut-muted: #a79a8a; | |
| --ut-dim: #6d655b; | |
| --ut-on-accent: #14110e; | |
| --ut-selection-ink: #fdfbf6; | |
| --ut-accent: #c17f3a; | |
| --ut-accent-bright: #f2b35f; | |
| --ut-accent-deep: #8f5925; | |
| --ut-accent-mid: #d8954a; | |
| --ut-accent-soft: rgba(242, 179, 95, 0.12); | |
| --ut-accent-dim: rgba(242, 179, 95, 0.06); | |
| --ut-accent-rim: rgba(242, 179, 95, 0.28); | |
| --ut-warm: #ffcf86; | |
| --ut-warm-soft: rgba(255, 207, 134, 0.12); | |
| --ut-warm-rim: rgba(255, 207, 134, 0.28); | |
| --ut-cool: #80786e; | |
| --ut-cool-soft: rgba(128, 120, 110, 0.16); | |
| --ut-cool-rim: rgba(128, 120, 110, 0.34); | |
| --ut-title-ink: var(--ut-accent-bright); | |
| --ut-title-glow: 0 0 22px rgba(242, 179, 95, 0.20); | |
| --ut-font-display: 'Syne', ui-sans-serif, sans-serif; | |
| --ut-font-body: 'DM Sans', ui-sans-serif, system-ui, sans-serif; | |
| --ut-font-mono: 'DM Mono', ui-monospace, monospace; | |
| --ut-radius: 18px; | |
| --ut-radius-sm: 12px; | |
| --ut-radius-xs: 8px; | |
| --ut-radius-pill: 999px; | |
| --ut-transition: 220ms cubic-bezier(0.22, 0.61, 0.36, 1); | |
| --ut-shadow: 0 28px 70px rgba(0, 0, 0, 0.42), | |
| 0 1px 0 rgba(255, 218, 159, 0.07) inset, | |
| 0 0 0 1px rgba(255, 218, 159, 0.035) inset; | |
| --ut-shadow-sm: 0 10px 28px rgba(0, 0, 0, 0.30); | |
| --ut-glow: 0 0 34px rgba(242, 179, 95, 0.20); | |
| --ut-bg-layers: radial-gradient(ellipse 72% 46% at 78% -8%, rgba(242, 179, 95, 0.14), transparent 58%), | |
| radial-gradient(ellipse 56% 40% at 8% 18%, rgba(255, 207, 134, 0.055), transparent 60%), | |
| linear-gradient(180deg, var(--ut-bg-tint) 0%, var(--ut-bg) 56%, var(--ut-bg-deep) 100%); | |
| --ut-nav-bg: rgba(15, 14, 13, 0.76); | |
| --ut-card-sheen: linear-gradient(180deg, rgba(255, 218, 159, 0.035), transparent 48%); | |
| --ut-bleed: linear-gradient(180deg, rgba(242, 179, 95, 0.09), rgba(242, 179, 95, 0) 48%), | |
| repeating-linear-gradient(180deg, rgba(242, 179, 95, 0.045) 0 1px, transparent 1px 30px); | |
| --ut-grid: linear-gradient(90deg, rgba(242, 179, 95, 0.035) 1px, transparent 1px), | |
| linear-gradient(180deg, rgba(242, 179, 95, 0.025) 1px, transparent 1px); | |
| --ut-grid-size: 72px 72px; | |
| --ut-focus-glow: 0 0 20px rgba(242, 179, 95, 0.12); | |
| --ut-btn-grad: linear-gradient(135deg, #c17f3a 0%, #f2b35f 100%); | |
| --ut-btn-grad-hover:linear-gradient(135deg, #f2b35f 0%, #ffd493 100%); | |
| --ut-btn-shadow: 0 10px 24px rgba(0, 0, 0, 0.26), 0 0 0 1px rgba(255, 255, 255, 0.14) inset; | |
| --ut-btn-shadow-hover: 0 14px 34px rgba(0, 0, 0, 0.30), 0 0 0 1px rgba(255, 255, 255, 0.20) inset; | |
| --ut-thumb-glow: 0 0 12px rgba(128, 120, 110, 0.30); | |
| --ut-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M0 0l6 7 6-7z' fill='%23f2b35f'/%3E%3C/svg%3E"); | |
| --ut-scroll: rgba(242, 179, 95, 0.28); | |
| --ut-scroll-hover: rgba(242, 179, 95, 0.48); | |
| --ut-code-block-bg: rgba(0, 0, 0, 0.25); | |
| } | |
| /* ============================================================ | |
| * Gradio engine variables — map the framework's hooks to our tokens. | |
| * ============================================================ */ | |
| :root, | |
| :root.dark, | |
| .gradio-container, | |
| .gradio-container.dark, | |
| body.dark { | |
| --body-background-fill: var(--ut-bg); | |
| --background-fill-primary: var(--ut-panel); | |
| --background-fill-secondary: var(--ut-surface-solid); | |
| --body-text-color: var(--ut-ink); | |
| --body-text-color-subdued: var(--ut-muted); | |
| --color-accent: var(--ut-accent); | |
| --color-accent-soft: var(--ut-accent-soft); | |
| --border-color-primary: var(--ut-border); | |
| --border-color-accent: var(--ut-cool); | |
| --block-background-fill: var(--ut-surface); | |
| --block-border-color: var(--ut-border); | |
| --block-border-width: 1px; | |
| --block-radius: var(--ut-radius); | |
| --block-shadow: var(--ut-shadow); | |
| --block-title-background-fill: transparent; | |
| --block-title-border-color: transparent; | |
| --block-title-text-color: var(--ut-ink); | |
| --block-title-text-size: 1.05rem; | |
| --block-title-text-weight: 700; | |
| --block-label-background-fill: transparent; | |
| --block-label-border-color: transparent; | |
| --block-label-text-color: var(--ut-accent-bright); | |
| --block-label-text-size: 0.72rem; | |
| --block-label-text-weight: 500; | |
| --input-background-fill: var(--ut-surface-solid); | |
| --input-background-fill-focus: var(--ut-surface-solid); | |
| --input-border-color: var(--ut-border); | |
| --input-border-color-focus: var(--ut-cool); | |
| --input-text-size: 0.9rem; | |
| --input-radius: var(--ut-radius-sm); | |
| --button-primary-background-fill: var(--ut-accent); | |
| --button-primary-background-fill-hover: var(--ut-accent-bright); | |
| --button-primary-text-color: var(--ut-on-accent); | |
| --button-primary-text-color-hover: var(--ut-on-accent); | |
| --button-primary-border-color: var(--ut-accent); | |
| --button-secondary-background-fill: var(--ut-surface-solid); | |
| --button-secondary-background-fill-hover: var(--ut-surface-hover); | |
| --button-secondary-text-color: var(--ut-ink); | |
| --button-secondary-text-color-hover: var(--ut-ink-strong); | |
| --button-secondary-border-color: var(--ut-border-strong); | |
| --button-large-text-size: 0.92rem; | |
| --button-large-text-weight: 600; | |
| --button-large-radius: var(--ut-radius-sm); | |
| --slider-color: var(--ut-cool); | |
| --font: var(--ut-font-body); | |
| --font-mono: var(--ut-font-mono); | |
| --radius-xxs: 2px; | |
| --radius-xs: 4px; | |
| --radius-sm: var(--ut-radius-xs); | |
| --radius-md: var(--ut-radius-sm); | |
| --radius-lg: var(--ut-radius); | |
| } | |
| /* ============================================================ | |
| * Part 2 — Root containers · LAYERED BACKGROUND + decorations | |
| * ============================================================ */ | |
| 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(--ut-bg-layers) ; | |
| background-attachment: fixed ; | |
| color: var(--ut-ink) ; | |
| font-family: var(--ut-font-body) ; | |
| line-height: 1.6 ; | |
| } | |
| /* Decorative light-bleed + faint engineering grid on the app shell */ | |
| html body .gradio-container::before, | |
| html body .stApp::before { | |
| content: "" ; | |
| position: fixed ; | |
| inset: 0 0 auto 0 ; | |
| height: 230px ; | |
| pointer-events: none ; | |
| z-index: 0 ; | |
| background: var(--ut-bleed) ; | |
| -webkit-mask-image: linear-gradient(180deg, black, transparent 88%) ; | |
| mask-image: linear-gradient(180deg, black, transparent 88%) ; | |
| opacity: 0.72 ; | |
| } | |
| html body .gradio-container::after, | |
| html body .stApp::after { | |
| content: "" ; | |
| position: fixed ; | |
| inset: 0 ; | |
| pointer-events: none ; | |
| z-index: 0 ; | |
| background-image: var(--ut-grid) ; | |
| background-size: var(--ut-grid-size) ; | |
| -webkit-mask-image: linear-gradient(180deg, transparent 0%, black 18%, black 82%, transparent 100%) ; | |
| mask-image: linear-gradient(180deg, transparent 0%, black 18%, black 82%, transparent 100%) ; | |
| opacity: 0.42 ; | |
| } | |
| html body .main .block-container, | |
| html body .stApp [data-testid="stVerticalBlock"] { | |
| background: transparent ; | |
| position: relative ; | |
| z-index: 1 ; | |
| } | |
| /* ============================================================ | |
| * Part 3 — Typography | |
| * ============================================================ */ | |
| 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: var(--ut-font-display) ; | |
| font-weight: 700 ; | |
| letter-spacing: -0.02em ; | |
| color: var(--ut-ink) ; | |
| -webkit-text-fill-color: var(--ut-ink) ; | |
| background-image: none ; | |
| background-clip: unset ; | |
| -webkit-background-clip: unset ; | |
| line-height: 1.12 ; | |
| } | |
| html body h1, html body .gradio-container h1, html body .stApp h1 { | |
| font-size: 2.6rem ; | |
| line-height: 1.05 ; | |
| margin-bottom: 0.3em ; | |
| letter-spacing: -0.03em ; | |
| color: var(--ut-title-ink) ; | |
| -webkit-text-fill-color: var(--ut-title-ink) ; | |
| text-shadow: var(--ut-title-glow) ; | |
| } | |
| html body h2, html body .gradio-container h2, html body .stApp h2 { | |
| font-size: 1.5rem ; | |
| color: var(--ut-accent) ; | |
| -webkit-text-fill-color: var(--ut-accent) ; | |
| } | |
| html body h3, html body .gradio-container h3, html body .stApp h3, | |
| html body h4, html body .gradio-container h4, html body .stApp h4, | |
| html body h3 *, html body .gradio-container h3 *, html body .stApp h3 *, | |
| html body h4 *, html body .gradio-container h4 *, html body .stApp h4 *, | |
| html body [data-testid="stMarkdownContainer"] h3, | |
| html body [data-testid="stMarkdownContainer"] h3 *, | |
| html body .gr-markdown h3, html body .gr-markdown h3 *, | |
| html body .markdown h3, html body .markdown h3 * { | |
| font-size: 1.1rem ; | |
| letter-spacing: -0.01em ; | |
| font-weight: 500 ; | |
| color: var(--ut-accent-deep) ; | |
| -webkit-text-fill-color: var(--ut-accent-deep) ; | |
| } | |
| html body em, | |
| html body .gradio-container em, | |
| html body .stApp em { | |
| font-style: italic ; | |
| color: var(--ut-ink) ; | |
| } | |
| html body blockquote, | |
| html body .gradio-container blockquote, | |
| html body .stApp blockquote { | |
| border-left: 2px solid var(--ut-accent-rim) ; | |
| padding-left: 16px ; | |
| color: var(--ut-muted) ; | |
| font-style: italic ; | |
| } | |
| /* ============================================================ | |
| * Part 4 — Labels · LETTERSPACED UPPERCASE | |
| * ============================================================ */ | |
| 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: var(--ut-font-mono) ; | |
| font-size: 0.78rem ; | |
| color: var(--ut-accent-bright) ; | |
| letter-spacing: 0.13em ; | |
| text-transform: uppercase ; | |
| font-weight: 600 ; | |
| background: transparent ; | |
| } | |
| /* Section eyebrows / kickers — even more letterspaced */ | |
| html body .gradio-container .ut-eyebrow, | |
| html body .stApp .ut-eyebrow { | |
| font-family: var(--ut-font-mono) ; | |
| font-size: 0.68rem ; | |
| color: var(--ut-muted) ; | |
| letter-spacing: 0.2em ; | |
| text-transform: uppercase ; | |
| } | |
| /* ============================================================ | |
| * Part 5 — Cards / blocks · TRANSLUCENT GLASS + SOFT GLOW | |
| * ============================================================ */ | |
| 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 .form, | |
| html body .gradio-container .gr-box, | |
| html body .stApp [data-testid="stForm"], | |
| html body .stApp [data-testid="stExpander"] { | |
| background: var(--ut-card-sheen), var(--ut-surface) ; | |
| -webkit-backdrop-filter: blur(18px) saturate(140%) ; | |
| backdrop-filter: blur(18px) saturate(140%) ; | |
| border: 1px solid var(--ut-border) ; | |
| border-radius: var(--ut-radius) ; | |
| box-shadow: var(--ut-shadow) ; | |
| padding: 22px ; | |
| position: relative ; | |
| z-index: 1 ; | |
| transition: border-color var(--ut-transition), box-shadow var(--ut-transition) ; | |
| } | |
| /* Top hairline accent on cards (matches the Path B wrapper) */ | |
| html body .gradio-container .block::before, | |
| html body .gradio-container .form::before, | |
| html body .stApp [data-testid="stForm"]::before { | |
| content: "" ; | |
| position: absolute ; | |
| top: 0 ; left: 0 ; right: 0 ; | |
| height: 1px ; | |
| background: var(--ut-card-hairline) ; | |
| opacity: 0.66 ; | |
| pointer-events: none ; | |
| z-index: 2 ; | |
| } | |
| html body .gradio-container .block:hover, | |
| html body .gradio-container .form:hover, | |
| html body .stApp [data-testid="stForm"]:hover { | |
| border-color: var(--ut-border-strong) ; | |
| } | |
| /* Layout wrappers + text blocks must NOT look like cards (kills the | |
| russian-doll nesting: the page wrapper and markdown headings render flat) */ | |
| html body .gradio-container .wrap, | |
| html body .gradio-container main.contain, | |
| html body .gradio-container .block:has([data-testid="markdown-wrapper"]) { | |
| background: transparent ; | |
| border: none ; | |
| box-shadow: none ; | |
| -webkit-backdrop-filter: none ; | |
| backdrop-filter: none ; | |
| padding: 0 ; | |
| } | |
| html body .gradio-container .wrap::before, | |
| html body .gradio-container main.contain::before, | |
| html body .gradio-container .block:has([data-testid="markdown-wrapper"])::before { | |
| display: none ; | |
| } | |
| /* Inputs sitting directly inside a form-card shouldn't double-card */ | |
| html body .gradio-container .form .block { | |
| background: transparent ; | |
| border: none ; | |
| box-shadow: none ; | |
| padding: 0 ; | |
| } | |
| html body .gradio-container .form .block::before { display: none ; } | |
| /* Nested inner blocks — slightly less prominent */ | |
| html body .gradio-container .block .block:not(.form .block), | |
| html body .gradio-container .block .gr-form { | |
| background: var(--ut-surface-nested) ; | |
| box-shadow: none ; | |
| padding: 16px ; | |
| } | |
| /* ============================================================ | |
| * Part 6 — Inputs · refined borders, generous radii, cool focus glow | |
| * ============================================================ */ | |
| 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(--ut-surface-solid) ; | |
| border: 1px solid var(--ut-border-strong) ; | |
| border-radius: var(--ut-radius-sm) ; | |
| color: var(--ut-ink) ; | |
| font-family: var(--ut-font-mono) ; | |
| font-size: 0.9rem ; | |
| caret-color: var(--ut-warm) ; | |
| padding: 13px 16px ; | |
| transition: border-color var(--ut-transition), box-shadow var(--ut-transition) ; | |
| } | |
| html body .gradio-container textarea, | |
| html body .stApp textarea { | |
| min-height: 130px ; | |
| line-height: 1.6 ; | |
| } | |
| 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(--ut-cool) ; | |
| outline: none ; | |
| box-shadow: 0 0 0 3px var(--ut-accent-soft), var(--ut-focus-glow) ; | |
| } | |
| html body .gradio-container ::placeholder, | |
| html body .stApp ::placeholder { | |
| color: var(--ut-dim) ; | |
| } | |
| /* Custom select — inline SVG accent arrow */ | |
| html body .gradio-container select, | |
| html body .gradio-container .gr-dropdown select { | |
| appearance: none ; | |
| -webkit-appearance: none ; | |
| background-image: var(--ut-arrow) ; | |
| background-repeat: no-repeat ; | |
| background-position: right 14px center ; | |
| padding-right: 38px ; | |
| } | |
| /* Numeric outputs — tabular nums */ | |
| html body .gradio-container .gr-number input, | |
| html body .gradio-container [class*="number"] input, | |
| html body .gradio-container .output-number, | |
| html body .gradio-container .metric, | |
| html body .stApp [data-testid="stMetricValue"], | |
| html body .stApp [data-testid="stNumberInput"] input { | |
| font-variant-numeric: tabular-nums ; | |
| font-feature-settings: 'tnum' ; | |
| } | |
| /* ============================================================ | |
| * Part 7 — Buttons · gradient fill + glow hover | |
| * ============================================================ */ | |
| 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(--ut-btn-grad) ; | |
| color: var(--ut-on-accent) ; | |
| font-family: var(--ut-font-display) ; | |
| font-weight: 600 ; | |
| font-size: 0.92rem ; | |
| letter-spacing: 0.02em ; | |
| border: none ; | |
| border-radius: var(--ut-radius-sm) ; | |
| padding: 13px 28px ; | |
| cursor: pointer ; | |
| box-shadow: var(--ut-btn-shadow) ; | |
| transition: transform 100ms ease, | |
| box-shadow var(--ut-transition), | |
| background var(--ut-transition) ; | |
| } | |
| html body .gradio-container button:hover, | |
| html body .gradio-container .gr-button:hover, | |
| html body .stApp .stButton > button:hover { | |
| background: var(--ut-btn-grad-hover) ; | |
| color: var(--ut-on-accent) ; | |
| box-shadow: var(--ut-btn-shadow-hover), var(--ut-glow) ; | |
| } | |
| html body .gradio-container button:active, | |
| html body .stApp .stButton > button:active { | |
| transform: scale(0.985) ; | |
| background: var(--ut-accent-deep) ; | |
| } | |
| html body .gradio-container button.secondary, | |
| html body .gradio-container .secondary, | |
| html body .stApp button[kind="secondary"] { | |
| background: var(--ut-surface-solid) ; | |
| color: var(--ut-ink) ; | |
| border: 1px solid var(--ut-border-strong) ; | |
| box-shadow: var(--ut-shadow-sm) ; | |
| } | |
| html body .gradio-container button.secondary:hover, | |
| html body .stApp button[kind="secondary"]:hover { | |
| background: var(--ut-surface-hover) ; | |
| border-color: var(--ut-accent-rim) ; | |
| color: var(--ut-ink-strong) ; | |
| } | |
| /* ============================================================ | |
| * Part 8 — Sliders, checkboxes, radios · cool accent | |
| * ============================================================ */ | |
| html body input[type="range"] { | |
| accent-color: var(--ut-cool) ; | |
| height: 4px ; | |
| } | |
| html body input[type="range"]::-webkit-slider-thumb { | |
| background: var(--ut-cool) ; | |
| border: 2px solid var(--ut-bg) ; | |
| box-shadow: 0 0 0 1px var(--ut-cool-rim), var(--ut-thumb-glow) ; | |
| width: 16px ; | |
| height: 16px ; | |
| } | |
| html body input[type="range"]::-moz-range-thumb { | |
| background: var(--ut-cool) ; | |
| border: 2px solid var(--ut-bg) ; | |
| width: 16px ; | |
| height: 16px ; | |
| } | |
| html body input[type="checkbox"], | |
| html body input[type="radio"] { | |
| accent-color: var(--ut-accent) ; | |
| width: 15px ; | |
| height: 15px ; | |
| } | |
| /* ============================================================ | |
| * Part 9 — 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(--ut-accent-dim) ; | |
| border: 1px dashed var(--ut-accent-rim) ; | |
| border-radius: var(--ut-radius-sm) ; | |
| color: var(--ut-ink) ; | |
| transition: background var(--ut-transition), | |
| border-color var(--ut-transition) ; | |
| } | |
| html body .gradio-container .gr-file-upload:hover, | |
| html body .stApp [data-testid="stFileUploader"]:hover { | |
| background: var(--ut-accent-soft) ; | |
| border-color: var(--ut-accent) ; | |
| } | |
| html body input[type="file"]::file-selector-button { | |
| background: var(--ut-accent-soft) ; | |
| color: var(--ut-accent) ; | |
| border: 1px solid var(--ut-accent-rim) ; | |
| border-radius: var(--ut-radius-xs) ; | |
| padding: 7px 14px ; | |
| margin-right: 14px ; | |
| font-family: var(--ut-font-mono) ; | |
| font-size: 0.78rem ; | |
| letter-spacing: 0.06em ; | |
| cursor: pointer ; | |
| } | |
| /* ============================================================ | |
| * Part 10 — 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(--ut-ink) ; | |
| font-family: var(--ut-font-body) ; | |
| line-height: 1.65 ; | |
| } | |
| html body .gradio-container a, | |
| html body .stApp a { | |
| color: var(--ut-accent) ; | |
| text-decoration: none ; | |
| border-bottom: 1px solid var(--ut-accent-rim) ; | |
| transition: border-color var(--ut-transition), color var(--ut-transition) ; | |
| } | |
| html body .gradio-container a:hover, | |
| html body .stApp a:hover { | |
| color: var(--ut-accent-bright) ; | |
| border-bottom-color: var(--ut-accent) ; | |
| } | |
| html body code, | |
| html body .gradio-container code, | |
| html body .stApp code { | |
| background: var(--ut-accent-dim) ; | |
| color: var(--ut-accent) ; | |
| font-family: var(--ut-font-mono) ; | |
| font-size: 0.86em ; | |
| padding: 2px 7px ; | |
| border-radius: var(--ut-radius-xs) ; | |
| border: 1px solid var(--ut-accent-rim) ; | |
| } | |
| html body pre code, | |
| html body .gradio-container pre code { | |
| border: 1px solid var(--ut-border) ; | |
| background: var(--ut-code-block-bg) ; | |
| display: block ; | |
| padding: 14px 16px ; | |
| border-radius: var(--ut-radius-sm) ; | |
| line-height: 1.55 ; | |
| } | |
| /* ============================================================ | |
| * Part 11 — Callout / interpretation card | |
| * Use class .ut-callout on a div for editorial-voice prose blocks. | |
| * ============================================================ */ | |
| html body .ut-callout, | |
| html body .gradio-container .ut-callout, | |
| html body .stApp .ut-callout, | |
| html body .gradio-container [class*="info"]:not(button):not(input), | |
| html body .stApp .stAlert { | |
| background: var(--ut-accent-soft) ; | |
| border: 1px solid var(--ut-accent-rim) ; | |
| border-radius: var(--ut-radius-sm) ; | |
| padding: 14px 18px ; | |
| font-size: 0.9rem ; | |
| color: var(--ut-muted) ; | |
| line-height: 1.6 ; | |
| } | |
| html body .ut-callout strong, | |
| html body .gradio-container .ut-callout strong, | |
| html body .stApp .ut-callout strong { | |
| color: var(--ut-ink) ; | |
| font-weight: 600 ; | |
| } | |
| /* ============================================================ | |
| * Part 12 — Scrollbars + Streamlit chrome | |
| * ============================================================ */ | |
| html body ::-webkit-scrollbar { width: 10px; height: 10px; } | |
| html body ::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| html body ::-webkit-scrollbar-thumb { | |
| background: var(--ut-scroll); | |
| border-radius: var(--ut-radius-pill); | |
| border: 2px solid transparent; | |
| background-clip: padding-box; | |
| } | |
| html body ::-webkit-scrollbar-thumb:hover { | |
| background: var(--ut-scroll-hover); | |
| background-clip: padding-box; | |
| border: 2px solid transparent; | |
| } | |
| html body .stApp header[data-testid="stHeader"] { | |
| background: var(--ut-nav-bg) ; | |
| -webkit-backdrop-filter: blur(14px) ; | |
| backdrop-filter: blur(14px) ; | |
| border-bottom: 1px solid var(--ut-border) ; | |
| } | |
| html body .stApp [data-testid="stSidebar"] { | |
| background: var(--ut-panel) ; | |
| border-right: 1px solid var(--ut-border) ; | |
| } | |
| /* ============================================================ | |
| * Part 13 — Misc polish | |
| * ============================================================ */ | |
| html body hr, | |
| html body .gradio-container hr, | |
| html body .stApp hr { | |
| border: none ; | |
| border-top: 1px solid var(--ut-border) ; | |
| margin: 24px 0 ; | |
| } | |
| html body ::selection { | |
| background: var(--ut-accent-soft); | |
| color: var(--ut-selection-ink); | |
| } | |
| /* Animate things appearing — subtle, not distracting */ | |
| @media (prefers-reduced-motion: no-preference) { | |
| html body .gradio-container .block, | |
| html body .stApp [data-testid="stForm"] { | |
| animation: ut-fade-in 320ms cubic-bezier(0.22, 0.61, 0.36, 1); | |
| } | |
| @keyframes ut-fade-in { | |
| from { opacity: 0; transform: translateY(4px); } | |
| to { opacity: 1; transform: translateY(0); } | |
| } | |
| } | |