zov-tech/miniapp/assets/styles.css
wasrusgen b3b62fa902 refine: per-theme personality from dashboard analysis
Extracted from reference dashboards (computed styles, class structure, color usage):

B Foundry:  r-card 0px, body lh 1.5, Archivo 800 display,
            dark #15140F header (palette + greeting full-width),
            wide 0.18em kicker tracking, heavy section labels
C Boardroom: r-card 0px, r-tag 999px (pills), body lh 1.12,
            Geist 400 display (restrained), dark petrol header,
            copper accent on greeting
D Atelier:  body lh 1.1, Manrope 700 display, white card header
            on dove bg, ink-bottom-border divider,
            prominent uppercase section labels

Also: role-card border-radius switched to var(--r-card) from hardcoded 16px

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

1364 lines
35 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: var(--lh, 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;
}
/* ============================================================
Per-theme personality overrides v5.1
Tokens distilled from B/C/D reference dashboards.
============================================================ */
/* -------------------------------------------------------
B — Foundry: Archivo 800, sharp corners, dark header
Dashboard: font-weight 400/700/800, radius 0px, lh 1.5
------------------------------------------------------- */
html[data-variant="b"] {
--r-card: 0px;
--r-btn: 0px;
--r-tag: 0px;
--lh: 1.5;
}
/* Dark header extends edge-to-edge — palette switcher + greeting */
html[data-variant="b"] .palette-switcher,
html[data-variant="b"] .greeting {
margin-inline: calc(-1 * var(--s4));
padding-inline: var(--s4);
background: var(--ink);
}
html[data-variant="b"] .palette-switcher {
margin-top: calc(-1 * var(--s3));
padding-top: var(--s3);
padding-bottom: var(--s2);
}
html[data-variant="b"] .greeting {
padding-bottom: var(--s5);
margin-bottom: var(--s5);
}
/* Palette switcher on dark bg */
html[data-variant="b"] .palette-switcher__label { color: rgba(239,233,216,0.38); }
html[data-variant="b"] .ps-btn { background: rgba(239,233,216,0.06); border-color: rgba(239,233,216,0.12); }
html[data-variant="b"] .ps-btn.active { background: rgba(239,233,216,0.15); border-color: rgba(239,233,216,0.55); }
html[data-variant="b"] .ps-name { color: rgba(239,233,216,0.55); }
html[data-variant="b"] .ps-btn.active .ps-name { color: #EFE9D8; }
/* Greeting typography — Archivo Heavy */
html[data-variant="b"] .greeting-kicker { color: rgba(239,233,216,0.45); }
html[data-variant="b"] .greeting-headline {
font-family: var(--font-ui);
font-style: normal;
font-weight: 800;
font-size: 34px;
letter-spacing: -0.04em;
color: #EFE9D8;
}
html[data-variant="b"] .greeting-headline .accent { color: #B68A1A; }
/* Section labels — wider tracking, ink weight */
html[data-variant="b"] .section-head .label {
font-weight: 700;
letter-spacing: 0.18em;
}
/* Cards — flat with visible border */
html[data-variant="b"] .quick-card,
html[data-variant="b"] .card,
html[data-variant="b"] .today-card {
border-width: 1.5px;
}
/* -------------------------------------------------------
C — Boardroom: Geist 400, sharp corners, petrol header
Dashboard: font-weight 400/500, radius 0/999px, lh 1.12
------------------------------------------------------- */
html[data-variant="c"] {
--r-card: 0px;
--r-btn: 0px;
--r-tag: 999px; /* pills stay pill-shaped */
--lh: 1.12;
}
/* Dark petrol header */
html[data-variant="c"] .palette-switcher,
html[data-variant="c"] .greeting {
margin-inline: calc(-1 * var(--s4));
padding-inline: var(--s4);
background: var(--ink);
}
html[data-variant="c"] .palette-switcher {
margin-top: calc(-1 * var(--s3));
padding-top: var(--s3);
padding-bottom: var(--s2);
}
html[data-variant="c"] .greeting {
padding-bottom: var(--s5);
margin-bottom: var(--s5);
}
/* Palette switcher on dark bg */
html[data-variant="c"] .palette-switcher__label { color: rgba(242,233,214,0.35); }
html[data-variant="c"] .ps-btn { background: rgba(242,233,214,0.06); border-color: rgba(242,233,214,0.12); }
html[data-variant="c"] .ps-btn.active { background: rgba(242,233,214,0.14); border-color: rgba(242,233,214,0.50); }
html[data-variant="c"] .ps-name { color: rgba(242,233,214,0.50); }
html[data-variant="c"] .ps-btn.active .ps-name { color: #F2E9D6; }
/* Greeting typography — Geist Regular, restrained */
html[data-variant="c"] .greeting-kicker { color: rgba(242,233,214,0.40); }
html[data-variant="c"] .greeting-headline {
font-family: var(--font-ui);
font-style: normal;
font-weight: 400;
font-size: 30px;
letter-spacing: -0.01em;
line-height: 1.1;
color: #F2E9D6;
}
html[data-variant="c"] .greeting-headline .accent { color: #D08A55; }
/* Section labels — Geist, moderate weight */
html[data-variant="c"] .section-head .label {
font-family: var(--font-ui);
font-weight: 500;
letter-spacing: 0.10em;
}
/* -------------------------------------------------------
D — Atelier: Manrope 700, white card header, dove bg
Dashboard: font-weight 400/600/700, lh 1.1, white cards
------------------------------------------------------- */
html[data-variant="d"] {
--lh: 1.1;
}
/* White card header — floats on dove background */
html[data-variant="d"] .palette-switcher,
html[data-variant="d"] .greeting {
margin-inline: calc(-1 * var(--s4));
padding-inline: var(--s4);
background: var(--card);
}
html[data-variant="d"] .palette-switcher {
margin-top: calc(-1 * var(--s3));
padding-top: var(--s3);
padding-bottom: var(--s2);
}
html[data-variant="d"] .greeting {
padding-bottom: var(--s4);
margin-bottom: 0;
border-bottom: 1px solid var(--line);
}
/* Greeting typography — Manrope Bold */
html[data-variant="d"] .greeting-headline {
font-family: var(--font-ui);
font-style: normal;
font-weight: 700;
font-size: 30px;
letter-spacing: -0.02em;
line-height: 1.1;
}
html[data-variant="d"] .greeting-headline .accent { color: var(--accent-1); }
/* Section labels — prominent uppercase, Manrope semibold */
html[data-variant="d"] .section-head .label {
font-family: var(--font-ui);
font-weight: 700;
font-size: 10px;
letter-spacing: 0.16em;
color: var(--ink-2);
}