207 lines
7.4 KiB
CSS
207 lines
7.4 KiB
CSS
/*
|
||
* GenDesign — global CSS design tokens (UI Brief May 17)
|
||
* All CSS vars used across site-finder and analytics components.
|
||
* Spacing scale: 4/8/12/16/24/32px only.
|
||
* Tabular-nums applied globally for numeric readability.
|
||
*/
|
||
|
||
*,
|
||
*::before,
|
||
*::after {
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
:root {
|
||
/* ── Surface ─────────────────────────────────────────────────────────── */
|
||
--bg-app: #f6f7f9;
|
||
--bg-card: #ffffff;
|
||
--bg-card-alt: #fafbfc;
|
||
--bg-headline: #0f172a; /* slate-900 — dark verdict bar */
|
||
|
||
/* ── Borders ─────────────────────────────────────────────────────────── */
|
||
--border-soft: #eef0f3;
|
||
--border-card: #e6e8ec;
|
||
--border-strong: #d1d5db;
|
||
|
||
/* ── Text ────────────────────────────────────────────────────────────── */
|
||
--fg-primary: #111111;
|
||
--fg-secondary: #5b6066;
|
||
--fg-tertiary: #73767e;
|
||
--fg-on-dark: #e2e8f0; /* text on --bg-headline */
|
||
--fg-on-dark-muted: #94a3b8; /* caveat text on dark */
|
||
|
||
/* ── Brand / CTA ─────────────────────────────────────────────────────── */
|
||
--accent: #1d4ed8; /* primary blue CTA */
|
||
--accent-hover: #1e40af;
|
||
--accent-soft: #dbeafe; /* badge bg, active tab bg */
|
||
--accent-2: #f2994a; /* secondary orange CTA (Export, Share) */
|
||
|
||
/* ── Semantic ────────────────────────────────────────────────────────── */
|
||
--success: #0a7a3a;
|
||
--success-soft: #dcfce7;
|
||
--warn: #9a6700;
|
||
--warn-soft: #fef3c7;
|
||
--danger: #b3261e;
|
||
--danger-soft: #fee2e2;
|
||
|
||
/* ── Data-viz (use in order, no skip) ───────────────────────────────── */
|
||
--viz-1: #1d4ed8;
|
||
--viz-2: #0ea5e9;
|
||
--viz-3: #14b8a6;
|
||
--viz-4: #f59e0b;
|
||
--viz-5: #8b5cf6;
|
||
--prediction-line: #0ea5e9;
|
||
--prediction-band: rgba(14, 165, 233, 0.18);
|
||
}
|
||
|
||
html,
|
||
body {
|
||
margin: 0;
|
||
padding: 0;
|
||
background: var(--bg-app);
|
||
color: var(--fg-primary);
|
||
font-family:
|
||
var(--font-inter),
|
||
"Inter",
|
||
-apple-system,
|
||
"Segoe UI",
|
||
system-ui,
|
||
sans-serif;
|
||
font-size: 14px;
|
||
line-height: 1.5;
|
||
/* Tabular nums globally for numeric legibility (Bloomberg lesson) */
|
||
font-variant-numeric: tabular-nums;
|
||
font-feature-settings: "tnum";
|
||
-webkit-font-smoothing: antialiased;
|
||
}
|
||
|
||
/* Focus-visible ring — accessible, not outline:none */
|
||
:focus-visible {
|
||
outline: 2px solid var(--accent);
|
||
outline-offset: 2px;
|
||
}
|
||
|
||
/* Remove default outline for mouse users */
|
||
:focus:not(:focus-visible) {
|
||
outline: none;
|
||
}
|
||
|
||
a {
|
||
color: inherit;
|
||
}
|
||
|
||
/*
|
||
* ── Responsive (issue #66) ───────────────────────────────────────────────────
|
||
* 3 контекста (НЕ Tailwind sm/md/lg): phone <768, tablet 768–1280, desktop >1280.
|
||
* Утилиты ниже — единственный источник правды для брейкпоинтов. Компоненты
|
||
* подключаются через className; инлайн-стили остаются desktop-видом по умолчанию.
|
||
*/
|
||
|
||
/* Никакого горизонтального скролла на узких экранах (acceptance #66).
|
||
* overflow-x: CLIP, не hidden: `hidden` заставляет браузер вычислить
|
||
* overflow-y: auto → body/html становятся scroll-контейнером и ЛОМАЮТ
|
||
* `position: sticky` у сайдбара отчёта (панель уезжала вверх вместо залипания).
|
||
* `clip` так же режет горизонтальный overflow, но НЕ создаёт scroll-контейнер
|
||
* и оставляет overflow-y: visible → sticky-сайдбар работает. */
|
||
html,
|
||
body {
|
||
max-width: 100%;
|
||
overflow-x: clip;
|
||
}
|
||
|
||
/* Sidebar-grid (напр. "240px 1fr" / "minmax(300px,360px) 1fr"): на планшете
|
||
* и ниже схлопывается в одну колонку, сайдбар уезжает над контентом. */
|
||
@media (max-width: 1024px) {
|
||
.gd-grid-sidebar {
|
||
grid-template-columns: 1fr !important;
|
||
}
|
||
/* sticky-сайдбар внутри схлопнутого грида не должен «прилипать». */
|
||
.gd-grid-sidebar > .gd-sidebar {
|
||
position: static !important;
|
||
top: auto !important;
|
||
height: auto !important;
|
||
}
|
||
}
|
||
|
||
/* Карта/контент рядом с фиксированным сайдбаром: на планшете в колонку. */
|
||
@media (max-width: 1024px) {
|
||
.gd-split {
|
||
flex-direction: column !important;
|
||
overflow: visible !important;
|
||
}
|
||
.gd-split > .gd-split-aside {
|
||
width: 100% !important;
|
||
flex-shrink: 1 !important;
|
||
/* в desktop у сайдбара не было левого паддинга (он стоял справа от карты);
|
||
* в колонке возвращаем симметрию. */
|
||
padding-left: 16px !important;
|
||
padding-top: 0 !important;
|
||
}
|
||
}
|
||
|
||
/* Nav-tabs: на телефоне — горизонтальный скролл со снапом, НЕ hamburger. */
|
||
@media (max-width: 767px) {
|
||
.gd-nav-scroll {
|
||
overflow-x: auto;
|
||
flex-wrap: nowrap;
|
||
scroll-snap-type: x proximity;
|
||
-webkit-overflow-scrolling: touch;
|
||
scrollbar-width: none;
|
||
}
|
||
.gd-nav-scroll::-webkit-scrollbar {
|
||
display: none;
|
||
}
|
||
.gd-nav-scroll > * {
|
||
flex: 0 0 auto;
|
||
scroll-snap-align: start;
|
||
}
|
||
}
|
||
|
||
/* Таблицы с фиксированной шириной колонок — оборачивать в .gd-table-scroll. */
|
||
.gd-table-scroll {
|
||
overflow-x: auto;
|
||
-webkit-overflow-scrolling: touch;
|
||
}
|
||
|
||
/* KPI-grid: на телефоне одна колонка во всю ширину (ui-conventions). */
|
||
@media (max-width: 767px) {
|
||
.gd-kpi-grid {
|
||
grid-template-columns: 1fr !important;
|
||
}
|
||
}
|
||
|
||
/* Карта Leaflet на узких экранах — гарантированная высота, чтобы не
|
||
* схлопнулась в 0 когда flex-родитель встаёт в колонку. */
|
||
@media (max-width: 1024px) {
|
||
.gd-map-shell {
|
||
min-height: 420px;
|
||
}
|
||
}
|
||
|
||
/* Section-nav сайдбара анализа: на планшете/телефоне (когда грид схлопнут)
|
||
* вертикальный список превращается в горизонтальную скролл-полоску со снапом —
|
||
* чтобы не съедать пол-экрана высоты над контентом (issue #66). */
|
||
@media (max-width: 1024px) {
|
||
.gd-section-nav {
|
||
flex-direction: row !important;
|
||
overflow-x: auto;
|
||
padding: 8px 4px !important;
|
||
scroll-snap-type: x proximity;
|
||
-webkit-overflow-scrolling: touch;
|
||
scrollbar-width: none;
|
||
}
|
||
.gd-section-nav::-webkit-scrollbar {
|
||
display: none;
|
||
}
|
||
.gd-section-nav > * {
|
||
display: flex;
|
||
flex: 0 0 auto;
|
||
scroll-snap-align: start;
|
||
}
|
||
.gd-section-nav button {
|
||
width: auto !important;
|
||
white-space: nowrap;
|
||
padding-left: 12px !important;
|
||
padding-right: 12px !important;
|
||
}
|
||
}
|