@nika-js/onlymap 0.6.24 → 0.6.25

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.25 — 2026-09-02
12
+
13
+ ### Fixed
14
+ - **Basemap text labels no longer disappear after the first zoom or pan.** Since 0.6.19, place names and street labels on any interactive basemap painted once and then vanished permanently on the first camera move (or any style layout change) — recordings and static maps were unaffected, which is how it slipped through. One misplaced option handed to the basemap engine sent its label-fade math into NaN; labels now persist through every interaction. Thanks to the detailed report in #40. (#40)
15
+
11
16
  ## 0.6.24 — 2026-09-01
12
17
 
13
18
  ### Changed
@@ -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-Dha6gRi_.js"
22
+ "./lerc-CkqppWZk.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, a as Sd, z as oc, 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-iV6Y0-2_.js";
1
+ import { C as ny, L as sy, M as oy, m as ay, c as ka, a as Sd, z as oc, 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-CPf0evzb.js";
2
2
  const Cd = Math.PI / 180, gy = 180 / Math.PI;
3
3
  function em(Pe, J = 0) {
4
4
  const me = Math.min(180, Pe) * Cd;
@@ -25116,7 +25116,12 @@ class Ry {
25116
25116
  // shortens EVERY per-frame settle (no fade animation left to wait
25117
25117
  // out — real wall-clock on a renderer that settles after each camera
25118
25118
  // write) and de-risks `idle`-semantics drift across MapLibre versions.
25119
- fadeDuration: h ? 0 : void 0,
25119
+ // The key must be ABSENT when not deterministic (public issue #40): an
25120
+ // explicit `fadeDuration: undefined` survives MapLibre's own options
25121
+ // merge and clobbers its 300ms default with undefined — the symbol
25122
+ // fade math goes NaN and every basemap label paints once, then
25123
+ // vanishes permanently on the first camera move or placement update.
25124
+ ...h ? { fadeDuration: 0 } : null,
25120
25125
  center: [Me.longitude, Me.latitude],
25121
25126
  zoom: Me.zoom,
25122
25127
  pitch: Me.pitch ?? 0,
@@ -1,4 +1,4 @@
1
- import { r as p, n as d } from "./index-iV6Y0-2_.js";
1
+ import { r as p, n as d } from "./index-CPf0evzb.js";
2
2
  function g(t) {
3
3
  if (t == null) return !0;
4
4
  const e = t, n = e.id?.code;
@@ -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-iV6Y0-2_.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-iV6Y0-2_.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-CPf0evzb.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-CPf0evzb.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 };
@@ -30692,7 +30692,7 @@ const pee = {
30692
30692
  }, gee = {
30693
30693
  match: (t, e) => ["csv", "tsv"].includes(Ao(t) ?? "") || /text\/(csv|tab-separated-values)/i.test(e ?? ""),
30694
30694
  parse: async (t) => {
30695
- const [e, i, n] = await Promise.all([t.text(), import("./index-DOIREt79.js"), import("./index-DnMzsDeV.js")]), r = await n.parse(e, i.CSVLoader, { csv: { shape: "object-row-table" } });
30695
+ const [e, i, n] = await Promise.all([t.text(), import("./index-Z6ZPKbXa.js"), import("./index-31e3kTgK.js")]), r = await n.parse(e, i.CSVLoader, { csv: { shape: "object-row-table" } });
30696
30696
  return mee(r.data) ?? r.data;
30697
30697
  }
30698
30698
  };
@@ -30714,7 +30714,7 @@ const yee = {
30714
30714
  parse: async (t, e) => {
30715
30715
  t.body?.cancel().catch(() => {
30716
30716
  });
30717
- const [i, n] = await Promise.all([import("./index-DnMzsDeV.js"), import("./index-BkNNIgpU.js")]), r = t.url || e, s = /* @__PURE__ */ new Map(), o = (y) => {
30717
+ const [i, n] = await Promise.all([import("./index-31e3kTgK.js"), import("./index-D6SeYdqX.js")]), r = t.url || e, s = /* @__PURE__ */ new Map(), o = (y) => {
30718
30718
  const v = String(y);
30719
30719
  let x = s.get(v);
30720
30720
  return x || (x = BN(v), s.set(v, x)), x.then((C) => C.clone());
@@ -30727,13 +30727,13 @@ const yee = {
30727
30727
  }, bee = {
30728
30728
  match: (t, e) => Ao(t) === "kml" || /application\/vnd\.google-earth\.kml/i.test(e ?? ""),
30729
30729
  parse: async (t) => {
30730
- const [e, i, n] = await Promise.all([t.text(), import("./index-DnMzsDeV.js"), import("./index-BWyoesRG.js")]);
30730
+ const [e, i, n] = await Promise.all([t.text(), import("./index-31e3kTgK.js"), import("./index-CUnb2y9k.js")]);
30731
30731
  return Ul(await i.parse(e, n.KMLLoader));
30732
30732
  }
30733
30733
  }, vee = /* @__PURE__ */ new Set(["waypoint", "track", "route"]), _ee = {
30734
30734
  match: (t, e) => Ao(t) === "gpx" || /application\/gpx\+xml/i.test(e ?? ""),
30735
30735
  parse: async (t, e) => {
30736
- const [i, n, r] = await Promise.all([t.text(), import("./index-DnMzsDeV.js"), import("./index-BWyoesRG.js")]), o = ((await n.parse(i, r.GPXLoader)).features ?? []).map((l) => {
30736
+ const [i, n, r] = await Promise.all([t.text(), import("./index-31e3kTgK.js"), import("./index-CUnb2y9k.js")]), o = ((await n.parse(i, r.GPXLoader)).features ?? []).map((l) => {
30737
30737
  const u = l.properties?._gpxType, d = u === "trk" ? "track" : u === "rte" ? "route" : "waypoint";
30738
30738
  return { ...l, properties: { ...l.properties, _gpxKind: d } };
30739
30739
  }), a = e.split("#")[1]?.toLowerCase().replace(/s$/, "");
@@ -30766,7 +30766,7 @@ const yee = {
30766
30766
  t.arrayBuffer(),
30767
30767
  import("./index-BYbMtNVH.js"),
30768
30768
  import("./index-CgPV7QlM.js"),
30769
- import("./geoparquet-qnW51MKj.js")
30769
+ import("./geoparquet-D8-txekS.js")
30770
30770
  ]), o = new Uint8Array(i);
30771
30771
  if (o.length < 8 || o[0] !== 80 || o[1] !== 65 || o[2] !== 82 || o[3] !== 49)
30772
30772
  throw new Error(`data="${e}": not a Parquet file (missing PAR1 magic bytes).`);
@@ -68654,7 +68654,7 @@ Un({
68654
68654
  });
68655
68655
  Un({
68656
68656
  type: "COGLayer",
68657
- loadClass: () => import("./raster-BQV1SPgv.js").then((t) => t.r).then((t) => t.OmCOGLayer),
68657
+ loadClass: () => import("./raster-CXPV5d4b.js").then((t) => t.r).then((t) => t.OmCOGLayer),
68658
68658
  props: [
68659
68659
  { attr: "src", kind: "scalar", deckProp: "geotiff", type: "string", required: !0 },
68660
68660
  { attr: "min", kind: "scalar", deckProp: "rescaleMin", type: "number" },
@@ -68667,7 +68667,7 @@ Un({
68667
68667
  });
68668
68668
  Un({
68669
68669
  type: "ZarrLayer",
68670
- loadClass: () => import("./zarr-ctrpMZK7.js").then((t) => t.OmZarrLayer),
68670
+ loadClass: () => import("./zarr-9YGMeWT7.js").then((t) => t.OmZarrLayer),
68671
68671
  props: [
68672
68672
  { attr: "src", kind: "scalar", deckProp: "src", type: "string", required: !0 },
68673
68673
  { attr: "variable", kind: "scalar", deckProp: "variable", type: "string" },
@@ -81116,7 +81116,7 @@ class IU {
81116
81116
  `[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).`
81117
81117
  );
81118
81118
  else {
81119
- this.mode = "basemap", this.basemapAttr = e, import("./basemap-C1PIMe6w.js").then(({ MapLibreBasemapAdapter: s }) => {
81119
+ this.mode = "basemap", this.basemapAttr = e, import("./basemap-Da9yotkI.js").then(({ MapLibreBasemapAdapter: s }) => {
81120
81120
  this.destroyed || i !== this.rendererGeneration || (this.basemap = new s(
81121
81121
  this.parent,
81122
81122
  // this.basemapAttr, not the captured param: a style switch that
@@ -82563,7 +82563,7 @@ function VU({ layerIRs: t, core: e, mapEl: i, selection: n, history: r, featureT
82563
82563
  }
82564
82564
  };
82565
82565
  }
82566
- const zU = "0.6.24", $Ee = "https://om-api.nika.eco/v1/t", to = { endpoint: $Ee };
82566
+ const zU = "0.6.25", $Ee = "https://om-api.nika.eco/v1/t", to = { endpoint: $Ee };
82567
82567
  function XEe(t) {
82568
82568
  for (const e of Object.keys(t))
82569
82569
  to[e] = t[e];
@@ -86780,7 +86780,7 @@ async function ARe(t) {
86780
86780
  e(t);
86781
86781
  }
86782
86782
  async function NMe() {
86783
- return import("./raster-BQV1SPgv.js").then((t) => t.r);
86783
+ return import("./raster-CXPV5d4b.js").then((t) => t.r);
86784
86784
  }
86785
86785
  const pRe = {
86786
86786
  registerLayer: Un,
@@ -1,4 +1,4 @@
1
- import { ae as _t, af as Ct } from "./index-iV6Y0-2_.js";
1
+ import { ae as _t, af as Ct } from "./index-CPf0evzb.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);
@@ -1,4 +1,4 @@
1
- import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-iV6Y0-2_.js";
1
+ import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-CPf0evzb.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,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-iV6Y0-2_.js";
1
+ import { ag as Be, ah as le, ai as ce, aj as De, ak as Oe, al as ke } from "./index-CPf0evzb.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-BQV1SPgv.js";
1
+ import { C as a, D as s } from "./raster-CXPV5d4b.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-PAUd5kUg.js");
11
+ const e = await import("./LercDecode.es-DNwkPiJw.js");
12
12
  return l || (await e.load(), l = !0), e;
13
13
  }
14
14
  async function i(e, r) {
@@ -94943,7 +94943,7 @@ function SfA({ layerIRs: e, core: A, mapEl: t, selection: i, history: r, feature
94943
94943
  }
94944
94944
  };
94945
94945
  }
94946
- const bfA = "0.6.24", tue = "https://om-api.nika.eco/v1/t", PE = { endpoint: tue };
94946
+ const bfA = "0.6.25", tue = "https://om-api.nika.eco/v1/t", PE = { endpoint: tue };
94947
94947
  function iue(e) {
94948
94948
  for (const A of Object.keys(e))
94949
94949
  PE[A] = e[A];
@@ -162331,7 +162331,12 @@ class PPe {
162331
162331
  // shortens EVERY per-frame settle (no fade animation left to wait
162332
162332
  // out — real wall-clock on a renderer that settles after each camera
162333
162333
  // write) and de-risks `idle`-semantics drift across MapLibre versions.
162334
- fadeDuration: o ? 0 : void 0,
162334
+ // The key must be ABSENT when not deterministic (public issue #40): an
162335
+ // explicit `fadeDuration: undefined` survives MapLibre's own options
162336
+ // merge and clobbers its 300ms default with undefined — the symbol
162337
+ // fade math goes NaN and every basemap label paints once, then
162338
+ // vanishes permanently on the first camera move or placement update.
162339
+ ...o ? { fadeDuration: 0 } : null,
162335
162340
  center: [i.longitude, i.latitude],
162336
162341
  zoom: i.zoom,
162337
162342
  pitch: i.pitch ?? 0,
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-iV6Y0-2_.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-CPf0evzb.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-B7G3xvHk.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-CKW1mTzH.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-Dha6gRi_.js").then((e) => e.l).then((e) => e.decode));
1072
+ A.set(m.Lerc, () => import("./lerc-CkqppWZk.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-iV6Y0-2_.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-CPf0evzb.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.6.24";
8
+ export declare const LIBRARY_VERSION = "0.6.25";
@@ -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-B7G3xvHk.js";
2
- import { ap as gr } from "./index-iV6Y0-2_.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-CKW1mTzH.js";
2
+ import { ap as gr } from "./index-CPf0evzb.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.24",
3
+ "version": "0.6.25",
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.24` (the bare package URL serves `dist/onlymap.standalone.js`) — plus `<link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.6.24/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.25` (the bare package URL serves `dist/onlymap.standalone.js`) — plus `<link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.6.25/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.24/dist/onlymapjs.css">
20
- <script type="module" src="https://unpkg.com/@nika-js/onlymap@0.6.24"></script>
19
+ <link rel="stylesheet" href="https://unpkg.com/@nika-js/onlymap@0.6.25/dist/onlymapjs.css">
20
+ <script type="module" src="https://unpkg.com/@nika-js/onlymap@0.6.25"></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).