@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-greek-wght-normal-CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/inter-latin-wght-normal-Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(data:font/woff2;base64,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)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono Variable;font-style:normal;font-display:swap;font-weight:100 800;src:url(/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--bg-dark:#0a0a0f;--glass-bg:#0c0c14d6;--glass-border:#ffffff14;--glass-border-hover:#ffffff26;--accent:#00d4ff;--accent-dim:#00d4ff26;--accent-glow:#00d4ff66;--text-primary:#e8eaed;--text-secondary:#e8eaeda8;--text-dim:#e8eaed7a;--font-mono:"JetBrains Mono Variable", "SF Mono", "Fira Code", monospace;--font-sans:"Inter Variable", -apple-system, BlinkMacSystemFont, sans-serif;--panel-radius:16px;--btn-radius:10px;--transition-fast:.15s cubic-bezier(.4, 0, .2, 1);--transition-smooth:.3s cubic-bezier(.4, 0, .2, 1);--edge:52px;--stack-top:max(26vh, 172px);--collapsed-width:176px;--safe-top:env(safe-area-inset-top,0px);--safe-bottom:env(safe-area-inset-bottom,0px);--safe-left:env(safe-area-inset-left,0px);--safe-right:env(safe-area-inset-right,0px)}@media (max-width:720px){:root{--edge:16px}}*{box-sizing:border-box;margin:0;padding:0}html,body,#root{background:var(--bg-dark);width:100%;height:100%;font-family:var(--font-sans);color:var(--text-primary);-webkit-font-smoothing:antialiased;-webkit-tap-highlight-color:transparent;overscroll-behavior:none;overflow:hidden}button,select,input{font:inherit;color:inherit}:focus-visible{outline:1px solid color-mix(in srgb, var(--accent) 80%, transparent);outline-offset:2px}[hidden]{display:none!important}.visually-hidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}@media (prefers-reduced-motion:reduce){*,:before,:after{transition-duration:.01ms!important;animation-duration:.01ms!important}}.stack{top:var(--stack-top);z-index:100;pointer-events:none;flex-direction:column;gap:8px;display:flex;position:fixed;bottom:4vh}.stack-left{left:calc(var(--edge) + var(--safe-left));align-items:flex-start;width:360px}.stack-right{right:calc(var(--edge) + var(--safe-right));z-index:110;align-items:flex-end;width:330px}.panel{width:var(--panel-width,300px);pointer-events:auto;max-width:100%;min-height:0;animation:panel-rise var(--transition-smooth) both;display:flex;position:relative}.panel.collapsed{width:var(--collapsed-width);flex-shrink:0}@keyframes panel-rise{0%{opacity:0;transform:translateY(8px)}}.panel-glow{background:radial-gradient(ellipse at center, var(--accent-dim) 0%, transparent 60%);filter:blur(20px);opacity:.25;pointer-events:none;position:absolute;inset:-20px}.panel-inner{background:var(--glass-bg);border:1px solid var(--glass-border);border-radius:var(--panel-radius);-webkit-backdrop-filter:blur(24px)saturate(1.4);flex-direction:column;flex:1;min-width:0;min-height:0;padding:14px 16px 12px;display:flex;position:relative;box-shadow:0 8px 32px #00000080,inset 0 0 0 1px #ffffff08,inset 0 1px #ffffff0f}.panel.collapsed .panel-inner{padding-bottom:10px}.panel-header{align-items:center;gap:12px;margin-bottom:14px;padding:0 4px;display:flex}.panel.collapsed .panel-header{margin-bottom:2px}.panel-title{font-family:var(--font-mono);letter-spacing:3px;color:var(--text-dim);text-transform:uppercase;white-space:nowrap;font-size:9px}.panel.collapsed .panel-title{letter-spacing:1.8px;font-size:8px}.panel-divider{background:linear-gradient(to right, var(--glass-border), transparent);flex:1;height:1px}.panel:not(.collapsed) .panel-divider{background:linear-gradient(90deg,#00d4ff47,#00d4ff2e 58%,#0000);box-shadow:0 0 7px #00d4ff38}.panel-collapse-btn{width:22px;height:22px;color:var(--text-dim);font-family:var(--font-mono);cursor:pointer;transition:all var(--transition-fast);background:#ffffff08;border:1px solid #ffffff1f;border-radius:6px;flex-shrink:0;font-size:13px;line-height:1}.panel-collapse-btn:hover{border-color:var(--glass-border-hover);color:var(--text-primary);background:#ffffff12}.panel-collapse-btn:after{content:"";height:44px;position:absolute;inset:0 0 auto}.panel-body{overscroll-behavior:contain;scrollbar-width:thin;scrollbar-color:#00d4ff80 #ffffff0a;flex-direction:column;gap:8px;min-height:0;padding-right:4px;display:flex;overflow-y:auto}.panel-body::-webkit-scrollbar{width:6px}.panel-body::-webkit-scrollbar-track{background:#ffffff0a;border-radius:999px}.panel-body::-webkit-scrollbar-thumb{background:linear-gradient(#00d4ffa6,#00d4ff33);border-radius:999px}.scene-btn{min-width:72px;color:var(--text-secondary);font-family:var(--font-mono);letter-spacing:1.2px;white-space:nowrap;cursor:pointer;transition:all var(--transition-fast);background:#ffffff0d;border:1px solid #ffffff24;border-radius:7px;flex:1;padding:6px 9px;font-size:9px}.scene-btn:hover:not(:disabled),.scene-btn.active{color:var(--accent);border-color:var(--accent);background:#00d4ff24}.scene-btn:disabled{opacity:.45;cursor:default}.stacks{display:contents}@media (max-width:720px){.stacks{top:calc(76px + var(--safe-top));left:calc(var(--edge) + var(--safe-left));right:calc(var(--edge) + var(--safe-right));z-index:100;max-height:calc(100dvh - 160px - var(--safe-top) - var(--safe-bottom));overscroll-behavior:contain;pointer-events:none;scrollbar-width:none;flex-wrap:wrap;align-content:flex-start;gap:8px;display:flex;position:fixed;overflow-y:auto}.stack{display:contents}.panel{flex:0 0 100%;order:2}.panel.collapsed{flex:1 1 0;order:1;width:auto;min-width:0}.panel.collapsed .panel-inner{padding:10px 10px 8px 12px}.panel.collapsed .panel-header{gap:6px;padding:0}.panel-body{overflow-y:visible}.scene-btn{padding:10px 9px}}.data-toggle-list{flex-direction:column;gap:2px;display:flex}.data-toggle-row{transition:background var(--transition-fast);border-radius:8px;padding:8px 10px 6px}.data-toggle-row:hover{background:#ffffff08}.data-toggle-top{justify-content:space-between;align-items:center;gap:8px;display:flex}.data-toggle-left{align-items:center;gap:8px;min-width:0;display:flex}.data-toggle-right{align-items:center;gap:10px;display:flex}.data-icon{font-size:16px;line-height:1}.data-name{font-family:var(--font-sans);color:var(--text-primary);letter-spacing:.3px;white-space:nowrap;text-overflow:ellipsis;font-size:13px;font-weight:500;overflow:hidden}.data-count{font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-secondary);text-align:right;min-width:30px;font-size:11px}.data-toggle-btn{font-family:var(--font-mono);letter-spacing:1.5px;color:var(--text-dim);cursor:pointer;transition:all var(--transition-fast);text-align:center;background:#ffffff0a;border:1px solid #ffffff14;border-radius:4px;outline:none;min-width:38px;padding:3px 10px;font-size:9px}.data-toggle-btn:is(.feed-loading,.feed-degraded,.feed-unavailable){letter-spacing:.8px;min-width:82px}.data-toggle-btn:hover{border-color:var(--glass-border-hover);background:#ffffff0f}.data-toggle-btn:focus-visible{outline:1px solid var(--accent);outline-offset:2px}.data-toggle-btn.active{color:var(--accent);border-color:var(--accent);background:var(--accent-dim);box-shadow:0 0 10px #00d4ff26}.data-toggle-btn.active.feed-degraded{color:#ffad72;background:#ff70301a;border-color:#ff8948c7;box-shadow:0 0 10px #ff70301f}.data-toggle-btn.active.feed-unavailable{color:#ff8585;background:#ff3c3c1a;border-color:#ff5c5cc7;box-shadow:0 0 10px #ff3c3c1f}.data-toggle-meta{font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-dim);margin-top:2px;padding-left:26px;font-size:9px}@media (max-width:720px){.data-toggle-btn{padding:8px 12px}}.dock{left:50%;bottom:calc(2vh + var(--safe-bottom));z-index:105;--panel-width:min(560px, calc(100vw - 2 * var(--edge)));position:fixed;transform:translate(-50%)}.dock.collapsed{--collapsed-width:200px}.dock .panel{animation:none}.button-grid{scroll-behavior:smooth;scrollbar-width:none;flex-shrink:0;gap:8px;display:flex;overflow-x:auto}.button-grid::-webkit-scrollbar{display:none}.style-btn{border-radius:var(--btn-radius);cursor:pointer;min-width:78px;transition:all var(--transition-fast);background:#ffffff08;border:1px solid #ffffff0f;outline:none;flex-direction:column;flex:1 0 auto;align-items:center;gap:6px;padding:14px 16px 10px;display:flex;position:relative;overflow:hidden}.style-btn:before{content:"";opacity:0;transition:opacity var(--transition-fast);background:linear-gradient(#ffffff0a 0%,#0000 100%);position:absolute;inset:0}.style-btn:hover{border-color:var(--glass-border-hover);background:#ffffff0f;transform:translateY(-1px)}.style-btn:hover:before{opacity:1}.style-btn:active{transform:translateY(0)}.style-btn:focus-visible{outline:1px solid var(--accent);outline-offset:2px}.style-btn.active{border-color:var(--accent);background:var(--accent-dim);box-shadow:0 0 20px #00d4ff26,inset 0 0 0 1px #00d4ff1a}.style-btn.active .btn-icon{color:var(--accent);text-shadow:0 0 12px var(--accent-glow)}.style-btn.active .btn-label{color:var(--text-primary)}.btn-icon{color:var(--text-secondary);transition:all var(--transition-fast);font-size:20px;line-height:1}.btn-label{font-family:var(--font-sans);color:var(--text-secondary);letter-spacing:.3px;transition:color var(--transition-fast);font-size:11px;font-weight:500}.dock-sections{grid-template-columns:repeat(3,minmax(0,1fr));gap:10px 14px;margin-top:4px;display:grid}.dock-section{flex-direction:column;gap:5px;min-width:0;display:flex}.dock-section-title{font-family:var(--font-mono);letter-spacing:1.35px;color:var(--text-dim);text-transform:uppercase;font-size:8px}.chip-row{grid-template-columns:repeat(2,minmax(0,1fr));gap:4px;display:grid}.map-stack-chip{font-family:var(--font-mono);letter-spacing:.6px;text-transform:uppercase;white-space:nowrap;color:var(--text-dim);cursor:pointer;transition:color var(--transition-fast), background-color var(--transition-fast), border-color var(--transition-fast), box-shadow var(--transition-fast);background:#ffffff0a;border:1px solid #ffffff14;border-radius:4px;outline:none;justify-content:center;align-items:baseline;padding:4px 7px;font-size:9px;display:inline-flex}.map-stack-chip:hover,.map-stack-chip:focus-visible{border-color:var(--glass-border-hover);color:var(--text-primary);background:#ffffff0f}.map-stack-chip:focus-visible{outline:1px solid color-mix(in srgb, var(--accent) 80%, transparent);outline-offset:2px}.map-stack-chip.active{color:var(--accent);border-color:var(--accent);background:var(--accent-dim);box-shadow:0 0 10px #00d4ff26}.glass-select{width:100%;min-width:0;color:var(--text-primary);font-family:var(--font-sans);background:#ffffff0f;border:1px solid #ffffff24;border-radius:7px;outline:none;padding:4px 8px;font-size:12px}.glass-select:disabled{opacity:.45}.glass-select option{background:#12121a}@media (max-width:720px){.dock{bottom:calc(20px + var(--safe-bottom));--panel-width:calc(100vw - 2 * var(--edge) - var(--safe-left) - var(--safe-right));max-height:calc(100dvh - 180px)}.dock.collapsed{--collapsed-width:var(--panel-width)}.dock-sections{grid-template-columns:repeat(2,minmax(0,1fr))}.dock-section-wide{grid-column:1/-1}.map-stack-chip{padding:9px 7px}.glass-select{padding:9px 8px;font-size:16px}.style-btn{min-width:70px;padding:12px 10px 9px}}.cctv-frame-wrap{background:radial-gradient(circle at 20% 20%,#00f4ff17,#0000 44%),linear-gradient(#080e13e0,#04070bf5);border:1px solid #ffffff1f;border-radius:10px;flex-shrink:0;min-height:150px;position:relative;overflow:hidden}.cctv-frame-wrap:after{content:"";opacity:0;pointer-events:none;background:linear-gradient(100deg,#0000 24%,#00d4ff14 44%,#aaf4ff24 50%,#00d4ff14 56%,#0000 76%);transition:opacity .2s;position:absolute;inset:0;transform:translate(-100%)}.cctv-frame-wrap.loading:after{opacity:1;animation:1.4s linear infinite cctv-frame-shimmer}.cctv-frame-wrap.loading:not(.has-frame):before{content:"ACQUISITION DE L’IMAGE";font-family:var(--font-mono);letter-spacing:2.2px;color:#91edff9e;pointer-events:none;justify-content:center;align-items:center;font-size:8px;display:flex;position:absolute;inset:0}@keyframes cctv-frame-shimmer{to{transform:translate(100%)}}.cctv-frame{aspect-ratio:16/9;object-fit:contain;opacity:0;width:100%;height:auto;transition:opacity .18s;display:block}.cctv-frame.active{opacity:1}.cctv-source-badge{color:#9defff;font-family:var(--font-mono);letter-spacing:1.3px;background:#00d4ff17;border:1px solid #00d4ff52;border-radius:999px;align-self:flex-start;padding:4px 8px;font-size:8px}.cctv-source-badge[data-frame-state=loading]{color:#ffe59b;background:#ffcd5c1a;border-color:#ffcd5c73}.cctv-source-badge[data-frame-state=error]{color:#ffb0b0;background:#ff48481c;border-color:#ff666680}.cctv-meta{font-family:var(--font-mono);letter-spacing:1px;color:var(--text-secondary);font-size:9px}.cctv-controls{gap:8px;display:flex}.cctv-controls .glass-select{flex:1;padding:6px 8px}.cctv-summary-label{font-family:var(--font-mono);letter-spacing:1.7px;color:var(--text-dim);font-size:8px}.cctv-summary{min-height:38px;font-family:var(--font-mono);letter-spacing:.8px;color:#a8f7ff;text-shadow:0 0 10px #00d4ff2e;font-size:10px;line-height:1.45}@media (max-width:720px){.cctv-frame{height:120px}.cctv-frame-wrap{min-height:120px}}.stage{position:fixed;inset:0}.stage:before,.stage:after{content:"";z-index:1;pointer-events:none;background:linear-gradient(#0a0a0fc7,#0000);height:150px;position:absolute;inset:0 0 auto}.stage:after{background:linear-gradient(#0000,#0a0a0fb3);height:90px;inset:auto 0 0}.stage canvas{touch-action:none;outline:none;width:100%;height:100%;display:block}.overlay-root{pointer-events:none;position:absolute;inset:0;overflow:hidden}.overlay{position:absolute;inset:0}.overlay>*{will-change:transform;position:absolute;top:0;left:0}.place-label{font-family:var(--font-mono);letter-spacing:1.2px;text-transform:uppercase;white-space:nowrap;color:#e8f0f4db;text-shadow:0 0 3px #000000f2,0 0 8px #000000d9,0 1px 1px #000000e6;font-size:10px;font-weight:500;position:absolute;transform:translate(-50%,-50%)}.place-label[data-kind=town]{color:#e8f0f4f0;font-size:11px}.place-label[data-kind=city]{letter-spacing:2.2px;color:#dff9ff;text-shadow:0 0 3px #000000f2,0 0 8px #000000d9,0 0 16px #00d4ff59;font-size:13px;font-weight:600}.camera-marker{cursor:pointer;pointer-events:auto;background:0 0;border:0;place-items:center;width:44px;height:44px;margin:-22px 0 0 -22px;display:grid}.camera-marker-icon{opacity:.88;transition:transform var(--transition-fast)}.camera-marker.active{z-index:2}.camera-marker.active .camera-marker-icon{opacity:.95;transform:scale(1.25)}.camera-marker:hover .camera-marker-icon{transform:scale(1.15)}.camera-card{pointer-events:none;background:#040c10d1;border-radius:4px;width:104px;height:77px;margin-left:-52px;position:absolute;bottom:calc(50% + 22px);left:50%;overflow:hidden}.camera-card:before{content:"";background:#6be8fff2;border-radius:1px;height:2px;position:absolute;inset:0 0 auto}.camera-card img{object-fit:cover;width:96px;height:54px;position:absolute;top:4px;left:4px}.camera-card span{font:600 10px/13px var(--font-mono);color:#d2ecf4f2;white-space:nowrap;position:absolute;top:61px;left:4px}.camera-marker:has(.camera-card:not([hidden])):before{content:"";background:#6be8ff99;width:1px;height:12px;position:absolute;bottom:calc(50% + 10px);left:50%}.brand{top:calc(28px + var(--safe-top));left:calc(var(--edge) + var(--safe-left));z-index:100;-webkit-user-select:none;user-select:none;flex-direction:column;gap:5px;display:flex;position:fixed}.brand-name{font-family:var(--font-mono);letter-spacing:7px;text-transform:uppercase;color:var(--text-primary);text-shadow:0 0 24px var(--accent-glow);font-size:20px;font-weight:600}.brand-name em{color:var(--accent);font-style:normal}.brand-tagline{font-family:var(--font-mono);letter-spacing:2.4px;text-transform:uppercase;color:var(--text-secondary);font-size:9px}.brand-repo{font-family:var(--font-mono);letter-spacing:1.2px;color:var(--text-dim);transition:color var(--transition-fast);align-self:flex-start;align-items:center;gap:6px;margin-top:2px;font-size:9px;text-decoration:none;display:inline-flex}.brand-repo:hover,.brand-repo:focus-visible{color:var(--accent)}.brand-repo svg{fill:currentColor;width:12px;height:12px}.top-actions{top:calc(32px + var(--safe-top));z-index:100;gap:8px;display:flex;position:fixed;left:50%;transform:translate(-50%)}.top-actions button{background:var(--glass-bg);border:1px solid var(--glass-border);width:36px;height:36px;color:var(--text-secondary);-webkit-backdrop-filter:blur(16px);cursor:pointer;transition:all var(--transition-fast);border-radius:50%;outline:none;justify-content:center;align-items:center;display:flex}.top-actions button:hover,.top-actions button:focus-visible{border-color:var(--glass-border-hover);color:var(--text-primary);background:#ffffff0f;transform:scale(1.1)}.top-actions button:active{transform:scale(.95)}.top-actions button:disabled{cursor:wait;opacity:.55;transform:none}.top-actions svg{fill:none;stroke:currentColor;stroke-width:1.7px;stroke-linecap:round;stroke-linejoin:round;width:17px;height:17px}.indicator{top:calc(32px + var(--safe-top));right:calc(36px + var(--safe-right));z-index:100;pointer-events:none;-webkit-user-select:none;user-select:none;text-align:right;position:fixed}.indicator-label{font-family:var(--font-mono);letter-spacing:3px;color:var(--text-dim);text-transform:uppercase;font-size:10px;display:block}.indicator-value{font-family:var(--font-mono);letter-spacing:5px;color:var(--accent);text-shadow:0 0 20px var(--accent-glow);text-transform:uppercase;margin-top:4px;font-size:16px;font-weight:500;display:block}.chips{top:calc(84px + var(--safe-top));z-index:101;pointer-events:none;flex-direction:column;align-items:center;gap:6px;display:flex;position:fixed;left:50%;transform:translate(-50%)}.chip{-webkit-backdrop-filter:blur(14px);color:#aafcffeb;font-family:var(--font-mono);letter-spacing:1.35px;text-transform:uppercase;white-space:nowrap;background:#030a12c7;border:1px solid #00d4ff3d;border-radius:7px;align-items:center;gap:10px;padding:6px 10px;font-size:8px;animation:.22s both chip-in;display:inline-flex;box-shadow:0 8px 24px #00000057,0 0 14px #00d4ff14}button.chip{pointer-events:auto;cursor:pointer}.chip[data-tone=warning]{color:#ffe59b;border-color:#ffcd5c73}@keyframes chip-in{0%{opacity:0;transform:translateY(-4px)}}.status-line{left:calc(var(--edge) + var(--safe-left));right:calc(var(--edge) + var(--safe-right));bottom:calc(10px + var(--safe-bottom));z-index:90;font-family:var(--font-mono);letter-spacing:1.2px;text-transform:uppercase;color:var(--text-dim);pointer-events:none;text-shadow:0 0 4px #000000e6;justify-content:space-between;gap:16px;font-size:8px;display:flex;position:fixed}.status-line a{color:inherit;pointer-events:auto}.status-line span{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.manual-share{top:calc(84px + var(--safe-top));z-index:130;--panel-width:min(420px, calc(100vw - 2 * var(--edge)));position:fixed;left:50%;transform:translate(-50%)}.manual-share input{width:100%;font-family:var(--font-mono);background:#ffffff0f;border:1px solid #ffffff24;border-radius:7px;padding:8px 10px;font-size:12px}@media (max-width:720px){.brand{top:calc(16px + var(--safe-top));gap:3px}.brand-name{letter-spacing:5px;font-size:16px}.brand-tagline{letter-spacing:1.4px;max-width:46vw;font-size:7px}.top-actions{top:calc(16px + var(--safe-top));left:auto;right:calc(var(--edge) + var(--safe-right));transform:none}.top-actions button{width:40px;height:40px}.indicator{display:none}.chips{top:auto;bottom:calc(78px + var(--safe-bottom))}.status-line{bottom:calc(4px + var(--safe-bottom));letter-spacing:.8px;font-size:7px}.status-line .status-attribution{display:none}}.altimeter{top:calc(96px + var(--safe-top));right:calc(36px + var(--safe-right));z-index:100;pointer-events:none;-webkit-user-select:none;user-select:none;flex-direction:column;align-items:flex-end;display:flex;position:fixed}.altimeter-value{font-family:var(--font-mono);letter-spacing:3px;font-variant-numeric:tabular-nums;color:var(--text-primary);text-transform:uppercase;text-shadow:0 0 20px var(--accent-glow);margin-top:4px;font-size:16px;font-weight:500}.altimeter-ground{font-family:var(--font-mono);letter-spacing:1.6px;font-variant-numeric:tabular-nums;text-transform:uppercase;color:var(--text-secondary);margin-top:3px;font-size:8px}.controls{flex-direction:column;gap:2px;display:flex}.control-row{border-radius:8px;align-items:baseline;gap:10px;padding:5px 6px;display:flex}.control-row dt{flex:0 0 104px}.control-row kbd{font-family:var(--font-mono);letter-spacing:1px;text-transform:uppercase;white-space:nowrap;color:var(--accent);background:var(--accent-dim);border:1px solid #00d4ff66;border-radius:4px;padding:3px 8px;font-size:9px;display:inline-block}.control-row dd{color:#e8eaedc7;font-size:12px;line-height:1.4}.controls-note{font-family:var(--font-mono);letter-spacing:.5px;color:var(--text-dim);margin-top:4px;padding:0 6px;font-size:9px;line-height:1.5}@media (max-width:720px){.altimeter{top:auto;right:calc(var(--edge) + var(--safe-right));bottom:calc(4px + var(--safe-bottom));z-index:91;flex-direction:row;align-items:baseline;gap:6px}.altimeter .indicator-label{letter-spacing:.8px;font-size:7px}.altimeter-value{letter-spacing:.8px;text-shadow:0 0 4px #000000e6;margin:0;font-size:9px}.altimeter-ground{display:none}.status-line{right:46%}}.search-backdrop{z-index:120;padding:calc(84px + var(--safe-top)) var(--edge) calc(24px + var(--safe-bottom));background:#04060a73;justify-content:center;align-items:flex-start;display:flex;position:fixed;inset:0}.search{--panel-width:min(520px, 100%);max-height:100%}.search .panel-inner{padding:14px}.search-field{flex-shrink:0;position:relative}.search-field input{width:100%;font-family:var(--font-sans);color:var(--text-primary);transition:border-color var(--transition-fast);background:#ffffff0f;border:1px solid #ffffff24;border-radius:9px;outline:none;padding:11px 12px 11px 36px;font-size:16px}.search-field input:focus{border-color:var(--accent);box-shadow:0 0 14px #00d4ff24}.search-field input::placeholder{color:var(--text-dim)}.search-field svg{fill:none;width:16px;height:16px;stroke:var(--text-secondary);stroke-width:1.8px;stroke-linecap:round;margin-top:-8px;position:absolute;top:50%;left:11px}.search-status{font-family:var(--font-mono);letter-spacing:1px;text-transform:uppercase;color:var(--text-dim);padding:2px 4px;font-size:9px}.search-results{flex-direction:column;gap:2px;list-style:none;display:flex}.search-result{text-align:left;cursor:pointer;width:100%;transition:background var(--transition-fast), border-color var(--transition-fast);background:0 0;border:1px solid #0000;border-radius:8px;justify-content:space-between;align-items:baseline;gap:12px;padding:9px 10px;display:flex}.search-result:hover,.search-result:focus-visible,.search-result[aria-selected=true]{background:var(--accent-dim);border-color:#00d4ff66;outline:none}.search-result-name{letter-spacing:.3px;font-size:13px;font-weight:500}.search-result-meta{font-family:var(--font-mono);letter-spacing:.8px;text-transform:uppercase;color:var(--text-secondary);text-align:right;flex-shrink:0;font-size:9px}.about p,.about li{color:#e8eaedb8;font-size:12px;line-height:1.55}.about a{color:var(--accent);text-decoration:none}.about a:hover{text-decoration:underline}.about ul{padding-left:16px}.about-heading{font-family:var(--font-mono);letter-spacing:1.7px;text-transform:uppercase;color:var(--text-dim);margin-top:4px;font-size:8px}.about-figures{font-family:var(--font-mono);letter-spacing:.8px;color:#a8f7ff;font-size:10px;line-height:1.5}.splash,.notice{place-items:center;padding:24px;display:grid;position:fixed;inset:0;overflow-y:auto}.splash-text{font-family:var(--font-mono);letter-spacing:3px;text-transform:uppercase;color:var(--text-secondary);font-size:10px;animation:1.6s ease-in-out infinite pulse}@keyframes pulse{50%{opacity:.35}}.notice-card{--panel-width:min(560px, 100%);animation:none}.notice-card .panel-inner{gap:14px;padding:24px}.notice h1{letter-spacing:.2px;font-size:20px;font-weight:600;line-height:1.3}.notice p,.notice li{color:#e8eaedc7;font-size:14px;line-height:1.6}.notice ul{padding-left:18px}.notice-required{background:#00d4ff12;border:1px solid #00d4ff52;border-radius:10px;padding:12px 14px}.notice-required strong{color:var(--accent)}.notice-detected{font-family:var(--font-mono);letter-spacing:1px;text-transform:uppercase;color:var(--text-secondary);font-size:10px}
