dashbord-prodazh-po-regionam/style.css

316 lines
8.2 KiB
CSS

/* ============================================================
Дашборд продаж — только компоновка.
Цвета, шрифты и размеры — токены 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); }
}