/* ============================================================ 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) !important; } .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; }