/* ============================================================ Дашборд продаж — только компоновка. Цвета, шрифты и размеры — токены KT AI (kt-ai-tokens.css). ============================================================ */ /* ---------- каркас: sidebar + рабочая область ---------- */ .dash-shell { display: grid; grid-template-columns: 112px minmax(0, 1fr); min-height: 100vh; } .dash-sidebar { display: flex; flex-direction: column; position: sticky; top: 0; height: 100vh; padding: var(--kt-ai-space-5) var(--kt-ai-space-4); border-right: 1px solid var(--kt-ai-border); background: var(--kt-ai-bg-soft); } /* Липкая первая колонка таблицей — фон под строкой нужен, иначе при горизонтальном скролле цифры «плывут» под ней */ .kt-ai-table td.kt-ai-sticky-first, .kt-ai-table th.kt-ai-sticky-first { background: var(--kt-ai-card-bg); } .dash-brand-name { display: block; margin-top: var(--kt-ai-space-2); font-size: var(--kt-ai-text-xs); line-height: 1.35; color: var(--kt-ai-fg-muted); letter-spacing: .02em; } .dash-sidebar-note { margin-top: auto; padding-top: var(--kt-ai-space-4); border-top: 1px solid var(--kt-ai-divider); font-size: var(--kt-ai-text-2xs); color: var(--kt-ai-fg-faint); } .dash-main { min-width: 0; padding: var(--kt-ai-space-7) var(--kt-ai-space-8) var(--kt-ai-space-12); } /* ---------- шапка ---------- */ .dash-topbar { display: flex; align-items: center; justify-content: space-between; gap: var(--kt-ai-space-6); flex-wrap: wrap; margin-bottom: var(--kt-ai-space-6); } .dash-crumb { display: block; font-size: var(--kt-ai-text-2xs); letter-spacing: .06em; text-transform: uppercase; color: var(--kt-ai-fg-faint); } .dash-title { margin: 2px 0 0; font-size: var(--kt-ai-text-2xl); font-weight: var(--kt-ai-weight-bold); letter-spacing: -.02em; } .dash-topbar-actions { display: flex; align-items: center; gap: var(--kt-ai-space-3); flex-wrap: wrap; } /* ---------- KPI-полоса (сетка из 4 карточек) ---------- */ .kt-ai-kpi-strip.dash-kpis { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--kt-ai-space-4); padding: 0 0 var(--kt-ai-space-7); } .kt-ai-kpi-strip.dash-kpis .kt-ai-kpi { padding: var(--kt-ai-space-5); background: var(--kt-ai-card-bg); border: 1px solid var(--kt-ai-card-border); border-radius: var(--kt-ai-radius-xl); } /* ---------- сетка: карта + график ---------- */ .dash-grid { display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: var(--kt-ai-space-5); align-items: stretch; margin-bottom: var(--kt-ai-space-5); } .dash-panel { min-width: 0; padding: var(--kt-ai-space-6); background: var(--kt-ai-card-bg); border: 1px solid var(--kt-ai-card-border); border-radius: var(--kt-ai-radius-xl); } .dash-panel-head { display: flex; align-items: baseline; justify-content: space-between; gap: var(--kt-ai-space-4); flex-wrap: wrap; margin-bottom: var(--kt-ai-space-5); } .dash-panel-head h2 { margin: 0; font-size: var(--kt-ai-text-md); font-weight: var(--kt-ai-weight-semibold); } .dash-panel-hint { font-size: var(--kt-ai-text-2xs); color: var(--kt-ai-fg-muted); } /* ---------- карта ---------- */ .dash-map-wrap svg { display: block; width: 100%; height: auto; max-height: 430px; } .dash-map-region { cursor: pointer; stroke: var(--kt-ai-card-bg); stroke-width: 2; transition: opacity .15s ease; } .dash-map-region:hover, .dash-map-region:focus-visible { opacity: .82; outline: none; } .dash-map-region[data-selected="true"] { stroke: var(--kt-ai-fg); stroke-width: 2.5; } .dash-map-region[data-tone="ok"] { fill: color-mix(in srgb, var(--kt-ai-chart-green) 34%, var(--kt-ai-bg)); } .dash-map-region[data-tone="warn"] { fill: color-mix(in srgb, var(--kt-ai-chart-orange) 38%, var(--kt-ai-bg)); } .dash-map-region[data-tone="risk"] { fill: color-mix(in srgb, var(--kt-ai-chart-red) 38%, var(--kt-ai-bg)); } .dash-map-label { font-size: 11px; font-weight: var(--kt-ai-weight-semibold); fill: var(--kt-ai-fg); pointer-events: none; user-select: none; text-anchor: middle; } .dash-legend { display: flex; gap: var(--kt-ai-space-4); flex-wrap: wrap; } .dash-legend-item { display: inline-flex; align-items: center; gap: var(--kt-ai-space-2); font-size: var(--kt-ai-text-2xs); color: var(--kt-ai-fg-muted); } .dash-legend-dot { display: inline-block; width: 10px; height: 10px; border-radius: var(--kt-ai-radius-full); } .dash-legend-dot[data-tone="ok"] { background: color-mix(in srgb, var(--kt-ai-chart-green) 55%, var(--kt-ai-bg)); } .dash-legend-dot[data-tone="warn"] { background: color-mix(in srgb, var(--kt-ai-chart-orange) 55%, var(--kt-ai-bg)); } .dash-legend-dot[data-tone="risk"] { background: color-mix(in srgb, var(--kt-ai-chart-red) 55%, var(--kt-ai-bg)); } .dash-map-selected { margin-top: var(--kt-ai-space-5); padding: var(--kt-ai-space-4) var(--kt-ai-space-5); border: 1px solid var(--kt-ai-divider); border-radius: var(--kt-ai-radius-lg); background: var(--kt-ai-bg-soft); font-size: var(--kt-ai-text-sm); color: var(--kt-ai-fg-muted); } .dash-map-selected strong { color: var(--kt-ai-fg); font-weight: var(--kt-ai-weight-semibold); } /* ---------- график: чистый SVG ---------- */ .dash-chart { position: relative; width: 100%; height: 220px; } .dash-chart svg { display: block; width: 100%; height: 100%; } .dcc-bar { cursor: pointer; transition: opacity .15s ease; } .dcc-bar:hover, .dcc-bar:focus-visible { opacity: .8; outline: none; } .dcc-grid { stroke: var(--kt-ai-divider); stroke-dasharray: 3 4; } .dcc-axis { font-size: 10px; fill: var(--kt-ai-fg-faint); font-family: var(--kt-ai-font-mono); } /* ---------- таблица ---------- */ .dash-search { max-width: 240px; } .dash-sort { display: flex; gap: var(--kt-ai-space-2); flex-wrap: wrap; } .dash-sort .is-on { background: var(--kt-ai-primary-subtle); border-color: var(--kt-ai-primary); color: var(--kt-ai-primary); font-weight: var(--kt-ai-weight-semibold); } .kt-ai-table .dash-num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; } .kt-ai-table td.dash-pct { font-weight: var(--kt-ai-weight-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; } /* выбранная строка (клик по карте или по строке) */ .kt-ai-table tr[data-sel="1"] td, .kt-ai-table tr[data-active="true"] td { background: var(--kt-ai-primary-subtle); } .kt-ai-table tbody tr:hover td { background: var(--kt-ai-bg-hover); } .kt-ai-table tbody tr[data-sel="1"]:hover td, .kt-ai-table tbody tr[data-active="true"]:hover td { background: var(--kt-ai-primary-subtle); } .dash-progress { display: inline-block; vertical-align: middle; width: 56px; height: 6px; margin-left: var(--kt-ai-space-3); border-radius: var(--kt-ai-radius-full); background: var(--kt-ai-bg-sunken); overflow: hidden; } .dash-progress i { display: block; height: 100%; border-radius: var(--kt-ai-radius-full); } .dash-progress i[data-tone="ok"] { background: var(--kt-ai-chart-green); } .dash-progress i[data-tone="warn"] { background: var(--kt-ai-chart-orange); } .dash-progress i[data-tone="risk"] { background: var(--kt-ai-chart-red); } /* ---------- адаптив ---------- */ @media (max-width: 1100px) { .dash-grid { grid-template-columns: 1fr; } .kt-ai-kpi-strip.dash-kpis { grid-template-columns: repeat(2, minmax(0, 1fr)); } } @media (max-width: 860px) { .dash-shell { grid-template-columns: 1fr; } .dash-sidebar { display: none; } .dash-main { padding: var(--kt-ai-space-5) var(--kt-ai-space-4) var(--kt-ai-space-10); } } @media (max-width: 640px) { .dash-topbar { flex-direction: column; align-items: stretch; } .dash-topbar-actions { justify-content: space-between; } .dash-topbar-actions .kt-ai-btn { flex: 1; } .kt-ai-select { flex: 1; } .dash-search { width: 100%; max-width: none; } .kt-ai-kpi-strip.dash-kpis { grid-template-columns: 1fr; } .dash-panel { padding: var(--kt-ai-space-4); } }