:root { --bg: #ebe7de; --card: rgba(252, 250, 246, 0.96); --ink: #2f2c28; --muted: #7a736a; --line: #d8d2c7; --accent: #e8590c; --accent-ink: #fff; --ok: #2f7d32; --warn: #b26a00; --bad: #c62828; font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif; color: var(--ink); } * { box-sizing: border-box; } html, body { margin: 0; height: 100%; background: var(--bg); overflow: hidden; } #app { position: fixed; inset: 0; } button, input { font: inherit; color: inherit; } a { color: #8a4b1f; } code { font-size: 12px; background: #eee8de; padding: 1px 4px; border-radius: 4px; } .card { background: var(--card); border: 1px solid var(--line); border-radius: 12px; box-shadow: 0 6px 24px rgba(40, 30, 20, 0.12); } .btn { border: 1px solid var(--line); background: #fff; border-radius: 8px; padding: 7px 12px; cursor: pointer; white-space: nowrap; font-size: 14px; } .btn:hover { border-color: #b9b0a2; } .btn.on { background: #fde8dc; border-color: var(--accent); color: #9a3a06; } .btn.primary { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); font-weight: 600; padding: 10px 14px; font-size: 15px; } .btn.primary:disabled { opacity: 0.45; cursor: default; } .btn.ghost { background: transparent; } .btn.file { display: block; text-align: left; } .row { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; } .col { display: flex; flex-direction: column; gap: 8px; margin-top: 8px; } .hint { font-size: 12px; color: var(--muted); } .chip { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; padding: 4px 8px; border: 1px solid var(--line); border-radius: 999px; background: #fff; cursor: pointer; user-select: none; } .attribution { position: absolute; right: 6px; bottom: 4px; font-size: 11px; color: #555; background: rgba(255, 255, 255, 0.8); padding: 1px 6px; border-radius: 4px; } /* ---------- выбор области */ .picker-stage { position: absolute; inset: 0; } .map-box { position: absolute; inset: 0; touch-action: none; } .map-canvas { display: block; cursor: grab; touch-action: none; } .picker-panel { position: absolute; z-index: 2; top: 16px; left: 16px; width: min(380px, calc(100vw - 32px)); max-height: calc(100vh - 32px); overflow: auto; padding: 16px; display: flex; flex-direction: column; gap: 10px; } .brand { font-weight: 700; font-size: 20px; letter-spacing: 0.2px; } .lead { margin: 0; font-size: 13.5px; color: #514b43; line-height: 1.4; } .search { display: flex; gap: 6px; } .search input, .field input { font-size: 14px; flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: 8px; padding: 7px 10px; background: #fff; } .results { display: flex; flex-direction: column; gap: 4px; } .result { text-align: left; border: 0; background: #f4f0e9; border-radius: 6px; padding: 6px 8px; cursor: pointer; font-size: 12.5px; } .result:hover { background: #ece5da; } .sel-info { font-size: 13px; padding: 6px 8px; border-radius: 6px; background: #f4f0e9; } .sel-info.ok { color: var(--ok); } .sel-info.warn { color: var(--warn); } .sel-info.bad { color: var(--bad); } .field { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--muted); } .more summary { cursor: pointer; font-size: 13px; color: var(--muted); } .err { color: var(--bad); font-size: 13px; background: #fdecea; border-radius: 6px; padding: 8px; white-space: pre-wrap; } /* ---------- прогресс */ .overlay { position: fixed; inset: 0; z-index: 50; background: rgba(30, 26, 22, 0.35); display: flex; align-items: center; justify-content: center; } .overlay[hidden] { display: none; } .progress-card { width: min(420px, calc(100vw - 32px)); padding: 18px; display: flex; flex-direction: column; gap: 10px; } .p-title { font-weight: 700; } .p-text { font-size: 13px; color: #514b43; min-height: 1.3em; } .bar { height: 8px; border-radius: 99px; background: #e8e2d8; overflow: hidden; } .bar i { display: block; height: 100%; width: 0; background: var(--accent); transition: width 0.2s; } .progress-card .btn { align-self: flex-end; } /* ---------- просмотр */ .viewer { position: absolute; inset: 0; } .world-canvas { display: block; touch-action: none; cursor: grab; } .world-canvas:active { cursor: grabbing; } .viewer-top { position: absolute; top: 12px; left: 12px; padding: 10px 12px; display: flex; flex-direction: column; gap: 6px; max-width: min(640px, calc(100vw - 100px)); } .viewer-top .title { font-weight: 700; font-size: 16px; } .viewer-top .stats { font-size: 12px; color: var(--muted); } .floor-bar { position: absolute; right: 12px; top: 12px; padding: 8px 6px; display: flex; flex-direction: column; align-items: center; gap: 6px; max-height: calc(100vh - 60px); } .floor-title { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px; } .floor-list { display: flex; flex-direction: column; gap: 3px; overflow: auto; } .floor-btn { width: 36px; height: 30px; border: 1px solid var(--line); background: #fff; border-radius: 6px; cursor: pointer; font-size: 13px; } .floor-btn.on { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 600; } .floor-btn.sm { width: 30px; height: 26px; font-size: 12px; } .floor-hint { font-size: 10px; color: var(--muted); } .info { position: absolute; left: 12px; bottom: 36px; width: min(320px, calc(100vw - 90px)); padding: 12px; font-size: 13px; display: flex; flex-direction: column; gap: 5px; } .info[hidden] { display: none; } .info .title { font-weight: 700; font-size: 15px; padding-right: 20px; } .info .sub { color: var(--muted); font-size: 12px; } .info .kv { display: flex; gap: 6px; align-items: baseline; } .info .kv span { color: var(--muted); flex: 1; } .info .kv i { color: var(--muted); font-size: 11px; } .info .rooms { font-size: 12px; color: #514b43; } .info .links { display: flex; gap: 12px; font-size: 12px; } .info .close { position: absolute; top: 6px; right: 8px; border: 0; background: none; font-size: 20px; cursor: pointer; color: var(--muted); } .floor-pick { display: flex; flex-wrap: wrap; gap: 3px; margin: 4px 0; } .scale { position: absolute; left: 12px; bottom: 10px; height: 18px; border: 2px solid #3e3a35; border-top: 0; font-size: 11px; text-align: center; color: #3e3a35; background: rgba(255, 255, 255, 0.55); line-height: 16px; min-width: 30px; } @media (max-width: 640px) { .viewer-top .stats { display: none; } .picker-panel { top: auto; bottom: 8px; left: 8px; max-height: 55vh; } }