@nika-js/onlymap 0.6.0 → 0.6.2

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.
Files changed (80) hide show
  1. package/CHANGELOG.md +63 -1
  2. package/README.md +39 -14
  3. package/THIRD-PARTY-LICENSES.md +27 -0
  4. package/dist/{LercDecode.es-fbo6h5rt.js → LercDecode.es-BOJJr6Gx.js} +1 -1
  5. package/dist/{basemap-CprSan9q.js → basemap-BofXgXxy.js} +13 -3
  6. package/dist/basemap.d.ts +10 -1
  7. package/dist/cityjson-D_V5GY8b.js +332 -0
  8. package/dist/clip-box-controller.d.ts +94 -0
  9. package/dist/clip-box.d.ts +109 -0
  10. package/dist/crs-Ciu7Xs7a.js +108 -0
  11. package/dist/crs.d.ts +50 -0
  12. package/dist/ctx.d.ts +8 -1
  13. package/dist/data-layer.d.ts +11 -3
  14. package/dist/draw-controller.d.ts +75 -1
  15. package/dist/draw.d.ts +22 -4
  16. package/dist/elements/om-map.d.ts +45 -2
  17. package/dist/elements/om-overlay.d.ts +13 -1
  18. package/dist/elements/om-widget.d.ts +4 -0
  19. package/dist/feature-colors.d.ts +41 -0
  20. package/dist/geodesy.d.ts +29 -3
  21. package/dist/{geoparquet-Bm8pfxyo.js → geoparquet-DapHATA0.js} +1 -1
  22. package/dist/html-data.d.ts +2 -2
  23. package/dist/ifc-Dc-TdSJr.js +877 -0
  24. package/dist/ifc.d.ts +406 -0
  25. package/dist/{index-Bz-rbmhj.js → index-7B-6Cbzu.js} +31619 -26565
  26. package/dist/{index-DSRIZR81.js → index-BF9iO8Tq.js} +1 -1
  27. package/dist/{index-GOwMjqm6.js → index-BmX6IId3.js} +1 -1
  28. package/dist/{index-UzmNhuS0.js → index-SPJVn_n_.js} +1 -1
  29. package/dist/{index-CCQttJzO.js → index-xmJjZxQJ.js} +2 -2
  30. package/dist/index.d.ts +13 -2
  31. package/dist/ir-snapshot.d.ts +3 -1
  32. package/dist/layer-registry.d.ts +14 -0
  33. package/dist/layers/bim-layer.d.ts +127 -0
  34. package/dist/layers/feature-mesh-layer.d.ts +288 -0
  35. package/dist/layers/gltf-scene-walk.d.ts +55 -0
  36. package/dist/layers/popup-layer.d.ts +13 -0
  37. package/dist/legend-spec.d.ts +1 -1
  38. package/dist/{lerc-CuifOkoA.js → lerc-C6k7EzSN.js} +2 -2
  39. package/dist/license.d.ts +12 -5
  40. package/dist/measure-controller.d.ts +458 -4
  41. package/dist/meshopt_simplifier-Co6uRDDA.js +370 -0
  42. package/dist/onlymap.standalone.js +57077 -50729
  43. package/dist/onlymapjs.js +72 -69
  44. package/dist/parse-manifest.d.ts +3 -0
  45. package/dist/programmatic.d.ts +39 -5
  46. package/dist/{raster-dysYIQ_k.js → raster-Cuzhibe2.js} +2 -2
  47. package/dist/{raster-pipeline-ZdCOGfqV.js → raster-pipeline-DLrnJK8y.js} +1 -1
  48. package/dist/react/om-layer.d.ts +6 -1
  49. package/dist/react/om-overlay.d.ts +9 -0
  50. package/dist/react.js +176 -169
  51. package/dist/region-export-controller.d.ts +37 -0
  52. package/dist/region-export.d.ts +56 -0
  53. package/dist/runtime-core.d.ts +260 -3
  54. package/dist/selection.d.ts +44 -1
  55. package/dist/site-placement.d.ts +107 -0
  56. package/dist/snapping.d.ts +88 -0
  57. package/dist/terrain-heightfield.d.ts +53 -0
  58. package/dist/terrain-sample.d.ts +30 -0
  59. package/dist/terrain.d.ts +6 -1
  60. package/dist/testing.d.ts +6 -2
  61. package/dist/tile3d-metadata.d.ts +185 -0
  62. package/dist/units.d.ts +27 -0
  63. package/dist/version.d.ts +1 -1
  64. package/dist/volumetrics-run.d.ts +13 -0
  65. package/dist/volumetrics-worker.d.ts +1 -0
  66. package/dist/volumetrics.d.ts +201 -0
  67. package/dist/widget-registry.d.ts +11 -0
  68. package/dist/widgets/ifc-clash.d.ts +18 -0
  69. package/dist/widgets/ifc.d.ts +41 -0
  70. package/dist/{zarr-OewK7k2K.js → zarr-CUzEX8fB.js} +79 -66
  71. package/docs/3d-assets.md +48 -0
  72. package/docs/live-data.md +9 -1
  73. package/docs/testing.md +4 -2
  74. package/llms.txt +10 -5
  75. package/onlymapjs.html-data.json +313 -2
  76. package/package.json +6 -2
  77. package/skills/onlymapjs/SKILL.md +14 -2
  78. package/skills/onlymapjs/references/react.md +2 -2
  79. package/skills/onlymapjs/references/syntax.md +314 -15
  80. package/dist/cityjson-urQeujQv.js +0 -407
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-Bz-rbmhj.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 c, aN as A, aO as p, aP as m, aQ as _, aR as d, aS as I, aT as y, aU as M, aV as u, aW as D, ao as O, aX as f, aw as N, aY as R, aZ as P, a_ as h, W as F, 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 ca, bA as Aa, bB as pa, bC as ma, bD as _a, bE as da, bF as Ia, bG as ya, bH as Ma, bI as ua, bJ as Da, bK as Oa, bL as fa, bM as Na, bN as Ra, bO as Pa, bP as ha, bQ as Fa, 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, c0 as ka, c1 as Ja, c2 as Ka } from "./index-7B-6Cbzu.js";
2
2
  export {
3
3
  e as ALL_POSITION_VALUES,
4
4
  r as AUDIT_EXEMPTIONS,
@@ -13,24 +13,24 @@ export {
13
13
  T as EDGE_TOLERANCE_PX,
14
14
  L as FOLD_HYSTERESIS_PX,
15
15
  g as FOLD_SIDES,
16
- A as GeoJsonLayer,
17
- m as IconLayer,
18
- _ as LEGACY_POSITION_ALIASES,
19
- p as LIGHTING_PRESET_NAMES,
20
- d as Layer,
21
- c as LayerExtension,
22
- y as MANAGED_SLOTS,
23
- I as MapController,
16
+ c as GeoJsonLayer,
17
+ A as IconLayer,
18
+ p as LEGACY_POSITION_ALIASES,
19
+ m as LIGHTING_PRESET_NAMES,
20
+ _ as Layer,
21
+ d as LayerExtension,
22
+ I as MANAGED_SLOTS,
23
+ y as MapController,
24
24
  M as OmMap,
25
25
  u as ScatterplotLayer,
26
26
  D as ScenegraphLayer,
27
27
  O as SimpleMeshLayer,
28
- N as Tile3DLayer,
29
- R as TileLayer,
30
- f as UNIT_SYSTEMS,
28
+ f as Tile3DLayer,
29
+ N as TileLayer,
30
+ R as UNIT_SYSTEMS,
31
31
  P as WGS84_MEAN_RADIUS_M,
32
- F as WIDGET_STYLE_KEY_NAMES,
33
- h as WebMercatorViewport,
32
+ h as WIDGET_STYLE_KEY_NAMES,
33
+ F as WebMercatorViewport,
34
34
  B as arrowTableToColumnar,
35
35
  C as asRows,
36
36
  G as auditLayout,
@@ -39,61 +39,64 @@ export {
39
39
  v as computeTimeline,
40
40
  x as configureBasemap,
41
41
  w as configureData,
42
- Y as configureLicense,
43
- H as configureTelemetry,
44
- X as descriptorToIR,
45
- k as destroySandbox,
46
- J as distanceMeters,
47
- K as evaluateInSandbox,
48
- V as foldDrawerStyle,
49
- z as foldPanelStyle,
50
- Q as foldSideForSlot,
51
- Z as foldToggleSlot,
52
- $ as foldToggleStyle,
53
- j as formatArea,
54
- q as formatLength,
55
- aa as getBasemap,
56
- sa as getEntitlements,
57
- ea as getLayerSchema,
58
- ra as getMeasureRadiusMeters,
59
- ta as getTerrain,
60
- oa as isBrowser,
61
- ba as isColumnar,
62
- ia as isStoreToken,
63
- la as loadRasterModule,
64
- na as midpoint,
65
- Sa as mountForTest,
66
- Ea as niceNumber,
67
- Ta as normalizeData,
68
- La as parseDurationMs,
69
- ga as parseTerrainAttrs,
70
- Aa as parseUnitSystem,
42
+ Y as configureIfc,
43
+ H as configureLicense,
44
+ X as configureTelemetry,
45
+ k as descriptorToIR,
46
+ J as destroySandbox,
47
+ K as distanceMeters,
48
+ V as evaluateInSandbox,
49
+ z as foldDrawerStyle,
50
+ Q as foldPanelStyle,
51
+ Z as foldSideForSlot,
52
+ $ as foldToggleSlot,
53
+ j as foldToggleStyle,
54
+ q as formatArea,
55
+ aa as formatLength,
56
+ sa as getBasemap,
57
+ ea as getEntitlements,
58
+ ra as getLayerSchema,
59
+ ta as getMeasureRadiusMeters,
60
+ oa as getTerrain,
61
+ ba as isBrowser,
62
+ ia as isColumnar,
63
+ la as isStoreToken,
64
+ na as loadIfc,
65
+ Sa as loadRasterModule,
66
+ Ea as midpoint,
67
+ Ta as mountForTest,
68
+ La as niceNumber,
69
+ ga as normalizeData,
70
+ ca as parseDurationMs,
71
+ Aa as parseTerrainAttrs,
72
+ pa as parseUnitSystem,
71
73
  ma as parseWidgetStyle,
72
74
  _a as pathLengthMeters,
73
- pa as registerAction,
74
- da as registerBasemap,
75
- ca as registerFormat,
76
- ya as registerLayer,
77
- Ia as registerSource,
78
- Ma as registerTerrain,
79
- ua as registerWidget,
80
- Da as resolveFoldBreakpointPx,
81
- Oa as resolveImageOverlay,
82
- Na as resolveLighting,
83
- Ra as resolveSlot,
84
- fa as ringAreaMeters2,
85
- Pa as ringEnclosesPole,
86
- Fa as ringPerimeterMeters,
87
- ha as rowAt,
88
- Ba as sandboxHtml,
89
- Ca as scaleBarStep,
90
- Ga as setMeasureRadiusMeters,
91
- Ua as settleLayout,
92
- Wa as shouldFoldAtWidth,
93
- va as slotContainerStyle,
94
- xa as slotLayout,
95
- wa as snapshotIR,
96
- Ya as solarAzElDegrees,
97
- Ha as validateManifest,
98
- Xa as validateManifestString
75
+ da as registerAction,
76
+ Ia as registerBasemap,
77
+ ya as registerFormat,
78
+ Ma as registerLayer,
79
+ ua as registerSource,
80
+ Da as registerTerrain,
81
+ Oa as registerWidget,
82
+ fa as resolveFoldBreakpointPx,
83
+ Na as resolveImageOverlay,
84
+ Ra as resolveLighting,
85
+ Pa as resolveSlot,
86
+ ha as ringAreaMeters2,
87
+ Fa as ringEnclosesPole,
88
+ Ba as ringPerimeterMeters,
89
+ Ca as rowAt,
90
+ Ga as sandboxHtml,
91
+ Ua as scaleBarStep,
92
+ Wa as setMeasureRadiusMeters,
93
+ va as settleLayout,
94
+ xa as shouldFoldAtWidth,
95
+ wa as slotContainerStyle,
96
+ Ya as slotLayout,
97
+ Ha as snapshotDescriptorIR,
98
+ Xa as snapshotIR,
99
+ ka as solarAzElDegrees,
100
+ Ja as validateManifest,
101
+ Ka as validateManifestString
99
102
  };
@@ -6,6 +6,7 @@
6
6
  * runtime-core.ts never does.
7
7
  */
8
8
  import type { LayerIR } from "./ir";
9
+ import { type DataTransportOwner } from "./data-layer";
9
10
  export interface ParseManifestOptions {
10
11
  /**
11
12
  * IR-snapshot mode (see ir-snapshot.ts): resolve the manifest without side
@@ -15,5 +16,7 @@ export interface ParseManifestOptions {
15
16
  * would evict a concurrently-running live map's compiled accessors).
16
17
  */
17
18
  snapshot?: boolean;
19
+ /** Controller/element identity for descriptor-owned transport lifetime. */
20
+ dataOwner?: DataTransportOwner;
18
21
  }
19
22
  export declare function parseManifest(mapEl: Element, onDataLoaded: () => void, opts?: ParseManifestOptions): LayerIR[];
@@ -25,10 +25,13 @@ import type { LayerMetaSnapshot } from "./ctx";
25
25
  import type { Selection } from "./selection";
26
26
  import type { ValidationEntry } from "./validation";
27
27
  import type { MapViewport } from "./basemap";
28
+ import { type LayerIRSnapshot } from "./ir-snapshot";
28
29
  /**
29
30
  * A layer, declared as a typed value — the programmatic mirror of one
30
- * <om-layer> element. Accessors are plain JS functions (no expression
31
- * language, no trust step first-party code is trusted by definition).
31
+ * <om-layer> element. First-party callers normally use plain JS accessor
32
+ * functions. A schema-declared accessor may alternatively be a restricted
33
+ * OnlyMap expression string; that JSON-safe form is intended for native and
34
+ * cross-process bridges and uses the same compiler as `get-*` attributes.
32
35
  */
33
36
  export interface LayerDescriptor {
34
37
  /** Stable identity — same contract as the `id` attribute. Required. */
@@ -68,7 +71,7 @@ export interface LayerDescriptor {
68
71
  * when an accessor's output changes (the deck-idiomatic contract).
69
72
  */
70
73
  updateTriggers?: Record<string, unknown>;
71
- /** deck.gl props (camelCase), accessors as plain functions passed through. */
74
+ /** deck.gl props (camelCase); accessors may be functions or restricted expression strings. */
72
75
  props?: Record<string, unknown>;
73
76
  /** Per-layer terrain mode (spec: "Terrain") — the `terrain` attribute's twin; absent = the type default. */
74
77
  terrain?: "drape" | "offset" | "off";
@@ -114,13 +117,28 @@ export interface MapControllerOptions {
114
117
  onMapPoint?: (coordinate: [number, number] | null, kind: "click" | "hover") => void;
115
118
  /** A Tile3DLayer finished loading its root tileset — the `om-tileset-load` DOM event's twin; `tileset` is the live deck `Tileset3D`. */
116
119
  onTilesetLoad?: (layerId: string, tileset: unknown) => void;
120
+ /** A `pick-features` layer decoded its property table — the DOM front-end's internal `featureTables` bookkeeping, surfaced here since `ctx.features()` depends on it (see `RuntimeCoreCallbacks.onFeatureTable`). */
121
+ onFeatureTable?: (layerId: string, rows: Record<string, unknown>[]) => void;
122
+ /** A `carriesGeoreference` layer (BIMLayer) finished loading and read its own file's georeferencing (see `RuntimeCoreCallbacks.onGeoreference`). No front end auto-applies terrain (what-you-write-is-what-you-see) — call `controller.setTerrain(...)` from here if you want a reaction. `approximatePlacement` mirrors the DOM lane's data-quality warning. */
123
+ onGeoreference?: (layerId: string, info: {
124
+ orthogonalHeight?: number;
125
+ hasFullMapConversion: boolean;
126
+ approximatePlacement: boolean;
127
+ }) => void;
117
128
  /** @internal Stable React-owned hosts that place required chrome in managed slots. */
118
129
  chromeHosts?: MandatedChromeHosts;
119
130
  }
120
131
  /** Descriptor → layer IR: the programmatic counterpart of one parse-manifest.ts loop iteration. */
121
132
  export declare function descriptorToIR(desc: LayerDescriptor, onDataLoaded: () => void): LayerIR | null;
133
+ /**
134
+ * Resolve JSON-safe/programmatic descriptors to deterministic snapshots.
135
+ * URL data is represented as an empty pending layer and is never fetched.
136
+ */
137
+ export declare function snapshotDescriptorIR(descriptors: readonly LayerDescriptor[]): LayerIRSnapshot[];
122
138
  /** rAF-batched overlay positioning hook — same flush contract as the DOM front-end's OverlayHost. */
123
- export type OverlayPositioner = (viewport: MapViewport | undefined, selection: Selection | null) => void;
139
+ export type OverlayPositioner = (viewport: MapViewport | undefined, selection: Selection | null,
140
+ /** Pointer event behind the latest pick — carries the type of an EMPTY pick (`selection` null), which the selection itself can't. */
141
+ pickType?: "hover" | "click") => void;
124
142
  /**
125
143
  * Pick stream for framework event handlers. `null` means the pointer left
126
144
  * whatever it was hovering (deck reports an empty pick) — the "hover out"
@@ -137,14 +155,19 @@ export declare class MapController {
137
155
  private core;
138
156
  private mount;
139
157
  private layerIRs;
158
+ /** Decoded property tables per pick-features layer — see RuntimeCoreCallbacks.onFeatureTable and the `<om-map>` twin's own field. */
159
+ private featureTables;
140
160
  private descriptors;
141
161
  private selection;
162
+ private lastPickType;
142
163
  private watchers;
143
164
  private pickListeners;
144
165
  private overlayFns;
145
166
  private overlayFlushPending;
146
167
  private commitPending;
147
168
  private destroyed;
169
+ private suspended;
170
+ private readonly dataOwner;
148
171
  private firstCommitDone;
149
172
  private readonly stores;
150
173
  /** Origin of the most recent viewport change FRAME — latched through the settle tracker for snapshot reads. */
@@ -207,6 +230,13 @@ export declare class MapController {
207
230
  /** Picked object, normalized to flat — same path as OmMapElement (GeoJSON properties lifted; columnar rows materialized). */
208
231
  private resolvePickedObject;
209
232
  private handleSelectionChange;
233
+ /**
234
+ * The pointer event behind the most recent pick — tracked separately from
235
+ * the selection because an EMPTY pick stores null, losing its type. What
236
+ * lets a `selectionType`-scoped overlay treat a click on empty space as a
237
+ * dismissal while ignoring hovers over empty space.
238
+ */
239
+ getLastPickType(): "hover" | "click" | undefined;
210
240
  getSelection(): Selection | null;
211
241
  /** Every hover/click pick (null = hover left) — the stream framework adapters route to per-layer onClick/onHover handlers. */
212
242
  watchPicks(listener: PickListener): () => void;
@@ -216,7 +246,7 @@ export declare class MapController {
216
246
  * flattening, watcher notification, and overlay flush are same-path by
217
247
  * construction.
218
248
  */
219
- injectPick(selection: Selection | null): void;
249
+ injectPick(selection: Selection | null, pickType?: "hover" | "click"): void;
220
250
  /**
221
251
  * Registers an rAF-batched positioner: called with the fresh viewport +
222
252
  * selection whenever either may have moved (spec: "Overlay Renderer" —
@@ -262,6 +292,10 @@ export declare class MapController {
262
292
  flyToBounds(bounds: [[number, number], [number, number]], padding?: number, opts?: CameraOptions): void;
263
293
  setView(partial: Partial<CameraState>, opts?: CameraOptions): void;
264
294
  getViewState(): CameraState;
295
+ /** Pause descriptor-owned live transports while retaining canonical map state. */
296
+ suspend(): void;
297
+ /** Reacquire current descriptor transports and reconcile after foregrounding. */
298
+ resume(): void;
265
299
  /** Projects a lng/lat through the current viewport — undefined before the viewport resolves. */
266
300
  project(lngLat: [number, number]): [number, number] | undefined;
267
301
  destroy(): void;
@@ -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-ZdCOGfqV.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-DLrnJK8y.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-CuifOkoA.js").then((e) => e.l).then((e) => e.decode));
1072
+ A.set(m.Lerc, () => import("./lerc-C6k7EzSN.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-Bz-rbmhj.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-7B-6Cbzu.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,
@@ -1,4 +1,4 @@
1
- import type { Selection } from "@nika-js/onlymap";
1
+ import type { LayerDescriptor, Selection } from "@nika-js/onlymap";
2
2
  export interface OmLayerProps {
3
3
  /** Stable identity — same contract as the `id` attribute. */
4
4
  id: string;
@@ -20,6 +20,9 @@ export interface OmLayerProps {
20
20
  filterSoftRange?: [number, number];
21
21
  filterCategoryField?: string;
22
22
  filterCategories?: unknown[];
23
+ /** Dashed path styling, mirroring `dash` / `dash-justified`. */
24
+ dash?: [number, number];
25
+ dashJustified?: boolean;
23
26
  /** Stream options for ws(s):// data URLs. `streamKey` is the upsert identity field (the `key` attribute — `key` itself is reserved by React). */
24
27
  source?: string;
25
28
  streamKey?: string;
@@ -37,4 +40,6 @@ export interface OmLayerProps {
37
40
  /** Everything else passes through as deck.gl props (camelCase): getPosition, radiusMinPixels, visible, opacity, pickable, … */
38
41
  [deckProp: string]: unknown;
39
42
  }
43
+ /** @internal Pure React-props → programmatic descriptor adapter used by parity tests. */
44
+ export declare function reactLayerPropsToDescriptor(props: OmLayerProps): LayerDescriptor;
40
45
  export declare function OmLayer(props: OmLayerProps): null;
@@ -8,6 +8,15 @@ export interface OmOverlayProps {
8
8
  anchorFrom?: "selection";
9
9
  /** Scope a selection-anchored overlay to one layer's picks — non-matching selections don't move or re-render it. */
10
10
  layer?: string;
11
+ /**
12
+ * Scope a selection-anchored overlay to one PICK TYPE. A click-opened popup
13
+ * wants `"click"`: without it, merely hovering any pickable feature drags
14
+ * the popup there and re-renders it against the hovered object. With it,
15
+ * hover picks are inert and a click on empty space still dismisses.
16
+ * `"hover"` is the mirror for hover-driven overlays. Absent: every pick
17
+ * applies.
18
+ */
19
+ selectionType?: "click" | "hover";
11
20
  visible?: boolean;
12
21
  /** Attachment point relative to the anchor (default bottom-center: content sits above the point). */
13
22
  anchorOffset?: AnchorOffset;