/* ============================================================ ЗОВ MiniApp — design system v4 Три варианта: brand (default) · a (Editorial Calm) · c (Architectural Clean) Переключатель — ``, состояние в 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; } .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; }