@florasync/leaflet-geokit 0.5.0 → 0.7.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.
@@ -13,6 +13,10 @@ export declare class LeafletDrawMapElement extends HTMLElement implements Leafle
13
13
  private _maxZoom?;
14
14
  private _tileUrl;
15
15
  private _tileAttribution?;
16
+ private _tileProvider?;
17
+ private _tileStyle?;
18
+ private _apiKey?;
19
+ private _activeTileProvider;
16
20
  private _readOnly;
17
21
  private _logLevel;
18
22
  private _devOverlay;
@@ -33,6 +37,9 @@ export declare class LeafletDrawMapElement extends HTMLElement implements Leafle
33
37
  disconnectedCallback(): Promise<void>;
34
38
  static get observedAttributes(): string[];
35
39
  attributeChangedCallback(name: string, _old: string | null, value: string | null): void;
40
+ private _updateTileLayer;
41
+ private _handleTileProviderError;
42
+ private _emitTileProviderChanged;
36
43
  get latitude(): number;
37
44
  set latitude(v: number);
38
45
  get longitude(): number;
@@ -45,6 +52,12 @@ export declare class LeafletDrawMapElement extends HTMLElement implements Leafle
45
52
  set maxZoom(v: number | undefined);
46
53
  get tileUrl(): string;
47
54
  set tileUrl(v: string);
55
+ get tileProvider(): string | undefined;
56
+ set tileProvider(v: string | undefined);
57
+ get tileStyle(): string | undefined;
58
+ set tileStyle(v: string | undefined);
59
+ get apiKey(): string | undefined;
60
+ set apiKey(v: string | undefined);
48
61
  get tileAttribution(): string | undefined;
49
62
  set tileAttribution(v: string | undefined);
50
63
  get readOnly(): boolean;
@@ -88,6 +101,11 @@ export declare class LeafletDrawMapElement extends HTMLElement implements Leafle
88
101
  loadGeoJSONFromText(text: string): Promise<void>;
89
102
  private _currentConfig;
90
103
  private _applyThemeStyles;
104
+ private _syncApiKeyFromAttributes;
105
+ private _normalizeText;
106
+ private _resolveTileProviderErrorCode;
107
+ private _resolveHereTileLayerErrorCode;
108
+ private _describeTileLayerError;
91
109
  private _reflect;
92
110
  private _booleanReflect;
93
111
  private _coerceNumber;
@@ -4,6 +4,7 @@ import "leaflet-ruler";
4
4
  import type { Feature, FeatureCollection } from "geojson";
5
5
  import type { DrawControlsConfig, MapConfig, MeasurementSystem } from "@src/types/public";
6
6
  import { type Logger } from "@src/utils/logger";
7
+ import type { TileURLTemplate } from "@src/lib/TileProviderFactory";
7
8
  export interface MapControllerCallbacks {
8
9
  onReady?: (detail: {
9
10
  bounds?: [[number, number], [number, number]];
@@ -38,6 +39,9 @@ export interface MapControllerOptions {
38
39
  /** Prefer external Leaflet if available (falls back to bundled if missing/invalid). */
39
40
  useExternalLeaflet?: boolean;
40
41
  }
42
+ interface TileLayerCallbacks {
43
+ onTileError?: (error: unknown) => void;
44
+ }
41
45
  /**
42
46
  * MapController: initializes Leaflet map + Draw, bridges events, and manages data via FeatureStore.
43
47
  */
@@ -48,6 +52,7 @@ export declare class MapController {
48
52
  private L;
49
53
  private store;
50
54
  private map;
55
+ private tileLayer;
51
56
  private drawnItems;
52
57
  private drawControl;
53
58
  private rulerControl;
@@ -76,6 +81,7 @@ export declare class MapController {
76
81
  fitBoundsToData(paddingRatio?: number): Promise<void>;
77
82
  fitBounds(boundsTuple: [[number, number], [number, number]], paddingRatio?: number): Promise<void>;
78
83
  setView(lat: number, lng: number, zoom?: number): Promise<void>;
84
+ setTileLayer(config: TileURLTemplate, callbacks?: TileLayerCallbacks): void;
79
85
  /**
80
86
  * Merge all visible polygon features into a single polygon feature.
81
87
  * This removes the original features and adds a new feature with the merged geometry.
@@ -119,3 +125,4 @@ export declare class MapController {
119
125
  private showMoveConfirmationUI;
120
126
  private hideMoveConfirmationUI;
121
127
  }
128
+ export {};
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Configuration for selecting and customizing a tile provider.
3
+ */
4
+ export interface TileProviderConfig {
5
+ /** Tile provider identifier (e.g., "osm", "here"). */
6
+ provider: "osm" | "here" | string;
7
+ /** Optional visual style name (used by style-capable providers like HERE). */
8
+ style?: string;
9
+ /** Optional API key used by authenticated providers like HERE Maps. */
10
+ apiKey?: string;
11
+ /** Optional attribution override for the selected provider. */
12
+ attribution?: string;
13
+ }
14
+ /**
15
+ * Resolved tile layer template configuration used to create a Leaflet tile layer.
16
+ */
17
+ export interface TileURLTemplate {
18
+ /** URL template containing Leaflet placeholders such as {z}, {x}, and {y}. */
19
+ urlTemplate: string;
20
+ /** Attribution string displayed on the map. */
21
+ attribution: string;
22
+ /** Maximum zoom level supported by the provider. */
23
+ maxZoom?: number;
24
+ /** Optional tile subdomains for providers that shard traffic by hostname. */
25
+ subdomains?: string[];
26
+ }
27
+ /**
28
+ * Build tile layer URL and metadata for the selected provider.
29
+ *
30
+ * HERE-specific behavior:
31
+ * - Requires a non-empty API key
32
+ * - Uses `lite.day` as default style when style is omitted/invalid
33
+ */
34
+ export declare function buildTileURL(config: TileProviderConfig): TileURLTemplate;
35
+ /**
36
+ * Validate provider configuration before tile URL construction.
37
+ *
38
+ * Rules:
39
+ * - `provider` is required
40
+ * - HERE provider requires a non-empty `apiKey`
41
+ */
42
+ export declare function validateProviderConfig(config: TileProviderConfig): {
43
+ valid: boolean;
44
+ error?: string;
45
+ };
@@ -48,6 +48,58 @@ export interface DrawControlsConfig {
48
48
  delete?: boolean;
49
49
  ruler?: boolean;
50
50
  }
51
+ /**
52
+ * Configuration for tile provider selection and styling
53
+ */
54
+ export interface TileProviderConfig {
55
+ /** Tile provider identifier (e.g., "osm", "here") */
56
+ provider: "osm" | "here" | string;
57
+ /** Provider-specific style (e.g., "lite.day" for HERE) */
58
+ style?: string;
59
+ /** API key for authenticated providers */
60
+ apiKey?: string;
61
+ /** Optional override for tile attribution text */
62
+ attribution?: string;
63
+ }
64
+ /**
65
+ * Tile layer configuration with URL template and provider settings
66
+ */
67
+ export interface TileURLTemplate {
68
+ /** Leaflet tile URL template (e.g., "https://{s}.domain.com/{z}/{x}/{y}.png") */
69
+ urlTemplate: string;
70
+ /** Attribution text displayed on the map */
71
+ attribution: string;
72
+ /** Maximum zoom level supported */
73
+ maxZoom?: number;
74
+ /** Tile subdomains for load balancing */
75
+ subdomains?: string[];
76
+ }
77
+ /**
78
+ * Event detail for tile provider errors
79
+ */
80
+ export interface TileProviderErrorDetail {
81
+ /** Error code identifying the failure type */
82
+ code: "missing_api_key" | "invalid_api_key" | "permission_denied" | "tile_load_failed" | "unknown_provider";
83
+ /** Human-readable error message */
84
+ message: string;
85
+ /** Provider identifier where the error occurred */
86
+ provider: string;
87
+ /** Unix timestamp when error occurred */
88
+ timestamp: number;
89
+ }
90
+ /**
91
+ * Event detail for successful tile provider changes
92
+ */
93
+ export interface TileProviderChangedDetail {
94
+ /** New active provider */
95
+ provider: string;
96
+ /** New active style (if applicable) */
97
+ style?: string;
98
+ /** Previously active provider */
99
+ previousProvider: string;
100
+ /** Unix timestamp when change occurred */
101
+ timestamp: number;
102
+ }
51
103
  /**
52
104
  * Public API that the custom element exposes (methods/properties).
53
105
  * This is provided for typing in TS consumers who may cast the element.
@@ -70,6 +122,12 @@ export interface LeafletDrawMapElementAPI {
70
122
  skipLeafletStyles?: boolean;
71
123
  /** Optional injection of a pre-existing Leaflet namespace to use instead of bundled import. */
72
124
  leafletInstance?: typeof Leaflet;
125
+ /** Tile provider identifier (e.g., "osm", "here") */
126
+ tileProvider?: "osm" | "here" | string;
127
+ /** Provider-specific style (e.g., "lite.day" for HERE) */
128
+ tileStyle?: string;
129
+ /** API key for authenticated providers */
130
+ apiKey?: string;
73
131
  getGeoJSON(): Promise<FeatureCollection>;
74
132
  loadGeoJSON(fc: FeatureCollection): Promise<void>;
75
133
  clearLayers(): Promise<void>;
@@ -0,0 +1 @@
1
+ import "@src/index";
@@ -0,0 +1 @@
1
+ import "@src/index";
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@florasync/leaflet-geokit",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "Framework-agnostic Leaflet + Leaflet.draw web component with TypeScript, verbose logging, and tests.",
5
5
  "type": "module",
6
6
  "main": "./dist/leaflet-geokit.umd.js",
@@ -124,6 +124,7 @@
124
124
  }
125
125
  },
126
126
  "devDependencies": {
127
+ "@eslint/js": "^10.0.1",
127
128
  "@playwright/test": "^1.58.2",
128
129
  "@preact/preset-vite": "^2.8.0",
129
130
  "@testing-library/dom": "^10.4.0",
@@ -135,12 +136,13 @@
135
136
  "@types/node": "^22.0.0",
136
137
  "@types/react": "^18.3.12",
137
138
  "@types/react-dom": "^18.3.1",
138
- "@typescript-eslint/eslint-plugin": "^8.0.1",
139
- "@typescript-eslint/parser": "^8.0.1",
140
- "@vitest/coverage-v8": "^3.2.4",
139
+ "@typescript-eslint/eslint-plugin": "^8.56.0",
140
+ "@typescript-eslint/parser": "^8.56.0",
141
+ "@vitest/coverage-v8": "^4.0.18",
141
142
  "baseline-browser-mapping": "^2.9.17",
142
- "eslint": "^9.9.0",
143
- "happy-dom": "^18.0.1",
143
+ "eslint": "^10.0.0",
144
+ "globals": "^17.3.0",
145
+ "happy-dom": "^20.6.3",
144
146
  "husky": "^9.1.7",
145
147
  "lint-staged": "^15.2.10",
146
148
  "preact": "^10.28.3",
@@ -150,7 +152,7 @@
150
152
  "rollup-plugin-visualizer": "^6.0.5",
151
153
  "typescript": "^5.5.4",
152
154
  "vite": "^7.1.4",
153
- "vitest": "^3.2.4"
155
+ "vitest": "^4.0.18"
154
156
  },
155
157
  "lint-staged": {
156
158
  "*.{ts,tsx,js,jsx}": [
@@ -160,5 +162,8 @@
160
162
  "*.{json,md,css,scss,html,yml,yaml}": [
161
163
  "prettier --write"
162
164
  ]
165
+ },
166
+ "overrides": {
167
+ "minimatch": "^10.2.1"
163
168
  }
164
169
  }