Spaces:
Running
Running
Upload from GitHub Actions: Refresh dashboard UI: design tokens, indigo accent, research footer
15a7ddf verified | /* ============================================================ | |
| Design tokens | |
| ============================================================ */ | |
| :root { | |
| /* Surfaces */ | |
| --bg: #fbfbfd; /* soft cool off-white page background */ | |
| --surface: #ffffff; /* cards, tables */ | |
| --surface-warm: #f7f8fc; /* chart panel, subtle fills, row hover */ | |
| /* Ink */ | |
| --ink: #1b1d24; /* headings + primary text (slate-ink) */ | |
| --ink-muted: #5e626e; /* subtitles, secondary */ | |
| --ink-subtle: #9296a1; /* tertiary labels */ | |
| /* Accent — indigo, used sparingly */ | |
| --accent: #4350c4; | |
| --accent-hover: #343fa0; | |
| --accent-wash: rgba(67, 80, 196, 0.08); | |
| /* Lines */ | |
| --border: #e5e6ec; /* structural borders, card edges */ | |
| --border-strong: #d4d6de; | |
| --hairline: #eff0f4; /* faint inner row separators */ | |
| /* Warmed, ivory-friendly table accents (replace blue/green/orange) */ | |
| --tbl-model-border: #d7daec; --tbl-model-head: #eef0f8; /* soft periwinkle */ | |
| --tbl-lang-border: #cde3cd; --tbl-lang-head: #eff6ee; /* soft sage */ | |
| --tbl-data-border: #ecd9c5; --tbl-data-head: #faf2e9; /* soft sand */ | |
| /* Soft, warm-tinted shadows */ | |
| --shadow-sm: 0 1px 2px rgba(40, 33, 28, 0.05); | |
| --shadow-md: 0 6px 20px rgba(40, 33, 28, 0.07); | |
| /* Radius */ | |
| --radius: 12px; | |
| --radius-sm: 8px; | |
| /* Type */ | |
| --font-serif: ui-serif, Georgia, Cambria, 'Times New Roman', Times, serif; /* clean system serif, headings */ | |
| --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', | |
| 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; | |
| --font-mono: source-code-pro, Menlo, Monaco, Consolas, 'Courier New', monospace; | |
| } | |
| /* ============================================================ | |
| Base | |
| ============================================================ */ | |
| body { | |
| margin: 0; | |
| font-family: var(--font-sans); | |
| background: var(--bg); | |
| color: var(--ink); | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| } | |
| code { | |
| font-family: var(--font-mono); | |
| } | |
| html, body, #root { | |
| height: 100%; | |
| } | |
| a { | |
| color: var(--accent); | |
| text-decoration: none; | |
| transition: color 0.15s ease; | |
| } | |
| a:hover { | |
| color: var(--accent-hover); | |
| text-decoration: underline; | |
| } | |
| :focus-visible { | |
| outline: 2px solid var(--accent); | |
| outline-offset: 2px; | |
| } | |
| /* Serif display headline (hero) */ | |
| .hero-title { | |
| font-family: var(--font-sans); | |
| font-weight: 600; | |
| font-size: clamp(2.25rem, 4vw, 2.75rem); | |
| line-height: 1.12; | |
| letter-spacing: -0.02em; | |
| color: var(--ink); | |
| margin: 1.25rem 0 0.75rem 0; | |
| } | |
| /* ============================================================ | |
| Buttons (replace inline gradients + JS hover handlers) | |
| ============================================================ */ | |
| .btn { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| padding: 0.7rem 1.4rem; | |
| border-radius: 10px; | |
| font-family: var(--font-sans); | |
| font-size: 0.95rem; | |
| font-weight: 500; | |
| line-height: 1; | |
| cursor: pointer; | |
| border: 1px solid transparent; | |
| transition: background-color 0.15s ease, border-color 0.15s ease, | |
| color 0.15s ease; | |
| } | |
| .btn-primary { | |
| background: var(--accent); | |
| color: #fff; | |
| box-shadow: var(--shadow-sm); | |
| } | |
| .btn-primary:hover { | |
| background: var(--accent-hover); | |
| color: #fff; | |
| } | |
| .btn-secondary { | |
| background: transparent; | |
| color: var(--ink); | |
| border-color: var(--border-strong); | |
| } | |
| .btn-secondary:hover { | |
| background: var(--accent-wash); | |
| border-color: var(--accent); | |
| color: var(--accent-hover); | |
| } | |
| /* Quiet ghost link (top-right GitHub) */ | |
| .ghost-link { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| padding: 0.5rem 0.9rem; | |
| border-radius: var(--radius-sm); | |
| font-size: 0.9rem; | |
| font-weight: 500; | |
| color: var(--ink-muted); | |
| background: var(--surface); | |
| border: 1px solid var(--border); | |
| transition: background-color 0.15s ease, color 0.15s ease, | |
| border-color 0.15s ease; | |
| } | |
| .ghost-link:hover { | |
| background: var(--accent-wash); | |
| border-color: var(--accent); | |
| color: var(--accent-hover); | |
| text-decoration: none; | |
| } | |
| /* ============================================================ | |
| PrimeReact base tweaks | |
| ============================================================ */ | |
| .p-component, .pi { | |
| font-size: 0.8rem; | |
| } | |
| .p-icon { | |
| width: 0.8rem; | |
| height: 0.8rem; | |
| } | |
| .p-datatable-wrapper { | |
| scrollbar-color: var(--border) transparent; | |
| border-radius: 0 0 6px 6px; | |
| } | |
| .p-datatable .p-datatable-tbody > tr { | |
| transition: background-color 0.2s ease; | |
| } | |
| .p-datatable .p-datatable-tbody > tr:hover { | |
| background-color: var(--surface-warm) ; | |
| } | |
| .p-datatable .p-datatable-thead > tr > th { | |
| border-bottom: 1px solid var(--border); | |
| background-color: var(--surface-warm); | |
| font-weight: 500; | |
| color: var(--ink-muted); | |
| padding: 0.75rem 1rem; | |
| } | |
| .p-datatable .p-datatable-tbody > tr > td { | |
| padding: 0.75rem 1rem; | |
| border-bottom: 1px solid var(--hairline); | |
| } | |
| /* ============================================================ | |
| Table cards — IDs keep specificity over the PrimeReact theme | |
| ============================================================ */ | |
| #model-table, #language-table, #dataset-table { | |
| border-radius: var(--radius-sm); | |
| box-shadow: var(--shadow-sm); | |
| background: var(--surface); | |
| } | |
| #model-table { border: 1px solid var(--tbl-model-border); } | |
| #language-table { border: 1px solid var(--tbl-lang-border); } | |
| #dataset-table { border: 1px solid var(--tbl-data-border); } | |
| #model-table .p-datatable-header, | |
| #language-table .p-datatable-header, | |
| #dataset-table .p-datatable-header { | |
| border-top-width: 0; | |
| border-radius: 6px 6px 0 0; | |
| color: var(--ink); | |
| padding: 1rem 1.25rem; | |
| font-weight: 500; | |
| } | |
| #model-table .p-datatable-header { | |
| background: var(--tbl-model-head); | |
| border-bottom: 1px solid var(--tbl-model-border); | |
| } | |
| #language-table .p-datatable-header { | |
| background: var(--tbl-lang-head); | |
| border-bottom: 1px solid var(--tbl-lang-border); | |
| } | |
| #dataset-table .p-datatable-header { | |
| background: var(--tbl-data-head); | |
| border-bottom: 1px solid var(--tbl-data-border); | |
| } | |
| /* Chart panel */ | |
| #figure { | |
| width: 100%; | |
| min-width: 600px; | |
| height: auto; | |
| min-height: 700px; | |
| border: 1px solid var(--border); | |
| border-radius: var(--radius); | |
| padding: 1rem 1rem 1.5rem; | |
| background: var(--surface-warm); | |
| box-shadow: var(--shadow-md); | |
| font-family: var(--font-sans); | |
| } | |
| /* Legacy PrimeReact autocomplete input — soften the dated hard shadow */ | |
| .p-autocomplete-input { | |
| width: max(100%, 40vw); | |
| margin-top: 2vh; | |
| border-radius: var(--radius-sm); | |
| border: 1px solid var(--border); | |
| box-shadow: var(--shadow-sm); | |
| } | |
| /* Carousel indicators */ | |
| .p-carousel-indicators button.p-link { | |
| border-radius: 999px; | |
| width: 8px; | |
| height: 8px; | |
| background-color: var(--border-strong); | |
| } | |
| .p-carousel-indicators .p-carousel-indicator.p-highlight button.p-link { | |
| background-color: var(--accent); | |
| } | |
| /* ============================================================ | |
| PrimeReact accent harmonization (cyan -> clay). | |
| index.css is imported AFTER theme.css (see index.js), so these | |
| equal-specificity rules win without !important. | |
| ============================================================ */ | |
| .p-checkbox .p-checkbox-box.p-highlight { | |
| background: var(--accent); | |
| border-color: var(--accent); | |
| } | |
| .p-checkbox .p-checkbox-box.p-highlight:hover { | |
| background: var(--accent-hover); | |
| border-color: var(--accent-hover); | |
| } | |
| .p-radiobutton .p-radiobutton-box.p-highlight { | |
| background: var(--accent); | |
| border-color: var(--accent); | |
| } | |
| .p-slider .p-slider-range { | |
| background: var(--accent); | |
| } | |
| .p-slider .p-slider-handle { | |
| border-color: var(--accent); | |
| } | |
| .p-slider .p-slider-handle:hover { | |
| background: var(--accent); | |
| } | |
| .p-multiselect-panel .p-multiselect-items .p-multiselect-item.p-highlight, | |
| .p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight { | |
| background: var(--accent-wash); | |
| color: var(--accent-hover); | |
| } | |
| .p-multiselect .p-multiselect-token { | |
| background: var(--accent-wash); | |
| color: var(--accent-hover); | |
| } | |
| .p-datatable .p-datatable-tbody > tr.p-highlight { | |
| background: var(--accent-wash); | |
| color: var(--ink); | |
| } | |
| .p-inputtext:enabled:focus { | |
| border-color: var(--accent); | |
| box-shadow: 0 0 0 2px var(--accent-wash); | |
| } | |
| /* ============================================================ | |
| Dialogs — cohesive with the hero (serif headings, clean chrome) | |
| ============================================================ */ | |
| .p-dialog { | |
| border-radius: var(--radius); | |
| border: 1px solid var(--border); | |
| box-shadow: var(--shadow-md); | |
| overflow: hidden; | |
| } | |
| .p-dialog .p-dialog-header { | |
| background: var(--surface); | |
| border-bottom: 1px solid var(--border); | |
| padding: 1.25rem 1.5rem; | |
| } | |
| .p-dialog .p-dialog-header .p-dialog-title { | |
| font-family: var(--font-sans); | |
| font-weight: 600; | |
| font-size: 1.3rem; | |
| letter-spacing: -0.01em; | |
| color: var(--ink); | |
| } | |
| .p-dialog .p-dialog-content { | |
| padding: 0 1.5rem 1.5rem; | |
| color: var(--ink); | |
| } | |
| .p-dialog .p-dialog-content h4 { | |
| font-family: var(--font-sans); | |
| font-weight: 600; | |
| font-size: 1.05rem; | |
| color: var(--ink); | |
| margin: 1.6rem 0 0.5rem; | |
| } | |
| .p-dialog .p-dialog-content p, | |
| .p-dialog .p-dialog-content li { | |
| color: var(--ink-muted); | |
| line-height: 1.6; | |
| } | |