@nika-js/onlymap 0.5.11 → 0.5.12

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,110 @@
1
+ # Changelog
2
+
3
+ All notable changes to `@nika-js/onlymap`, newest first. The full rationale for
4
+ each entry lives in the architecture doc's dated changelog; this is the concise,
5
+ version-by-version record.
6
+
7
+ Note: npm collapsed a few closely-spaced releases — the GPX/FlatGeobuf (0.5.4)
8
+ and GeoParquet (0.5.5) work shipped to npm together as **0.5.6**, so npm's
9
+ version list jumps 0.5.3 → 0.5.6. Each logical version is listed here regardless.
10
+
11
+ ## 0.5.12 — 2026-08-05
12
+
13
+ ### Added
14
+ - This `CHANGELOG.md` — a version-by-version record, shipped in the package and mirror.
15
+
16
+ ### Fixed
17
+ - **`highlight-color` was silently inert** with the library's own `highlighted-id` / `highlight-feature` selection: the auto-derive compiled it to a function accessor, but deck's `highlightedObjectIndex` path only honors a plain color array — selections rendered in deck's default navy. It now resolves as a constant color (array or hex), which drives both the programmatic-highlight and hover-highlight paths.
18
+
19
+ ## 0.5.11 — 2026-08-05
20
+
21
+ ### Added
22
+ - **`ZarrLayer`** — Zarr / GeoZarr raster layer: chunked N-dimensional array data (climate/weather grids, datacubes) rendered on the GPU (`@developmentseed/deck.gl-zarr` + zarrita, a lazy chunk). `variable` + `select="time=0, …"` pick the slice; a GeoZarr store georeferences itself, a plain Zarr takes manual `bounds`/`crs`/`spatial-dims`; `min`/`max`/`colormap`/`nodata` and the legend reuse the COGLayer pipeline. `src` can point at any public, CORS-enabled remote store — no server setup.
23
+
24
+ ## 0.5.10 — 2026-08-04
25
+
26
+ ### Added
27
+ - **Dashed lines** — `dash="[6, 3]"` (or SVG-style `dash="6 3"`, plus `dash-justified`) on path-stroking layers (PathLayer/GeoJsonLayer/PolygonLayer/TripsLayer), wired through deck's `PathStyleExtension`.
28
+
29
+ ## 0.5.9 — 2026-08-04
30
+
31
+ ### Fixed
32
+ - Layers now render across the antimeridian and when zoomed out past a single world copy (standalone maps set `MapView({ repeat: true })`). Previously, data near ±180° or a wide zoomed-out view went blank.
33
+
34
+ ## 0.5.8 — 2026-08-04
35
+
36
+ ### Fixed
37
+ - **COGLayer** works from a CDN / cross-origin build. Its decode worker is now inlined as a same-origin blob and asset paths are relative (`base: "./"`); previously it rendered nothing on any built page served from a CDN (present since 0.5.2).
38
+
39
+ ## 0.5.7 — 2026-08-04
40
+
41
+ ### Added
42
+ - **`ImageOverlay`** — georeferenced drone-JPEG overlay: reads GPS/EXIF + DJI-XMP, computes a flat-ground WGS84 footprint, bakes yaw/roll. `OmMap.resolveImageOverlay(fileOrUrl)` preprocesses once for persistence; explicit `bounds` reconstructs without re-reading EXIF.
43
+
44
+ ## 0.5.6 — 2026-07-31
45
+
46
+ ### Added
47
+ - **Safe date formatting** — `formatDate($time, 'datetime', 'UTC')` turns epoch-millisecond/ISO fields into readable `get-text` labels without enabling arbitrary JavaScript; the built-in filter widget shares the contract.
48
+
49
+ ## 0.5.5 — 2026-07-31
50
+
51
+ ### Added
52
+ - **GeoParquet** data format (`.parquet` / `.geoparquet`) — cloud-native columnar vector: all-Point files stay columnar, lines/polygons become GeoJSON features; requires the `geo` metadata (WKB) and CRS84/EPSG:4326.
53
+
54
+ ## 0.5.4 — 2026-07-30
55
+
56
+ ### Added
57
+ - **GPX** (`.gpx`, waypoints/tracks/routes, `#fragment` part selection) and **FlatGeobuf** (`.fgb`, cloud-native binary vector) data formats.
58
+
59
+ ## 0.5.3 — 2026-07-30
60
+
61
+ ### Added
62
+ - **`measure` widget** — geodesic distance and area with live per-segment/total labels, a metric/imperial/nautical units toggle, and an `om-measure` readout event.
63
+
64
+ ### Changed
65
+ - Validation flags a data-driven expression (`$field`, `scale()`, …) placed on a scalar attribute — the silent "invisible layer / black squares" trap.
66
+
67
+ ## 0.5.2 — 2026-07-29
68
+
69
+ ### Changed
70
+ - Made `om-map-point` (raw map click/hover capture) discoverable by task in the skill and `llms.txt`, steering agents away from poking deck.gl internals.
71
+
72
+ ## 0.5.1 — 2026-07-29
73
+
74
+ ### Added
75
+ - **Tiled layers** — `{z}/{x}/{y}` `data` templates for `TileLayer`/`MVTLayer` (raster templates get a built-in `BitmapLayer` sublayer; MVT self-renders with `get-*` accessors on decoded features).
76
+
77
+ ## 0.5.0 — 2026-07-28
78
+
79
+ ### Added
80
+ - **CityJSON / CityJSONSeq** ingestion — semantic 3D city models decoded to extruded footprints, or per-face surfaces with `?om-surfaces=1`; national coordinate grids reproject automatically.
81
+ - First-shot layout guardrail: a bare `<om-map>` with no author height still renders (injected `display:block` default + 400px floor + an actionable console warning when it still collapses).
82
+
83
+ ### Changed
84
+ - The free-tier per-layer row cap now truncates to the first rows with a dismissible on-map notice instead of hard-dropping the layer.
85
+
86
+ ## 0.4.x — 2026-07-22…27
87
+
88
+ ### Added
89
+ - Managed, adaptive **widget layout**: eight logical `position` slots, same-slot stacking with shared gaps, compact-button clustering, automatic folding into drawers on narrow maps, and the `check-layout` CLI that audits a manifest's widget layout in headless Chromium.
90
+
91
+ ### Fixed
92
+ - Post-publication review hardening across the layout and widget features.
93
+
94
+ ## 0.3.x — 2026-07-16…
95
+
96
+ ### Added
97
+ - Native **GeoTIFF / Cloud-Optimized GeoTIFF raster** layer (`COGLayer`) with `min`/`max` rescale and bundled colormaps.
98
+ - A full 3D scene from attributes: `terrain`, scene `lighting`, and canvas `snapshot()`.
99
+ - CDN-delivery posture: a single-file standalone bundle plus raw-file-CDN guidance.
100
+
101
+ ## 0.2.x
102
+
103
+ ### Added
104
+ - The v0.2 format registry: CSV/TSV (typed columns), Shapefile (+`.dbf`), KML, and Apache Arrow / GeoArrow (a columnar fast path).
105
+ - First public npm release of `@nika-js/onlymap`.
106
+
107
+ ## 0.1.x
108
+
109
+ ### Added
110
+ - The initial declarative core: `<om-map>` / `<om-layer>` / `<om-widget>` / `<om-overlay>` / `<om-behavior>`, the manifest reconcile loop, the `get-*` accessor expression compiler, and MapLibre basemaps — no build step, no imperative deck.gl code.
package/README.md CHANGED
@@ -307,5 +307,6 @@ Mapbox GL basemaps, depth-interleaved 3D compositing, globe projection, SSE tran
307
307
  | | |
308
308
  |---|---|
309
309
  | [docs/react.md](docs/react.md) · [docs/basemaps.md](docs/basemaps.md) · [docs/testing.md](docs/testing.md) · [docs/live-data.md](docs/live-data.md) · [docs/image-overlays.md](docs/image-overlays.md) · [docs/3d-assets.md](docs/3d-assets.md) · [docs/stories.md](docs/stories.md) · [docs/telemetry.md](docs/telemetry.md) | Consumer guides |
310
+ | [CHANGELOG.md](CHANGELOG.md) | Version-by-version release notes |
310
311
  | [llms.txt](llms.txt) | The agent-facing quick reference |
311
312
  | `skills/onlymapjs` | Installable LLM skill for OnlyMapJS authoring |
@@ -19,7 +19,7 @@ async function v(N = {}) {
19
19
  if (n) {
20
20
  const { createRequire: I } = await import(
21
21
  /*webpackIgnore:true*/
22
- "./lerc-Bl4IMkfo.js"
22
+ "./lerc-74-SNPeU.js"
23
23
  ).then((g) => g._);
24
24
  var O = I(import.meta.url);
25
25
  }
@@ -1,4 +1,4 @@
1
- import { C as ny, L as sy, M as oy, m as ay, c as ka, z as oc, a as Sd, G as sm, V as ly, W as cy, b as uy, g as hy, d as Vu, f as Ed, e as dy, l as py, u as fy, D as Qf, h as my } from "./index-DTRXxe7D.js";
1
+ import { C as ny, L as sy, M as oy, m as ay, c as ka, z as oc, a as Sd, G as sm, V as ly, W as cy, b as uy, g as hy, d as Vu, f as Ed, e as dy, l as py, u as fy, D as Qf, h as my } from "./index-aBiHCzy-.js";
2
2
  const Cd = Math.PI / 180, gy = 180 / Math.PI;
3
3
  function em(Pe, Q = 0) {
4
4
  const me = Math.min(180, Pe) * Cd;
@@ -1,4 +1,4 @@
1
- import { r as p, n as d } from "./index-DTRXxe7D.js";
1
+ import { r as p, n as d } from "./index-aBiHCzy-.js";
2
2
  function g(t) {
3
3
  if (t == null) return !0;
4
4
  const e = t, n = e.id?.code;
@@ -1,4 +1,4 @@
1
- import { ag as Be, ah as le, ai as ce, aj as De, ak as Oe, al as ke } from "./index-DTRXxe7D.js";
1
+ import { ag as Be, ah as le, ai as ce, aj as De, ak as Oe, al as ke } from "./index-aBiHCzy-.js";
2
2
  import { y as ve, a as he, z as G, R as J, A as ue, C as Fe, F as je, n as xe, S as Ie, E as Ne } from "./recordbatch-Bpc0uxFn.js";
3
3
  import { g as V, a as fe, b as Le, c as Ue, d as Me, e as qe, m as Ve } from "./table-accessors-CYWTzpQI.js";
4
4
  import { c as $e } from "./convert-arrow-schema-DrAihRf9.js";
@@ -1,4 +1,4 @@
1
- import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-DTRXxe7D.js";
1
+ import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-aBiHCzy-.js";
2
2
  import { w as gs, t as Hs, f as Ws, m as Qs } from "./mgrs-BY9bIvp4.js";
3
3
  import { c as Xs } from "./convert-arrow-schema-DrAihRf9.js";
4
4
  import { y as Ys, A as bt, a as Ks, z as Vs, R as Zs } from "./recordbatch-Bpc0uxFn.js";
@@ -1,5 +1,5 @@
1
- import { i as E, j as S, k as R, o as N, p as h, q as w, s as O, t as W, v as x, w as I, x as B, y as _, A as P, B as k, E as $, F as z, H as v, I as F, J as C, K as U, N as p, O as M } from "./index-DTRXxe7D.js";
2
- import { P as $e, R as ze, _ as ve, Q as Ce, S as Ue, T as Me, U as je, X as De, Y as Je, Z as qe, $ as He, a0 as Ve, a1 as Ge, a2 as Ke, a3 as Qe, a4 as Xe, a5 as Ye, a6 as Ze, a7 as et, a8 as tt, a9 as nt, aa as rt, ab as at, ac as st, ad as ot } from "./index-DTRXxe7D.js";
1
+ import { i as E, j as S, k as R, o as N, p as h, q as w, s as O, t as W, v as x, w as I, x as B, y as _, A as P, B as k, E as $, F as z, H as v, I as F, J as C, K as U, N as p, O as M } from "./index-aBiHCzy-.js";
2
+ import { P as $e, R as ze, _ as ve, Q as Ce, S as Ue, T as Me, U as je, X as De, Y as Je, Z as qe, $ as He, a0 as Ve, a1 as Ge, a2 as Ke, a3 as Qe, a4 as Xe, a5 as Ye, a6 as Ze, a7 as et, a8 as tt, a9 as nt, aa as rt, ab as at, ac as st, ad as ot } from "./index-aBiHCzy-.js";
3
3
  import { g as j, i as D } from "./table-accessors-CYWTzpQI.js";
4
4
  async function J(t, e, n = {}, r = {}) {
5
5
  const a = E(t), s = S.getWorkerFarm(n), { source: o } = n, c = { name: a, source: o };
@@ -1,4 +1,4 @@
1
- import { ae as _t, af as Ct } from "./index-DTRXxe7D.js";
1
+ import { ae as _t, af as Ct } from "./index-aBiHCzy-.js";
2
2
  function Yt(e, r, t = 2, i, o = "xy") {
3
3
  const s = r && r.length, l = s ? r[0] * t : e.length;
4
4
  let c = Ut(e, 0, l, t, !0, i && i[0], o);
@@ -31122,7 +31122,7 @@ const SQ = {
31122
31122
  }, TQ = {
31123
31123
  match: (t, e) => ["csv", "tsv"].includes(Zs(t) ?? "") || /text\/(csv|tab-separated-values)/i.test(e ?? ""),
31124
31124
  parse: async (t) => {
31125
- const [e, i, r] = await Promise.all([t.text(), import("./index-E2LluXDY.js"), import("./index-B59kDhQV.js")]), n = await r.parse(e, i.CSVLoader, { csv: { shape: "object-row-table" } });
31125
+ const [e, i, r] = await Promise.all([t.text(), import("./index-BcG3m2rF.js"), import("./index-DA_aop8u.js")]), n = await r.parse(e, i.CSVLoader, { csv: { shape: "object-row-table" } });
31126
31126
  return EQ(n.data) ?? n.data;
31127
31127
  }
31128
31128
  };
@@ -31144,7 +31144,7 @@ const RQ = {
31144
31144
  parse: async (t, e) => {
31145
31145
  t.body?.cancel().catch(() => {
31146
31146
  });
31147
- const [i, r] = await Promise.all([import("./index-B59kDhQV.js"), import("./index-DBsR-e_U.js")]), n = t.url || e, s = /* @__PURE__ */ new Map(), o = (b) => {
31147
+ const [i, r] = await Promise.all([import("./index-DA_aop8u.js"), import("./index-BoUIm-jd.js")]), n = t.url || e, s = /* @__PURE__ */ new Map(), o = (b) => {
31148
31148
  const v = String(b);
31149
31149
  let x = s.get(v);
31150
31150
  return x || (x = dP(v), s.set(v, x)), x.then((S) => S.clone());
@@ -31157,13 +31157,13 @@ const RQ = {
31157
31157
  }, MQ = {
31158
31158
  match: (t, e) => Zs(t) === "kml" || /application\/vnd\.google-earth\.kml/i.test(e ?? ""),
31159
31159
  parse: async (t) => {
31160
- const [e, i, r] = await Promise.all([t.text(), import("./index-B59kDhQV.js"), import("./index-BtVjjBff.js")]);
31160
+ const [e, i, r] = await Promise.all([t.text(), import("./index-DA_aop8u.js"), import("./index-Dc-ZLLo8.js")]);
31161
31161
  return lc(await i.parse(e, r.KMLLoader));
31162
31162
  }
31163
31163
  }, IQ = /* @__PURE__ */ new Set(["waypoint", "track", "route"]), PQ = {
31164
31164
  match: (t, e) => Zs(t) === "gpx" || /application\/gpx\+xml/i.test(e ?? ""),
31165
31165
  parse: async (t, e) => {
31166
- const [i, r, n] = await Promise.all([t.text(), import("./index-B59kDhQV.js"), import("./index-BtVjjBff.js")]), o = ((await r.parse(i, n.GPXLoader)).features ?? []).map((l) => {
31166
+ const [i, r, n] = await Promise.all([t.text(), import("./index-DA_aop8u.js"), import("./index-Dc-ZLLo8.js")]), o = ((await r.parse(i, n.GPXLoader)).features ?? []).map((l) => {
31167
31167
  const h = l.properties?._gpxType, m = h === "trk" ? "track" : h === "rte" ? "route" : "waypoint";
31168
31168
  return { ...l, properties: { ...l.properties, _gpxKind: m } };
31169
31169
  }), a = e.split("#")[1]?.toLowerCase().replace(/s$/, "");
@@ -31196,7 +31196,7 @@ const RQ = {
31196
31196
  t.arrayBuffer(),
31197
31197
  import("./index-BYbMtNVH.js"),
31198
31198
  import("./index-CgPV7QlM.js"),
31199
- import("./geoparquet-BUR3VCqE.js")
31199
+ import("./geoparquet-Dn1BypCS.js")
31200
31200
  ]), o = new Uint8Array(i);
31201
31201
  if (o.length < 8 || o[0] !== 80 || o[1] !== 65 || o[2] !== 82 || o[3] !== 49)
31202
31202
  throw new Error(`data="${e}": not a Parquet file (missing PAR1 magic bytes).`);
@@ -75389,7 +75389,7 @@ Fn({
75389
75389
  });
75390
75390
  Fn({
75391
75391
  type: "COGLayer",
75392
- loadClass: () => import("./raster-B5dIvmBr.js").then((t) => t.r).then((t) => t.OmCOGLayer),
75392
+ loadClass: () => import("./raster-VyHCbPXy.js").then((t) => t.r).then((t) => t.OmCOGLayer),
75393
75393
  props: [
75394
75394
  { attr: "src", kind: "scalar", deckProp: "geotiff", type: "string", required: !0 },
75395
75395
  { attr: "min", kind: "scalar", deckProp: "rescaleMin", type: "number" },
@@ -75402,7 +75402,7 @@ Fn({
75402
75402
  });
75403
75403
  Fn({
75404
75404
  type: "ZarrLayer",
75405
- loadClass: () => import("./zarr-DHOOSvXD.js").then((t) => t.OmZarrLayer),
75405
+ loadClass: () => import("./zarr-DddHNVim.js").then((t) => t.OmZarrLayer),
75406
75406
  props: [
75407
75407
  { attr: "src", kind: "scalar", deckProp: "src", type: "string", required: !0 },
75408
75408
  { attr: "variable", kind: "scalar", deckProp: "variable", type: "string" },
@@ -75437,6 +75437,10 @@ function bF(t, e) {
75437
75437
  if (o && "deprecatedFor" in s) continue;
75438
75438
  const a = o && "type" in s ? s : void 0, l = a?.type, h = a ? a.value : s, m = v_e(n);
75439
75439
  if (l === "accessor") {
75440
+ if (!n.startsWith("get")) {
75441
+ r.push({ attr: m, kind: "scalar", deckProp: n, type: "color", default: h });
75442
+ continue;
75443
+ }
75440
75444
  r.push({ attr: m, kind: "accessor", deckProp: n });
75441
75445
  continue;
75442
75446
  }
@@ -75593,7 +75597,7 @@ class _F {
75593
75597
  `[onlymapjs] basemap="${e}" (Mapbox GL) is not implemented yet in this version — falling back to standalone (no basemap). Use a maplibre-* basemap instead (no token required).`
75594
75598
  );
75595
75599
  else {
75596
- this.mode = "basemap", this.basemapAttr = e, import("./basemap-Q6WD4W1c.js").then(({ MapLibreBasemapAdapter: s }) => {
75600
+ this.mode = "basemap", this.basemapAttr = e, import("./basemap-kc0aQNqr.js").then(({ MapLibreBasemapAdapter: s }) => {
75597
75601
  this.destroyed || i !== this.rendererGeneration || (this.basemap = new s(
75598
75602
  this.parent,
75599
75603
  // this.basemapAttr, not the captured param: a style switch that
@@ -76452,7 +76456,7 @@ function RF({ layerIRs: t, core: e, mapEl: i, selection: r, history: n }) {
76452
76456
  }
76453
76457
  };
76454
76458
  }
76455
- const MF = "0.5.11", H_e = "https://om-api.nika.eco/v1/t", yu = { endpoint: H_e };
76459
+ const MF = "0.5.12", H_e = "https://om-api.nika.eco/v1/t", yu = { endpoint: H_e };
76456
76460
  function G_e(t) {
76457
76461
  for (const e of Object.keys(t))
76458
76462
  yu[e] = t[e];
@@ -79646,7 +79650,7 @@ function Swe() {
79646
79650
  }), xo = null, Jy = void 0, KA.clear());
79647
79651
  }
79648
79652
  async function Twe() {
79649
- return import("./raster-B5dIvmBr.js").then((t) => t.r);
79653
+ return import("./raster-VyHCbPXy.js").then((t) => t.r);
79650
79654
  }
79651
79655
  const sxe = {
79652
79656
  registerLayer: Fn,
@@ -1,4 +1,4 @@
1
- import { C as a, D as s } from "./raster-B5dIvmBr.js";
1
+ import { C as a, D as s } from "./raster-VyHCbPXy.js";
2
2
  const D = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
3
3
  __proto__: null
4
4
  }, Symbol.toStringTag, { value: "Module" }));
@@ -8,7 +8,7 @@ var t;
8
8
  })(t || (t = {}));
9
9
  let l = !1;
10
10
  async function d() {
11
- const e = await import("./LercDecode.es-DgVQ-yzp.js");
11
+ const e = await import("./LercDecode.es-C97NsRLr.js");
12
12
  return l || (await e.load(), l = !0), e;
13
13
  }
14
14
  async function i(e, r) {
@@ -87817,6 +87817,10 @@ function VhA(e, A) {
87817
87817
  if (o && "deprecatedFor" in r) continue;
87818
87818
  const n = o && "type" in r ? r : void 0, a = n?.type, c = n ? n.value : r, C = Wae(s);
87819
87819
  if (a === "accessor") {
87820
+ if (!s.startsWith("get")) {
87821
+ i.push({ attr: C, kind: "scalar", deckProp: s, type: "color", default: c });
87822
+ continue;
87823
+ }
87820
87824
  i.push({ attr: C, kind: "accessor", deckProp: s });
87821
87825
  continue;
87822
87826
  }
@@ -88832,7 +88836,7 @@ function iEA({ layerIRs: e, core: A, mapEl: t, selection: i, history: s }) {
88832
88836
  }
88833
88837
  };
88834
88838
  }
88835
- const sEA = "0.5.11", Cge = "https://om-api.nika.eco/v1/t", FS = { endpoint: Cge };
88839
+ const sEA = "0.5.12", Cge = "https://om-api.nika.eco/v1/t", FS = { endpoint: Cge };
88836
88840
  function hge(e) {
88837
88841
  for (const A of Object.keys(e))
88838
88842
  FS[A] = e[A];
package/dist/onlymapjs.js CHANGED
@@ -1,4 +1,4 @@
1
- import { aA as e, aB as r, aC as t, aD as o, aE as b, aF as i, ap as l, aG as n, aH as S, aI as E, aJ as T, aK as L, aL as g, aM as A, aN as m, aO as _, aP as p, aQ as d, aR as c, aS as y, aT as I, aU as M, aV as u, aW as D, ao as O, aX as N, aw as R, aY as f, aZ as P, a_ as F, W as h, a$ as B, b0 as C, b1 as G, b2 as U, b3 as W, b4 as v, b5 as x, b6 as w, b7 as Y, b8 as H, b9 as X, ba as k, bb as J, bc as K, bd as V, be as z, bf as Q, bg as Z, bh as $, bi as j, bj as q, bk as aa, bl as sa, bm as ea, bn as ra, bo as ta, bp as oa, bq as ba, br as ia, bs as la, bt as na, bu as Sa, bv as Ea, bw as Ta, bx as La, by as ga, bz as Aa, bA as ma, bB as _a, bC as pa, bD as da, bE as ca, bF as ya, bG as Ia, bH as Ma, bI as ua, bJ as Da, bK as Oa, bL as Na, bM as Ra, bN as fa, bO as Pa, bP as Fa, bQ as ha, bR as Ba, bS as Ca, bT as Ga, bU as Ua, bV as Wa, bW as va, bX as xa, bY as wa, bZ as Ya, b_ as Ha, b$ as Xa } from "./index-DTRXxe7D.js";
1
+ import { aA as e, aB as r, aC as t, aD as o, aE as b, aF as i, ap as l, aG as n, aH as S, aI as E, aJ as T, aK as L, aL as g, aM as A, aN as m, aO as _, aP as p, aQ as d, aR as c, aS as y, aT as I, aU as M, aV as u, aW as D, ao as O, aX as N, aw as R, aY as f, aZ as P, a_ as F, W as h, a$ as B, b0 as C, b1 as G, b2 as U, b3 as W, b4 as v, b5 as x, b6 as w, b7 as Y, b8 as H, b9 as X, ba as k, bb as J, bc as K, bd as V, be as z, bf as Q, bg as Z, bh as $, bi as j, bj as q, bk as aa, bl as sa, bm as ea, bn as ra, bo as ta, bp as oa, bq as ba, br as ia, bs as la, bt as na, bu as Sa, bv as Ea, bw as Ta, bx as La, by as ga, bz as Aa, bA as ma, bB as _a, bC as pa, bD as da, bE as ca, bF as ya, bG as Ia, bH as Ma, bI as ua, bJ as Da, bK as Oa, bL as Na, bM as Ra, bN as fa, bO as Pa, bP as Fa, bQ as ha, bR as Ba, bS as Ca, bT as Ga, bU as Ua, bV as Wa, bW as va, bX as xa, bY as wa, bZ as Ya, b_ as Ha, b$ as Xa } from "./index-aBiHCzy-.js";
2
2
  export {
3
3
  e as ALL_POSITION_VALUES,
4
4
  r as AUDIT_EXEMPTIONS,
@@ -1,4 +1,4 @@
1
- import { c as re, t as Ae, i as nt, a as Re, s as rt, C as ot, b as it, F as at, A as st, d as lt, R as he, e as ct, p as ut, m as dt, f as ht, g as pt, h as gt } from "./raster-pipeline-Dzo5h6YY.js";
1
+ import { c as re, t as Ae, i as nt, a as Re, s as rt, C as ot, b as it, F as at, A as st, d as lt, R as he, e as ct, p as ut, m as dt, f as ht, g as pt, h as gt } from "./raster-pipeline-CGQTOUjw.js";
2
2
  import pe from "./index-CW1n5LdO.js";
3
3
  function mt(e, t) {
4
4
  const n = e.length / 3, r = new Uint8ClampedArray(n * 4), o = 0, i = n, a = n * 2;
@@ -1069,7 +1069,7 @@ A.set(m.Zstd, () => import("./zstd-jXobGRcq.js").then((e) => e.decode));
1069
1069
  A.set(m.Jpeg, () => Promise.resolve(oe));
1070
1070
  A.set(m.Jpeg6, () => Promise.resolve(oe));
1071
1071
  A.set(m.Webp, () => Promise.resolve(oe));
1072
- A.set(m.Lerc, () => import("./lerc-Bl4IMkfo.js").then((e) => e.l).then((e) => e.decode));
1072
+ A.set(m.Lerc, () => import("./lerc-74-SNPeU.js").then((e) => e.l).then((e) => e.decode));
1073
1073
  async function ie(e, t, n) {
1074
1074
  const r = A.get(t);
1075
1075
  if (!r)
@@ -1,5 +1,5 @@
1
1
  import { w as ae } from "./mgrs-BY9bIvp4.js";
2
- import { am as ce, an as le, ao as ee, ap as te, aq as ue, b as he, ar as de, l as Z, as as fe, d as pe, at as me, au as ge, av as ve, aw as ne } from "./index-DTRXxe7D.js";
2
+ import { am as ce, an as le, ao as ee, ap as te, aq as ue, b as he, ar as de, l as Z, as as fe, d as pe, at as me, au as ge, av as ve, aw as ne } from "./index-aBiHCzy-.js";
3
3
  function Pe(o, e, t) {
4
4
  const { projectedCorners: n } = e, { topLeft: s, topRight: r, bottomRight: a, bottomLeft: i } = n, c = t(s[0], s[1]), u = t(r[0], r[1]), l = t(a[0], a[1]), d = t(i[0], i[1]), f = [
5
5
  c,
package/dist/version.d.ts CHANGED
@@ -5,4 +5,4 @@
5
5
  * the build rootDir, and a `define` would need repeating across vite/vitest/
6
6
  * vite-node configs.
7
7
  */
8
- export declare const LIBRARY_VERSION = "0.5.11";
8
+ export declare const LIBRARY_VERSION = "0.5.12";
@@ -1,5 +1,5 @@
1
- import { A as ur, d as lr, R as zt, e as fr, m as dr, p as St, f as hr, g as pr, h as mr } from "./raster-pipeline-Dzo5h6YY.js";
2
- import { ap as gr } from "./index-DTRXxe7D.js";
1
+ import { A as ur, d as lr, R as zt, e as fr, m as dr, p as St, f as hr, g as pr, h as mr } from "./raster-pipeline-CGQTOUjw.js";
2
+ import { ap as gr } from "./index-aBiHCzy-.js";
3
3
  import $t from "./index-CW1n5LdO.js";
4
4
  var Et;
5
5
  function h(e, t, n) {
@@ -540,7 +540,7 @@
540
540
  },
541
541
  {
542
542
  "name": "highlight-color",
543
- "description": "Accessor for deck.gl highlightColor — expression language: $field, scale(), formatDate(), arithmetic."
543
+ "description": "deck.gl highlightColor."
544
544
  },
545
545
  {
546
546
  "name": "radius-scale",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nika-js/onlymap",
3
- "version": "0.5.11",
3
+ "version": "0.5.12",
4
4
  "description": "Declarative deck.gl maps for HTML and React — interactive WebGL mapping with GeoJSON/CSV/Arrow data, MapLibre basemaps, widgets, popups, and live streams from a custom-element manifest or typed React components. TypeScript, no build step.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "publishConfig": {
@@ -97,6 +97,7 @@
97
97
  "bin/onlymapjs.mjs",
98
98
  "dist",
99
99
  "README.md",
100
+ "CHANGELOG.md",
100
101
  "LICENSE.md",
101
102
  "THIRD-PARTY-LICENSES.md",
102
103
  "docs",
@@ -23,7 +23,7 @@ Use OnlyMapJS as a declarative HTML map library. Write custom elements such as `
23
23
  </script>
24
24
  ```
25
25
 
26
- For no-build CDN pages, use the single-file standalone bundle from a raw-file CDN — `https://unpkg.com/@nika-js/onlymap@0.5.11` (the bare package URL serves `dist/onlymap.standalone.js`) — plus `<link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.5.11/dist/onlymapjs.css">`. Never a rebundling CDN (esm.sh, skypack): re-bundling duplicates the deck.gl/luma.gl runtime and every layer fails shader compilation.
26
+ For no-build CDN pages, use the single-file standalone bundle from a raw-file CDN — `https://unpkg.com/@nika-js/onlymap@0.5.12` (the bare package URL serves `dist/onlymap.standalone.js`) — plus `<link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.5.12/dist/onlymapjs.css">`. Never a rebundling CDN (esm.sh, skypack): re-bundling duplicates the deck.gl/luma.gl runtime and every layer fails shader compilation.
27
27
 
28
28
  ## React Projects
29
29
 
@@ -16,8 +16,8 @@ Vite/npm project:
16
16
  Static CDN page (raw-file CDNs only — unpkg/jsDelivr; never esm.sh or another rebundling CDN, which duplicates the WebGL runtime and breaks layer shaders):
17
17
 
18
18
  ```html
19
- <link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.5.11/dist/onlymapjs.css">
20
- <script type="module" src="https://unpkg.com/@nika-js/onlymap@0.5.11"></script>
19
+ <link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.5.12/dist/onlymapjs.css">
20
+ <script type="module" src="https://unpkg.com/@nika-js/onlymap@0.5.12"></script>
21
21
  ```
22
22
 
23
23
  Always include `onlymapjs.css` — it carries the MapLibre basemap styles and the no-JS fallback rules (`<om-fallback>` / default banner). For the fallback to work in script-disabled previews it must load without JavaScript: a real `<link rel="stylesheet">` or inlined `<style>` on no-build pages (a bundler-emitted stylesheet is fine in npm projects).
@@ -530,7 +530,7 @@ Common built-in actions:
530
530
  - `show-overlay`, `hide-overlay`
531
531
  - `show-tooltip`, `hide-tooltip`
532
532
  - `toggle-layer`
533
- - `highlight-feature`
533
+ - `highlight-feature` — sets the layer's `highlighted-id`; style the selection with `highlight-color="[220, 38, 38, 255]"` (or hex) on the `<om-layer>` — a constant color, not a `get-*` accessor
534
534
  - `zoom-to-feature`
535
535
  - `filter-layer`
536
536
  - `set-basemap` — payload `{ basemap }`; writes the `<om-map basemap>` attribute