@deepfuture/dui-map 1.1.0

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 (50) hide show
  1. package/README.md +214 -0
  2. package/cluster-layer/index.d.ts +2 -0
  3. package/cluster-layer/index.js +2 -0
  4. package/cluster-layer/map-cluster-layer.d.ts +53 -0
  5. package/cluster-layer/map-cluster-layer.js +337 -0
  6. package/controls/index.d.ts +2 -0
  7. package/controls/index.js +2 -0
  8. package/controls/map-controls.d.ts +37 -0
  9. package/controls/map-controls.js +344 -0
  10. package/heatmap/index.d.ts +2 -0
  11. package/heatmap/index.js +2 -0
  12. package/heatmap/map-heatmap.d.ts +39 -0
  13. package/heatmap/map-heatmap.js +330 -0
  14. package/index.d.ts +10 -0
  15. package/index.js +9 -0
  16. package/map/index.d.ts +5 -0
  17. package/map/index.js +3 -0
  18. package/map/map-context.d.ts +8 -0
  19. package/map/map-context.js +2 -0
  20. package/map/map.d.ts +120 -0
  21. package/map/map.js +628 -0
  22. package/marker/index.d.ts +9 -0
  23. package/marker/index.js +7 -0
  24. package/marker/map-marker-content.d.ts +20 -0
  25. package/marker/map-marker-content.js +135 -0
  26. package/marker/map-marker-label.d.ts +21 -0
  27. package/marker/map-marker-label.js +126 -0
  28. package/marker/map-marker-popup.d.ts +25 -0
  29. package/marker/map-marker-popup.js +158 -0
  30. package/marker/map-marker-tooltip.d.ts +22 -0
  31. package/marker/map-marker-tooltip.js +159 -0
  32. package/marker/map-marker.d.ts +48 -0
  33. package/marker/map-marker.js +220 -0
  34. package/marker/marker-context.d.ts +8 -0
  35. package/marker/marker-context.js +2 -0
  36. package/package.json +70 -0
  37. package/popup/index.d.ts +2 -0
  38. package/popup/index.js +2 -0
  39. package/popup/map-popup.d.ts +29 -0
  40. package/popup/map-popup.js +184 -0
  41. package/region/index.d.ts +2 -0
  42. package/region/index.js +2 -0
  43. package/region/map-region.d.ts +41 -0
  44. package/region/map-region.js +276 -0
  45. package/route/index.d.ts +2 -0
  46. package/route/index.js +2 -0
  47. package/route/map-route.d.ts +33 -0
  48. package/route/map-route.js +245 -0
  49. package/theme/map-theme.d.ts +16 -0
  50. package/theme/map-theme.js +233 -0
@@ -0,0 +1,344 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ var __setFunctionName = (this && this.__setFunctionName) || function (f, name, prefix) {
36
+ if (typeof name === "symbol") name = name.description ? "[".concat(name.description, "]") : "";
37
+ return Object.defineProperty(f, "name", { configurable: true, value: prefix ? "".concat(prefix, " ", name) : name });
38
+ };
39
+ import { css, html, LitElement, nothing } from "lit";
40
+ import { property, state } from "lit/decorators.js";
41
+ import { consume } from "@lit/context";
42
+ import { base } from "@deepfuture/dui-primitives/core/base";
43
+ import { customEvent } from "@deepfuture/dui-primitives/core/event";
44
+ import { mapControlsThemeStyles } from "../theme/map-theme.js";
45
+ import { mapContext } from "../map/map-context.js";
46
+ /** Fired when the user's geolocation is found. */
47
+ export const locateEvent = customEvent("dui-map-locate", { bubbles: true, composed: true });
48
+ /** Structural styles only. */
49
+ const styles = css `
50
+ :host {
51
+ display: block;
52
+ position: absolute;
53
+ z-index: 10;
54
+ }
55
+
56
+ :host([position="top-left"]) { top: var(--space-2, 8px); left: var(--space-2, 8px); }
57
+ :host([position="top-right"]) { top: var(--space-2, 8px); right: var(--space-2, 8px); }
58
+ :host([position="bottom-left"]) { bottom: var(--space-2, 8px); left: var(--space-2, 8px); }
59
+ :host,
60
+ :host([position=""]),
61
+ :host([position="bottom-right"]) { bottom: var(--space-8, 32px); right: var(--space-2, 8px); }
62
+
63
+ [part="root"] {
64
+ display: flex;
65
+ flex-direction: column;
66
+ gap: var(--space-1_5, 6px);
67
+ }
68
+
69
+ [part="group"] {
70
+ display: flex;
71
+ flex-direction: column;
72
+ overflow: hidden;
73
+ }
74
+
75
+ [part="control-button"] {
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ width: 32px;
80
+ height: 32px;
81
+ border: none;
82
+ background: none;
83
+ padding: 0;
84
+ margin: 0;
85
+ cursor: pointer;
86
+ font: inherit;
87
+ color: inherit;
88
+ }
89
+
90
+ [part="control-button"]:disabled {
91
+ pointer-events: none;
92
+ cursor: not-allowed;
93
+ opacity: 0.5;
94
+ }
95
+
96
+ /* Compass SVG */
97
+ .compass-svg {
98
+ width: 20px;
99
+ height: 20px;
100
+ transition: transform 200ms;
101
+ transform-style: preserve-3d;
102
+ }
103
+
104
+ /* Icon SVGs */
105
+ .icon-svg {
106
+ width: 16px;
107
+ height: 16px;
108
+ }
109
+ `;
110
+ /**
111
+ * `<dui-map-controls>` — Zoom, compass, locate, and fullscreen controls.
112
+ *
113
+ * @csspart root - The outer controls wrapper.
114
+ * @csspart group - A control group container.
115
+ * @csspart control-button - Individual control buttons.
116
+ * @fires dui-map-locate - Fired with user coordinates when located.
117
+ */
118
+ let DuiMapControls = (() => {
119
+ let _classSuper = LitElement;
120
+ let _position_decorators;
121
+ let _position_initializers = [];
122
+ let _position_extraInitializers = [];
123
+ let _showZoom_decorators;
124
+ let _showZoom_initializers = [];
125
+ let _showZoom_extraInitializers = [];
126
+ let _showCompass_decorators;
127
+ let _showCompass_initializers = [];
128
+ let _showCompass_extraInitializers = [];
129
+ let _showLocate_decorators;
130
+ let _showLocate_initializers = [];
131
+ let _showLocate_extraInitializers = [];
132
+ let _showFullscreen_decorators;
133
+ let _showFullscreen_initializers = [];
134
+ let _showFullscreen_extraInitializers = [];
135
+ let __mapCtx_decorators;
136
+ let __mapCtx_initializers = [];
137
+ let __mapCtx_extraInitializers = [];
138
+ let _private_waitingForLocation_decorators;
139
+ let _private_waitingForLocation_initializers = [];
140
+ let _private_waitingForLocation_extraInitializers = [];
141
+ let _private_waitingForLocation_descriptor;
142
+ return class DuiMapControls extends _classSuper {
143
+ static {
144
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
145
+ _position_decorators = [property({ reflect: true })];
146
+ _showZoom_decorators = [property({ type: Boolean, attribute: "show-zoom" })];
147
+ _showCompass_decorators = [property({ type: Boolean, attribute: "show-compass" })];
148
+ _showLocate_decorators = [property({ type: Boolean, attribute: "show-locate" })];
149
+ _showFullscreen_decorators = [property({ type: Boolean, attribute: "show-fullscreen" })];
150
+ __mapCtx_decorators = [consume({ context: mapContext, subscribe: true })];
151
+ _private_waitingForLocation_decorators = [state()];
152
+ __esDecorate(this, null, _position_decorators, { kind: "accessor", name: "position", static: false, private: false, access: { has: obj => "position" in obj, get: obj => obj.position, set: (obj, value) => { obj.position = value; } }, metadata: _metadata }, _position_initializers, _position_extraInitializers);
153
+ __esDecorate(this, null, _showZoom_decorators, { kind: "accessor", name: "showZoom", static: false, private: false, access: { has: obj => "showZoom" in obj, get: obj => obj.showZoom, set: (obj, value) => { obj.showZoom = value; } }, metadata: _metadata }, _showZoom_initializers, _showZoom_extraInitializers);
154
+ __esDecorate(this, null, _showCompass_decorators, { kind: "accessor", name: "showCompass", static: false, private: false, access: { has: obj => "showCompass" in obj, get: obj => obj.showCompass, set: (obj, value) => { obj.showCompass = value; } }, metadata: _metadata }, _showCompass_initializers, _showCompass_extraInitializers);
155
+ __esDecorate(this, null, _showLocate_decorators, { kind: "accessor", name: "showLocate", static: false, private: false, access: { has: obj => "showLocate" in obj, get: obj => obj.showLocate, set: (obj, value) => { obj.showLocate = value; } }, metadata: _metadata }, _showLocate_initializers, _showLocate_extraInitializers);
156
+ __esDecorate(this, null, _showFullscreen_decorators, { kind: "accessor", name: "showFullscreen", static: false, private: false, access: { has: obj => "showFullscreen" in obj, get: obj => obj.showFullscreen, set: (obj, value) => { obj.showFullscreen = value; } }, metadata: _metadata }, _showFullscreen_initializers, _showFullscreen_extraInitializers);
157
+ __esDecorate(this, null, __mapCtx_decorators, { kind: "accessor", name: "_mapCtx", static: false, private: false, access: { has: obj => "_mapCtx" in obj, get: obj => obj._mapCtx, set: (obj, value) => { obj._mapCtx = value; } }, metadata: _metadata }, __mapCtx_initializers, __mapCtx_extraInitializers);
158
+ __esDecorate(this, _private_waitingForLocation_descriptor = { get: __setFunctionName(function () { return this.#waitingForLocation_accessor_storage; }, "#waitingForLocation", "get"), set: __setFunctionName(function (value) { this.#waitingForLocation_accessor_storage = value; }, "#waitingForLocation", "set") }, _private_waitingForLocation_decorators, { kind: "accessor", name: "#waitingForLocation", static: false, private: true, access: { has: obj => #waitingForLocation in obj, get: obj => obj.#waitingForLocation, set: (obj, value) => { obj.#waitingForLocation = value; } }, metadata: _metadata }, _private_waitingForLocation_initializers, _private_waitingForLocation_extraInitializers);
159
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
160
+ }
161
+ static tagName = "dui-map-controls";
162
+ static styles = [base, styles, mapControlsThemeStyles];
163
+ #position_accessor_storage = __runInitializers(this, _position_initializers, "bottom-right");
164
+ /** Position on the map. */
165
+ get position() { return this.#position_accessor_storage; }
166
+ set position(value) { this.#position_accessor_storage = value; }
167
+ #showZoom_accessor_storage = (__runInitializers(this, _position_extraInitializers), __runInitializers(this, _showZoom_initializers, true));
168
+ /** Show zoom in/out buttons. */
169
+ get showZoom() { return this.#showZoom_accessor_storage; }
170
+ set showZoom(value) { this.#showZoom_accessor_storage = value; }
171
+ #showCompass_accessor_storage = (__runInitializers(this, _showZoom_extraInitializers), __runInitializers(this, _showCompass_initializers, false));
172
+ /** Show compass button to reset bearing. */
173
+ get showCompass() { return this.#showCompass_accessor_storage; }
174
+ set showCompass(value) { this.#showCompass_accessor_storage = value; }
175
+ #showLocate_accessor_storage = (__runInitializers(this, _showCompass_extraInitializers), __runInitializers(this, _showLocate_initializers, false));
176
+ /** Show locate button to find user's location. */
177
+ get showLocate() { return this.#showLocate_accessor_storage; }
178
+ set showLocate(value) { this.#showLocate_accessor_storage = value; }
179
+ #showFullscreen_accessor_storage = (__runInitializers(this, _showLocate_extraInitializers), __runInitializers(this, _showFullscreen_initializers, false));
180
+ /** Show fullscreen toggle button. */
181
+ get showFullscreen() { return this.#showFullscreen_accessor_storage; }
182
+ set showFullscreen(value) { this.#showFullscreen_accessor_storage = value; }
183
+ #_mapCtx_accessor_storage = (__runInitializers(this, _showFullscreen_extraInitializers), __runInitializers(this, __mapCtx_initializers, void 0));
184
+ get _mapCtx() { return this.#_mapCtx_accessor_storage; }
185
+ set _mapCtx(value) { this.#_mapCtx_accessor_storage = value; }
186
+ #waitingForLocation_accessor_storage = (__runInitializers(this, __mapCtx_extraInitializers), __runInitializers(this, _private_waitingForLocation_initializers, false));
187
+ get #waitingForLocation() { return _private_waitingForLocation_descriptor.get.call(this); }
188
+ set #waitingForLocation(value) { return _private_waitingForLocation_descriptor.set.call(this, value); }
189
+ #compassEl = (__runInitializers(this, _private_waitingForLocation_extraInitializers), null);
190
+ #rotateHandler = null;
191
+ #pitchHandler = null;
192
+ disconnectedCallback() {
193
+ super.disconnectedCallback();
194
+ this.#removeCompassListeners();
195
+ }
196
+ updated() {
197
+ if (this.showCompass && this._mapCtx?.map) {
198
+ this.#setupCompassListeners();
199
+ }
200
+ }
201
+ #setupCompassListeners() {
202
+ this.#removeCompassListeners();
203
+ const map = this._mapCtx?.map;
204
+ if (!map)
205
+ return;
206
+ this.#compassEl = this.shadowRoot.querySelector(".compass-svg");
207
+ if (!this.#compassEl)
208
+ return;
209
+ const update = () => {
210
+ if (!this.#compassEl)
211
+ return;
212
+ const bearing = map.getBearing();
213
+ const pitch = map.getPitch();
214
+ this.#compassEl.style.transform = `rotateX(${pitch}deg) rotateZ(${-bearing}deg)`;
215
+ };
216
+ this.#rotateHandler = update;
217
+ this.#pitchHandler = update;
218
+ map.on("rotate", this.#rotateHandler);
219
+ map.on("pitch", this.#pitchHandler);
220
+ update();
221
+ }
222
+ #removeCompassListeners() {
223
+ const map = this._mapCtx?.map;
224
+ if (!map)
225
+ return;
226
+ if (this.#rotateHandler)
227
+ map.off("rotate", this.#rotateHandler);
228
+ if (this.#pitchHandler)
229
+ map.off("pitch", this.#pitchHandler);
230
+ this.#rotateHandler = null;
231
+ this.#pitchHandler = null;
232
+ }
233
+ #handleZoomIn = () => {
234
+ this._mapCtx?.map?.zoomTo(this._mapCtx.map.getZoom() + 1, { duration: 300 });
235
+ };
236
+ #handleZoomOut = () => {
237
+ this._mapCtx?.map?.zoomTo(this._mapCtx.map.getZoom() - 1, { duration: 300 });
238
+ };
239
+ #handleResetBearing = () => {
240
+ this._mapCtx?.map?.resetNorthPitch({ duration: 300 });
241
+ };
242
+ #handleLocate = () => {
243
+ this.#waitingForLocation = true;
244
+ if ("geolocation" in navigator) {
245
+ navigator.geolocation.getCurrentPosition((pos) => {
246
+ const coords = {
247
+ longitude: pos.coords.longitude,
248
+ latitude: pos.coords.latitude,
249
+ };
250
+ this._mapCtx?.map?.flyTo({
251
+ center: [coords.longitude, coords.latitude],
252
+ zoom: 14,
253
+ duration: 1500,
254
+ });
255
+ this.dispatchEvent(locateEvent(coords));
256
+ this.#waitingForLocation = false;
257
+ }, (error) => {
258
+ console.error("Error getting location:", error);
259
+ this.#waitingForLocation = false;
260
+ });
261
+ }
262
+ };
263
+ #handleFullscreen = () => {
264
+ const map = this._mapCtx?.map;
265
+ if (!map)
266
+ return;
267
+ const container = map.getContainer();
268
+ if (document.fullscreenElement) {
269
+ document.exitFullscreen();
270
+ }
271
+ else {
272
+ container.requestFullscreen();
273
+ }
274
+ };
275
+ // SVG icon templates
276
+ #plusIcon() {
277
+ return html `<svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="12" y1="5" x2="12" y2="19"/><line x1="5" y1="12" x2="19" y2="12"/></svg>`;
278
+ }
279
+ #minusIcon() {
280
+ return html `<svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="5" y1="12" x2="19" y2="12"/></svg>`;
281
+ }
282
+ #locateIcon() {
283
+ return html `<svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><line x1="2" y1="12" x2="5" y2="12"/><line x1="19" y1="12" x2="22" y2="12"/><line x1="12" y1="2" x2="12" y2="5"/><line x1="12" y1="19" x2="12" y2="22"/><circle cx="12" cy="12" r="7"/><circle cx="12" cy="12" r="3"/></svg>`;
284
+ }
285
+ #maximizeIcon() {
286
+ return html `<svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/></svg>`;
287
+ }
288
+ #spinnerIcon() {
289
+ return html `<svg class="icon-svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" style="animation: spin 1s linear infinite"><path d="M21 12a9 9 0 1 1-6.219-8.56"/></svg>`;
290
+ }
291
+ #compassIcon() {
292
+ return html `
293
+ <svg class="compass-svg" viewBox="0 0 24 24">
294
+ <path d="M12 2L16 12H12V2Z" fill="var(--map-compass-north, #ef4444)" />
295
+ <path d="M12 2L8 12H12V2Z" fill="var(--map-compass-north-light, #fca5a5)" />
296
+ <path d="M12 22L16 12H12V22Z" fill="var(--map-compass-south, currentColor)" opacity="0.6" />
297
+ <path d="M12 22L8 12H12V22Z" fill="var(--map-compass-south, currentColor)" opacity="0.3" />
298
+ </svg>
299
+ `;
300
+ }
301
+ render() {
302
+ return html `
303
+ <div part="root">
304
+ ${this.showZoom ? html `
305
+ <div part="group">
306
+ <button part="control-button" aria-label="Zoom in" @click=${this.#handleZoomIn}>
307
+ ${this.#plusIcon()}
308
+ </button>
309
+ <button part="control-button" aria-label="Zoom out" @click=${this.#handleZoomOut}>
310
+ ${this.#minusIcon()}
311
+ </button>
312
+ </div>
313
+ ` : nothing}
314
+
315
+ ${this.showCompass ? html `
316
+ <div part="group">
317
+ <button part="control-button" aria-label="Reset bearing to north" @click=${this.#handleResetBearing}>
318
+ ${this.#compassIcon()}
319
+ </button>
320
+ </div>
321
+ ` : nothing}
322
+
323
+ ${this.showLocate ? html `
324
+ <div part="group">
325
+ <button part="control-button" aria-label="Find my location" ?disabled=${this.#waitingForLocation} @click=${this.#handleLocate}>
326
+ ${this.#waitingForLocation ? this.#spinnerIcon() : this.#locateIcon()}
327
+ </button>
328
+ </div>
329
+ ` : nothing}
330
+
331
+ ${this.showFullscreen ? html `
332
+ <div part="group">
333
+ <button part="control-button" aria-label="Toggle fullscreen" @click=${this.#handleFullscreen}>
334
+ ${this.#maximizeIcon()}
335
+ </button>
336
+ </div>
337
+ ` : nothing}
338
+ </div>
339
+ `;
340
+ }
341
+ };
342
+ })();
343
+ export { DuiMapControls };
344
+ customElements.define(DuiMapControls.tagName, DuiMapControls);
@@ -0,0 +1,2 @@
1
+ import { DuiMapHeatmap } from "./map-heatmap.js";
2
+ export { DuiMapHeatmap };
@@ -0,0 +1,2 @@
1
+ import { DuiMapHeatmap } from "./map-heatmap.js";
2
+ export { DuiMapHeatmap };
@@ -0,0 +1,39 @@
1
+ import { LitElement, type PropertyValues, type TemplateResult } from "lit";
2
+ import { type MapContext } from "../map/map-context.js";
3
+ /**
4
+ * `<dui-map-heatmap>` — Heatmap density visualization on the map.
5
+ *
6
+ * Accepts a GeoJSON FeatureCollection (or URL string) and renders a heatmap layer
7
+ * with configurable radius, intensity, color ramp, and optional individual points
8
+ * at high zoom levels.
9
+ */
10
+ export declare class DuiMapHeatmap extends LitElement {
11
+ #private;
12
+ static tagName: "dui-map-heatmap";
13
+ static styles: import("lit").CSSResult[];
14
+ /** GeoJSON data URL or inline FeatureCollection. */
15
+ accessor data: string | GeoJSON.FeatureCollection<GeoJSON.Point>;
16
+ /** Heatmap kernel radius in pixels. */
17
+ accessor radius: number;
18
+ /** Global intensity multiplier. */
19
+ accessor intensity: number;
20
+ /** Heatmap layer opacity (0–1). */
21
+ accessor opacity: number;
22
+ /** GeoJSON property name to use as point weight. Empty = equal weight. */
23
+ accessor weight: string;
24
+ /** Maximum zoom at which the heatmap is visible. Above this, show individual points. */
25
+ accessor maxZoom: number;
26
+ /** Whether to show individual points when zoomed past maxZoom. */
27
+ accessor showPoints: boolean;
28
+ /** Color for individual points (shown above maxZoom). */
29
+ accessor pointColor: string;
30
+ /** Array of CSS colors for the heatmap gradient from cool→hot. */
31
+ accessor colorRamp: string[];
32
+ /** Unique ID for source/layer. Auto-generated if not set. */
33
+ accessor heatmapId: string;
34
+ accessor _mapCtx: MapContext;
35
+ connectedCallback(): void;
36
+ disconnectedCallback(): void;
37
+ updated(changed: PropertyValues): void;
38
+ render(): TemplateResult;
39
+ }