Files
watersurf-erp/app/static/css/theme.css

645 lines
13 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* ERP WaterSurf — Material Design 3 (тёмная тема), брендбук WaterSurf, шрифт Geologica */
/* === MD3-совместимые токены (тёмная тема) === */
:root {
/* Бренд WaterSurf */
--ws-white: #FFFFFF;
--ws-gray-01: #F5F9FD;
--ws-gray-02: #DCE7EF;
--ws-gray-03: #B1C7D7;
--ws-gray-04: #617E92;
--ws-black: #0A121D;
--ws-accent: #34AFE3;
--ws-accent-hover: #00868F;
--ws-accent-light: #E3F7FF;
--ws-danger: #FF3A20;
--ws-danger-dark: #AA1400;
--ws-success: #13AD53;
/* MD3-подобные поверхности (тёмная тема) */
--ws-bg-page: #0A121D;
--ws-bg-surface: #111d2b;
--ws-bg-elevated: #162536;
--ws-bg-hover: rgba(255, 255, 255, 0.06);
--ws-border: rgba(255, 255, 255, 0.12);
--ws-border-focus: var(--ws-accent);
--ws-text: #F5F9FD;
--ws-text-muted: #B1C7D7;
--ws-text-secondary: #617E92;
--ws-danger-bg: rgba(255, 58, 32, 0.16);
--ws-success-bg: rgba(19, 173, 83, 0.16);
/* MD3 shape */
--ws-radius: 12px;
--ws-radius-sm: 8px;
--ws-radius-full: 9999px;
/* MD3 elevation (тень для карточек) */
--ws-elevation-1: 0 1px 2px rgba(0, 0, 0, 0.3), 0 1px 3px 1px rgba(0, 0, 0, 0.15);
--ws-elevation-2: 0 2px 6px 2px rgba(0, 0, 0, 0.25), 0 1px 2px rgba(0, 0, 0, 0.2);
--ws-shadow: var(--ws-elevation-1);
--ws-font: "Geologica", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}
/* === База === */
html {
scroll-behavior: smooth;
background: var(--ws-bg-page);
font-family: var(--ws-font);
}
body, body * {
font-family: inherit;
}
body {
background: var(--ws-bg-page);
color: var(--ws-text);
font-family: var(--ws-font);
font-weight: 300;
font-size: 16px;
line-height: 1.5;
letter-spacing: -0.02em;
min-height: 100vh;
-webkit-font-smoothing: antialiased;
}
* {
box-sizing: border-box;
}
/* === Типографика (MD3-подобные уровни) === */
.ws-page-title {
font-family: var(--ws-font);
font-size: 22px;
line-height: 1.3;
letter-spacing: 0;
font-weight: 500;
margin-bottom: 1rem;
color: var(--ws-text);
}
.ws-form-section-title {
font-family: var(--ws-font);
font-size: 16px;
line-height: 1.4;
font-weight: 500;
margin-bottom: 0.75rem;
color: var(--ws-text);
}
/* === Top app bar (навбар в стиле MD3) === */
.navbar-ws {
background: var(--ws-bg-surface);
border-bottom: 1px solid var(--ws-border);
padding: 0 16px;
min-height: 64px;
box-shadow: var(--ws-elevation-1);
}
.navbar-ws .container-fluid {
max-width: 1200px;
margin: 0 auto;
}
.navbar-ws .navbar-brand {
color: var(--ws-text);
font-family: var(--ws-font);
font-weight: 500;
font-size: 1.25rem;
letter-spacing: 0;
padding: 0.5rem 0;
}
.navbar-ws .navbar-brand:hover {
color: var(--ws-accent);
}
.navbar-ws .nav-link {
color: var(--ws-text-muted);
font-family: var(--ws-font);
font-weight: 400;
font-size: 14px;
border-radius: 20px;
padding: 8px 12px;
}
.navbar-ws .nav-link:hover {
color: var(--ws-text);
background: var(--ws-bg-hover);
}
.navbar-ws .dropdown-menu {
background: var(--ws-bg-elevated);
border: 1px solid var(--ws-border);
border-radius: var(--ws-radius);
box-shadow: var(--ws-elevation-2);
padding: 6px 0;
min-width: 200px;
}
.navbar-ws .dropdown-item {
color: var(--ws-text);
font-family: var(--ws-font);
font-size: 14px;
padding: 10px 16px;
border-radius: 0;
}
.navbar-ws .dropdown-item:hover {
background: var(--ws-bg-hover);
color: var(--ws-text);
}
.navbar-ws .navbar-text {
color: var(--ws-text-muted);
font-size: 14px;
}
.navbar-ws .navbar-toggler {
border-color: var(--ws-border);
color: var(--ws-text);
border-radius: var(--ws-radius-sm);
}
.navbar-ws .navbar-toggler-icon {
filter: invert(1);
}
/* === Main content === */
.ws-main {
max-width: 1200px;
margin: 0 auto;
padding: 24px 16px 48px;
background: var(--ws-bg-page);
}
/* === Карточки (MD3 surface с elevation) === */
.ws-card {
background: var(--ws-bg-surface);
border: 1px solid var(--ws-border);
border-radius: var(--ws-radius);
padding: 24px;
margin-bottom: 16px;
box-shadow: var(--ws-elevation-1);
}
.ws-card-header {
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 12px;
margin-bottom: 16px;
}
/* === Таблицы (MD3 data table) === */
.ws-table-wrap {
overflow-x: auto;
border-radius: var(--ws-radius);
border: 1px solid var(--ws-border);
background: var(--ws-bg-surface);
}
.ws-table {
width: 100%;
border-collapse: collapse;
color: var(--ws-text);
font-family: var(--ws-font);
font-size: 14px;
}
.ws-table th,
.ws-table td {
padding: 12px 16px;
text-align: left;
border-bottom: 1px solid var(--ws-border);
}
/* Списки документов: заголовки и строки в одну строку без переноса */
.ws-table.ws-table-list-nowrap th,
.ws-table.ws-table-list-nowrap td {
white-space: nowrap;
}
.ws-table th {
background: var(--ws-bg-elevated);
font-weight: 500;
font-size: 12px;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--ws-text-secondary);
}
.ws-table th .ws-th-sort {
color: inherit;
text-decoration: none;
}
.ws-table th .ws-th-sort:hover {
color: var(--ws-text-secondary);
}
.ws-table th .ws-sort-arrow {
margin-left: 2px;
font-weight: 700;
color: var(--ws-accent);
}
.ws-table tbody tr:hover {
background: var(--ws-bg-hover);
}
.ws-table tbody tr.ws-row-clickable {
cursor: pointer;
}
.ws-table tbody tr:last-child td {
border-bottom: none;
}
.ws-table .ws-actions {
white-space: nowrap;
}
/* Иконки действий в списках: карандаш (редактировать), крестик (удалить) */
.ws-table .ws-btn-icon-edit,
.ws-table .ws-btn-icon-delete {
display: inline-flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
padding: 0;
margin: 0 4px;
border-radius: 8px;
text-decoration: none;
vertical-align: middle;
}
.ws-table .ws-btn-icon-edit:hover {
background: rgba(13, 173, 187, 0.2);
}
.ws-table .ws-btn-icon-edit svg {
width: 22px;
height: 22px;
fill: var(--ws-accent);
}
.ws-table .ws-btn-icon-edit:hover svg {
fill: var(--ws-accent-hover);
}
.ws-table .ws-btn-icon-delete:hover {
background: rgba(239, 83, 80, 0.2);
}
.ws-table .ws-btn-icon-delete svg {
width: 22px;
height: 22px;
fill: var(--ws-danger);
}
.ws-table .ws-btn-icon-delete:hover svg {
fill: var(--ws-danger-dark);
}
.ws-table .ws-link {
color: var(--ws-accent);
text-decoration: none;
font-size: 14px;
}
.ws-table .ws-link:hover {
color: var(--ws-accent-hover);
text-decoration: underline;
}
.ws-table .ws-link-danger {
color: var(--ws-danger);
}
.ws-table .ws-link-danger:hover {
color: var(--ws-danger-dark);
}
/* Бейдж статуса заказа в списке */
.ws-status-badge {
display: inline-block;
padding: 2px 8px;
border-radius: 6px;
font-size: 0.875em;
font-weight: 500;
}
.ws-status-done {
background: rgba(76, 175, 80, 0.35);
color: #a5d6a7;
}
.ws-status-inprogress {
background: rgba(255, 193, 7, 0.35);
color: #ffe082;
}
.ws-table .ws-num {
text-align: right;
font-variant-numeric: tabular-nums;
}
/* === Кнопки (MD3 Filled / Outlined / Tonal) === */
.btn-ws-primary,
body .btn.btn-ws-primary,
a.btn.btn-ws-primary {
background: var(--ws-accent);
color: var(--ws-black);
border: none;
border-radius: 20px;
padding: 10px 24px;
font-family: var(--ws-font);
font-weight: 500;
font-size: 14px;
letter-spacing: 0;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.btn-ws-primary:hover,
body .btn.btn-ws-primary:hover,
a.btn.btn-ws-primary:hover {
background: var(--ws-accent-hover);
color: var(--ws-white);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.btn-ws-secondary {
background: transparent;
color: var(--ws-accent);
border: 1px solid var(--ws-border);
border-radius: 20px;
padding: 10px 24px;
font-family: var(--ws-font);
font-size: 14px;
font-weight: 500;
}
.btn-ws-secondary:hover {
background: var(--ws-bg-hover);
color: var(--ws-text);
border-color: var(--ws-text-secondary);
}
.btn-ws-danger {
background: var(--ws-danger-bg);
color: var(--ws-danger);
border: none;
border-radius: 20px;
padding: 10px 24px;
font-family: var(--ws-font);
font-size: 14px;
font-weight: 500;
}
.btn-ws-danger:hover {
background: var(--ws-danger);
color: var(--ws-white);
}
.ws-btn-group {
display: flex;
flex-wrap: wrap;
gap: 8px;
align-items: center;
}
/* === Формы (MD3 Outlined text field) === */
.ws-form-group {
margin-bottom: 16px;
}
.ws-form-group label {
display: block;
font-family: var(--ws-font);
font-weight: 500;
font-size: 12px;
letter-spacing: 0.05em;
color: var(--ws-text-secondary);
margin-bottom: 4px;
}
.ws-form-group input,
.ws-form-group select,
.ws-form-group textarea {
width: 100%;
max-width: 400px;
padding: 8px 12px;
background: transparent;
border: 1px solid var(--ws-border);
border-radius: var(--ws-radius-sm);
color: var(--ws-text);
font-family: var(--ws-font);
font-size: 15px;
line-height: 1.35;
min-height: 34px;
}
.ws-form-group input:focus,
.ws-form-group select:focus,
.ws-form-group textarea:focus {
outline: none;
border-color: var(--ws-border-focus);
box-shadow: 0 0 0 1px var(--ws-border-focus);
}
.ws-form-group input::placeholder,
.ws-form-group textarea::placeholder {
color: var(--ws-text-secondary);
}
.ws-form-login input,
.ws-form-login input[type="text"],
.ws-form-login input[type="password"] {
width: 100%;
max-width: 100%;
padding: 12px 16px;
background: transparent;
border: 1px solid var(--ws-border);
border-radius: var(--ws-radius-sm);
color: var(--ws-text);
font-family: var(--ws-font);
font-size: 16px;
}
.ws-form-login input:focus {
outline: none;
border-color: var(--ws-border-focus);
box-shadow: 0 0 0 1px var(--ws-border-focus);
}
.ws-text-danger {
color: var(--ws-danger);
font-size: 12px;
margin-top: 4px;
}
.ws-form-section {
margin-top: 16px;
padding-top: 14px;
border-top: 1px solid var(--ws-border);
}
/* === Snackbar / Alerts (MD3) === */
.ws-alert {
padding: 14px 16px;
border-radius: var(--ws-radius-sm);
margin-bottom: 16px;
border: 1px solid transparent;
font-family: var(--ws-font);
font-size: 14px;
}
.ws-alert-success {
background: var(--ws-success-bg);
color: var(--ws-success);
border-color: rgba(19, 173, 83, 0.3);
}
.ws-alert-error,
.ws-alert-danger {
background: var(--ws-danger-bg);
color: var(--ws-danger);
border-color: rgba(255, 58, 32, 0.3);
}
.ws-alert-warning {
background: rgba(255, 136, 0, 0.16);
color: #FF8800;
border-color: rgba(255, 136, 0, 0.3);
}
.ws-alert .btn-close {
filter: invert(1);
opacity: 0.8;
}
.ws-empty {
text-align: center;
padding: 32px 16px;
color: var(--ws-text-secondary);
font-family: var(--ws-font);
font-size: 14px;
}
/* === Login / Hero === */
.ws-login-card {
max-width: 400px;
margin: 2rem auto;
padding: 32px;
border-radius: var(--ws-radius);
background: var(--ws-bg-surface);
border: 1px solid var(--ws-border);
box-shadow: var(--ws-elevation-2);
}
.ws-login-title {
font-family: var(--ws-font);
font-size: 22px;
font-weight: 500;
margin-bottom: 24px;
text-align: center;
color: var(--ws-text);
}
.ws-hero {
padding: 32px 0;
text-align: center;
}
.ws-hero h1 {
font-family: var(--ws-font);
font-size: 28px;
font-weight: 500;
margin-bottom: 8px;
color: var(--ws-text);
}
.ws-hero p {
color: var(--ws-text-muted);
font-family: var(--ws-font);
font-size: 16px;
line-height: 1.5;
}
.ws-confirm-text {
color: var(--ws-text-muted);
margin-bottom: 20px;
font-size: 14px;
}
/* === Таблицы в формах (инпуты внутри) === */
.ws-table input.form-control,
.ws-table select.form-select,
.ws-table input[type="text"],
.ws-table input[type="number"],
.ws-table select {
background: transparent;
border: 1px solid var(--ws-border);
color: var(--ws-text);
padding: 8px 12px;
font-family: var(--ws-font);
font-size: 14px;
border-radius: var(--ws-radius-sm);
}
.ws-form-card .ws-form-group input,
.ws-form-card .ws-form-group select,
.ws-form-card .ws-form-group textarea {
max-width: 100%;
}
.ws-table input[type="checkbox"] {
width: 18px;
height: 18px;
accent-color: var(--ws-accent);
}
.ws-table input:focus,
.ws-table select:focus {
border-color: var(--ws-border-focus);
box-shadow: 0 0 0 1px var(--ws-border-focus);
}
/* === Переопределение Bootstrap в main === */
.ws-main .btn-primary {
background: var(--ws-accent);
border-color: var(--ws-accent);
color: var(--ws-black);
font-family: var(--ws-font);
font-weight: 500;
border-radius: 20px;
}
.ws-main .btn-primary:hover {
background: var(--ws-accent-hover);
border-color: var(--ws-accent-hover);
color: var(--ws-white);
}
.ws-main .form-control,
.ws-main .form-select {
background: transparent;
border-color: var(--ws-border);
color: var(--ws-text);
font-family: var(--ws-font);
border-radius: var(--ws-radius-sm);
}
.ws-main .form-control:focus,
.ws-main .form-select:focus {
border-color: var(--ws-border-focus);
box-shadow: 0 0 0 1px var(--ws-border-focus);
}
.ws-main .form-control::placeholder {
color: var(--ws-text-secondary);
}
.ws-main h1, .ws-main h2, .ws-main h3, .ws-main h4 {
font-family: var(--ws-font);
color: var(--ws-text);
}
.ws-main p, .ws-main label, .ws-main td, .ws-main th, .ws-main li {
font-family: var(--ws-font);
}