Spaces:
Sleeping
Sleeping
| /* ============================================================================ | |
| DEPTH geospatial risk map — shared by V6 (10.08) and V7 (10.09) | |
| ============================================================================ */ | |
| @import url('https://fonts.googleapis.com/css2?family=Barlow+Condensed:wght@500;600;700&family=Space+Mono:ital,wght@0,400;0,700&display=swap'); | |
| /* -- Design tokens --------------------------------------------------------- */ | |
| :root { | |
| /* 4pt spacing scale */ | |
| --space-1: 4px; | |
| --space-2: 8px; | |
| --space-3: 12px; | |
| --space-4: 16px; | |
| --space-6: 24px; | |
| /* Light overlay surfaces — tinted toward brand navy (hue 265) | |
| Works against both dark-matter and positron map styles */ | |
| --c-surf: oklch(99% 0.003 265); | |
| --c-surf-hover: oklch(95% 0.005 265); | |
| --c-border: oklch(87% 0.005 265); | |
| --c-border-str: oklch(77% 0.007 265); | |
| /* Text on light surfaces */ | |
| --c-text: oklch(20% 0.010 265); | |
| --c-text-mid: oklch(43% 0.008 265); | |
| --c-text-dim: oklch(62% 0.007 265); | |
| /* Deep teal — accent for interactive & risk indicators */ | |
| --c-navy: #032425; | |
| --c-navy-dim: #0a4042; | |
| /* Rights Lab teal (darkened to pass WCAG AA on white) | |
| oklch(43% 0.12 218) ≈ #006B82 contrast on white: ~5.5:1 */ | |
| --c-teal: oklch(43% 0.12 218); | |
| --c-teal-pale: oklch(95% 0.03 218); | |
| /* Brand teal at full brightness — used only for decorative border-bottom */ | |
| --c-teal-brand: oklch(68% 0.12 218); | |
| /* Typography */ | |
| --font-label: 'DM Sans', system-ui, sans-serif; | |
| --font-body: 'Space Mono', system-ui, sans-serif; | |
| --font-mono: 'Space Mono', monospace; | |
| /* Radii — restrained */ | |
| --radius-sm: 3px; | |
| --radius-md: 6px; | |
| --radius-lg: 10px; | |
| } | |
| /* -- Page shell ------------------------------------------------------------ */ | |
| .bslib-page-fill { | |
| display: flex ; | |
| flex-direction: column ; | |
| height: 100dvh ; | |
| overflow: hidden ; | |
| } | |
| /* depth-shell: row container — map takes ~70 %, panel fills ~30 % */ | |
| .depth-shell { | |
| flex: 1; | |
| display: flex; | |
| flex-direction: row; | |
| overflow: hidden; | |
| min-height: 0; | |
| } | |
| /* Map area: all overlay controls are absolute inside here */ | |
| .depth-map { | |
| flex: 1; | |
| position: relative; | |
| min-width: 0; | |
| min-height: 0; | |
| overflow: hidden; | |
| background: oklch(18% 0.015 265); | |
| } | |
| .depth-map .htmlwidget, | |
| .depth-map .maplibregl-map { | |
| width: 100% ; | |
| height: 100% ; | |
| } | |
| /* -- Top bar: crime selector + grid controls ------------------------------- */ | |
| .map-overlay-top { | |
| position: absolute; | |
| top: var(--space-3); | |
| left: 50%; | |
| transform: translateX(-50%); | |
| z-index: 999; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| padding: var(--space-1) var(--space-3); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--space-2); | |
| white-space: nowrap; | |
| max-width: calc(100vw - 220px); | |
| box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.16); | |
| } | |
| .map-overlay-top .form-group { margin-bottom: 0 ; } | |
| .map-overlay-top select { | |
| background: var(--c-surf) ; | |
| color: var(--c-text) ; | |
| border: 1px solid var(--c-border-str) ; | |
| border-radius: var(--radius-md) ; | |
| font-size: 11px ; | |
| font-family: var(--font-label) ; | |
| font-weight: 700 ; | |
| letter-spacing: 0.06em ; | |
| text-transform: uppercase ; | |
| padding: 5px var(--space-2) ; | |
| cursor: pointer; | |
| outline: none; | |
| box-shadow: 0 2px 6px oklch(20% 0.01 265 / 0.12) ; | |
| } | |
| .map-overlay-top span { | |
| color: var(--c-text-mid); | |
| font-size: 11px; | |
| font-family: var(--font-label); | |
| font-weight: 700; | |
| letter-spacing: 0.10em; | |
| text-transform: uppercase; | |
| } | |
| .map-overlay-sep { | |
| width: 1px; | |
| height: 18px; | |
| background: var(--c-border); | |
| flex-shrink: 0; | |
| } | |
| /* -- Draw mode buttons (below draw toolbar, top-right) --------------------- */ | |
| .draw-extra-ctrl { | |
| position: absolute; | |
| top: 262px; | |
| right: 10px; | |
| left: auto; | |
| z-index: 999; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 2px; | |
| } | |
| .draw-extra-btn { | |
| width: 30px; | |
| height: 30px; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-sm); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| color: var(--c-text-mid); | |
| box-shadow: 0 1px 4px oklch(20% 0.01 265 / 0.12); | |
| transition: background 0.12s, color 0.12s; | |
| } | |
| .draw-extra-btn:hover { | |
| background: var(--c-surf-hover); | |
| color: var(--c-text); | |
| } | |
| .draw-extra-btn.active { | |
| background: var(--c-teal-pale) ; | |
| color: var(--c-teal) ; | |
| border-color: var(--c-teal); | |
| } | |
| /* -- Right column: grid + style + 3D (below draw-extra-ctrl) --------------- */ | |
| .btn-controls { | |
| position: absolute; | |
| top: 200px; | |
| right: 10px; | |
| left: auto; | |
| z-index: 999; | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--space-1); | |
| align-items: flex-end; | |
| width: 10px; | |
| } | |
| /* -- Style picker: icon button + dropdown ---------------------------------- */ | |
| .style-btn-wrap { | |
| position: relative; | |
| } | |
| .style-picker { | |
| position: absolute; | |
| right: 0; | |
| left: auto; | |
| top: calc(100% + var(--space-1)); | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| padding: var(--space-1); | |
| min-width: 152px; | |
| box-shadow: 0 4px 14px oklch(20% 0.01 265 / 0.18); | |
| z-index: 1001; | |
| } | |
| .style-option { | |
| display: block; | |
| width: 100%; | |
| padding: var(--space-1) var(--space-3); | |
| background: none; | |
| border: none; | |
| text-align: left; | |
| font-size: 10px; | |
| font-family: var(--font-label); | |
| font-weight: 600; | |
| letter-spacing: 0.05em; | |
| color: var(--c-text-dim); | |
| cursor: pointer; | |
| border-radius: var(--radius-sm); | |
| transition: background 0.1s, color 0.1s; | |
| } | |
| .style-option:hover { | |
| background: var(--c-surf-hover); | |
| color: var(--c-text); | |
| } | |
| .style-option.active { | |
| color: var(--c-navy); | |
| background: var(--c-teal-pale); | |
| } | |
| .btn-ctrl { | |
| background: var(--c-surf) ; | |
| color: var(--c-text) ; | |
| border: 1px solid var(--c-border) ; | |
| border-radius: var(--radius-md) ; | |
| font-size: 10px ; | |
| font-family: var(--font-label) ; | |
| font-weight: 700 ; | |
| letter-spacing: 0.10em ; | |
| text-transform: uppercase; | |
| padding: var(--space-2) var(--space-3) ; | |
| cursor: pointer ; | |
| box-shadow: 0 2px 6px oklch(20% 0.01 265 / 0.14) ; | |
| transition: background 0.12s, border-color 0.12s ; | |
| display: inline-flex ; | |
| align-items: center ; | |
| gap: var(--space-1) ; | |
| } | |
| .btn-ctrl:hover { | |
| background: var(--c-surf-hover) ; | |
| border-color: var(--c-border-str) ; | |
| } | |
| /* -- Layer control panel (bottom-left) ------------------------------------- */ | |
| .layer-ctrl-panel { | |
| position: absolute; | |
| bottom: var(--space-3); | |
| left: 11px; | |
| z-index: 999; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-lg); | |
| overflow: hidden; | |
| box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.16); | |
| min-width: 198px; | |
| max-width: 228px; | |
| font-family: var(--font-body); | |
| } | |
| .layer-ctrl-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: var(--space-2) var(--space-3); | |
| cursor: pointer; | |
| color: var(--c-text); | |
| font-size: 10px; | |
| font-family: var(--font-label); | |
| font-weight: 700; | |
| letter-spacing: 0.10em; | |
| text-transform: uppercase; | |
| user-select: none; | |
| transition: background 0.1s; | |
| } | |
| .layer-ctrl-header:hover { background: var(--c-surf-hover); } | |
| .layer-ctrl-icon { | |
| font-size: 10px; | |
| color: var(--c-text-dim); | |
| } | |
| .layer-ctrl-body { | |
| max-height: 300px; | |
| overflow-y: auto; | |
| overflow-x: hidden; | |
| padding: var(--space-1) var(--space-3) var(--space-2); | |
| border-top: 1px solid var(--c-border); | |
| } | |
| .layer-ctrl-body::-webkit-scrollbar { width: 4px; } | |
| .layer-ctrl-body::-webkit-scrollbar-thumb { | |
| border-radius: 2px; | |
| background-color: var(--c-border-str); | |
| } | |
| .layer-ctrl-body::-webkit-scrollbar-track { background: transparent; } | |
| .layer-ctrl-body .form-check { | |
| padding: 3px 0 3px 20px; | |
| margin: 0; | |
| } | |
| .layer-ctrl-body .form-check-input { | |
| margin-left: -16px; | |
| cursor: pointer; | |
| accent-color: var(--c-navy); | |
| } | |
| .layer-ctrl-body .form-check-label { | |
| color: var(--c-text-dim); | |
| font-size: 11px; | |
| font-family: var(--font-body); | |
| cursor: pointer; | |
| transition: color 0.1s; | |
| } | |
| .layer-ctrl-body .form-check-input:checked ~ .form-check-label { | |
| color: var(--c-text); | |
| } | |
| .layer-ctrl-body .shiny-input-container { margin: 0 ; } | |
| .layer-ctrl-body > .shiny-input-container > .form-group { margin: 0 ; } | |
| /* -- Analysis panel — right column, 30 % of layout ----------------------- */ | |
| .depth-panel { | |
| width: 360px; | |
| flex-shrink: 0; | |
| background: var(--c-surf); | |
| border-left: 1px solid var(--c-teal-pale); | |
| display: flex; | |
| flex-direction: column; | |
| overflow: hidden; | |
| font-family: var(--font-body); | |
| color: var(--c-text); | |
| } | |
| /* All-light header: brand teal appears only as a 2px bottom border */ | |
| .dp-header { | |
| background: var(--c-surf); | |
| color: var(--c-text); | |
| padding: var(--space-3) var(--space-4); | |
| flex-shrink: 0; | |
| display: flex; | |
| flex-direction: column; | |
| gap: 4px; | |
| border-bottom: 1px solid var(--c-teal-pale); | |
| } | |
| .dp-title { | |
| font-family: var(--font-label); | |
| font-size: 24px; | |
| font-weight: 800; | |
| letter-spacing: 0.06em; | |
| text-transform: uppercase; | |
| margin: 0 0 3px; | |
| color: var(--c-navy); | |
| } | |
| .dp-sub { | |
| font-size: 11px; | |
| color: var(--c-text-mid); | |
| margin: 0; | |
| line-height: 1.45; | |
| } | |
| /* -- Scrollable body — sections divided by lines, not nested cards --------- */ | |
| .dp-scroll { | |
| flex: 1; | |
| overflow-y: auto; | |
| padding: 0 var(--space-4); | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .dp-scroll::-webkit-scrollbar { width: 4px; } | |
| .dp-scroll::-webkit-scrollbar-thumb { | |
| border-radius: 2px; | |
| background-color: var(--c-border-str); | |
| } | |
| .dp-scroll::-webkit-scrollbar-track { background: transparent; } | |
| .dp-card { | |
| padding: var(--space-3) 0; | |
| flex-shrink: 0; | |
| } | |
| .dp-card + .dp-card { | |
| border-top: 1px solid var(--c-border); | |
| } | |
| .dp-label { | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: 0.14em; | |
| text-transform: uppercase; | |
| color: var(--c-text-dim); | |
| margin: 0 0 var(--space-3); | |
| } | |
| /* -- Big stats grid -------------------------------------------------------- */ | |
| .stat-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr; | |
| gap: var(--space-3) var(--space-6); | |
| margin-bottom: var(--space-3); | |
| } | |
| .stat-val { | |
| font-family: var(--font-mono); | |
| font-size: 28px; | |
| font-weight: 700; | |
| line-height: 1; | |
| margin-bottom: 3px; | |
| letter-spacing: -0.02em; | |
| } | |
| .stat-lbl { | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: 0.12em; | |
| text-transform: uppercase; | |
| color: var(--c-text-dim); | |
| } | |
| .stat-sub { | |
| font-size: 10px; | |
| color: var(--c-text-mid); | |
| margin-top: 3px; | |
| line-height: 1.3; | |
| min-height: 13px; | |
| } | |
| /* -- Mini stats grid ------------------------------------------------------- */ | |
| .mini-grid { | |
| display: grid; | |
| grid-template-columns: 1fr 1fr 1fr; | |
| gap: var(--space-2) var(--space-3); | |
| padding-top: var(--space-3); | |
| border-top: 1px solid var(--c-border); | |
| } | |
| .mini-val { | |
| font-family: var(--font-mono); | |
| font-size: 16px; | |
| font-weight: 700; | |
| line-height: 1; | |
| margin-bottom: 1px; | |
| } | |
| .mini-lbl { | |
| font-family: var(--font-label); | |
| font-size: 8px; | |
| font-weight: 700; | |
| letter-spacing: 0.10em; | |
| text-transform: uppercase; | |
| color: var(--c-text-dim); | |
| } | |
| /* -- Municipality rank list ------------------------------------------------ */ | |
| .rank-list { | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| .rank-item { | |
| display: flex; | |
| align-items: flex-start; | |
| gap: var(--space-2); | |
| padding: var(--space-2) 0; | |
| } | |
| .rank-item + .rank-item { | |
| border-top: 1px solid var(--c-border); | |
| } | |
| .rank-num { | |
| font-family: var(--font-label); | |
| font-size: 10px; | |
| font-weight: 700; | |
| color: var(--c-text-dim); | |
| min-width: 18px; | |
| padding-top: 3px; | |
| text-align: right; | |
| } | |
| .rank-body { | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .rank-name { | |
| font-size: 12px; | |
| font-weight: 600; | |
| color: var(--c-text); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .rank-meta { | |
| font-size: 10px; | |
| color: var(--c-text-dim); | |
| margin: 1px 0 var(--space-1); | |
| } | |
| .rank-track { | |
| height: 2px; | |
| background: var(--c-border); | |
| border-radius: 1px; | |
| overflow: hidden; | |
| } | |
| .rank-fill { | |
| height: 100%; | |
| border-radius: 1px; | |
| transition: width 0.35s cubic-bezier(0.16, 1, 0.3, 1); | |
| } | |
| .rank-rate { | |
| font-family: var(--font-mono); | |
| font-size: 11px; | |
| font-weight: 700; | |
| color: var(--c-text-mid); | |
| padding-top: 2px; | |
| white-space: nowrap; | |
| } | |
| /* -- States ---------------------------------------------------------------- */ | |
| .dp-empty { | |
| padding: var(--space-6) var(--space-2); | |
| color: var(--c-text-dim); | |
| font-size: 12px; | |
| text-align: center; | |
| line-height: 1.6; | |
| } | |
| .dp-more { | |
| font-family: var(--font-label); | |
| font-size: 10px; | |
| letter-spacing: 0.04em; | |
| color: var(--c-text-dim); | |
| text-align: center; | |
| padding: var(--space-1) 0 var(--space-2); | |
| } | |
| /* -- Analysis panel: selection badge --------------------------------------- */ | |
| .dp-selection-badge { | |
| display: inline-flex; | |
| align-items: center; | |
| gap: 4px; | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 600; | |
| letter-spacing: 0.06em; | |
| color: var(--c-teal); | |
| background: var(--c-teal-pale); | |
| border-radius: 10px; | |
| padding: 2px 8px; | |
| margin-top: var(--space-1); | |
| } | |
| /* -- Analysis panel collapsible section headers ---------------------------- */ | |
| .dp-group { | |
| border-bottom: 1px solid var(--c-border); | |
| margin-bottom: var(--space-1); | |
| } | |
| .dp-group-hdr { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| cursor: pointer; | |
| padding: var(--space-2) var(--space-1); | |
| user-select: none; | |
| border-radius: var(--radius-sm); | |
| } | |
| .dp-group-hdr:hover { background: var(--c-surf-hover); } | |
| .dp-group-label { | |
| font-family: var(--font-label); | |
| font-size: 10px; | |
| font-weight: 700; | |
| letter-spacing: 0.14em; | |
| text-transform: uppercase; | |
| color: var(--c-text); | |
| } | |
| .dp-group-icon { | |
| font-size: 7px; | |
| color: var(--c-text-dim); | |
| flex-shrink: 0; | |
| } | |
| .dp-group-body { | |
| padding: var(--space-1) 0 var(--space-2) 0; | |
| } | |
| /* -- Indicator cards inside panel groups ----------------------------------- */ | |
| .ind-card { | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| margin-bottom: var(--space-2); | |
| overflow: hidden; | |
| background: oklch(99.5% 0.001 265); | |
| } | |
| .ind-card-hdr { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 5px 10px; | |
| background: var(--c-surf-hover); | |
| border-bottom: 1px solid var(--c-border); | |
| } | |
| .ind-card-title { | |
| font-family: var(--font-label); | |
| font-size: 8px; | |
| font-weight: 700; | |
| letter-spacing: 0.12em; | |
| text-transform: uppercase; | |
| color: var(--c-text-mid); | |
| } | |
| .ind-card-body { | |
| padding: var(--space-2) 10px; | |
| } | |
| .ind-card-body .stat-grid { | |
| margin-bottom: 0; | |
| } | |
| .ind-card-chart { | |
| border-top: 1px solid var(--c-border); | |
| padding: var(--space-1) 10px var(--space-2); | |
| } | |
| .ind-card-note { | |
| font-size: 8px; | |
| color: var(--c-text-dim); | |
| font-style: italic; | |
| padding: 0 10px 4px; | |
| } | |
| /* -- Horizontal stat row (label left, value right) ------------------------- */ | |
| .dp-stat { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| padding: 4px 0; | |
| border-bottom: 1px solid var(--c-border); | |
| } | |
| .dp-stat:last-child { border-bottom: none; } | |
| .dp-stat-lbl { | |
| font-family: var(--font-label); | |
| font-size: 10px; | |
| color: var(--c-text-mid); | |
| flex: 1; | |
| padding-right: var(--space-2); | |
| } | |
| .dp-stat-val { | |
| font-family: var(--font-mono); | |
| font-size: 12px; | |
| font-weight: 700; | |
| flex-shrink: 0; | |
| } | |
| /* -- Clear button (light header context) ----------------------------------- */ | |
| .btn-clear { | |
| background: transparent ; | |
| color: var(--c-text-mid) ; | |
| border: 1px solid var(--c-border-str) ; | |
| border-radius: var(--radius-sm) ; | |
| font-size: 9px ; | |
| font-family: var(--font-label) ; | |
| font-weight: 700 ; | |
| letter-spacing: 0.08em ; | |
| text-transform: uppercase ; | |
| padding: 3px var(--space-2) ; | |
| flex-shrink: 0 ; | |
| white-space: nowrap ; | |
| transition: background 0.1s, color 0.1s ; | |
| } | |
| .btn-clear:hover { | |
| background: var(--c-surf-hover) ; | |
| color: var(--c-text) ; | |
| } | |
| /* -- Footer: download button — navy accent --------------------------------- */ | |
| .dp-footer { | |
| padding: var(--space-2) var(--space-4) var(--space-3); | |
| flex-shrink: 0; | |
| border-top: 1px solid var(--c-border); | |
| } | |
| .dp-footer .btn { | |
| width: 100%; | |
| padding: var(--space-2) 0; | |
| background: var(--c-navy) ; | |
| color: oklch(97% 0.003 265) ; | |
| border: none; | |
| border-radius: var(--radius-md); | |
| font-size: 11px; | |
| font-family: var(--font-label); | |
| font-weight: 700; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| transition: background 0.15s; | |
| } | |
| .dp-footer .btn:hover { | |
| background: var(--c-navy-dim) ; | |
| } | |
| /* -- Equal-width icon buttons (29px matches MapLibre native controls) ------- */ | |
| .btn-ctrl-sq { | |
| width: 29px ; | |
| min-width: 29px ; | |
| height: 29px ; | |
| padding: 0 ; | |
| justify-content: center ; | |
| } | |
| .btn-ctrl-sq.active { | |
| background: var(--c-teal-pale) ; | |
| color: var(--c-teal) ; | |
| border-color: var(--c-teal) ; | |
| } | |
| /* -- Expanded layer panel for accordion ------------------------------------ */ | |
| .layer-ctrl-panel { | |
| max-width: 280px ; | |
| min-width: 240px ; | |
| } | |
| .layer-ctrl-body { | |
| max-height: 480px ; | |
| padding: 0 0 var(--space-1) ; | |
| } | |
| /* -- Accordion groups ------------------------------------------------------ */ | |
| .acc-group + .acc-group { | |
| border-top: 1px solid var(--c-border); | |
| } | |
| .acc-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 5px var(--space-3); | |
| cursor: pointer; | |
| user-select: none; | |
| transition: background 0.1s; | |
| } | |
| .acc-header:hover { | |
| background: var(--c-surf-hover); | |
| } | |
| .acc-label { | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: 0.12em; | |
| text-transform: uppercase; | |
| color: var(--c-text-mid); | |
| } | |
| .acc-icon { | |
| font-size: 7px; | |
| color: var(--c-text-dim); | |
| } | |
| .acc-body { | |
| padding-bottom: 4px; | |
| } | |
| .acc-item-wrap { | |
| border-bottom: 1px solid transparent; | |
| } | |
| .acc-item { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 4px var(--space-3); | |
| gap: var(--space-1); | |
| } | |
| /* -- iOS-style toggle switch ------------------------------------------------ */ | |
| .acc-toggle-label { | |
| display: flex; | |
| align-items: center; | |
| gap: 6px; | |
| cursor: pointer; | |
| flex: 1; | |
| min-width: 0; | |
| } | |
| .acc-toggle-input { | |
| position: absolute; | |
| opacity: 0; | |
| width: 0; | |
| height: 0; | |
| pointer-events: none; | |
| } | |
| .acc-toggle-track { | |
| display: inline-flex; | |
| align-items: center; | |
| width: 28px; | |
| height: 15px; | |
| background: var(--c-border-str); | |
| border-radius: 8px; | |
| position: relative; | |
| flex-shrink: 0; | |
| transition: background 0.2s; | |
| } | |
| .acc-toggle-thumb { | |
| position: absolute; | |
| left: 2px; | |
| width: 11px; | |
| height: 11px; | |
| background: white; | |
| border-radius: 50%; | |
| box-shadow: 0 1px 3px rgba(0,0,0,0.25); | |
| transition: left 0.2s; | |
| } | |
| .acc-toggle-label:has(.acc-toggle-input:checked) .acc-toggle-track { | |
| background: var(--c-navy); | |
| } | |
| .acc-toggle-label:has(.acc-toggle-input:checked) .acc-toggle-thumb { | |
| left: 15px; | |
| } | |
| .acc-toggle-text { | |
| font-size: 11px; | |
| color: var(--c-text-dim); | |
| font-family: var(--font-body); | |
| transition: color 0.1s; | |
| line-height: 1.35; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |
| .acc-toggle-label:has(.acc-toggle-input:checked) .acc-toggle-text { | |
| color: var(--c-text); | |
| } | |
| .acc-info-wrap { | |
| flex-shrink: 0; | |
| cursor: help; | |
| display: inline-flex; | |
| align-items: center; | |
| opacity: 0.55; | |
| transition: opacity 0.1s; | |
| } | |
| .acc-info-wrap:hover { opacity: 1; } | |
| /* -- Layer legends ---------------------------------------------------------- */ | |
| .acc-legend { | |
| display: none; | |
| padding: 2px var(--space-3) 6px calc(var(--space-3) + 34px); | |
| } | |
| /* Legend visibility driven by JS class toggle (preserves correct display type per shape) */ | |
| .acc-legend.legend-visible { display: block; } | |
| .acc-legend-dot.legend-visible { display: flex; } | |
| .acc-legend-line-wrap.legend-visible { display: flex; } | |
| .acc-legend-cats.legend-visible { display: flex; } | |
| .acc-legend-ramp .acc-legend-bar { | |
| height: 8px; | |
| border-radius: 3px; | |
| margin-bottom: 3px; | |
| } | |
| .acc-legend-labels { | |
| display: flex; | |
| justify-content: space-between; | |
| font-size: 9px; | |
| color: var(--c-text-dim); | |
| font-family: var(--font-label); | |
| } | |
| .acc-legend-bound { | |
| font-size: 7px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.06em; | |
| color: var(--c-text-dim); | |
| opacity: 0.7; | |
| margin-right: 2px; | |
| } | |
| .acc-legend-bound.bound-max { | |
| margin-right: 0; | |
| margin-left: 2px; | |
| } | |
| .acc-legend-cats { | |
| flex-direction: column; | |
| gap: 2px; | |
| } | |
| .acc-legend-cat { | |
| display: flex; | |
| align-items: center; | |
| gap: 5px; | |
| font-size: 9px; | |
| color: var(--c-text-dim); | |
| font-family: var(--font-label); | |
| } | |
| .acc-legend-swatch { | |
| width: 9px; | |
| height: 9px; | |
| border-radius: 2px; | |
| flex-shrink: 0; | |
| border: 1px solid rgba(0,0,0,0.08); | |
| } | |
| .acc-legend-dot { | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .acc-legend-circle { | |
| width: 9px; | |
| height: 9px; | |
| border-radius: 50%; | |
| flex-shrink: 0; | |
| border: 1px solid rgba(0,0,0,0.15); | |
| } | |
| .acc-legend-dot-lbl { | |
| font-size: 9px; | |
| color: var(--c-text-dim); | |
| font-family: var(--font-label); | |
| } | |
| .acc-legend-line-wrap { | |
| align-items: center; | |
| gap: 6px; | |
| } | |
| .acc-legend-line-seg { | |
| display: inline-block; | |
| width: 24px; | |
| flex-shrink: 0; | |
| } | |
| .acc-legend-line-lbl { | |
| font-size: 9px; | |
| color: var(--c-text-dim); | |
| font-family: var(--font-label); | |
| } | |
| /* Crime sub-type radio chips */ | |
| .acc-radios { | |
| display: flex; | |
| flex-wrap: wrap; | |
| gap: 3px; | |
| padding: 2px var(--space-3) 5px calc(var(--space-3) + 34px); | |
| } | |
| .acc-radio { | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 600; | |
| letter-spacing: 0.04em; | |
| color: var(--c-text-dim); | |
| background: var(--c-border); | |
| border: none; | |
| border-radius: 2px; | |
| padding: 2px 5px; | |
| cursor: pointer; | |
| transition: background 0.1s, color 0.1s; | |
| line-height: 1.4; | |
| } | |
| .acc-radio:hover { | |
| background: var(--c-border-str); | |
| color: var(--c-text); | |
| } | |
| .acc-radio.active { | |
| background: var(--c-navy); | |
| color: #fff; | |
| } | |
| /* Static ENVIPE sub-labels */ | |
| .acc-subs { | |
| padding: 0 var(--space-3) 3px calc(var(--space-3) + 17px); | |
| } | |
| .acc-sub { | |
| font-size: 9px; | |
| color: var(--c-text-dim); | |
| font-family: var(--font-body); | |
| line-height: 1.7; | |
| } | |
| /* Disabled / coming-soon items */ | |
| .acc-disabled { | |
| opacity: 0.45; | |
| pointer-events: none; | |
| } | |
| .acc-coming-tag { | |
| font-family: var(--font-label); | |
| font-size: 8px; | |
| font-weight: 700; | |
| letter-spacing: 0.06em; | |
| color: var(--c-teal); | |
| background: var(--c-teal-pale); | |
| border-radius: 2px; | |
| padding: 1px 4px; | |
| flex-shrink: 0; | |
| } | |
| /* -- Grid toggle panel (expands horizontally to the left of the button) ---- */ | |
| .grid-btn-wrap { | |
| position: relative; | |
| display: flex; | |
| flex-direction: row; | |
| align-items: center; | |
| gap: 3px; | |
| } | |
| .grid-panel { | |
| position: absolute; | |
| right: calc(100% + 4px); /* opens to the left of the btn-wrap */ | |
| left: auto; | |
| top: 0; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| padding: 3px; | |
| display: flex; | |
| flex-direction: row; | |
| gap: 2px; | |
| box-shadow: 0 4px 12px oklch(20% 0.01 265 / 0.18); | |
| z-index: 1001; | |
| white-space: nowrap; | |
| /* animate open/close via JS .open class */ | |
| opacity: 0; | |
| transform: scaleX(0.85); | |
| transform-origin: right center; | |
| transition: opacity 0.15s ease, transform 0.15s ease; | |
| pointer-events: none; | |
| } | |
| .grid-panel.open { | |
| opacity: 1; | |
| transform: scaleX(1); | |
| pointer-events: auto; | |
| } | |
| .grid-nivel-btn { | |
| width: 29px; | |
| height: 23px; | |
| background: none; | |
| border: none; | |
| border-radius: var(--radius-sm); | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: 0.06em; | |
| color: var(--c-text-dim); | |
| cursor: pointer; | |
| transition: background 0.1s, color 0.1s; | |
| position: relative; | |
| } | |
| .grid-nivel-btn:not(.soon):hover { | |
| background: var(--c-surf-hover); | |
| color: var(--c-text); | |
| } | |
| .grid-nivel-btn.active { | |
| background: var(--c-navy); | |
| color: #fff; | |
| } | |
| /* N7/N8 coming-soon buttons */ | |
| .grid-nivel-btn.soon { | |
| opacity: 0.4; | |
| pointer-events: none; | |
| } | |
| .grid-nivel-btn.soon::after { | |
| content: 'soon'; | |
| position: absolute; | |
| top: -5px; | |
| right: -3px; | |
| font-size: 6px; | |
| font-weight: 700; | |
| letter-spacing: 0; | |
| color: var(--c-teal); | |
| background: var(--c-teal-pale); | |
| border-radius: 2px; | |
| padding: 1px 2px; | |
| line-height: 1; | |
| } | |
| /* -- JS-positioned tooltip -------------------------------------------------- */ | |
| .depth-tooltip { | |
| position: fixed; | |
| background: var(--c-navy); | |
| color: #fff; | |
| font-size: 10px; | |
| font-family: var(--font-body); | |
| line-height: 1.45; | |
| padding: 6px 9px; | |
| border-radius: var(--radius-md); | |
| max-width: 210px; | |
| z-index: 99999; | |
| pointer-events: none; | |
| transform: translateY(-50%); | |
| box-shadow: 0 4px 12px rgba(0,0,0,0.3); | |
| word-break: break-word; | |
| display: none; | |
| } | |
| /* -- Hide MapLibre Draw buttons not needed for area selection --------------- */ | |
| /* mapbox-gl-draw_polygon IS the freehand/lasso — keep it visible */ | |
| /* trash is replaced by our own btn_delete in draw-extra-ctrl */ | |
| button.mapbox-gl-draw_line_string, | |
| button.mapbox-gl-draw_point, | |
| button.mapbox-gl-draw_trash, | |
| button.mapbox-gl-draw_combine, | |
| button.mapbox-gl-draw_uncombine { display: none ; } | |
| /* (draw-extra-ctrl position now set in the overrides section below) */ | |
| /* -- Viewport info bar (top-center of map) ---------------------------------- */ | |
| .viewport-bar { | |
| position: absolute; | |
| top: var(--space-3); | |
| bottom: auto; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| z-index: 999; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| padding: 4px var(--space-3); | |
| display: flex; | |
| align-items: center; | |
| gap: var(--space-2); | |
| white-space: nowrap; | |
| box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.14); | |
| pointer-events: none; | |
| } | |
| .vp-item { | |
| display: flex; | |
| align-items: baseline; | |
| gap: 4px; | |
| } | |
| .vp-key { | |
| font-family: var(--font-label); | |
| font-size: 8px; | |
| font-weight: 700; | |
| letter-spacing: 0.10em; | |
| text-transform: uppercase; | |
| color: var(--c-text-dim); | |
| } | |
| .vp-val { | |
| font-family: var(--font-label); | |
| font-size: 10px; | |
| font-weight: 700; | |
| color: var(--c-text); | |
| min-width: 38px; | |
| text-align: right; | |
| } | |
| .vp-sep { | |
| width: 1px; | |
| height: 14px; | |
| background: var(--c-border); | |
| flex-shrink: 0; | |
| } | |
| /* -- Position overrides: draw-extra-ctrl below draw toolbar with safe gap ---- */ | |
| /* draw ctrl-group: starts at 10px, 3 visible buttons + padding ~126px bottom */ | |
| .draw-extra-ctrl { top: 136px; right: 10px; left: auto; } | |
| /* btn-controls: below draw-extra-ctrl (3 btns x 30px + 2 gaps x 2px = 94px) */ | |
| /* 136 + 94 + 6px gap = 236 -> start at 236px */ | |
| .btn-controls { top: 236px ; right: 10px ; width: auto ; } | |
| /* State picker: opens left of draw-extra-ctrl, aligned to its top */ | |
| .state-picker-panel { top: 136px ; right: 48px ; } | |
| /* -- Reposition draw measurement display from bottom-left to top-left ------- */ | |
| .maplibregl-ctrl-bottom-left { | |
| top: 46px; | |
| bottom: auto; | |
| } | |
| /* -- State filter picker panel ---------------------------------------------- */ | |
| .state-picker-panel { | |
| position: absolute; | |
| top: 10px; | |
| right: 48px; | |
| z-index: 1000; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| padding: var(--space-2) var(--space-3); | |
| box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.14); | |
| min-width: 200px; | |
| display: flex; | |
| flex-direction: column; | |
| gap: var(--space-2); | |
| } | |
| .state-picker-header { | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| font-family: var(--font-label); | |
| font-size: 9px; | |
| font-weight: 700; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| color: var(--c-text-dim); | |
| } | |
| .state-picker-close { | |
| background: none; | |
| border: none; | |
| cursor: pointer; | |
| color: var(--c-text-dim); | |
| font-size: 14px; | |
| line-height: 1; | |
| padding: 0; | |
| } | |
| .state-picker-panel .selectize-control, | |
| .state-picker-panel select { | |
| font-size: 11px; | |
| width: 100%; | |
| } | |
| .state-picker-actions { | |
| display: flex; | |
| gap: var(--space-1); | |
| } | |
| /* -- Temporal analysis card (migrants, bottom-center of map) ---------------- */ | |
| .temporal-card { | |
| position: absolute; | |
| bottom: var(--space-3); | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 270px; | |
| display: none; | |
| background: var(--c-surf); | |
| border: 1px solid var(--c-border); | |
| border-radius: var(--radius-md); | |
| padding: 5px 10px 4px; | |
| z-index: 100; | |
| box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.14); | |
| } | |
| .temporal-card-header { | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| font-size: 8px; | |
| font-family: var(--font-label); | |
| font-weight: 700; | |
| letter-spacing: 0.08em; | |
| text-transform: uppercase; | |
| color: var(--c-text-dim); | |
| margin-bottom: 1px; | |
| } | |