Spaces:
Sleeping
Sleeping
Download ui_design.py from automl-team/AutoML: direct link, hf CLI and curl.
- Browser
- Download file 151 kB
-
https://huggingface.co/spaces/automl-team/AutoML/resolve/main/ui_design.py
- Command line
-
hf download hf://spaces/automl-team/AutoML/ui_design.py
-
curl -L -o ui_design.py https://huggingface.co/spaces/automl-team/AutoML/resolve/main/ui_design.py
151 kB
| """Shared visual language and layout content for the AutoML interfaces.""" | |
| from __future__ import annotations | |
| import re | |
| import gradio as gr | |
| AUTOMATIC_SELECTION = "Automatic selection" | |
| QUALITY_PRESET_CHOICES = [ | |
| ("Balanced", "medium_quality"), | |
| ("Thorough", "high_quality"), | |
| ("Maximum quality", "best_quality"), | |
| ("Interpretable", "interpretable"), | |
| ] | |
| APP_HEADER_HTML = """ | |
| <header class="app-header studio-header-contract" aria-labelledby="app-title"> | |
| <div class="app-identity"> | |
| <div class="app-mark" aria-hidden="true">AM</div> | |
| <div> | |
| <p class="app-eyebrow">Research analytics workspace</p> | |
| <h1 id="app-title">AutoML Studio</h1> | |
| </div> | |
| </div> | |
| <p class="app-subtitle"> | |
| Build, evaluate, and reuse machine-learning models through a guided, | |
| reproducible workflow. | |
| </p> | |
| </header> | |
| """ | |
| STUDIO_APP_HEADER_HTML = """ | |
| <header class="app-header studio-product-header" aria-labelledby="studio-app-title"> | |
| <div class="studio-product-identity"> | |
| <div class="studio-product-mark" aria-hidden="true">AM</div> | |
| <div> | |
| <h1 id="studio-app-title">AutoML Studio</h1> | |
| <p>Guided Research Workspace</p> | |
| </div> | |
| </div> | |
| <div class="studio-product-profile" aria-label="Workspace status"> | |
| <span>Private workspace</span> | |
| <span class="studio-profile-badge" aria-hidden="true">AM</span> | |
| </div> | |
| </header> | |
| """ | |
| RESEARCH_NOTICE_HTML = """ | |
| <aside class="research-notice" aria-label="Intended use"> | |
| <p class="notice-title">Research use</p> | |
| <p> | |
| Review data governance, validation results, and institutional requirements | |
| before using an exported model. This workspace does not provide clinical | |
| diagnoses or treatment recommendations. | |
| </p> | |
| </aside> | |
| """ | |
| EXISTING_DATA_GUIDE_HTML = """ | |
| <section class="context-panel" aria-labelledby="existing-guide-title"> | |
| <p class="section-kicker">Workflow</p> | |
| <h2 id="existing-guide-title">Train with a managed dataset</h2> | |
| <ol class="workflow-list"> | |
| <li><span>1</span><div><strong>Select data</strong><small>Choose a dataset and outcome.</small></div></li> | |
| <li><span>2</span><div><strong>Set evaluation</strong><small>Define the holdout and compute budget.</small></div></li> | |
| <li><span>3</span><div><strong>Review and run</strong><small>Confirm advanced options, then train.</small></div></li> | |
| </ol> | |
| <p class="context-note"> | |
| Automatic selection is recommended unless your protocol requires a | |
| specific pipeline component. | |
| </p> | |
| </section> | |
| """ | |
| UPLOAD_DATA_GUIDE_HTML = """ | |
| <section class="context-panel" aria-labelledby="upload-guide-title"> | |
| <p class="section-kicker">Before you begin</p> | |
| <h2 id="upload-guide-title">Prepare your dataset</h2> | |
| <ul class="check-list"> | |
| <li>Use a CSV for tabular data or a ZIP/manifest for images.</li> | |
| <li>Remove direct identifiers and protected health information.</li> | |
| <li>Confirm the outcome column and evaluation split.</li> | |
| <li>Keep an independent external test set when possible.</li> | |
| </ul> | |
| </section> | |
| """ | |
| INFERENCE_GUIDE_HTML = """ | |
| <section class="context-panel" aria-labelledby="inference-guide-title"> | |
| <p class="section-kicker">Model reuse</p> | |
| <h2 id="inference-guide-title">Run a single prediction</h2> | |
| <p> | |
| Select a model saved to your account or upload an exported package. The | |
| required input format appears after the model is inspected. | |
| </p> | |
| <p class="context-note"> | |
| Predictions are analytical outputs and require domain-appropriate | |
| validation and human review. | |
| </p> | |
| </section> | |
| """ | |
| APP_CSS = r""" | |
| :root { | |
| /* Brand ---------------------------------------------------------------- */ | |
| --ui-navy-900: #102f44; | |
| --ui-navy-800: #163f59; | |
| --ui-blue-700: #075b82; | |
| --ui-blue-600: #0877a5; | |
| --ui-teal-700: #0b6b68; | |
| --ui-teal-100: #dff3f1; | |
| --ui-violet-700: #5f4b8b; | |
| /* Text ----------------------------------------------------------------- */ | |
| --ui-ink: #172b3a; | |
| --ui-ink-label: #294858; | |
| --ui-muted: #536b7a; | |
| /* Surfaces ------------------------------------------------------------- */ | |
| --ui-surface: #ffffff; | |
| --ui-surface-subtle: #f5f8fa; | |
| --ui-canvas: #f2f6f7; | |
| --ui-canvas-deep: #e8eff2; | |
| --ui-accent-bg: #e9f2f6; | |
| --ui-teal-bg: #e6f3f1; | |
| /* Scientific Light workbench ------------------------------------------ */ | |
| --ui-research-ink: #17251f; | |
| --ui-research-muted: #58675f; | |
| --ui-research-green-900: #1b3027; | |
| --ui-research-green-700: #255e48; | |
| --ui-research-green-100: #e6eee9; | |
| --ui-research-paper: #fffefb; | |
| --ui-research-canvas: #eeece6; | |
| --ui-research-floating: rgba(255, 254, 251, 0.97); | |
| --ui-research-shadow: 0 6px 18px rgba(27, 48, 39, 0.08); | |
| /* Modern Scientific Studio -------------------------------------------- */ | |
| --ui-studio-ink: #223047; | |
| --ui-studio-muted: #5f6f86; | |
| --ui-studio-subtle: #5f6f86; | |
| --ui-studio-bg: #f4f6fa; | |
| --ui-studio-surface: #ffffff; | |
| --ui-studio-soft: #eef2f7; | |
| --ui-studio-border: #dbe1eb; | |
| --ui-studio-border-strong: #c3cddb; | |
| --ui-studio-cobalt: #466ba6; | |
| --ui-studio-cobalt-hover: #385b92; | |
| --ui-studio-cobalt-soft: #e9eff9; | |
| --ui-studio-success: #326852; | |
| --ui-studio-success-soft: #e8f2ee; | |
| --ui-studio-warning: #806022; | |
| --ui-studio-warning-soft: #f7efd9; | |
| --ui-studio-danger: #954747; | |
| --ui-studio-danger-soft: #f8eaea; | |
| --ui-studio-shadow: 0 12px 30px rgba(49, 68, 98, 0.08); | |
| /* Lines ---------------------------------------------------------------- */ | |
| --ui-border-subtle: #dde6ea; | |
| --ui-border: #b3c4cd; | |
| --ui-border-strong: #7b8f9b; | |
| /* Status --------------------------------------------------------------- */ | |
| --ui-success: #176b45; | |
| --ui-success-bg: #e8f4ed; | |
| --ui-success-border: #8bbfa2; | |
| --ui-warning: #7a5500; | |
| --ui-warning-bg: #fff5d6; | |
| --ui-warning-border: #c7a967; | |
| --ui-error: #a1282f; | |
| --ui-error-bg: #fae9e8; | |
| --ui-error-border: #cf9296; | |
| --ui-danger-700: #a1282f; | |
| /* On dark -------------------------------------------------------------- */ | |
| --ui-on-dark: #ffffff; | |
| --ui-on-dark-muted: #dcebf0; | |
| --ui-on-dark-subtle: #b9dfe8; | |
| /* States --------------------------------------------------------------- */ | |
| --ui-disabled-dark: #536b7a; | |
| --ui-disabled-surface: #edf2f4; | |
| --ui-focus: #c07a00; | |
| /* Type ----------------------------------------------------------------- */ | |
| --ui-font: "IBM Plex Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; | |
| --ui-font-mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, "Cascadia Mono", Consolas, monospace; | |
| --ui-shadow: 0 1px 2px rgba(16, 47, 68, 0.06), 0 8px 24px rgba(16, 47, 68, 0.06); | |
| } | |
| html, body, .gradio-container, | |
| button, input, textarea, select { | |
| font-family: var(--ui-font) !important; | |
| } | |
| code, kbd, pre, samp, .run-alias { | |
| font-family: var(--ui-font-mono) !important; | |
| } | |
| html, body { | |
| background: var(--ui-canvas) !important; | |
| color: var(--ui-ink); | |
| } | |
| .gradio-container { | |
| max-width: 1480px !important; | |
| margin: 0 auto !important; | |
| padding: 0 24px 48px !important; | |
| background: var(--ui-canvas) !important; | |
| color: var(--ui-ink) !important; | |
| color-scheme: light !important; | |
| } | |
| .contain { | |
| gap: 20px !important; | |
| } | |
| .app-header { | |
| margin: 0 -24px 24px; | |
| padding: 24px 32px 24px; | |
| background: var(--ui-navy-900); | |
| border-bottom: 5px solid var(--ui-teal-700); | |
| color: var(--ui-on-dark); | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 32px; | |
| } | |
| .app-identity { | |
| display: flex; | |
| align-items: center; | |
| gap: 16px; | |
| } | |
| .app-mark { | |
| width: 46px; | |
| height: 46px; | |
| border: 1px solid rgba(255,255,255,.55); | |
| display: grid; | |
| place-items: center; | |
| font-size: 14px; | |
| font-weight: 700; | |
| letter-spacing: .08em; | |
| } | |
| .app-eyebrow, | |
| .section-kicker, | |
| .notice-title { | |
| margin: 0 0 4px !important; | |
| font-size: 12px !important; | |
| line-height: 1.35 !important; | |
| font-weight: 700 !important; | |
| letter-spacing: .09em; | |
| text-transform: uppercase; | |
| } | |
| .app-eyebrow { | |
| color: var(--ui-on-dark-subtle); | |
| } | |
| .app-header h1 { | |
| color: var(--ui-on-dark) !important; | |
| font-size: 28px !important; | |
| line-height: 1.15 !important; | |
| letter-spacing: -.02em; | |
| margin: 0 !important; | |
| } | |
| .app-subtitle { | |
| max-width: 570px; | |
| margin: 0 !important; | |
| color: var(--ui-on-dark-muted); | |
| font-size: 16px; | |
| line-height: 1.5; | |
| } | |
| .app-header .app-subtitle { | |
| color: var(--ui-on-dark-muted) !important; | |
| } | |
| .app-header .app-eyebrow { | |
| color: var(--ui-on-dark-subtle) !important; | |
| } | |
| .app-header .app-mark { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| .research-notice { | |
| background: var(--ui-accent-bg); | |
| border-left: 4px solid var(--ui-blue-700); | |
| padding: 12px 16px; | |
| color: var(--ui-ink-label); | |
| } | |
| .research-notice p { | |
| margin: 0 !important; | |
| font-size: 13px; | |
| line-height: 1.5; | |
| color: var(--ui-ink-label) !important; | |
| } | |
| .research-notice .notice-title { | |
| color: var(--ui-blue-700); | |
| margin-bottom: 4px !important; | |
| } | |
| .account-card, | |
| .panel-card, | |
| .results-shell, | |
| .context-panel, | |
| .inference-output { | |
| background: var(--ui-surface) !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 8px !important; | |
| box-shadow: var(--ui-shadow); | |
| } | |
| .account-card:not(.account-card .account-card) { | |
| max-width: 720px; | |
| margin: 28px auto 12px; | |
| padding: 8px 20px 20px !important; | |
| } | |
| .account-card .account-card { | |
| max-width: none; | |
| margin: 0; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| box-shadow: none; | |
| } | |
| .account-card:has(.tabs.hide) { | |
| display: none !important; | |
| width: 0 !important; | |
| height: 0 !important; | |
| min-height: 0 !important; | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| box-shadow: none !important; | |
| } | |
| .account-card h2 { | |
| margin-top: 8px !important; | |
| border-bottom: 0 !important; | |
| } | |
| .account-card .tab-nav, | |
| .account-card .tab-container { | |
| background: var(--ui-canvas-deep) !important; | |
| border: 1px solid var(--ui-border) !important; | |
| } | |
| .account-card .tab-nav button, | |
| .account-card .tab-container button { | |
| color: var(--ui-ink-label) !important; | |
| } | |
| .account-card .tab-nav button.selected, | |
| .account-card .tab-container button.selected { | |
| color: var(--ui-navy-900) !important; | |
| background: var(--ui-surface) !important; | |
| border-bottom: 3px solid var(--ui-teal-700) !important; | |
| } | |
| .account-strip { | |
| align-items: center; | |
| min-height: 48px; | |
| padding: 8px 16px !important; | |
| background: var(--ui-surface) !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 8px !important; | |
| } | |
| .panel-card { | |
| padding: 20px !important; | |
| } | |
| .panel-card .panel-card { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| box-shadow: none; | |
| } | |
| .context-panel { | |
| padding: 24px !important; | |
| align-self: flex-start; | |
| } | |
| .context-panel h2 { | |
| color: var(--ui-navy-900) !important; | |
| font-size: 20px !important; | |
| margin: 0 0 16px !important; | |
| } | |
| .section-kicker { | |
| color: var(--ui-teal-700); | |
| } | |
| .workflow-list, | |
| .check-list { | |
| margin: 8px 0 20px !important; | |
| padding: 0 !important; | |
| list-style: none !important; | |
| } | |
| .workflow-list li { | |
| display: flex; | |
| gap: 12px; | |
| margin: 0; | |
| padding: 12px 0; | |
| border-bottom: 1px solid var(--ui-border-subtle); | |
| } | |
| .workflow-list li > span { | |
| flex: 0 0 26px; | |
| width: 26px; | |
| height: 26px; | |
| display: grid; | |
| place-items: center; | |
| border-radius: 50%; | |
| background: var(--ui-teal-100); | |
| color: var(--ui-teal-700); | |
| font-size: 12px; | |
| font-weight: 700; | |
| } | |
| .workflow-list strong, | |
| .workflow-list small { | |
| display: block; | |
| } | |
| .workflow-list strong { | |
| font-size: 14px; | |
| color: var(--ui-ink); | |
| } | |
| .workflow-list small { | |
| color: var(--ui-muted); | |
| font-size: 12px; | |
| margin-top: 2px; | |
| } | |
| body .gradio-container .context-panel .workflow-list small, | |
| body.dark .gradio-container .context-panel .workflow-list small { | |
| color: var(--ui-muted) !important; | |
| } | |
| .check-list li { | |
| position: relative; | |
| padding: 8px 0 8px 24px; | |
| font-size: 13px; | |
| line-height: 1.45; | |
| } | |
| .check-list li::before { | |
| content: ""; | |
| position: absolute; | |
| left: 1px; | |
| top: 13px; | |
| width: 8px; | |
| height: 4px; | |
| border-left: 2px solid var(--ui-teal-700); | |
| border-bottom: 2px solid var(--ui-teal-700); | |
| transform: rotate(-45deg); | |
| } | |
| .context-note { | |
| margin: 0 !important; | |
| padding: 12px 12px; | |
| background: var(--ui-canvas); | |
| border: 1px solid var(--ui-border-subtle); | |
| color: var(--ui-muted); | |
| font-size: 12px; | |
| line-height: 1.5; | |
| } | |
| #workspace-tabs { | |
| margin-top: 2px; | |
| } | |
| #workspace-tabs .tab-nav, | |
| #workspace-tabs .tab-container { | |
| gap: 4px; | |
| padding: 4px 4px 0; | |
| background: var(--ui-canvas-deep); | |
| border: 1px solid var(--ui-border); | |
| border-bottom: 0; | |
| border-radius: 8px 8px 0 0; | |
| } | |
| #workspace-tabs .tab-nav button, | |
| #workspace-tabs .tab-container button { | |
| color: var(--ui-muted); | |
| font-weight: 600; | |
| min-height: 46px; | |
| padding: 8px 16px; | |
| border-radius: 4px 4px 0 0; | |
| } | |
| #workspace-tabs .tab-nav button.selected, | |
| #workspace-tabs .tab-container button.selected { | |
| color: var(--ui-navy-900); | |
| background: var(--ui-surface); | |
| border-bottom: 3px solid var(--ui-teal-700); | |
| } | |
| #workspace-tabs > .tabitem { | |
| padding-top: 20px; | |
| } | |
| .configuration-heading h2, | |
| .results-heading h2 { | |
| color: var(--ui-navy-900) !important; | |
| margin: 0 !important; | |
| } | |
| .configuration-heading p, | |
| .results-heading p { | |
| margin: 4px 0 0 !important; | |
| color: var(--ui-muted); | |
| font-size: 13px; | |
| } | |
| .advanced-options { | |
| margin-top: 8px; | |
| border-color: var(--ui-border) !important; | |
| background: var(--ui-surface-subtle) !important; | |
| } | |
| .advanced-options > .label-wrap { | |
| color: var(--ui-navy-900); | |
| font-weight: 700; | |
| } | |
| label span, | |
| .block > label, | |
| .form > label { | |
| color: var(--ui-ink-label) !important; | |
| font-weight: 600 !important; | |
| } | |
| input, textarea, select, | |
| [data-testid="dropdown"] { | |
| border-color: var(--ui-border-strong) !important; | |
| } | |
| label.container.show_textbox_border, | |
| .container.show_textbox_border { | |
| background: var(--ui-surface) !important; | |
| border: 1px solid var(--ui-border-strong) !important; | |
| border-radius: 4px !important; | |
| } | |
| .gradio-container .wrap { | |
| background: var(--ui-surface) !important; | |
| border: 1px solid var(--ui-border-strong) !important; | |
| border-radius: 4px !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| .gradio-container .wrap .or { | |
| color: var(--ui-muted) !important; | |
| } | |
| .gradio-container label.float { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-ink-label) !important; | |
| } | |
| .gradio-container .label-wrap > span:not(.icon), | |
| .gradio-container label > span:not(.icon), | |
| .gradio-container .block > .container > span { | |
| color: var(--ui-ink-label) !important; | |
| } | |
| .reset-button { | |
| display: none !important; | |
| } | |
| button.primary, | |
| .primary-button { | |
| background: var(--ui-blue-700) !important; | |
| border-color: var(--ui-blue-700) !important; | |
| color: var(--ui-on-dark) !important; | |
| font-weight: 700 !important; | |
| min-height: 44px; | |
| } | |
| button.primary *, | |
| .primary-button * { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| button.primary:hover, | |
| .primary-button:hover { | |
| background: var(--ui-navy-800) !important; | |
| border-color: var(--ui-navy-800) !important; | |
| } | |
| button.secondary { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-blue-700) !important; | |
| border-color: var(--ui-blue-700) !important; | |
| } | |
| button.secondary * { | |
| color: var(--ui-blue-700) !important; | |
| } | |
| button.secondary:hover { | |
| background: var(--ui-canvas-deep) !important; | |
| color: var(--ui-navy-900) !important; | |
| border-color: var(--ui-navy-900) !important; | |
| } | |
| button.secondary:hover * { | |
| color: var(--ui-navy-900) !important; | |
| } | |
| button.stop { | |
| background: var(--ui-danger-700) !important; | |
| border-color: var(--ui-danger-700) !important; | |
| color: var(--ui-on-dark) !important; | |
| } | |
| button.stop *, | |
| button.stop:hover * { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| button.stop:hover { | |
| background: var(--ui-navy-900) !important; | |
| border-color: var(--ui-navy-900) !important; | |
| } | |
| /* A disabled primary reads as an inactive control, not as a filled slab that | |
| still looks like the main action. */ | |
| button.primary:disabled, | |
| .primary-button:disabled, | |
| button.stop:disabled { | |
| background: var(--ui-disabled-surface) !important; | |
| border-color: var(--ui-border-strong) !important; | |
| color: var(--ui-disabled-dark) !important; | |
| box-shadow: none !important; | |
| opacity: 1 !important; | |
| } | |
| button.primary:disabled *, | |
| .primary-button:disabled *, | |
| button.stop:disabled * { | |
| color: var(--ui-disabled-dark) !important; | |
| } | |
| button.secondary:disabled { | |
| background: var(--ui-disabled-surface) !important; | |
| border-color: var(--ui-border-strong) !important; | |
| color: var(--ui-disabled-dark) !important; | |
| opacity: 1 !important; | |
| } | |
| button.secondary:disabled * { | |
| color: var(--ui-disabled-dark) !important; | |
| } | |
| button:focus-visible, | |
| input:focus-visible, | |
| textarea:focus-visible, | |
| [role="tab"]:focus-visible, | |
| [role="combobox"]:focus-visible { | |
| outline: 3px solid var(--ui-focus) !important; | |
| outline-offset: 2px !important; | |
| } | |
| .run-button { | |
| margin-top: 8px; | |
| } | |
| .route-summary { | |
| border-left: 3px solid var(--ui-blue-600) !important; | |
| background: var(--ui-accent-bg) !important; | |
| padding: 12px 12px !important; | |
| color: var(--ui-ink-label); | |
| font-size: 13px; | |
| } | |
| .results-shell { | |
| margin-top: 24px; | |
| padding: 24px !important; | |
| } | |
| .results-heading { | |
| background: var(--ui-surface) !important; | |
| border-bottom: 1px solid var(--ui-border-subtle); | |
| padding-bottom: 12px; | |
| margin-bottom: 2px; | |
| } | |
| .run-status { | |
| margin: 12px 0 4px; | |
| padding: 12px 16px !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-left: 4px solid var(--ui-blue-600) !important; | |
| border-radius: 4px !important; | |
| background: var(--ui-surface-subtle) !important; | |
| color: var(--ui-navy-900); | |
| font-weight: 600; | |
| } | |
| .performance-summary { | |
| padding: 4px 0 8px; | |
| } | |
| .performance-summary h3 { | |
| color: var(--ui-navy-900) !important; | |
| margin-top: 16px !important; | |
| } | |
| .performance-summary em { | |
| color: var(--ui-ink) !important; | |
| } | |
| .metric-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(155px, 1fr)); | |
| gap: 12px; | |
| margin: 12px 0 16px; | |
| } | |
| .metric-card { | |
| min-height: 88px; | |
| padding: 12px 16px; | |
| background: var(--ui-canvas); | |
| border: 1px solid var(--ui-border-subtle); | |
| border-top: 3px solid var(--ui-teal-700); | |
| border-radius: 4px; | |
| } | |
| .metric-label { | |
| display: block; | |
| margin-bottom: 8px; | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .06em; | |
| text-transform: uppercase; | |
| } | |
| .metric-value { | |
| display: block; | |
| color: var(--ui-navy-900); | |
| font-size: 20px; | |
| line-height: 1.2; | |
| font-weight: 700; | |
| overflow-wrap: anywhere; | |
| } | |
| .metric-value.metric-model { | |
| font-size: 16px; | |
| line-height: 1.35; | |
| } | |
| .performance-summary table { | |
| width: 100%; | |
| margin: 12px 0 20px !important; | |
| border-collapse: collapse; | |
| font-size: 13px; | |
| } | |
| .performance-summary th { | |
| background: var(--ui-navy-900) !important; | |
| color: var(--ui-on-dark) !important; | |
| text-align: left; | |
| font-weight: 700; | |
| } | |
| .performance-summary th * { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| .performance-summary td, | |
| .performance-summary th { | |
| padding: 8px 12px !important; | |
| border: 1px solid var(--ui-border) !important; | |
| } | |
| .performance-summary tbody tr:nth-child(even) { | |
| background: var(--ui-surface-subtle); | |
| } | |
| .artifact-panel { | |
| padding: 16px !important; | |
| background: var(--ui-canvas) !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 8px !important; | |
| } | |
| .artifact-panel .artifact-note { | |
| color: var(--ui-muted); | |
| font-size: 12px; | |
| line-height: 1.45; | |
| margin-bottom: 8px; | |
| } | |
| .detail-accordion { | |
| margin-top: 8px; | |
| border-color: var(--ui-border) !important; | |
| } | |
| .detail-markdown { | |
| color: var(--ui-ink-label); | |
| font-size: 13px; | |
| } | |
| .detail-markdown pre { | |
| white-space: pre-wrap; | |
| overflow-wrap: anywhere; | |
| } | |
| /* Gradio can apply dark-mode prose colors inside otherwise light result cards. | |
| Pin every foreground/background pair used by generated result HTML. */ | |
| .gradio-container .performance-summary .metric-card, | |
| .performance-summary .metric-card { | |
| background: var(--ui-canvas) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| .gradio-container .performance-summary .metric-label, | |
| .performance-summary .metric-label { | |
| color: var(--ui-muted) !important; | |
| } | |
| .gradio-container .performance-summary .metric-value, | |
| .performance-summary .metric-value { | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .gradio-container .performance-summary table tbody td, | |
| .gradio-container .performance-summary table tbody td *, | |
| .gradio-container .detail-markdown table tbody td, | |
| .gradio-container .detail-markdown table tbody td *, | |
| .performance-summary table tbody td, | |
| .performance-summary table tbody td *, | |
| .detail-markdown table tbody td, | |
| .detail-markdown table tbody td * { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| .gradio-container .performance-summary table tbody tr:nth-child(even) td, | |
| .gradio-container .detail-markdown table tbody tr:nth-child(even) td, | |
| .performance-summary table tbody tr:nth-child(even) td, | |
| .detail-markdown table tbody tr:nth-child(even) td { | |
| background: var(--ui-surface-subtle) !important; | |
| } | |
| .gradio-container .detail-markdown, | |
| .gradio-container .detail-markdown p, | |
| .gradio-container .detail-markdown li, | |
| .detail-markdown, | |
| .detail-markdown p, | |
| .detail-markdown li { | |
| color: var(--ui-ink) !important; | |
| } | |
| .prediction-table { | |
| min-height: 250px; | |
| } | |
| .visual-prediction-image { | |
| min-width: 240px !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 10px !important; | |
| overflow: hidden; | |
| background: var(--ui-surface-subtle) !important; | |
| } | |
| .visual-prediction-image img { | |
| max-height: 520px !important; | |
| object-fit: contain !important; | |
| background: #0f172a !important; | |
| } | |
| .visual-prediction-warning { | |
| margin-bottom: 8px !important; | |
| padding: 10px 12px !important; | |
| border: 1px solid #d6b35d !important; | |
| border-radius: 8px !important; | |
| background: #fff8df !important; | |
| color: #5f4704 !important; | |
| } | |
| .prediction-table .label, | |
| .prediction-table .label *, | |
| .inference-output .label, | |
| .inference-output .label * { | |
| color: var(--ui-ink) !important; | |
| } | |
| .gradio-container .min_value, | |
| .gradio-container .max_value { | |
| color: var(--ui-muted) !important; | |
| } | |
| .artifact-panel label { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| /* Hide Gradio's own page chrome without swallowing the workbench's own | |
| <footer> elements (pipeline card status rows, run bar). */ | |
| footer:not([class*="guided-"]):not([class*="studio-"]) { | |
| display: none !important; | |
| } | |
| .gradio-container .show-api, | |
| .gradio-container .show-api *, | |
| .gradio-container .built-with, | |
| .gradio-container .built-with *, | |
| .gradio-container .settings, | |
| .gradio-container .settings *, | |
| .gradio-container .divider { | |
| color: var(--ui-muted) !important; | |
| } | |
| body.dark, | |
| body.dark .gradio-container { | |
| background: var(--ui-canvas) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| body.dark .prose, | |
| body.dark .prose p, | |
| body.dark .prose h1, | |
| body.dark .prose h2, | |
| body.dark .prose h3, | |
| body.dark .prose h4, | |
| body.dark .prose li, | |
| body.dark .prose strong, | |
| body.dark .tab-nav button, | |
| body.dark label, | |
| body.dark label span { | |
| color: var(--ui-ink) !important; | |
| } | |
| body.dark input, | |
| body.dark textarea, | |
| body.dark select, | |
| body.dark [data-testid="dropdown"], | |
| body.dark .tabitem, | |
| body.dark .tab-nav, | |
| body.dark .form, | |
| body.dark .block { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| body.dark #workspace-tabs .tab-nav button { | |
| color: var(--ui-muted) !important; | |
| } | |
| body.dark #workspace-tabs .tab-container button, | |
| body.dark #workspace-tabs .tab-nav button { | |
| color: var(--ui-muted) !important; | |
| } | |
| body.dark #workspace-tabs .tab-container button.selected, | |
| body.dark #workspace-tabs .tab-nav button.selected { | |
| color: var(--ui-navy-900) !important; | |
| background: var(--ui-surface) !important; | |
| } | |
| body.dark .detail-accordion, | |
| body.dark .detail-accordion .label-wrap, | |
| body.dark .detail-accordion .label-wrap span { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| body.dark button.primary, | |
| body.dark .primary-button { | |
| background: var(--ui-blue-700) !important; | |
| color: var(--ui-on-dark) !important; | |
| } | |
| /* | |
| * Header contrast guardrails | |
| * | |
| * Gradio wraps HTML in `.prose`, and its theme rules can outrank ordinary | |
| * component styles. Both current mastheads are light surfaces, so scope their | |
| * foregrounds to the exact header contracts. A generic `.app-header *` rule | |
| * used to paint the product title, subtitle, and profile badge white on white. | |
| */ | |
| body .gradio-container .app-header.studio-header-contract, | |
| body .gradio-container .app-header.studio-header-contract h1 { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| body .gradio-container .app-header.studio-header-contract .app-eyebrow, | |
| body .gradio-container .app-header.studio-header-contract .app-subtitle { | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| body .gradio-container .app-header.studio-header-contract .app-mark { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| body .gradio-container .studio-product-header, | |
| body .gradio-container .studio-product-identity h1 { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| body .gradio-container .studio-product-identity p, | |
| body .gradio-container .studio-product-profile > span:first-child, | |
| body .gradio-container .studio-profile-badge { | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| body .gradio-container .studio-product-mark { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| /* Table headers read as a quiet band, not a dark slab. The old near-black | |
| header also left its white label colour on the cell's children, so a light | |
| background alone turned the column labels invisible. */ | |
| .gradio-container table thead th, | |
| .gradio-container table thead th.header-cell { | |
| border-bottom: 1px solid var(--ui-studio-border) !important; | |
| background: var(--ui-studio-soft) !important; | |
| color: var(--ui-studio-ink) !important; | |
| font-weight: 700 !important; | |
| } | |
| .gradio-container table thead th * { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| .gradio-container table thead th button, | |
| .gradio-container table thead th button.secondary { | |
| background: transparent !important; | |
| border-color: transparent !important; | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| /* Detailed results workbench: deliberately scoped to training results. */ | |
| .results-shell > .styler { | |
| background: transparent !important; | |
| } | |
| .results-shell .results-heading { | |
| margin-bottom: 16px; | |
| } | |
| .results-shell .results-heading .section-kicker { | |
| color: var(--ui-teal-700) !important; | |
| } | |
| .results-shell .results-workbench-grid { | |
| align-items: stretch; | |
| gap: 16px; | |
| } | |
| .results-shell .run-context-column { | |
| min-width: 210px; | |
| } | |
| .results-shell .run-context-output { | |
| height: 100%; | |
| } | |
| .results-shell .run-context-card { | |
| height: 100%; | |
| padding: 16px; | |
| background: var(--ui-canvas); | |
| border: 1px solid var(--ui-border); | |
| border-top: 4px solid var(--ui-blue-600); | |
| border-radius: 8px; | |
| } | |
| .results-shell .run-context-card.state-complete { | |
| border-top-color: var(--ui-success); | |
| } | |
| .results-shell .run-context-card.state-failed, | |
| .results-shell .run-context-card.state-cancelled { | |
| border-top-color: var(--ui-error); | |
| } | |
| .results-shell .run-context-card.state-queued { | |
| border-top-color: var(--ui-warning); | |
| } | |
| .results-shell .run-status-strip { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: 8px; | |
| margin-bottom: 16px; | |
| color: var(--ui-navy-900); | |
| font-size: 13px; | |
| line-height: 1.45; | |
| } | |
| .results-shell .run-dot { | |
| flex: 0 0 auto; | |
| width: 9px; | |
| height: 9px; | |
| margin-top: 4px; | |
| border: 2px solid currentColor; | |
| border-radius: 50%; | |
| color: var(--ui-blue-600); | |
| } | |
| .results-shell .state-complete .run-dot { | |
| color: var(--ui-success); | |
| background: var(--ui-success); | |
| } | |
| .results-shell .state-failed .run-dot, | |
| .results-shell .state-cancelled .run-dot { | |
| color: var(--ui-error); | |
| background: transparent; | |
| } | |
| .results-shell .state-queued .run-dot { | |
| color: var(--ui-warning); | |
| } | |
| .results-shell .run-alias-row { | |
| padding-bottom: 12px; | |
| border-bottom: 1px solid var(--ui-border); | |
| } | |
| .results-shell .run-alias { | |
| display: block; | |
| margin: 4px 0 8px; | |
| color: var(--ui-navy-900); | |
| font-weight: 600; | |
| font-size: 13px; | |
| line-height: 1.4; | |
| overflow-wrap: anywhere; | |
| user-select: all; | |
| } | |
| .results-shell .run-id-copy { | |
| min-height: 30px; | |
| padding: 4px 8px; | |
| background: var(--ui-surface); | |
| border: 1px solid var(--ui-border-strong); | |
| border-radius: 4px; | |
| color: var(--ui-blue-700); | |
| font-size: 11px; | |
| font-weight: 700; | |
| cursor: pointer; | |
| } | |
| .results-shell .run-id-copy:hover { | |
| background: var(--ui-canvas-deep); | |
| } | |
| .results-shell .run-id-copy:focus-visible { | |
| outline: 2px solid var(--ui-focus); | |
| outline-offset: 2px; | |
| } | |
| .results-shell .run-context-list, | |
| .results-shell .run-technical-grid { | |
| display: grid; | |
| gap: 12px; | |
| margin-top: 12px; | |
| } | |
| .results-shell .run-context-item { | |
| min-width: 0; | |
| } | |
| .results-shell .run-context-label { | |
| display: block; | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .06em; | |
| text-transform: uppercase; | |
| } | |
| .results-shell .run-context-value { | |
| display: block; | |
| margin-top: 2px; | |
| color: var(--ui-ink); | |
| font-size: 12px; | |
| font-weight: 600; | |
| overflow-wrap: anywhere; | |
| } | |
| .results-shell .run-technical { | |
| margin-top: 12px; | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| } | |
| .results-shell .run-technical summary { | |
| color: var(--ui-blue-700); | |
| font-weight: 700; | |
| cursor: pointer; | |
| } | |
| .results-shell .workbench-metric-grid { | |
| display: grid; | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| gap: 12px; | |
| } | |
| .results-shell .workbench-metric-card { | |
| min-width: 0; | |
| padding: 12px 16px; | |
| background: var(--ui-surface); | |
| border: 1px solid var(--ui-border); | |
| border-top: 3px solid var(--ui-blue-600); | |
| border-radius: 8px; | |
| } | |
| .results-shell .workbench-metric-card.primary-metric-card { | |
| background: var(--ui-success-bg); | |
| border-top-color: var(--ui-success); | |
| } | |
| .results-shell .workbench-metric-card.model-metric-card { | |
| grid-column: 1 / -1; | |
| border-top-color: var(--ui-blue-600); | |
| } | |
| .results-shell .metric-label { | |
| display: block; | |
| color: var(--ui-muted) !important; | |
| font-size: 11px; | |
| font-weight: 700; | |
| } | |
| .results-shell .metric-value { | |
| display: block; | |
| margin-top: 8px; | |
| color: var(--ui-navy-900) !important; | |
| font-size: clamp(20px, 3vw, 28px); | |
| font-weight: 700; | |
| font-variant-numeric: tabular-nums; | |
| overflow-wrap: anywhere; | |
| } | |
| .results-shell .metric-model { | |
| font-size: 18px; | |
| } | |
| .results-shell .reported-metrics-detail { | |
| margin-top: 12px; | |
| } | |
| .results-shell .reported-metrics-detail summary { | |
| color: var(--ui-blue-700); | |
| font-size: 12px; | |
| font-weight: 700; | |
| cursor: pointer; | |
| } | |
| .results-shell .reported-metrics-source { | |
| margin-top: 12px; | |
| } | |
| .results-shell .reported-metrics-source > .metric-grid { | |
| display: none; | |
| } | |
| .results-shell .performance-summary td, | |
| .results-shell .performance-summary td *, | |
| .results-shell .detail-markdown, | |
| .results-shell .detail-markdown * { | |
| color: var(--ui-ink) !important; | |
| } | |
| body .gradio-container .results-shell .detail-markdown table thead th, | |
| body.dark .gradio-container .results-shell .detail-markdown table thead th { | |
| background: var(--ui-canvas-deep) !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| body .gradio-container .results-shell .detail-markdown table thead th *, | |
| body.dark .gradio-container .results-shell .detail-markdown table thead th * { | |
| background: transparent !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| body .gradio-container .results-shell .detail-markdown code, | |
| body.dark .gradio-container .results-shell .detail-markdown code { | |
| background: var(--ui-canvas-deep) !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .results-shell .performance-summary table thead th, | |
| .results-shell .prediction-accordion table thead th, | |
| .results-shell .candidate-comparison table thead th { | |
| background: var(--ui-canvas-deep) !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .results-shell .prediction-accordion table thead th *, | |
| .results-shell .candidate-comparison table thead th * { | |
| background: transparent !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .results-shell .candidate-comparison { | |
| margin-top: 16px; | |
| padding: 12px; | |
| border: 1px solid var(--ui-border); | |
| border-left: 3px solid var(--ui-blue-600); | |
| border-radius: 8px; | |
| background: var(--ui-surface-subtle); | |
| border-color: var(--ui-border) !important; | |
| border-left-color: var(--ui-blue-600) !important; | |
| } | |
| .results-shell .candidate-comparison h4 { | |
| margin-top: 0 !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .results-shell .candidate-comparison table { | |
| width: 100%; | |
| font-size: 12px; | |
| } | |
| .results-shell .candidate-comparison table td, | |
| .results-shell .candidate-comparison table td * { | |
| background: var(--ui-surface) !important; | |
| border-color: var(--ui-border) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| .results-shell .candidate-comparison table tbody tr:nth-child(even) td { | |
| background: var(--ui-surface-subtle) !important; | |
| } | |
| .results-shell .prediction-accordion { | |
| margin-top: 16px; | |
| } | |
| .results-shell .prediction-accordion .prediction-table { | |
| min-height: 0; | |
| max-height: 260px; | |
| overflow: auto; | |
| } | |
| .results-shell .prediction-accordion table td, | |
| .results-shell .prediction-accordion table td * { | |
| color: var(--ui-ink) !important; | |
| } | |
| .results-shell .prediction-table .virtual-row { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| .results-shell .prediction-table .virtual-row.row-odd { | |
| background: var(--ui-surface-subtle) !important; | |
| } | |
| .results-shell .prediction-table .body-cell, | |
| .results-shell .prediction-table .body-cell * { | |
| background: transparent !important; | |
| border-color: var(--ui-border) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| .results-shell .artifact-panel { | |
| position: static !important; | |
| z-index: auto !important; | |
| margin-top: 16px; | |
| } | |
| .results-shell .artifact-heading { | |
| margin: 0 0 4px !important; | |
| color: var(--ui-navy-900) !important; | |
| font-size: 16px; | |
| font-weight: 700; | |
| } | |
| .results-shell .artifact-note { | |
| margin: 0 0 12px !important; | |
| color: var(--ui-muted) !important; | |
| font-size: 12px; | |
| } | |
| .results-shell .artifact-panel a, | |
| .results-shell .artifact-panel .file-preview { | |
| color: var(--ui-blue-700) !important; | |
| overflow-wrap: anywhere; | |
| white-space: normal !important; | |
| } | |
| body .gradio-container .results-shell .artifact-panel .file-preview tr.file, | |
| body.dark .gradio-container .results-shell .artifact-panel .file-preview tr.file { | |
| background: var(--ui-surface) !important; | |
| } | |
| body .gradio-container .results-shell .artifact-panel .file-preview td, | |
| body .gradio-container .results-shell .artifact-panel .file-preview span, | |
| body .gradio-container .results-shell .artifact-panel .file-preview a, | |
| body.dark .gradio-container .results-shell .artifact-panel .file-preview td, | |
| body.dark .gradio-container .results-shell .artifact-panel .file-preview span, | |
| body.dark .gradio-container .results-shell .artifact-panel .file-preview a { | |
| background: transparent !important; | |
| color: var(--ui-blue-700) !important; | |
| } | |
| .results-shell .artifact-panel .empty.large { | |
| height: 72px !important; | |
| min-height: 72px !important; | |
| } | |
| .results-shell .artifact-panel .empty.large .icon { | |
| width: 24px !important; | |
| height: 24px !important; | |
| opacity: .45; | |
| } | |
| body.dark .results-shell .run-context-card, | |
| body.dark .results-shell .workbench-metric-card { | |
| background: var(--ui-surface) !important; | |
| } | |
| body.dark .results-shell .run-status-strip, | |
| body.dark .results-shell .run-alias, | |
| body.dark .results-shell .metric-value { | |
| color: var(--ui-navy-900) !important; | |
| } | |
| @media (max-width: 900px) { | |
| .results-shell .results-workbench-grid, | |
| .parallel-job-column .results-workbench-grid { | |
| flex-direction: column !important; | |
| } | |
| .results-shell .workbench-metric-grid { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| } | |
| } | |
| @media (max-width: 560px) { | |
| .results-shell .workbench-metric-grid { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| .results-shell .workbench-metric-card.model-metric-card { | |
| grid-column: auto; | |
| } | |
| } | |
| @media (max-width: 800px) { | |
| * { | |
| min-width: 0 !important; | |
| box-sizing: border-box; | |
| } | |
| .app-header { | |
| margin: 0 -12px 20px; | |
| padding: 20px 20px; | |
| align-items: flex-start; | |
| flex-direction: column; | |
| gap: 12px; | |
| } | |
| .app-subtitle { | |
| max-width: 100%; | |
| text-align: left; | |
| overflow-wrap: anywhere; | |
| } | |
| .row, | |
| .column, | |
| .tabs, | |
| .tabitem, | |
| .panel-card, | |
| .results-shell, | |
| .context-panel { | |
| width: 100% !important; | |
| max-width: 100% !important; | |
| } | |
| .row { | |
| flex-direction: column !important; | |
| flex-wrap: nowrap !important; | |
| align-items: stretch !important; | |
| } | |
| .column { | |
| flex: 1 1 100% !important; | |
| } | |
| .tab-container { | |
| max-width: 100%; | |
| overflow-x: auto; | |
| overflow-y: hidden; | |
| } | |
| .tab-container button { | |
| flex: 0 0 auto !important; | |
| min-width: max-content !important; | |
| padding: 8px 16px !important; | |
| white-space: nowrap; | |
| } | |
| .panel-card, | |
| .results-shell, | |
| .context-panel { | |
| padding: 16px !important; | |
| } | |
| .metric-grid { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| } | |
| } | |
| /* Guided Research Workbench */ | |
| .guided-workbench-heading { | |
| display: flex; | |
| align-items: flex-end; | |
| justify-content: space-between; | |
| gap: 32px; | |
| padding: 24px 0 20px; | |
| border-bottom: 1px solid var(--ui-border); | |
| } | |
| #workspace-tabs > .tabitem { | |
| padding-top: 8px; | |
| } | |
| .guided-workbench-heading h2 { | |
| margin: 2px 0 0 !important; | |
| color: var(--ui-navy-900) !important; | |
| font-size: clamp(24px, 3vw, 32px) !important; | |
| line-height: 1.08 !important; | |
| letter-spacing: -.035em; | |
| } | |
| .guided-workbench-heading > p { | |
| max-width: 620px; | |
| margin: 0 !important; | |
| color: var(--ui-muted) !important; | |
| font-size: 14px; | |
| line-height: 1.55; | |
| } | |
| .guided-instrument-bench { | |
| display: grid !important; | |
| grid-template-columns: 160px minmax(0, 1fr) 285px; | |
| gap: 16px !important; | |
| align-items: start !important; | |
| margin-top: 20px; | |
| } | |
| .guided-instrument-bench > .column { | |
| min-width: 0 !important; | |
| width: auto !important; | |
| } | |
| .guided-step-rail, | |
| .guided-work-canvas, | |
| .guided-research-panel { | |
| background: var(--ui-surface) !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 12px !important; | |
| box-shadow: 0 1px 2px rgba(16, 47, 68, .04), 0 12px 30px rgba(16, 47, 68, .045); | |
| } | |
| .guided-step-rail { | |
| position: sticky; | |
| top: 12px; | |
| overflow: hidden; | |
| padding: 12px !important; | |
| } | |
| .guided-rail-label { | |
| margin: 4px 8px 8px !important; | |
| color: var(--ui-muted) !important; | |
| font-size: 11px !important; | |
| font-weight: 700 !important; | |
| letter-spacing: .13em; | |
| text-transform: uppercase; | |
| } | |
| .guided-stepper { | |
| border: 0 !important; | |
| padding: 0 !important; | |
| } | |
| .guided-stepper > label { | |
| display: none !important; | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| gap: 4px !important; | |
| } | |
| .guided-stepper label:has(input) { | |
| min-height: 42px; | |
| margin: 0 !important; | |
| padding: 12px 12px !important; | |
| border: 1px solid transparent; | |
| border-radius: 8px; | |
| background: transparent !important; | |
| color: var(--ui-muted) !important; | |
| font-size: 12px; | |
| font-weight: 600; | |
| transition: background-color .14s ease, border-color .14s ease, color .14s ease; | |
| } | |
| .guided-stepper label:has(input):hover { | |
| background: var(--ui-surface-subtle) !important; | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .guided-stepper label:has(input:checked) { | |
| background: var(--ui-accent-bg) !important; | |
| border-color: var(--ui-border-strong); | |
| color: var(--ui-navy-900) !important; | |
| } | |
| .guided-stepper input[type="radio"] { | |
| width: 9px !important; | |
| height: 9px !important; | |
| min-width: 9px !important; | |
| border: 1px solid var(--ui-border-strong) !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-stepper input[type="radio"]:checked { | |
| background: var(--ui-blue-700) !important; | |
| border-color: var(--ui-blue-700) !important; | |
| } | |
| .guided-rail-note { | |
| display: grid; | |
| gap: 4px; | |
| margin: 12px 4px 2px; | |
| padding: 12px; | |
| border-top: 1px solid var(--ui-border); | |
| color: var(--ui-muted); | |
| } | |
| .guided-approval-status { | |
| display: flex; | |
| flex-wrap: wrap; | |
| align-items: baseline; | |
| gap: 6px 10px; | |
| } | |
| .guided-rail-note strong { | |
| color: var(--ui-navy-900); | |
| font-size: 11px; | |
| } | |
| .guided-rail-note span { | |
| font-size: 11px; | |
| line-height: 1.45; | |
| } | |
| .guided-work-canvas { | |
| padding: 20px !important; | |
| } | |
| .guided-canvas-heading, | |
| .guided-dossier-heading, | |
| .guided-inspector-heading, | |
| .guided-snapshot-heading { | |
| display: flex; | |
| align-items: flex-start; | |
| justify-content: space-between; | |
| gap: 20px; | |
| } | |
| .guided-canvas-heading span, | |
| .guided-dossier-heading span:first-child, | |
| .guided-inspector-heading span:first-child, | |
| .guided-snapshot-heading span, | |
| .guided-step-heading > span, | |
| .guided-review > span, | |
| .guided-summary-status > span { | |
| color: var(--ui-teal-700); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .12em; | |
| text-transform: uppercase; | |
| } | |
| .guided-canvas-heading h3, | |
| .guided-dossier-heading h3, | |
| .guided-inspector-heading h3, | |
| .guided-snapshot-heading h3 { | |
| margin: 2px 0 0 !important; | |
| color: var(--ui-navy-900) !important; | |
| font-size: 16px !important; | |
| } | |
| .guided-canvas-heading small { | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| } | |
| .guided-pipeline-diagram { | |
| display: grid !important; | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| gap: 12px !important; | |
| margin: 16px 0 20px; | |
| padding: 16px !important; | |
| overflow: visible; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 12px; | |
| background: var(--ui-research-canvas); | |
| } | |
| .guided-pipeline-diagram > * { | |
| min-width: 0 !important; | |
| width: auto !important; | |
| max-width: none !important; | |
| } | |
| .guided-pipeline-diagram > .guided-pipeline-card-shell { | |
| position: relative; | |
| min-width: 0; | |
| min-height: 166px; | |
| overflow: hidden; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 12px !important; | |
| background: var(--ui-research-paper) !important; | |
| box-shadow: var(--ui-research-shadow); | |
| } | |
| .guided-pipeline-card-shell .guided-pipeline-card-shell { | |
| position: static; | |
| width: 100% !important; | |
| min-width: 0 !important; | |
| height: 100%; | |
| overflow: hidden; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none; | |
| } | |
| .guided-pipeline-card-shell .styler, | |
| .guided-pipeline-card-output, | |
| .guided-pipeline-card-output > div, | |
| .guided-pipeline-card-output .html-container, | |
| .guided-pipeline-card-output .prose { | |
| height: 100%; | |
| width: 100% !important; | |
| min-width: 0 !important; | |
| max-width: 100% !important; | |
| } | |
| .guided-pipeline-card-output { | |
| overflow: hidden !important; | |
| } | |
| .guided-pipeline-card-content { | |
| position: relative; | |
| display: flex; | |
| flex-direction: column; | |
| min-width: 0; | |
| min-height: 164px; | |
| height: 100%; | |
| padding: 16px; | |
| border-top: 3px solid var(--ui-research-green-700); | |
| color: var(--ui-research-ink); | |
| } | |
| .guided-node-topline, | |
| .guided-node-footer { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 8px; | |
| min-width: 0; | |
| } | |
| .guided-node-stage, | |
| .guided-node-shape { | |
| min-width: 0; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| font-family: var(--ui-font-mono); | |
| } | |
| .guided-node-stage { | |
| color: var(--ui-research-muted); | |
| font-size: 11px; | |
| font-weight: 600; | |
| letter-spacing: .06em; | |
| text-transform: uppercase; | |
| } | |
| .guided-node-source { | |
| flex: 0 0 auto; | |
| max-width: 112px; | |
| overflow: hidden; | |
| padding: 4px 8px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 999px; | |
| background: var(--ui-research-green-100); | |
| color: var(--ui-research-green-700); | |
| font-size: 11px; | |
| font-weight: 700; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-pipeline-card-content h4, | |
| .guided-node-parameter { | |
| display: -webkit-box; | |
| overflow: hidden; | |
| -webkit-box-orient: vertical; | |
| -webkit-line-clamp: 2; | |
| } | |
| .guided-pipeline-card-content h4 { | |
| min-height: 40px; | |
| margin: 16px 0 4px !important; | |
| color: var(--ui-research-ink) !important; | |
| font-size: 16px !important; | |
| line-height: 1.25 !important; | |
| } | |
| .guided-pipeline-card-content.is-selected h4 { | |
| padding-right: 82px; | |
| } | |
| .guided-node-parameter { | |
| margin: 0 0 12px !important; | |
| color: var(--ui-research-muted) !important; | |
| font-size: 12px; | |
| line-height: 1.45; | |
| } | |
| .guided-node-footer { | |
| margin-top: auto; | |
| padding-top: 12px; | |
| border-top: 1px solid var(--ui-border-subtle); | |
| color: var(--ui-research-muted); | |
| font-size: 11px; | |
| } | |
| .guided-node-compatibility { | |
| display: inline-flex; | |
| flex: 0 0 auto; | |
| align-items: center; | |
| gap: 4px; | |
| white-space: nowrap; | |
| font-weight: 700; | |
| } | |
| .guided-node-compatibility.compatible { | |
| color: var(--ui-success); | |
| } | |
| .guided-node-compatibility.review { | |
| color: var(--ui-warning); | |
| } | |
| .guided-node-compatibility.blocked { | |
| color: var(--ui-error); | |
| } | |
| .guided-pipeline-card-content.is-selected { | |
| box-shadow: inset 0 0 0 2px var(--ui-research-green-700); | |
| } | |
| .guided-node-selected { | |
| position: absolute; | |
| top: 48px; | |
| right: 16px; | |
| color: var(--ui-research-green-700); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .06em; | |
| text-transform: uppercase; | |
| } | |
| .guided-pipeline-node-hitarea { | |
| position: absolute !important; | |
| inset: 0; | |
| z-index: 2; | |
| width: 100% !important; | |
| height: 100% !important; | |
| min-width: 0 !important; | |
| min-height: 0 !important; | |
| opacity: 0; | |
| cursor: pointer; | |
| } | |
| .guided-pipeline-diagram > .guided-pipeline-card-shell:has(.guided-pipeline-node-hitarea:hover) { | |
| border-color: var(--ui-research-green-700) !important; | |
| transform: translateY(-1px); | |
| } | |
| .guided-pipeline-diagram > .guided-pipeline-card-shell:has(.guided-pipeline-node-hitarea:focus-visible) { | |
| outline: 3px solid var(--ui-focus); | |
| outline-offset: 3px; | |
| } | |
| .guided-secondary-action:focus-visible, | |
| .guided-primary-action:focus-visible, | |
| .guided-parallel-action:focus-visible { | |
| outline: 3px solid var(--ui-focus) !important; | |
| outline-offset: 2px !important; | |
| } | |
| .guided-step-panel { | |
| padding: 20px !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 12px !important; | |
| background: var(--ui-surface-subtle) !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-step-heading { | |
| margin-bottom: 16px; | |
| padding-bottom: 12px; | |
| border-bottom: 1px solid var(--ui-border); | |
| } | |
| .guided-step-heading h3 { | |
| margin: 4px 0 4px !important; | |
| color: var(--ui-navy-900) !important; | |
| font-size: 20px !important; | |
| letter-spacing: -.02em; | |
| } | |
| .guided-step-heading p { | |
| max-width: 700px; | |
| margin: 0 !important; | |
| color: var(--ui-muted) !important; | |
| font-size: 12px; | |
| line-height: 1.5; | |
| } | |
| .guided-research-panel { | |
| position: sticky; | |
| top: 12px; | |
| max-height: calc(100vh - 24px); | |
| overflow-y: auto; | |
| padding: 16px !important; | |
| scrollbar-width: thin; | |
| } | |
| .guided-dossier, | |
| .guided-dossier-empty { | |
| color: var(--ui-ink); | |
| } | |
| .guided-provider-badge, | |
| .guided-compatibility { | |
| display: inline-flex; | |
| align-items: center; | |
| min-height: 24px; | |
| padding: 4px 8px; | |
| border: 1px solid var(--ui-border-strong); | |
| border-radius: 999px; | |
| background: var(--ui-accent-bg); | |
| color: var(--ui-blue-700); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .08em; | |
| text-transform: uppercase; | |
| white-space: nowrap; | |
| } | |
| .guided-dossier-block { | |
| margin-top: 12px; | |
| padding-top: 12px; | |
| border-top: 1px solid var(--ui-border); | |
| } | |
| .guided-dossier-block h4, | |
| .guided-candidate-card h4, | |
| .guided-node-inspector h4, | |
| .guided-plan-context h4, | |
| .guided-review-warnings h4 { | |
| margin: 0 0 8px !important; | |
| color: var(--ui-muted) !important; | |
| font-size: 11px !important; | |
| font-weight: 700 !important; | |
| letter-spacing: .1em; | |
| text-transform: uppercase; | |
| } | |
| .guided-dossier-block strong { | |
| color: var(--ui-navy-900); | |
| font-size: 12px; | |
| } | |
| .guided-dossier-block p, | |
| .guided-dossier-block li, | |
| .guided-node-inspector p, | |
| .guided-node-inspector li, | |
| .guided-candidate-card p, | |
| .guided-candidate-card li { | |
| color: var(--ui-muted) !important; | |
| font-size: 11px !important; | |
| line-height: 1.5; | |
| } | |
| .guided-dossier-block ul, | |
| .guided-node-inspector ul, | |
| .guided-candidate-card ul { | |
| margin: 4px 0 0 !important; | |
| padding-left: 16px; | |
| } | |
| .guided-provider-note { | |
| margin: 16px 0 0 !important; | |
| padding: 8px 12px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 8px; | |
| background: var(--ui-surface-subtle); | |
| color: var(--ui-muted) !important; | |
| font-size: 11px !important; | |
| line-height: 1.45; | |
| } | |
| .guided-inline-error { | |
| margin-top: 12px; | |
| padding: 8px; | |
| border-left: 3px solid var(--ui-error); | |
| background: var(--ui-error-bg); | |
| color: var(--ui-error); | |
| font-size: 11px; | |
| } | |
| .guided-refinement-box { | |
| margin-top: 16px; | |
| padding: 12px !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 8px !important; | |
| background: var(--ui-surface-subtle) !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-secondary-action { | |
| border: 1px solid var(--ui-border-strong) !important; | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-navy-900) !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-secondary-action:hover { | |
| border-color: var(--ui-blue-700) !important; | |
| background: var(--ui-accent-bg) !important; | |
| } | |
| .guided-candidate-list { | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 12px; | |
| margin-top: 16px; | |
| } | |
| .guided-plan-context { | |
| grid-column: 1 / -1; | |
| padding: 12px 12px; | |
| border-left: 3px solid var(--ui-teal-700); | |
| background: var(--ui-teal-bg); | |
| } | |
| .guided-candidate-card { | |
| display: flex; | |
| flex-direction: column; | |
| min-width: 0; | |
| padding: 16px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 12px; | |
| background: var(--ui-surface); | |
| } | |
| .guided-candidate-card.selected { | |
| border-color: var(--ui-blue-700); | |
| box-shadow: inset 0 3px 0 var(--ui-blue-700); | |
| } | |
| .guided-candidate-index { | |
| color: var(--ui-teal-700); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .1em; | |
| text-transform: uppercase; | |
| } | |
| .guided-candidate-card h3 { | |
| margin: 4px 0 8px !important; | |
| color: var(--ui-navy-900) !important; | |
| font-size: 16px !important; | |
| } | |
| .guided-candidate-rationale { | |
| min-height: 48px; | |
| } | |
| .guided-candidate-section { | |
| margin-top: 12px; | |
| padding-top: 12px; | |
| border-top: 1px solid var(--ui-border); | |
| } | |
| .guided-candidate-columns { | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 12px; | |
| margin-top: 12px; | |
| } | |
| .guided-estimate-grid { | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 8px; | |
| } | |
| .guided-estimate { | |
| display: grid; | |
| gap: 2px; | |
| padding: 8px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 8px; | |
| background: var(--ui-surface-subtle); | |
| } | |
| .guided-estimate span, | |
| .guided-estimate small { | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| } | |
| .guided-estimate strong { | |
| color: var(--ui-navy-900); | |
| font-size: 12px; | |
| } | |
| .guided-selection-state { | |
| margin-top: auto !important; | |
| padding-top: 12px; | |
| color: var(--ui-blue-700) !important; | |
| font-size: 11px !important; | |
| font-weight: 700; | |
| letter-spacing: .09em; | |
| text-transform: uppercase; | |
| } | |
| .guided-node-inspector { | |
| display: grid; | |
| gap: 16px; | |
| } | |
| .guided-compatibility.compatible { | |
| border-color: var(--ui-success-border); | |
| background: var(--ui-success-bg); | |
| color: var(--ui-success); | |
| } | |
| .guided-compatibility.review { | |
| border-color: var(--ui-warning-border); | |
| background: var(--ui-warning-bg); | |
| color: var(--ui-warning); | |
| } | |
| .guided-compatibility.blocked { | |
| border-color: var(--ui-error-border); | |
| background: var(--ui-error-bg); | |
| color: var(--ui-error); | |
| } | |
| .guided-inspector-grid { | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 12px; | |
| } | |
| .guided-inspector-grid > div, | |
| .guided-inspector-contract { | |
| padding: 12px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 8px; | |
| background: var(--ui-surface); | |
| } | |
| .guided-detail-row { | |
| display: grid; | |
| grid-template-columns: minmax(100px, .8fr) minmax(0, 1.2fr); | |
| gap: 16px; | |
| padding: 8px 0; | |
| border-bottom: 1px solid var(--ui-border-subtle); | |
| font-size: 11px; | |
| } | |
| .guided-detail-row:last-child { | |
| border-bottom: 0; | |
| } | |
| .guided-detail-row span { | |
| color: var(--ui-muted); | |
| } | |
| .guided-detail-row strong { | |
| color: var(--ui-ink); | |
| overflow-wrap: anywhere; | |
| } | |
| .guided-review { | |
| padding: 16px; | |
| border: 1px solid var(--ui-border); | |
| border-left-width: 4px; | |
| border-radius: 8px; | |
| background: var(--ui-surface); | |
| } | |
| .guided-review.ready { | |
| border-left-color: var(--ui-success); | |
| } | |
| .guided-review.blocked { | |
| border-left-color: var(--ui-warning); | |
| } | |
| .guided-review h3 { | |
| margin: 4px 0 16px !important; | |
| color: var(--ui-navy-900) !important; | |
| font-size: 20px !important; | |
| } | |
| .guided-review-grid { | |
| display: grid; | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| gap: 8px; | |
| } | |
| .guided-review-grid > div { | |
| display: grid; | |
| gap: 4px; | |
| padding: 12px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 8px; | |
| background: var(--ui-surface-subtle); | |
| } | |
| .guided-review-grid small { | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| text-transform: uppercase; | |
| letter-spacing: .07em; | |
| } | |
| .guided-review-grid strong { | |
| color: var(--ui-navy-900); | |
| font-size: 11px; | |
| overflow-wrap: anywhere; | |
| } | |
| .guided-review-warnings { | |
| margin-top: 12px; | |
| } | |
| .guided-variant-status { | |
| margin-top: 12px; | |
| padding: 12px 12px; | |
| border: 1px solid var(--ui-border); | |
| border-radius: 8px; | |
| background: var(--ui-surface-subtle); | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| } | |
| .guided-variant-status.ready { | |
| border-color: var(--ui-success-border); | |
| background: var(--ui-success-bg); | |
| color: var(--ui-success); | |
| } | |
| .guided-variant-status.blocked { | |
| border-color: var(--ui-error-border); | |
| background: var(--ui-error-bg); | |
| color: var(--ui-error); | |
| } | |
| .guided-run-bar { | |
| position: sticky; | |
| bottom: 10px; | |
| z-index: 20; | |
| margin-top: 16px; | |
| padding: 12px 12px !important; | |
| border: 1px solid var(--ui-border-strong) !important; | |
| border-radius: 12px !important; | |
| background: rgba(255, 255, 255, .97) !important; | |
| box-shadow: 0 8px 28px rgba(16, 47, 68, .12) !important; | |
| backdrop-filter: blur(12px); | |
| } | |
| .guided-run-bar > .row { | |
| align-items: center !important; | |
| flex-wrap: nowrap !important; | |
| } | |
| .guided-run-summary-output { | |
| flex: 1 1 auto !important; | |
| min-width: 0 !important; | |
| } | |
| .guided-run-summary { | |
| display: flex; | |
| align-items: center; | |
| gap: 20px; | |
| min-width: 0; | |
| } | |
| .guided-summary-status { | |
| display: grid; | |
| gap: 2px; | |
| min-width: 120px; | |
| padding-right: 16px; | |
| border-right: 1px solid var(--ui-border); | |
| } | |
| .guided-summary-status strong { | |
| color: var(--ui-navy-900); | |
| font-size: 12px; | |
| } | |
| .guided-summary-facts { | |
| display: flex; | |
| gap: 16px; | |
| min-width: 0; | |
| } | |
| .guided-summary-facts > span { | |
| display: grid; | |
| gap: 2px; | |
| color: var(--ui-ink); | |
| font-size: 11px; | |
| overflow-wrap: anywhere; | |
| } | |
| .guided-summary-facts small { | |
| color: var(--ui-muted); | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .07em; | |
| text-transform: uppercase; | |
| } | |
| .guided-primary-action, | |
| .guided-parallel-action { | |
| flex: 0 0 auto !important; | |
| min-width: 155px !important; | |
| border-radius: 8px !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-parallel-action { | |
| background: var(--ui-teal-700) !important; | |
| } | |
| .guided-result-tabs { | |
| margin-top: 12px; | |
| } | |
| .guided-result-tabs .tab-nav { | |
| border-bottom: 1px solid var(--ui-border); | |
| overflow-x: auto; | |
| } | |
| .guided-snapshot-output { | |
| padding: 16px !important; | |
| border: 1px solid var(--ui-border) !important; | |
| border-radius: 8px !important; | |
| background: var(--ui-surface-subtle) !important; | |
| } | |
| .guided-snapshot { | |
| display: grid; | |
| gap: 12px; | |
| } | |
| .guided-empty-copy { | |
| color: var(--ui-muted) !important; | |
| font-size: 11px !important; | |
| font-style: italic; | |
| } | |
| /* Scientific Light hierarchy -------------------------------------------- */ | |
| .guided-step-rail, | |
| .guided-work-canvas, | |
| .guided-research-panel { | |
| background: var(--ui-research-paper) !important; | |
| border-color: var(--ui-border) !important; | |
| box-shadow: var(--ui-research-shadow); | |
| } | |
| .guided-stepper label:has(input):hover { | |
| background: var(--ui-research-canvas) !important; | |
| color: var(--ui-research-ink) !important; | |
| } | |
| .guided-stepper label:has(input:checked) { | |
| background: var(--ui-research-green-100) !important; | |
| border-color: var(--ui-research-green-700); | |
| color: var(--ui-research-ink) !important; | |
| } | |
| .guided-stepper input[type="radio"]:checked { | |
| background: var(--ui-research-green-700) !important; | |
| border-color: var(--ui-research-green-700) !important; | |
| } | |
| .guided-step-panel, | |
| .guided-refinement-box, | |
| .guided-snapshot-output { | |
| background: var(--ui-research-canvas) !important; | |
| } | |
| .guided-research-panel { | |
| overflow-x: hidden; | |
| } | |
| .guided-dossier-heading { | |
| margin: -16px -16px 16px; | |
| padding: 16px; | |
| border-radius: 12px 12px 0 0; | |
| background: var(--ui-research-green-900); | |
| } | |
| .guided-dossier-heading h3, | |
| .guided-dossier-heading span:first-child { | |
| color: var(--ui-on-dark) !important; | |
| } | |
| .guided-provider-badge { | |
| border-color: var(--ui-research-green-100); | |
| background: var(--ui-research-green-100); | |
| color: var(--ui-research-green-900); | |
| } | |
| .guided-dossier-block strong, | |
| .guided-candidate-card h3, | |
| .guided-review h3, | |
| .guided-summary-status strong { | |
| color: var(--ui-research-ink) !important; | |
| } | |
| .guided-candidate-card { | |
| border-color: var(--ui-border); | |
| background: var(--ui-research-paper); | |
| box-shadow: var(--ui-research-shadow); | |
| } | |
| .guided-candidate-card.selected { | |
| border-color: var(--ui-research-green-700); | |
| box-shadow: inset 0 3px 0 var(--ui-research-green-700), | |
| var(--ui-research-shadow); | |
| } | |
| .guided-candidate-index, | |
| .guided-selection-state, | |
| .guided-canvas-heading span, | |
| .guided-step-heading > span, | |
| .guided-review > span, | |
| .guided-summary-status > span { | |
| color: var(--ui-research-green-700) !important; | |
| } | |
| .guided-plan-context { | |
| border-left-color: var(--ui-research-green-700); | |
| background: var(--ui-research-green-100); | |
| } | |
| .guided-inspector-grid > div, | |
| .guided-inspector-contract, | |
| .guided-review { | |
| background: var(--ui-research-paper); | |
| } | |
| .guided-run-bar { | |
| border-color: var(--ui-border-strong) !important; | |
| background: var(--ui-research-floating) !important; | |
| box-shadow: var(--ui-research-shadow) !important; | |
| } | |
| .guided-primary-action { | |
| background: var(--ui-research-green-700) !important; | |
| border-color: var(--ui-research-green-700) !important; | |
| } | |
| .guided-parallel-action { | |
| background: var(--ui-surface) !important; | |
| border-color: var(--ui-research-green-700) !important; | |
| color: var(--ui-research-green-700) !important; | |
| } | |
| body.dark .guided-step-rail, | |
| body.dark .guided-work-canvas, | |
| body.dark .guided-research-panel, | |
| body.dark .guided-step-panel, | |
| body.dark .guided-candidate-card, | |
| body.dark .guided-inspector-grid > div, | |
| body.dark .guided-inspector-contract, | |
| body.dark .guided-review, | |
| body.dark .guided-run-bar, | |
| body.dark .guided-snapshot-output { | |
| background: var(--ui-surface) !important; | |
| color: var(--ui-ink) !important; | |
| } | |
| @media (max-width: 1180px) { | |
| .guided-instrument-bench { | |
| grid-template-columns: 160px minmax(0, 1fr); | |
| } | |
| .guided-research-panel { | |
| position: static; | |
| grid-column: 1 / -1; | |
| max-height: none; | |
| } | |
| .guided-candidate-list { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| } | |
| @media (max-width: 800px) { | |
| .guided-workbench-heading { | |
| align-items: flex-start; | |
| flex-direction: column; | |
| gap: 8px; | |
| } | |
| .guided-workbench-heading > p { | |
| text-align: left; | |
| } | |
| .guided-instrument-bench { | |
| display: flex !important; | |
| flex-direction: column !important; | |
| } | |
| .guided-step-rail { | |
| position: static; | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| display: grid !important; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| } | |
| .guided-candidate-columns, | |
| .guided-inspector-grid, | |
| .guided-review-grid { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| .guided-run-bar { | |
| position: static; | |
| } | |
| .guided-run-bar > .row { | |
| flex-direction: column !important; | |
| } | |
| .guided-run-summary, | |
| .guided-summary-facts { | |
| align-items: flex-start; | |
| flex-direction: column; | |
| gap: 8px; | |
| } | |
| .guided-summary-status { | |
| width: 100%; | |
| padding: 0 0 8px; | |
| border-right: 0; | |
| border-bottom: 1px solid var(--ui-border); | |
| } | |
| .guided-primary-action, | |
| .guided-parallel-action { | |
| width: 100% !important; | |
| } | |
| } | |
| @media (max-width: 650px) { | |
| .guided-pipeline-diagram { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| } | |
| .guided-work-canvas, | |
| .guided-research-panel { | |
| padding: 12px !important; | |
| } | |
| .guided-estimate-grid { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| } | |
| @media (max-width: 440px) { | |
| .guided-pipeline-diagram { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| } | |
| @media (max-width: 340px) { | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| grid-template-columns: minmax(0, 1fr) !important; | |
| } | |
| } | |
| /* Modern Scientific Studio --------------------------------------------- */ | |
| .app-header.studio-header-contract { | |
| min-height: 66px; | |
| padding: 14px 24px; | |
| border: 1px solid var(--ui-studio-border); | |
| border-bottom-color: var(--ui-studio-border); | |
| color: var(--ui-studio-ink); | |
| background: var(--ui-studio-surface); | |
| box-shadow: none; | |
| } | |
| .app-header.studio-header-contract .app-mark { | |
| border-color: var(--ui-studio-cobalt); | |
| border-radius: 12px; | |
| color: #ffffff; | |
| background: var(--ui-studio-cobalt); | |
| } | |
| .app-header.studio-header-contract h1, | |
| .app-header.studio-header-contract .app-eyebrow, | |
| .app-header.studio-header-contract .app-subtitle { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| .app-header.studio-header-contract .app-eyebrow, | |
| .app-header.studio-header-contract .app-subtitle { | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| #workspace-tabs .tab-nav, | |
| #workspace-tabs .tab-container { | |
| border-bottom-color: var(--ui-studio-border); | |
| background: var(--ui-studio-surface); | |
| } | |
| #workspace-tabs .tab-nav button, | |
| #workspace-tabs .tab-container button { | |
| min-height: 40px; | |
| color: var(--ui-studio-muted) !important; | |
| background: transparent !important; | |
| } | |
| #workspace-tabs .tab-nav button.selected, | |
| #workspace-tabs .tab-container button.selected { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| color: var(--ui-studio-ink) !important; | |
| background: var(--ui-studio-cobalt-soft) !important; | |
| } | |
| .guided-workbench-heading { | |
| align-items: flex-start; | |
| padding: 28px 12px 22px; | |
| border-bottom-color: var(--ui-studio-border); | |
| } | |
| .guided-workbench-heading h2 { | |
| color: var(--ui-studio-ink) !important; | |
| font-size: clamp(25px, 2.5vw, 31px) !important; | |
| } | |
| .guided-workbench-heading > p { | |
| max-width: 540px; | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| .studio-workbench { | |
| display: grid !important; | |
| grid-template-columns: minmax(180px, .18fr) minmax(0, 1fr) minmax(280px, .29fr); | |
| gap: 0 !important; | |
| align-items: stretch !important; | |
| overflow: hidden; | |
| margin-top: 20px; | |
| border: 1px solid var(--ui-studio-border) !important; | |
| border-radius: 16px !important; | |
| background: var(--ui-studio-surface) !important; | |
| box-shadow: var(--ui-studio-shadow); | |
| } | |
| .studio-workbench > .column { | |
| width: auto !important; | |
| min-width: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-workflow { | |
| position: static; | |
| padding: 24px 18px !important; | |
| border-right: 1px solid var(--ui-studio-border) !important; | |
| background: #fbfcfe !important; | |
| } | |
| .studio-primary { | |
| padding: 24px 26px 32px !important; | |
| background: var(--ui-studio-bg) !important; | |
| } | |
| .studio-assistant { | |
| position: static; | |
| max-height: none; | |
| overflow-x: hidden; | |
| padding: 24px 20px 20px !important; | |
| border-left: 1px solid var(--ui-studio-border) !important; | |
| background: #fbfcfe !important; | |
| } | |
| .guided-rail-label, | |
| .guided-canvas-heading span, | |
| .guided-step-heading > span, | |
| .guided-review > span, | |
| .guided-summary-status > span { | |
| color: var(--ui-studio-cobalt) !important; | |
| } | |
| .guided-rail-label { | |
| margin: 1px 9px 14px !important; | |
| letter-spacing: .08em; | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| gap: 5px !important; | |
| } | |
| .guided-stepper label:has(input) { | |
| min-height: 44px; | |
| padding: 10px !important; | |
| border-radius: 10px; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 11px; | |
| } | |
| .guided-stepper label:has(input):hover { | |
| border-color: var(--ui-studio-border); | |
| color: var(--ui-studio-ink) !important; | |
| background: var(--ui-studio-soft) !important; | |
| } | |
| .guided-stepper label:has(input:checked) { | |
| border-color: var(--ui-studio-cobalt); | |
| color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-cobalt-soft) !important; | |
| } | |
| .guided-stepper input[type="radio"] { | |
| width: 24px !important; | |
| height: 24px !important; | |
| min-width: 24px !important; | |
| border-color: var(--ui-studio-border-strong) !important; | |
| border-radius: 9px !important; | |
| background: var(--ui-studio-surface) !important; | |
| } | |
| .guided-stepper input[type="radio"]:checked { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-cobalt) !important; | |
| } | |
| .guided-rail-note { | |
| margin-top: 24px; | |
| border: 0; | |
| border-radius: 12px; | |
| color: var(--ui-studio-muted); | |
| background: var(--ui-studio-soft); | |
| } | |
| .guided-rail-note strong { | |
| color: var(--ui-studio-ink); | |
| } | |
| .guided-canvas-heading { | |
| align-items: flex-start; | |
| margin-bottom: 16px; | |
| } | |
| .guided-canvas-heading h3 { | |
| color: var(--ui-studio-ink) !important; | |
| font-size: 18px !important; | |
| letter-spacing: -.02em; | |
| } | |
| .guided-canvas-heading small { | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| .studio-pipeline { | |
| display: grid !important; | |
| grid-template-columns: repeat(6, minmax(84px, 1fr)); | |
| grid-auto-flow: column; | |
| gap: 12px !important; | |
| align-items: stretch !important; | |
| overflow-x: hidden; | |
| overflow-y: hidden; | |
| padding: 18px 18px 24px !important; | |
| border: 1px solid var(--ui-studio-border) !important; | |
| border-radius: 16px !important; | |
| background: var(--ui-studio-surface) !important; | |
| scrollbar-color: var(--ui-studio-border-strong) transparent; | |
| scrollbar-width: thin; | |
| } | |
| .studio-pipeline > * { | |
| min-width: 0 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell { | |
| position: relative; | |
| min-width: 84px; | |
| min-height: 154px; | |
| overflow: visible; | |
| border: 1px solid var(--ui-studio-border) !important; | |
| border-top: 3px solid var(--ui-studio-cobalt) !important; | |
| border-radius: 12px !important; | |
| background: #fbfcfe !important; | |
| box-shadow: none; | |
| } | |
| /* Gradio can leave a visible duplicate wrapper behind when switching steps. | |
| Only the active panel carries its semantic heading. Collapse empty shells so | |
| they cannot create anonymous cards in the research canvas. */ | |
| .studio-primary > .guided-step-panel:not(:has(.guided-step-heading)) { | |
| display: none !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:not(:last-child)::after { | |
| content: ""; | |
| position: absolute; | |
| z-index: 0; | |
| top: 75px; | |
| left: 100%; | |
| width: 12px; | |
| height: 2px; | |
| background: var(--ui-studio-border-strong); | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:not(:last-child)::before { | |
| content: "›"; | |
| position: absolute; | |
| z-index: 2; | |
| top: 66px; | |
| right: -9px; | |
| color: var(--ui-studio-subtle); | |
| font-size: 14px; | |
| } | |
| .studio-pipeline .guided-pipeline-card-shell .guided-pipeline-card-shell { | |
| position: static; | |
| width: 100% !important; | |
| min-width: 0 !important; | |
| height: 100%; | |
| overflow: hidden; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-pipeline .guided-pipeline-card-output, | |
| .studio-pipeline .guided-pipeline-card-output > div, | |
| .studio-pipeline .guided-pipeline-card-output .html-container, | |
| .studio-pipeline .guided-pipeline-card-output .prose, | |
| .studio-pipeline .guided-pipeline-card-output .styler { | |
| width: 100% !important; | |
| min-width: 0 !important; | |
| max-width: 100% !important; | |
| height: 100%; | |
| padding: 0 !important; | |
| } | |
| .studio-pipeline .guided-pipeline-card-output { | |
| overflow: hidden !important; | |
| } | |
| .guided-pipeline-card-content { | |
| display: flex; | |
| flex-direction: column; | |
| width: 100%; | |
| min-width: 0; | |
| height: 100%; | |
| padding: 13px; | |
| color: var(--ui-studio-ink); | |
| background: transparent; | |
| } | |
| .guided-node-topline { | |
| display: grid; | |
| grid-template-columns: 26px minmax(0, 1fr); | |
| gap: 7px; | |
| align-items: center; | |
| } | |
| .guided-node-icon { | |
| display: grid; | |
| place-items: center; | |
| width: 26px; | |
| height: 26px; | |
| border-radius: 8px; | |
| color: var(--ui-studio-cobalt); | |
| background: var(--ui-studio-cobalt-soft); | |
| font: 600 9px/1 var(--ui-font-mono); | |
| } | |
| .guided-node-stage-name { | |
| min-width: 0; | |
| overflow: hidden; | |
| color: var(--ui-studio-muted); | |
| font-size: 10px; | |
| font-weight: 700; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-node-source { | |
| grid-column: 1 / -1; | |
| justify-self: start; | |
| max-width: 100%; | |
| overflow: hidden; | |
| padding: 0; | |
| border: 0; | |
| color: var(--ui-studio-muted); | |
| background: transparent; | |
| font: 500 8px/1.2 var(--ui-font-mono); | |
| letter-spacing: 0; | |
| text-overflow: ellipsis; | |
| text-transform: none; | |
| white-space: nowrap; | |
| } | |
| .guided-pipeline-card-content h4 { | |
| display: -webkit-box; | |
| min-height: 34px; | |
| margin: 12px 0 5px; | |
| overflow: hidden; | |
| color: var(--ui-studio-ink) !important; | |
| font-size: 12px; | |
| line-height: 1.35; | |
| -webkit-box-orient: vertical; | |
| -webkit-line-clamp: 2; | |
| } | |
| .guided-node-parameter { | |
| display: block; | |
| overflow: hidden; | |
| margin: 0; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 9px; | |
| line-height: 1.4; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-node-footer { | |
| align-items: end; | |
| margin-top: auto; | |
| padding-top: 10px; | |
| } | |
| .guided-node-shape { | |
| max-width: 64%; | |
| color: var(--ui-studio-subtle) !important; | |
| font: 500 8px/1.25 var(--ui-font-mono); | |
| } | |
| .guided-node-compatibility { | |
| gap: 3px; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 8px; | |
| } | |
| .guided-node-compatibility.compatible { | |
| color: var(--ui-studio-success) !important; | |
| } | |
| .guided-node-compatibility.review { | |
| color: var(--ui-studio-warning) !important; | |
| } | |
| .guided-node-compatibility.blocked { | |
| color: var(--ui-studio-danger) !important; | |
| } | |
| .guided-pipeline-card-content.is-selected { | |
| background: var(--ui-studio-cobalt-soft); | |
| box-shadow: inset 0 0 0 1px var(--ui-studio-cobalt); | |
| } | |
| .guided-node-selected { | |
| display: none; | |
| top: 10px; | |
| right: 10px; | |
| color: var(--ui-studio-cobalt) !important; | |
| font-size: 8px; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:has(.guided-pipeline-node-hitarea:hover) { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| transform: translateY(-1px); | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:has(.guided-pipeline-node-hitarea:focus-visible) { | |
| outline: 3px solid rgba(70, 107, 166, .28); | |
| outline-offset: 3px; | |
| } | |
| .guided-step-panel, | |
| .guided-refinement-box, | |
| .guided-snapshot-output { | |
| border-color: var(--ui-studio-border) !important; | |
| border-radius: 14px !important; | |
| background: var(--ui-studio-surface) !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-step-heading h3, | |
| .guided-dossier-heading h3, | |
| .guided-candidate-card h3, | |
| .guided-node-inspector h3, | |
| .guided-review h3, | |
| .guided-summary-status strong { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| .guided-step-heading p, | |
| .guided-dossier p, | |
| .guided-candidate-card p, | |
| .guided-node-inspector p, | |
| .guided-review p { | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| .guided-dossier-heading { | |
| margin: 0 0 16px; | |
| padding: 0 0 16px; | |
| border-bottom: 1px solid var(--ui-studio-border); | |
| border-radius: 0; | |
| background: transparent; | |
| } | |
| .guided-dossier-heading h3, | |
| .guided-dossier-heading span:first-child { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| .guided-research-provider { | |
| display: grid; | |
| justify-items: end; | |
| gap: 4px; | |
| min-width: 0; | |
| } | |
| .guided-research-provider small { | |
| color: var(--ui-studio-subtle); | |
| font-size: 8px; | |
| white-space: nowrap; | |
| } | |
| .guided-provider-badge { | |
| border-color: var(--ui-studio-border); | |
| color: var(--ui-studio-cobalt); | |
| background: var(--ui-studio-cobalt-soft); | |
| } | |
| .guided-research-insights { | |
| display: grid; | |
| gap: 2px; | |
| } | |
| .guided-research-insight { | |
| padding: 12px 0 12px 13px; | |
| border-left: 2px solid var(--ui-studio-border-strong); | |
| } | |
| .guided-research-insight h4, | |
| .guided-research-insight p { | |
| margin: 4px 0 0 !important; | |
| } | |
| .guided-insight-label { | |
| color: var(--ui-studio-cobalt); | |
| font: 600 8px/1.2 var(--ui-font-mono); | |
| letter-spacing: .06em; | |
| text-transform: uppercase; | |
| } | |
| .guided-candidate-list { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 14px; | |
| } | |
| .guided-plan-context { | |
| border-left-color: var(--ui-studio-cobalt); | |
| border-radius: 10px; | |
| background: var(--ui-studio-cobalt-soft); | |
| } | |
| .guided-candidate-card, | |
| .guided-node-inspector, | |
| .studio-detail, | |
| .guided-review { | |
| border: 1px solid var(--ui-studio-border) !important; | |
| border-radius: 14px !important; | |
| color: var(--ui-studio-ink) !important; | |
| background: var(--ui-studio-surface) !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-candidate-card { | |
| padding: 16px; | |
| } | |
| .guided-candidate-card.selected { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-cobalt-soft) !important; | |
| box-shadow: inset 0 0 0 1px var(--ui-studio-cobalt) !important; | |
| } | |
| .guided-candidate-index, | |
| .guided-selection-state { | |
| color: var(--ui-studio-cobalt) !important; | |
| letter-spacing: .06em; | |
| } | |
| .guided-candidate-section, | |
| .guided-dossier-block { | |
| border-top-color: var(--ui-studio-border); | |
| } | |
| .guided-estimate, | |
| .guided-inspector-grid > div, | |
| .guided-inspector-contract, | |
| .guided-review-grid > div, | |
| .guided-variant-status { | |
| border-color: var(--ui-studio-border); | |
| border-radius: 10px; | |
| background: var(--ui-studio-soft); | |
| } | |
| .guided-compatibility { | |
| border-radius: 8px; | |
| letter-spacing: .04em; | |
| } | |
| .guided-compatibility.compatible { | |
| border-color: #a7c7b9; | |
| color: var(--ui-studio-success); | |
| background: var(--ui-studio-success-soft); | |
| } | |
| .guided-compatibility.review { | |
| border-color: #d8c28e; | |
| color: var(--ui-studio-warning); | |
| background: var(--ui-studio-warning-soft); | |
| } | |
| .guided-compatibility.blocked { | |
| border-color: #d8abab; | |
| color: var(--ui-studio-danger); | |
| background: var(--ui-studio-danger-soft); | |
| } | |
| .guided-research-insight[data-insight-type="recommendation"] { | |
| border-left-color: var(--ui-studio-cobalt); | |
| } | |
| .guided-research-insight[data-insight-type="tradeoff"] { | |
| border-left-color: var(--ui-studio-warning); | |
| } | |
| .guided-research-insight[data-insight-type="assumption"] { | |
| border-left-color: var(--ui-studio-success); | |
| } | |
| .guided-research-insight[data-insight-type="warning"] { | |
| border-left-color: var(--ui-studio-danger); | |
| } | |
| .guided-refinement-box { | |
| margin-top: auto; | |
| border-color: var(--ui-studio-border) !important; | |
| border-radius: 12px !important; | |
| background: var(--ui-studio-surface) !important; | |
| } | |
| .guided-secondary-action { | |
| border-color: var(--ui-studio-border-strong) !important; | |
| border-radius: 10px !important; | |
| color: var(--ui-studio-ink) !important; | |
| background: var(--ui-studio-surface) !important; | |
| } | |
| .guided-secondary-action:hover { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-cobalt-soft) !important; | |
| } | |
| .studio-runbar { | |
| position: sticky; | |
| z-index: 5; | |
| bottom: 12px; | |
| overflow: hidden; | |
| margin-top: 16px; | |
| padding: 12px !important; | |
| border: 1px solid var(--ui-studio-border-strong) !important; | |
| border-radius: 14px !important; | |
| background: rgba(255, 255, 255, .97) !important; | |
| box-shadow: 0 16px 36px rgba(49, 68, 98, .14) !important; | |
| backdrop-filter: blur(14px); | |
| } | |
| .guided-summary-status { | |
| border-right-color: var(--ui-studio-border); | |
| } | |
| .guided-summary-status strong, | |
| .guided-summary-facts > span { | |
| color: var(--ui-studio-ink) !important; | |
| } | |
| .guided-summary-facts small { | |
| color: var(--ui-studio-muted) !important; | |
| } | |
| .studio-runbar .guided-primary-action { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| border-radius: 10px !important; | |
| color: #ffffff !important; | |
| background: var(--ui-studio-cobalt) !important; | |
| } | |
| .studio-runbar .guided-primary-action:hover { | |
| background: var(--ui-studio-cobalt-hover) !important; | |
| } | |
| .studio-runbar .guided-parallel-action { | |
| border-color: var(--ui-studio-border-strong) !important; | |
| border-radius: 10px !important; | |
| color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-surface) !important; | |
| } | |
| .guided-result-tabs .tab-nav { | |
| border-bottom-color: var(--ui-studio-border); | |
| } | |
| .guided-result-tabs .tab-nav button.selected { | |
| border-color: var(--ui-studio-cobalt) !important; | |
| color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-cobalt-soft) !important; | |
| } | |
| .results-shell .workbench-metric-grid .metric-card, | |
| .results-shell .run-context-card, | |
| .results-shell .artifact-panel, | |
| .results-shell .prediction-accordion { | |
| border-color: var(--ui-studio-border) !important; | |
| border-radius: 12px !important; | |
| background: var(--ui-studio-surface) !important; | |
| box-shadow: none !important; | |
| } | |
| body.dark .studio-workbench, | |
| body.dark .studio-workbench * { | |
| color-scheme: light; | |
| } | |
| body.dark .studio-workbench, | |
| body.dark .studio-pipeline, | |
| body.dark .studio-detail, | |
| body.dark .guided-step-panel, | |
| body.dark .guided-candidate-card, | |
| body.dark .guided-node-inspector, | |
| body.dark .studio-runbar { | |
| color: var(--ui-studio-ink) !important; | |
| background: var(--ui-studio-surface) !important; | |
| } | |
| body.dark .studio-primary { | |
| background: var(--ui-studio-bg) !important; | |
| } | |
| body.dark .studio-workflow, | |
| body.dark .studio-assistant { | |
| background: #fbfcfe !important; | |
| } | |
| @media (max-width: 1180px) { | |
| .studio-workbench { | |
| grid-template-columns: minmax(170px, .22fr) minmax(0, 1fr); | |
| } | |
| .studio-assistant { | |
| grid-column: 1 / -1; | |
| border-top: 1px solid var(--ui-studio-border) !important; | |
| border-left: 0 !important; | |
| } | |
| .guided-candidate-list { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| } | |
| @media (max-width: 800px) { | |
| .guided-workbench-heading { | |
| padding-right: 4px; | |
| padding-left: 4px; | |
| } | |
| .studio-workbench { | |
| display: flex !important; | |
| flex-direction: column !important; | |
| } | |
| .studio-workflow, | |
| .studio-primary, | |
| .studio-assistant { | |
| width: 100% !important; | |
| border-right: 0 !important; | |
| border-left: 0 !important; | |
| } | |
| .studio-workflow, | |
| .studio-assistant { | |
| border-bottom: 1px solid var(--ui-studio-border) !important; | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| display: grid !important; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| } | |
| .guided-candidate-columns, | |
| .guided-inspector-grid, | |
| .guided-review-grid { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| .studio-runbar { | |
| position: static; | |
| } | |
| } | |
| @media (max-width: 560px) { | |
| .studio-runbar { | |
| position: static; | |
| } | |
| .studio-primary, | |
| .studio-assistant, | |
| .studio-workflow { | |
| padding: 16px !important; | |
| } | |
| .guided-canvas-heading, | |
| .guided-dossier-heading { | |
| align-items: flex-start; | |
| flex-direction: column; | |
| gap: 8px; | |
| } | |
| .guided-research-provider { | |
| justify-items: start; | |
| } | |
| .studio-pipeline { | |
| grid-template-columns: minmax(0, 1fr); | |
| grid-template-rows: none; | |
| grid-auto-flow: row; | |
| gap: 18px !important; | |
| overflow-x: hidden; | |
| overflow-y: visible; | |
| padding: 14px !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell { | |
| min-width: 0; | |
| min-height: 142px; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:not(:last-child)::after { | |
| top: 100%; | |
| left: 50%; | |
| width: 2px; | |
| height: 18px; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:not(:last-child)::before { | |
| top: calc(100% + 4px); | |
| right: auto; | |
| left: calc(50% - 4px); | |
| transform: rotate(90deg); | |
| } | |
| .guided-estimate-grid, | |
| .guided-candidate-list { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| .guided-run-bar > .row, | |
| .guided-run-summary, | |
| .guided-summary-facts { | |
| align-items: stretch; | |
| flex-direction: column !important; | |
| } | |
| .guided-summary-status { | |
| width: 100%; | |
| padding: 0 0 10px; | |
| border-right: 0; | |
| border-bottom: 1px solid var(--ui-studio-border); | |
| } | |
| .guided-primary-action, | |
| .guided-parallel-action { | |
| width: 100% !important; | |
| } | |
| } | |
| @media (max-width: 340px) { | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| grid-template-columns: minmax(0, 1fr) !important; | |
| } | |
| } | |
| /* Faithful Direction C shell ------------------------------------------ */ | |
| .gradio-container:has(#workspace-tabs) { | |
| width: 100% !important; | |
| max-width: none !important; | |
| padding: 12px !important; | |
| color: #243047; | |
| background: #edf1f5 !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .main.app { | |
| padding: 0 !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .main.app > .wrap { | |
| border: 0 !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) main.contain, | |
| .gradio-container:has(#workspace-tabs) main.contain > .column { | |
| gap: 0 !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .block:has(.studio-product-header), | |
| .gradio-container:has(#workspace-tabs) .block:has(.studio-build-intro) { | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| background: transparent !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .block:has(.studio-product-header) .html-container { | |
| padding: 0 !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .block:has(.studio-build-intro) { | |
| display: none !important; | |
| } | |
| /* The intended-use notice is a disclaimer, so it stays on screen. It reads as | |
| a slim strip under the masthead rather than the stacked banner the legacy | |
| layout used. */ | |
| .block:has(.research-notice) { | |
| flex: 0 0 auto; | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .block:has(.research-notice) .html-container, | |
| .block:has(.research-notice) .prose { | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| } | |
| .research-notice { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 4px 10px; | |
| align-items: baseline; | |
| margin: 0 !important; | |
| padding: 8px 26px !important; | |
| border: 0 !important; | |
| border-bottom: 1px solid #e6ebf2 !important; | |
| border-radius: 0 !important; | |
| background: var(--ui-studio-soft) !important; | |
| } | |
| .research-notice .notice-title { | |
| flex: 0 0 auto; | |
| margin: 0 !important; | |
| color: #5b6a86 !important; | |
| font-size: 10px !important; | |
| font-weight: 700 !important; | |
| letter-spacing: .1em; | |
| text-transform: uppercase; | |
| } | |
| .research-notice p:not(.notice-title) { | |
| min-width: 0; | |
| margin: 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 11.5px !important; | |
| line-height: 1.45 !important; | |
| } | |
| .studio-product-header { | |
| display: flex; | |
| flex-direction: row; | |
| align-items: center; | |
| justify-content: space-between; | |
| height: 66px; | |
| min-height: 66px; | |
| margin: 0 !important; | |
| padding: 0 25px !important; | |
| border: 1px solid #dfe4ec; | |
| border-radius: 18px 18px 0 0; | |
| color: var(--ui-studio-ink); | |
| background: var(--ui-studio-surface); | |
| box-shadow: 0 10px 30px rgba(45, 55, 75, .05); | |
| } | |
| .studio-product-identity, | |
| .studio-product-profile { | |
| display: flex; | |
| align-items: center; | |
| gap: 11px; | |
| min-width: 0; | |
| } | |
| .studio-product-mark, | |
| .studio-profile-badge { | |
| display: grid; | |
| flex: 0 0 auto; | |
| place-items: center; | |
| width: 32px; | |
| height: 32px; | |
| border-radius: 10px; | |
| color: #ffffff; | |
| background: #415f99; | |
| font: 700 12px/1 var(--ui-font-mono); | |
| letter-spacing: -.02em; | |
| } | |
| .studio-product-identity h1 { | |
| margin: 0 !important; | |
| color: var(--ui-studio-ink) !important; | |
| font-size: 17px !important; | |
| font-weight: 700 !important; | |
| line-height: 1.15 !important; | |
| letter-spacing: -.015em; | |
| } | |
| .studio-product-identity p, | |
| .studio-product-profile > span:first-child { | |
| margin: 2px 0 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 12px !important; | |
| line-height: 1.2; | |
| } | |
| .studio-product-profile > span:first-child { | |
| margin: 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-weight: 600; | |
| } | |
| .studio-profile-badge { | |
| width: 28px; | |
| height: 28px; | |
| border: 1px solid #d4dbe7; | |
| border-radius: 50%; | |
| color: var(--ui-studio-muted); | |
| background: var(--ui-studio-soft); | |
| font-size: 11px; | |
| } | |
| #workspace-tabs { | |
| position: relative; | |
| gap: 0 !important; | |
| overflow: visible; | |
| margin: 0 !important; | |
| width: 100% !important; | |
| border: 1px solid #dfe4ec !important; | |
| border-top: 0 !important; | |
| border-radius: 0 0 18px 18px !important; | |
| background: #f7f8fb !important; | |
| box-shadow: 0 18px 45px rgba(45, 55, 75, .07); | |
| } | |
| #workspace-tabs > .tabitem { | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| overflow: hidden; | |
| border-radius: 0 0 18px 18px; | |
| } | |
| /* The nav pills sit in the masthead, which is two blocks above the tab group | |
| (masthead + intended-use strip). The shell layout pins them to the viewport | |
| instead; this offset covers the short-viewport fallback. */ | |
| #workspace-tabs > .tab-wrapper { | |
| position: absolute !important; | |
| z-index: 12; | |
| top: -79px; | |
| left: 50%; | |
| width: auto !important; | |
| /* Reserve room for all account tabs plus Gradio's temporary overflow control. | |
| Its measured tab area excludes that control while recovering from login. */ | |
| min-width: min(480px, 100%); | |
| justify-content: center; | |
| transform: translateX(-50%); | |
| } | |
| #workspace-tabs > .tab-wrapper .tab-container, | |
| #workspace-tabs > .tab-wrapper .tab-nav { | |
| display: flex; | |
| gap: 2px; | |
| width: max-content; | |
| padding: 4px; | |
| border: 0 !important; | |
| border-radius: 11px; | |
| background: #f0f2f6 !important; | |
| } | |
| /* Gradio measures this visible container, not its wrapper. Keep its width | |
| independent of how many tab buttons the overflow calculation currently shows. */ | |
| #workspace-tabs > .tab-wrapper > .tab-container[role="tablist"] { | |
| width: 100%; | |
| justify-content: center; | |
| } | |
| #workspace-tabs > .tab-wrapper button { | |
| min-width: 62px !important; | |
| min-height: 32px !important; | |
| padding: 7px 13px !important; | |
| border: 0 !important; | |
| border-radius: 8px !important; | |
| color: var(--ui-studio-muted) !important; | |
| background: transparent !important; | |
| font-size: 12px !important; | |
| font-weight: 650 !important; | |
| box-shadow: none !important; | |
| } | |
| #workspace-tabs > .tab-wrapper button.selected { | |
| color: #344562 !important; | |
| background: #ffffff !important; | |
| box-shadow: 0 1px 5px rgba(52, 69, 98, .12) !important; | |
| } | |
| .studio-workbench { | |
| display: grid !important; | |
| grid-template-columns: 205px minmax(0, 1fr) 300px; | |
| gap: 0 !important; | |
| min-height: 0; | |
| margin: 0 !important; | |
| overflow: visible; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: #f7f8fb !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-workbench > .column { | |
| width: auto !important; | |
| min-width: 0 !important; | |
| max-width: none !important; | |
| border-radius: 0 !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-workflow { | |
| position: static !important; | |
| padding: 27px 21px !important; | |
| border: 0 !important; | |
| border-right: 1px solid #e2e6ed !important; | |
| background: #fbfcfd !important; | |
| } | |
| .studio-primary { | |
| padding: 27px 25px 32px !important; | |
| border: 0 !important; | |
| background: #f7f8fb !important; | |
| } | |
| .studio-assistant { | |
| position: static !important; | |
| grid-column: auto; | |
| max-height: none; | |
| padding: 25px 20px 20px !important; | |
| overflow-x: hidden; | |
| border: 0 !important; | |
| border-left: 1px solid #e2e6ed !important; | |
| background: #fbfcfd !important; | |
| } | |
| .guided-rail-label { | |
| margin: 0 8px 15px !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 11px !important; | |
| font-weight: 700 !important; | |
| letter-spacing: .12em; | |
| } | |
| .guided-stepper, | |
| .guided-stepper.fieldset, | |
| fieldset.guided-stepper, | |
| .guided-stepper fieldset, | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-workflow .form { | |
| gap: 0 !important; | |
| border: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| display: grid !important; | |
| grid-template-columns: minmax(0, 1fr) !important; | |
| gap: 3px !important; | |
| } | |
| .guided-stepper label:has(input) { | |
| min-height: 45px; | |
| margin: 0 !important; | |
| padding: 7px 8px !important; | |
| border: 1px solid transparent !important; | |
| border-radius: 10px; | |
| color: var(--ui-studio-muted) !important; | |
| background: transparent !important; | |
| font-size: 13px !important; | |
| font-weight: 600; | |
| } | |
| .guided-stepper label:has(input):hover { | |
| color: #3f4c64 !important; | |
| background: #f2f4f7 !important; | |
| } | |
| .guided-stepper label:has(input:checked) { | |
| border-color: #d8e0ed !important; | |
| color: #3f5680 !important; | |
| background: #eef3fb !important; | |
| } | |
| /* Numbered stepper: the native radio stays in the DOM for keyboard and | |
| assistive-technology use, but the visible control is a numbered badge drawn | |
| from a counter so the rail reads as a workflow rather than a form. */ | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| counter-reset: studio-step; | |
| } | |
| .guided-stepper label:has(input) { | |
| display: grid !important; | |
| grid-template-columns: 28px minmax(0, 1fr); | |
| gap: 11px; | |
| align-items: center; | |
| counter-increment: studio-step; | |
| } | |
| .guided-stepper label:has(input)::before { | |
| content: counter(studio-step); | |
| display: grid; | |
| place-items: center; | |
| width: 28px; | |
| height: 28px; | |
| border: 1px solid #d8deea; | |
| border-radius: 9px; | |
| color: var(--ui-studio-muted); | |
| background: #ffffff; | |
| font-family: var(--ui-font-mono); | |
| font-size: 11px; | |
| font-weight: 700; | |
| transition: color .12s ease, background-color .12s ease, border-color .12s ease; | |
| } | |
| .guided-stepper label:has(input:checked)::before { | |
| border-color: #708fc5; | |
| color: #ffffff; | |
| background: #456aa9; | |
| box-shadow: 0 5px 12px rgba(69, 106, 169, .2); | |
| } | |
| .guided-stepper input[type="radio"] { | |
| position: absolute !important; | |
| width: 1px !important; | |
| height: 1px !important; | |
| min-width: 0 !important; | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| opacity: 0 !important; | |
| pointer-events: none; | |
| } | |
| .guided-stepper label:has(input:focus-visible) { | |
| outline: 2px solid #6c8cc4; | |
| outline-offset: 1px; | |
| } | |
| .guided-rail-note { | |
| display: grid; | |
| gap: 6px; | |
| margin: 23px 4px 0; | |
| padding: 14px; | |
| border: 1px solid #e2e6ed !important; | |
| border-radius: 11px; | |
| color: var(--ui-studio-muted); | |
| background: #f5f7f9; | |
| } | |
| .guided-rail-note strong { | |
| color: #3f4c62; | |
| font-size: 12px; | |
| } | |
| .guided-rail-note span { | |
| font-size: 12px; | |
| line-height: 1.45; | |
| } | |
| .guided-canvas-heading { | |
| align-items: center; | |
| margin: 0 0 20px; | |
| } | |
| .guided-canvas-heading h2 { | |
| margin: 0 !important; | |
| color: #273248 !important; | |
| font-size: 28px !important; | |
| font-weight: 650 !important; | |
| line-height: 1.15 !important; | |
| letter-spacing: -.035em; | |
| } | |
| .guided-canvas-heading p { | |
| max-width: 570px; | |
| margin: 6px 0 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 13px; | |
| line-height: 1.45; | |
| } | |
| .guided-quality-badge { | |
| flex: 0 0 auto; | |
| padding: 6px 9px; | |
| border: 1px solid #c8ddd4; | |
| border-radius: 999px; | |
| color: #527565 !important; | |
| background: #edf6f2; | |
| font-size: 11px !important; | |
| font-weight: 700; | |
| letter-spacing: 0 !important; | |
| text-transform: none !important; | |
| } | |
| .guided-pipeline-meta { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| gap: 12px; | |
| margin-bottom: 8px; | |
| padding: 0 2px; | |
| } | |
| .guided-pipeline-meta strong { | |
| color: #4b5870; | |
| font-size: 12px; | |
| } | |
| .guided-pipeline-meta span { | |
| color: var(--ui-studio-muted); | |
| font-size: 11px; | |
| } | |
| .studio-pipeline { | |
| display: grid !important; | |
| grid-template-columns: repeat(6, minmax(0, 1fr)); | |
| grid-auto-flow: column; | |
| gap: 11px !important; | |
| align-items: stretch !important; | |
| margin: 0 0 18px !important; | |
| padding: 17px 17px 22px !important; | |
| overflow: visible; | |
| border: 1px solid #e1e5ec !important; | |
| border-radius: 15px !important; | |
| background: #ffffff !important; | |
| box-shadow: 0 4px 12px rgba(52, 65, 88, .025) !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell { | |
| position: relative; | |
| min-width: 0; | |
| min-height: 184px; | |
| overflow: visible; | |
| border: 1px solid #e1e5ec !important; | |
| border-top: 3px solid #5f91c7 !important; | |
| border-radius: 11px !important; | |
| background: #fafbfc !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(2) { | |
| border-top-color: #7c8fc4 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(3) { | |
| border-top-color: #997eb7 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(4) { | |
| border-top-color: #b48096 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(5) { | |
| border-top-color: #b98667 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(6) { | |
| border-top-color: #759c88 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:not(:last-child)::after { | |
| top: 68px; | |
| left: 100%; | |
| width: 11px; | |
| height: 1px; | |
| background: #ccd3de; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:not(:last-child)::before { | |
| top: 61px; | |
| right: -8px; | |
| color: #a8b0be; | |
| font-size: 12px; | |
| } | |
| .guided-pipeline-card-content { | |
| min-height: 181px; | |
| padding: 15px 13px 12px; | |
| color: #2f3a50; | |
| } | |
| .guided-node-topline { | |
| display: grid; | |
| grid-template-columns: 25px minmax(0, 1fr); | |
| gap: 7px; | |
| align-items: center; | |
| } | |
| .guided-node-icon { | |
| width: 30px; | |
| height: 30px; | |
| border-radius: 7px; | |
| color: #526fa4; | |
| background: #eaf0f8; | |
| font: 650 11px/1 var(--ui-font-mono); | |
| } | |
| .guided-node-stage-name { | |
| min-width: 0; | |
| color: var(--ui-studio-muted); | |
| font-size: 11px; | |
| font-weight: 700; | |
| line-height: 1.2; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-node-source { | |
| grid-column: 1 / -1; | |
| justify-self: start; | |
| max-width: 100%; | |
| margin-top: 4px; | |
| overflow: hidden; | |
| color: var(--ui-studio-muted); | |
| font: 600 10px/1.2 var(--ui-font-mono); | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-pipeline-card-content h4 { | |
| display: -webkit-box; | |
| min-height: 37px; | |
| margin: 12px 0 5px !important; | |
| overflow: hidden; | |
| color: #303b50 !important; | |
| font-size: 14px !important; | |
| font-weight: 700; | |
| line-height: 1.35 !important; | |
| -webkit-box-orient: vertical; | |
| -webkit-line-clamp: 2; | |
| } | |
| .guided-node-parameter { | |
| display: block; | |
| max-width: 100%; | |
| margin: 0 !important; | |
| overflow: hidden; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 11px; | |
| line-height: 1.35; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-node-footer { | |
| justify-content: flex-end; | |
| margin-top: auto; | |
| padding-top: 7px; | |
| border-top: 1px solid #eaedf2; | |
| } | |
| .guided-node-shape { | |
| display: none; | |
| } | |
| .guided-node-compatibility { | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 10px; | |
| } | |
| .guided-node-compatibility b { | |
| display: grid; | |
| place-items: center; | |
| width: 16px; | |
| height: 16px; | |
| border-radius: 50%; | |
| color: #ffffff; | |
| background: #6d9a86; | |
| font-size: 10px; | |
| } | |
| .guided-node-compatibility.review b { | |
| background: #b89754; | |
| } | |
| .guided-node-compatibility.blocked b { | |
| background: #aa6262; | |
| } | |
| .guided-pipeline-card-content.is-selected { | |
| background: #eef3fb; | |
| box-shadow: inset 0 0 0 1px #6680ad; | |
| } | |
| .guided-pipeline-card-content.is-selected h4 { | |
| padding-right: 0; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:has(.guided-pipeline-node-hitarea:hover) { | |
| border-color: #aab8ce !important; | |
| transform: translateY(-2px); | |
| box-shadow: 0 8px 18px rgba(63, 78, 105, .08) !important; | |
| } | |
| .guided-step-panel, | |
| .guided-refinement-box, | |
| .guided-snapshot-output { | |
| border: 1px solid #e1e5ec !important; | |
| border-radius: 12px !important; | |
| background: #ffffff !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-step-panel { | |
| padding: 17px !important; | |
| } | |
| /* Secure access card ---------------------------------------------------- | |
| The sign-in screen is the first surface a user sees, so it carries the same | |
| type, surfaces, and controls as the workbench. */ | |
| .account-card:not(.account-card .account-card) { | |
| width: min(432px, 100%); | |
| max-width: none; | |
| margin: clamp(40px, 9vh, 92px) auto 40px !important; | |
| padding: 30px 30px 32px !important; | |
| border: 1px solid #e2e6ed !important; | |
| border-radius: 18px !important; | |
| background: #ffffff !important; | |
| box-shadow: 0 18px 44px rgba(45, 55, 75, .08) !important; | |
| } | |
| .account-card .account-card, | |
| .account-card .styler, | |
| .account-card .form, | |
| .account-card .block, | |
| .account-card .container, | |
| .account-card .input-container { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| /* Beats the global `label.container.show_textbox_border` rule so the field's | |
| border is drawn once, on the control itself. */ | |
| .account-card label.container.show_textbox_border, | |
| .account-card .container.show_textbox_border { | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| } | |
| .account-card .form { | |
| display: grid !important; | |
| gap: 16px !important; | |
| margin-top: 18px !important; | |
| } | |
| .account-card h2 { | |
| margin: 0 0 6px !important; | |
| padding: 0 !important; | |
| color: #273248 !important; | |
| font-size: 22px !important; | |
| font-weight: 650 !important; | |
| letter-spacing: -.02em; | |
| } | |
| .account-card .prose p { | |
| margin: 0 0 4px !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 13px !important; | |
| } | |
| .account-card .tab-wrapper .tab-container, | |
| .account-card .tab-wrapper .tab-nav, | |
| .account-card .tab-container, | |
| .account-card .tab-nav { | |
| gap: 2px; | |
| margin: 16px 0 4px; | |
| padding: 4px; | |
| border: 0 !important; | |
| border-radius: 11px; | |
| background: #f0f2f6 !important; | |
| } | |
| .account-card .tab-nav button, | |
| .account-card .tab-container button { | |
| min-height: 34px !important; | |
| padding: 7px 13px !important; | |
| border: 0 !important; | |
| border-radius: 8px !important; | |
| color: var(--ui-studio-muted) !important; | |
| background: transparent !important; | |
| font-size: 12.5px !important; | |
| font-weight: 650 !important; | |
| box-shadow: none !important; | |
| } | |
| .account-card .tab-nav button.selected, | |
| .account-card .tab-container button.selected { | |
| color: #344562 !important; | |
| background: #ffffff !important; | |
| box-shadow: 0 1px 5px rgba(52, 69, 98, .12) !important; | |
| } | |
| /* The pill treatment replaces the underline Gradio draws on the active tab. */ | |
| .account-card .tab-nav button::after, | |
| .account-card .tab-nav button::before, | |
| .account-card .tab-container button::after, | |
| .account-card .tab-container button::before { | |
| content: none !important; | |
| display: none !important; | |
| } | |
| .account-card label > span, | |
| .account-card .block > label > span { | |
| margin-bottom: 6px !important; | |
| padding: 0 !important; | |
| color: #5d6a80 !important; | |
| background: transparent !important; | |
| font-size: 12px !important; | |
| font-weight: 650 !important; | |
| } | |
| .account-card input[type="text"], | |
| .account-card input[type="password"], | |
| .account-card textarea { | |
| min-height: 42px !important; | |
| padding: 10px 13px !important; | |
| border: 1px solid #cfd7e3 !important; | |
| border-radius: 9px !important; | |
| color: #2b3648 !important; | |
| background: #ffffff !important; | |
| box-shadow: none !important; | |
| font-size: 13.5px !important; | |
| } | |
| .account-card input[type="text"]:focus, | |
| .account-card input[type="password"]:focus, | |
| .account-card textarea:focus { | |
| border-color: #526fa6 !important; | |
| box-shadow: 0 0 0 3px rgba(82, 111, 166, .14) !important; | |
| outline: 0 !important; | |
| } | |
| .account-card button.primary { | |
| width: 100%; | |
| min-height: 44px !important; | |
| margin-top: 6px !important; | |
| border: 0 !important; | |
| border-radius: 10px !important; | |
| color: #ffffff !important; | |
| background: #456aa9 !important; | |
| box-shadow: none !important; | |
| font-size: 13.5px !important; | |
| font-weight: 700 !important; | |
| } | |
| .account-card button.primary:hover { | |
| background: #3a5c95 !important; | |
| } | |
| /* Runs / Models / Account ----------------------------------------------- | |
| These tabs never received the studio treatment, so they inherited the older | |
| palette and sat flush against the window edge. Give them the same page | |
| frame, surfaces, and type as the Build workbench. */ | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) { | |
| gap: 20px !important; | |
| padding: 28px clamp(20px, 2.6vw, 38px) 44px !important; | |
| background: #f7f8fb !important; | |
| } | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) .panel-card, | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) .results-shell, | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) > .gr-group, | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) > .row > .column > .gr-group { | |
| border: 1px solid #e2e6ed !important; | |
| border-radius: 16px !important; | |
| background: #ffffff !important; | |
| box-shadow: none !important; | |
| } | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) .panel-card { | |
| padding: 22px !important; | |
| } | |
| /* Gradio renders a group as two nested wrappers plus a `.styler`, so the | |
| surface has to be declared once on the outer wrapper and cleared on the | |
| rest — otherwise the card shows a doubled border and the old slate band. */ | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) .panel-card .panel-card, | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) .panel-card .styler, | |
| #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) .results-shell .styler { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .account-strip { | |
| gap: 14px !important; | |
| align-items: center !important; | |
| margin-top: 16px !important; | |
| padding-top: 16px !important; | |
| border: 0 !important; | |
| border-top: 1px solid #e6e9ef !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| } | |
| #workspace-tabs > .tabitem .guided-workbench-heading { | |
| gap: 20px; | |
| align-items: flex-end; | |
| margin: 0 !important; | |
| padding: 0 0 18px !important; | |
| border-bottom: 1px solid #e2e6ed; | |
| } | |
| #workspace-tabs > .tabitem .guided-workbench-heading h2 { | |
| margin: 0 !important; | |
| color: #273248 !important; | |
| font-size: 26px !important; | |
| font-weight: 650 !important; | |
| letter-spacing: -.03em; | |
| } | |
| #workspace-tabs > .tabitem .guided-workbench-heading > p { | |
| max-width: 460px; | |
| margin: 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 13px !important; | |
| line-height: 1.5; | |
| } | |
| #workspace-tabs .gr-dataframe thead th, | |
| #workspace-tabs table thead th { | |
| font-size: 12px !important; | |
| } | |
| /* Gradio's flex containers wrap by default, which turns any height-bounded | |
| column into a second, off-screen column instead of a scroll region. */ | |
| .studio-workbench .column, | |
| .studio-workbench .gr-group, | |
| .studio-workbench .styler, | |
| .studio-workbench .form, | |
| .studio-runbar .column, | |
| .studio-runbar .gr-group, | |
| .studio-runbar .styler { | |
| flex-wrap: nowrap !important; | |
| } | |
| .studio-workbench .gr-group, | |
| .studio-workbench .styler, | |
| .guided-step-panel { | |
| overflow: visible !important; | |
| } | |
| .studio-primary .form { | |
| gap: 10px !important; | |
| border: 0 !important; | |
| } | |
| .studio-primary .wrap { | |
| overflow: hidden; | |
| border: 1px solid #dce2ea !important; | |
| border-radius: 9px !important; | |
| color: #3f4c62 !important; | |
| background: #ffffff !important; | |
| } | |
| /* An open dropdown list ships with no border and a 1px shadow, so over a light | |
| panel it reads as loose text lying behind the page rather than a menu in | |
| front of it — and the option under the pointer is easy to misjudge. Give it | |
| a real panel and an unambiguous hover target. */ | |
| .gradio-container ul.options { | |
| padding: 4px !important; | |
| border: 1px solid var(--ui-studio-border) !important; | |
| border-radius: 10px !important; | |
| background: var(--ui-studio-surface) !important; | |
| box-shadow: 0 14px 34px rgba(38, 52, 76, .18), | |
| 0 2px 6px rgba(38, 52, 76, .10) !important; | |
| /* Gradio fades and slides the list in with a script-driven transition, so | |
| for a beat the menu is translucent and sitting a few pixels above where it | |
| will settle. A pointer that lands in that window is ambiguous between an | |
| option and whatever the menu opened over. There is not always room below | |
| the field, and when the list opens upward over the data source radios the | |
| "Lung" row comes to rest exactly on "Upload data" — which is why the | |
| mis-click reproduced at some widths and not others. Presenting the list at | |
| its final opacity and offset immediately removes the ambiguous window: the | |
| menu is either absent or fully painted where it accepts clicks. These | |
| override the inline style the transition writes. */ | |
| opacity: 1 !important; | |
| transform: none !important; | |
| } | |
| .gradio-container ul.options li.item { | |
| border-radius: 7px !important; | |
| color: var(--ui-studio-ink) !important; | |
| background: transparent !important; | |
| } | |
| .gradio-container ul.options li.item.active, | |
| .gradio-container ul.options li.item:hover { | |
| color: var(--ui-studio-ink) !important; | |
| background: var(--ui-studio-soft) !important; | |
| } | |
| .gradio-container ul.options li.item.selected { | |
| color: var(--ui-studio-cobalt) !important; | |
| background: var(--ui-studio-cobalt-soft) !important; | |
| font-weight: 600; | |
| } | |
| .studio-primary label:has(input[type="radio"]), | |
| .studio-primary label:has(input[type="checkbox"]) { | |
| color: #566277 !important; | |
| background: #ffffff !important; | |
| } | |
| .studio-primary label:has(input[type="radio"]):hover, | |
| .studio-primary label:has(input[type="checkbox"]):hover { | |
| background: #f5f7fa !important; | |
| } | |
| .studio-primary label.selected, | |
| .studio-primary label:has(input[type="radio"]:checked), | |
| .studio-primary label:has(input[type="checkbox"]:checked) { | |
| color: #3f5680 !important; | |
| background: #eaf0f9 !important; | |
| } | |
| .studio-primary label.selected span, | |
| .studio-primary label:has(input[type="radio"]:checked) span, | |
| .studio-primary label:has(input[type="checkbox"]:checked) span { | |
| color: #3f5680 !important; | |
| } | |
| .studio-primary input[type="radio"], | |
| .studio-primary input[type="checkbox"] { | |
| border-color: #aeb9ca !important; | |
| background: #ffffff !important; | |
| } | |
| .studio-primary input[type="radio"]:checked, | |
| .studio-primary input[type="checkbox"]:checked { | |
| border-color: #526fa6 !important; | |
| background: #526fa6 !important; | |
| } | |
| .guided-step-heading > span { | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 11px; | |
| } | |
| .guided-step-heading h3 { | |
| margin-top: 4px !important; | |
| color: #303b50 !important; | |
| font-size: 18px !important; | |
| } | |
| .guided-step-heading p { | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 13px; | |
| } | |
| .guided-dossier-output, | |
| .guided-dossier-output > div, | |
| .guided-dossier-output .html-container, | |
| .guided-dossier-output .prose { | |
| min-width: 0; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| background: transparent !important; | |
| } | |
| .guided-dossier-empty, | |
| .guided-dossier { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| background: transparent !important; | |
| } | |
| .guided-empty-agent-heading, | |
| .guided-dossier-heading { | |
| display: flex; | |
| align-items: center; | |
| justify-content: flex-start; | |
| gap: 10px; | |
| margin: 0 0 14px; | |
| padding: 0 0 14px; | |
| border-bottom: 1px solid #e5e9ef; | |
| } | |
| .guided-research-icon { | |
| display: grid; | |
| flex: 0 0 auto; | |
| place-items: center; | |
| width: 36px; | |
| height: 36px; | |
| border-radius: 10px; | |
| color: #526a93; | |
| background: #e8eef7; | |
| font: 700 11px/1 var(--ui-font-mono); | |
| } | |
| .guided-empty-agent-heading h3, | |
| .guided-dossier-heading h3 { | |
| margin: 0 !important; | |
| color: #303b50 !important; | |
| font-size: 16px !important; | |
| line-height: 1.2; | |
| } | |
| .guided-empty-agent-heading small, | |
| .guided-research-provider small { | |
| display: block; | |
| margin-top: 3px; | |
| color: var(--ui-studio-muted); | |
| font-size: 11px; | |
| } | |
| .guided-agent-intro { | |
| margin: 0 0 14px !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 13px; | |
| line-height: 1.5; | |
| } | |
| .guided-empty-insight, | |
| .guided-research-insight { | |
| display: block; | |
| padding: 13px !important; | |
| border: 1px solid #e1e5ec !important; | |
| border-left: 3px solid #879bbd !important; | |
| border-radius: 10px; | |
| background: #ffffff; | |
| } | |
| .guided-empty-insight span, | |
| .guided-insight-label { | |
| color: var(--ui-studio-muted) !important; | |
| font: 700 10px/1.2 var(--ui-font-mono); | |
| letter-spacing: .07em; | |
| text-transform: uppercase; | |
| } | |
| .guided-empty-insight h4, | |
| .guided-research-insight h4 { | |
| margin: 6px 0 4px !important; | |
| color: #3a465b !important; | |
| font-size: 14px !important; | |
| line-height: 1.35; | |
| } | |
| .guided-empty-insight p, | |
| .guided-research-insight p { | |
| margin: 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 12px; | |
| line-height: 1.5; | |
| } | |
| .guided-research-insights { | |
| display: grid; | |
| gap: 8px; | |
| } | |
| .guided-research-insight[data-insight-type="recommendation"] { | |
| border-left-color: #7188af !important; | |
| } | |
| .guided-research-insight[data-insight-type="tradeoff"] { | |
| border-left-color: #b39154 !important; | |
| } | |
| .guided-research-insight[data-insight-type="assumption"] { | |
| border-left-color: #719481 !important; | |
| } | |
| .guided-research-insight[data-insight-type="warning"] { | |
| border-left-color: #a86868 !important; | |
| } | |
| .guided-provider-note { | |
| margin: 13px 2px 0 !important; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 10px !important; | |
| line-height: 1.45; | |
| } | |
| .guided-refinement-box { | |
| margin-top: auto; | |
| padding: 12px !important; | |
| background: #f7f8fa !important; | |
| } | |
| .guided-refinement-box label span { | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 12px !important; | |
| } | |
| .guided-refinement-box textarea { | |
| min-height: 50px !important; | |
| border-color: #dce2ea !important; | |
| color: #3c485d !important; | |
| background: #ffffff !important; | |
| font-size: 13px !important; | |
| } | |
| .guided-refinement-box button { | |
| min-height: 38px !important; | |
| font-size: 12px !important; | |
| } | |
| .studio-runbar { | |
| position: static; | |
| z-index: auto; | |
| min-height: 78px; | |
| margin: 0 !important; | |
| padding: 13px 23px !important; | |
| overflow: hidden; | |
| border: 0 !important; | |
| border-top: 1px solid #e1e5ec !important; | |
| border-radius: 0 0 18px 18px !important; | |
| background: #ffffff !important; | |
| box-shadow: none !important; | |
| backdrop-filter: none; | |
| } | |
| .studio-runbar > .row { | |
| min-height: 50px; | |
| align-items: center !important; | |
| flex-wrap: nowrap !important; | |
| } | |
| .studio-runbar .guided-primary-action, | |
| .studio-runbar .guided-parallel-action { | |
| min-width: 150px !important; | |
| min-height: 38px !important; | |
| border-radius: 9px !important; | |
| font-size: 12px !important; | |
| } | |
| .guided-summary-status > span { | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 10px; | |
| } | |
| .guided-summary-status strong, | |
| .guided-summary-facts > span { | |
| color: #3c485c !important; | |
| font-size: 12px; | |
| } | |
| .guided-summary-facts small { | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 10px; | |
| } | |
| /* Direction C flat hierarchy ----------------------------------------- */ | |
| .gradio-container:has(#workspace-tabs) { | |
| padding: 0 !important; | |
| background: #f7f8fb !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .main.app, | |
| .gradio-container:has(#workspace-tabs) .main.app > .wrap, | |
| .gradio-container:has(#workspace-tabs) main.contain, | |
| .gradio-container:has(#workspace-tabs) main.contain > .column { | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: #f7f8fb !important; | |
| box-shadow: none !important; | |
| } | |
| /* Gradio caps `.main.app` at 1280px. The studio shell is an application | |
| surface, not an article column, so it takes the full window (capped so the | |
| pipeline track does not stretch absurdly on ultrawide displays). */ | |
| .gradio-container:has(#workspace-tabs) .main.app { | |
| width: 100% !important; | |
| max-width: min(1760px, 100%) !important; | |
| margin: 0 auto !important; | |
| } | |
| .studio-product-header { | |
| border: 0 !important; | |
| border-bottom: 1px solid #e1e5ec !important; | |
| border-radius: 0 !important; | |
| box-shadow: none !important; | |
| } | |
| #workspace-tabs, | |
| #workspace-tabs > .tabitem { | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-workbench, | |
| .studio-primary, | |
| .studio-workflow, | |
| .studio-assistant { | |
| border-radius: 0 !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-primary .block:has(.guided-canvas-heading), | |
| .studio-workflow .block:has(.guided-rail-label), | |
| .studio-workflow .block:has(.guided-rail-note) { | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-canvas-heading { | |
| padding: 0; | |
| background: transparent; | |
| } | |
| .guided-rail-note { | |
| margin: 24px 8px 0; | |
| padding: 16px 0 0; | |
| border: 0 !important; | |
| border-top: 1px solid #e3e7ed !important; | |
| border-radius: 0; | |
| background: transparent; | |
| } | |
| .studio-pipeline { | |
| padding: 18px !important; | |
| border: 1px solid #e2e6ed !important; | |
| border-radius: 16px !important; | |
| background: #ffffff !important; | |
| box-shadow: none !important; | |
| /* The canvas is a height-bounded flex column, so the track was shrunk to fit | |
| alongside the step panel and became its own scroller — at 1512x900 that | |
| clipped it to 122px and hid the whole second row. The track keeps its | |
| natural height; the canvas column is what scrolls. */ | |
| flex: 0 0 auto !important; | |
| overflow: visible !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell { | |
| border: 1px solid #e5e9f0 !important; | |
| border-top: 3px solid #5f91c7 !important; | |
| border-radius: 12px !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| /* Clip the card body to the shell's radius; without this the square inner | |
| corners show through and the card reads as two stacked rectangles. */ | |
| overflow: hidden !important; | |
| transition: transform .14s ease, box-shadow .14s ease, | |
| border-color .14s ease, background-color .14s ease; | |
| } | |
| /* Gradio inserts a `.styler` between the group and its content, and that | |
| element carries a slate fill of its own. Left alone it paints over the card | |
| surface, which is why only the selected card — the one that sets its own | |
| background — looked right. */ | |
| .studio-pipeline .guided-pipeline-card-shell .guided-pipeline-card-shell, | |
| .studio-pipeline .styler, | |
| .studio-pipeline .guided-pipeline-card-output, | |
| .studio-pipeline .guided-pipeline-card-output > div, | |
| .studio-pipeline .html-container, | |
| .studio-pipeline .prose { | |
| background: transparent !important; | |
| } | |
| .studio-pipeline .guided-pipeline-card-shell .guided-pipeline-card-shell { | |
| overflow: hidden !important; | |
| } | |
| /* The surface and the selected tint live on the card body, not the shell: | |
| several older rules target the shell (a `.gr-group`) with `!important` and | |
| win the cascade there. The shell keeps the border, radius and clipping. */ | |
| .studio-pipeline .guided-pipeline-card-content { | |
| background: #fbfcfe; | |
| box-shadow: none; | |
| transition: background-color .14s ease, box-shadow .14s ease; | |
| } | |
| .studio-pipeline .guided-pipeline-card-content.is-selected { | |
| background: #edf3fc; | |
| box-shadow: inset 0 0 0 1px #9db6dd; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(2) { | |
| border-top-color: #7c8fc4 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(3) { | |
| border-top-color: #997eb7 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(4) { | |
| border-top-color: #b48096 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(5) { | |
| border-top-color: #b98667 !important; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(6) { | |
| border-top-color: #759c88 !important; | |
| } | |
| /* Hover only lifts the card. The stage accent along the top edge is never | |
| recoloured, so each stage keeps its identity in every state. */ | |
| .studio-pipeline > .guided-pipeline-card-shell:has(.guided-pipeline-node-hitarea:hover) { | |
| border-right-color: #ccd7e7 !important; | |
| border-bottom-color: #ccd7e7 !important; | |
| border-left-color: #ccd7e7 !important; | |
| transform: translateY(-2px); | |
| box-shadow: 0 10px 22px rgba(63, 78, 105, .10) !important; | |
| } | |
| .guided-step-panel { | |
| padding: 24px 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-step-panel > .form, | |
| .guided-step-panel > .styler, | |
| .guided-step-panel > .block, | |
| .guided-step-panel .form { | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .guided-step-panel > .form, | |
| .guided-step-panel > .styler { | |
| padding: 0 !important; | |
| } | |
| .guided-step-heading { | |
| border-bottom-color: #dce2e9; | |
| } | |
| .guided-empty-insight, | |
| .guided-research-insight { | |
| border: 0 !important; | |
| border-left: 3px solid #879bbd !important; | |
| border-radius: 0; | |
| background: #f5f7fa; | |
| } | |
| .guided-provider-note { | |
| margin: 16px 0 0 !important; | |
| padding: 12px 0 0; | |
| border: 0 !important; | |
| border-top: 1px solid #e3e7ed !important; | |
| border-radius: 0; | |
| background: transparent; | |
| } | |
| .guided-refinement-box, | |
| .guided-refinement-box > .form { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| /* Direction C canvas readability ------------------------------------ */ | |
| .guided-pipeline-card-content { | |
| min-height: 176px; | |
| padding: 14px 13px 12px; | |
| } | |
| .guided-node-topline { | |
| display: grid !important; | |
| grid-template-columns: 26px minmax(0, 1fr); | |
| gap: 8px; | |
| align-items: center; | |
| justify-content: start !important; | |
| } | |
| .guided-node-icon { | |
| width: 26px; | |
| height: 26px; | |
| border-radius: 8px; | |
| font-size: 10px; | |
| } | |
| .guided-node-stage-name { | |
| display: block; | |
| min-height: 0; | |
| overflow: hidden; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 9.5px; | |
| font-weight: 700; | |
| letter-spacing: .05em; | |
| text-overflow: ellipsis; | |
| text-transform: uppercase; | |
| white-space: nowrap; | |
| } | |
| /* The decision source belongs on the card's bottom rail beside the | |
| compatibility chip, but the markup nests it in the top line. Pin it there | |
| instead of adding a row that squeezes the stage label. */ | |
| .guided-node-source { | |
| position: absolute; | |
| right: auto; | |
| bottom: 11px; | |
| left: 13px; | |
| max-width: calc(100% - 46px); | |
| margin: 0 !important; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| /* The card's bottom rail only has room for the compatibility glyph. The word | |
| stays in the accessibility tree (and in the card's aria-label) but is not | |
| painted, matching the mock's single-mark treatment. */ | |
| .studio-pipeline .guided-node-compatibility { | |
| gap: 0; | |
| font-size: 0 !important; | |
| } | |
| .studio-pipeline .guided-node-compatibility b { | |
| width: 18px; | |
| height: 18px; | |
| font-size: 10px; | |
| } | |
| .studio-pipeline .guided-pipeline-card-content h4 { | |
| min-height: 51px; | |
| margin: 11px 0 4px !important; | |
| font-size: 13px !important; | |
| line-height: 1.3 !important; | |
| -webkit-line-clamp: 3; | |
| } | |
| .guided-node-parameter { | |
| display: block; | |
| min-height: 0; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-node-footer { | |
| justify-content: flex-end; | |
| margin-top: auto; | |
| padding-top: 10px; | |
| border-top: 1px solid #eaedf2; | |
| } | |
| /* Direction C pipeline polish --------------------------------------- */ | |
| .studio-pipeline > .guided-pipeline-card-shell::before, | |
| .studio-pipeline > .guided-pipeline-card-shell::after { | |
| content: none !important; | |
| display: none !important; | |
| } | |
| .studio-pipeline .guided-pipeline-card-output, | |
| .studio-pipeline .guided-pipeline-card-content { | |
| position: relative; | |
| z-index: 1; | |
| } | |
| .studio-pipeline .guided-pipeline-node-hitarea { | |
| z-index: 2; | |
| background: transparent !important; | |
| } | |
| .studio-pipeline .guided-node-source { | |
| display: block; | |
| min-height: 0; | |
| padding-left: 1px; | |
| overflow: hidden; | |
| color: var(--ui-studio-muted) !important; | |
| font-family: var(--ui-font-sans); | |
| font-size: 11px; | |
| font-weight: 650; | |
| line-height: 1.35; | |
| letter-spacing: .01em; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| -webkit-line-clamp: unset; | |
| } | |
| /* The rest of the studio app shell (page-level sizing and scrolling) lives in | |
| RESPONSIVE_HEAD_HTML. Gradio rewrites selectors passed through `css=` by | |
| prefixing them with `.gradio-container … .contain`, which silently kills any | |
| rule aimed at the container itself or at <html>/<body>. */ | |
| /* Six stages read as one left-to-right track while the canvas can hold six | |
| ~130px cards. Below that the stage labels start clipping, so the track wraps | |
| to two rows of three rather than shrinking the type. */ | |
| @media (max-width: 1439px) { | |
| .studio-pipeline { | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| grid-auto-flow: row; | |
| gap: 14px !important; | |
| } | |
| /* Wider cards fit their titles on one line, so the three-line reservation | |
| that keeps the six-across row even would just add dead space. */ | |
| .studio-pipeline > .guided-pipeline-card-shell, | |
| .studio-pipeline .guided-pipeline-card-content { | |
| min-height: 148px; | |
| } | |
| .studio-pipeline .guided-pipeline-card-content h4 { | |
| min-height: 0; | |
| font-size: 14px !important; | |
| -webkit-line-clamp: 2; | |
| } | |
| .studio-pipeline .guided-node-stage-name { | |
| font-size: 10px; | |
| letter-spacing: .07em; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(3)::after, | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(3)::before { | |
| display: none; | |
| } | |
| } | |
| /* The assistant rail is 300px: its heading has to stack instead of running the | |
| title and the provider badge side by side. */ | |
| .studio-assistant .guided-dossier-heading { | |
| display: grid !important; | |
| gap: 9px; | |
| align-items: start; | |
| margin-bottom: 15px; | |
| padding-bottom: 14px; | |
| border-bottom: 1px solid #e3e7ed; | |
| } | |
| .studio-assistant .guided-dossier-heading h3 { | |
| margin: 2px 0 0 !important; | |
| font-size: 15px !important; | |
| line-height: 1.25 !important; | |
| } | |
| .studio-assistant .guided-research-provider { | |
| display: flex; | |
| gap: 8px; | |
| align-items: center; | |
| min-width: 0; | |
| } | |
| .studio-assistant .guided-research-provider small { | |
| min-width: 0; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .studio-assistant .guided-refinement-box { | |
| margin: 0; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-assistant .guided-refinement-box:has(> .guided-refinement-box) { | |
| margin-top: auto; | |
| padding-top: 20px !important; | |
| border-top: 1px solid #e3e7ed !important; | |
| } | |
| .studio-assistant .guided-refinement-box > .guided-refinement-box { | |
| margin: 0; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| } | |
| .studio-assistant .guided-refinement-box .form, | |
| .studio-assistant .guided-refinement-box .block, | |
| .studio-assistant .guided-refinement-box .wrap, | |
| .studio-assistant .guided-refinement-box .container, | |
| .studio-assistant .guided-refinement-box label, | |
| .studio-assistant .guided-refinement-box .styler, | |
| .studio-assistant .guided-refinement-box .input-container { | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-assistant .guided-refinement-box label span { | |
| position: static !important; | |
| display: block; | |
| margin-bottom: 7px; | |
| padding: 0 !important; | |
| color: #657187 !important; | |
| background: transparent !important; | |
| font-size: 11px !important; | |
| font-weight: 700; | |
| } | |
| .studio-assistant .guided-refinement-box textarea { | |
| min-height: 88px !important; | |
| padding: 12px 13px !important; | |
| border: 1px solid #cfd7e3 !important; | |
| border-radius: 8px !important; | |
| color: #354157 !important; | |
| background: #ffffff !important; | |
| box-shadow: none !important; | |
| font-size: 12px !important; | |
| line-height: 1.45 !important; | |
| } | |
| .studio-assistant .guided-refinement-box textarea:focus { | |
| border-color: #526fa6 !important; | |
| box-shadow: 0 0 0 3px rgba(82, 111, 166, .12) !important; | |
| outline: 0 !important; | |
| } | |
| .studio-assistant .guided-refinement-box .guided-secondary-action, | |
| .studio-assistant .guided-refinement-box .guided-secondary-action button { | |
| min-height: 40px !important; | |
| margin-top: 9px !important; | |
| padding: 0 14px !important; | |
| border: 0 !important; | |
| border-radius: 8px !important; | |
| color: #ffffff !important; | |
| background: #526fa6 !important; | |
| box-shadow: none !important; | |
| font-size: 12px !important; | |
| font-weight: 700 !important; | |
| } | |
| .studio-assistant .guided-refinement-box .guided-secondary-action:hover, | |
| .studio-assistant .guided-refinement-box .guided-secondary-action button:hover { | |
| background: #445f91 !important; | |
| } | |
| /* Run bar -------------------------------------------------------------- | |
| Gradio nests the group as .studio-runbar > .studio-runbar > .styler > .row, | |
| so the inner wrappers have to be flattened before the bar can lay out. */ | |
| .studio-runbar { | |
| display: flex !important; | |
| align-items: center; | |
| min-height: 82px; | |
| padding: 0 26px !important; | |
| border-radius: 0 !important; | |
| border-top: 1px solid #e1e5ec !important; | |
| background: #ffffff !important; | |
| } | |
| .studio-runbar .studio-runbar, | |
| .studio-runbar .styler { | |
| display: flex !important; | |
| flex: 1 1 auto; | |
| align-items: center; | |
| min-width: 0; | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .studio-runbar .row { | |
| display: flex !important; | |
| flex: 1 1 auto; | |
| flex-wrap: nowrap !important; | |
| gap: 18px !important; | |
| align-items: center !important; | |
| min-width: 0; | |
| } | |
| .studio-runbar .guided-run-summary-output { | |
| flex: 1 1 auto; | |
| min-width: 0; | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| } | |
| .guided-run-summary { | |
| display: flex; | |
| flex-wrap: nowrap; | |
| gap: 22px; | |
| align-items: center; | |
| min-width: 0; | |
| } | |
| .guided-summary-status { | |
| display: grid; | |
| flex: 0 0 auto; | |
| gap: 1px; | |
| padding-left: 13px; | |
| border-left: 3px solid #6d9a86; | |
| } | |
| .guided-summary-facts { | |
| display: flex; | |
| flex-wrap: nowrap; | |
| gap: 0; | |
| min-width: 0; | |
| } | |
| .guided-summary-facts > span { | |
| display: grid; | |
| gap: 1px; | |
| flex: 0 1 auto; | |
| min-width: 0; | |
| padding: 0 18px; | |
| border-left: 1px solid #e6e9ef; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| white-space: nowrap; | |
| } | |
| .guided-summary-facts small { | |
| order: -1; | |
| letter-spacing: .08em; | |
| text-transform: uppercase; | |
| } | |
| .studio-runbar .guided-primary-action, | |
| .studio-runbar .guided-parallel-action { | |
| flex: 0 0 auto; | |
| min-width: 158px !important; | |
| min-height: 40px !important; | |
| margin: 0 !important; | |
| border-radius: 10px !important; | |
| font-size: 12.5px !important; | |
| font-weight: 700 !important; | |
| } | |
| @media (max-width: 1160px) { | |
| .studio-workbench { | |
| grid-template-columns: 176px minmax(0, 1fr) 250px; | |
| } | |
| .studio-primary { | |
| padding-right: 18px !important; | |
| padding-left: 18px !important; | |
| } | |
| .studio-assistant { | |
| grid-column: auto; | |
| padding-right: 15px !important; | |
| padding-left: 15px !important; | |
| border-top: 0 !important; | |
| border-left: 1px solid #e2e6ed !important; | |
| } | |
| .studio-pipeline { | |
| grid-template-columns: repeat(3, minmax(0, 1fr)); | |
| grid-auto-flow: row; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(3)::after { | |
| display: none; | |
| } | |
| } | |
| @media (max-width: 980px) { | |
| .studio-workbench { | |
| grid-template-columns: 136px minmax(0, 1fr) 220px; | |
| } | |
| .studio-workflow { | |
| padding: 22px 12px !important; | |
| } | |
| .studio-primary { | |
| padding: 22px 16px 28px !important; | |
| } | |
| .studio-assistant { | |
| padding: 22px 12px 18px !important; | |
| } | |
| .guided-stepper label:has(input) { | |
| padding-right: 5px !important; | |
| padding-left: 5px !important; | |
| font-size: 11px !important; | |
| } | |
| .guided-stepper input[type="radio"] { | |
| width: 24px !important; | |
| height: 24px !important; | |
| min-width: 24px !important; | |
| margin-right: 3px !important; | |
| } | |
| .guided-canvas-heading h2 { | |
| font-size: 19px !important; | |
| } | |
| .guided-quality-badge { | |
| display: none; | |
| } | |
| } | |
| @media (max-width: 760px) { | |
| .gradio-container:has(#workspace-tabs) { | |
| padding: 10px !important; | |
| } | |
| .studio-product-header { | |
| padding: 0 16px !important; | |
| } | |
| .studio-product-profile > span:first-child { | |
| display: none; | |
| } | |
| /* Below this width the masthead has no spare room to host the nav, and the | |
| notice strip wraps to an unpredictable height, so the pills return to | |
| normal flow above the workspace. */ | |
| #workspace-tabs > .tab-wrapper { | |
| position: static !important; | |
| top: auto; | |
| right: auto; | |
| left: auto; | |
| padding: 10px 16px 0; | |
| transform: none; | |
| } | |
| #workspace-tabs > .tab-wrapper .tab-container, | |
| #workspace-tabs > .tab-wrapper .tab-nav { | |
| width: 100%; | |
| } | |
| .studio-workbench { | |
| display: grid !important; | |
| grid-template-columns: 160px minmax(0, 1fr); | |
| } | |
| .studio-workflow { | |
| border-right: 1px solid #e2e6ed !important; | |
| border-bottom: 0 !important; | |
| } | |
| .studio-assistant { | |
| grid-column: 1 / -1; | |
| border-top: 1px solid #e2e6ed !important; | |
| border-left: 0 !important; | |
| } | |
| } | |
| @media (max-width: 620px) { | |
| .studio-product-header { | |
| justify-content: center; | |
| height: auto; | |
| min-height: 66px; | |
| padding: 10px 13px !important; | |
| } | |
| .studio-product-profile { | |
| display: none; | |
| } | |
| #workspace-tabs > .tab-wrapper { | |
| padding: 10px 13px 0; | |
| } | |
| .studio-workbench { | |
| display: flex !important; | |
| flex-direction: column !important; | |
| } | |
| .studio-workflow, | |
| .studio-primary, | |
| .studio-assistant { | |
| width: 100% !important; | |
| padding: 17px !important; | |
| border-right: 0 !important; | |
| border-left: 0 !important; | |
| } | |
| .studio-workflow { | |
| border-bottom: 1px solid #e2e6ed !important; | |
| } | |
| .guided-stepper .wrap, | |
| .guided-stepper .container { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)) !important; | |
| } | |
| .guided-canvas-heading { | |
| align-items: flex-start; | |
| } | |
| .guided-quality-badge { | |
| display: none; | |
| } | |
| .studio-pipeline { | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| grid-auto-flow: row; | |
| } | |
| .studio-pipeline > .guided-pipeline-card-shell:nth-child(even)::after { | |
| display: none; | |
| } | |
| .studio-runbar .row, | |
| .guided-run-summary, | |
| .guided-summary-facts { | |
| align-items: stretch; | |
| flex-direction: column !important; | |
| } | |
| .guided-summary-facts > span { | |
| padding: 0; | |
| border-left: 0; | |
| } | |
| .studio-runbar .guided-primary-action, | |
| .studio-runbar .guided-parallel-action { | |
| width: 100% !important; | |
| } | |
| } | |
| /* Workbench readiness repair ---------------------------------------- | |
| The pipeline is an evidence grid, not a compressed process ribbon. Three | |
| columns preserve the six-stage sequence while leaving every field readable. */ | |
| .studio-pipeline { | |
| grid-template-columns: repeat(3, minmax(180px, 1fr)) !important; | |
| grid-auto-flow: row !important; | |
| gap: 14px !important; | |
| overflow-x: hidden !important; | |
| } | |
| /* The reserved heights below keep the footers aligned across the row. They are | |
| sized to the text that actually appears, so a short field does not hold open | |
| space it never uses and push the step form off the first screen. Nothing is | |
| clamped: every field still wraps to as many lines as it needs. */ | |
| .studio-pipeline > .guided-pipeline-card-shell, | |
| .studio-pipeline .guided-pipeline-card-content { | |
| min-width: 0; | |
| min-height: 178px; | |
| } | |
| .studio-pipeline .guided-pipeline-card-content { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: stretch !important; | |
| padding: 16px 16px 14px; | |
| } | |
| .studio-pipeline .guided-node-topline { | |
| grid-template-columns: 30px minmax(0, 1fr); | |
| gap: 10px; | |
| } | |
| .studio-pipeline .guided-node-stage-name { | |
| overflow: visible; | |
| text-overflow: clip; | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| } | |
| .studio-pipeline .guided-pipeline-card-content h4 { | |
| display: block !important; | |
| min-height: 36px; | |
| margin: 11px 0 7px !important; | |
| overflow: visible; | |
| font-size: 14px !important; | |
| line-height: 1.35 !important; | |
| text-overflow: clip; | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| -webkit-box-orient: initial; | |
| -webkit-line-clamp: unset; | |
| } | |
| .studio-pipeline .guided-node-parameter { | |
| display: block; | |
| min-height: 20px; | |
| margin: 0 0 7px !important; | |
| overflow: visible; | |
| color: #647087 !important; | |
| line-height: 1.45; | |
| text-overflow: clip; | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| } | |
| .studio-pipeline .guided-node-shape { | |
| display: block !important; | |
| width: 100%; | |
| max-width: none; | |
| min-height: 16px; | |
| margin: 0 0 9px !important; | |
| overflow: visible; | |
| color: var(--ui-studio-muted) !important; | |
| font-size: 10.5px; | |
| line-height: 1.4; | |
| text-overflow: clip; | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| } | |
| .studio-pipeline .guided-node-footer { | |
| display: flex; | |
| gap: 10px; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-top: auto; | |
| padding-top: 10px; | |
| } | |
| .studio-pipeline .guided-node-source { | |
| position: static; | |
| inset: auto; | |
| display: block; | |
| max-width: none; | |
| margin: 0 !important; | |
| overflow: visible; | |
| color: #65728a !important; | |
| font-size: 10.5px; | |
| line-height: 1.35; | |
| text-overflow: clip; | |
| white-space: normal; | |
| overflow-wrap: anywhere; | |
| } | |
| .studio-pipeline .guided-node-compatibility { | |
| display: inline-flex; | |
| flex: 0 0 auto; | |
| gap: 5px; | |
| font-size: 10px !important; | |
| line-height: 1.2; | |
| } | |
| .guided-agent-status-grid, | |
| .guided-reflection-sections, | |
| .guided-next-experiment-grid { | |
| display: grid; | |
| grid-template-columns: repeat(2, minmax(0, 1fr)); | |
| gap: 12px; | |
| margin: 14px 0; | |
| } | |
| .guided-agent-status-grid article, | |
| .guided-reflection-sections article, | |
| .guided-next-experiment-card { | |
| padding: 14px; | |
| border: 1px solid #cbd6dc; | |
| border-radius: 10px; | |
| background: #fff; | |
| } | |
| .guided-source-badge, | |
| .guided-verification-badge, | |
| .guided-metric-kind { | |
| display: inline-flex; | |
| width: fit-content; | |
| margin-bottom: 6px; | |
| padding: 3px 7px; | |
| border-radius: 999px; | |
| background: #e7f2f6; | |
| color: #164c63; | |
| font-size: 11px; | |
| font-weight: 700; | |
| letter-spacing: .02em; | |
| } | |
| .guided-verification-badge.rejected, | |
| .guided-verification-badge.incompatible, | |
| .guided-candidate-card.non-executable > .guided-selection-state { | |
| background: #fff0ee; | |
| color: #8b2b22; | |
| } | |
| .guided-candidate-card.non-executable { | |
| border-color: #d8aaa4; | |
| background: #fffafa; | |
| } | |
| .guided-next-experiment-card.suggestion-only { | |
| border-style: dashed; | |
| background: #f7f9fa; | |
| } | |
| .guided-next-experiment-card h5, | |
| .guided-reflection-sections h5 { | |
| margin: 12px 0 5px; | |
| color: #3f5260; | |
| font-size: 12px; | |
| } | |
| .guided-reflection-empty { | |
| padding: 18px; | |
| border: 1px dashed #b8c7cf; | |
| border-radius: 10px; | |
| background: #f8fafb; | |
| } | |
| @media (max-width: 980px) { | |
| .guided-agent-status-grid, | |
| .guided-reflection-sections, | |
| .guided-next-experiment-grid { | |
| grid-template-columns: minmax(0, 1fr); | |
| } | |
| .studio-pipeline { | |
| grid-template-columns: repeat(2, minmax(160px, 1fr)) !important; | |
| } | |
| } | |
| @media (max-width: 440px) { | |
| .studio-pipeline { | |
| grid-template-columns: minmax(0, 1fr) !important; | |
| } | |
| } | |
| @media (prefers-reduced-motion: reduce) { | |
| *, *::before, *::after { | |
| scroll-behavior: auto !important; | |
| transition-duration: 0.01ms !important; | |
| animation-duration: 0.01ms !important; | |
| animation-iteration-count: 1 !important; | |
| } | |
| } | |
| """ | |
| RESPONSIVE_HEAD_HTML = """ | |
| <script> | |
| /* The studio surfaces are a light-only design. Gradio adds `dark` to <body> | |
| whenever the OS prefers dark, which leaves its dark text tokens painting on | |
| the workbench's white panels. Pin the app to light instead. */ | |
| (function () { | |
| /* Hugging Face embeds the Space in an iframe whose height is calculated from | |
| this document. A viewport-height shell inside that auto-sized iframe feeds | |
| its new height back into the next measurement and grows without bound. | |
| Keep the fixed desktop shell for direct visits, and use document scrolling | |
| when the app is embedded. */ | |
| document.documentElement.classList.toggle( | |
| "automl-embedded", | |
| window.self !== window.top | |
| ); | |
| if (window.__automlLightThemePinned) return; | |
| window.__automlLightThemePinned = true; | |
| function pinLight() { | |
| var body = document.body; | |
| if (body && body.classList.contains("dark")) body.classList.remove("dark"); | |
| var root = document.documentElement; | |
| if (root && root.classList.contains("dark")) root.classList.remove("dark"); | |
| } | |
| pinLight(); | |
| document.addEventListener("DOMContentLoaded", pinLight); | |
| new MutationObserver(pinLight).observe(document.documentElement, { | |
| attributes: true, | |
| childList: true, | |
| subtree: false, | |
| attributeFilter: ["class"] | |
| }); | |
| if (document.body) { | |
| new MutationObserver(pinLight).observe(document.body, { | |
| attributes: true, | |
| attributeFilter: ["class"] | |
| }); | |
| } else { | |
| document.addEventListener("DOMContentLoaded", function () { | |
| new MutationObserver(pinLight).observe(document.body, { | |
| attributes: true, | |
| attributeFilter: ["class"] | |
| }); | |
| }); | |
| } | |
| })(); | |
| </script> | |
| <style> | |
| /* --------------------------------------------------------------------- | |
| Page-shell styles. | |
| Everything passed to Gradio through `css=` is rewritten so each selector is | |
| prefixed with `.gradio-container … .contain`, which makes rules targeting | |
| <html>, <body>, `.gradio-container`, `.main.app` or `main.contain` match | |
| nothing. Those rules have to live here in `head=`, which Gradio injects | |
| verbatim. | |
| --------------------------------------------------------------------- */ | |
| :root { color-scheme: light; } | |
| /* Gradio's own page chrome renders outside `.contain`. */ | |
| .gradio-container > .wrap > footer, | |
| .gradio-container .wrap > footer, | |
| .gradio-container .show-api, | |
| .gradio-container .built-with, | |
| .gradio-container .settings { | |
| display: none !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) { | |
| width: 100% !important; | |
| max-width: none !important; | |
| padding: 0 !important; | |
| background: #f7f8fb !important; | |
| } | |
| /* Signed out, the workspace tabs are not rendered at all, so the page is just | |
| the masthead, the notice strip and the access card. It gets the same ground | |
| as the workbench rather than the default framed panel. */ | |
| .gradio-container:not(:has(#workspace-tabs)) { | |
| width: 100% !important; | |
| max-width: none !important; | |
| padding: 0 !important; | |
| background: #f7f8fb !important; | |
| } | |
| html:not(.automl-embedded) .gradio-container:not(:has(#workspace-tabs)) { | |
| min-height: 100dvh; | |
| } | |
| .gradio-container:not(:has(#workspace-tabs)) .main.app, | |
| .gradio-container:not(:has(#workspace-tabs)) .main.app > .wrap, | |
| .gradio-container:not(:has(#workspace-tabs)) main.contain { | |
| width: 100% !important; | |
| max-width: none !important; | |
| margin: 0 !important; | |
| padding: 0 !important; | |
| border: 0 !important; | |
| border-radius: 0 !important; | |
| background: transparent !important; | |
| box-shadow: none !important; | |
| } | |
| .gradio-container:not(:has(#workspace-tabs)) main.contain > .column { | |
| gap: 0 !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .main.app { | |
| width: 100% !important; | |
| max-width: min(1760px, 100%) !important; | |
| margin: 0 auto !important; | |
| padding: 0 !important; | |
| background: #f7f8fb !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) .main.app > .wrap, | |
| .gradio-container:has(#workspace-tabs) main.contain { | |
| border: 0 !important; | |
| background: #f7f8fb !important; | |
| } | |
| .gradio-container:has(#workspace-tabs) main.contain > .column, | |
| .gradio-container:has(#workspace-tabs) #workspace-tabs > .tabitem > .column { | |
| gap: 0 !important; | |
| } | |
| /* Studio app shell: a fixed masthead, a body that fills the window, and a run | |
| bar pinned to the bottom edge. Only the three workbench rails scroll. */ | |
| @media (min-width: 981px) and (min-height: 700px) { | |
| html:not(.automl-embedded):has(#workspace-tabs), | |
| html:not(.automl-embedded) body:has(#workspace-tabs), | |
| html:not(.automl-embedded) body:has(#workspace-tabs) > gradio-app { | |
| height: 100dvh; | |
| min-height: 0; | |
| margin: 0; | |
| overflow: hidden; | |
| } | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs), | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .main.app, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .main.app > .wrap, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) main.contain, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) main.contain > .column, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs > .tabitem > .column { | |
| display: flex !important; | |
| flex: 1 1 auto; | |
| flex-wrap: nowrap !important; | |
| flex-direction: column !important; | |
| height: auto !important; | |
| min-height: 0 !important; | |
| } | |
| /* Gradio toggles tab panels with an inline `display`, so this one must not | |
| force a display value or every panel renders at once. */ | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs > .tabitem { | |
| flex: 1 1 auto; | |
| flex-wrap: nowrap !important; | |
| flex-direction: column !important; | |
| height: auto !important; | |
| min-height: 0 !important; | |
| } | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs), | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .main.app, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .main.app > .wrap, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) main.contain { | |
| overflow: hidden !important; | |
| } | |
| /* The workspace nav pills are positioned over the masthead from inside the | |
| tab group, so nothing between them may clip. */ | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) main.contain > .column, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs > .tabitem, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs > .tabitem > .column { | |
| overflow: visible !important; | |
| } | |
| /* The masthead and the run bar hold their size; the workbench absorbs the | |
| remaining height. */ | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .block:has(.studio-product-header), | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .block:has(.research-notice), | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .studio-runbar { | |
| flex: 0 0 auto; | |
| } | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .studio-workbench { | |
| flex: 1 1 auto; | |
| height: auto !important; | |
| min-height: 0 !important; | |
| overflow: hidden; | |
| } | |
| /* Gradio columns default to `flex-wrap: wrap`; once the rails have a bounded | |
| height that silently spills their content into a second, off-screen | |
| column instead of scrolling. */ | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .studio-workflow, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .studio-primary, | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) .studio-assistant { | |
| flex-wrap: nowrap !important; | |
| min-height: 0 !important; | |
| overflow-x: hidden !important; | |
| overflow-y: auto !important; | |
| overscroll-behavior: contain; | |
| } | |
| /* Tabs other than Build are ordinary documents: let them scroll as one. */ | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs > .tabitem > .column:not(:has(.studio-workbench)) { | |
| display: block !important; | |
| overflow-y: auto !important; | |
| } | |
| /* The nav pills belong in the masthead, but they live inside the tab group | |
| further down the DOM. Pinning them to the viewport keeps them centred on | |
| the masthead regardless of how tall the notice strip wraps; the shell | |
| itself never scrolls, so nothing can drift out from under them. */ | |
| html:not(.automl-embedded) .gradio-container:has(#workspace-tabs) #workspace-tabs > .tab-wrapper { | |
| position: fixed !important; | |
| z-index: 40; | |
| top: 17px; | |
| right: auto !important; | |
| bottom: auto; | |
| left: 50% !important; | |
| transform: translateX(-50%) !important; | |
| } | |
| } | |
| @media (max-width: 800px) { | |
| body { | |
| margin: 0 !important; | |
| overflow-x: hidden !important; | |
| } | |
| .gradio-container { | |
| width: 100% !important; | |
| max-width: 100% !important; | |
| min-width: 0 !important; | |
| padding: 0 !important; | |
| overflow-x: hidden !important; | |
| } | |
| .gradio-container .main.app { | |
| width: 100% !important; | |
| min-width: 0 !important; | |
| padding: 0 12px 28px !important; | |
| } | |
| .gradio-container .main.app > .wrap, | |
| .gradio-container main.contain { | |
| width: 100% !important; | |
| min-width: 0 !important; | |
| max-width: 100% !important; | |
| } | |
| } | |
| </style> | |
| <script> | |
| (function () { | |
| if (window.__automlRunCopyReady) return; | |
| window.__automlRunCopyReady = true; | |
| function fallbackCopy(value) { | |
| var input = document.createElement("textarea"); | |
| input.value = value; | |
| input.setAttribute("readonly", ""); | |
| input.style.position = "fixed"; | |
| input.style.opacity = "0"; | |
| document.body.appendChild(input); | |
| input.select(); | |
| var copied = document.execCommand("copy"); | |
| document.body.removeChild(input); | |
| if (!copied) throw new Error("Copy command was rejected"); | |
| } | |
| document.addEventListener("click", function (event) { | |
| var button = event.target.closest && event.target.closest(".run-id-copy"); | |
| if (!button) return; | |
| var value = button.getAttribute("data-copy-value") || ""; | |
| if (!value) return; | |
| var operation = navigator.clipboard && navigator.clipboard.writeText | |
| ? navigator.clipboard.writeText(value) | |
| : Promise.resolve().then(function () { fallbackCopy(value); }); | |
| operation.then(function () { | |
| button.textContent = "Copied"; | |
| window.setTimeout(function () { button.textContent = "Copy"; }, 1600); | |
| }).catch(function () { | |
| try { | |
| fallbackCopy(value); | |
| button.textContent = "Copied"; | |
| } catch (error) { | |
| button.textContent = "Copy failed"; | |
| } | |
| window.setTimeout(function () { button.textContent = "Copy"; }, 1600); | |
| }); | |
| }); | |
| })(); | |
| </script> | |
| <script> | |
| (function () { | |
| if (window.__automlMenuTapGuardReady) return; | |
| window.__automlMenuTapGuardReady = true; | |
| // Gradio's dropdown selects an option on mousedown -- `__mousedown` on the | |
| // list calls preventDefault() so the field keeps focus -- and it keeps the | |
| // list mounted only while that field is document.activeElement. | |
| // | |
| // That pairing holds for a mouse, where mousedown precedes any focus change. | |
| // It breaks for touch: the field blurs on touchstart, before the | |
| // compatibility mousedown, so the list unmounts before it is ever told which | |
| // option was pressed. The option is not selected, and the click that ends | |
| // the tap is delivered by coordinate to whatever the list was covering. | |
| // There is not always room below the field, and when the list opens upward | |
| // over the data source radios that is a radio -- so a tap on a dataset name | |
| // silently switched the source to "Upload data" instead. | |
| // | |
| // Two guards. On pointerdown the list is still mounted, so the option is | |
| // selected there through Gradio's own delegated mousedown handler rather | |
| // than through a reimplementation of it. Then the trailing click is | |
| // swallowed, so whatever else happens a tap that began on a menu cannot | |
| // activate the page behind it. | |
| var tappedMenuAt = 0; | |
| function now() { | |
| return window.performance ? window.performance.now() : Date.now(); | |
| } | |
| function menuOf(node) { | |
| return node && node.closest ? node.closest("ul.options") : null; | |
| } | |
| document.addEventListener("pointerdown", function (event) { | |
| var menu = menuOf(event.target); | |
| tappedMenuAt = menu ? now() : 0; | |
| if (!menu || event.pointerType === "mouse") return; | |
| // A mouse never gets here: mousedown precedes any focus change, so | |
| // Gradio's handler already runs and its preventDefault() holds the focus. | |
| var option = event.target.closest("li[data-index]"); | |
| if (!option) return; | |
| option.dispatchEvent( | |
| new MouseEvent("mousedown", { bubbles: true, cancelable: true }) | |
| ); | |
| }, true); | |
| document.addEventListener("click", function (event) { | |
| if (!tappedMenuAt) return; | |
| // Only the click that ends that press is suppressed. A press that never | |
| // produces one must not leave the guard armed for an unrelated click | |
| // later, and a keyboard activation (detail 0) is never the tail of a tap. | |
| var isTailOfTap = event.detail > 0 && now() - tappedMenuAt < 1000; | |
| tappedMenuAt = 0; | |
| if (!isTailOfTap || menuOf(event.target)) return; | |
| event.preventDefault(); | |
| event.stopPropagation(); | |
| }, true); | |
| ["pointercancel", "touchcancel"].forEach(function (type) { | |
| document.addEventListener(type, function () { tappedMenuAt = 0; }, true); | |
| }); | |
| })(); | |
| </script> | |
| <script> | |
| (function () { | |
| if (window.__automlTabOverflowLabelReady) return; | |
| window.__automlTabOverflowLabelReady = true; | |
| // When the result tabs do not fit, Gradio collapses the remainder behind an | |
| // icon-only button with no text and no aria-label, so a screen reader | |
| // announces it as an unnamed button. The menu itself works; only the name is | |
| // missing. Gradio mounts it lazily and re-creates it on resize, so name it | |
| // whenever it appears. | |
| var LABEL = "More tabs"; | |
| function nameOverflowButtons(root) { | |
| var menus = (root || document).querySelectorAll(".overflow-menu"); | |
| for (var i = 0; i < menus.length; i++) { | |
| var buttons = menus[i].querySelectorAll("button"); | |
| for (var j = 0; j < buttons.length; j++) { | |
| var button = buttons[j]; | |
| if (button.getAttribute("aria-label")) continue; | |
| if ((button.textContent || "").trim()) continue; | |
| button.setAttribute("aria-label", LABEL); | |
| button.setAttribute("title", LABEL); | |
| } | |
| } | |
| } | |
| function start() { | |
| nameOverflowButtons(document); | |
| new MutationObserver(function () { | |
| nameOverflowButtons(document); | |
| }).observe(document.body, { childList: true, subtree: true }); | |
| } | |
| if (document.readyState === "loading") { | |
| document.addEventListener("DOMContentLoaded", start); | |
| } else { | |
| start(); | |
| } | |
| })(); | |
| </script> | |
| """ | |
| # Reuse the proven interaction fixes without importing the legacy shell layout. | |
| STUDIO_INTERACTION_HEAD_HTML = "\n".join( | |
| re.findall(r"<script>.*?</script>", RESPONSIVE_HEAD_HTML, flags=re.DOTALL) | |
| ) | |
| def professional_theme() -> gr.Theme: | |
| """Return a restrained, high-contrast theme built from system fonts.""" | |
| return gr.themes.Base( | |
| primary_hue=gr.themes.colors.blue, | |
| secondary_hue=gr.themes.colors.teal, | |
| neutral_hue=gr.themes.colors.slate, | |
| radius_size=gr.themes.sizes.radius_sm, | |
| font=[ | |
| gr.themes.GoogleFont("IBM Plex Sans", weights=(400, 600, 700)), | |
| gr.themes.Font("-apple-system"), | |
| gr.themes.Font("Segoe UI"), | |
| "sans-serif", | |
| ], | |
| font_mono=[ | |
| gr.themes.GoogleFont("IBM Plex Mono", weights=(400, 600)), | |
| gr.themes.Font("Consolas"), | |
| "monospace", | |
| ], | |
| ).set( | |
| body_background_fill="#f2f6f7", | |
| body_text_color="#172b3a", | |
| block_background_fill="#ffffff", | |
| block_border_color="#b3c4cd", | |
| block_label_text_color="var(--ui-ink-label)", | |
| button_primary_background_fill="#075b82", | |
| button_primary_background_fill_hover="#163f59", | |
| button_primary_text_color="#ffffff", | |
| input_background_fill="#ffffff", | |
| input_border_color="#7b8f9b", | |
| shadow_drop="0 1px 2px rgba(16,47,68,.06)", | |
| ) | |