"""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 = """

Research analytics workspace

AutoML Studio

Build, evaluate, and reuse machine-learning models through a guided, reproducible workflow.

""" STUDIO_APP_HEADER_HTML = """

AutoML Studio

Guided Research Workspace

Private workspace
""" RESEARCH_NOTICE_HTML = """ """ EXISTING_DATA_GUIDE_HTML = """

Workflow

Train with a managed dataset

  1. 1
    Select dataChoose a dataset and outcome.
  2. 2
    Set evaluationDefine the holdout and compute budget.
  3. 3
    Review and runConfirm advanced options, then train.

Automatic selection is recommended unless your protocol requires a specific pipeline component.

""" UPLOAD_DATA_GUIDE_HTML = """

Before you begin

Prepare your dataset

""" INFERENCE_GUIDE_HTML = """

Model reuse

Run a single prediction

Select a model saved to your account or upload an exported package. The required input format appears after the model is inspected.

Predictions are analytical outputs and require domain-appropriate validation and human review.

""" 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