edgarodriguez commited on
Commit
c1cd0a9
·
verified ·
1 Parent(s): 6b6c507

Upload 3 files

Browse files
Files changed (3) hide show
  1. Dockerfile +4 -4
  2. depth_interactive_map_alpha.R +0 -0
  3. styles.css +2148 -0
Dockerfile CHANGED
@@ -10,12 +10,12 @@ FROM rocker/geospatial:4.4
10
  ARG DDB_URL=https://huggingface.co/datasets/edgarodriguez/depth_alpha/resolve/main/depth_mexico.duckdb
11
 
12
  RUN install2.r --error --skipinstalled --ncpus 4 \
13
- shiny bslib DBI duckdb dplyr jsonlite htmltools glue writexl ggplot2 stringr \
14
  && R -e "install.packages('mapgl', repos = c('https://walkerke.r-universe.dev', 'https://cloud.r-project.org'))" \
15
- && R -e "library(mapgl); library(duckdb); library(sf); library(shiny)"
16
 
17
  WORKDIR /app
18
- COPY 10.11_draw_query_indicators_v10_HF.R helpers.R 10.08_styles.css ./
19
 
20
  # Bake the DuckDB into the image (build-time download).
21
  RUN curl -fL "${DDB_URL}" -o /app/depth_mexico.duckdb \
@@ -29,4 +29,4 @@ ENV DEPTH_DDB_PATH=/app/depth_mexico.duckdb \
29
  PORT=7860
30
 
31
  EXPOSE 7860
32
- CMD ["Rscript", "10.11_draw_query_indicators_v10_HF.R"]
 
10
  ARG DDB_URL=https://huggingface.co/datasets/edgarodriguez/depth_alpha/resolve/main/depth_mexico.duckdb
11
 
12
  RUN install2.r --error --skipinstalled --ncpus 4 \
13
+ shiny bslib DBI duckdb dplyr jsonlite htmltools glue writexl ggplot2 stringr httr2 \
14
  && R -e "install.packages('mapgl', repos = c('https://walkerke.r-universe.dev', 'https://cloud.r-project.org'))" \
15
+ && R -e "library(mapgl); library(duckdb); library(sf); library(shiny); library(httr2)"
16
 
17
  WORKDIR /app
18
+ COPY depth_interactive_map_alpha.R helpers.R styles.css ./
19
 
20
  # Bake the DuckDB into the image (build-time download).
21
  RUN curl -fL "${DDB_URL}" -o /app/depth_mexico.duckdb \
 
29
  PORT=7860
30
 
31
  EXPOSE 7860
32
+ CMD ["Rscript", "depth_interactive_map_alpha.R"]
depth_interactive_map_alpha.R ADDED
The diff for this file is too large to render. See raw diff
 
styles.css ADDED
@@ -0,0 +1,2148 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* ============================================================================
2
+ DEPTH geospatial risk map -- Spatial UI light-mode stylesheet.
3
+ Renamed from 10.08_styles.css on 2026-05-20.
4
+ ============================================================================ */
5
+
6
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@500;600&display=swap');
7
+
8
+ /* -- Design tokens --------------------------------------------------------- */
9
+ :root {
10
+ /* 4pt spacing scale */
11
+ --space-1: 4px;
12
+ --space-2: 8px;
13
+ --space-3: 12px;
14
+ --space-4: 16px;
15
+ --space-5: 20px;
16
+ --space-6: 24px;
17
+ --space-8: 32px;
18
+
19
+ /* Surface layers — translucent glass on a near-white field (Spatial UI) */
20
+ --c-canvas: oklch(98.5% 0.003 250);
21
+ --c-glass-1: oklch(100% 0 0 / 0.72);
22
+ --c-glass-2: oklch(100% 0 0 / 0.85);
23
+ --c-glass-hover: oklch(96% 0.004 250 / 0.92);
24
+ --c-glass-stroke: oklch(82% 0.006 250 / 0.6);
25
+ --c-glass-stroke-strong: oklch(72% 0.008 250 / 0.75);
26
+
27
+ /* Back-compat aliases for legacy class names still in use */
28
+ --c-surf: var(--c-glass-1);
29
+ --c-surf-hover: var(--c-glass-hover);
30
+ --c-border: var(--c-glass-stroke);
31
+ --c-border-str: var(--c-glass-stroke-strong);
32
+
33
+ /* Text — all AA on white and on glass-1 */
34
+ --c-text: oklch(18% 0.012 250); /* ~13.5:1 on white */
35
+ --c-text-mid: oklch(38% 0.010 250); /* ~7.4:1 */
36
+ --c-text-dim: oklch(50% 0.008 250); /* ~4.7:1 */
37
+
38
+ /* Deep teal / navy — kept for back-compat with existing classes */
39
+ --c-navy: #032425;
40
+ --c-navy-dim: #0a4042;
41
+
42
+ /* Rights Lab teal — primary accent (5.5:1 on white) */
43
+ --c-teal: oklch(43% 0.12 218);
44
+ --c-teal-pale: oklch(96% 0.025 218);
45
+ --c-teal-brand: oklch(68% 0.12 218);
46
+
47
+ --c-accent: var(--c-teal);
48
+ --c-accent-soft: var(--c-teal-pale);
49
+ --c-accent-ink: oklch(28% 0.10 218);
50
+
51
+ --c-focus: oklch(58% 0.18 240);
52
+
53
+ /* Depth / shadow scale — Spatial layered, restrained */
54
+ --depth-1: 0 1px 2px oklch(20% 0.01 250 / 0.06),
55
+ 0 1px 1px oklch(20% 0.01 250 / 0.04);
56
+ --depth-2: 0 4px 12px oklch(20% 0.01 250 / 0.08),
57
+ 0 1px 2px oklch(20% 0.01 250 / 0.05);
58
+ --depth-3: 0 12px 32px oklch(20% 0.01 250 / 0.12),
59
+ 0 2px 6px oklch(20% 0.01 250 / 0.06);
60
+
61
+ /* Glass blur */
62
+ --blur-glass: saturate(140%) blur(14px);
63
+
64
+ /* Typography — Inter throughout, mono only for stats / coordinates */
65
+ --font-ui: 'Inter', system-ui, -apple-system, sans-serif;
66
+ --font-mono: 'JetBrains Mono', 'SF Mono', ui-monospace, monospace;
67
+
68
+ /* Back-compat aliases — keep legacy class refs working */
69
+ --font-label: var(--font-ui);
70
+ --font-body: var(--font-ui);
71
+
72
+ /* Motion — Spatial spring */
73
+ --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
74
+ --ease-spring: cubic-bezier(0.34, 1.4, 0.5, 1);
75
+ --t-fast: 140ms; --t-base: 220ms; --t-slow: 320ms;
76
+
77
+ /* Radii */
78
+ --radius-sm: 6px;
79
+ --radius-md: 12px;
80
+ --radius-lg: 18px;
81
+ --radius-pill: 999px;
82
+ }
83
+
84
+ @media (prefers-reduced-motion: reduce) {
85
+ *, *::before, *::after {
86
+ animation-duration: 0.01ms !important;
87
+ transition-duration: 0.01ms !important;
88
+ }
89
+ }
90
+
91
+ /* -- Page shell ------------------------------------------------------------ */
92
+ .bslib-page-fill {
93
+ display: flex !important;
94
+ flex-direction: column !important;
95
+ height: 100dvh !important;
96
+ overflow: hidden !important;
97
+ }
98
+
99
+ /* depth-shell: row container — map takes ~70 %, panel fills ~30 % */
100
+ .depth-shell {
101
+ flex: 1;
102
+ display: flex;
103
+ flex-direction: row;
104
+ overflow: hidden;
105
+ min-height: 0;
106
+ }
107
+
108
+ /* Map area: all overlay controls are absolute inside here */
109
+ .depth-map {
110
+ flex: 1;
111
+ position: relative;
112
+ min-width: 0;
113
+ min-height: 0;
114
+ overflow: hidden;
115
+ background: var(--c-canvas);
116
+ }
117
+
118
+ .depth-map .htmlwidget,
119
+ .depth-map .maplibregl-map {
120
+ width: 100% !important;
121
+ height: 100% !important;
122
+ }
123
+
124
+ /* -- Top bar: crime selector + grid controls ------------------------------- */
125
+ .map-overlay-top {
126
+ position: absolute;
127
+ top: var(--space-3);
128
+ left: 50%;
129
+ transform: translateX(-50%);
130
+ z-index: 999;
131
+ background: var(--c-surf);
132
+ border: 1px solid var(--c-border);
133
+ border-radius: var(--radius-md);
134
+ padding: var(--space-1) var(--space-3);
135
+ display: flex;
136
+ align-items: center;
137
+ gap: var(--space-2);
138
+ white-space: nowrap;
139
+ max-width: calc(100vw - 220px);
140
+ box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.16);
141
+ }
142
+
143
+ .map-overlay-top .form-group { margin-bottom: 0 !important; }
144
+
145
+ .map-overlay-top select {
146
+ background: var(--c-surf) !important;
147
+ color: var(--c-text) !important;
148
+ border: 1px solid var(--c-border-str) !important;
149
+ border-radius: var(--radius-md) !important;
150
+ font-size: 11px !important;
151
+ font-family: var(--font-label) !important;
152
+ font-weight: 700 !important;
153
+ letter-spacing: 0.06em !important;
154
+ text-transform: uppercase !important;
155
+ padding: 5px var(--space-2) !important;
156
+ cursor: pointer;
157
+ outline: none;
158
+ box-shadow: 0 2px 6px oklch(20% 0.01 265 / 0.12) !important;
159
+ }
160
+
161
+ .map-overlay-top span {
162
+ color: var(--c-text-mid);
163
+ font-size: 11px;
164
+ font-family: var(--font-label);
165
+ font-weight: 700;
166
+ letter-spacing: 0.10em;
167
+ text-transform: uppercase;
168
+ }
169
+
170
+ .map-overlay-sep {
171
+ width: 1px;
172
+ height: 18px;
173
+ background: var(--c-border);
174
+ flex-shrink: 0;
175
+ }
176
+
177
+ /* (draw-extra-ctrl + btn-controls removed — controls now live in .depth-nav) */
178
+
179
+ /* Wrappers that anchor popovers from nav-bar buttons */
180
+ .style-btn-wrap,
181
+ .grid-btn-wrap,
182
+ .state-btn-wrap {
183
+ position: relative;
184
+ }
185
+
186
+ .style-picker {
187
+ position: absolute;
188
+ right: 0;
189
+ left: auto;
190
+ top: calc(100% + 6px);
191
+ background: var(--c-glass-2);
192
+ backdrop-filter: var(--blur-glass);
193
+ -webkit-backdrop-filter: var(--blur-glass);
194
+ border: 1px solid var(--c-glass-stroke);
195
+ border-radius: var(--radius-md);
196
+ padding: var(--space-1);
197
+ min-width: 168px;
198
+ box-shadow: var(--depth-3);
199
+ z-index: 1100;
200
+ animation: nav-pop-in var(--t-base) var(--ease-spring);
201
+ }
202
+
203
+ .style-option {
204
+ display: block;
205
+ width: 100%;
206
+ padding: var(--space-1) var(--space-3);
207
+ background: none;
208
+ border: none;
209
+ text-align: left;
210
+ font-size: 10px;
211
+ font-family: var(--font-label);
212
+ font-weight: 600;
213
+ letter-spacing: 0.05em;
214
+ color: var(--c-text-dim);
215
+ cursor: pointer;
216
+ border-radius: var(--radius-sm);
217
+ transition: background var(--t-fast) var(--ease-out),
218
+ color var(--t-fast) var(--ease-out);
219
+ }
220
+
221
+ .style-option:hover {
222
+ background: var(--c-surf-hover);
223
+ color: var(--c-text);
224
+ }
225
+
226
+ .style-option.active {
227
+ color: var(--c-navy);
228
+ background: var(--c-teal-pale);
229
+ }
230
+
231
+ .btn-ctrl {
232
+ background: var(--c-surf) !important;
233
+ color: var(--c-text) !important;
234
+ border: 1px solid var(--c-border) !important;
235
+ border-radius: var(--radius-md) !important;
236
+ font-size: 10px !important;
237
+ font-family: var(--font-label) !important;
238
+ font-weight: 700 !important;
239
+ letter-spacing: 0.10em !important;
240
+ text-transform: uppercase;
241
+ padding: var(--space-2) var(--space-3) !important;
242
+ cursor: pointer !important;
243
+ box-shadow: 0 2px 6px oklch(20% 0.01 265 / 0.14) !important;
244
+ transition: background 0.12s, border-color 0.12s !important;
245
+ display: inline-flex !important;
246
+ align-items: center !important;
247
+ gap: var(--space-1) !important;
248
+ }
249
+
250
+ .btn-ctrl:hover {
251
+ background: var(--c-surf-hover) !important;
252
+ border-color: var(--c-border-str) !important;
253
+ }
254
+
255
+ /* -- Layer control panel (bottom-left) ------------------------------------- */
256
+ .layer-ctrl-panel {
257
+ position: absolute;
258
+ bottom: var(--space-3);
259
+ left: 11px;
260
+ z-index: 999;
261
+ background: var(--c-glass-1);
262
+ backdrop-filter: var(--blur-glass);
263
+ -webkit-backdrop-filter: var(--blur-glass);
264
+ border: 1px solid var(--c-glass-stroke);
265
+ border-radius: var(--radius-lg);
266
+ overflow: hidden;
267
+ box-shadow: var(--depth-2);
268
+ min-width: 256px;
269
+ max-width: 288px;
270
+ font-family: var(--font-ui);
271
+ }
272
+
273
+ .layer-ctrl-header {
274
+ display: flex;
275
+ align-items: center;
276
+ justify-content: space-between;
277
+ padding: var(--space-2) var(--space-3);
278
+ cursor: pointer;
279
+ color: var(--c-text);
280
+ font-size: 10px;
281
+ font-family: var(--font-label);
282
+ font-weight: 700;
283
+ letter-spacing: 0.10em;
284
+ text-transform: uppercase;
285
+ user-select: none;
286
+ transition: background var(--t-fast) var(--ease-out);
287
+ }
288
+
289
+ .layer-ctrl-header:hover { background: var(--c-glass-hover); }
290
+
291
+ .layer-ctrl-icon {
292
+ font-size: 10px;
293
+ color: var(--c-text-dim);
294
+ }
295
+
296
+ .layer-ctrl-body {
297
+ max-height: 300px;
298
+ overflow-y: auto;
299
+ overflow-x: hidden;
300
+ padding: var(--space-1) var(--space-3) var(--space-2);
301
+ border-top: 1px solid var(--c-border);
302
+ }
303
+
304
+ .layer-ctrl-body::-webkit-scrollbar { width: 4px; }
305
+ .layer-ctrl-body::-webkit-scrollbar-thumb {
306
+ border-radius: 2px;
307
+ background-color: var(--c-border-str);
308
+ }
309
+ .layer-ctrl-body::-webkit-scrollbar-track { background: transparent; }
310
+
311
+ .layer-ctrl-body .form-check {
312
+ padding: 3px 0 3px 20px;
313
+ margin: 0;
314
+ }
315
+
316
+ .layer-ctrl-body .form-check-input {
317
+ margin-left: -16px;
318
+ cursor: pointer;
319
+ accent-color: var(--c-navy);
320
+ }
321
+
322
+ .layer-ctrl-body .form-check-label {
323
+ color: var(--c-text-dim);
324
+ font-size: 11px;
325
+ font-family: var(--font-ui);
326
+ cursor: pointer;
327
+ transition: color var(--t-fast) var(--ease-out);
328
+ }
329
+
330
+ .layer-ctrl-body .form-check-input:checked ~ .form-check-label {
331
+ color: var(--c-text);
332
+ }
333
+
334
+ .layer-ctrl-body .shiny-input-container { margin: 0 !important; }
335
+ .layer-ctrl-body > .shiny-input-container > .form-group { margin: 0 !important; }
336
+
337
+ /* -- Analysis panel — right column, 30 % of layout ----------------------- */
338
+ .depth-panel {
339
+ width: 384px;
340
+ flex-shrink: 0;
341
+ background: oklch(99% 0.002 250);
342
+ border-left: 1px solid var(--c-glass-stroke);
343
+ box-shadow: inset 1px 0 0 oklch(100% 0 0 / 0.6);
344
+ display: flex;
345
+ flex-direction: column;
346
+ overflow: hidden;
347
+ font-family: var(--font-ui);
348
+ color: var(--c-text);
349
+ }
350
+
351
+ /* All-light header: brand teal appears only as a 2px bottom border */
352
+ .dp-header {
353
+ background: var(--c-surf);
354
+ color: var(--c-text);
355
+ padding: var(--space-3) var(--space-4);
356
+ flex-shrink: 0;
357
+ display: flex;
358
+ flex-direction: column;
359
+ gap: 4px;
360
+ border-bottom: 1px solid var(--c-teal-pale);
361
+ }
362
+
363
+ .dp-title {
364
+ font-family: var(--font-label);
365
+ font-size: 24px;
366
+ font-weight: 800;
367
+ letter-spacing: 0.06em;
368
+ text-transform: uppercase;
369
+ margin: 0 0 3px;
370
+ color: var(--c-navy);
371
+ }
372
+
373
+ .dp-sub {
374
+ font-size: 11px;
375
+ color: var(--c-text-mid);
376
+ margin: 0;
377
+ line-height: 1.45;
378
+ }
379
+
380
+ /* -- Scrollable body — sections divided by lines, not nested cards --------- */
381
+ .dp-scroll {
382
+ flex: 1;
383
+ overflow-y: auto;
384
+ padding: 0 var(--space-4);
385
+ display: flex;
386
+ flex-direction: column;
387
+ }
388
+
389
+ .dp-scroll::-webkit-scrollbar { width: 4px; }
390
+ .dp-scroll::-webkit-scrollbar-thumb {
391
+ border-radius: 2px;
392
+ background-color: var(--c-border-str);
393
+ }
394
+ .dp-scroll::-webkit-scrollbar-track { background: transparent; }
395
+
396
+ .dp-card {
397
+ padding: var(--space-3) 0;
398
+ flex-shrink: 0;
399
+ }
400
+
401
+ .dp-card + .dp-card {
402
+ border-top: 1px solid var(--c-border);
403
+ }
404
+
405
+ .dp-label {
406
+ font-family: var(--font-label);
407
+ font-size: 9px;
408
+ font-weight: 700;
409
+ letter-spacing: 0.14em;
410
+ text-transform: uppercase;
411
+ color: var(--c-text-dim);
412
+ margin: 0 0 var(--space-3);
413
+ }
414
+
415
+ /* -- Big stats grid -------------------------------------------------------- */
416
+ .stat-grid {
417
+ display: grid;
418
+ grid-template-columns: 1fr 1fr;
419
+ gap: var(--space-3) var(--space-6);
420
+ margin-bottom: var(--space-3);
421
+ }
422
+
423
+ .stat-val {
424
+ font-family: var(--font-mono);
425
+ font-size: 30px;
426
+ font-weight: 600;
427
+ font-variant-numeric: tabular-nums;
428
+ line-height: 1;
429
+ margin-bottom: 4px;
430
+ letter-spacing: -0.02em;
431
+ color: var(--c-text);
432
+ }
433
+
434
+ .stat-lbl {
435
+ font-family: var(--font-ui);
436
+ font-size: 10px;
437
+ font-weight: 600;
438
+ letter-spacing: 0.08em;
439
+ text-transform: uppercase;
440
+ color: var(--c-text-mid);
441
+ }
442
+
443
+ .stat-sub {
444
+ font-size: 11px;
445
+ color: var(--c-text-mid);
446
+ margin-top: 4px;
447
+ line-height: 1.45;
448
+ min-height: 16px;
449
+ }
450
+
451
+ /* -- Mini stats grid ------------------------------------------------------- */
452
+ .mini-grid {
453
+ display: grid;
454
+ grid-template-columns: 1fr 1fr 1fr;
455
+ gap: var(--space-2) var(--space-3);
456
+ padding-top: var(--space-3);
457
+ border-top: 1px solid var(--c-border);
458
+ }
459
+
460
+ .mini-val {
461
+ font-family: var(--font-mono);
462
+ font-size: 16px;
463
+ font-weight: 700;
464
+ line-height: 1;
465
+ margin-bottom: 1px;
466
+ }
467
+
468
+ .mini-lbl {
469
+ font-family: var(--font-label);
470
+ font-size: 8px;
471
+ font-weight: 700;
472
+ letter-spacing: 0.10em;
473
+ text-transform: uppercase;
474
+ color: var(--c-text-dim);
475
+ }
476
+
477
+ /* -- Municipality rank list ------------------------------------------------ */
478
+ .rank-list {
479
+ list-style: none;
480
+ margin: 0;
481
+ padding: 0;
482
+ }
483
+
484
+ .rank-item {
485
+ display: flex;
486
+ align-items: flex-start;
487
+ gap: var(--space-2);
488
+ padding: var(--space-2) 0;
489
+ }
490
+
491
+ .rank-item + .rank-item {
492
+ border-top: 1px solid var(--c-border);
493
+ }
494
+
495
+ .rank-num {
496
+ font-family: var(--font-label);
497
+ font-size: 10px;
498
+ font-weight: 700;
499
+ color: var(--c-text-dim);
500
+ min-width: 18px;
501
+ padding-top: 3px;
502
+ text-align: right;
503
+ }
504
+
505
+ .rank-body {
506
+ flex: 1;
507
+ min-width: 0;
508
+ }
509
+
510
+ .rank-name {
511
+ font-size: 12px;
512
+ font-weight: 600;
513
+ color: var(--c-text);
514
+ white-space: nowrap;
515
+ overflow: hidden;
516
+ text-overflow: ellipsis;
517
+ }
518
+
519
+ .rank-meta {
520
+ font-size: 10px;
521
+ color: var(--c-text-dim);
522
+ margin: 1px 0 var(--space-1);
523
+ }
524
+
525
+ .rank-track {
526
+ height: 2px;
527
+ background: var(--c-border);
528
+ border-radius: 1px;
529
+ overflow: hidden;
530
+ }
531
+
532
+ .rank-fill {
533
+ height: 100%;
534
+ border-radius: 1px;
535
+ transition: width 0.35s cubic-bezier(0.16, 1, 0.3, 1);
536
+ }
537
+
538
+ .rank-rate {
539
+ font-family: var(--font-mono);
540
+ font-size: 11px;
541
+ font-weight: 700;
542
+ color: var(--c-text-mid);
543
+ padding-top: 2px;
544
+ white-space: nowrap;
545
+ }
546
+
547
+ /* -- States ---------------------------------------------------------------- */
548
+ .dp-empty {
549
+ padding: var(--space-6) var(--space-2);
550
+ color: var(--c-text-dim);
551
+ font-size: 12px;
552
+ text-align: center;
553
+ line-height: 1.6;
554
+ }
555
+
556
+ .dp-more {
557
+ font-family: var(--font-label);
558
+ font-size: 10px;
559
+ letter-spacing: 0.04em;
560
+ color: var(--c-text-dim);
561
+ text-align: center;
562
+ padding: var(--space-1) 0 var(--space-2);
563
+ }
564
+
565
+ /* -- Analysis panel: selection badge --------------------------------------- */
566
+ .dp-selection-badge {
567
+ display: inline-flex;
568
+ align-items: center;
569
+ gap: 4px;
570
+ font-family: var(--font-label);
571
+ font-size: 9px;
572
+ font-weight: 600;
573
+ letter-spacing: 0.06em;
574
+ color: var(--c-teal);
575
+ background: var(--c-teal-pale);
576
+ border-radius: 10px;
577
+ padding: 2px 8px;
578
+ margin-top: var(--space-1);
579
+ }
580
+
581
+ /* -- Analysis panel collapsible section headers ---------------------------- */
582
+ .dp-group {
583
+ border-bottom: 1px solid var(--c-border);
584
+ margin-bottom: var(--space-1);
585
+ }
586
+
587
+ .dp-group-hdr {
588
+ display: flex;
589
+ justify-content: space-between;
590
+ align-items: center;
591
+ cursor: pointer;
592
+ padding: var(--space-2) var(--space-1);
593
+ user-select: none;
594
+ border-radius: var(--radius-sm);
595
+ }
596
+
597
+ .dp-group-hdr:hover { background: var(--c-surf-hover); }
598
+
599
+ .dp-group-label {
600
+ font-family: var(--font-label);
601
+ font-size: 10px;
602
+ font-weight: 700;
603
+ letter-spacing: 0.14em;
604
+ text-transform: uppercase;
605
+ color: var(--c-text);
606
+ }
607
+
608
+ .dp-group-icon {
609
+ font-size: 7px;
610
+ color: var(--c-text-dim);
611
+ flex-shrink: 0;
612
+ }
613
+
614
+ .dp-group-body {
615
+ padding: var(--space-1) 0 var(--space-2) 0;
616
+ }
617
+
618
+ /* -- Indicator cards inside panel groups ----------------------------------- */
619
+ .ind-card {
620
+ border: 1px solid var(--c-glass-stroke);
621
+ border-radius: var(--radius-md);
622
+ margin-bottom: var(--space-2);
623
+ overflow: hidden;
624
+ background: oklch(100% 0 0);
625
+ box-shadow: var(--depth-1);
626
+ transition: transform var(--t-base) var(--ease-spring),
627
+ box-shadow var(--t-base) var(--ease-out);
628
+ }
629
+
630
+ .ind-card:hover {
631
+ transform: translateY(-1px);
632
+ box-shadow: var(--depth-2);
633
+ }
634
+
635
+ .ind-card-hdr {
636
+ display: flex;
637
+ align-items: center;
638
+ justify-content: space-between;
639
+ padding: 5px 10px;
640
+ background: var(--c-surf-hover);
641
+ border-bottom: 1px solid var(--c-border);
642
+ }
643
+
644
+ .ind-card-title {
645
+ font-family: var(--font-ui);
646
+ font-size: 10px;
647
+ font-weight: 600;
648
+ letter-spacing: 0.08em;
649
+ text-transform: uppercase;
650
+ color: var(--c-text-mid);
651
+ }
652
+
653
+ .ind-card-body {
654
+ padding: var(--space-2) 10px;
655
+ }
656
+
657
+ .ind-card-body .stat-grid {
658
+ margin-bottom: 0;
659
+ }
660
+
661
+ .ind-card-chart {
662
+ border-top: 1px solid var(--c-border);
663
+ padding: var(--space-1) 10px var(--space-2);
664
+ }
665
+
666
+ .ind-card-note {
667
+ font-size: 11px;
668
+ color: var(--c-text-mid);
669
+ line-height: 1.5;
670
+ padding: 0 10px 4px;
671
+ }
672
+
673
+ /* -- Horizontal stat row (label left, value right) ------------------------- */
674
+ .dp-stat {
675
+ display: flex;
676
+ justify-content: space-between;
677
+ align-items: center;
678
+ padding: 4px 0;
679
+ border-bottom: 1px solid var(--c-border);
680
+ }
681
+
682
+ .dp-stat:last-child { border-bottom: none; }
683
+
684
+ .dp-stat-lbl {
685
+ font-family: var(--font-label);
686
+ font-size: 10px;
687
+ color: var(--c-text-mid);
688
+ flex: 1;
689
+ padding-right: var(--space-2);
690
+ }
691
+
692
+ .dp-stat-val {
693
+ font-family: var(--font-mono);
694
+ font-size: 12px;
695
+ font-weight: 700;
696
+ flex-shrink: 0;
697
+ }
698
+
699
+ /* -- Clear button (light header context) ----------------------------------- */
700
+ .btn-clear {
701
+ background: transparent !important;
702
+ color: var(--c-text-mid) !important;
703
+ border: 1px solid var(--c-border-str) !important;
704
+ border-radius: var(--radius-sm) !important;
705
+ font-size: 9px !important;
706
+ font-family: var(--font-label) !important;
707
+ font-weight: 700 !important;
708
+ letter-spacing: 0.08em !important;
709
+ text-transform: uppercase !important;
710
+ padding: 3px var(--space-2) !important;
711
+ flex-shrink: 0 !important;
712
+ white-space: nowrap !important;
713
+ transition: background var(--t-fast) var(--ease-out),
714
+ color var(--t-fast) var(--ease-out) !important;
715
+ }
716
+
717
+ .btn-clear:hover {
718
+ background: var(--c-surf-hover) !important;
719
+ color: var(--c-text) !important;
720
+ }
721
+
722
+ /* -- Footer: download button — navy accent --------------------------------- */
723
+ .dp-footer {
724
+ padding: var(--space-2) var(--space-4) var(--space-3);
725
+ flex-shrink: 0;
726
+ border-top: 1px solid var(--c-border);
727
+ }
728
+
729
+ .dp-footer .btn {
730
+ width: 100%;
731
+ padding: var(--space-2) 0;
732
+ background: var(--c-navy) !important;
733
+ color: oklch(97% 0.003 265) !important;
734
+ border: none;
735
+ border-radius: var(--radius-md);
736
+ font-size: 11px;
737
+ font-family: var(--font-label);
738
+ font-weight: 700;
739
+ letter-spacing: 0.08em;
740
+ text-transform: uppercase;
741
+ transition: background var(--t-base) var(--ease-out),
742
+ transform var(--t-base) var(--ease-spring),
743
+ box-shadow var(--t-base) var(--ease-out);
744
+ }
745
+
746
+ .dp-footer .btn:hover {
747
+ background: var(--c-navy-dim) !important;
748
+ transform: translateY(-1px);
749
+ box-shadow: var(--depth-2);
750
+ }
751
+
752
+ /* (.btn-ctrl-sq removed — superseded by .nav-btn in the top nav-bar) */
753
+
754
+ /* -- Expanded layer panel for accordion ------------------------------------ */
755
+ .layer-ctrl-panel {
756
+ max-width: 280px !important;
757
+ min-width: 240px !important;
758
+ }
759
+
760
+ .layer-ctrl-body {
761
+ max-height: 480px !important;
762
+ padding: 0 0 var(--space-1) !important;
763
+ }
764
+
765
+ /* -- Accordion groups ------------------------------------------------------ */
766
+ .acc-group + .acc-group {
767
+ border-top: 1px solid var(--c-border);
768
+ }
769
+
770
+ .acc-header {
771
+ display: flex;
772
+ align-items: center;
773
+ justify-content: space-between;
774
+ padding: 6px var(--space-3);
775
+ cursor: pointer;
776
+ user-select: none;
777
+ transition: background var(--t-fast) var(--ease-out);
778
+ }
779
+
780
+ .acc-header:hover {
781
+ background: var(--c-glass-hover);
782
+ }
783
+
784
+ .acc-label {
785
+ font-family: var(--font-label);
786
+ font-size: 9px;
787
+ font-weight: 700;
788
+ letter-spacing: 0.12em;
789
+ text-transform: uppercase;
790
+ color: var(--c-text-mid);
791
+ }
792
+
793
+ .acc-icon {
794
+ font-size: 7px;
795
+ color: var(--c-text-dim);
796
+ }
797
+
798
+ .acc-body {
799
+ padding-bottom: 4px;
800
+ }
801
+
802
+ .acc-item-wrap {
803
+ border-bottom: 1px solid transparent;
804
+ }
805
+
806
+ .acc-item {
807
+ display: flex;
808
+ align-items: center;
809
+ justify-content: space-between;
810
+ padding: 4px var(--space-3);
811
+ gap: var(--space-1);
812
+ }
813
+
814
+ /* -- iOS-style toggle switch ------------------------------------------------ */
815
+ .acc-toggle-label {
816
+ display: flex;
817
+ align-items: center;
818
+ gap: 6px;
819
+ cursor: pointer;
820
+ flex: 1;
821
+ min-width: 0;
822
+ }
823
+
824
+ .acc-toggle-input {
825
+ position: absolute;
826
+ opacity: 0;
827
+ width: 0;
828
+ height: 0;
829
+ pointer-events: none;
830
+ }
831
+
832
+ .acc-toggle-track {
833
+ display: inline-flex;
834
+ align-items: center;
835
+ width: 34px;
836
+ height: 18px;
837
+ background: var(--c-glass-stroke-strong);
838
+ border-radius: 999px;
839
+ position: relative;
840
+ flex-shrink: 0;
841
+ transition: background var(--t-base) var(--ease-spring);
842
+ }
843
+
844
+ .acc-toggle-thumb {
845
+ position: absolute;
846
+ left: 2px;
847
+ width: 14px;
848
+ height: 14px;
849
+ background: #fff;
850
+ border-radius: 50%;
851
+ box-shadow: 0 1px 3px oklch(20% 0.01 250 / 0.3);
852
+ transition: left var(--t-base) var(--ease-spring);
853
+ }
854
+
855
+ .acc-toggle-label:has(.acc-toggle-input:checked) .acc-toggle-track {
856
+ background: var(--c-accent);
857
+ }
858
+
859
+ .acc-toggle-label:has(.acc-toggle-input:checked) .acc-toggle-thumb {
860
+ left: 18px;
861
+ }
862
+
863
+ .acc-toggle-label:focus-within .acc-toggle-track {
864
+ box-shadow: 0 0 0 3px oklch(43% 0.12 218 / 0.18);
865
+ }
866
+
867
+ .acc-toggle-text {
868
+ font-size: 11.5px;
869
+ color: var(--c-text-mid);
870
+ font-family: var(--font-ui);
871
+ transition: color var(--t-fast) var(--ease-out);
872
+ line-height: 1.4;
873
+ overflow: hidden;
874
+ text-overflow: ellipsis;
875
+ }
876
+
877
+ .acc-toggle-label:has(.acc-toggle-input:checked) .acc-toggle-text {
878
+ color: var(--c-text);
879
+ }
880
+
881
+ .acc-info-wrap {
882
+ flex-shrink: 0;
883
+ cursor: help;
884
+ display: inline-flex;
885
+ align-items: center;
886
+ opacity: 0.7;
887
+ transition: opacity var(--t-fast) var(--ease-out);
888
+ }
889
+
890
+ .acc-info-wrap:hover,
891
+ .acc-info-wrap:focus-visible { opacity: 1; outline: none; }
892
+
893
+ /* -- Layer legends ---------------------------------------------------------- */
894
+ .acc-legend {
895
+ display: none;
896
+ padding: 2px var(--space-3) 6px calc(var(--space-3) + 34px);
897
+ }
898
+
899
+ /* Legend visibility driven by JS class toggle (preserves correct display type per shape) */
900
+ .acc-legend.legend-visible { display: block; }
901
+ .acc-legend-dot.legend-visible { display: flex; }
902
+ .acc-legend-line-wrap.legend-visible { display: flex; }
903
+ .acc-legend-cats.legend-visible { display: flex; }
904
+
905
+ .acc-legend-ramp .acc-legend-bar {
906
+ height: 8px;
907
+ border-radius: 3px;
908
+ margin-bottom: 3px;
909
+ }
910
+
911
+ .acc-legend-labels {
912
+ display: flex;
913
+ justify-content: space-between;
914
+ font-size: 10.5px;
915
+ color: var(--c-text-mid);
916
+ font-family: var(--font-ui);
917
+ font-variant-numeric: tabular-nums;
918
+ }
919
+
920
+ .acc-legend-val {
921
+ font-family: var(--font-mono);
922
+ font-size: 10.5px;
923
+ font-weight: 600;
924
+ color: var(--c-text-mid);
925
+ letter-spacing: -0.01em;
926
+ }
927
+
928
+ .acc-legend-bound {
929
+ font-size: 9px;
930
+ font-weight: 600;
931
+ text-transform: uppercase;
932
+ letter-spacing: 0.06em;
933
+ color: var(--c-text-dim);
934
+ margin-right: 3px;
935
+ }
936
+
937
+ .acc-legend-bound.bound-max {
938
+ margin-right: 0;
939
+ margin-left: 2px;
940
+ }
941
+
942
+ .acc-legend-cats {
943
+ flex-direction: column;
944
+ gap: 2px;
945
+ }
946
+
947
+ .acc-legend-cat {
948
+ display: flex;
949
+ align-items: center;
950
+ gap: 5px;
951
+ font-size: 9px;
952
+ color: var(--c-text-dim);
953
+ font-family: var(--font-label);
954
+ }
955
+
956
+ .acc-legend-swatch {
957
+ width: 9px;
958
+ height: 9px;
959
+ border-radius: 2px;
960
+ flex-shrink: 0;
961
+ border: 1px solid rgba(0,0,0,0.08);
962
+ }
963
+
964
+ .acc-legend-dot {
965
+ align-items: center;
966
+ gap: 6px;
967
+ }
968
+
969
+ .acc-legend-circle {
970
+ width: 9px;
971
+ height: 9px;
972
+ border-radius: 50%;
973
+ flex-shrink: 0;
974
+ border: 1px solid rgba(0,0,0,0.15);
975
+ }
976
+
977
+ .acc-legend-dot-lbl {
978
+ font-size: 9px;
979
+ color: var(--c-text-dim);
980
+ font-family: var(--font-label);
981
+ }
982
+
983
+ .acc-legend-line-wrap {
984
+ align-items: center;
985
+ gap: 6px;
986
+ }
987
+
988
+ .acc-legend-line-seg {
989
+ display: inline-block;
990
+ width: 24px;
991
+ flex-shrink: 0;
992
+ }
993
+
994
+ .acc-legend-line-lbl {
995
+ font-size: 9px;
996
+ color: var(--c-text-dim);
997
+ font-family: var(--font-label);
998
+ }
999
+
1000
+ /* Crime sub-type radio chips */
1001
+ .acc-radios {
1002
+ display: flex;
1003
+ flex-wrap: wrap;
1004
+ gap: 3px;
1005
+ padding: 2px var(--space-3) 5px calc(var(--space-3) + 34px);
1006
+ }
1007
+
1008
+ .acc-radio {
1009
+ font-family: var(--font-ui);
1010
+ font-size: 10.5px;
1011
+ font-weight: 500;
1012
+ letter-spacing: 0.01em;
1013
+ color: var(--c-text-mid);
1014
+ background: oklch(94% 0.004 250);
1015
+ border: none;
1016
+ border-radius: var(--radius-pill);
1017
+ padding: 4px 9px;
1018
+ cursor: pointer;
1019
+ transition: background var(--t-fast) var(--ease-out),
1020
+ color var(--t-fast) var(--ease-out),
1021
+ transform var(--t-base) var(--ease-spring),
1022
+ box-shadow var(--t-base) var(--ease-out);
1023
+ line-height: 1.4;
1024
+ }
1025
+
1026
+ .acc-radio:hover {
1027
+ background: oklch(90% 0.005 250);
1028
+ color: var(--c-text);
1029
+ transform: translateY(-0.5px);
1030
+ }
1031
+
1032
+ .acc-radio:focus-visible {
1033
+ outline: 2px solid var(--c-focus);
1034
+ outline-offset: 2px;
1035
+ }
1036
+
1037
+ .acc-radio.active {
1038
+ background: var(--c-accent);
1039
+ color: #fff;
1040
+ box-shadow: var(--depth-1);
1041
+ }
1042
+
1043
+ /* Static ENVIPE sub-labels */
1044
+ .acc-subs {
1045
+ padding: 0 var(--space-3) 3px calc(var(--space-3) + 17px);
1046
+ }
1047
+
1048
+ .acc-sub {
1049
+ font-size: 9px;
1050
+ color: var(--c-text-dim);
1051
+ font-family: var(--font-body);
1052
+ line-height: 1.7;
1053
+ }
1054
+
1055
+ /* Disabled / coming-soon items */
1056
+ .acc-disabled {
1057
+ opacity: 0.45;
1058
+ pointer-events: none;
1059
+ }
1060
+
1061
+ .acc-coming-tag {
1062
+ font-family: var(--font-label);
1063
+ font-size: 8px;
1064
+ font-weight: 700;
1065
+ letter-spacing: 0.06em;
1066
+ color: var(--c-teal);
1067
+ background: var(--c-teal-pale);
1068
+ border-radius: 2px;
1069
+ padding: 1px 4px;
1070
+ flex-shrink: 0;
1071
+ }
1072
+
1073
+ /* -- Grid toggle panel (drops down from nav-bar trigger) ------------------- */
1074
+ .grid-btn-wrap {
1075
+ position: relative;
1076
+ display: inline-flex;
1077
+ align-items: center;
1078
+ }
1079
+
1080
+ .grid-panel {
1081
+ position: absolute;
1082
+ top: calc(100% + 6px);
1083
+ right: 0;
1084
+ left: auto;
1085
+ background: var(--c-glass-2);
1086
+ backdrop-filter: var(--blur-glass);
1087
+ -webkit-backdrop-filter: var(--blur-glass);
1088
+ border: 1px solid var(--c-glass-stroke);
1089
+ border-radius: var(--radius-md);
1090
+ padding: 4px;
1091
+ display: flex;
1092
+ flex-direction: row;
1093
+ gap: 2px;
1094
+ box-shadow: var(--depth-3);
1095
+ z-index: 1100;
1096
+ white-space: nowrap;
1097
+ opacity: 0;
1098
+ transform: translateY(-4px) scale(0.97);
1099
+ transform-origin: top right;
1100
+ transition: opacity var(--t-base) var(--ease-spring),
1101
+ transform var(--t-base) var(--ease-spring);
1102
+ pointer-events: none;
1103
+ }
1104
+
1105
+ .grid-panel.open {
1106
+ opacity: 1;
1107
+ transform: translateY(0) scale(1);
1108
+ pointer-events: auto;
1109
+ }
1110
+
1111
+ .grid-nivel-btn {
1112
+ width: 34px;
1113
+ height: 28px;
1114
+ background: none;
1115
+ border: none;
1116
+ border-radius: var(--radius-sm);
1117
+ font-family: var(--font-ui);
1118
+ font-size: 11px;
1119
+ font-weight: 600;
1120
+ letter-spacing: 0.04em;
1121
+ color: var(--c-text-mid);
1122
+ cursor: pointer;
1123
+ transition: background var(--t-fast) var(--ease-out),
1124
+ color var(--t-fast) var(--ease-out),
1125
+ transform var(--t-base) var(--ease-spring);
1126
+ position: relative;
1127
+ }
1128
+
1129
+ .grid-nivel-btn:not(.soon):hover {
1130
+ background: var(--c-glass-hover);
1131
+ color: var(--c-text);
1132
+ transform: translateY(-0.5px);
1133
+ }
1134
+
1135
+ .grid-nivel-btn:focus-visible {
1136
+ outline: 2px solid var(--c-focus);
1137
+ outline-offset: 2px;
1138
+ }
1139
+
1140
+ .grid-nivel-btn.active {
1141
+ background: var(--c-accent);
1142
+ color: #fff;
1143
+ box-shadow: var(--depth-1);
1144
+ }
1145
+
1146
+ /* N7/N8 coming-soon buttons */
1147
+ .grid-nivel-btn.soon {
1148
+ opacity: 0.4;
1149
+ pointer-events: none;
1150
+ }
1151
+
1152
+ .grid-nivel-btn.soon::after {
1153
+ content: 'soon';
1154
+ position: absolute;
1155
+ top: -5px;
1156
+ right: -3px;
1157
+ font-size: 6px;
1158
+ font-weight: 700;
1159
+ letter-spacing: 0;
1160
+ color: var(--c-teal);
1161
+ background: var(--c-teal-pale);
1162
+ border-radius: 2px;
1163
+ padding: 1px 2px;
1164
+ line-height: 1;
1165
+ }
1166
+
1167
+ /* -- JS-positioned tooltip (inverted glass) -------------------------------- */
1168
+ .depth-tooltip {
1169
+ position: fixed;
1170
+ background: oklch(15% 0.012 250 / 0.92);
1171
+ backdrop-filter: blur(12px) saturate(140%);
1172
+ -webkit-backdrop-filter: blur(12px) saturate(140%);
1173
+ color: oklch(98% 0.003 250);
1174
+ font-size: 11px;
1175
+ font-family: var(--font-ui);
1176
+ font-weight: 400;
1177
+ line-height: 1.5;
1178
+ padding: 8px 12px;
1179
+ border-radius: var(--radius-md);
1180
+ border: 1px solid oklch(100% 0 0 / 0.08);
1181
+ max-width: 260px;
1182
+ z-index: 99999;
1183
+ pointer-events: none;
1184
+ transform: translateY(-50%);
1185
+ box-shadow: var(--depth-3);
1186
+ word-break: break-word;
1187
+ display: none;
1188
+ }
1189
+
1190
+ /* -- Hide MapLibre Draw buttons not needed -------------------------------- */
1191
+ /* polygon (lasso), rectangle, radius and line_string are all relocated into */
1192
+ /* the top nav-bar by relocateDrawButtonsToNav(). Hide only point/trash/ */
1193
+ /* combine/uncombine which are not useful here. */
1194
+ button.mapbox-gl-draw_point,
1195
+ button.mapbox-gl-draw_trash,
1196
+ button.mapbox-gl-draw_combine,
1197
+ button.mapbox-gl-draw_uncombine { display: none !important; }
1198
+
1199
+ /* (draw-extra-ctrl position now set in the overrides section below) */
1200
+
1201
+ /* (Viewport coords moved into .nav-coords inside the top nav-bar) */
1202
+
1203
+ /* Draw measurement display stays at top-left of the map */
1204
+ .maplibregl-ctrl-bottom-left {
1205
+ top: 46px;
1206
+ bottom: auto;
1207
+ }
1208
+
1209
+ /* -- State filter picker panel (drops down from nav-bar trigger) ----------- */
1210
+ .state-picker-panel {
1211
+ position: absolute;
1212
+ top: calc(100% + 6px);
1213
+ right: 0;
1214
+ left: auto;
1215
+ z-index: 1100;
1216
+ background: var(--c-glass-2);
1217
+ backdrop-filter: var(--blur-glass);
1218
+ -webkit-backdrop-filter: var(--blur-glass);
1219
+ border: 1px solid var(--c-glass-stroke);
1220
+ border-radius: var(--radius-md);
1221
+ padding: var(--space-2) var(--space-3);
1222
+ box-shadow: var(--depth-3);
1223
+ min-width: 220px;
1224
+ display: flex;
1225
+ flex-direction: column;
1226
+ gap: var(--space-2);
1227
+ }
1228
+
1229
+ .state-picker-header {
1230
+ display: flex;
1231
+ align-items: center;
1232
+ justify-content: space-between;
1233
+ font-family: var(--font-label);
1234
+ font-size: 9px;
1235
+ font-weight: 700;
1236
+ letter-spacing: 0.08em;
1237
+ text-transform: uppercase;
1238
+ color: var(--c-text-dim);
1239
+ }
1240
+
1241
+ .state-picker-close {
1242
+ background: none;
1243
+ border: none;
1244
+ cursor: pointer;
1245
+ color: var(--c-text-dim);
1246
+ font-size: 14px;
1247
+ line-height: 1;
1248
+ padding: 0;
1249
+ }
1250
+
1251
+ .state-picker-panel .selectize-control,
1252
+ .state-picker-panel select {
1253
+ font-size: 11px;
1254
+ width: 100%;
1255
+ }
1256
+
1257
+ .state-picker-actions {
1258
+ display: flex;
1259
+ gap: var(--space-1);
1260
+ }
1261
+
1262
+ /* -- Temporal analysis card (migrants, bottom-center of map) ---------------- */
1263
+ .temporal-card {
1264
+ position: absolute;
1265
+ bottom: var(--space-3);
1266
+ left: 50%;
1267
+ transform: translateX(-50%);
1268
+ width: 270px;
1269
+ display: none;
1270
+ background: var(--c-surf);
1271
+ border: 1px solid var(--c-border);
1272
+ border-radius: var(--radius-md);
1273
+ padding: 5px 10px 4px;
1274
+ z-index: 100;
1275
+ box-shadow: 0 2px 8px oklch(20% 0.01 265 / 0.14);
1276
+ }
1277
+
1278
+ .temporal-card-header {
1279
+ display: flex;
1280
+ align-items: center;
1281
+ gap: 4px;
1282
+ font-size: 8px;
1283
+ font-family: var(--font-label);
1284
+ font-weight: 700;
1285
+ letter-spacing: 0.08em;
1286
+ text-transform: uppercase;
1287
+ color: var(--c-text-dim);
1288
+ margin-bottom: 1px;
1289
+ }
1290
+
1291
+ /* =========================================================================
1292
+ TOP NAV-BAR — Spatial UI horizontal control strip
1293
+ ========================================================================= */
1294
+
1295
+ .bslib-page-fill { display: flex !important; flex-direction: column !important; }
1296
+
1297
+ .depth-nav {
1298
+ flex-shrink: 0;
1299
+ height: 52px;
1300
+ width: 100%;
1301
+ display: flex;
1302
+ align-items: center;
1303
+ gap: var(--space-3);
1304
+ padding: 0 var(--space-3);
1305
+ background: var(--c-glass-1);
1306
+ backdrop-filter: var(--blur-glass);
1307
+ -webkit-backdrop-filter: var(--blur-glass);
1308
+ border-bottom: 1px solid var(--c-glass-stroke);
1309
+ box-shadow: var(--depth-1);
1310
+ z-index: 1000;
1311
+ position: relative;
1312
+ font-family: var(--font-ui);
1313
+ }
1314
+
1315
+ /* ---- Brand ---- */
1316
+ .nav-brand {
1317
+ font-size: 13px;
1318
+ font-weight: 700;
1319
+ letter-spacing: 0.16em;
1320
+ text-transform: uppercase;
1321
+ color: var(--c-text);
1322
+ padding: 0 var(--space-2);
1323
+ white-space: nowrap;
1324
+ display: inline-flex;
1325
+ align-items: center;
1326
+ }
1327
+
1328
+ .nav-brand-dot {
1329
+ display: inline-block;
1330
+ width: 6px;
1331
+ height: 6px;
1332
+ border-radius: 50%;
1333
+ background: var(--c-accent);
1334
+ margin-right: 8px;
1335
+ }
1336
+
1337
+ /* ---- Search input + popover ---- */
1338
+ .nav-search {
1339
+ position: relative;
1340
+ flex: 0 1 380px;
1341
+ min-width: 240px;
1342
+ height: 36px;
1343
+ }
1344
+
1345
+ .nav-search-icon {
1346
+ position: absolute;
1347
+ left: 10px;
1348
+ top: 50%;
1349
+ transform: translateY(-50%);
1350
+ color: var(--c-text-mid);
1351
+ pointer-events: none;
1352
+ display: inline-flex;
1353
+ }
1354
+
1355
+ .nav-search-input {
1356
+ width: 100%;
1357
+ height: 100%;
1358
+ padding: 0 32px 0 34px;
1359
+ font-family: var(--font-ui);
1360
+ font-size: 13px;
1361
+ color: var(--c-text);
1362
+ background: oklch(100% 0 0 / 0.6);
1363
+ border: 1px solid var(--c-glass-stroke);
1364
+ border-radius: var(--radius-md);
1365
+ transition: background var(--t-fast) var(--ease-out),
1366
+ border-color var(--t-fast) var(--ease-out),
1367
+ box-shadow var(--t-base) var(--ease-spring);
1368
+ outline: none;
1369
+ }
1370
+
1371
+ .nav-search-input::placeholder { color: var(--c-text-dim); }
1372
+
1373
+ .nav-search-input:hover {
1374
+ background: oklch(100% 0 0 / 0.78);
1375
+ border-color: var(--c-glass-stroke-strong);
1376
+ }
1377
+
1378
+ .nav-search-input:focus-visible {
1379
+ border-color: var(--c-accent);
1380
+ background: oklch(100% 0 0 / 0.95);
1381
+ box-shadow: 0 0 0 3px oklch(43% 0.12 218 / 0.18);
1382
+ }
1383
+
1384
+ .nav-search-clear {
1385
+ position: absolute;
1386
+ right: 6px;
1387
+ top: 50%;
1388
+ transform: translateY(-50%);
1389
+ width: 24px;
1390
+ height: 24px;
1391
+ display: none;
1392
+ align-items: center;
1393
+ justify-content: center;
1394
+ border: none;
1395
+ background: transparent;
1396
+ border-radius: var(--radius-sm);
1397
+ color: var(--c-text-mid);
1398
+ cursor: pointer;
1399
+ transition: background var(--t-fast) var(--ease-out),
1400
+ color var(--t-fast) var(--ease-out);
1401
+ }
1402
+
1403
+ .nav-search-clear:hover {
1404
+ background: var(--c-glass-hover);
1405
+ color: var(--c-text);
1406
+ }
1407
+
1408
+ .nav-search.has-value .nav-search-clear { display: inline-flex; }
1409
+
1410
+ .nav-search-results {
1411
+ position: absolute;
1412
+ top: calc(100% + 6px);
1413
+ left: 0;
1414
+ right: 0;
1415
+ background: var(--c-glass-2);
1416
+ backdrop-filter: var(--blur-glass);
1417
+ -webkit-backdrop-filter: var(--blur-glass);
1418
+ border: 1px solid var(--c-glass-stroke);
1419
+ border-radius: var(--radius-md);
1420
+ box-shadow: var(--depth-3);
1421
+ max-height: 320px;
1422
+ overflow-y: auto;
1423
+ z-index: 1100;
1424
+ display: none;
1425
+ animation: nav-pop-in var(--t-base) var(--ease-spring);
1426
+ }
1427
+
1428
+ .nav-search.is-open .nav-search-results { display: block; }
1429
+
1430
+ .nav-search-result {
1431
+ display: flex;
1432
+ align-items: center;
1433
+ gap: var(--space-2);
1434
+ padding: 8px 12px;
1435
+ font-size: 12px;
1436
+ color: var(--c-text);
1437
+ cursor: pointer;
1438
+ transition: background var(--t-fast) var(--ease-out),
1439
+ color var(--t-fast) var(--ease-out);
1440
+ }
1441
+
1442
+ .nav-search-result:hover,
1443
+ .nav-search-result[aria-selected="true"] {
1444
+ background: var(--c-accent-soft);
1445
+ color: var(--c-accent-ink);
1446
+ }
1447
+
1448
+ .nav-search-result-meta {
1449
+ margin-left: auto;
1450
+ font-size: 10.5px;
1451
+ color: var(--c-text-mid);
1452
+ font-variant-numeric: tabular-nums;
1453
+ white-space: nowrap;
1454
+ }
1455
+
1456
+ .nav-search-empty,
1457
+ .nav-search-loading {
1458
+ padding: 12px;
1459
+ font-size: 12px;
1460
+ color: var(--c-text-mid);
1461
+ text-align: center;
1462
+ }
1463
+
1464
+ @keyframes nav-pop-in {
1465
+ from { opacity: 0; transform: translateY(-4px) scale(0.98); }
1466
+ to { opacity: 1; transform: translateY(0) scale(1); }
1467
+ }
1468
+
1469
+ /* ---- Primary action (Overview) ---- */
1470
+ .nav-primary {
1471
+ display: inline-flex;
1472
+ align-items: center;
1473
+ gap: 6px;
1474
+ height: 36px;
1475
+ padding: 0 14px;
1476
+ font-family: var(--font-ui);
1477
+ font-size: 12px;
1478
+ font-weight: 600;
1479
+ letter-spacing: 0.02em;
1480
+ color: #fff;
1481
+ background: var(--c-accent);
1482
+ border: 1px solid var(--c-accent);
1483
+ border-radius: var(--radius-md);
1484
+ box-shadow: var(--depth-1);
1485
+ cursor: pointer;
1486
+ transition: transform var(--t-base) var(--ease-spring),
1487
+ box-shadow var(--t-base) var(--ease-out),
1488
+ background var(--t-fast) var(--ease-out);
1489
+ white-space: nowrap;
1490
+ }
1491
+
1492
+ .nav-primary:hover {
1493
+ background: oklch(38% 0.12 218);
1494
+ transform: translateY(-1px);
1495
+ box-shadow: var(--depth-2);
1496
+ color: #fff;
1497
+ }
1498
+
1499
+ .nav-primary:active {
1500
+ transform: translateY(0);
1501
+ }
1502
+
1503
+ .nav-primary:focus-visible {
1504
+ outline: 2px solid var(--c-focus);
1505
+ outline-offset: 2px;
1506
+ }
1507
+
1508
+ /* ---- Tool groups + dividers ---- */
1509
+ .nav-divider {
1510
+ width: 1px;
1511
+ height: 22px;
1512
+ background: var(--c-glass-stroke);
1513
+ flex-shrink: 0;
1514
+ }
1515
+
1516
+ .nav-group {
1517
+ display: flex;
1518
+ align-items: center;
1519
+ gap: 4px;
1520
+ }
1521
+
1522
+ /* Single icon-button token-source for the nav-bar */
1523
+ .nav-btn {
1524
+ width: 36px;
1525
+ height: 36px;
1526
+ display: inline-flex;
1527
+ align-items: center;
1528
+ justify-content: center;
1529
+ background: transparent;
1530
+ color: var(--c-text-mid);
1531
+ border: 1px solid transparent;
1532
+ border-radius: var(--radius-md);
1533
+ cursor: pointer;
1534
+ padding: 0;
1535
+ transition: background var(--t-fast) var(--ease-out),
1536
+ color var(--t-fast) var(--ease-out),
1537
+ transform var(--t-base) var(--ease-spring),
1538
+ box-shadow var(--t-base) var(--ease-out),
1539
+ border-color var(--t-fast) var(--ease-out);
1540
+ }
1541
+
1542
+ .nav-btn:hover {
1543
+ background: var(--c-glass-hover);
1544
+ color: var(--c-text);
1545
+ transform: translateY(-0.5px);
1546
+ box-shadow: var(--depth-1);
1547
+ }
1548
+
1549
+ .nav-btn:active { transform: translateY(0) scale(0.97); }
1550
+
1551
+ .nav-btn:focus-visible {
1552
+ outline: 2px solid var(--c-focus);
1553
+ outline-offset: 2px;
1554
+ }
1555
+
1556
+ .nav-btn.active {
1557
+ background: var(--c-accent-soft);
1558
+ color: var(--c-accent-ink);
1559
+ border-color: var(--c-accent);
1560
+ }
1561
+
1562
+ /* Native mapgl draw buttons relocated into the nav inherit .nav-btn sizing.
1563
+ Their built-in background icons need to be re-centered. */
1564
+ .depth-nav .mapbox-gl-draw_polygon,
1565
+ .depth-nav .mapbox-gl-draw_rectangle,
1566
+ .depth-nav .mapbox-gl-draw_radius {
1567
+ background-color: transparent !important;
1568
+ background-position: center center !important;
1569
+ background-repeat: no-repeat !important;
1570
+ border: 1px solid transparent !important;
1571
+ box-shadow: none !important;
1572
+ }
1573
+
1574
+ .depth-nav .mapbox-gl-draw_polygon.active,
1575
+ .depth-nav .mapbox-gl-draw_rectangle.active,
1576
+ .depth-nav .mapbox-gl-draw_radius.active {
1577
+ background-color: var(--c-accent-soft) !important;
1578
+ border-color: var(--c-accent) !important;
1579
+ }
1580
+
1581
+ /* ---- Coords pill ---- */
1582
+ .nav-coords {
1583
+ display: inline-flex;
1584
+ align-items: center;
1585
+ gap: 10px;
1586
+ height: 32px;
1587
+ padding: 0 12px;
1588
+ background: oklch(100% 0 0 / 0.5);
1589
+ border: 1px solid var(--c-glass-stroke);
1590
+ border-radius: var(--radius-pill);
1591
+ font-family: var(--font-mono);
1592
+ font-variant-numeric: tabular-nums;
1593
+ font-size: 11px;
1594
+ color: var(--c-text);
1595
+ white-space: nowrap;
1596
+ }
1597
+
1598
+ .nav-coords-item {
1599
+ display: inline-flex;
1600
+ align-items: baseline;
1601
+ gap: 5px;
1602
+ }
1603
+
1604
+ .nav-coords-key {
1605
+ font-family: var(--font-ui);
1606
+ font-size: 9.5px;
1607
+ font-weight: 600;
1608
+ letter-spacing: 0.08em;
1609
+ text-transform: uppercase;
1610
+ color: var(--c-text-mid);
1611
+ }
1612
+
1613
+ .nav-coords-val {
1614
+ min-width: 44px;
1615
+ text-align: right;
1616
+ }
1617
+
1618
+ .nav-coords-sep {
1619
+ width: 1px;
1620
+ height: 12px;
1621
+ background: var(--c-glass-stroke);
1622
+ }
1623
+
1624
+ /* ---- Responsive collapse ---- */
1625
+ @media (max-width: 1280px) {
1626
+ .nav-brand { display: none; }
1627
+ .nav-search { flex-basis: 280px; }
1628
+ }
1629
+
1630
+ @media (max-width: 1024px) {
1631
+ .nav-coords { display: none; }
1632
+ .nav-primary-label { display: none; }
1633
+ .nav-primary { padding: 0; width: 36px; justify-content: center; }
1634
+ .nav-divider:nth-of-type(n+3) { display: none; }
1635
+ }
1636
+
1637
+ /* =========================================================================
1638
+ SIDEBAR -- stacked panels + right-edge tab rail
1639
+ ========================================================================= */
1640
+
1641
+ .depth-side {
1642
+ flex-shrink: 0;
1643
+ display: flex;
1644
+ flex-direction: row;
1645
+ height: 100%;
1646
+ background: oklch(99% 0.002 250);
1647
+ }
1648
+
1649
+ .panel-stack {
1650
+ display: flex;
1651
+ flex-direction: column;
1652
+ width: 384px;
1653
+ border-right: 1px solid var(--c-glass-stroke);
1654
+ background: oklch(99% 0.002 250);
1655
+ box-shadow: inset 1px 0 0 oklch(100% 0 0 / 0.6);
1656
+ overflow: hidden;
1657
+ transition: width var(--t-slow) var(--ease-spring),
1658
+ border-color var(--t-base) var(--ease-out);
1659
+ }
1660
+
1661
+ .panel-stack.is-empty {
1662
+ width: 0;
1663
+ border-right-color: transparent;
1664
+ }
1665
+
1666
+ .side-panel {
1667
+ display: flex;
1668
+ flex-direction: column;
1669
+ flex: 1 1 auto;
1670
+ min-height: 0;
1671
+ overflow: hidden;
1672
+ }
1673
+
1674
+ .side-panel.is-collapsed { display: none; }
1675
+
1676
+ .side-panel + .side-panel {
1677
+ border-top: 1px solid var(--c-glass-stroke);
1678
+ }
1679
+
1680
+ .side-panel-header {
1681
+ display: flex;
1682
+ align-items: center;
1683
+ gap: var(--space-2);
1684
+ padding: var(--space-3) var(--space-4);
1685
+ border-bottom: 1px solid var(--c-glass-stroke);
1686
+ flex-shrink: 0;
1687
+ background: oklch(100% 0 0);
1688
+ }
1689
+
1690
+ .side-panel-icon {
1691
+ display: inline-flex;
1692
+ align-items: center;
1693
+ justify-content: center;
1694
+ width: 24px;
1695
+ height: 24px;
1696
+ color: var(--c-accent);
1697
+ flex-shrink: 0;
1698
+ }
1699
+
1700
+ .side-panel-title {
1701
+ flex: 1;
1702
+ margin: 0;
1703
+ font-family: var(--font-ui);
1704
+ font-size: 13px;
1705
+ font-weight: 700;
1706
+ letter-spacing: 0.08em;
1707
+ text-transform: uppercase;
1708
+ color: var(--c-text);
1709
+ white-space: nowrap;
1710
+ overflow: hidden;
1711
+ text-overflow: ellipsis;
1712
+ }
1713
+
1714
+ .side-panel-tag {
1715
+ font-family: var(--font-ui);
1716
+ font-size: 9px;
1717
+ font-weight: 700;
1718
+ letter-spacing: 0.08em;
1719
+ text-transform: uppercase;
1720
+ color: var(--c-accent);
1721
+ background: var(--c-accent-soft);
1722
+ border-radius: var(--radius-sm);
1723
+ padding: 2px 7px;
1724
+ }
1725
+
1726
+ .side-panel-collapse {
1727
+ width: 32px;
1728
+ height: 32px;
1729
+ display: inline-flex;
1730
+ align-items: center;
1731
+ justify-content: center;
1732
+ background: transparent;
1733
+ border: 1px solid transparent;
1734
+ border-radius: var(--radius-sm);
1735
+ color: var(--c-text-mid);
1736
+ cursor: pointer;
1737
+ transition: background var(--t-fast) var(--ease-out),
1738
+ color var(--t-fast) var(--ease-out);
1739
+ }
1740
+
1741
+ .side-panel-collapse:hover {
1742
+ background: var(--c-glass-hover);
1743
+ color: var(--c-text);
1744
+ }
1745
+
1746
+ .side-panel-collapse:focus-visible {
1747
+ outline: 2px solid var(--c-focus);
1748
+ outline-offset: 2px;
1749
+ }
1750
+
1751
+ .side-panel-body {
1752
+ flex: 1;
1753
+ display: flex;
1754
+ flex-direction: column;
1755
+ overflow: hidden;
1756
+ min-height: 0;
1757
+ }
1758
+
1759
+ .side-panel-intro {
1760
+ flex-shrink: 0;
1761
+ padding: var(--space-3) var(--space-4) var(--space-2);
1762
+ border-bottom: 1px solid var(--c-glass-stroke);
1763
+ }
1764
+
1765
+ .side-panel-sub {
1766
+ margin: 0 0 6px;
1767
+ font-family: var(--font-ui);
1768
+ font-size: 11.5px;
1769
+ color: var(--c-text-mid);
1770
+ line-height: 1.5;
1771
+ }
1772
+
1773
+ /* ---- Right-edge tab rail ---- */
1774
+ .side-rail {
1775
+ flex-shrink: 0;
1776
+ width: 48px;
1777
+ display: flex;
1778
+ flex-direction: column;
1779
+ align-items: center;
1780
+ gap: 4px;
1781
+ padding: var(--space-2) 0;
1782
+ background: var(--c-glass-1);
1783
+ backdrop-filter: var(--blur-glass);
1784
+ -webkit-backdrop-filter: var(--blur-glass);
1785
+ border-left: 1px solid var(--c-glass-stroke);
1786
+ }
1787
+
1788
+ .side-rail-tab {
1789
+ width: 40px;
1790
+ height: 56px;
1791
+ display: flex;
1792
+ flex-direction: column;
1793
+ align-items: center;
1794
+ justify-content: center;
1795
+ gap: 3px;
1796
+ background: transparent;
1797
+ border: 1px solid transparent;
1798
+ border-radius: var(--radius-md);
1799
+ color: var(--c-text-mid);
1800
+ cursor: pointer;
1801
+ padding: 0;
1802
+ transition: background var(--t-fast) var(--ease-out),
1803
+ color var(--t-fast) var(--ease-out),
1804
+ border-color var(--t-fast) var(--ease-out),
1805
+ transform var(--t-base) var(--ease-spring);
1806
+ }
1807
+
1808
+ .side-rail-tab:hover {
1809
+ background: var(--c-glass-hover);
1810
+ color: var(--c-text);
1811
+ transform: translateY(-1px);
1812
+ }
1813
+
1814
+ .side-rail-tab:focus-visible {
1815
+ outline: 2px solid var(--c-focus);
1816
+ outline-offset: 2px;
1817
+ }
1818
+
1819
+ .side-rail-tab.is-active {
1820
+ background: var(--c-accent-soft);
1821
+ color: var(--c-accent-ink);
1822
+ border-color: var(--c-accent);
1823
+ }
1824
+
1825
+ .side-rail-tab-label {
1826
+ font-family: var(--font-ui);
1827
+ font-size: 9px;
1828
+ font-weight: 600;
1829
+ letter-spacing: 0.06em;
1830
+ text-transform: uppercase;
1831
+ line-height: 1;
1832
+ }
1833
+
1834
+ /* ---- Assistance card content ---- */
1835
+ .assist-body { padding: var(--space-4); overflow-y: auto; }
1836
+
1837
+ .assist-card {
1838
+ display: flex;
1839
+ flex-direction: column;
1840
+ gap: var(--space-3);
1841
+ background: oklch(100% 0 0);
1842
+ border: 1px solid var(--c-glass-stroke);
1843
+ border-radius: var(--radius-md);
1844
+ padding: var(--space-3) var(--space-4);
1845
+ box-shadow: var(--depth-1);
1846
+ }
1847
+
1848
+ .assist-intro {
1849
+ margin: 0;
1850
+ font-family: var(--font-ui);
1851
+ font-size: 12.5px;
1852
+ line-height: 1.55;
1853
+ color: var(--c-text);
1854
+ }
1855
+
1856
+ .assist-intro em {
1857
+ font-style: normal;
1858
+ color: var(--c-accent);
1859
+ font-weight: 600;
1860
+ }
1861
+
1862
+ .assist-status {
1863
+ display: inline-flex;
1864
+ align-items: center;
1865
+ gap: 6px;
1866
+ padding: 6px 10px;
1867
+ background: oklch(94% 0.004 250);
1868
+ border-radius: var(--radius-sm);
1869
+ font-family: var(--font-ui);
1870
+ font-size: 11px;
1871
+ color: var(--c-text-mid);
1872
+ font-style: italic;
1873
+ }
1874
+
1875
+ .assist-examples-label {
1876
+ font-family: var(--font-ui);
1877
+ font-size: 10px;
1878
+ font-weight: 700;
1879
+ letter-spacing: 0.10em;
1880
+ text-transform: uppercase;
1881
+ color: var(--c-text-mid);
1882
+ margin-top: var(--space-1);
1883
+ }
1884
+
1885
+ .assist-examples {
1886
+ margin: 0;
1887
+ padding: 0 0 0 var(--space-3);
1888
+ list-style: '-- ';
1889
+ }
1890
+
1891
+ .assist-examples li {
1892
+ font-family: var(--font-ui);
1893
+ font-size: 12px;
1894
+ line-height: 1.5;
1895
+ color: var(--c-text-mid);
1896
+ padding: 4px 0;
1897
+ }
1898
+
1899
+ .assist-input-mock {
1900
+ display: flex;
1901
+ align-items: center;
1902
+ gap: var(--space-2);
1903
+ padding: 10px 12px;
1904
+ border: 1px dashed var(--c-glass-stroke-strong);
1905
+ border-radius: var(--radius-md);
1906
+ background: oklch(98% 0.003 250);
1907
+ font-family: var(--font-ui);
1908
+ font-size: 12px;
1909
+ color: var(--c-text-dim);
1910
+ margin-top: var(--space-1);
1911
+ cursor: not-allowed;
1912
+ }
1913
+
1914
+ .assist-input-mock > span:nth-of-type(1) { flex: 1; }
1915
+
1916
+ .assist-soon-tag {
1917
+ font-family: var(--font-ui);
1918
+ font-size: 9px;
1919
+ font-weight: 700;
1920
+ letter-spacing: 0.08em;
1921
+ text-transform: uppercase;
1922
+ color: var(--c-accent);
1923
+ background: var(--c-accent-soft);
1924
+ border-radius: var(--radius-sm);
1925
+ padding: 2px 6px;
1926
+ }
1927
+
1928
+ /* ---- MapLibre popup (data layer hover tooltip) ---- */
1929
+ .maplibregl-popup-content {
1930
+ background: oklch(15% 0.012 250 / 0.94) !important;
1931
+ backdrop-filter: blur(12px) saturate(140%);
1932
+ -webkit-backdrop-filter: blur(12px) saturate(140%);
1933
+ color: oklch(98% 0.003 250) !important;
1934
+ border: 1px solid oklch(100% 0 0 / 0.08);
1935
+ border-radius: var(--radius-md) !important;
1936
+ box-shadow: var(--depth-3) !important;
1937
+ font-family: var(--font-ui) !important;
1938
+ font-size: 11.5px !important;
1939
+ line-height: 1.55 !important;
1940
+ font-variant-numeric: tabular-nums;
1941
+ padding: 10px 14px !important;
1942
+ max-width: 280px;
1943
+ }
1944
+
1945
+ .maplibregl-popup-content b {
1946
+ font-weight: 600;
1947
+ color: oklch(95% 0.02 218);
1948
+ }
1949
+
1950
+ .maplibregl-popup-tip {
1951
+ border-top-color: oklch(15% 0.012 250 / 0.94) !important;
1952
+ border-bottom-color: oklch(15% 0.012 250 / 0.94) !important;
1953
+ border-left-color: oklch(15% 0.012 250 / 0.94) !important;
1954
+ border-right-color: oklch(15% 0.012 250 / 0.94) !important;
1955
+ }
1956
+
1957
+ .maplibregl-popup-close-button {
1958
+ color: oklch(80% 0 0) !important;
1959
+ font-size: 16px !important;
1960
+ padding: 2px 6px !important;
1961
+ right: 4px !important;
1962
+ top: 2px !important;
1963
+ }
1964
+
1965
+ .maplibregl-popup-close-button:hover {
1966
+ background: oklch(100% 0 0 / 0.1) !important;
1967
+ color: #fff !important;
1968
+ border-radius: var(--radius-sm);
1969
+ }
1970
+
1971
+ /* ---- Grid toggle popover (richer) ---- */
1972
+ .grid-nivel-item {
1973
+ display: flex;
1974
+ flex-direction: column;
1975
+ align-items: flex-start;
1976
+ gap: 2px;
1977
+ width: 100%;
1978
+ padding: 7px 10px;
1979
+ background: transparent;
1980
+ border: 1px solid transparent;
1981
+ border-radius: var(--radius-sm);
1982
+ font-family: var(--font-ui);
1983
+ text-align: left;
1984
+ cursor: pointer;
1985
+ transition: background var(--t-fast) var(--ease-out),
1986
+ color var(--t-fast) var(--ease-out),
1987
+ border-color var(--t-fast) var(--ease-out);
1988
+ }
1989
+
1990
+ .grid-nivel-item:hover {
1991
+ background: var(--c-glass-hover);
1992
+ }
1993
+
1994
+ .grid-nivel-item:focus-visible {
1995
+ outline: 2px solid var(--c-focus);
1996
+ outline-offset: 2px;
1997
+ }
1998
+
1999
+ .grid-nivel-item.active {
2000
+ background: var(--c-accent-soft);
2001
+ border-color: var(--c-accent);
2002
+ }
2003
+
2004
+ .grid-nivel-item-row {
2005
+ display: flex;
2006
+ align-items: center;
2007
+ gap: 8px;
2008
+ width: 100%;
2009
+ }
2010
+
2011
+ .grid-nivel-item-name {
2012
+ font-size: 11.5px;
2013
+ font-weight: 700;
2014
+ color: var(--c-text);
2015
+ letter-spacing: 0.04em;
2016
+ }
2017
+
2018
+ .grid-nivel-item.active .grid-nivel-item-name {
2019
+ color: var(--c-accent-ink);
2020
+ }
2021
+
2022
+ .grid-nivel-item-size {
2023
+ margin-left: auto;
2024
+ font-size: 10px;
2025
+ font-family: var(--font-mono);
2026
+ color: var(--c-text-mid);
2027
+ font-variant-numeric: tabular-nums;
2028
+ }
2029
+
2030
+ .grid-nivel-item-desc {
2031
+ font-size: 10.5px;
2032
+ color: var(--c-text-dim);
2033
+ line-height: 1.3;
2034
+ }
2035
+
2036
+ .grid-nivel-item.active .grid-nivel-item-desc {
2037
+ color: var(--c-accent-ink);
2038
+ opacity: 0.85;
2039
+ }
2040
+
2041
+ .grid-nivel-item.soon {
2042
+ opacity: 0.5;
2043
+ pointer-events: none;
2044
+ }
2045
+
2046
+ .grid-nivel-item.soon::after {
2047
+ content: 'soon';
2048
+ position: absolute;
2049
+ margin-left: auto;
2050
+ font-size: 9px;
2051
+ font-weight: 700;
2052
+ color: var(--c-accent);
2053
+ background: var(--c-accent-soft);
2054
+ border-radius: var(--radius-sm);
2055
+ padding: 1px 5px;
2056
+ }
2057
+
2058
+ .grid-panel--rich {
2059
+ min-width: 220px;
2060
+ padding: 6px;
2061
+ display: flex !important;
2062
+ flex-direction: column !important;
2063
+ gap: 2px !important;
2064
+ white-space: normal !important;
2065
+ }
2066
+
2067
+ .grid-panel-current {
2068
+ font-family: var(--font-ui);
2069
+ font-size: 9px;
2070
+ font-weight: 700;
2071
+ letter-spacing: 0.10em;
2072
+ text-transform: uppercase;
2073
+ color: var(--c-text-dim);
2074
+ padding: 4px 10px 2px;
2075
+ }
2076
+
2077
+ /* ---- Nav button current-state badge (e.g. "N6" on grid trigger) ---- */
2078
+ .nav-btn-badge {
2079
+ position: absolute;
2080
+ bottom: 2px;
2081
+ right: 4px;
2082
+ font-family: var(--font-ui);
2083
+ font-size: 8.5px;
2084
+ font-weight: 700;
2085
+ letter-spacing: 0.04em;
2086
+ color: var(--c-accent-ink);
2087
+ background: var(--c-accent-soft);
2088
+ border-radius: var(--radius-sm);
2089
+ padding: 1px 4px;
2090
+ line-height: 1.1;
2091
+ pointer-events: none;
2092
+ }
2093
+
2094
+ #grid-icon-btn { position: relative; }
2095
+
2096
+ /* ---- Filterable categorical legend (click swatch to toggle) ---- */
2097
+ .acc-legend-cats--filter {
2098
+ display: flex !important;
2099
+ flex-direction: column;
2100
+ gap: 3px;
2101
+ align-items: stretch;
2102
+ }
2103
+
2104
+ .acc-legend-cat--filter {
2105
+ display: flex;
2106
+ align-items: center;
2107
+ gap: 6px;
2108
+ padding: 3px 6px;
2109
+ background: transparent;
2110
+ border: 1px solid transparent;
2111
+ border-radius: var(--radius-sm);
2112
+ cursor: pointer;
2113
+ font-family: var(--font-ui);
2114
+ text-align: left;
2115
+ width: 100%;
2116
+ transition: background var(--t-fast) var(--ease-out),
2117
+ opacity var(--t-fast) var(--ease-out),
2118
+ border-color var(--t-fast) var(--ease-out);
2119
+ }
2120
+
2121
+ .acc-legend-cat--filter:hover {
2122
+ background: var(--c-glass-hover);
2123
+ border-color: var(--c-glass-stroke);
2124
+ }
2125
+
2126
+ .acc-legend-cat--filter:focus-visible {
2127
+ outline: 2px solid var(--c-focus);
2128
+ outline-offset: 1px;
2129
+ }
2130
+
2131
+ .acc-legend-cat--filter.is-off {
2132
+ opacity: 0.35;
2133
+ }
2134
+
2135
+ .acc-legend-cat--filter.is-off .acc-legend-swatch {
2136
+ filter: grayscale(0.7);
2137
+ }
2138
+
2139
+ .acc-legend-cat-label {
2140
+ font-size: 10.5px;
2141
+ color: var(--c-text);
2142
+ line-height: 1.35;
2143
+ }
2144
+
2145
+ .acc-legend-cat--filter.is-off .acc-legend-cat-label {
2146
+ text-decoration: line-through;
2147
+ color: var(--c-text-dim);
2148
+ }