zov-tech/miniapp/assets/styles.css
wasrusgen 0aa7a8e35a splash: эффекты I + K — wobble пилы + опилки
I: sawWobble — весь логотип покачивается ±1.5° каждые 5.5с
   (имитация работающего инструмента). Анимация на wrapper,
   чтобы не конфликтовать с breathing scale на самом SVG.

K: splash-dust — 8 опилок-точек разлетаются от пилы по
   индивидуальным траекториям (--dx/--dy через CSS-vars),
   разные delays и durations для естественности.

Cache bust v=20260513zk.
2026-05-13 22:36:23 +03:00

1080 lines
26 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 v4
Три варианта: brand (default) · a (Editorial Calm) · c (Architectural Clean)
Переключатель — `<html data-variant="a|c|brand">`, состояние в localStorage.
============================================================ */
/* ===========================================================
1. BRAND (default :root) — мой гибрид с палитрой ЗОВ
=========================================================== */
: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.16);
--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: 4px;
--r-pill: 999px;
--s1: 4px; --s2: 8px; --s3: 12px; --s4: 16px;
--s5: 20px; --s6: 24px; --s7: 32px; --s8: 40px;
--font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, system-ui, sans-serif;
--font-display: "Instrument Serif", Georgia, "Times New Roman", serif;
--font-mono: "JetBrains Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
--ribbon: linear-gradient(90deg, var(--accent-1) 0%, var(--accent-2) 100%);
}
@media (prefers-color-scheme: dark) { :root { color-scheme: dark; } }
html[data-theme="dark"]:not([data-variant="a"]):not([data-variant="c"]) {
--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.10);
--line-strong: rgba(255, 255, 255, 0.20);
}
/* ===========================================================
2. VARIANT A — Editorial Calm
(палитра/шрифты — дословно из мокапа)
=========================================================== */
html[data-variant="a"] {
--paper: #FBF7F0;
--paper-2: #F5EDDC;
--card: #FBF7F0;
--ink: #1F1A14;
--ink-2: #8B8275;
--muted: #8B8275;
--muted-2: #9A9085;
--line: rgba(31, 26, 20, 0.18);
--line-strong: rgba(31, 26, 20, 0.40);
--accent-1: #3C5278; /* editorial blue */
--accent-2: #6B4A2B; /* walnut */
--accent-3: #B85A2D; /* terracotta */
/* Active = зелёный сигнал (бренд ЗОВ); lapsed/grace остаются в палитре A */
--status-active: #76BD22;
--status-lapsed: #B85A2D;
--status-grace: #6B4A2B;
/* Скругления: editorial был с 0px, но пользователь хочет мягкую форму */
--r-card: 16px;
--r-btn: 12px;
--r-tag: 6px;
--r-pill: 100px;
--font-ui: "Geist", "Manrope", -apple-system, system-ui, sans-serif;
--font-display: "Newsreader", "Cormorant Garamond", Georgia, serif;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
--ribbon: linear-gradient(90deg, var(--accent-1) 0%, var(--accent-2) 50%, var(--accent-3) 100%);
}
/* ===========================================================
3. VARIANT C — Architectural Clean
=========================================================== */
html[data-variant="c"] {
--paper: #FAFAF7;
--paper-2: #EEEAE0;
--card: #FAFAF7;
--ink: #0F0F0E;
--ink-2: #1F1A14;
--muted: #6E6A62;
--muted-2: #A09C92;
--line: rgba(15, 15, 14, 0.18);
--line-strong: rgba(15, 15, 14, 0.40);
--accent-1: #3A6B44; /* blueprint green */
--accent-2: #5A3F26; /* walnut */
--accent-3: #8C3F1E;
--status-active: #3A6B44;
--status-lapsed: #8C3F1E;
--status-grace: #5A3F26;
--r-card: 0;
--r-btn: 0;
--r-tag: 4px;
--r-pill: 100px;
--font-ui: "Geist", -apple-system, system-ui, sans-serif;
--font-display: "Instrument Serif", "Cormorant Garamond", Georgia, serif;
--font-mono: "JetBrains Mono", ui-monospace, monospace;
--ribbon: linear-gradient(90deg, var(--accent-2) 0%, var(--accent-1) 100%);
}
/* ============================================================
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;
}
/* ============================================================
Theme switcher (top of page)
============================================================ */
.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;
animation: sawWobble 5.5s ease-in-out infinite;
transform-origin: 50% 35%; /* центр диска пилы */
}
.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));
}
/* Опилки — точки летают вокруг пилы */
.splash-dust {
position: absolute;
inset: -10% -20% -10% -20%;
pointer-events: none;
}
.splash-dust .dust {
position: absolute;
width: 3px;
height: 3px;
background: #2C3E50;
border-radius: 50%;
opacity: 0;
will-change: transform, opacity;
}
/* 8 точек с разными траекториями */
.splash-dust .d1 { left: 30%; top: 50%; animation: dustFly 3.6s ease-out 0s infinite; --dx:-30px; --dy:-50px; }
.splash-dust .d2 { left: 35%; top: 45%; animation: dustFly 4.2s ease-out 0.4s infinite; --dx:-50px; --dy:-30px; }
.splash-dust .d3 { left: 25%; top: 55%; animation: dustFly 3.2s ease-out 0.8s infinite; --dx:-60px; --dy:20px; }
.splash-dust .d4 { left: 40%; top: 60%; animation: dustFly 5.0s ease-out 0.2s infinite; --dx:-20px; --dy:50px; }
.splash-dust .d5 { left: 65%; top: 55%; animation: dustFly 3.8s ease-out 0.6s infinite; --dx: 50px; --dy: 30px; }
.splash-dust .d6 { left: 60%; top: 50%; animation: dustFly 4.6s ease-out 1.0s infinite; --dx: 60px; --dy:-20px; }
.splash-dust .d7 { left: 70%; top: 45%; animation: dustFly 3.4s ease-out 0.3s infinite; --dx: 40px; --dy:-50px; }
.splash-dust .d8 { left: 75%; top: 60%; animation: dustFly 4.0s ease-out 0.9s infinite; --dx: 70px; --dy: 40px; }
@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); }
}
@keyframes sawWobble {
0%, 100% { transform: rotate(-1deg); }
50% { transform: rotate(1.5deg); }
}
.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;
}