env-able 1.2.2__tar.gz → 1.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {env_able-1.2.2 → env_able-1.2.4}/.gitignore +8 -0
- {env_able-1.2.2 → env_able-1.2.4}/CHANGELOG.md +109 -0
- {env_able-1.2.2 → env_able-1.2.4}/PKG-INFO +39 -1
- {env_able-1.2.2 → env_able-1.2.4}/README.md +38 -0
- {env_able-1.2.2 → env_able-1.2.4}/pyproject.toml +1 -1
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/__init__.py +1 -1
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/index.html +24 -12
- {env_able-1.2.2 → env_able-1.2.4}/LICENSE +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/_gdal_env.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/_gdal_utils.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/_pipeline.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/_result.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/__init__.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/client.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/compliance.html +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/databricks.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/debug.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/desktop.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/edits.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/landing.html +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/project.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/server.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/splash.html +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/templates/Summary A4 Landscape.pagx +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/templates/Summary A4 Portrait.pagx +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/templates/Title Bar A4 Landscape.pagx +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/atlas/templates/Title Bar A4 Portrait.pagx +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/layout.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/morph.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/pull.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/stream.py +0 -0
- {env_able-1.2.2 → env_able-1.2.4}/src/env_able/vector.py +0 -0
|
@@ -66,3 +66,11 @@ skill/venv/
|
|
|
66
66
|
# ── Handoff artifacts ─────────────────────────────────────────────────────────
|
|
67
67
|
# The .skill is rebuilt by package_skill.py and already versioned in releases/.
|
|
68
68
|
handoff/*.skill
|
|
69
|
+
|
|
70
|
+
# ── Model binaries in the incubator ───────────────────────────────────────────
|
|
71
|
+
# Esri .dlpk study material: 1.8 GB for ~600 MB of content, because every model is present
|
|
72
|
+
# three times (extracted + .dlpk + .zip). Reference only — never part of a release.
|
|
73
|
+
incubator/DeepLearningModelsESRI/
|
|
74
|
+
*.dlpk
|
|
75
|
+
*.pth
|
|
76
|
+
*.pt
|
|
@@ -1,5 +1,114 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [1.2.4] - 2026-08-20
|
|
4
|
+
|
|
5
|
+
Two light-mode faults on the layout page, ribbon text that was below the contrast floor in both
|
|
6
|
+
themes, and the install path on a machine with no conda. The first three are library changes
|
|
7
|
+
(Atlas's own UI); the last is `preflight.py` and the handoff.
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
- **The north arrow's "N" was invisible in light mode.** `.lv-north span` used
|
|
11
|
+
`color: var(--bg-1)`, but it is printed on `.lv-page`, which is `background: white` in every
|
|
12
|
+
theme. So the label tracked the app theme while its surface did not: #111 on white in dark mode,
|
|
13
|
+
#ffffff on white in light. The arrow itself was always correct — fixed dark ink, as paper needs.
|
|
14
|
+
Now the label is too.
|
|
15
|
+
|
|
16
|
+
- **The scale bar lost its alternating pattern in light mode**, for exactly the same reason and
|
|
17
|
+
unreported: the odd segments were `var(--bg-3)`, which is #1a1a1a in dark and **#ffffff** in
|
|
18
|
+
light, so the bar became a blank white rectangle on white paper. Found by auditing every `.lv-*`
|
|
19
|
+
rule for theme tokens once the north arrow showed what the mistake looked like. Two more paper
|
|
20
|
+
labels (`.lv-legend-hdr`, `.lv-small-label`) were washed out the same way and are now fixed ink.
|
|
21
|
+
The ribbon controls that share the `lv-` prefix are app chrome and stay themed — the distinction
|
|
22
|
+
is whether a thing is printed on the page or sits beside it.
|
|
23
|
+
|
|
24
|
+
- **Ribbon text was too faint to read, in both themes.** Every resting state — the master row, the
|
|
25
|
+
sub-tabs and the group headings — used `--tx-9`. Measured against the ribbon surface that is
|
|
26
|
+
**2.43:1 in dark and 2.57:1 in light**, where text at 9–11px needs 4.5:1, so only the active tab
|
|
27
|
+
was legible and everything else read as a ghost. The resting state is now `--tx-4` (9.43:1 /
|
|
28
|
+
8.16:1), the tool buttons are `--tx-3` (11.27:1 / 10.96:1) since they are the actual verbs, the
|
|
29
|
+
active tab steps up to `--tx-1` so the hierarchy still reads, and the group headings gained
|
|
30
|
+
`font-weight: 600` — at 9px uppercase they had none at all.
|
|
31
|
+
|
|
32
|
+
- **A freshly installed conda was invisible to preflight, which then told the user to install it
|
|
33
|
+
again.** Reported from a fresh Windows machine: after installing Miniforge and re-running
|
|
34
|
+
preflight with the Miniforge Python, it still printed "There is no conda here" and repeated the
|
|
35
|
+
Miniforge instructions — the exact problem just solved.
|
|
36
|
+
|
|
37
|
+
The cause was narrower than it looked and it was self-inflicted. preflight hands the run over to
|
|
38
|
+
`<skill>/venv`, and inside a venv `sys.prefix` is the venv, which never has a `conda-meta`
|
|
39
|
+
directory. So the conda check went blind the moment the handover happened, while conda sat in
|
|
40
|
+
`sys.base_prefix` two attributes away. There is now a `_conda_prefix()` that looks at both, and
|
|
41
|
+
`_conda_exe()` finds conda beside either prefix and at the usual per-user install roots
|
|
42
|
+
(`%USERPROFILE%\miniforge3` and friends) rather than only on `PATH` — which matters because a
|
|
43
|
+
silent Miniforge install touches neither PATH nor activation.
|
|
44
|
+
|
|
45
|
+
- **preflight never actually ran `conda install gdal`.** It printed the command and stopped, so a
|
|
46
|
+
fresh Miniforge — which carries conda but not GDAL — left the user to work out an undocumented
|
|
47
|
+
step. It now runs it, into the conda prefix rather than `sys.prefix`, because conda cannot
|
|
48
|
+
install into a plain venv and the venv sees the base prefix anyway.
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
- **`--install-conda`.** On a machine with no conda and no compiler, preflight used to diagnose
|
|
52
|
+
correctly and then leave four manual steps with nothing linking them. This flag does the lot:
|
|
53
|
+
downloads Miniforge, installs it silently for the current user (no admin), installs GDAL from
|
|
54
|
+
conda-forge, then re-runs itself from the Miniforge Python so the venv inherits GDAL. Deliberately
|
|
55
|
+
**opt-in rather than default** — it fetches an executable and runs it, which should be something
|
|
56
|
+
asked for rather than something that happens. The failure message names the flag, so asking is
|
|
57
|
+
one copy-paste.
|
|
58
|
+
- **`handoff/setup.ps1`.** Unpacks the `.skill` into `~/.claude/skills/atlas/` and runs preflight
|
|
59
|
+
with `--install-conda`, in one right-click. This is the route for when Claude Code's permission
|
|
60
|
+
rules decline to unpack a skill file into their own configuration directory, which is correct
|
|
61
|
+
behaviour but leaves a user with no obvious next move if nothing else is provided.
|
|
62
|
+
|
|
63
|
+
## [1.2.3] - 2026-08-18
|
|
64
|
+
|
|
65
|
+
Skill-side only — no library code changed. The pair carries one version number, so publishing
|
|
66
|
+
this stamps a library release whose content is identical to 1.2.2 except for this note.
|
|
67
|
+
`dev/publish-patch.bat` will stamp a version above; fold this in and delete the heading.
|
|
68
|
+
|
|
69
|
+
### Fixed
|
|
70
|
+
- **GDAL on a managed Windows machine told you to do something impossible.** PyPI ships no
|
|
71
|
+
Windows wheel for GDAL, so pip compiles from source and needs a C++ compiler that a corporate
|
|
72
|
+
image usually lacks. Preflight then printed `conda install -c conda-forge gdal` — unfollowable
|
|
73
|
+
advice, on precisely the machine that reaches it, because there was no conda either.
|
|
74
|
+
|
|
75
|
+
It now inspects the machine before speaking: whether conda exists, whether some *other* Python
|
|
76
|
+
on the box can already import `osgeo`, and whether there is a compiler at all (asking `vswhere`
|
|
77
|
+
and PATH for `cl`, which is a different question from the C++ *runtime* it already checked).
|
|
78
|
+
Then it prints the one next step that applies — `conda install` where conda exists, or
|
|
79
|
+
**Miniforge** where it does not, with the no-admin silent-install flags.
|
|
80
|
+
|
|
81
|
+
- **The venv could not see a GDAL installed after it was built, and nothing said so.** The venv is
|
|
82
|
+
created with `--system-site-packages`, so it inherits from whichever Python created it: build it
|
|
83
|
+
from a Python without GDAL and it stays without GDAL however much conda you install afterwards.
|
|
84
|
+
Preflight now detects that a Python with `osgeo` exists elsewhere and prints the exact rebuild
|
|
85
|
+
command, and **`--recreate-venv`** deletes and rebuilds from the interpreter you re-run with.
|
|
86
|
+
The re-exec strips the flag so a child run can never delete the venv it is executing inside.
|
|
87
|
+
This cost a real detour to discover on a colleague's first install.
|
|
88
|
+
- **First run on a machine with nothing installed could not get past setup.** Reported from a
|
|
89
|
+
fresh PC: every document said "ask Claude to set it up", and Claude could not. Claude Code's
|
|
90
|
+
auto mode declined to execute `preflight.py` — a script it had just unpacked out of a skill
|
|
91
|
+
file — and then declined to write a wildcard `Bash(python *)` allow rule into `settings.json`
|
|
92
|
+
to get around itself. **Both refusals are correct**, and the second one especially: a skill
|
|
93
|
+
asking for broader execution rights looks exactly like a malicious skill doing the same, and
|
|
94
|
+
the classifier cannot tell this user's own code from a stranger's.
|
|
95
|
+
|
|
96
|
+
So the failure was ours, in the documentation. `INSTALL.md`, the handoff `README.md` and
|
|
97
|
+
`docs/atlas.md` now **lead with the command the user runs** — double-click
|
|
98
|
+
`scripts/setup_atlas.bat`, or one `preflight.py` line — and present "ask Claude" as the
|
|
99
|
+
convenience it is, with a plain warning that it may be refused and that the answer is never to
|
|
100
|
+
have Claude widen its own permissions. All three carry the `!`-prefixed form, which runs in the
|
|
101
|
+
user's own session so the output still lands in the conversation.
|
|
102
|
+
|
|
103
|
+
`SKILL.md` gained the matching instruction for Claude: if you are not permitted to run it, hand
|
|
104
|
+
the command over in one line and stop — do not edit `settings.json`, do not ask for a wildcard
|
|
105
|
+
allow rule, do not retry hoping it passes. On a fresh machine being blocked is the normal
|
|
106
|
+
outcome, and retrying spends the user's first five minutes with the product on nothing.
|
|
107
|
+
|
|
108
|
+
Also documented: a `.skill` is a zip, so unpacking it into `%USERPROFILE%\.claude\skills\atlas\`
|
|
109
|
+
installs it just as well as **Settings → Capabilities → Save Skill**. That is what Claude did
|
|
110
|
+
unprompted on the fresh machine, and it worked — worth writing down rather than rediscovering.
|
|
111
|
+
|
|
3
112
|
## [1.2.2] - 2026-08-17
|
|
4
113
|
|
|
5
114
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: env-able
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.4
|
|
4
4
|
Summary: AI-ready GIS toolkit for energy and subsurface workflows.
|
|
5
5
|
License: MIT
|
|
6
6
|
License-File: LICENSE
|
|
@@ -390,6 +390,44 @@ print(f"{rows:,} rows written")
|
|
|
390
390
|
## Changelog
|
|
391
391
|
### Unreleased
|
|
392
392
|
|
|
393
|
+
**Fixed**
|
|
394
|
+
- **Light mode fixes on the layout page.** The north arrow's "N" and the scale bar's alternating
|
|
395
|
+
segments used theme tokens, but the page is white paper in every theme — so both went
|
|
396
|
+
white-on-white in light mode. Paper is not themed; those now use fixed ink, along with two washed
|
|
397
|
+
out labels found by auditing the rest.
|
|
398
|
+
- **Ribbon text is readable now.** Every resting state used the lowest-contrast token: 2.43:1 in
|
|
399
|
+
dark, 2.57:1 in light, against the 4.5:1 that 9—11px text needs. Resting states move to
|
|
400
|
+
`--tx-4`, tool buttons to `--tx-3`, and the group headings gained weight.
|
|
401
|
+
- **A freshly installed conda was invisible to preflight.** Inside its own venv, `sys.prefix` has no
|
|
402
|
+
`conda-meta`, so the conda check failed while conda sat in `sys.base_prefix` — meaning a user who
|
|
403
|
+
had just installed Miniforge to fix GDAL was told to install Miniforge. preflight now checks both
|
|
404
|
+
prefixes, finds conda by path as well as on PATH, and actually runs `conda install gdal` into the
|
|
405
|
+
conda prefix instead of printing the command and stopping.
|
|
406
|
+
|
|
407
|
+
**Added**
|
|
408
|
+
- **`--install-conda`** — downloads and silently installs Miniforge (no admin rights), installs GDAL
|
|
409
|
+
from conda-forge, then re-runs from that Python so the venv inherits it. Opt-in, not default: it
|
|
410
|
+
fetches an executable and runs it.
|
|
411
|
+
- **`handoff/setup.ps1`** — unpacks the skill and sets it up in one right-click, for when Claude
|
|
412
|
+
Code declines to install a skill file into its own configuration directory.
|
|
413
|
+
|
|
414
|
+
### v1.2.3 — 2026-08-18
|
|
415
|
+
|
|
416
|
+
**Fixed**
|
|
417
|
+
- **GDAL setup on managed Windows.** PyPI has no Windows GDAL wheel, so pip builds from source and
|
|
418
|
+
fails without a compiler — and preflight then suggested conda, on a machine with no conda.
|
|
419
|
+
It now checks what the machine actually has and names the one route that works, including
|
|
420
|
+
**Miniforge** (no admin needed). New **`--recreate-venv`**, because the venv only sees packages
|
|
421
|
+
from the Python that created it, so a GDAL installed afterwards needs the venv rebuilt.
|
|
422
|
+
- **First-run setup on a clean machine.** Every document said "ask Claude to install it", and on a
|
|
423
|
+
fresh PC Claude cannot: auto mode declines to run a script just unpacked from a skill file, and
|
|
424
|
+
declines to grant itself permission to. Both refusals are right. The docs now lead with the
|
|
425
|
+
command the user runs — `scripts/setup_atlas.bat`, or one `preflight.py` line, with the
|
|
426
|
+
`!`-prefixed variant for the Claude prompt — and `SKILL.md` tells Claude to hand the command
|
|
427
|
+
over rather than retry or touch `settings.json`. No library code changed.
|
|
428
|
+
|
|
429
|
+
### v1.2.2 — 2026-08-17
|
|
430
|
+
|
|
393
431
|
**Fixed**
|
|
394
432
|
- **The README documented three operations out of seven.** `Union`, `Dissolve`, `SpatialJoin`
|
|
395
433
|
and `Near` had no entry at all — for several releases, on the page PyPI renders as the front
|
|
@@ -364,6 +364,44 @@ print(f"{rows:,} rows written")
|
|
|
364
364
|
## Changelog
|
|
365
365
|
### Unreleased
|
|
366
366
|
|
|
367
|
+
**Fixed**
|
|
368
|
+
- **Light mode fixes on the layout page.** The north arrow's "N" and the scale bar's alternating
|
|
369
|
+
segments used theme tokens, but the page is white paper in every theme — so both went
|
|
370
|
+
white-on-white in light mode. Paper is not themed; those now use fixed ink, along with two washed
|
|
371
|
+
out labels found by auditing the rest.
|
|
372
|
+
- **Ribbon text is readable now.** Every resting state used the lowest-contrast token: 2.43:1 in
|
|
373
|
+
dark, 2.57:1 in light, against the 4.5:1 that 9—11px text needs. Resting states move to
|
|
374
|
+
`--tx-4`, tool buttons to `--tx-3`, and the group headings gained weight.
|
|
375
|
+
- **A freshly installed conda was invisible to preflight.** Inside its own venv, `sys.prefix` has no
|
|
376
|
+
`conda-meta`, so the conda check failed while conda sat in `sys.base_prefix` — meaning a user who
|
|
377
|
+
had just installed Miniforge to fix GDAL was told to install Miniforge. preflight now checks both
|
|
378
|
+
prefixes, finds conda by path as well as on PATH, and actually runs `conda install gdal` into the
|
|
379
|
+
conda prefix instead of printing the command and stopping.
|
|
380
|
+
|
|
381
|
+
**Added**
|
|
382
|
+
- **`--install-conda`** — downloads and silently installs Miniforge (no admin rights), installs GDAL
|
|
383
|
+
from conda-forge, then re-runs from that Python so the venv inherits it. Opt-in, not default: it
|
|
384
|
+
fetches an executable and runs it.
|
|
385
|
+
- **`handoff/setup.ps1`** — unpacks the skill and sets it up in one right-click, for when Claude
|
|
386
|
+
Code declines to install a skill file into its own configuration directory.
|
|
387
|
+
|
|
388
|
+
### v1.2.3 — 2026-08-18
|
|
389
|
+
|
|
390
|
+
**Fixed**
|
|
391
|
+
- **GDAL setup on managed Windows.** PyPI has no Windows GDAL wheel, so pip builds from source and
|
|
392
|
+
fails without a compiler — and preflight then suggested conda, on a machine with no conda.
|
|
393
|
+
It now checks what the machine actually has and names the one route that works, including
|
|
394
|
+
**Miniforge** (no admin needed). New **`--recreate-venv`**, because the venv only sees packages
|
|
395
|
+
from the Python that created it, so a GDAL installed afterwards needs the venv rebuilt.
|
|
396
|
+
- **First-run setup on a clean machine.** Every document said "ask Claude to install it", and on a
|
|
397
|
+
fresh PC Claude cannot: auto mode declines to run a script just unpacked from a skill file, and
|
|
398
|
+
declines to grant itself permission to. Both refusals are right. The docs now lead with the
|
|
399
|
+
command the user runs — `scripts/setup_atlas.bat`, or one `preflight.py` line, with the
|
|
400
|
+
`!`-prefixed variant for the Claude prompt — and `SKILL.md` tells Claude to hand the command
|
|
401
|
+
over rather than retry or touch `settings.json`. No library code changed.
|
|
402
|
+
|
|
403
|
+
### v1.2.2 — 2026-08-17
|
|
404
|
+
|
|
367
405
|
**Fixed**
|
|
368
406
|
- **The README documented three operations out of seven.** `Union`, `Dissolve`, `SpatialJoin`
|
|
369
407
|
and `Near` had no entry at all — for several releases, on the page PyPI renders as the front
|
|
@@ -215,13 +215,17 @@
|
|
|
215
215
|
}
|
|
216
216
|
#ribbon-mark .mk-a { fill: currentColor; }
|
|
217
217
|
#ribbon-mark .mk-w { fill: #56BC2F; }
|
|
218
|
+
/* Ribbon text: the resting state is --tx-4, not --tx-9. Measured against --bg-2, tx-9 was
|
|
219
|
+
2.43:1 in dark and 2.57:1 in light, against the 4.5:1 that text this size needs — so every
|
|
220
|
+
tab except the active one was a ghost. tx-4 is 9.43:1 / 8.16:1, and the active state moves
|
|
221
|
+
to --tx-1 so "which tab am I on" still reads at a glance. */
|
|
218
222
|
.r-master {
|
|
219
223
|
display: flex; align-items: center; padding: 0 18px;
|
|
220
224
|
font-size: 11px; font-weight: 700; letter-spacing: 0.8px; text-transform: uppercase;
|
|
221
|
-
color: var(--tx-
|
|
225
|
+
color: var(--tx-4); cursor: pointer; border-bottom: 2px solid transparent; transition: color 0.15s;
|
|
222
226
|
user-select: none;
|
|
223
227
|
}
|
|
224
|
-
.r-master:hover { color: var(--tx-
|
|
228
|
+
.r-master:hover { color: var(--tx-1); }
|
|
225
229
|
.r-master.active { color: var(--tx-1); border-bottom-color: #0078d4; }
|
|
226
230
|
|
|
227
231
|
/* Sub-tab row */
|
|
@@ -234,11 +238,11 @@
|
|
|
234
238
|
.r-tab {
|
|
235
239
|
display: flex; align-items: center; padding: 0 16px;
|
|
236
240
|
font-size: 10px; font-weight: 600; letter-spacing: 0.6px; text-transform: uppercase;
|
|
237
|
-
color: var(--tx-
|
|
241
|
+
color: var(--tx-4); cursor: pointer; border-bottom: 2px solid transparent; transition: color 0.15s;
|
|
238
242
|
user-select: none;
|
|
239
243
|
}
|
|
240
|
-
.r-tab:hover { color: var(--tx-
|
|
241
|
-
.r-tab.active { color: var(--tx-
|
|
244
|
+
.r-tab:hover { color: var(--tx-1); }
|
|
245
|
+
.r-tab.active { color: var(--tx-1); border-bottom-color: #0078d4; }
|
|
242
246
|
|
|
243
247
|
#ribbon-panel { display: flex; align-items: stretch; height: 78px; padding: 0 8px; }
|
|
244
248
|
|
|
@@ -248,7 +252,10 @@
|
|
|
248
252
|
}
|
|
249
253
|
.r-group:last-child { border-right: none; }
|
|
250
254
|
.r-controls { display: flex; gap: 6px; align-items: center; }
|
|
251
|
-
.r-label {
|
|
255
|
+
.r-label {
|
|
256
|
+
font-size: 10px; font-weight: 600; color: var(--tx-4); letter-spacing: 0.8px;
|
|
257
|
+
text-transform: uppercase; text-align: center;
|
|
258
|
+
}
|
|
252
259
|
|
|
253
260
|
select.r-select {
|
|
254
261
|
background: var(--bg-2); color: var(--tx-3); border: 1px solid var(--bd-3); border-radius: 3px;
|
|
@@ -270,7 +277,7 @@
|
|
|
270
277
|
display: flex; flex-direction: column; align-items: center; justify-content: center;
|
|
271
278
|
gap: 3px; padding: 4px 10px; min-width: 54px; height: 52px;
|
|
272
279
|
background: none; border: 1px solid transparent; border-radius: 3px;
|
|
273
|
-
cursor: pointer; color: var(--tx-
|
|
280
|
+
cursor: pointer; color: var(--tx-3); font-family: inherit; font-size: 10px;
|
|
274
281
|
letter-spacing: 0.4px; text-transform: uppercase; user-select: none;
|
|
275
282
|
transition: background 0.1s, color 0.1s;
|
|
276
283
|
}
|
|
@@ -485,9 +492,12 @@
|
|
|
485
492
|
box-sizing: border-box; padding-bottom: 2px;
|
|
486
493
|
}
|
|
487
494
|
.lv-north span {
|
|
488
|
-
|
|
495
|
+
/* Fixed ink, not theme tokens. This label sits on .lv-page, which is `background: white`
|
|
496
|
+
in every theme — so `color: var(--bg-1)` meant a white N on white paper in light mode,
|
|
497
|
+
while the arrow beside it stayed correctly dark. The page is paper; paper is not themed. */
|
|
498
|
+
font-size: 9px; font-weight: 700; color: #111; line-height: 1;
|
|
489
499
|
font-family: 'Roboto', 'Segoe UI', sans-serif;
|
|
490
|
-
text-shadow: 0 0 3px
|
|
500
|
+
text-shadow: 0 0 3px #fff, 0 0 6px #fff;
|
|
491
501
|
}
|
|
492
502
|
|
|
493
503
|
.lv-scale-bar {
|
|
@@ -496,7 +506,9 @@
|
|
|
496
506
|
.lv-scale-bar > div {
|
|
497
507
|
flex: 1; height: 100%; border: 0.4px solid rgba(0,0,0,0.28);
|
|
498
508
|
}
|
|
499
|
-
.lv-
|
|
509
|
+
/* Fixed ink: these sit on .lv-page, which is white paper in every theme. Using --bg-3 made
|
|
510
|
+
the odd segments white-on-white in light mode, so the bar lost its alternating pattern. */
|
|
511
|
+
.lv-scale-bar > div:nth-child(odd) { background: #1a1a1a; }
|
|
500
512
|
.lv-scale-bar > div:nth-child(even) { background: white; }
|
|
501
513
|
|
|
502
514
|
.lv-legend {
|
|
@@ -506,13 +518,13 @@
|
|
|
506
518
|
}
|
|
507
519
|
.lv-legend-hdr {
|
|
508
520
|
display: block; padding: 5px 7px 3px;
|
|
509
|
-
font-size: 8px; color:
|
|
521
|
+
font-size: 8px; color: #444; letter-spacing: 1.5px; text-transform: uppercase;
|
|
510
522
|
font-family: 'Roboto', 'Segoe UI', sans-serif; font-weight: 600;
|
|
511
523
|
border-bottom: 0.5px solid rgba(0,0,0,0.1);
|
|
512
524
|
}
|
|
513
525
|
|
|
514
526
|
.lv-small-label {
|
|
515
|
-
position: absolute; color:
|
|
527
|
+
position: absolute; color: #333;
|
|
516
528
|
font-family: 'Roboto', 'Segoe UI', sans-serif;
|
|
517
529
|
white-space: nowrap; transform: translateY(-50%);
|
|
518
530
|
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|