zov-tech/miniapp/assets/styles.css
wasrusgen db6c4f3265 feat: theme switching system — 4 palettes (ZOV · Foundry · Boardroom · Atelier)
- styles.css v5: replaced old 3-variant system with 4 design-token themes
  extracted from reference dashboards:
  · brand (ЗОВ): #003E7E blue / #76BD22 green, Inter
  · b Foundry: #EFE9D8 cream / #B68A1A mustard, Archivo, sharp corners
  · c Boardroom: #F2E9D6 linen / #D08A55 copper, Geist, petrol tones
  · d Atelier: #E9EBEF dove / #2E5266 steel-blue, Manrope
  Each theme: --paper, --ink, --accent-*, --status-*, --r-*, --font-ui, --warm
- app.js: applyVariant() + savedVariant() helpers with localStorage persistence;
  renderPaletteSwitcher() component (color swatches + name label);
  injected in renderManagerHome + renderStaff; setupTelegram() restores saved variant
- index.html: added Archivo + Manrope to Google Fonts; cache-bust v20260517a
- podbor.css: .role-card .role-icon uses color: var(--accent-1) (was hardcoded walnut);
  SVG strokes switched to currentColor for theme-awareness

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 12:17:54 +03:00

1197 lines
30 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.

/* ============================================================
ЗОВ MiniApp — design system v5
4 темы: brand (ЗОВ) · b (Foundry) · c (Boardroom) · d (Atelier)
Переключатель — `<html data-variant="b|c|d">`, состояние в localStorage.
Палитры B/C/D извлечены из дашбордов (Figma → Claude → HTML).
============================================================ */
/* ===========================================================
Общие константы — не зависят от темы
=========================================================== */
:root {
--s1: 4px; --s2: 8px; --s3: 12px; --s4: 16px;
--s5: 20px; --s6: 24px; --s7: 32px; --s8: 40px;
--font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
}
/* ===========================================================
1. BRAND — ЗОВ (default, без data-variant)
Синий + зелёный, Inter, мягкие скругления
=========================================================== */
:root {
--paper: var(--tg-theme-bg-color, #FAFAF7);
--paper-2: var(--tg-theme-secondary-bg-color, #F0EDE5);
--card: var(--tg-theme-section-bg-color, #FFFFFF);
--ink: var(--tg-theme-text-color, #0F0F0E);
--ink-2: #2A2622;
--muted: var(--tg-theme-hint-color, #6E6A62);
--muted-2: #A09C92;
--line: rgba(15, 15, 14, 0.08);
--line-strong: rgba(15, 15, 14, 0.18);
--accent-1: #003E7E; /* brand blue */
--accent-2: #76BD22; /* brand green */
--accent-3: #C0392B;
--status-active: #76BD22;
--status-lapsed: #C0392B;
--status-grace: #B07E00;
--r-card: 14px;
--r-btn: 12px;
--r-tag: 6px;
--r-pill: 999px;
--font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, system-ui, sans-serif;
--font-display: "Instrument Serif", Georgia, "Times New Roman", serif;
--ribbon: linear-gradient(90deg, var(--accent-1) 0%, var(--accent-2) 100%);
--warm: rgba(0, 62, 126, 0.08); /* icon bg tint */
/* palette-switch swatches */
--ps-a: #003E7E;
--ps-b: #76BD22;
}
html[data-theme="dark"]:not([data-variant]) {
--paper: var(--tg-theme-bg-color, #14130E);
--paper-2: var(--tg-theme-secondary-bg-color, #1F1D17);
--card: var(--tg-theme-section-bg-color, #1C1A14);
--ink: var(--tg-theme-text-color, #F4F1EA);
--ink-2: #C8C3B5;
--muted: var(--tg-theme-hint-color, #A5A299);
--muted-2: #807D74;
--line: rgba(255, 255, 255, 0.09);
--line-strong: rgba(255, 255, 255, 0.18);
}
/* ===========================================================
2. VARIANT B — Foundry
Тёплый крем + горчица. Archivo, острые углы.
Палитра: --paper #EFE9D8 · --ink #15140F · --accent #B68A1A
=========================================================== */
html[data-variant="b"] {
--paper: #EFE9D8;
--paper-2: #E2DAC1;
--card: #EAE3CC;
--ink: #15140F;
--ink-2: #2A2820;
--muted: #5C5849;
--muted-2: #8C8773;
--line: rgba(21, 20, 15, 0.10);
--line-strong: rgba(21, 20, 15, 0.22);
--accent-1: #B68A1A; /* mustard / горчица */
--accent-2: #4B6B26; /* тёмно-зелёный */
--accent-3: #8B2B16; /* бордо */
--status-active: #4B6B26;
--status-lapsed: #8B2B16;
--status-grace: #B68A1A;
--r-card: 4px;
--r-btn: 4px;
--r-tag: 2px;
--r-pill: 999px;
--font-ui: "Archivo", -apple-system, system-ui, sans-serif;
--font-display: "Instrument Serif", Georgia, serif;
--ribbon: linear-gradient(90deg, #15140F 0%, #B68A1A 100%);
--warm: rgba(182, 138, 26, 0.10);
--ps-a: #EFE9D8;
--ps-b: #B68A1A;
}
/* ===========================================================
3. VARIANT C — Boardroom
Петроль + медь. Geist, умеренные скругления.
Палитра: --paper #F2E9D6 · --ink #0E2A2E · --accent #D08A55
=========================================================== */
html[data-variant="c"] {
--paper: #F2E9D6;
--paper-2: #D8CFBB;
--card: #EDE5D0;
--ink: #0E2A2E;
--ink-2: #1B3E43;
--muted: #6E7B77;
--muted-2: #9DA8A4;
--line: rgba(14, 42, 46, 0.10);
--line-strong: rgba(14, 42, 46, 0.22);
--accent-1: #D08A55; /* copper / медь */
--accent-2: #143438; /* petrol / петроль */
--accent-3: #8B2B16;
--status-active: #7FB58A;
--status-lapsed: #E07D6C;
--status-grace: #D08A55;
--r-card: 6px;
--r-btn: 6px;
--r-tag: 3px;
--r-pill: 999px;
--font-ui: "Geist", -apple-system, system-ui, sans-serif;
--font-display: "Newsreader", Georgia, serif;
--ribbon: linear-gradient(90deg, #0E2A2E 0%, #D08A55 100%);
--warm: rgba(208, 138, 85, 0.10);
--ps-a: #143438;
--ps-b: #D08A55;
}
/* ===========================================================
4. VARIANT D — Atelier
Серо-голубой голубь + стальной синий. Manrope, мягкие скругления.
Палитра: --paper #E9EBEF · --ink #14181F · --accent #2E5266
=========================================================== */
html[data-variant="d"] {
--paper: #E9EBEF;
--paper-2: #DCDFE6;
--card: #FFFFFF;
--ink: #14181F;
--ink-2: #2D3340;
--muted: #5F6573;
--muted-2: #8A8F9C;
--line: rgba(20, 24, 31, 0.09);
--line-strong: rgba(20, 24, 31, 0.20);
--accent-1: #2E5266; /* steel blue / стальной синий */
--accent-2: #2F6B45; /* зелёный */
--accent-3: #99362E; /* красный */
--status-active: #2F6B45;
--status-lapsed: #99362E;
--status-grace: #B07A1A;
--r-card: 12px;
--r-btn: 10px;
--r-tag: 6px;
--r-pill: 999px;
--font-ui: "Manrope", -apple-system, system-ui, sans-serif;
--font-display: "Newsreader", Georgia, serif;
--ribbon: linear-gradient(90deg, #2E5266 0%, #2F6B45 100%);
--warm: rgba(46, 82, 102, 0.10);
--ps-a: #2E5266;
--ps-b: #E9EBEF;
}
/* ============================================================
Reset
============================================================ */
* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }
html, body { margin: 0; padding: 0; }
body {
font-family: var(--font-ui);
font-size: 15px;
font-weight: 400;
line-height: 1.45;
letter-spacing: -0.01em;
color: var(--ink);
background: var(--paper);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-rendering: optimizeLegibility;
}
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; padding: 0; }
/* ============================================================
Layout
============================================================ */
#app {
max-width: 560px;
margin: 0 auto;
padding: var(--s3) var(--s4) calc(var(--s7) + env(safe-area-inset-bottom));
min-height: 100vh;
}
/* ============================================================
Palette switcher — 4 кнопки-образца цветов
============================================================ */
.palette-switcher {
display: flex;
gap: 6px;
align-items: center;
margin-bottom: var(--s4);
padding: 2px 0;
}
.palette-switcher__label {
font-family: var(--font-mono);
font-size: 9px;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted-2);
margin-right: 2px;
user-select: none;
}
.ps-btn {
display: flex;
align-items: center;
gap: 5px;
padding: 5px 9px 5px 7px;
border-radius: 20px;
border: 1.5px solid transparent;
cursor: pointer;
transition: border-color 0.14s, background 0.14s;
background: var(--card);
}
.ps-btn:active { opacity: 0.7; }
.ps-btn.active {
border-color: var(--ink);
}
.ps-swatches {
display: flex;
gap: 3px;
align-items: center;
}
.ps-dot {
display: block;
width: 9px;
height: 9px;
border-radius: 50%;
flex-shrink: 0;
}
.ps-dot--outline {
box-shadow: inset 0 0 0 1px rgba(0,0,0,0.18);
}
.ps-name {
font-family: var(--font-mono);
font-size: 9px;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
white-space: nowrap;
}
.ps-btn.active .ps-name { color: var(--ink); }
/* Legacy .theme-switch — оставлен для совместимости */
.theme-switch {
display: flex;
gap: 0;
margin-bottom: var(--s5);
border: 1px solid var(--line-strong);
border-radius: var(--r-tag);
overflow: hidden;
background: var(--card);
}
.theme-switch button {
flex: 1;
padding: 8px 6px;
font-family: var(--font-mono);
font-size: 10px;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
border-right: 1px solid var(--line-strong);
transition: all 0.12s;
}
.theme-switch button:last-child { border-right: none; }
.theme-switch button.active { background: var(--ink); color: var(--paper); }
/* ============================================================
Loader (брендированный — логотип ЗОВ + дыхание)
============================================================ */
.loader {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
min-height: 100vh;
gap: 18px;
padding: 24px;
}
/* Полноэкранный «splash» — фон карамельный, поверх плавающий логотип */
.loader.splash {
position: fixed;
inset: 0;
background: var(--paper, #FBF7F0);
z-index: 999;
animation: splashFadeIn 0.3s ease-out;
}
.loader-logo {
width: 88px;
height: auto;
display: block;
animation: logoBreath 2.2s ease-in-out infinite;
}
.loader-logo path { fill: var(--walnut, #6B4A2B); }
/* Бренд @wasrusgen1 на splash — SVG-лого + CRM */
.brand-logo-wrap {
position: relative;
display: inline-block;
}
.brand-logo {
width: 70%;
max-width: 260px;
height: auto;
display: block;
margin: 0 auto;
animation: logoBreath 2.2s ease-in-out infinite;
filter: drop-shadow(0 6px 16px rgba(44, 62, 80, 0.18));
}
/* Опилки — 16 точек летают вокруг пилы */
.splash-dust {
position: absolute;
inset: -10% -25% -10% -25%;
pointer-events: none;
}
.splash-dust .dust {
position: absolute;
width: 3px;
height: 3px;
background: #2C3E50;
border-radius: 50%;
opacity: 0;
will-change: transform, opacity;
}
/* 16 точек с разными траекториями (8 влево, 8 вправо) */
.splash-dust .d1 { left: 30%; top: 45%; animation: dustFly 3.6s ease-out 0.0s infinite; --dx:-30px; --dy:-55px; }
.splash-dust .d2 { left: 35%; top: 50%; animation: dustFly 4.2s ease-out 0.4s infinite; --dx:-55px; --dy:-30px; }
.splash-dust .d3 { left: 25%; top: 55%; animation: dustFly 3.2s ease-out 0.8s infinite; --dx:-65px; --dy: 15px; }
.splash-dust .d4 { left: 32%; top: 60%; animation: dustFly 5.0s ease-out 0.2s infinite; --dx:-25px; --dy: 55px; }
.splash-dust .d5 { left: 38%; top: 40%; animation: dustFly 4.5s ease-out 0.6s infinite; --dx:-40px; --dy:-70px; }
.splash-dust .d6 { left: 20%; top: 50%; animation: dustFly 3.8s ease-out 1.1s infinite; --dx:-70px; --dy:-15px; }
.splash-dust .d7 { left: 28%; top: 65%; animation: dustFly 4.4s ease-out 0.5s infinite; --dx:-50px; --dy: 40px; }
.splash-dust .d8 { left: 22%; top: 38%; animation: dustFly 3.5s ease-out 0.9s infinite; --dx:-60px; --dy:-65px; }
.splash-dust .d9 { left: 70%; top: 45%; animation: dustFly 3.4s ease-out 0.3s infinite; --dx: 40px; --dy:-55px; }
.splash-dust .d10 { left: 65%; top: 50%; animation: dustFly 4.0s ease-out 0.7s infinite; --dx: 60px; --dy:-25px; }
.splash-dust .d11 { left: 75%; top: 55%; animation: dustFly 3.2s ease-out 1.0s infinite; --dx: 70px; --dy: 15px; }
.splash-dust .d12 { left: 68%; top: 60%; animation: dustFly 5.0s ease-out 0.2s infinite; --dx: 25px; --dy: 55px; }
.splash-dust .d13 { left: 62%; top: 40%; animation: dustFly 4.5s ease-out 0.6s infinite; --dx: 45px; --dy:-65px; }
.splash-dust .d14 { left: 80%; top: 50%; animation: dustFly 3.8s ease-out 0.1s infinite; --dx: 75px; --dy:-15px; }
.splash-dust .d15 { left: 72%; top: 65%; animation: dustFly 4.4s ease-out 0.4s infinite; --dx: 55px; --dy: 40px; }
.splash-dust .d16 { left: 78%; top: 38%; animation: dustFly 3.5s ease-out 0.8s infinite; --dx: 65px; --dy:-65px; }
@keyframes dustFly {
0% { opacity: 0; transform: translate(0, 0) scale(0.4); }
15% { opacity: 0.55; }
60% { opacity: 0.35; }
100% { opacity: 0; transform: translate(var(--dx), var(--dy)) scale(1.1); }
}
.brand-tagline-gold {
font-family: "Inter", system-ui, sans-serif;
font-weight: 800;
font-size: 18px;
letter-spacing: 0.4em;
color: #2C3E50;
margin-top: 6px;
line-height: 1;
display: inline-block;
}
.loader-caption {
font-family: var(--font-display, "Newsreader", serif);
font-style: italic;
font-size: 17px;
color: var(--ink-2, #6B5C4A);
letter-spacing: 0.01em;
text-align: center;
opacity: 0.8;
}
.loader-caption-sub {
font-family: var(--font-mono, "JetBrains Mono", monospace);
font-size: 10.5px;
color: var(--muted, #998877);
text-transform: uppercase;
letter-spacing: 0.18em;
margin-top: 4px;
}
/* Слоган бренда — Cormorant Garamond Italic, сдержанный serif-италик */
.loader-tagline {
font-family: "Cormorant Garamond", "Newsreader", Georgia, serif;
font-style: italic;
font-weight: 500;
font-size: 28px;
line-height: 1.15;
color: var(--walnut, #6B4A2B);
letter-spacing: 0.005em;
text-align: center;
}
.loader-bar {
width: 140px;
height: 2px;
background: rgba(107, 74, 43, 0.12);
border-radius: 1px;
overflow: hidden;
position: relative;
}
.loader-bar::after {
content: "";
position: absolute;
top: 0; left: -40%;
width: 40%;
height: 100%;
background: linear-gradient(90deg, transparent, #2C3E50 50%, transparent);
animation: loaderBarSlide 1.4s ease-in-out infinite;
}
/* Старый spinner — оставлен для подэкранов (.loader-inline) */
.spinner {
width: 32px;
height: 32px;
border: 1.5px solid var(--line-strong);
border-top-color: var(--accent-1);
border-radius: var(--r-pill);
animation: spin 0.7s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes logoBreath {
0%, 100% { transform: scale(1); opacity: 0.92; }
50% { transform: scale(1.04); opacity: 1; }
}
@keyframes loaderBarSlide {
0% { left: -40%; }
100% { left: 100%; }
}
@keyframes splashFadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.loader.splash.hide {
/* Мгновенно отключаем взаимодействие, чтобы splash не блокировал клики во время fade */
pointer-events: none !important;
animation: splashFadeOut 0.4s ease-out forwards;
}
@keyframes splashFadeOut {
to { opacity: 0; visibility: hidden; }
}
/* ============================================================
Profile card
============================================================ */
.profile-card {
background: var(--card);
border: 1px solid var(--line-strong);
border-radius: var(--r-card);
padding: var(--s5) var(--s4) var(--s4);
margin-bottom: var(--s5);
position: relative;
overflow: hidden;
}
.profile-card::before {
content: "";
position: absolute;
top: 0; left: 0; right: 0;
height: 3px;
background: var(--ribbon);
}
.profile-card .role-tag {
font-family: var(--font-mono);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: var(--s2);
display: inline-flex;
align-items: center;
gap: var(--s2);
}
.profile-card .role-tag::after {
content: "";
display: inline-block;
width: 24px;
height: 1px;
background: var(--line-strong);
}
.profile-card .head-row {
display: flex;
align-items: flex-start;
gap: var(--s4);
margin-bottom: var(--s3);
}
.profile-card .info { flex: 1; min-width: 0; }
.profile-card .name {
font-family: var(--font-display);
font-style: italic;
font-size: 26px;
font-weight: 400;
line-height: 1.05;
letter-spacing: -0.02em;
color: var(--ink);
margin-bottom: var(--s1);
word-break: break-word;
}
.profile-card .meta {
font-size: 14px;
color: var(--ink-2);
}
.profile-card .avatar {
width: 44px;
height: 44px;
border-radius: var(--r-pill);
background: var(--paper-2);
display: grid;
place-items: center;
flex-shrink: 0;
font-family: var(--font-display);
font-style: italic;
font-size: 22px;
font-weight: 400;
color: var(--accent-1);
border: 1px solid var(--line-strong);
}
.profile-card .meta-row {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: var(--s2);
font-family: var(--font-mono);
font-size: 11px;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
margin-top: var(--s3);
padding-top: var(--s3);
border-top: 1px solid var(--line);
}
.profile-card .meta-row .sep { color: var(--muted-2); }
.profile-card .status-row {
display: inline-flex;
align-items: center;
gap: var(--s2);
}
.profile-card .status-dot {
width: 7px;
height: 7px;
border-radius: var(--r-pill);
background: var(--status-active);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--status-active) 22%, transparent);
animation: pulse 2.5s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--status-active) 22%, transparent); }
50% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--status-active) 0%, transparent); }
}
.profile-card .status-dot.lapsed {
background: var(--status-lapsed);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--status-lapsed) 22%, transparent);
animation: none;
}
.profile-card .status-dot.grace {
background: var(--status-grace);
box-shadow: 0 0 0 3px color-mix(in srgb, var(--status-grace) 22%, transparent);
}
/* ============================================================
Section label
============================================================ */
.section-label {
font-family: var(--font-mono);
font-size: 11px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.14em;
color: var(--muted);
padding: 0 var(--s4);
margin: var(--s5) 0 var(--s2);
display: flex;
align-items: center;
gap: var(--s3);
}
.section-label::after {
content: "";
flex: 1;
height: 1px;
background: var(--line-strong);
}
/* ============================================================
Menu (grouped list)
============================================================ */
.menu {
background: var(--card);
border: 1px solid var(--line-strong);
border-radius: var(--r-card);
overflow: hidden;
}
.menu + .menu { margin-top: var(--s4); }
.menu-item {
display: flex;
align-items: center;
gap: var(--s3);
padding: 10px var(--s4);
min-height: 48px;
color: var(--ink);
cursor: pointer;
transition: background 0.12s;
position: relative;
}
.menu-item + .menu-item::before {
content: "";
position: absolute;
top: 0;
left: var(--s4);
right: 0;
height: 1px;
background: var(--line);
}
.menu-item:active { background: var(--paper-2); }
.menu-item .icon {
width: 28px;
height: 28px;
display: grid;
place-items: center;
flex-shrink: 0;
color: var(--ink);
}
.menu-item .icon svg {
width: 20px;
height: 20px;
stroke-width: 1.6;
}
.menu-item .icon.green { color: var(--status-active); }
.menu-item .icon.blue { color: var(--accent-1); }
.menu-item .icon.gold { color: var(--accent-2); }
.menu-item .text { flex: 1; min-width: 0; }
.menu-item .label {
font-family: var(--font-ui);
font-size: 14.5px;
font-weight: 500;
letter-spacing: -0.01em;
display: flex;
align-items: center;
gap: var(--s2);
}
.menu-item .sub {
font-family: var(--font-mono);
font-size: 11px;
font-weight: 400;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--muted);
margin-top: 4px;
}
.menu-item .chevron {
color: var(--muted-2);
flex-shrink: 0;
display: flex;
align-items: center;
}
.menu-item .chevron svg { width: 18px; height: 18px; }
.menu-item.disabled { cursor: not-allowed; }
.menu-item.disabled .label,
.menu-item.disabled .icon { color: var(--muted); opacity: 0.65; }
.badge {
display: inline-block;
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0.1em;
padding: 2px 8px;
border-radius: var(--r-tag);
background: var(--paper-2);
color: var(--muted);
vertical-align: 2px;
}
/* ============================================================
Footer
============================================================ */
.footer-hint {
text-align: center;
margin-top: var(--s8);
padding: var(--s5) var(--s4) 0;
border-top: 1px solid var(--line);
}
.footer-hint .signature {
font-family: var(--font-display);
font-style: italic;
font-size: 16px;
color: var(--ink-2);
margin-bottom: var(--s2);
}
.footer-hint .meta {
font-family: var(--font-mono);
font-size: 11px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--muted);
}
.footer-hint a { color: var(--accent-1); }
/* ============================================================
Error
============================================================ */
.error {
background: var(--card);
border: 1px solid var(--line-strong);
border-radius: var(--r-card);
padding: var(--s7) var(--s5);
text-align: center;
color: var(--muted);
}
.error h3 {
font-family: var(--font-display);
font-style: italic;
font-size: 22px;
font-weight: 400;
margin: 0 0 var(--s2);
color: var(--ink);
}
/* ============================================================
HOME — Manager dashboard (mockup v2)
============================================================ */
/* App content needs bottom padding for fixed nav */
body.has-bottom-nav #app {
padding-bottom: calc(96px + env(safe-area-inset-bottom));
}
/* ============= Greeting ============= */
.greeting {
display: flex;
align-items: flex-start;
gap: var(--s4);
margin-bottom: var(--s5);
}
.greeting-text { flex: 1; min-width: 0; }
.greeting-kicker {
font-family: var(--font-mono);
font-size: 10.5px;
font-weight: 500;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: var(--s2);
}
.greeting-headline {
font-family: var(--font-display);
font-style: italic;
font-size: 32px;
font-weight: 400;
line-height: 1.1;
letter-spacing: -0.02em;
color: var(--ink);
}
.greeting-headline .accent {
color: var(--accent-2); /* walnut акцент на части фразы */
}
.bell-btn {
width: 40px;
height: 40px;
border-radius: var(--r-pill);
background: var(--card);
border: 1px solid var(--line-strong);
display: grid;
place-items: center;
position: relative;
flex-shrink: 0;
color: var(--ink);
cursor: pointer;
}
.bell-btn svg { width: 20px; height: 20px; stroke-width: 1.6; }
.bell-btn .dot {
position: absolute;
top: 7px;
right: 9px;
width: 7px;
height: 7px;
border-radius: var(--r-pill);
background: #C0392B;
border: 1.5px solid var(--paper);
}
/* ============= Hero task card ============= */
.hero {
background: var(--ink);
color: var(--paper);
border-radius: var(--r-card);
padding: var(--s4);
margin-bottom: var(--s6);
position: relative;
overflow: hidden;
}
.hero::before {
/* тонкая бренд-полоса слева */
content: "";
position: absolute;
top: 0; bottom: 0; left: 0;
width: 3px;
background: linear-gradient(180deg, var(--accent-2), var(--status-active));
}
.hero-meta {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--s2);
font-family: var(--font-mono);
font-size: 10.5px;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: rgba(251, 247, 240, 0.55);
margin-bottom: var(--s3);
}
.hero-meta .left { display: inline-flex; align-items: center; gap: var(--s2); }
.hero-meta .left .sep { color: rgba(251, 247, 240, 0.30); }
.hero-tag {
font-family: var(--font-mono);
font-size: 10px;
font-weight: 500;
letter-spacing: 0.14em;
padding: 3px 8px;
border-radius: var(--r-tag);
background: rgba(251, 247, 240, 0.08);
color: rgba(251, 247, 240, 0.85);
}
.hero-client {
font-family: var(--font-ui);
font-size: 22px;
font-weight: 600;
letter-spacing: -0.01em;
color: var(--paper);
margin-bottom: 4px;
}
.hero-address {
font-family: var(--font-ui);
font-size: 14px;
color: rgba(251, 247, 240, 0.70);
margin-bottom: var(--s4);
}
.hero-actions {
display: flex;
gap: var(--s2);
}
.btn-gold {
flex: 1;
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--s2);
padding: 10px var(--s3);
border-radius: var(--r-btn);
background: #C9985E;
color: #1F1A14;
font-family: var(--font-ui);
font-size: 13.5px;
font-weight: 600;
letter-spacing: -0.01em;
cursor: pointer;
}
.btn-gold svg { width: 16px; height: 16px; stroke-width: 1.7; }
.btn-icon-dark {
width: 40px;
flex-shrink: 0;
display: grid;
place-items: center;
border-radius: var(--r-btn);
background: rgba(251, 247, 240, 0.10);
color: var(--paper);
cursor: pointer;
}
.btn-icon-dark svg { width: 18px; height: 18px; stroke-width: 1.6; }
/* ============= Section header (with right-action) ============= */
.section-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--s3);
padding: 0 var(--s2);
margin: var(--s5) 0 var(--s2);
}
.section-head .label {
font-family: var(--font-mono);
font-size: 10.5px;
font-weight: 500;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted);
}
.section-head .label .count {
color: var(--ink);
margin-left: 4px;
}
.section-head .more {
font-family: var(--font-mono);
font-size: 10.5px;
font-weight: 500;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--accent-2);
cursor: pointer;
}
/* ============= Quick actions (2x2 grid) ============= */
.quick-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--s3);
}
.quick-card {
background: var(--card);
border: 1px solid var(--line-strong);
border-radius: var(--r-card);
padding: 10px 12px;
display: flex;
flex-direction: column;
gap: 6px;
cursor: pointer;
transition: background 0.12s;
}
.quick-card:active { background: var(--paper-2); }
.quick-card .icon {
width: 24px;
height: 24px;
display: grid;
place-items: center;
color: var(--accent-2);
margin: 0;
}
.quick-card .icon svg { width: 20px; height: 20px; stroke-width: 1.6; }
.quick-card .title {
font-family: var(--font-ui);
font-size: 13.5px;
font-weight: 600;
letter-spacing: -0.01em;
color: var(--ink);
margin: 0;
line-height: 1.2;
}
.quick-card .subtitle {
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--muted);
line-height: 1.2;
}
/* ============= Project card ============= */
.project-list {
display: flex;
flex-direction: column;
gap: var(--s3);
}
.project-card {
background: var(--card);
border: 1px solid var(--line-strong);
border-radius: var(--r-card);
padding: var(--s4);
cursor: pointer;
}
.project-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--s2);
margin-bottom: 4px;
}
.project-title {
font-family: var(--font-ui);
font-size: 16px;
font-weight: 600;
letter-spacing: -0.01em;
color: var(--ink);
flex: 1;
}
.project-pill {
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 500;
letter-spacing: 0.10em;
text-transform: uppercase;
padding: 3px 8px;
border-radius: var(--r-tag);
white-space: nowrap;
}
.project-pill.waiting { background: var(--paper-2); color: var(--accent-2); }
.project-pill.active { background: var(--paper-2); color: var(--status-active); }
.project-pill.urgent { background: rgba(192,57,43,0.10); color: #8C3F1E; }
.project-address {
font-family: var(--font-ui);
font-size: 13.5px;
color: var(--muted);
margin-bottom: var(--s3);
}
.project-progress {
height: 3px;
background: var(--line);
border-radius: var(--r-pill);
overflow: hidden;
margin-bottom: var(--s2);
}
.project-progress .bar {
height: 100%;
background: var(--accent-2);
border-radius: inherit;
}
.project-foot {
display: flex;
justify-content: space-between;
font-family: var(--font-mono);
font-size: 10.5px;
font-weight: 500;
letter-spacing: 0.10em;
text-transform: uppercase;
color: var(--muted);
}
.project-foot .stage { color: var(--ink-2); }
/* ============= Bottom navigation ============= */
.bottom-nav {
position: fixed;
left: 0; right: 0; bottom: 0;
z-index: 100;
display: flex;
align-items: flex-end;
justify-content: space-around;
background: var(--paper);
border-top: 1px solid var(--line-strong);
padding: 6px 0 calc(8px + env(safe-area-inset-bottom));
font-family: var(--font-mono);
font-size: 9.5px;
font-weight: 500;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.bottom-nav button {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 4px;
color: var(--muted);
padding: 6px 2px;
position: relative;
cursor: pointer;
}
.bottom-nav button.active { color: var(--ink); }
.bottom-nav button svg { width: 22px; height: 22px; stroke-width: 1.6; }
.bottom-nav .fab {
flex: 0 0 auto;
width: 52px;
height: 52px;
border-radius: var(--r-pill);
background: var(--ink);
color: var(--paper);
display: grid;
place-items: center;
margin: 0 8px;
transform: translateY(-12px);
box-shadow: 0 4px 14px rgba(31, 26, 20, 0.25);
}
.bottom-nav .fab svg { width: 22px; height: 22px; stroke-width: 2.2; color: var(--paper); }
.bottom-nav .badge {
position: absolute;
top: 2px;
right: 22%;
min-width: 16px;
height: 16px;
padding: 0 4px;
border-radius: var(--r-pill);
background: #C0392B;
color: var(--paper);
font-size: 10px;
font-weight: 600;
display: grid;
place-items: center;
letter-spacing: 0;
}