/
AxeOn
/
ProjectAi
Обзор
Документация
Войти
/
AxeOn
/
ProjectAi
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
static/style.css
5 209 строк
106 KB
Дмитрий
feat(economics-ui): build reactive manual surcharges UI with real-time math and auto-filling dropdowns
07 май 2026, 09:19
07 май 2026, 09:19
fa4d8f7
Код
Авторство
О чём код?
/* ── Office Planner v5 — Base Stylesheet ────────────────────────────────────── * Visual identity is identical to calculator_v3.22. * Source of truth: calculator_v3.22/web/static/style.css * ─────────────────────────────────────────────────────────────────────────── */ /* ── CSS Variables (Design Tokens) ─────────────────────────────────────────── */ :root { /* Brand / Primary */ --color-primary: #1a3a6b; --color-primary-hover: #14305a; /* Page backgrounds */ --color-bg: #f0f2f5; --color-surface: #ffffff; /* Text */ --color-text: #1a1a2e; --color-text-muted: #607d8b; --color-text-hint: #455a64; /* Borders */ --color-border: #e0e0e0; --color-border-input: #cfd8dc; --color-border-blue: #b3d1f0; /* Semantic — Success */ --color-success: #2e7d32; --color-success-hover: #1b5e20; --color-success-bg: #e8f5e9; --color-success-border: #c8e6c9; /* Semantic — Danger */ --color-danger: #c62828; --color-danger-hover: #a31515; --color-danger-bg: #ffebee; /* Semantic — Warning */ --color-warning-bg: #fff9c4; --color-warning-text: #f57f17; /* Semantic — Info */ --color-info-bg: #e3f2fd; --color-info-text: #1565c0; /* Neutral / UI chrome */ --color-neutral: #eceff1; --color-neutral-dark: #cfd8dc; --color-disabled: #b0bec5; /* Terminal / Log panel */ --color-terminal-bg: #1e1e2e; --color-terminal-text: #cdd6f4; /* Typography */ --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif; --font-mono: "Consolas", "Courier New", monospace; --font-size-base: 14px; /* Radius */ --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px; --radius-xl: 10px; /* Shadow */ --shadow-card: 0 1px 4px rgba(0, 0, 0, .10); --shadow-header: 0 2px 8px rgba(0, 0, 0, .25); } /* ── Reset & Base ───────────────────────────────────────────────────────────── */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: var(--font-sans); font-size: var(--font-size-base); background: var(--color-bg); color: var(--color-text); min-height: 100vh; display: flex; flex-direction: column; } /* ── Header ─────────────────────────────────────────────────────────────────── */ header { background: var(--color-primary); color: #fff; padding: 14px 24px; box-shadow: var(--shadow-header); } .header-inner { display: flex; align-items: baseline; gap: 16px; } .logo { font-size: 17px; font-weight: 700; letter-spacing: .3px; } .subtitle { font-size: 12px; opacity: .75; } .header-link { color: rgba(255, 255, 255, .7); font-size: 12px; text-decoration: none; margin-left: auto; } .header-link:hover { color: #fff; text-decoration: underline; } .user-badge { display: flex; align-items: center; gap: 10px; margin-left: auto; font-size: 12px; color: rgba(255, 255, 255, .85); white-space: nowrap; } .header-link+.user-badge { margin-left: 0; } .user-badge .user-name { font-weight: 500; } .user-badge .user-role { opacity: .7; font-size: 11px; } /* ── Main layout ────────────────────────────────────────────────────────────── */ main { flex: 1; width: 100%; margin: 20px 0; padding: 0 2rem; display: flex; flex-direction: column; gap: 4px; } /* ── Cards ──────────────────────────────────────────────────────────────────── */ .stage-card { background: var(--color-surface); border-radius: var(--radius-xl); padding: 24px 28px; box-shadow: var(--shadow-card); } .stage-card h2 { font-size: 16px; font-weight: 700; display: flex; align-items: center; gap: 10px; margin-bottom: 8px; } .badge { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 50%; background: var(--color-primary); color: #fff; font-size: 13px; font-weight: 700; flex-shrink: 0; } .hint { color: #555; font-size: 13px; margin-bottom: 16px; line-height: 1.5; } .hint code { background: var(--color-bg); border-radius: var(--radius-sm); padding: 1px 5px; font-family: var(--font-mono); font-size: 12px; } /* ── Form fields ────────────────────────────────────────────────────────────── */ .field { display: flex; flex-direction: column; gap: 4px; min-width: 160px; } .field label { font-size: 12px; font-weight: 600; color: var(--color-text-hint); text-transform: uppercase; letter-spacing: .4px; } .field select, .field input[type="text"], .field input[type="password"], .field input[type="email"], .field input[type="number"] { border: 1px solid var(--color-border-input); border-radius: var(--radius-md); padding: 7px 10px; font-size: 13px; font-family: var(--font-sans); background: #fafafa; color: var(--color-text); outline: none; transition: border-color .15s; } .field select:focus, .field input:focus { border-color: var(--color-primary); background: #fff; } /* ── Buttons ────────────────────────────────────────────────────────────────── */ .btn-primary, .btn-secondary, .btn-danger, .btn-confirm, .btn-sm { border: none; border-radius: var(--radius-md); padding: 8px 20px; font-size: 13px; font-weight: 600; font-family: var(--font-sans); cursor: pointer; transition: opacity .15s, background .15s; } .btn-primary { background: var(--color-primary); color: #fff; } .btn-primary:hover:not(:disabled) { background: var(--color-primary-hover); } .btn-primary:disabled { background: var(--color-disabled); cursor: not-allowed; } .btn-secondary { background: var(--color-surface); color: var(--color-primary); border: 1.5px solid var(--color-primary); } .btn-secondary:hover:not(:disabled) { background: #f0f4fb; } .btn-secondary:disabled { opacity: .45; cursor: not-allowed; } .btn-danger { background: var(--color-danger); color: #fff; } .btn-danger:hover:not(:disabled) { background: var(--color-danger-hover); } .btn-danger:disabled { background: #ef9a9a; cursor: not-allowed; } .btn-confirm { background: var(--color-success); color: #fff; } .btn-confirm:hover:not(:disabled) { background: var(--color-success-hover); } .btn-confirm:disabled { background: #a5d6a7; cursor: not-allowed; } .btn-sm { background: var(--color-neutral); color: var(--color-text-hint); padding: 4px 10px; font-size: 12px; } .btn-sm:hover { background: var(--color-neutral-dark); } .btn-link { border: none; background: none; color: var(--color-primary); cursor: pointer; font-size: 13px; font-family: var(--font-sans); padding: 0 4px; text-decoration: underline; text-underline-offset: 2px; } .btn-link:hover { color: #0d2247; } .btn-clear { display: inline-block; margin-bottom: 16px; border: none; background: none; color: var(--color-danger); font-size: 12px; font-weight: 600; font-family: var(--font-sans); cursor: pointer; padding: 2px 0; text-decoration: underline; text-underline-offset: 2px; } .btn-clear:hover { color: var(--color-danger-hover); } .btn-row { display: flex; align-items: center; gap: 10px; margin-bottom: 16px; flex-wrap: wrap; } /* ── Status chips ───────────────────────────────────────────────────────────── */ .status-chip { font-size: 12px; font-weight: 600; padding: 4px 10px; border-radius: 20px; display: none; } .status-chip.pending { display: inline-block; background: var(--color-warning-bg); color: var(--color-warning-text); } .status-chip.running { display: inline-block; background: var(--color-info-bg); color: var(--color-info-text); } .status-chip.done { display: inline-block; background: var(--color-success-bg); color: var(--color-success); } .status-chip.error { display: inline-block; background: var(--color-danger-bg); color: var(--color-danger); } .status-chip.stopped { display: inline-block; background: #fff3e0; color: #e65100; } /* ── Log / terminal panel ───────────────────────────────────────────────────── */ .log-wrap { border: 1px solid var(--color-border); border-radius: var(--radius-lg); overflow: hidden; margin-bottom: 16px; } .log-toolbar { display: flex; align-items: center; justify-content: space-between; padding: 6px 12px; background: #f5f5f5; border-bottom: 1px solid var(--color-border); font-size: 12px; color: var(--color-text-muted); font-weight: 600; } .log { display: block; width: 100%; height: 220px; padding: 10px 14px; font-family: var(--font-mono); font-size: 12px; line-height: 1.55; background: var(--color-terminal-bg); color: var(--color-terminal-text); border: none; resize: vertical; overflow-y: auto; } /* ── Data table ─────────────────────────────────────────────────────────────── */ .data-table { width: 100%; border-collapse: collapse; font-size: 13px; } .data-table th { text-align: left; font-size: 11px; color: var(--color-text-muted); font-weight: 600; padding: 6px 10px; border-bottom: 2px solid var(--color-border); text-transform: uppercase; letter-spacing: .4px; background: #f5f5f5; } .data-table td { padding: 7px 10px; border-bottom: 1px solid #f0f0f0; vertical-align: middle; color: var(--color-text); } .data-table tr:hover td { background: #f5f9fc; } /* ── Toolbar layout ─────────────────────────────────────────────────────────── */ .toolbar-flex { display: flex; flex-wrap: wrap; gap: 10px 15px; align-items: center; justify-content: space-between; margin-bottom: 16px; } .toolbar-actions, .toolbar-filters { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .toolbar-divider { width: 1px; align-self: stretch; background: var(--color-border); margin: 0 2px; } /* ── Filter controls ─────────────────────────────────────────────────────────── */ .filter-select { padding: 7px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); background: #fafafa; color: var(--color-text); outline: none; min-width: 140px; cursor: pointer; } .filter-select:focus { border-color: var(--color-primary); background: #fff; } .checkbox-label { display: flex; align-items: center; gap: 6px; font-size: 13px; cursor: pointer; color: var(--color-text-muted); white-space: nowrap; user-select: none; } .checkbox-label input[type="checkbox"] { cursor: pointer; } /* ── Employee table: fixed layout, no horizontal scroll ──────────────────────── */ #employees-container { overflow-x: hidden; overflow-y: auto; max-height: calc(100vh - 280px); width: 100%; } #employees-container .data-table { table-layout: fixed; } /* Simple text cells: clip with ellipsis */ #employees-container .data-table td { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* Multi-line cells (contacts, status badges): allow normal flow */ #employees-container .data-table td.col-contacts, #employees-container .data-table td.col-status { white-space: normal; overflow: visible; } /* Column percentage widths (5 cols, total 100%) */ .col-name { width: 22%; } .col-dept { width: 14%; } .col-cat { width: 9%; } .col-contacts { width: 24%; } .col-status { width: 31%; } /* Clip long text inside stacked contacts */ .emp-contacts>* { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; } /* Sticky header row */ #employees-container .data-table thead th { position: sticky; top: 0; z-index: 10; background: #f5f5f5; } /* Sticky first column (ФИО) */ #employees-container .data-table th:first-child, #employees-container .data-table td:first-child { position: sticky; left: 0; z-index: 5; background: var(--color-surface); box-shadow: 2px 0 5px rgba(0, 0, 0, .05); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* Intersection cell: sticky top + sticky left — must win over both */ #employees-container .data-table thead th:first-child { z-index: 15; background: #f5f5f5; } /* ── Vacation timeline ───────────────────────────────────────────────────────── */ #vacations-container { overflow-x: auto; overflow-y: auto; max-height: calc(100vh - 300px); width: 100%; border: 1px solid var(--color-border); border-radius: var(--radius-lg); } /* ── Vacations layout: table + right sidebar ─────────────────────────────────── */ .vacations-layout { display: flex; gap: 20px; align-items: flex-start; } /* Table column grows, min-width:0 prevents flex overflow */ .vacations-table-wrap { flex: 1 1 0; min-width: 0; } .vacations-sidebar { width: 280px; flex-shrink: 0; background: #f8fafc; border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 14px 16px; position: sticky; top: 20px; max-height: calc(100vh - 280px); overflow-y: auto; } .sidebar-widget { padding-bottom: 14px; margin-bottom: 14px; border-bottom: 1px solid var(--color-border); } .sidebar-widget:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: none; } .sidebar-widget-title { display: flex; align-items: center; gap: 6px; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-hint); margin-bottom: 8px; } .sidebar-widget-body { font-size: 12px; line-height: 1.6; color: var(--color-text); } .sw-icon-danger { color: var(--color-danger); font-size: 13px; } .sw-icon-success { color: var(--color-success); font-size: 13px; } .sw-icon-info { color: var(--color-info-text); font-size: 13px; } .sidebar-widget-body em { color: var(--color-text-muted); font-style: italic; } .vac-sb-row { margin-bottom: 4px; line-height: 1.45; } .vac-sb-dept { font-weight: 700; color: var(--color-text-hint); } .vac-sb-date { color: var(--color-text-muted); } /* Sidebar legend (vacation type key) */ .vac-sb-legend { display: flex; flex-wrap: wrap; gap: 6px 14px; padding: 10px 14px 8px; font-size: 12px; color: var(--color-text-muted); } .vac-sb-legend .l-badge { width: 14px; height: 14px; } .vac-sb-divider { border: none; border-top: 1px solid var(--color-border); margin: 0 0 10px; } /* Responsive: stack sidebar below table on narrow screens */ @media (max-width: 1200px) { .vacations-layout { flex-direction: column; } .vacations-sidebar { width: 100%; position: static; max-height: none; } } /* ── Vacation toolbar ────────────────────────────────────────────────────────── */ .vacation-toolbar { display: flex; align-items: center; justify-content: space-between; width: 100%; gap: 15px; margin-bottom: 12px; } .vacation-toolbar .toolbar-left { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } .vacation-toolbar .toolbar-right { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } /* Vacation legend badges */ .badge-vac-sum { background: #ff922b; border-color: #e8820a; } .badge-vac-win { background: #4dabf7; border-color: #339af0; } .badge-vac-work { background: #51cf66; background-image: repeating-linear-gradient(-45deg, transparent, transparent 3px, rgba(255, 255, 255, .5) 3px, rgba(255, 255, 255, .5) 5px); border-color: #40c057; } .badge-vac-overlap { background: #ff922b; background-image: repeating-linear-gradient(45deg, rgba(220, 38, 38, 0.5), rgba(220, 38, 38, 0.5) 3px, transparent 3px, transparent 7px); border-color: #dc2626; } /* Department badge inside name cell */ .dept-badge { display: inline-block; font-size: 9px; font-weight: 600; color: var(--color-text-muted); background: var(--color-neutral); border-radius: 3px; padding: 1px 4px; margin-left: 4px; vertical-align: middle; letter-spacing: .2px; } /* ── Timeline table ──────────────────────────────────────────────────────────── */ .timeline-table { border-collapse: collapse; font-size: 12px; table-layout: fixed; width: 100%; } .timeline-table thead th { position: sticky; top: 0; z-index: 10; background: var(--color-primary); color: #fff; border: 1px solid rgba(255, 255, 255, .12); padding: 3px 2px; text-align: center; font-weight: 700; font-size: 11px; line-height: 1.4; overflow: hidden; } .timeline-table thead th small { font-weight: 400; opacity: .85; } /* Weekend header — dark red, matching Calendar */ .timeline-table thead th.vac-hdr-weekend { background: #7f1d1d; color: #fca5a5; } .timeline-table tbody td { border: 1px solid #e2e8f0; padding: 0; height: 28px; overflow: hidden; } /* Sticky name column */ .timeline-name-col { position: sticky !important; left: 0; z-index: 5; background: var(--color-surface) !important; border-right: 1px solid #e2e8f0 !important; box-shadow: 2px 0 6px rgba(0, 0, 0, .07); padding: 4px 8px !important; width: 150px !important; min-width: 0 !important; max-width: 180px !important; overflow: hidden !important; font-weight: 500; text-align: left; } thead .timeline-name-col { z-index: 20 !important; background: var(--color-primary) !important; color: #fff !important; font-weight: 700 !important; box-shadow: 2px 0 6px rgba(0, 0, 0, .15); vertical-align: middle; } .timeline-table tbody tr:hover .timeline-name-col { background: #f0f4fb !important; } .timeline-table tbody tr:hover td { background: #fafcff; } /* Day state modifiers */ .day-weekend { background: #f5f5f5 !important; } .day-today { background: #dbeafe !important; } /* Vacation timeline — current day column accent */ .timeline-table thead th.day-today { background: #1565c0 !important; color: #fff !important; font-weight: 700 !important; border-left: 2px solid #86b7fe !important; border-right: 2px solid #86b7fe !important; } .timeline-table tbody td.day-today { /* no background — vacation colors must show through */ border-left: 2px solid #86b7fe !important; border-right: 2px solid #86b7fe !important; } /* Vacation color classes — desktop palette */ .vac-summer { background: #ff922b !important; cursor: help; } .vac-winter { background: #4dabf7 !important; cursor: help; } .vac-working { background: #51cf66 !important; background-image: repeating-linear-gradient(-45deg, transparent, transparent 3px, rgba(255, 255, 255, .45) 3px, rgba(255, 255, 255, .45) 5px) !important; cursor: help; } /* Hatched overlay — applied on top of any base vacation color */ .overlap-warning { background-image: repeating-linear-gradient(45deg, rgba(220, 38, 38, 0.45), rgba(220, 38, 38, 0.45) 4px, transparent 4px, transparent 10px) !important; cursor: help; } /* ── Annual view ─────────────────────────────────────────────────────────────── */ /* View-mode toggle button group */ .vac-view-toggle { display: inline-flex; border: 1.5px solid var(--color-border-input); border-radius: var(--radius-md); overflow: hidden; flex-shrink: 0; } .vac-view-btn { border: none; border-radius: 0; background: var(--color-surface); color: var(--color-text-muted); padding: 4px 14px; font-size: 12px; font-family: var(--font-sans); cursor: pointer; transition: background .15s, color .15s; line-height: 1.4; } .vac-view-btn + .vac-view-btn { border-left: 1.5px solid var(--color-border-input); } .vac-view-btn.active { background: var(--color-primary); color: #fff; } .vac-view-btn:not(.active):hover { background: var(--color-neutral); color: var(--color-primary); } /* Active-vacation filter toggle */ .vac-toggle-filter { display: inline-flex; align-items: center; gap: 7px; cursor: pointer; font-size: 12px; color: var(--color-text); user-select: none; flex-shrink: 0; white-space: nowrap; } .vac-toggle-filter input[type="checkbox"] { display: none; } .vac-toggle-track { display: inline-block; position: relative; width: 30px; height: 17px; background: var(--color-border-input); border-radius: 9px; transition: background .18s; flex-shrink: 0; } .vac-toggle-track::after { content: ''; position: absolute; top: 2px; left: 2px; width: 13px; height: 13px; background: #fff; border-radius: 50%; box-shadow: 0 1px 3px rgba(0,0,0,.22); transition: transform .18s; } .vac-toggle-filter input:checked + .vac-toggle-track { background: var(--color-primary); } .vac-toggle-filter input:checked + .vac-toggle-track::after { transform: translateX(13px); } /* Annual table column headers */ .vac-annual-table thead th.vac-annual-th { width: auto !important; min-width: 0 !important; max-width: none !important; white-space: nowrap; font-size: 11px; } /* Timeline cell that holds absolutely-positioned bars */ .vac-annual-row { position: relative; height: 32px; padding: 0 !important; vertical-align: middle; background: #f8fafc; border: 1px solid #e2e8f0 !important; } /* Month dividers — subtle vertical lines inside the bar row */ .vac-annual-row::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient( to right, transparent, transparent calc(8.333% - 1px), rgba(0,0,0,.06) calc(8.333% - 1px), rgba(0,0,0,.06) 8.333% ); pointer-events: none; z-index: 0; } /* Vacation bars */ .vac-annual-bar { position: absolute; top: 5px; bottom: 5px; min-width: 3px; border-radius: 3px; opacity: .88; cursor: help; transition: opacity .15s, box-shadow .15s; z-index: 1; } .vac-annual-bar:hover { opacity: 1; box-shadow: 0 1px 6px rgba(0,0,0,.22); z-index: 5; } /* Thinner bars when selected (visual feedback) */ .vac-annual-bar[data-selected="true"] { top: 3px; bottom: 3px; outline: 2px inset rgba(0,0,0,.4); } /* Vacation legend */ .timeline-legend { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-bottom: 10px; font-size: 12px; color: var(--color-text-muted); } .tl-item { display: flex; align-items: center; gap: 5px; white-space: nowrap; } .tl-dot { width: 14px; height: 14px; border-radius: 3px; flex-shrink: 0; display: inline-block; } /* ── Calendar toolbar ───────────────────────────────────────────────────────── */ .calendar-toolbar { display: flex; align-items: center; justify-content: space-between; width: 100%; gap: 10px; margin-bottom: 12px; } .calendar-toolbar .toolbar-left { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; flex-shrink: 0; } .calendar-toolbar .toolbar-center { flex-grow: 1; text-align: center; padding: 0 15px; overflow: hidden; } .calendar-toolbar .toolbar-right { display: flex; align-items: center; gap: 6px; flex-shrink: 0; } /* View mode toggle (Presence / Heatmap) */ .cal-view-toggle { display: flex; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); overflow: hidden; flex-shrink: 0; } .cal-view-btn { padding: 5px 12px; font-size: 12px; font-family: var(--font-sans); font-weight: 500; background: var(--color-surface); color: var(--color-text-hint); border: none; cursor: pointer; transition: background .15s, color .15s; white-space: nowrap; } .cal-view-btn+.cal-view-btn { border-left: 1px solid var(--color-border-input); } .cal-view-btn:hover:not(.active) { background: var(--color-neutral); color: var(--color-text); } .cal-view-btn.active { background: var(--color-primary); color: #fff; font-weight: 600; } .cal-nav { display: flex; align-items: center; gap: 6px; } .cal-nav-btn { width: 32px; height: 32px; padding: 0; display: flex; align-items: center; justify-content: center; font-size: 13px; flex-shrink: 0; } .calendar-legend { display: flex; align-items: center; gap: 8px; justify-content: center; } .legend-icon { font-size: 13px; flex-shrink: 0; } .legend-items { display: flex; flex-wrap: wrap; gap: 8px 12px; justify-content: center; } .l-item { display: flex; align-items: center; gap: 4px; font-size: 11px; color: #64748b; white-space: nowrap; } .l-badge { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 3px; font-size: 10px; font-weight: 700; border: 1px solid transparent; } .badge-p { background: #f1f8e9; color: #2e7d32; border-color: #4caf50; } .badge-v { background: #ffebee; color: #c62828; border-color: #e57373; } .badge-o { background: #fff3e0; color: #e65100; border-color: #ffb74d; } .badge-n { background: #f3e5f5; color: #6a1b9a; border-color: #ce93d8; } .badge-k { background: #e3f2fd; color: #1565c0; border-color: #90caf9; } .badge-b { background: #fff8e1; color: #f57f17; border-color: #ffe082; } /* ── Calendar tab ────────────────────────────────────────────────────────────── */ /* Calendar layout: table + right sidebar */ .cal-layout { display: flex; gap: 16px; align-items: flex-start; } .cal-layout #calendar-container { flex: 1; min-width: 0; } .cal-sidebar-pane { width: 240px; flex-shrink: 0; } .cal-sidebar-pane { position: sticky; top: 12px; max-height: calc(100vh - 240px); overflow-y: auto; } .cal-sidebar-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 14px 16px; } .cal-sidebar-title { font-size: 13px; font-weight: 700; color: var(--color-text); margin: 0 0 8px; } .cal-info-date-input { display: block; width: 100%; box-sizing: border-box; padding: 5px 8px; font-size: 13px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); margin-bottom: 10px; color: var(--color-text); background: var(--color-surface); } /* Stats block */ .cal-sb-alerts { margin-bottom: 12px; } .cal-sb-stat-row { display: flex; align-items: center; gap: 6px; padding: 3px 0; font-size: 12px; color: var(--color-text); } .cal-sb-stat-row strong { margin-left: auto; font-size: 13px; } .cal-sb-placeholder { font-size: 12px; color: var(--color-text-muted); padding: 6px 0; } /* Departments accordion (native <details>/<summary>) */ .cal-sb-accordion { margin-bottom: 10px; } .cal-acc-item { border: 1px solid var(--color-border); border-radius: var(--radius-md); margin-bottom: 4px; overflow: hidden; } .cal-acc-hdr { display: flex; align-items: center; justify-content: space-between; gap: 6px; padding: 5px 10px; font-size: 12px; font-weight: 600; cursor: pointer; background: var(--color-neutral); list-style: none; user-select: none; } .cal-acc-hdr::-webkit-details-marker { display: none; } .cal-acc-dept { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--color-text); } .cal-acc-badge { flex-shrink: 0; font-size: 11px; font-weight: 700; color: var(--color-info-text); background: var(--color-info-bg); border-radius: 10px; padding: 1px 7px; } .cal-acc-progress { height: 4px; background: var(--color-border); } .cal-acc-progress-bar { height: 100%; background: var(--color-success); transition: width .3s; min-width: 2px; } .cal-acc-body { padding: 8px 10px; background: var(--color-surface); } .cal-acc-grp { display: flex; align-items: baseline; gap: 4px; font-size: 11px; padding: 2px 0; flex-wrap: wrap; } .cal-acc-label { color: var(--color-text-muted); flex-shrink: 0; } .cal-acc-names { color: var(--color-text); word-break: break-word; } /* Smart alerts */ .cal-smart-alert { font-size: 11px; line-height: 1.45; padding: 5px 8px; margin-bottom: 4px; border-radius: var(--radius-md); background: var(--color-warning-bg); color: #7c4a00; border-left: 3px solid var(--color-warning-text); } .cal-smart-ok { font-size: 11px; padding: 5px 8px; margin-bottom: 4px; border-radius: var(--radius-md); background: var(--color-success-bg); color: var(--color-success); border-left: 3px solid var(--color-success); } .cal-sb-divider { border-top: 1px solid var(--color-border); margin: 8px 0; } /* Legend */ .cal-sb-legend { border-top: 1px solid var(--color-border); padding-top: 10px; margin-top: 4px; } .cal-sb-legend-title { font-size: 11px; font-weight: 600; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: .04em; margin-bottom: 6px; } .cal-sb-legend-row { display: flex; align-items: center; gap: 8px; font-size: 12px; padding: 2px 0; color: var(--color-text); } /* Selected day column highlight */ .cal-table th.cal-col-selected:not(.cal-hdr-today):not(.cal-hdr-weekend) { background: #2563eb !important; color: #fff !important; } .cal-table td.cal-col-selected { box-shadow: inset 0 0 0 9999px rgba(37, 99, 235, 0.08); } #calendar-container { overflow: auto; max-height: calc(100vh - 260px); border: 1px solid var(--color-border); border-radius: var(--radius-lg); } .cal-table { border-collapse: collapse; font-size: 12px; table-layout: fixed; width: 100%; } /* Sticky header row */ .cal-table thead th { position: sticky; top: 0; z-index: 10; background: var(--color-primary); color: #fff; text-align: center; padding: 3px 2px; width: 30px; min-width: 30px; max-width: 30px; border: 1px solid #2a4a7b; font-size: 11px; font-weight: 700; line-height: 1.4; } .cal-table thead th.cal-hdr-weekend { background: #7f1d1d; color: #fca5a5; } .cal-table thead th.cal-hdr-today { background: #1565c0; font-weight: 700; border-left: 2px solid #86b7fe !important; border-right: 2px solid #86b7fe !important; } /* Sticky name column (body) */ .cal-name-col { position: sticky !important; left: 0; z-index: 5; background: var(--color-surface) !important; border-right: 2px solid var(--color-border) !important; padding: 4px 10px !important; width: auto !important; min-width: 140px !important; max-width: none !important; font-size: 12px; font-weight: 500; text-align: left !important; vertical-align: middle; } /* Sticky name column header (intersection) */ thead .cal-name-col { z-index: 20 !important; background: var(--color-primary) !important; color: #fff !important; text-align: left !important; width: auto !important; min-width: 120px !important; white-space: nowrap; } /* Fixed-width name wrapper for table cells */ .fixed-name { display: block; width: 100%; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .cal-emp-dept { font-size: 10px; color: var(--color-text-muted); font-weight: 400; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 1px; opacity: .85; } /* Sticky totals column (right) */ .cal-total-col { position: sticky; right: 0; z-index: 5; background: #f0f4f8; border-left: 2px solid var(--color-border) !important; font-size: 11px; color: #1565c0; font-weight: 700; width: 50px; min-width: 50px; max-width: 50px; text-align: center; padding: 2px; white-space: nowrap; } thead .cal-total-col { z-index: 15 !important; background: var(--color-primary) !important; color: #90caf9 !important; font-size: 11px; } /* Body cells */ .cal-table tbody td { border: 1px solid #e2e8f0; padding: 0; height: 28px; width: 30px; min-width: 30px; max-width: 30px; text-align: center; vertical-align: middle; font-weight: 600; font-size: 11px; } .cal-table tbody td[data-emp] { cursor: pointer; user-select: none; } /* Row-level hover — highlights the entire row without breaking per-cell colours */ .cal-table tbody tr:hover td { filter: brightness(0.93); } /* Individual cell hover slightly darker still */ .cal-table tbody td[data-emp]:hover { filter: brightness(0.86); } /* Day states — backgrounds mirror the cal-brush-menu button colors */ .cal-day-work { background: #f1f8e9; } /* soft green — matches modal 'Р' button */ .cal-day-off { background: #ffebee; } /* soft red — matches modal 'В' button */ /* Special status backgrounds (same palette as brush modal buttons) */ .cal-day-vac { background: #fff3e0; } /* light orange — matches modal 'О' button */ .cal-day-absent { background: #f3e5f5; } /* light purple — matches modal 'Н' button */ .cal-day-trip { background: #e3f2fd; } /* light blue — командировка 'К' */ .cal-day-sick { background: #fff8e1; } /* light amber — больничный 'Б' */ /* Today: borders only — vacation/status backgrounds must show through */ .cal-day-today { border-left: 2px solid #86b7fe !important; border-right: 2px solid #86b7fe !important; } /* Weekend-column vertical shading — inset shadow acts as additive overlay */ .cal-table th.weekend-col, .cal-table td.weekend-col { box-shadow: inset 0 0 0 9999px rgba(0, 0, 0, 0.028); } /* Status symbol colors — match the brush modal button text colors */ .cal-sym-work { color: #2e7d32; } /* green */ .cal-sym-off { color: #c62828; } /* red */ .cal-sym-vac { color: #e65100; } /* orange */ .cal-sym-absent { color: #6a1b9a; } /* purple */ .cal-sym-trip { color: #1565c0; } /* blue */ .cal-sym-sick { color: #f57f17; } /* amber */ /* Calendar legend */ .cal-legend { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-bottom: 10px; font-size: 12px; color: var(--color-text-muted); align-items: center; } .cal-legend-item { display: flex; align-items: center; gap: 5px; white-space: nowrap; } .cal-legend-cell { width: 18px; height: 18px; border-radius: 3px; border: 1px solid #ccc; display: inline-flex; align-items: center; justify-content: center; font-size: 10px; font-weight: 700; flex-shrink: 0; } /* Coverage map footer (tfoot) */ .cal-table tfoot td { position: sticky; bottom: 0; z-index: 10; background: #f1f5f9; border: 1px solid #d1d5db; border-top: 2px solid #94a3b8; text-align: center; font-size: 11px; font-weight: 700; height: 26px; vertical-align: middle; } .cal-tfoot-label { text-align: left !important; padding-left: 8px !important; color: var(--color-text-muted); font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; white-space: nowrap; } .cal-tfoot-day { color: var(--color-text); } .cal-cover-zero { background: #ffebee !important; color: #c62828; } .cal-cover-low { background: #fff3e0 !important; color: #e65100; } /* ── Vacation brush menu ────────────────────────────────────────────────────── */ .vac-brush-menu { position: fixed; z-index: 600; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: 0 4px 16px rgba(0, 0, 0, .18); padding: 10px 12px; min-width: 200px; user-select: none; } .vac-brush-menu.hidden { display: none; } .vac-brush-actions { display: flex; gap: 6px; margin-top: 8px; } .vac-brush-actions button { flex: 1; padding: 7px 4px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); background: var(--color-bg); font-size: 12px; font-weight: 600; cursor: pointer; transition: filter 0.1s; white-space: nowrap; } .vac-brush-actions button:hover { filter: brightness(0.92); } .vac-brush-actions [data-vac-action="summer"] { color: #b94d00; border-color: #ff922b; background: #fff4e6; } .vac-brush-actions [data-vac-action="winter"] { color: #1565c0; border-color: #4dabf7; background: #e3f2fd; } .vac-brush-actions [data-vac-action="delete"] { color: #c62828; border-color: #e57373; background: #ffebee; } .vac-brush-actions [data-vac-action="cancel"] { color: var(--color-text-muted); font-size: 18px; flex: 0 0 auto; padding: 4px 8px; } /* ── Calendar brush (drag-to-select) ────────────────────────────────────────── */ .cell-selected { background-color: rgba(59, 130, 246, 0.22) !important; outline: 1px dashed #3b82f6 !important; outline-offset: -1px; } .cal-brush-menu { position: fixed; z-index: 600; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: 8px; box-shadow: 0 6px 20px rgba(0, 0, 0, 0.16); padding: 10px 12px 12px; min-width: 200px; user-select: none; } .cal-brush-menu.hidden { display: none; } .cal-brush-title { font-size: 11px; color: var(--color-text-muted); margin-bottom: 8px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.04em; } .cal-brush-actions { display: flex; gap: 6px; } .cal-brush-actions button { flex: 1; padding: 7px 4px; border: 1px solid var(--color-border); border-radius: 5px; background: white; cursor: pointer; font-weight: 700; font-size: 14px; transition: filter 0.1s; } .cal-brush-actions button:hover { filter: brightness(0.92); } .cal-brush-actions [data-action="working"] { color: #2e7d32; border-color: #4caf50; background: #f1f8e9; } .cal-brush-actions [data-action="dayoff"] { color: #c62828; border-color: #e57373; background: #ffebee; } .cal-brush-actions [data-action="vacation"] { color: #e65100; border-color: #ffb74d; background: #fff3e0; } .cal-brush-actions [data-action="absent"] { color: #6a1b9a; border-color: #ce93d8; background: #f3e5f5; } .cal-brush-actions [data-action="trip"] { color: #1565c0; border-color: #90caf9; background: #e3f2fd; } .cal-brush-actions [data-action="sick"] { color: #f57f17; border-color: #ffe082; background: #fff8e1; } .cal-brush-actions [data-action="cancel"] { color: var(--color-text-muted); font-size: 18px; flex: 0 0 auto; padding: 4px 8px; } /* ── Workload tab ────────────────────────────────────────────────────────────── */ .wl-dashboard-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } .wl-chart-card, .wl-leaders-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 16px; box-shadow: var(--shadow-card); } .wl-card-title { font-size: 13px; font-weight: 700; color: var(--color-text); margin-bottom: 12px; padding-bottom: 8px; border-bottom: 1px solid var(--color-border); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .wl-chart-wrap { position: relative; height: 320px; } .wl-leaders-body { font-size: 13px; line-height: 1.7; overflow-y: auto; max-height: 320px; } .wl-ls-title { font-weight: 700; font-size: 12px; color: var(--color-text-hint); margin-top: 10px; margin-bottom: 2px; } .wl-ls-title:first-child { margin-top: 0; } .wl-ls-list { list-style: none; padding: 0; margin: 0 0 2px; } .wl-ls-list li { padding: 1px 0 1px 14px; position: relative; font-size: 12px; } .wl-ls-list li::before { content: "•"; position: absolute; left: 2px; color: var(--color-text-muted); } .wl-ls-warn li { color: var(--color-warning-text); } .wl-ls-list .wl-ok { color: var(--color-success); } /* ── Workload sub-toolbar ──────────────────────────────────────────────────── */ .wl-subtoolbar { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; padding: 8px 12px; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); } .wl-view-btns { display: flex; gap: 4px; } .wl-view-btn { width: 32px; height: 32px; border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-neutral); color: var(--color-text-hint); cursor: pointer; font-size: 16px; display: flex; align-items: center; justify-content: center; transition: background .15s, border-color .15s; } .wl-view-btn:hover { background: var(--color-neutral-dark); } .wl-view-btn.active { background: #fff3cd; border-color: #ffc107; color: #856404; } .wl-toolbar-sep { flex: 1; } .wl-filter-group { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } /* ── Deadlines advanced UI ───────────────────────────────────────────────────── */ /* Single-row toolbar — all children on one flex axis */ .deadlines-toolbar { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 14px; } .deadlines-toolbar .search-input { min-width: 220px; } /* Primary action buttons — margin-left:auto pins them to the right edge */ .dl-primary-actions { display: flex; align-items: center; flex-shrink: 0; margin-left: auto; padding-left: 16px; border-left: 2px solid var(--color-border); gap: 10px; } /* Icon-only refresh button */ .btn-icon-sm { width: 32px; height: 32px; padding: 0; border: 1.5px solid var(--color-border-input); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-text-muted); font-size: 16px; line-height: 1; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; transition: background .15s, border-color .15s, color .15s; } .btn-icon-sm:hover:not(:disabled) { background: #f0f4fb; border-color: var(--color-primary); color: var(--color-primary); } .btn-icon-sm:disabled { opacity: .45; cursor: not-allowed; } /* Upload-date history selector in deadlines toolbar */ .dl-date-sel { height: 32px; padding: 0 8px; border: 1.5px solid var(--color-border-input); border-radius: var(--radius-md); background: #fff; font-size: 12px; font-family: var(--font-sans); color: var(--color-text); outline: none; cursor: pointer; max-width: 170px; } .dl-date-sel:focus { border-color: var(--color-primary); } /* Compact variant inside stats bar */ .dl-date-sel-sm { height: 26px; padding: 0 8px; font-size: 12px; min-width: 160px; max-width: 220px; } /* ── Square icon-only modifier (used on primary toolbar buttons) ────────────── */ .dl-icon-btn { position: relative; width: 48px; height: 48px; padding: 0; border-radius: 10px; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; } /* CSS tooltip via data-tooltip attribute */ .dl-icon-btn[data-tooltip]::before, .dl-icon-btn[data-tooltip]::after { position: absolute; bottom: calc(100% + 8px); left: 50%; transform: translateX(-50%); pointer-events: none; opacity: 0; transition: opacity .15s ease, transform .15s ease; transform: translateX(-50%) translateY(4px); z-index: 9999; white-space: nowrap; } .dl-icon-btn[data-tooltip]::after { content: attr(data-tooltip); background: rgba(30, 30, 40, .88); color: #fff; font-size: 12px; font-family: var(--font-sans); font-weight: 500; padding: 5px 10px; border-radius: 6px; line-height: 1.4; backdrop-filter: blur(4px); } .dl-icon-btn[data-tooltip]::before { content: ''; border: 5px solid transparent; border-top-color: rgba(30, 30, 40, .88); bottom: calc(100% + 0px); } .dl-icon-btn[data-tooltip]:hover::before, .dl-icon-btn[data-tooltip]:hover::after { opacity: 1; transform: translateX(-50%) translateY(0); } /* ── Excel Upload button — Microsoft-green, square ──────────────────────────── */ .btn-excel-upload { border: none; background: #107c41; color: #fff; cursor: pointer; box-shadow: 0 2px 6px rgba(16, 124, 65, .35); transition: transform .15s ease, box-shadow .15s ease, background .15s; } .btn-excel-upload:hover:not(:disabled) { background: #0e6b38; box-shadow: 0 5px 14px rgba(16, 124, 65, .45); transform: translateY(-2px); } .btn-excel-upload:active:not(:disabled) { transform: translateY(0); box-shadow: 0 2px 6px rgba(16, 124, 65, .35); } .btn-excel-upload:disabled { opacity: .55; cursor: not-allowed; transform: none; box-shadow: none; } /* ── Master Send button — indigo gradient, square ───────────────────────────── */ .btn-master-send { border: none; background: linear-gradient(135deg, #0052D4 0%, #4364F7 60%, #6FB1FC 100%); color: #fff; cursor: pointer; box-shadow: 0 2px 8px rgba(67, 100, 247, .40); transition: transform .15s ease, box-shadow .15s ease, filter .15s; } .btn-master-send:hover:not(:disabled) { filter: brightness(1.08); box-shadow: 0 6px 18px rgba(67, 100, 247, .50); transform: translateY(-2px); } .btn-master-send:active:not(:disabled) { transform: translateY(0); box-shadow: 0 2px 8px rgba(67, 100, 247, .40); } .btn-master-send:disabled { opacity: .55; cursor: not-allowed; transform: none; box-shadow: none; } /* Outline-success button (white bg, green border + text) */ .btn-outline-success { padding: 7px 16px; border: 1.5px solid var(--color-success); border-radius: var(--radius-md); background: var(--color-surface); color: var(--color-success); font-size: 13px; font-weight: 600; font-family: var(--font-sans); cursor: pointer; white-space: nowrap; transition: background .15s, color .15s; } .btn-outline-success:hover:not(:disabled) { background: var(--color-success-bg); } .btn-outline-success:disabled { opacity: .45; cursor: not-allowed; } /* ── Warning button (orange) ─────────────────────────────────────────────────── */ .btn-warning { padding: 7px 14px; border: 1px solid #e65100; border-radius: var(--radius-md); background: #e65100; color: #fff; font-size: 13px; font-family: var(--font-sans); cursor: pointer; white-space: nowrap; transition: background .15s, border-color .15s; } .btn-warning:hover:not(:disabled) { background: #bf360c; border-color: #bf360c; } .btn-warning:disabled { opacity: .45; cursor: not-allowed; } /* ── Email remind modal ──────────────────────────────────────────────────────── */ .email-remind-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; align-items: start; margin-bottom: 16px; } @media (max-width: 680px) { .email-remind-grid { grid-template-columns: 1fr; } } .email-remind-col .field>label { display: block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-hint); margin-bottom: 5px; } .email-remind-textarea { width: 100%; box-sizing: border-box; padding: 8px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); line-height: 1.6; resize: vertical; } .email-remind-textarea:focus { outline: none; border-color: var(--color-primary); } .email-vars-hint { font-size: 11px; color: var(--color-text-muted); margin-top: 6px; } .email-vars-hint code { background: var(--color-neutral); padding: 1px 5px; border-radius: 3px; font-size: 11px; color: var(--color-primary); font-family: "Consolas", "Courier New", monospace; } .email-preview-box { border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 14px 16px; background: #f8fafc; font-size: 13px; line-height: 1.7; min-height: 220px; max-height: 360px; overflow-y: auto; color: var(--color-text); } .email-preview-subject { font-weight: 700; font-size: 13px; color: var(--color-primary); border-bottom: 1px solid var(--color-border); padding-bottom: 6px; margin-bottom: 10px; } .email-preview-empty { color: var(--color-text-muted); font-style: italic; font-size: 12px; } /* ── Deadlines layout: content column + right sidebar ────────────────────────── */ .deadlines-layout { display: flex; gap: 20px; align-items: flex-start; } .deadlines-content { flex: 1 1 0; min-width: 0; overflow-x: auto; } .deadlines-sidebar { width: 280px; flex-shrink: 0; background: #f8fafc; border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 14px 16px; position: sticky; top: 20px; max-height: calc(100vh - 280px); overflow-y: auto; } /* Workload list rows inside sidebar */ .dl-sb-idle-name { font-size: 12px; line-height: 1.7; color: var(--color-danger); font-weight: 600; } .dl-sb-all-busy { color: var(--color-success); font-style: italic; } /* Dept group: native <details> accordion */ details.dl-sb-dept-group { margin-bottom: 10px; } details.dl-sb-dept-group:last-child { margin-bottom: 0; } details.dl-sb-dept-group>summary.dl-sb-dept-header { list-style: none; cursor: pointer; user-select: none; display: flex; justify-content: space-between; align-items: center; font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.6px; color: var(--color-text-muted); padding: 4px 0 3px; margin-bottom: 2px; border-bottom: 1px solid var(--color-border); transition: color .15s; } details.dl-sb-dept-group>summary.dl-sb-dept-header:hover { color: var(--color-primary); } details.dl-sb-dept-group>summary.dl-sb-dept-header::-webkit-details-marker { display: none; } details.dl-sb-dept-group>summary.dl-sb-dept-header::after { content: '▾'; font-size: 10px; line-height: 1; transition: transform .2s; } details.dl-sb-dept-group[open]>summary.dl-sb-dept-header::after { transform: scaleY(-1); } /* Busy-expert rows */ .dl-sb-busy-row { display: flex; justify-content: space-between; align-items: center; font-size: 12px; padding: 3px 0; border-bottom: 1px solid #f0f0f0; gap: 8px; } .dl-sb-busy-row:last-child { border-bottom: none; } /* Row variant with progress bar */ .dl-sb-busy-row--bar { flex-direction: column; align-items: stretch; padding: 4px 0; gap: 3px; } .dl-sb-busy-top { display: flex; justify-content: space-between; align-items: center; gap: 8px; } /* Progress bar track + fill */ .dl-sb-progress { height: 5px; background: #e4e9ef; border-radius: 2px; overflow: hidden; } .dl-sb-progress-fill { height: 100%; border-radius: 2px; transition: width .35s ease; } .dl-sb-progress--ok { background: var(--color-success); } .dl-sb-progress--warn { background: var(--color-warning-text); } .dl-sb-progress--danger { background: var(--color-danger); } /* Name / count styles */ .dl-sb-busy-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-sb-name-over { color: var(--color-danger); font-weight: 700; } .dl-sb-count { font-weight: 700; color: var(--color-primary); min-width: 28px; text-align: right; flex-shrink: 0; font-size: 11px; } .dl-sb-count--ok { color: var(--color-success); } .dl-sb-count--warn { color: var(--color-warning-text); } .dl-sb-count--danger { color: var(--color-danger); } @media (max-width: 1200px) { .deadlines-layout { flex-direction: column; } .deadlines-sidebar { width: 100%; position: static; max-height: none; } } /* Stats bar: Загружено · В работе · База от */ .dl-stats-bar { display: flex; align-items: center; gap: 8px; flex-shrink: 0; } /* Small action icons (🗑 ⚙) visually separated from date/history controls */ .dl-stats-bar #btn-delete-upload { margin-left: 12px; } /* "Всего" / total column in stats table */ .dl-col-total { background-color: #f4f6fb !important; border-left: 2px solid #d8dff0 !important; border-right: 2px solid #d8dff0 !important; font-weight: 700 !important; font-size: 0.9rem !important; color: #212529 !important; } .dl-stat-chip { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 12px; font-size: 12px; font-weight: 600; white-space: nowrap; border: 1px solid transparent; } .dl-stat-blue { background: var(--color-info-bg); color: var(--color-info-text); border-color: var(--color-border-blue); } .dl-stat-green { background: var(--color-success-bg); color: var(--color-success); border-color: var(--color-success-border); } .dl-stat-date { font-size: 11px; color: var(--color-text-muted); white-space: nowrap; } /* Threshold dropdown block */ .dl-threshold-block { display: flex; align-items: center; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 0 4px 0 10px; white-space: nowrap; height: 32px; } .dl-threshold-block select { border: none; background: transparent; font-size: 12px; font-family: var(--font-sans); font-weight: 700; color: var(--color-primary); cursor: pointer; outline: none; padding: 0 4px; height: 100%; } /* Action bar above the "Все дела" table */ .dl-action-bar { display: flex; align-items: center; justify-content: flex-end; gap: 8px; margin-bottom: 8px; } .dl-action-group { display: inline-flex; gap: 0; } .dl-action-group button { padding: 5px 12px; font-size: 12px; border-radius: 0; } .dl-action-group button:first-child { border-radius: var(--radius-md) 0 0 var(--radius-md); } .dl-action-group button:last-child { border-radius: 0 var(--radius-md) var(--radius-md) 0; margin-left: -1px; } /* ── Service-type pill badges (Soft UI pastel palette) ───────────────────────── */ .svc-badge { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 11px; font-weight: 600; white-space: nowrap; line-height: 1.55; border: 1px solid transparent; } .svc-badge--osago { background: #e0f2fe; color: #0369a1; border-color: #bae6fd; } .svc-badge--court { background: #ede9fe; color: #6d28d9; border-color: #c4b5fd; } .svc-badge--smeta { background: #dcfce7; color: #166534; border-color: #bbf7d0; } .svc-badge--calc { background: #dbeafe; color: #1d4ed8; border-color: #bfdbfe; } .svc-badge--estate { background: #ffedd5; color: #c2410c; border-color: #fed7aa; } .svc-badge--eval { background: #d1fae5; color: #065f46; border-color: #a7f3d0; } .svc-badge--default { background: #f1f5f9; color: #475569; border-color: #e2e8f0; } /* ── Soft deadline cell backgrounds ──────────────────────────────────────────── */ .dl-td-age--fresh { background: #f0fdf4; } .dl-td-age--normal { background: #fefce8; } .dl-td-age--aging { background: #fff7ed; } .dl-td-age--urgent { background: #fef2f2; } /* ── Deadline table checkbox column ──────────────────────────────────────────── */ .dl-th-cb, .dl-td-cb { width: 36px; min-width: 36px; padding: 0 4px !important; text-align: center; vertical-align: middle; } .dl-row-cb, #dl-select-all { width: 14px; height: 14px; cursor: pointer; accent-color: var(--color-primary); vertical-align: middle; } /* Sub-tabs (inner tabs for the deadlines module) */ .dl-subtabs { display: flex; gap: 2px; margin-bottom: 14px; border-bottom: 2px solid var(--color-border); padding-bottom: 0; } .dl-subtab { padding: 8px 18px; border: none; background: none; font-size: 13px; font-weight: 500; font-family: var(--font-sans); color: var(--color-text-muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; transition: color .15s, border-color .15s; display: flex; align-items: center; gap: 6px; } .dl-subtab:hover { color: var(--color-primary); } .dl-subtab.active { color: var(--color-primary); font-weight: 700; border-bottom-color: var(--color-primary); } .dl-badge { display: inline-flex; align-items: center; justify-content: center; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px; background: var(--color-danger); color: #fff; font-size: 10px; font-weight: 700; line-height: 1; } .dl-badge.empty { background: var(--color-neutral); color: var(--color-text-muted); } /* Department stats table */ .dl-stats-table { width: 100%; border-collapse: collapse; font-size: 12px; } .dl-stats-table th { background: var(--color-primary); color: #fff; padding: 6px 8px; text-align: center; font-size: 11px; font-weight: 700; white-space: nowrap; } .dl-stats-table th:first-child { text-align: left; } .dl-stats-table td { padding: 5px 8px; border: 1px solid var(--color-border); text-align: center; vertical-align: middle; } .dl-stats-table td:first-child { text-align: left; font-weight: 600; } .dl-stats-table tbody tr:nth-child(even) td { background: var(--color-bg); } .dl-stats-table tr.dl-stats-total td { background: #1a3a6b; color: #fff; font-weight: 700; } .dl-cell-urgent { background: #fee2e2 !important; color: #c62828; font-weight: 700; } .dl-cell-warning { background: #fff9c4 !important; color: #f57f17; font-weight: 700; } .dl-cell-ok { background: #e8f5e9 !important; color: #2e7d32; } .dl-cell-closed { color: var(--color-success); } .dl-cell-new { color: var(--color-danger); } /* Side drawer (assignment panel) */ .dl-assign-overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, .35); z-index: 900; display: flex; justify-content: flex-end; } .dl-assign-overlay.hidden { display: none; } .dl-assign-drawer { width: 360px; max-width: 96vw; background: var(--color-surface); height: 100%; box-shadow: -4px 0 24px rgba(0, 0, 0, .18); display: flex; flex-direction: column; animation: dlSlideIn .2s ease; } @keyframes dlSlideIn { from { transform: translateX(100%); } to { transform: translateX(0); } } .dl-assign-header { display: flex; align-items: flex-start; justify-content: space-between; padding: 20px 20px 14px; border-bottom: 1px solid var(--color-border); } .dl-assign-case-num { font-size: 17px; font-weight: 700; color: var(--color-text); font-family: var(--font-mono); } .dl-assign-meta { font-size: 12px; color: var(--color-text-muted); margin-top: 4px; } .dl-assign-body { padding: 20px; flex: 1; overflow-y: auto; } .dl-assign-body .field { margin-bottom: 16px; } .dl-assign-body label { display: block; font-size: 12px; font-weight: 600; color: var(--color-text-hint); margin-bottom: 5px; } .dl-assign-body select, .dl-assign-body textarea { width: 100%; box-sizing: border-box; padding: 7px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); outline: none; transition: border-color .15s; } .dl-assign-body select:focus, .dl-assign-body textarea:focus { border-color: var(--color-primary); } /* Row fade-out animation for unassigned list */ @keyframes dlFadeSlideOut { to { opacity: 0; max-height: 0; padding: 0; border: none; overflow: hidden; } } .dl-row-remove { animation: dlFadeSlideOut .4s forwards; } /* ── Employee status badges (pill-shaped, override circle .badge) ────────────── */ .badge-temp, .badge-reso { width: auto; height: auto; border-radius: 10px; font-size: 11px; font-weight: 600; padding: 2px 7px; } .badge-temp { background: #fff3e0; color: #e65100; border: 1px solid #ffcc80; } .badge-reso { background: #e3f2fd; color: #1565c0; border: 1px solid #90caf9; } .badge-manager { background: #fff8e1; color: #1a237e; border: 1px solid #ffe082; } /* ── Employee table enhancements ─────────────────────────────────────────────── */ .emp-name-cell { display: flex; align-items: center; gap: 10px; } .emp-contacts { display: flex; flex-direction: column; gap: 2px; font-size: 12px; color: var(--color-text-muted); line-height: 1.5; } .emp-contact-link { color: var(--color-primary); text-decoration: none; font-size: 12px; } .emp-contact-link:hover { text-decoration: underline; } /* ── Employee specialization chips (modal svc_types display) ────────────────── */ .emp-svc-chips { display: flex; flex-wrap: wrap; gap: 6px; min-height: 28px; padding: 4px 0; } .emp-svc-chip { display: inline-block; padding: 3px 10px; border-radius: 12px; background: var(--color-info-bg); color: var(--color-info-text); font-size: 12px; font-weight: 500; white-space: nowrap; } /* ── Custom multi-select dropdown (absolute float, no height impact) ─────────── */ .custom-multiselect { position: relative; } .multiselect-header { display: flex; align-items: center; justify-content: space-between; padding: 7px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); background: #fafafa; cursor: pointer; font-size: 13px; font-family: var(--font-sans); color: var(--color-text); user-select: none; transition: border-color .15s, background .15s; } .multiselect-header:hover, .custom-multiselect.open .multiselect-header { border-color: var(--color-primary); background: #fff; } .multiselect-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--color-text-muted); } .custom-multiselect.has-selection .multiselect-title { color: var(--color-text); font-weight: 500; } .multiselect-arrow { font-size: 10px; color: var(--color-text-muted); margin-left: 8px; flex-shrink: 0; transition: transform .2s; } .custom-multiselect.open .multiselect-arrow { transform: rotate(180deg); } .multiselect-dropdown { position: absolute; top: calc(100% + 3px); left: 0; right: 0; z-index: 1000; background: #fff; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); box-shadow: 0 4px 12px rgba(0, 0, 0, .12); max-height: 200px; overflow-y: auto; } .multiselect-dropdown .msd-item { display: flex; align-items: center; gap: 8px; padding: 6px 10px; cursor: pointer; font-size: 13px; font-weight: 400 !important; color: var(--color-text) !important; text-transform: none !important; letter-spacing: 0 !important; user-select: none; } .multiselect-dropdown .msd-item:hover { background: var(--color-info-bg); } .multiselect-dropdown .msd-item:has(input:checked) { background: #eef4ff; color: var(--color-primary) !important; font-weight: 500 !important; } .multiselect-dropdown .msd-item input[type="checkbox"] { accent-color: var(--color-primary); width: 14px; height: 14px; flex-shrink: 0; cursor: pointer; margin: 0; } .multiselect-dropdown .msd-dept { font-size: 11px; color: var(--color-text-muted); margin-left: auto; white-space: nowrap; } .multiselect-dropdown .msd-empty { padding: 10px 12px; font-size: 12px; color: var(--color-text-muted); font-style: italic; } /* ── Employee modal: compact grid + toggle group ─────────────────────────────── */ #modal-employee .emp-form-grid { gap: 10px 16px; } .emp-toggles-row { display: flex; gap: 16px; justify-content: space-between; flex-wrap: wrap; padding: 10px 14px; background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-md); } /* ── Toggle switch ───────────────────────────────────────────────────────────── */ .toggle-wrap { display: inline-flex; align-items: center; gap: 8px; cursor: pointer; user-select: none; } .toggle-input { position: absolute; opacity: 0; width: 0; height: 0; pointer-events: none; } .toggle-track { width: 40px; height: 22px; border-radius: 11px; background: var(--color-neutral-dark); position: relative; transition: background .2s; flex-shrink: 0; } .toggle-input:checked+.toggle-track { background: var(--color-danger); } .toggle-input.toggle-success:checked+.toggle-track { background: var(--color-success); } .toggle-input.toggle-warning:checked+.toggle-track { background: var(--color-warning-text); } .toggle-input.toggle-info:checked+.toggle-track { background: var(--color-info-text); } .toggle-thumb { position: absolute; top: 3px; left: 3px; width: 16px; height: 16px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .3); transition: left .2s; } .toggle-input:checked+.toggle-track .toggle-thumb { left: 21px; } /* ── Responsive: collapse form-grid to 1 column on narrow screens ────────────── */ @media (max-width: 620px) { .form-grid { grid-template-columns: 1fr !important; } .form-grid .field.full { grid-column: 1 !important; } .modal-box { padding: 20px 16px; } } /* ── Distribution rules matrix modal ────────────────────────────────────────── */ .dist-rules-modal { max-width: min(1200px, 94vw); width: 94vw; overflow-x: hidden; } .dist-rules-legend { display: flex; align-items: center; gap: 12px; font-size: 11px; margin-top: 4px; flex-wrap: wrap; } .dist-legend-deny { color: var(--color-danger); font-weight: 600; } .dist-legend-only { color: var(--color-primary); font-weight: 600; } .dist-rules-toolbar { display: flex; align-items: center; gap: 8px; padding: 10px 0 12px; border-bottom: 1px solid var(--color-border); margin-bottom: 12px; } .dist-rules-table-wrap { overflow-x: auto; overflow-y: auto; max-height: 55vh; border: 1px solid var(--color-border); border-radius: var(--radius-md); } .dist-rules-table { width: 100%; font-size: 12px; } .dist-rule-row { cursor: pointer; } .dist-rule-row:hover td { background: var(--color-info-bg); } .dist-rule-row.selected td { background: #eef0fb !important; outline: none; } .dist-rule-row.dist-rule-inactive td:not(:last-child) { opacity: .45; } .dist-rules-empty { text-align: center; color: var(--color-text-muted); font-size: 13px; padding: 24px 0; font-style: italic; } .dist-cell-deny { color: var(--color-danger); font-size: 12px; word-break: break-word; max-width: 180px; display: block; } .dist-cell-only { color: var(--color-primary); font-size: 12px; word-break: break-word; max-width: 180px; display: block; } .dist-cell-empty { color: var(--color-text-muted); font-size: 13px; } /* ── Distribution limits modal ──────────────────────────────────────────────── */ .dist-limits-legend { display: flex; flex-direction: column; gap: 8px; padding: 10px 0 14px; border-bottom: 1px solid var(--color-border); margin-bottom: 12px; flex-shrink: 0; } .dist-limits-legend-chips { display: flex; align-items: center; gap: 10px; font-size: 12px; color: var(--color-text-muted); flex-wrap: wrap; } .dl-legend-chip { width: 14px; height: 14px; border-radius: 3px; border: 1px solid rgba(0, 0, 0, .12); display: inline-block; flex-shrink: 0; } .limit-reached-chip { background: #fca5a5; } .limit-warning-chip { background: #fecaca; } /* Limits modal — flex layout so footer is always visible */ #modal-dist-limits .modal-box { display: flex; flex-direction: column; overflow: hidden; /* kills the outer double-scroll */ max-height: 92vh; } #modal-dist-limits .modal-footer { flex-shrink: 0; /* footer never squishes */ } .dist-limits-table-wrap { flex: 1; min-height: 0; /* allows flex child to shrink below content height */ overflow-y: auto; /* sole vertical scroll source */ overflow-x: auto; max-height: none; /* removed fixed 56vh — flex handles height */ } .dist-limits-table { width: 100%; } tr.limit-reached td { background: #fca5a5 !important; } tr.limit-warning td { background: #fecaca !important; } .limit-inline-input { width: 80px; padding: 4px 6px; border: 1px solid transparent; border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); text-align: center; background: transparent; outline: none; transition: border-color .15s, background .15s; } .limit-inline-input:hover { border-color: var(--color-border-input); background: #fff; } .limit-inline-input:focus { border-color: var(--color-primary); background: #fff; } /* ── Rule add/edit form ─────────────────────────────────────────────────────── */ .rule-param-block { margin-bottom: 6px; padding: 8px 10px; background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-md); } .rule-param-label { display: block; font-size: 10px; font-weight: 700; color: var(--color-text-hint); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 4px; } .rule-param-row { display: grid; grid-template-columns: 150px 1fr; gap: 8px; align-items: start; } .rule-type-select { padding: 5px 8px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); background: #fff; outline: none; cursor: pointer; width: 100%; transition: border-color .15s; } .rule-type-select:focus { border-color: var(--color-primary); } .rule-values-input { width: 100%; box-sizing: border-box; padding: 5px 8px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 12px; font-family: var(--font-sans); outline: none; resize: vertical; line-height: 1.5; transition: border-color .15s; } .rule-values-input:focus { border-color: var(--color-primary); } .rule-values-input:disabled { background: var(--color-neutral); color: var(--color-text-muted); cursor: not-allowed; } /* ── Rule form: checkbox-list controls ──────────────────────────────────────── */ .rule-type-wide { display: block; width: 100%; margin-bottom: 6px; } /* ── Rule form: compact toolbar (toggle left + mode buttons right) ─────────── */ .rule-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 6px; margin-bottom: 6px; } .rule-tgl-btn { font-size: 11px; font-weight: 500; padding: 2px 8px; background: var(--color-surface); color: var(--color-text-secondary); border: 1px solid var(--color-border); border-radius: var(--radius-sm); cursor: pointer; white-space: nowrap; transition: background .12s, border-color .12s; } .rule-tgl-btn:hover { background: var(--color-neutral); border-color: var(--color-text-muted); } .rule-mode-group { display: flex; border: 1px solid var(--color-border); border-radius: var(--radius-sm); overflow: hidden; } .rule-mode-input { display: none; } .rule-mode-lbl { padding: 2px 7px; font-size: 10px; line-height: 1.6; cursor: pointer; background: var(--color-surface); color: var(--color-text-muted); border-right: 1px solid var(--color-border); transition: background .12s, color .12s; user-select: none; } .rule-mode-lbl:last-child { border-right: none; } .rule-mode-input:checked+.rule-mode-deny { background: #fce4e4; color: var(--color-danger); font-weight: 600; } .rule-mode-input:checked+.rule-mode-only { background: #fff4d6; color: #b8860b; font-weight: 600; } .rule-mode-lbl:hover { background: var(--color-neutral); } .rule-cb-list { height: calc(100vh - 450px); min-height: 150px; overflow-y: auto; border: 1px solid var(--color-border); border-radius: var(--radius-sm); padding: 5px 8px; background: #f8fafc; } .rule-cb-list label { display: flex; align-items: center; gap: 6px; padding: 2px 0; font-size: 12px; cursor: pointer; color: var(--color-text); user-select: none; } .rule-cb-list label:hover { color: var(--color-primary); } .rule-cb-list::-webkit-scrollbar { width: 4px; } .rule-cb-list::-webkit-scrollbar-track { background: transparent; } .rule-cb-list::-webkit-scrollbar-thumb { background: var(--color-border); border-radius: 2px; } .rule-cb-list::-webkit-scrollbar-thumb:hover { background: var(--color-text-muted); } /* ── Rule form: 4-column criteria grid ───────────────────────────────────────── */ .criteria-grid { display: grid; grid-template-columns: 1fr 1fr 1fr 1fr; gap: 8px; align-items: start; margin-bottom: 8px; } .rradio-only:checked+.rradio-only-lbl { background: var(--color-success); color: #fff; border-color: var(--color-success); font-weight: 600; } /* ── Distribution preview modal ─────────────────────────────────────────────── */ #dist-preview-table { font-size: 12px; } #dist-preview-table thead th { white-space: nowrap; } #dist-preview-table td:nth-child(7) { /* Кандидат column */ font-weight: 600; color: var(--color-primary); } #dist-preview-table input[type="checkbox"] { width: 15px; height: 15px; accent-color: var(--color-primary); cursor: pointer; } #dist-preview-table tr:has(input:not(:checked)) td { opacity: 0.45; } #dist-preview-table tr:has(input:not(:checked)) td:first-child { opacity: 1; } /* ── Global settings modal: email management section ────────────────────────── */ .gs-email-section { background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 16px 18px 12px; margin-top: 14px; } .gs-email-section-title { font-size: 14px; font-weight: 700; color: var(--color-text); padding-bottom: 10px; margin-bottom: 14px; border-bottom: 2px solid var(--color-border); } .gs-email-rows-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; } @media (max-width: 760px) { .gs-email-rows-grid { grid-template-columns: 1fr; } } .gs-email-row { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 12px 12px 10px; } .gs-email-label { display: block; font-size: 12px; font-weight: 700; color: var(--color-text); margin-bottom: 7px; } .gs-email-input-row { display: flex; gap: 8px; align-items: flex-start; } .gs-email-input { display: block; width: 100%; box-sizing: border-box; padding: 6px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); outline: none; resize: vertical; overflow-wrap: break-word; word-break: break-all; transition: border-color .15s; } .gs-email-input:focus { border-color: var(--color-primary); } .gs-email-btn-row { margin-top: 6px; display: flex; justify-content: flex-end; } .gs-email-save { padding: 6px 12px; font-size: 12px; white-space: nowrap; } .gs-email-hint { font-size: 11px; color: var(--color-text-muted); margin: 4px 0 0; line-height: 1.5; } /* ── Email chip blocks (To / CC) ─────────────────────────────────────────────── */ .gs-chip-block { margin-bottom: 8px; padding: 6px 8px; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-bg); } .gs-chip-block-cc { border-style: dashed; background: transparent; } .gs-chip-section-label { font-size: 10px; font-weight: 700; letter-spacing: .04em; color: var(--color-text-muted); text-transform: uppercase; margin-bottom: 5px; } .gs-chip-list { display: flex; flex-wrap: wrap; gap: 4px; min-height: 22px; margin-bottom: 6px; } .gs-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 6px 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; white-space: nowrap; max-width: 200px; overflow: hidden; text-overflow: ellipsis; } .gs-chip-to { background: var(--color-info-bg); color: var(--color-info-text); border: 1px solid #b3d1f0; } .gs-chip-cc { background: var(--color-neutral); color: var(--color-text-hint); border: 1px solid var(--color-border); } .gs-chip-del { background: none; border: none; cursor: pointer; color: inherit; opacity: .6; font-size: 13px; line-height: 1; padding: 0 1px; flex-shrink: 0; } .gs-chip-del:hover { opacity: 1; } .gs-chip-empty { font-size: 11px; color: var(--color-disabled); font-style: italic; } .gs-chip-add-row { display: flex; gap: 6px; align-items: center; } .gs-chip-input { flex: 1; min-width: 0; padding: 4px 8px; font-size: 12px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); outline: none; background: var(--color-surface); color: var(--color-text); transition: border-color .15s; } .gs-chip-input:focus { border-color: var(--color-primary); } /* ── Rule is_active toggle switch ────────────────────────────────────────────── */ .rule-toggle-wrap { display: flex; align-items: center; justify-content: center; } .rule-toggle-label { position: relative; display: inline-block; width: 38px; height: 22px; cursor: pointer; flex-shrink: 0; } .rule-toggle-label input { opacity: 0; width: 0; height: 0; position: absolute; } .rule-toggle-slider { position: absolute; inset: 0; background: var(--color-border); border-radius: 22px; transition: background .18s; } .rule-toggle-slider::before { content: ''; position: absolute; width: 16px; height: 16px; left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: transform .18s; box-shadow: 0 1px 3px rgba(0, 0, 0, .2); } .rule-toggle-label input:checked+.rule-toggle-slider { background: var(--color-success); } .rule-toggle-label input:checked+.rule-toggle-slider::before { transform: translateX(16px); } .rule-toggle-label input:disabled+.rule-toggle-slider { opacity: .5; cursor: not-allowed; } .btn-duplicate-rule { width: 28px; height: 28px; padding: 0; border: none; border-radius: var(--radius-md); background: transparent; color: var(--color-text-muted); cursor: pointer; display: inline-flex; align-items: center; justify-content: center; transition: background .15s, color .15s; } .btn-duplicate-rule:hover { background: var(--color-neutral); color: var(--color-primary); } .btn-duplicate-rule:active { background: var(--color-neutral-dark); } /* Preview links in send modals */ .gs-preview-addr { color: var(--color-primary); text-decoration: none; font-size: 12px; } .gs-preview-addr:hover { text-decoration: underline; } .gs-preview-addr-cc { color: var(--color-text-muted); } /* ── Template editor accordion (used in all 4 send-email modals) ─────────────── */ .tpl-section { border: 1px solid var(--color-border); border-radius: var(--radius-md); margin-bottom: 14px; background: var(--color-bg); } .tpl-section summary { padding: 8px 12px; font-size: 12px; font-weight: 700; color: var(--color-text-hint); cursor: pointer; list-style: none; user-select: none; } .tpl-section summary::-webkit-details-marker { display: none; } .tpl-section summary::before { content: '▸ '; font-size: 10px; } .tpl-section[open] summary::before { content: '▾ '; } .tpl-section summary:hover { color: var(--color-primary); } .tpl-fields { padding: 10px 12px 12px; border-top: 1px solid var(--color-border); display: flex; flex-direction: column; gap: 8px; } .tpl-fields label { display: block; font-size: 11px; font-weight: 600; color: var(--color-text-hint); margin-bottom: 3px; } .tpl-subject-input { width: 100%; box-sizing: border-box; padding: 6px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 13px; font-family: var(--font-sans); outline: none; transition: border-color .15s; } .tpl-subject-input:focus { border-color: var(--color-primary); } .tpl-body-textarea { width: 100%; box-sizing: border-box; padding: 6px 10px; border: 1px solid var(--color-border-input); border-radius: var(--radius-md); font-size: 12px; font-family: var(--font-sans); outline: none; resize: vertical; transition: border-color .15s; min-height: 100px; } .tpl-body-textarea:focus { border-color: var(--color-primary); } .tpl-preview { background: var(--color-surface); border: 1px dashed var(--color-border); border-radius: var(--radius-md); padding: 8px 12px; font-size: 12px; line-height: 1.6; color: var(--color-text); min-height: 48px; white-space: pre-wrap; word-break: break-word; } .tpl-preview-subject { font-weight: 700; font-size: 12px; color: var(--color-text); padding-bottom: 6px; border-bottom: 1px solid var(--color-border); margin-bottom: 6px; } /* ── Button spinner (inline rotating ring) ─────────────────────────────────── */ @keyframes btn-spin { to { transform: rotate(360deg); } } .btn-spin { display: inline-block; width: 11px; height: 11px; border: 2px solid rgba(255, 255, 255, .35); border-top-color: #fff; border-radius: 50%; animation: btn-spin .65s linear infinite; vertical-align: middle; margin-right: 5px; } /* ── Economics toolbar ────────────────────────────────────────────────────────── */ .eco-toolbar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; } .eco-toolbar-left, .eco-toolbar-right { display: flex; align-items: center; gap: 8px; } .eco-toolbar-label { font-size: 12px; font-weight: 700; color: var(--color-text-hint); white-space: nowrap; } /* ── Economics tariff table ─────────────────────────────────────────────────── */ /* Kill outer scroll on the tariff modal — inner .tariff-table-wrap scrolls instead */ #modal-eco-tariffs .modal-box { overflow: hidden; } /* Version-selector bar above the table */ .tariff-ver-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; padding: 8px 20px 6px; background: var(--color-surface); } .tariff-ver-bar .tariff-ver-label { font-size: 11px; font-weight: 600; color: var(--color-text-muted); margin-right: 4px; flex-shrink: 0; } .tariff-print-btn { margin-left: auto; flex-shrink: 0; font-size: 12px; padding: 3px 12px; } .tariff-ver-toggle { display: inline-flex; align-items: center; gap: 4px; padding: 3px 10px; border: 1.5px solid var(--color-border); border-radius: 12px; font-size: 12px; font-family: var(--font-sans); cursor: pointer; user-select: none; background: var(--color-bg); color: var(--color-text-muted); transition: border-color .15s, background .15s, color .15s; } .tariff-ver-toggle:has(input:checked) { border-color: var(--color-primary); background: #eef2ff; color: var(--color-primary); font-weight: 600; } .tariff-ver-toggle.tariff-ver-latest { border-color: var(--color-success, #198754); color: var(--color-success, #198754); } .tariff-ver-toggle.tariff-ver-latest:has(input:checked) { background: #d1fae5; font-weight: 700; } .tariff-ver-toggle input { accent-color: var(--color-primary); cursor: pointer; } /* Scrollable wrapper — enables both sticky header and sticky columns */ .tariff-table-wrap { overflow: auto; max-height: 55vh; border: 1px solid var(--color-border); border-radius: var(--radius-md); margin: 0 20px 4px; } .tariff-table { border-collapse: separate; border-spacing: 0; min-width: 100%; } /* Sticky header */ .tariff-table thead th { position: sticky; top: 0; z-index: 8; background: var(--color-bg); border-bottom: 2px solid var(--color-border); white-space: nowrap; padding: 6px 10px; font-size: 12px; } /* Single sticky column — Ставка */ .tariff-sticky-1 { position: sticky; left: 0; z-index: 4; background: var(--color-surface); min-width: 110px; width: 110px; white-space: nowrap; padding: 5px 8px; font-size: 11px; color: var(--color-text-muted); border-right: 2px solid var(--color-border); box-shadow: 3px 0 6px rgba(0, 0, 0, .07); } /* Intersection: sticky col in sticky header */ .tariff-table thead .tariff-sticky-1 { z-index: 12; background: var(--color-bg); font-size: 12px; color: var(--color-text); font-weight: 700; } /* Version column headers + price cells — right-aligned Use .tariff-table prefix for specificity > .data-table th (0,1,1) */ .tariff-table .tariff-ver-th, .tariff-table .tariff-price-cell { text-align: right; min-width: 80px; padding: 5px 10px; } .tariff-ver-th { font-size: 12px; font-weight: 600; } /* Latest version — green border highlight */ .tariff-current-ver { color: var(--color-success, #198754); border-bottom: 3px solid var(--color-success, #198754) !important; } .tariff-edit-badge { font-size: 10px; opacity: 0.65; margin-left: 2px; } /* Older versions — muted */ .tariff-old-ver { color: #6c757d; } /* Delete column */ .tariff-del-col { width: 36px; min-width: 36px; text-align: center; padding: 4px; vertical-align: middle; } /* Pattern group header row */ .tariff-group-hdr td { background: #f0f4fb; padding: 4px 10px; font-size: 11px; font-weight: 700; color: var(--color-text-muted); border-top: 2px solid var(--color-border); text-transform: uppercase; letter-spacing: 0.4px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.4; } .tariff-group-hdr .eco-tariff-del { float: right; opacity: 0.5; font-size: 11px; line-height: 1; } .tariff-group-hdr .eco-tariff-del:hover { opacity: 1; } /* Sub-rows */ .tariff-subrow td { border-bottom: none; padding-top: 3px; padding-bottom: 3px; } /* Read-only price cells (non-latest versions) */ .tariff-readonly .tariff-cell-val { cursor: default; color: #6c757d; } .tariff-readonly .tariff-cell-val:hover { background: none; } /* Inline-editable price value */ .tariff-cell-val { display: block; text-align: right; border-radius: 3px; padding: 1px 2px; min-height: 18px; transition: background .1s; } .tariff-editable .tariff-cell-val:hover { background: #eef2ff; cursor: pointer; } /* Inline edit input (shown on click) */ .tariff-inline-input { width: 72px; text-align: right; padding: 2px 4px; border: 1.5px solid var(--color-primary); border-radius: 3px; font-size: 13px; font-family: var(--font-sans); outline: none; background: #fff; } /* ── Economics category badges ──────────────────────────────────────────────── */ .eco-detail-meta { display: flex; align-items: center; gap: 8px; margin-bottom: 14px; } .eco-cat-badge { display: inline-block; padding: 3px 10px; border-radius: 20px; font-size: 11px; font-weight: 700; letter-spacing: .3px; text-transform: uppercase; } .eco-cat-higher { background: #fff8e1; color: #b45309; border: 1px solid #fcd34d; } .eco-cat-first { background: var(--color-info-bg); color: var(--color-info-text); border: 1px solid #90caf9; } .eco-cat-second { background: var(--color-neutral); color: var(--color-text-muted); border: 1px solid var(--color-border); } /* ── Economics tab ───────────────────────────────────────────────────────────── */ .eco-kpi-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 20px; } @media (max-width: 1100px) { .eco-kpi-grid { grid-template-columns: repeat(2, 1fr); } } .eco-kpi-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-xl); padding: 18px 22px; box-shadow: var(--shadow-card); } .eco-kpi-card--success { border-color: #a5d6a7; background: var(--color-success-bg); } .eco-kpi-label { font-size: 11px; font-weight: 700; color: var(--color-text-muted); text-transform: uppercase; letter-spacing: .6px; margin-bottom: 8px; } .eco-kpi-value { font-size: 30px; font-weight: 700; color: var(--color-text); line-height: 1; margin-bottom: 6px; } .eco-kpi-unit { font-size: 18px; font-weight: 600; color: var(--color-text-muted); } .eco-kpi-value-sub { font-size: 16px; font-weight: 500; color: var(--color-text-muted); } .eco-kpi-sub { font-size: 12px; color: var(--color-text-muted); } .eco-master-detail { display: grid; grid-template-columns: 5fr 7fr; gap: 16px; align-items: start; } @media (max-width: 900px) { .eco-master-detail { grid-template-columns: 1fr; } } .eco-panel { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-xl); overflow: hidden; box-shadow: var(--shadow-card); } .eco-panel-header { display: flex; align-items: center; justify-content: space-between; padding: 13px 18px; border-bottom: 1px solid var(--color-border); background: var(--color-bg); } .eco-panel-title { font-size: 13px; font-weight: 700; color: var(--color-text); } .eco-count-badge { display: inline-block; background: var(--color-primary); color: #fff; font-size: 11px; font-weight: 700; padding: 2px 9px; border-radius: 12px; } .eco-master-table tbody tr { cursor: pointer; } .eco-master-table tbody tr:hover td { background: var(--color-info-bg) !important; } .eco-master-table tbody tr.eco-row-active td { background: #deeaff !important; color: var(--color-primary); } .eco-detail-placeholder { padding: 52px 24px; text-align: center; color: var(--color-text-muted); font-size: 14px; line-height: 1.6; } /* Formula visualization */ .eco-group { padding: 14px 18px 6px; } .eco-group+.eco-group { border-top: 1px solid var(--color-border); } .eco-group-title { font-size: 11px; font-weight: 700; color: var(--color-text-hint); text-transform: uppercase; letter-spacing: .6px; margin-bottom: 8px; } .eco-formula-row { display: flex; align-items: center; gap: 6px; padding: 6px 0; border-bottom: 1px dashed var(--color-border); font-size: 13px; } .eco-formula-row:last-child { border-bottom: none; } .eco-formula-name { flex: 1; color: var(--color-text); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .eco-formula-dots { flex: 0 1 36px; min-width: 12px; border-bottom: 2px dotted var(--color-border); height: 1px; align-self: center; } .eco-pill { background: var(--color-neutral); color: var(--color-text-hint); font-size: 12px; font-weight: 600; padding: 3px 10px; border-radius: var(--radius-sm); white-space: nowrap; } .eco-op { font-size: 13px; font-weight: 700; color: var(--color-text-muted); padding: 0 2px; } .eco-formula-result { font-size: 13px; font-weight: 700; color: var(--color-success); min-width: 90px; text-align: right; white-space: nowrap; } .eco-total { display: flex; flex-direction: column; padding: 18px 20px; border-top: 2px solid var(--color-border); background: var(--color-bg); margin-top: 4px; } .eco-total-label { font-size: 12px; font-weight: 700; color: var(--color-text-hint); text-transform: uppercase; letter-spacing: .6px; } .eco-total-amount { font-size: 24px; font-weight: 700; color: var(--color-primary); } /* ── Margin bar ──────────────────────────────────────────────────────────────── */ .eco-margin-bar { display: flex; height: 18px; border-radius: var(--radius-md); overflow: hidden; background: var(--color-border); margin-bottom: 4px; } .eco-margin-profit-seg { background: var(--color-success); transition: width .4s; } .eco-margin-gross-seg { background: #f97316; transition: width .4s; } /* ── Tax pill variant ────────────────────────────────────────────────────────── */ .eco-pill-dim { background: var(--color-neutral); color: var(--color-text-muted); } /* ── KPI trend indicators ────────────────────────────────────────────────────── */ .eco-trend { min-height: 18px; margin-top: 5px; font-size: 12px; line-height: 1.3; } .eco-trend-none { color: var(--color-text-muted); font-size: 11px; } /* ── Employee micro-trend arrows ─────────────────────────────────────────────── */ .eco-micro-trend { font-size: 11px; font-weight: 700; margin-left: 6px; cursor: default; vertical-align: middle; white-space: nowrap; } .eco-micro-trend--new { color: var(--color-text-muted); font-size: 14px; } /* ── Toolbar separator ────────────────────────────────────────────────────────── */ .eco-toolbar-sep { display: inline-block; width: 1px; height: 18px; background: var(--color-border); vertical-align: middle; margin: 0 4px; } /* ── Economics chart row ─────────────────────────────────────────────────────── */ .eco-charts-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; margin-bottom: 20px; } @media (max-width: 720px) { .eco-charts-row { grid-template-columns: 1fr; } } .eco-chart-card { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 14px 18px 18px; } .eco-chart-title { font-size: 13px; font-weight: 700; color: var(--color-text-hint); margin-bottom: 12px; } .eco-chart-wrap { position: relative; height: 220px; } /* ── RESO direct-contract badge ──────────────────────────────────────────────── */ .eco-badge-reso { display: inline-block; font-size: 10px; font-weight: 700; letter-spacing: .4px; padding: 1px 6px; border-radius: var(--radius-sm); background: var(--color-neutral-dark); color: var(--color-text-hint); vertical-align: middle; margin-left: 5px; } /* ── Dashboard ──────────────────────────────────────────────────────────────── */ .dash-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(360px, 1fr)); gap: 24px; margin-top: 20px; } .dash-widget { background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); padding: 20px; box-shadow: var(--shadow-card); } .dash-widget-title { font-size: 15px; font-weight: 700; color: var(--color-text); margin-bottom: 16px; display: flex; align-items: center; gap: 8px; } .dash-widget-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 16px; } .dash-card { border-radius: var(--radius-md); padding: 16px; text-align: center; transition: transform 0.15s ease; } .dash-card:hover { transform: translateY(-2px); } .dash-card-green { background: var(--color-success-bg); border: 1px solid var(--color-success-border); color: var(--color-success); } .dash-card-blue { background: #e3f2fd; border: 1px solid #bbdefb; color: #1565c0; } .dash-card-red { background: #ffebee; border: 1px solid #ffcdd2; color: #c62828; } .dash-card-orange { background: #fff3e0; border: 1px solid #ffe0b2; color: #e65100; } .dash-card-purple { background: #f3e5f5; border: 1px solid #e1bee7; color: #7b1fa2; } .dash-label { font-size: 13px; font-weight: 600; color: var(--color-text-muted); margin-bottom: 8px; } .dash-value { font-size: 32px; font-weight: 800; line-height: 1; margin-bottom: 4px; } .dash-sub { font-size: 11px; color: var(--color-text-hint); } /* ── Dashboard Lists (Дедлайны, Отпуска) ──────────────────────────────────── */ .dash-list { display: flex; flex-direction: column; gap: 12px; } .dash-empty-msg { font-size: 13px; color: var(--color-text-muted); text-align: center; padding: 20px 10px; margin: 0; } .dash-list-item { padding: 12px; background: var(--color-bg); border-left: 3px solid var(--color-primary); border-radius: var(--radius-sm); transition: transform 0.1s ease; } .dash-list-item:hover { transform: translateX(2px); } .dash-list-title { font-size: 13px; font-weight: 700; color: var(--color-text); margin-bottom: 6px; word-break: break-word; } .dash-list-meta { font-size: 11px; color: var(--color-text-muted); line-height: 1.4; } .dash-list-label { font-weight: 600; color: var(--color-text-hint); } .dash-deadline-days { font-weight: 700; color: var(--color-warning); } .dash-deadline-days.dash-urgent { color: var(--color-danger); } .dash-deadline-days.dash-overdue { color: var(--color-danger); font-weight: 800; } /* ── Dashboard Department Stats ────────────────────────────────────────────── */ .dash-dept-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: 16px; } .dash-dept-card { padding: 12px; background: var(--color-bg); border: 1px solid var(--color-border); border-radius: var(--radius-md); transition: all 0.15s ease; } .dash-dept-card:hover { border-color: var(--color-primary); background: var(--color-surface); } .dash-dept-name { font-size: 12px; font-weight: 700; color: var(--color-text); margin-bottom: 8px; text-transform: uppercase; letter-spacing: 0.3px; } .dash-dept-bar { height: 8px; background: var(--color-border); border-radius: var(--radius-sm); overflow: hidden; margin-bottom: 8px; } .dash-dept-bar-fill { height: 100%; background: linear-gradient(90deg, var(--color-success), var(--color-primary)); transition: width 0.3s ease; } .dash-dept-stats { font-size: 11px; color: var(--color-text-muted); display: flex; justify-content: space-between; align-items: center; } .dash-dept-working { font-weight: 700; color: var(--color-success); } .dash-dept-total { color: var(--color-text-hint); } /* ── Responsive Dashboard ──────────────────────────────────────────────────── */ @media (max-width: 1200px) { .dash-container { grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); } } @media (max-width: 768px) { .dash-container { grid-template-columns: 1fr; } .dash-dept-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); } } /* ── Surcharge Rules Manager ────────────────────────────────────────────────── */ /* Sub-navigation pills (Economics tab) */ .eco-subnav { display: flex; gap: 4px; margin-bottom: 16px; border-bottom: 2px solid var(--color-border); padding-bottom: 0; } .eco-subnav-btn { padding: 7px 18px; border: none; background: none; font-size: 13px; font-weight: 600; font-family: var(--font-sans); color: var(--color-text-muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -2px; transition: color .15s, border-color .15s; } .eco-subnav-btn:hover { color: var(--color-primary); } .eco-subnav-btn.active { color: var(--color-primary); border-bottom-color: var(--color-primary); } /* Surcharges section toolbar */ .sc-toolbar { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; } .sc-section-title { font-size: 15px; font-weight: 700; color: var(--color-text); } /* Rules list */ .sc-rules-list { display: flex; flex-direction: column; gap: 8px; } /* Single rule card */ .sc-rule-card { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 11px 16px; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); transition: opacity .2s; } .sc-rule-card.sc-inactive { opacity: 0.48; } .sc-rule-info { flex: 1; min-width: 0; } .sc-rule-name { display: block; font-size: 13px; font-weight: 700; color: var(--color-text); margin-bottom: 5px; } /* Badge row */ .sc-rule-badges { display: flex; align-items: center; flex-wrap: wrap; gap: 5px; } .sc-badge { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 11px; font-weight: 600; white-space: nowrap; } .sc-badge-filter { background: #e9ecef; color: #495057; } .sc-badge-condition { background: #fff3cd; color: #7d5a03; } .sc-badge-result { background: #d1e7dd; color: #0a3622; } .sc-arrow { color: var(--color-text-muted); font-size: 13px; flex-shrink: 0; margin: 0 1px; } /* Action buttons */ .sc-rule-actions { display: flex; align-items: center; gap: 6px; flex-shrink: 0; } .sc-toggle-btn, .sc-delete-btn { width: 30px; height: 30px; border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: var(--color-bg); cursor: pointer; font-size: 14px; display: flex; align-items: center; justify-content: center; transition: background .15s, border-color .15s, color .15s; padding: 0; line-height: 1; } .sc-toggle-btn:hover { background: #dcfce7; border-color: #86efac; } .sc-toggle-btn.sc-active { background: #d1fae5; border-color: var(--color-success, #198754); color: var(--color-success, #198754); } .sc-delete-btn:hover { background: #fee2e2; border-color: var(--color-danger); } /* Empty state */ .sc-empty-state { text-align: center; padding: 40px 20px; color: var(--color-text-muted); font-size: 13px; background: var(--color-surface); border: 1px dashed var(--color-border); border-radius: var(--radius-md); } /* Condition grid — 3 equal cols in modal */ .sc-cond-grid { grid-template-columns: repeat(3, 1fr) !important; } /* ── Manual Surcharges ───────────────────────────────────────────────────────── */ .ms-toolbar { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 10px; margin-bottom: 16px; } .ms-toolbar-left { display: flex; align-items: center; gap: 8px; } .ms-table-wrap { overflow-x: auto; border: 1px solid var(--color-border); border-radius: var(--radius-md); } .ms-table-wrap .data-table td.ms-num { text-align: right; font-variant-numeric: tabular-nums; } .ms-total-field { font-weight: 700; color: var(--color-primary); } .ms-total-field.ms-negative { color: var(--color-danger) !important; } .ms-type-surcharge { display: inline-block; padding: 2px 7px; border-radius: 8px; font-size: 11px; font-weight: 700; background: #d1fae5; color: #065f46; } .ms-type-deduct { display: inline-block; padding: 2px 7px; border-radius: 8px; font-size: 11px; font-weight: 700; background: #fee2e2; color: #991b1b; } .ms-hint-negative { font-size: 11px; color: var(--color-danger); margin-top: 4px; line-height: 1.4; } /* ── Footer ─────────────────────────────────────────────────────────────────── */ footer { text-align: center; padding: 14px; font-size: 12px; color: #90a4ae; border-top: 1px solid var(--color-border); background: var(--color-surface); margin-top: auto; }