@nika-js/onlymap 0.6.14 → 0.6.15

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 CHANGED
@@ -8,6 +8,11 @@ Note: npm collapsed a few closely-spaced releases — the GPX/FlatGeobuf (0.5.4)
8
8
  and GeoParquet (0.5.5) work shipped to npm together as **0.5.6**, so npm's
9
9
  version list jumps 0.5.3 → 0.5.6. Each logical version is listed here regardless.
10
10
 
11
+ ## 0.6.15 — 2026-08-21
12
+
13
+ ### Changed
14
+ - **Smoother interactive dragging on complex maps.** Dragging the measure or clip-box gizmos (and any other live animation) now rebuilds the scene once per frame instead of up to ~10 times — the same visual result with a fraction of the work, which shows up as steadier frame rates and lower battery drain on layer-heavy maps, especially in mobile WebViews.
15
+
11
16
  ## 0.6.14 — 2026-08-21
12
17
 
13
18
  ### Fixed
@@ -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-CPb8TKuv.js"
22
+ "./lerc-Cw1YMyb0.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-ESUJidEA.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-Bnkk4jcp.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;
@@ -44,7 +44,7 @@ export declare class ClipBoxController {
44
44
  * `syncVisuals()` so `handleGizmoDrag` can drive this every mousemove
45
45
  * frame from its own LOCAL `grab.liveBox` without going anywhere near
46
46
  * `core.setClipBox`/DOM attributes (see that method's own doc comment).
47
- * `patchAnimatedProps` alone is cheap and frame-rate-safe; this is the
47
+ * `patchAnimatedProps` is cheap and frame-rate-safe (patches within one JS turn coalesce into a single scene rebuild); this is the
48
48
  * same reason `measure-controller.ts`'s volume gizmo redraws through
49
49
  * `patchAnimatedProps` on every drag frame instead of writing anything
50
50
  * to the DOM until the gesture actually ends.
@@ -1,4 +1,4 @@
1
- import { r as p, n as d } from "./index-ESUJidEA.js";
1
+ import { r as p, n as d } from "./index-Bnkk4jcp.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 { ae as _t, af as Ct } from "./index-ESUJidEA.js";
1
+ import { ae as _t, af as Ct } from "./index-Bnkk4jcp.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);
@@ -30670,7 +30670,7 @@ const IQ = {
30670
30670
  }, PQ = {
30671
30671
  match: (t, e) => ["csv", "tsv"].includes(fo(t) ?? "") || /text\/(csv|tab-separated-values)/i.test(e ?? ""),
30672
30672
  parse: async (t) => {
30673
- const [e, i, n] = await Promise.all([t.text(), import("./index-BFNjPrc2.js"), import("./index-mxTk4d2L.js")]), r = await n.parse(e, i.CSVLoader, { csv: { shape: "object-row-table" } });
30673
+ const [e, i, n] = await Promise.all([t.text(), import("./index-gMV11Nr5.js"), import("./index-DMRuqiXV.js")]), r = await n.parse(e, i.CSVLoader, { csv: { shape: "object-row-table" } });
30674
30674
  return BQ(r.data) ?? r.data;
30675
30675
  }
30676
30676
  };
@@ -30692,7 +30692,7 @@ const LQ = {
30692
30692
  parse: async (t, e) => {
30693
30693
  t.body?.cancel().catch(() => {
30694
30694
  });
30695
- const [i, n] = await Promise.all([import("./index-mxTk4d2L.js"), import("./index-DnsWPk6e.js")]), r = t.url || e, s = /* @__PURE__ */ new Map(), o = (y) => {
30695
+ const [i, n] = await Promise.all([import("./index-DMRuqiXV.js"), import("./index-CbHslg3u.js")]), r = t.url || e, s = /* @__PURE__ */ new Map(), o = (y) => {
30696
30696
  const v = String(y);
30697
30697
  let x = s.get(v);
30698
30698
  return x || (x = sN(v), s.set(v, x)), x.then((C) => C.clone());
@@ -30705,13 +30705,13 @@ const LQ = {
30705
30705
  }, NQ = {
30706
30706
  match: (t, e) => fo(t) === "kml" || /application\/vnd\.google-earth\.kml/i.test(e ?? ""),
30707
30707
  parse: async (t) => {
30708
- const [e, i, n] = await Promise.all([t.text(), import("./index-mxTk4d2L.js"), import("./index-D_EyImRx.js")]);
30708
+ const [e, i, n] = await Promise.all([t.text(), import("./index-DMRuqiXV.js"), import("./index-BTJy4dWy.js")]);
30709
30709
  return kl(await i.parse(e, n.KMLLoader));
30710
30710
  }
30711
30711
  }, OQ = /* @__PURE__ */ new Set(["waypoint", "track", "route"]), FQ = {
30712
30712
  match: (t, e) => fo(t) === "gpx" || /application\/gpx\+xml/i.test(e ?? ""),
30713
30713
  parse: async (t, e) => {
30714
- const [i, n, r] = await Promise.all([t.text(), import("./index-mxTk4d2L.js"), import("./index-D_EyImRx.js")]), o = ((await n.parse(i, r.GPXLoader)).features ?? []).map((l) => {
30714
+ const [i, n, r] = await Promise.all([t.text(), import("./index-DMRuqiXV.js"), import("./index-BTJy4dWy.js")]), o = ((await n.parse(i, r.GPXLoader)).features ?? []).map((l) => {
30715
30715
  const f = l.properties?._gpxType, d = f === "trk" ? "track" : f === "rte" ? "route" : "waypoint";
30716
30716
  return { ...l, properties: { ...l.properties, _gpxKind: d } };
30717
30717
  }), a = e.split("#")[1]?.toLowerCase().replace(/s$/, "");
@@ -30744,7 +30744,7 @@ const LQ = {
30744
30744
  t.arrayBuffer(),
30745
30745
  import("./index-BYbMtNVH.js"),
30746
30746
  import("./index-CgPV7QlM.js"),
30747
- import("./geoparquet-DOexUItM.js")
30747
+ import("./geoparquet-DsYXvvEo.js")
30748
30748
  ]), o = new Uint8Array(i);
30749
30749
  if (o.length < 8 || o[0] !== 80 || o[1] !== 65 || o[2] !== 82 || o[3] !== 49)
30750
30750
  throw new Error(`data="${e}": not a Parquet file (missing PAR1 magic bytes).`);
@@ -76923,7 +76923,7 @@ kn({
76923
76923
  });
76924
76924
  kn({
76925
76925
  type: "COGLayer",
76926
- loadClass: () => import("./raster-M2R7FhL7.js").then((t) => t.r).then((t) => t.OmCOGLayer),
76926
+ loadClass: () => import("./raster-BJaQlAzq.js").then((t) => t.r).then((t) => t.OmCOGLayer),
76927
76927
  props: [
76928
76928
  { attr: "src", kind: "scalar", deckProp: "geotiff", type: "string", required: !0 },
76929
76929
  { attr: "min", kind: "scalar", deckProp: "rescaleMin", type: "number" },
@@ -76936,7 +76936,7 @@ kn({
76936
76936
  });
76937
76937
  kn({
76938
76938
  type: "ZarrLayer",
76939
- loadClass: () => import("./zarr-tHnzENgX.js").then((t) => t.OmZarrLayer),
76939
+ loadClass: () => import("./zarr-C6xeWGwX.js").then((t) => t.OmZarrLayer),
76940
76940
  props: [
76941
76941
  { attr: "src", kind: "scalar", deckProp: "src", type: "string", required: !0 },
76942
76942
  { attr: "variable", kind: "scalar", deckProp: "variable", type: "string" },
@@ -77196,7 +77196,7 @@ class FCe {
77196
77196
  * `syncVisuals()` so `handleGizmoDrag` can drive this every mousemove
77197
77197
  * frame from its own LOCAL `grab.liveBox` without going anywhere near
77198
77198
  * `core.setClipBox`/DOM attributes (see that method's own doc comment).
77199
- * `patchAnimatedProps` alone is cheap and frame-rate-safe; this is the
77199
+ * `patchAnimatedProps` is cheap and frame-rate-safe (patches within one JS turn coalesce into a single scene rebuild); this is the
77200
77200
  * same reason `measure-controller.ts`'s volume gizmo redraws through
77201
77201
  * `patchAnimatedProps` on every drag frame instead of writing anything
77202
77202
  * to the DOM until the gesture actually ends.
@@ -80580,6 +80580,9 @@ class j6 {
80580
80580
  /** layerId → effect-driven plain-prop patches (the per-frame channel). */
80581
80581
  animatedProps = /* @__PURE__ */ new Map();
80582
80582
  headless;
80583
+ /** Animated-props flush coalescing (see patchAnimatedProps): patches since the last rebuild / a microtask flush already queued. */
80584
+ animatedDirty = !1;
80585
+ animatedFlushQueued = !1;
80583
80586
  destroyed = !1;
80584
80587
  viewState;
80585
80588
  callbacks;
@@ -80733,7 +80736,7 @@ class j6 {
80733
80736
  `[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).`
80734
80737
  );
80735
80738
  else {
80736
- this.mode = "basemap", this.basemapAttr = e, import("./basemap-KDsE62YN.js").then(({ MapLibreBasemapAdapter: s }) => {
80739
+ this.mode = "basemap", this.basemapAttr = e, import("./basemap-DQeUv-pk.js").then(({ MapLibreBasemapAdapter: s }) => {
80737
80740
  this.destroyed || i !== this.rendererGeneration || (this.basemap = new s(
80738
80741
  this.parent,
80739
80742
  // this.basemapAttr, not the captured param: a style switch that
@@ -81216,6 +81219,7 @@ class j6 {
81216
81219
  return this.renderedLayerIds = n, this.terrain && r.unshift($Se(this.terrain)), r;
81217
81220
  }
81218
81221
  applyLayers() {
81222
+ this.animatedDirty = !1;
81219
81223
  const e = this.buildLayers();
81220
81224
  if (this.mode === "basemap") {
81221
81225
  this.basemap ? this.basemap.setLayers(e) : this.pendingLayers = e;
@@ -81232,7 +81236,9 @@ class j6 {
81232
81236
  * internal getter) with no renderer to drive.
81233
81237
  */
81234
81238
  patchAnimatedProps(e, i) {
81235
- i === null ? this.animatedProps.delete(e) : this.animatedProps.set(e, { ...this.animatedProps.get(e), ...i }), this.headless || this.applyLayers();
81239
+ i === null ? this.animatedProps.delete(e) : this.animatedProps.set(e, { ...this.animatedProps.get(e), ...i }), !this.headless && (this.animatedDirty = !0, !this.animatedFlushQueued && (this.animatedFlushQueued = !0, queueMicrotask(() => {
81240
+ this.animatedFlushQueued = !1, this.animatedDirty && !this.destroyed && this.applyLayers();
81241
+ })));
81236
81242
  }
81237
81243
  clearAnimatedProps() {
81238
81244
  this.animatedProps.size !== 0 && (this.animatedProps.clear(), this.headless || this.applyLayers());
@@ -81996,7 +82002,7 @@ function Q6({ layerIRs: t, core: e, mapEl: i, selection: n, history: r, featureT
81996
82002
  }
81997
82003
  };
81998
82004
  }
81999
- const eU = "0.6.14", zTe = "https://om-api.nika.eco/v1/t", pf = { endpoint: zTe };
82005
+ const eU = "0.6.15", zTe = "https://om-api.nika.eco/v1/t", pf = { endpoint: zTe };
82000
82006
  function GTe(t) {
82001
82007
  for (const e of Object.keys(t))
82002
82008
  pf[e] = t[e];
@@ -85852,7 +85858,7 @@ async function oMe(t) {
85852
85858
  e(t);
85853
85859
  }
85854
85860
  async function T3e() {
85855
- return import("./raster-M2R7FhL7.js").then((t) => t.r);
85861
+ return import("./raster-BJaQlAzq.js").then((t) => t.r);
85856
85862
  }
85857
85863
  const aMe = {
85858
85864
  registerLayer: kn,
@@ -1,4 +1,4 @@
1
- import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-ESUJidEA.js";
1
+ import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-Bnkk4jcp.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-ESUJidEA.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-ESUJidEA.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-Bnkk4jcp.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-Bnkk4jcp.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 { ag as Be, ah as le, ai as ce, aj as De, ak as Oe, al as ke } from "./index-ESUJidEA.js";
1
+ import { ag as Be, ah as le, ai as ce, aj as De, ak as Oe, al as ke } from "./index-Bnkk4jcp.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 { C as a, D as s } from "./raster-M2R7FhL7.js";
1
+ import { C as a, D as s } from "./raster-BJaQlAzq.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-Bqk5xyNu.js");
11
+ const e = await import("./LercDecode.es-BWmtr6fp.js");
12
12
  return l || (await e.load(), l = !0), e;
13
13
  }
14
14
  async function i(e, r) {
@@ -89576,7 +89576,7 @@ class Ohe {
89576
89576
  * `syncVisuals()` so `handleGizmoDrag` can drive this every mousemove
89577
89577
  * frame from its own LOCAL `grab.liveBox` without going anywhere near
89578
89578
  * `core.setClipBox`/DOM attributes (see that method's own doc comment).
89579
- * `patchAnimatedProps` alone is cheap and frame-rate-safe; this is the
89579
+ * `patchAnimatedProps` is cheap and frame-rate-safe (patches within one JS turn coalesce into a single scene rebuild); this is the
89580
89580
  * same reason `measure-controller.ts`'s volume gizmo redraws through
89581
89581
  * `patchAnimatedProps` on every drag frame instead of writing anything
89582
89582
  * to the DOM until the gesture actually ends.
@@ -92960,6 +92960,9 @@ class MdA {
92960
92960
  /** layerId → effect-driven plain-prop patches (the per-frame channel). */
92961
92961
  animatedProps = /* @__PURE__ */ new Map();
92962
92962
  headless;
92963
+ /** Animated-props flush coalescing (see patchAnimatedProps): patches since the last rebuild / a microtask flush already queued. */
92964
+ animatedDirty = !1;
92965
+ animatedFlushQueued = !1;
92963
92966
  destroyed = !1;
92964
92967
  viewState;
92965
92968
  callbacks;
@@ -93596,6 +93599,7 @@ class MdA {
93596
93599
  return this.renderedLayerIds = i, this.terrain && r.unshift(tCe(this.terrain)), r;
93597
93600
  }
93598
93601
  applyLayers() {
93602
+ this.animatedDirty = !1;
93599
93603
  const A = this.buildLayers();
93600
93604
  if (this.mode === "basemap") {
93601
93605
  this.basemap ? this.basemap.setLayers(A) : this.pendingLayers = A;
@@ -93612,7 +93616,9 @@ class MdA {
93612
93616
  * internal getter) with no renderer to drive.
93613
93617
  */
93614
93618
  patchAnimatedProps(A, t) {
93615
- t === null ? this.animatedProps.delete(A) : this.animatedProps.set(A, { ...this.animatedProps.get(A), ...t }), this.headless || this.applyLayers();
93619
+ t === null ? this.animatedProps.delete(A) : this.animatedProps.set(A, { ...this.animatedProps.get(A), ...t }), !this.headless && (this.animatedDirty = !0, !this.animatedFlushQueued && (this.animatedFlushQueued = !0, queueMicrotask(() => {
93620
+ this.animatedFlushQueued = !1, this.animatedDirty && !this.destroyed && this.applyLayers();
93621
+ })));
93616
93622
  }
93617
93623
  clearAnimatedProps() {
93618
93624
  this.animatedProps.size !== 0 && (this.animatedProps.clear(), this.headless || this.applyLayers());
@@ -94376,7 +94382,7 @@ function TdA({ layerIRs: e, core: A, mapEl: t, selection: i, history: r, feature
94376
94382
  }
94377
94383
  };
94378
94384
  }
94379
- const PdA = "0.6.14", ZCe = "https://om-api.nika.eco/v1/t", Qb = { endpoint: ZCe };
94385
+ const PdA = "0.6.15", ZCe = "https://om-api.nika.eco/v1/t", Qb = { endpoint: ZCe };
94380
94386
  function XCe(e) {
94381
94387
  for (const A of Object.keys(e))
94382
94388
  Qb[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 g, aJ as c, aK as E, aL as L, aM as T, aN as A, aO as d, aP as p, aQ as m, aR as _, aS as I, aT as u, aU as M, aV as y, aW as D, ao as O, aX as R, aw as f, aY as N, aZ as P, a_ as h, W as F, a$ as B, b0 as C, b1 as v, b2 as G, b3 as U, b4 as W, b5 as w, b6 as x, 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 ga, bw as ca, bx as Ea, by as La, bz as Ta, bA as Aa, bB as da, bC as pa, bD as ma, bE as _a, bF as Ia, bG as ua, bH as Ma, bI as ya, bJ as Da, bK as Oa, bL as Ra, bM as fa, bN as Na, bO as Pa, bP as ha, bQ as Fa, bR as Ba, bS as Ca, bT as va, bU as Ga, bV as Ua, bW as Wa, bX as wa, bY as xa, bZ as Ya, b_ as Ha, b$ as Xa, c0 as ka, c1 as Ja, c2 as Ka, c3 as Va, c4 as za, c5 as Qa, c6 as Za } from "./index-ESUJidEA.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 g, aJ as c, aK as E, aL as L, aM as T, aN as A, aO as d, aP as p, aQ as m, aR as _, aS as I, aT as u, aU as M, aV as y, aW as D, ao as O, aX as R, aw as f, aY as N, aZ as P, a_ as h, W as F, a$ as B, b0 as C, b1 as v, b2 as G, b3 as U, b4 as W, b5 as w, b6 as x, 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 ga, bw as ca, bx as Ea, by as La, bz as Ta, bA as Aa, bB as da, bC as pa, bD as ma, bE as _a, bF as Ia, bG as ua, bH as Ma, bI as ya, bJ as Da, bK as Oa, bL as Ra, bM as fa, bN as Na, bO as Pa, bP as ha, bQ as Fa, bR as Ba, bS as Ca, bT as va, bU as Ga, bV as Ua, bW as Wa, bX as wa, bY as xa, bZ as Ya, b_ as Ha, b$ as Xa, c0 as ka, c1 as Ja, c2 as Ka, c3 as Va, c4 as za, c5 as Qa, c6 as Za } from "./index-Bnkk4jcp.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-Csa7n5SZ.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-BCVaME9y.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-CPb8TKuv.js").then((e) => e.l).then((e) => e.decode));
1072
+ A.set(m.Lerc, () => import("./lerc-Cw1YMyb0.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-ESUJidEA.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-Bnkk4jcp.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,
@@ -275,6 +275,9 @@ export declare class RuntimeCore {
275
275
  /** layerId → effect-driven plain-prop patches (the per-frame channel). */
276
276
  private animatedProps;
277
277
  private headless?;
278
+ /** Animated-props flush coalescing (see patchAnimatedProps): patches since the last rebuild / a microtask flush already queued. */
279
+ private animatedDirty;
280
+ private animatedFlushQueued;
278
281
  private destroyed;
279
282
  private viewState;
280
283
  private callbacks;
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.6.14";
8
+ export declare const LIBRARY_VERSION = "0.6.15";
@@ -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-Csa7n5SZ.js";
2
- import { ap as gr } from "./index-ESUJidEA.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-BCVaME9y.js";
2
+ import { ap as gr } from "./index-Bnkk4jcp.js";
3
3
  import $t from "./index-CW1n5LdO.js";
4
4
  var Et;
5
5
  function h(e, t, n) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nika-js/onlymap",
3
- "version": "0.6.14",
3
+ "version": "0.6.15",
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": {
@@ -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.6.14` (the bare package URL serves `dist/onlymap.standalone.js`) — plus `<link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.6.14/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.6.15` (the bare package URL serves `dist/onlymap.standalone.js`) — plus `<link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.6.15/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.6.14/dist/onlymapjs.css">
20
- <script type="module" src="https://unpkg.com/@nika-js/onlymap@0.6.14"></script>
19
+ <link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.6.15/dist/onlymapjs.css">
20
+ <script type="module" src="https://unpkg.com/@nika-js/onlymap@0.6.15"></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).