@nika-js/onlymap 0.6.2 → 0.6.7

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 (48) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +9 -7
  3. package/dist/{LercDecode.es-BOJJr6Gx.js → LercDecode.es-BzboSQ2U.js} +1 -1
  4. package/dist/attribute-resolution.d.ts +84 -6
  5. package/dist/{basemap-BofXgXxy.js → basemap-pWXbFGjp.js} +1 -1
  6. package/dist/ctx.d.ts +3 -1
  7. package/dist/data-layer.d.ts +26 -4
  8. package/dist/declarative-filter.d.ts +14 -5
  9. package/dist/elements/om-map.d.ts +1 -0
  10. package/dist/geodesy.d.ts +3 -0
  11. package/dist/{geoparquet-DapHATA0.js → geoparquet-BPl1T2Or.js} +1 -1
  12. package/dist/{index-SPJVn_n_.js → index-B9a6f006.js} +1 -1
  13. package/dist/{index-BF9iO8Tq.js → index-Bgx3CJru.js} +1 -1
  14. package/dist/{index-7B-6Cbzu.js → index-CAuq7wRs.js} +17565 -16782
  15. package/dist/{index-xmJjZxQJ.js → index-CqsQz9Bp.js} +2 -2
  16. package/dist/{index-BmX6IId3.js → index-iVMlGZS9.js} +1 -1
  17. package/dist/index.d.ts +10 -2
  18. package/dist/ir-snapshot.d.ts +2 -1
  19. package/dist/ir.d.ts +47 -9
  20. package/dist/layer-registry.d.ts +7 -0
  21. package/dist/layers/marker-icons.d.ts +19 -0
  22. package/dist/layers/route-layer.d.ts +71 -0
  23. package/dist/layers/tracking-layer.d.ts +52 -0
  24. package/dist/{lerc-C6k7EzSN.js → lerc-BgzbFAc7.js} +2 -2
  25. package/dist/license.d.ts +13 -2
  26. package/dist/measure-controller.d.ts +28 -4
  27. package/dist/onlymap.standalone.js +50150 -49367
  28. package/dist/onlymapjs.js +65 -61
  29. package/dist/programmatic.d.ts +24 -4
  30. package/dist/providers.d.ts +48 -0
  31. package/dist/{raster-Cuzhibe2.js → raster-DtyMY54Z.js} +2 -2
  32. package/dist/{raster-pipeline-DLrnJK8y.js → raster-pipeline-BmHRCUEb.js} +1 -1
  33. package/dist/react/om-layer.d.ts +6 -2
  34. package/dist/react.js +54 -50
  35. package/dist/tracking-interpolation.d.ts +22 -0
  36. package/dist/version.d.ts +1 -1
  37. package/dist/{zarr-CUzEX8fB.js → zarr-CTpFZo_m.js} +2 -2
  38. package/docs/3d-assets.md +1 -1
  39. package/docs/live-data.md +17 -0
  40. package/docs/react.md +9 -1
  41. package/docs/routing.md +92 -0
  42. package/llms.txt +6 -5
  43. package/onlymapjs.html-data.json +61 -3
  44. package/package.json +1 -1
  45. package/skills/onlymapjs/SKILL.md +6 -4
  46. package/skills/onlymapjs/references/react.md +1 -1
  47. package/skills/onlymapjs/references/syntax.md +83 -5
  48. package/skills/onlymapjs/references/testing.md +6 -0
@@ -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-7B-6Cbzu.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-7B-6Cbzu.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-CAuq7wRs.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-CAuq7wRs.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 { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-7B-6Cbzu.js";
1
+ import { ak as Bt, ax as Xt, ay as Yt, az as Us } from "./index-CAuq7wRs.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";
package/dist/index.d.ts CHANGED
@@ -32,6 +32,7 @@ import { registerWidget } from "./widget-registry";
32
32
  import { registerAction } from "./actions";
33
33
  import { registerBasemap, configureBasemap } from "./basemap-registry";
34
34
  import { registerTerrain } from "./terrain";
35
+ import { registerRoutingProvider } from "./providers";
35
36
  import { configureTelemetry } from "./telemetry";
36
37
  import { configureLicense } from "./license";
37
38
  import { validateManifestString } from "./validation";
@@ -40,7 +41,7 @@ import { snapshotDescriptorIR } from "./programmatic";
40
41
  import { resolveImageOverlay } from "./image-overlay";
41
42
  export { registerLayer, getLayerSchema } from "./layer-registry";
42
43
  export type { LayerSchema, PropDescriptor, PropKind } from "./layer-registry";
43
- export type { LayerIR, LayerMeta, LayerFilter, LayerData, ColumnarData, LayerAssetState } from "./ir";
44
+ export type { LayerIR, LayerMeta, LayerFilter, LayerCategoryFilter, LayerData, ColumnarData, LayerAssetState } from "./ir";
44
45
  export { resolveImageOverlay, DRONE_SENSOR_DATABASE } from "./image-overlay";
45
46
  export type { ImageBounds, DroneExifData, DroneImageMetadata, DroneSensorDimensions, ResolveImageOverlayOptions, ResolvedImageOverlay, } from "./image-overlay";
46
47
  export { isColumnar, asRows, rowAt, normalizeData, arrowTableToColumnar } from "./data-layer";
@@ -58,6 +59,8 @@ export { LIGHTING_PRESET_NAMES, resolveLighting, solarAzElDegrees } from "./scen
58
59
  export type { LightingIR, LightingOptions, LightingPresetName } from "./scene-lighting";
59
60
  export { registerTerrain, getTerrain, parseTerrainAttrs } from "./terrain";
60
61
  export type { TerrainPreset, TerrainIR, ElevationDecoder, LayerTerrainMode } from "./terrain";
62
+ export { registerRoutingProvider, getRoutingProvider, lineStringLengthMeters } from "./providers";
63
+ export type { RoutingProvider, Route, RouteRequest, RouteWaypoint, RouteLeg } from "./providers";
61
64
  export type { SnapshotOptions } from "./snapshot";
62
65
  export { configureTelemetry } from "./telemetry";
63
66
  export type { IfcModel, IfcFeature, LoadIfcOptions } from "./ifc";
@@ -72,6 +75,10 @@ export type { Entitlements, LicenseIdentity } from "./license";
72
75
  export type { RuntimeContext } from "./ctx";
73
76
  export { MapController, descriptorToIR, snapshotDescriptorIR } from "./programmatic";
74
77
  export type { LayerDescriptor, MapControllerOptions, CameraState, OverlayPositioner, PickListener } from "./programmatic";
78
+ /** Multi-dimension GPU filter entry (spec: "Filtering") — `LayerDescriptor.filterFields`' element type, and the React adapter's `OmLayer` twin. */
79
+ export type { LayerFilterFieldSpec, LayerCategoryFilterFieldSpec } from "./attribute-resolution";
80
+ export { releaseDataOwner } from "./data-layer";
81
+ export type { DataTransportOwner } from "./data-layer";
75
82
  export { MANAGED_SLOTS, LEGACY_POSITION_ALIASES, ALL_POSITION_VALUES, FOLD_SIDES, resolveSlot, slotLayout, slotContainerStyle, foldSideForSlot, foldToggleSlot, foldDrawerStyle, foldPanelStyle, foldToggleStyle, resolveFoldBreakpointPx, shouldFoldAtWidth, DEFAULT_FOLD_BREAKPOINT_PX, FOLD_HYSTERESIS_PX, parseWidgetStyle, WIDGET_STYLE_KEY_NAMES, } from "./widget-layout";
76
83
  export type { ManagedSlot, WidgetSlot, FoldSide, SlotLayout, WidgetStyleParse } from "./widget-layout";
77
84
  export { auditLayout, settleLayout, DEFAULT_AUDIT_WIDTHS, EDGE_TOLERANCE_PX, AUDIT_EXEMPTIONS } from "./layout-audit";
@@ -85,7 +92,7 @@ export type { MapViewport } from "./basemap";
85
92
  export { registerAction } from "./actions";
86
93
  export { distanceMeters, pathLengthMeters, ringAreaMeters2, ringPerimeterMeters, ringEnclosesPole, midpoint, getMeasureRadiusMeters, setMeasureRadiusMeters, WGS84_MEAN_RADIUS_M, type LngLat, } from "./geodesy";
87
94
  export { formatLength, formatArea, niceNumber, scaleBarStep, parseUnitSystem, UNIT_SYSTEMS, type UnitSystem } from "./units";
88
- export type { MeasureMode, MeasureReadout } from "./measure-controller";
95
+ export type { MeasureMode, MeasureReadout, ProfilePoint } from "./measure-controller";
89
96
  export type { ActionHandler } from "./actions";
90
97
  export { validateManifestString, validateManifest } from "./validation";
91
98
  export type { ValidationResult, ValidationEntry } from "./validation";
@@ -123,6 +130,7 @@ export declare const OmMap: {
123
130
  registerSource: typeof registerSource;
124
131
  registerBasemap: typeof registerBasemap;
125
132
  registerTerrain: typeof registerTerrain;
133
+ registerRoutingProvider: typeof registerRoutingProvider;
126
134
  configureBasemap: typeof configureBasemap;
127
135
  configureData: typeof configureData;
128
136
  configureTelemetry: typeof configureTelemetry;
@@ -22,7 +22,7 @@
22
22
  * (snapshots are side-effect-free; a URL-backed layer shows the same empty
23
23
  * placeholder the live Q6 pre-fetch state has).
24
24
  */
25
- import type { LayerIR, LayerMeta, LayerFilter, LayerAssetState } from "./ir";
25
+ import type { LayerIR, LayerMeta, LayerFilter, LayerCategoryFilter, LayerAssetState } from "./ir";
26
26
  import type { Shape } from "./expr";
27
27
  export interface LayerIRSnapshot {
28
28
  id: string;
@@ -38,6 +38,7 @@ export interface LayerIRSnapshot {
38
38
  rows: number;
39
39
  meta: LayerMeta;
40
40
  filter?: LayerFilter;
41
+ categoryFilter?: LayerCategoryFilter;
41
42
  /** Per-layer terrain mode when authored (`terrain` attribute) — absent = the type default. */
42
43
  terrain?: "drape" | "offset" | "off";
43
44
  /**
package/dist/ir.d.ts CHANGED
@@ -30,18 +30,40 @@ export interface ColumnarData {
30
30
  /** A layer's resolved data: row objects (flat/geojson) or columns (columnar). */
31
31
  export type LayerData = unknown[] | ColumnarData;
32
32
  /**
33
- * The layer's active declarative filter (spec: "Filtering"), single-field
34
- * numeric only for now (`filterSize`/`categorySize` fixed at 1 — the spec's
35
- * own example is single-field; the "up to 4 dimensions" multi-field case is
36
- * a documented future extension, not implemented here). Carried on the IR
37
- * (not just `meta`) because `ctx.stats`/`ctx.dataInViewport` apply it
38
- * CPU-side by default (the "coherence rule") — it's operationally read, not
39
- * just display metadata.
33
+ * One numeric dimension of the layer's active declarative filter (spec:
34
+ * "Filtering"). Carried on the IR (not just `meta`) because `ctx.stats`/
35
+ * `ctx.dataInViewport` apply it CPU-side by default (the "coherence rule")
36
+ * it's operationally read, not just display metadata.
40
37
  */
41
- export interface LayerFilter {
38
+ export interface LayerFilterDimension {
42
39
  field: string;
43
40
  range: [number, number];
41
+ softRange?: [number, number];
44
42
  }
43
+ /**
44
+ * The layer's active declarative filter — one entry per numeric dimension,
45
+ * up to 4 (deck.gl `DataFilterExtension`'s own `filterSize` ceiling; a
46
+ * GLSL compile-time define, verified against the extension's own source —
47
+ * see `applyFilterWiring`'s doc comment). The single-field case (the
48
+ * original, still-primary authoring path via `filter-field`/`filter-range`)
49
+ * is simply a one-entry array — every consumer treats N=1 the same as
50
+ * N>1, no special-casing.
51
+ */
52
+ export type LayerFilter = LayerFilterDimension[];
53
+ /**
54
+ * One categorical dimension of the layer's active declarative filter — a
55
+ * discrete keep-list rather than a numeric range (deck.gl's `categorySize`
56
+ * slot, a SEPARATE bitmask mechanism from `filterSize`'s range test; values
57
+ * may be string or number). Carried on the IR for the same reason
58
+ * `LayerFilterDimension` is: `ctx.stats`/`ctx.dataInViewport` apply it
59
+ * CPU-side by default too.
60
+ */
61
+ export interface LayerCategoryFilterDimension {
62
+ field: string;
63
+ categories: (string | number)[];
64
+ }
65
+ /** The layer's active categorical filter — one entry per dimension, up to 4 (categorySize's own ceiling). Independent of, and combinable with, the numeric `LayerFilter`. */
66
+ export type LayerCategoryFilter = LayerCategoryFilterDimension[];
45
67
  /** Async non-row asset resolution carried by the IR (currently ImageOverlay EXIF only). */
46
68
  export interface LayerAssetState {
47
69
  kind: "image-overlay";
@@ -67,6 +89,20 @@ export interface LayerIR {
67
89
  shape: Shape;
68
90
  /** The raw `data` URL attribute, if any (ctx.layers metadata) — inline-JSON layers have none. */
69
91
  dataUrl?: string;
92
+ /**
93
+ * The authored live-source options that select this layer's transport
94
+ * (spec: "Live & Streaming Data"), retained on the IR rather than consumed
95
+ * by `getData` alone. Both front-ends populate it, so anything asking "is
96
+ * this layer polling?" reads resolved state instead of querying the DOM —
97
+ * which only the HTML lane has (see telemetry's per-layer snapshot).
98
+ * Absent when the layer declares none.
99
+ */
100
+ live?: {
101
+ source?: string;
102
+ key?: string;
103
+ flush?: string;
104
+ refresh?: string;
105
+ };
70
106
  /**
71
107
  * A `{z}/{x}/{y}` tile URL template (spec: "Tiled layers"): deck's `data`
72
108
  * for TileLayer/MVTLayer. When set, the renderer passes THIS as `data`
@@ -81,8 +117,10 @@ export interface LayerIR {
81
117
  */
82
118
  asset?: LayerAssetState;
83
119
  meta: LayerMeta;
84
- /** The layer's active declarative filter, if `filter-field`/`filter-range` are present. */
120
+ /** The layer's active declarative filter (one entry per dimension), if `filter-field`/`filter-fields` are present. */
85
121
  filter?: LayerFilter;
122
+ /** The layer's active categorical filter (one entry per dimension), if `filter-category`/`filter-category-fields` are present. Independent of `filter`. */
123
+ categoryFilter?: LayerCategoryFilter;
86
124
  /**
87
125
  * Per-layer terrain mode (spec: "Terrain") — the `terrain` attribute:
88
126
  * drape onto / sit on / ignore an active terrain surface. Absent = the
@@ -64,6 +64,13 @@ export interface LayerSchema {
64
64
  * one-source-of-truth reasoning as `carriesTileset`.
65
65
  */
66
66
  carriesGeoreference?: boolean;
67
+ /**
68
+ * Resolves its own route (spec: "Routing & Tracking") and supports the
69
+ * `onRouteResolved` deck prop — the runtime injects that hook only into
70
+ * these types (`Route`), same one-source-of-truth reasoning as
71
+ * `carriesTileset`. Drives `follow="fit-route"` camera behavior.
72
+ */
73
+ carriesRoute?: boolean;
67
74
  /** Layer-owned async asset resolver; keeps parse/runtime branching registry-driven rather than name-matched. */
68
75
  assetResolver?: "image-overlay";
69
76
  }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Self-contained default marker icons (data: URIs) for Route/Tracking layers
3
+ * — no network fetch, no bundled asset, matching the library's own "sensible
4
+ * defaults" pillar (an author gets a working map with zero icon setup).
5
+ * Deliberately tiny/inline rather than a shared icon-atlas system: deck.gl's
6
+ * `IconLayer.getIcon` accepts a full per-object descriptor (`{url, width,
7
+ * height}`) and auto-packs it, so no `iconAtlas`/`iconMapping` is needed for
8
+ * this small a set.
9
+ */
10
+ export interface IconDescriptor {
11
+ url: string;
12
+ width: number;
13
+ height: number;
14
+ anchorY?: number;
15
+ }
16
+ /** A dropped-pin marker (origin/destination waypoints on a `Route` layer). Anchored at its point (bottom of the pin), not its center. */
17
+ export declare function pinIcon(color: string): IconDescriptor;
18
+ /** A directional arrow marker (a `Tracking` layer's moving entity) — points "up" (north) at angle 0, rotated per-row via `getAngle`. */
19
+ export declare function arrowIcon(color: string): IconDescriptor;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * RouteLayer — the Route half of "Routing & Tracking" (spec, v0.6.7).
3
+ * Expands into ordinary `PathLayer`/`IconLayer` instances, exactly the way
4
+ * `BIMLayer` expands into a `Tile3DLayer` — see that file's own doc comment
5
+ * for the pattern this mirrors (a `CompositeLayer` wrapping real deck.gl
6
+ * layers, not a new rendering path).
7
+ *
8
+ * Two authoring paths, mutually exclusive (`geometry` wins if both are
9
+ * present — validation.ts warns on the ambiguity):
10
+ *
11
+ * - `geometry` — an already-computed GeoJSON LineString. Resolves
12
+ * SYNCHRONOUSLY, no provider round-trip. Distance is derived locally
13
+ * (great-circle length); duration is left `NaN` — no speed model exists
14
+ * client-side, and a provider-computed route supplies its own.
15
+ * - `provider` + `origin` + `destination` (+ optional `waypoints`,
16
+ * `profile`) — resolves ASYNCHRONOUSLY via `RoutingProvider.computeRoute`
17
+ * (mirrors BIMLayer's `loadModel`: state, staleness checks, abort on
18
+ * supersede/teardown, `raiseError` on failure — see that file).
19
+ *
20
+ * `onRouteResolved` is injected by the runtime (`schema.carriesRoute`, the
21
+ * `onTilesetLoad`/`carriesTileset` precedent in runtime-core.ts) once a
22
+ * route is ready — that's what drives `follow="fit-route"` camera behavior.
23
+ * RouteLayer itself never touches the camera; camera side effects belong to
24
+ * runtime-core, not a deck.gl layer subclass.
25
+ */
26
+ import { CompositeLayer } from "@deck.gl/core";
27
+ import type { Layer } from "@deck.gl/core";
28
+ import { type Route, type RouteWaypoint } from "../providers";
29
+ export interface RouteBounds {
30
+ bounds: [[number, number], [number, number]];
31
+ }
32
+ type LineStringGeometry = {
33
+ type: "LineString";
34
+ coordinates: [number, number][];
35
+ };
36
+ export interface RouteLayerProps {
37
+ geometry?: LineStringGeometry | string;
38
+ origin?: [number, number] | string;
39
+ destination?: [number, number] | string;
40
+ waypoints?: RouteWaypoint[] | string;
41
+ provider?: string;
42
+ profile?: "driving" | "walking" | "cycling";
43
+ color?: string;
44
+ casingColor?: string;
45
+ /** Injected by runtime-core.ts (schema.carriesRoute) — never authored. */
46
+ onRouteResolved?: (route: Route & RouteBounds) => void;
47
+ [prop: string]: unknown;
48
+ }
49
+ export declare class RouteLayer extends CompositeLayer<RouteLayerProps> {
50
+ static layerName: string;
51
+ static defaultProps: {
52
+ color: string;
53
+ casingColor: string;
54
+ profile: string;
55
+ };
56
+ state: {
57
+ route: Route | null;
58
+ loadingFor: string | null;
59
+ destroyed: boolean;
60
+ abort: AbortController | null;
61
+ };
62
+ initializeState(): void;
63
+ updateState({ props, oldProps }: {
64
+ props: RouteLayerProps;
65
+ oldProps: RouteLayerProps;
66
+ }): void;
67
+ finalizeState(): void;
68
+ private resolveRoute;
69
+ renderLayers(): Layer[];
70
+ }
71
+ export {};
@@ -0,0 +1,52 @@
1
+ /**
2
+ * TrackingLayer — the Tracking half of "Routing & Tracking" (spec, v0.6.7).
3
+ * Wraps a single `IconLayer`: renders the CURRENT (or smoothly interpolating)
4
+ * position of one tracked entity, with bearing-derived rotation.
5
+ *
6
+ * v1 scope: ONE tracked entity per layer — the LAST row in `data` is "the"
7
+ * position. Fleet/multi-entity tracking on one layer is a documented
8
+ * follow-on, not built here (mirrors this codebase's own "v1 supports one,
9
+ * generalizing to many is a later tier" precedent — e.g. BIM model
10
+ * federation's "multiple co-registered models... NOT implemented").
11
+ *
12
+ * Position data arrives through the ORDINARY `data`/`source` mechanism (the
13
+ * design doc is explicit: a tracking feed is "a thin registerSource decoder
14
+ * over existing machinery", not a new subscription abstraction) —
15
+ * TrackingLayer itself knows nothing about where the data came from, same as
16
+ * any other curated layer reading `data`.
17
+ *
18
+ * Interpolation between updates and camera-follow are driven EXTERNALLY by
19
+ * `src/tracking-interpolation.ts` via the per-frame channel
20
+ * (`RuntimeCore.patchAnimatedProps`) — never inside this class, matching how
21
+ * RouteLayer never touches the camera itself either. When
22
+ * `interpolatedPosition` is present (injected only, never authored) it
23
+ * overrides the raw data-derived position; the un-interpolated fallback
24
+ * keeps this layer fully functional — just not smooth — even before the
25
+ * first interpolation frame lands (e.g. the very first fix, headless mode,
26
+ * or `prefers-reduced-motion`).
27
+ */
28
+ import { CompositeLayer } from "@deck.gl/core";
29
+ import type { Layer } from "@deck.gl/core";
30
+ export interface TrackingLayerProps {
31
+ data?: readonly unknown[];
32
+ getPosition?: (d: unknown, info: {
33
+ index: number;
34
+ data: readonly unknown[];
35
+ }) => [number, number];
36
+ bearingField?: string;
37
+ color?: string;
38
+ size?: number;
39
+ /** Injected by src/tracking-interpolation.ts — never authored. */
40
+ interpolatedPosition?: [number, number];
41
+ interpolatedBearing?: number;
42
+ [prop: string]: unknown;
43
+ }
44
+ export declare class TrackingLayer extends CompositeLayer<TrackingLayerProps> {
45
+ static layerName: string;
46
+ static defaultProps: {
47
+ bearingField: string;
48
+ color: string;
49
+ size: number;
50
+ };
51
+ renderLayers(): Layer[];
52
+ }
@@ -1,4 +1,4 @@
1
- import { C as a, D as s } from "./raster-Cuzhibe2.js";
1
+ import { C as a, D as s } from "./raster-DtyMY54Z.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-BOJJr6Gx.js");
11
+ const e = await import("./LercDecode.es-BzboSQ2U.js");
12
12
  return l || (await e.load(), l = !0), e;
13
13
  }
14
14
  async function i(e, r) {
package/dist/license.d.ts CHANGED
@@ -13,8 +13,19 @@
13
13
  * dev/tools/sign-license.mjs (private key never in the repo). Keys are
14
14
  * PUBLISHABLE, deployment-restricted via a web `domains` claim and/or a
15
15
  * packaged-app `apps` claim — they MAY appear in markup, unlike data
16
- * credentials. Native shells must obtain app identity from trusted platform
17
- * APIs, never from bridge JSON controlled by page code.
16
+ * credentials.
17
+ *
18
+ * Both claims are deployment SCOPING, not access control: keys are
19
+ * publishable by design, and commercial-use enforcement is LEGAL rather than
20
+ * technical (see LICENSE.md) — `keyId` is what makes a deployment
21
+ * attributable. `appId` reaches this module as a plain argument whose
22
+ * provenance it cannot verify, so a native host MUST source it from trusted
23
+ * platform build metadata and never from page script or bridge JSON.
24
+ *
25
+ * NOTE: this header is emitted verbatim into the published dist/license.d.ts.
26
+ * Keep it to the contract a consumer needs. Comparative analysis of how far
27
+ * each claim can be trusted, and why no origin heuristic guards the app
28
+ * claim, lives in agent-map-library-architecture.md (internal, not shipped).
18
29
  *
19
30
  * Decisions (spec, RESOLVED 2026-07-14; REVISED 2026-08-05): free tier =
20
31
  * 5 layers / 25k rows per layer / 20 MB fetch; any paid plan hides the
@@ -15,6 +15,26 @@ import { type UnitSystem } from "./units";
15
15
  import { type BaseSurfaceKind } from "./volumetrics";
16
16
  import type { RuntimeCore, GizmoDragEvent } from "./runtime-core";
17
17
  export type MeasureMode = "distance" | "area" | "volume";
18
+ /**
19
+ * One elevation-profile sample on the `om-measure` readout.
20
+ *
21
+ * `vertexIndex` is present ONLY on samples that ARE one of the drawn
22
+ * footprint's own vertices (0-based, in draw order; the closing sample back at
23
+ * the start carries the last index). Interpolated samples omit it entirely, so
24
+ * a Vega-Lite chart marks the real corners with `isValid(datum.vertexIndex)` —
25
+ * see `dev/examples/features/widgets/measure-cut-fill-volume.html`. Without
26
+ * this a reader cannot tell WHICH point on the map a place in the chart
27
+ * corresponds to; vertex 0 is the leftmost sample, and the measure tool marks
28
+ * that same point on the map with a "Start" badge.
29
+ */
30
+ export interface ProfilePoint {
31
+ /** Distance along the footprint's perimeter from the first vertex, in meters. */
32
+ x: number;
33
+ /** Terrain elevation at this sample, in meters. */
34
+ y: number;
35
+ /** 0-based index into the drawn footprint's vertices — present only on real vertices. */
36
+ vertexIndex?: number;
37
+ }
18
38
  /** Live readout dispatched as the `om-measure` event `detail` and consumed by the widget. */
19
39
  export interface MeasureReadout {
20
40
  mode: MeasureMode | null;
@@ -175,10 +195,7 @@ export interface MeasureReadout {
175
195
  * `dynamic-chart` widget reading it sees "not a real array" and leaves
176
196
  * whatever it last rendered alone — that's the whole "freeze" mechanism.
177
197
  */
178
- profileSeries?: Array<{
179
- x: number;
180
- y: number;
181
- }> | null;
198
+ profileSeries?: ProfilePoint[] | null;
182
199
  }
183
200
  export declare class MeasureController {
184
201
  private readonly mapEl;
@@ -489,6 +506,13 @@ export declare class MeasureController {
489
506
  * pair is live on commit/drag.
490
507
  */
491
508
  private ensureVolumeLayers;
509
+ /**
510
+ * Numbered vertex badges for the profile, in draw order. Only meaningful
511
+ * with `profile` on (nothing else references vertex order), and only once a
512
+ * ring exists — so it clears itself in every other state rather than
513
+ * lingering on a deleted footprint.
514
+ */
515
+ private buildProfileVertexMarkers;
492
516
  private removeLayers;
493
517
  }
494
518
  export declare function getMeasureController(mapEl: Element, core: RuntimeCore): MeasureController;