leaflet-html 0.1.7 → 0.2.1

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 (49) hide show
  1. package/.github/workflows/npm-publish.yml +27 -27
  2. package/.prettierignore +2 -0
  3. package/.prettierrc +1 -0
  4. package/README.md +63 -36
  5. package/dist/leaflet-html.cjs +1 -1
  6. package/dist/leaflet-html.cjs.map +1 -1
  7. package/dist/leaflet-html.esm.js +1 -1
  8. package/dist/leaflet-html.esm.js.map +1 -1
  9. package/dist/leaflet-html.js +1 -1
  10. package/dist/leaflet-html.js.map +1 -1
  11. package/dist/leaflet-html.umd.js +1 -1
  12. package/dist/leaflet-html.umd.js.map +1 -1
  13. package/docs/content/_index.md +66 -63
  14. package/docs/content/articles/_index.md +5 -0
  15. package/docs/content/articles/basic.md +105 -0
  16. package/docs/content/articles/icons.md +35 -0
  17. package/docs/content/articles/style.md +14 -0
  18. package/docs/public/icons/leaf-green.png +0 -0
  19. package/docs/public/icons/leaf-orange.png +0 -0
  20. package/docs/public/icons/leaf-red.png +0 -0
  21. package/docs/public/icons/leaf-shadow.png +0 -0
  22. package/docs/static/icons/leaf-green.png +0 -0
  23. package/docs/static/icons/leaf-orange.png +0 -0
  24. package/docs/static/icons/leaf-red.png +0 -0
  25. package/docs/static/icons/leaf-shadow.png +0 -0
  26. package/docs/templates/article-page.html +8 -0
  27. package/docs/templates/article.html +12 -0
  28. package/docs/templates/base.html +59 -0
  29. package/docs/templates/index.html +5 -52
  30. package/example/geojson/index.html +42 -0
  31. package/example/index.html +58 -50
  32. package/example/overlays/index.html +34 -35
  33. package/package.json +12 -5
  34. package/src/events.js +3 -0
  35. package/src/index.js +27 -185
  36. package/src/l-base-layers.js +15 -0
  37. package/src/l-control-layers.js +34 -0
  38. package/src/l-geojson.js +22 -0
  39. package/src/l-icon.js +124 -0
  40. package/src/l-image-overlay.js +43 -0
  41. package/src/l-lat-lng-bounds.js +20 -0
  42. package/src/l-layer-group.js +39 -0
  43. package/src/l-map.js +33 -0
  44. package/src/l-marker.js +94 -0
  45. package/src/l-overlay-layers.js +15 -0
  46. package/src/l-popup.js +21 -0
  47. package/src/l-tile-layer.js +22 -0
  48. package/src/l-video-overlay.js +31 -0
  49. package/vite.config.js +7 -0
@@ -0,0 +1,59 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <style>
7
+
8
+ l-map {
9
+ display: block;
10
+ block-size: 40ch;
11
+ isolation: isolate;
12
+ z-index: 1;
13
+ }
14
+
15
+ body {
16
+ font-family: system-ui;
17
+ line-height: 1.6;
18
+ }
19
+
20
+ h1, h2, h3 {
21
+ font-weight: 100;
22
+ }
23
+
24
+ pre {
25
+ padding-inline: 0.75rem;
26
+ padding-block: 0.5rem;
27
+ border-radius: 0.2rem;
28
+ overflow-x: auto;
29
+ }
30
+
31
+ main {
32
+ inline-size: min(90%, 80ch);
33
+ margin-inline: auto;
34
+ }
35
+ </style>
36
+ <link
37
+ rel="stylesheet"
38
+ href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
39
+ integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
40
+ crossorigin=""
41
+ />
42
+ <script
43
+ src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
44
+ integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
45
+ crossorigin=""
46
+ ></script>
47
+ <script
48
+ type="module"
49
+ src="https://unpkg.com/leaflet-html@latest/dist/leaflet-html.js"
50
+ ></script>
51
+ </head>
52
+ <body>
53
+ <nav>
54
+ <a href="{{ get_url(path='@/_index.md') }}">Home</a>
55
+ <a href="{{ get_url(path='@/articles/_index.md') }}">Articles</a>
56
+ </nav>
57
+ {% block content %}{% endblock %}
58
+ </body>
59
+ </html>
@@ -1,53 +1,6 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head lang="en">
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width, initial-scale=1" />
6
- <style>
7
-
8
- [data-leaflet-html] {
9
- block-size: 40ch;
10
- isolation: isolate;
11
- z-index: 1;
12
- }
13
- body {
14
- font-family: system-ui;
15
- line-height: 1.6;
16
- }
17
- h1, h2 {
18
- font-weight: 100;
19
- }
20
-
21
- pre {
22
- padding-inline: 0.75rem;
23
- padding-block: 0.5rem;
24
- border-radius: 0.2rem;
25
- overflow-x: scroll;
26
- }
27
-
28
- .wrapper {
29
- inline-size: 80ch;
30
- margin-inline: auto;
31
- }
32
- </style>
33
- <link
34
- rel="stylesheet"
35
- href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
36
- integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
37
- crossorigin=""
38
- />
39
- <script
40
- src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
41
- integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
42
- crossorigin=""
43
- ></script>
44
- <script
45
- src="https://unpkg.com/leaflet-html@latest/dist/leaflet-html.umd.js"
46
- ></script>
47
- </head>
48
- <body>
49
- <div class="wrapper">
1
+ {% extends "base.html" %}
2
+ {% block content %}
3
+ <main>
50
4
  {{ section.content | safe }}
51
- </div>
52
- </body>
53
- </html>
5
+ </main>
6
+ {% endblock %}
@@ -0,0 +1,42 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head lang="en">
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>GeoJSON</title>
7
+ <link
8
+ rel="stylesheet"
9
+ href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
10
+ integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
11
+ crossorigin=""
12
+ />
13
+ <script
14
+ src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
15
+ integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
16
+ crossorigin=""
17
+ ></script>
18
+ <script type="module" src="/src/index.js"></script>
19
+ <style>
20
+ * {
21
+ margin: 0;
22
+ }
23
+ l-map {
24
+ display: block;
25
+ height: 100vh;
26
+ }
27
+ </style>
28
+ </head>
29
+ <body>
30
+ <l-map center="[55,0]" zoom="5">
31
+ <l-tile-layer
32
+ url-template="https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png"
33
+ ></l-tile-layer>
34
+ <l-geojson id="feature" geojson='{"type":"Feature","properties":{"name":"Coors Field","amenity":"Baseball Stadium","popupContent":"This is where the Rockies play!"},"geometry":{"type":"Point","coordinates":[-104.99404,39.75621]}}'></l-geojson>
35
+ </l-map>
36
+ <script>
37
+ document.getElementById("feature").addEventListener("map:addTo", (ev) => {
38
+ console.log({ message: "Hello, World!", ev })
39
+ })
40
+ </script>
41
+ </body>
42
+ </html>
@@ -15,7 +15,8 @@
15
15
  crossorigin=""
16
16
  ></script>
17
17
  <script
18
- src="/dist/leaflet-html.umd.js"
18
+ src="/src/index.js"
19
+ type="module"
19
20
  defer
20
21
  ></script>
21
22
  <style>
@@ -23,18 +24,21 @@
23
24
  margin: 0;
24
25
  }
25
26
 
26
- [data-leaflet-html] {
27
+ l-map {
27
28
  block-size: 100vh;
28
29
  isolation: isolate;
29
30
  z-index: 1;
30
31
  }
31
32
 
32
- #btn {
33
+ .btn-group {
33
34
  z-index: 2;
34
35
  position: absolute;
35
36
  bottom: 0;
36
37
  left: 0;
37
38
  margin: 1rem;
39
+ }
40
+
41
+ button {
38
42
  padding: 1rem;
39
43
  background-color: #337;
40
44
  color: white;
@@ -42,62 +46,66 @@
42
46
  cursor: pointer;
43
47
  font-size: 1.2rem;
44
48
  }
49
+
50
+ body {
51
+ display: grid;
52
+ grid-template-columns: 1fr 1fr;
53
+ }
45
54
  </style>
46
55
  </head>
47
56
  <body>
48
- <div data-leaflet-html data-center="[39.61, -105.02]" data-zoom="10">
49
- <div data-control-layers>
50
- <div data-base-maps>
51
- <div
52
- data-tile-layer
53
- data-name="OpenStreetMap"
54
- data-url-template="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
55
- data-attribution='&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
56
- data-max-zoom="12"
57
- ></div>
58
- <div
59
- data-tile-layer
60
- data-name="CartoDB_Voyager"
61
- data-url-template="https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png"
62
- data-attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors &copy; <a href="https://carto.com/attributions">CARTO</a>'
63
- data-max-zoom="20"
64
- data-subdomains="abcd"
65
- data-show
66
- ></div>
67
- </div>
68
- <div data-overlay-maps>
69
- <div data-layer-group data-name="Cities">
70
- <div data-marker data-lat-lng="[39.61, -105.02]">
71
- <div data-popup data-content="This is Littleton, CO."></div>
72
- </div>
73
- <div data-marker data-lat-lng="[39.74, -104.99]">
74
- <div data-popup data-content="This is Denver, CO."></div>
75
- </div>
76
- <div data-marker data-lat-lng="[39.73, -104.8]" data-opacity="0.7">
77
- <div data-popup data-content="This is Aurora, CO."></div>
78
- </div>
79
- <div data-marker data-lat-lng="[39.77, -105.23]">
80
- <div data-popup data-content="This is Golden, CO."></div>
81
- </div>
82
- </div>
83
- </div>
84
- </div>
57
+ <l-map center="[39.61, -105.02]" zoom="10">
58
+ <l-control-layers>
59
+ <l-base-layers>
60
+ <l-tile-layer
61
+ name="OpenStreetMap"
62
+ url-template="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
63
+ attribution='&copy; <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>'
64
+ max-zoom="12"
65
+ ></l-tile-layer>
66
+ <l-tile-layer
67
+ name="CartoDB_Voyager"
68
+ url-template="https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png"
69
+ attribution='&copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors &copy; <a href="https://carto.com/attributions">CARTO</a>'
70
+ max-zoom="20"
71
+ subdomains="abcd"
72
+ ></l-tile-layer>
73
+ </l-base-layers>
74
+ <l-overlay-layers>
75
+ <l-layer-group name="Cities">
76
+ <l-marker lat-lng="[39.61, -105.02]">
77
+ <l-popup content="This is Littleton, CO."></l-popup>
78
+ </l-marker>
79
+ <l-marker lat-lng="[39.74, -104.99]">
80
+ <l-popup content="This is Denver, CO."></l-popup>
81
+ </l-marker>
82
+ <l-marker lat-lng="[39.73, -104.8]" opacity="0.7">
83
+ <l-popup content="This is Aurora, CO."></l-popup>
84
+ </l-marker>
85
+ <l-marker lat-lng="[39.77, -105.23]">
86
+ <l-popup content="This is Golden, CO."></l-popup>
87
+ </l-marker>
88
+ </l-layer-group>
89
+ </l-overlay-layers>
90
+ </l-control-layers>
91
+ </l-map>
92
+ <div class="btn-group">
93
+ <button id="btn-move">Move Denver</button>
94
+ <button id="btn-remove">Remove Denver</button>
85
95
  </div>
86
- <button id="btn">Add a city</button>
87
96
  <script type="module">
88
97
  // Manual tests
89
- document.getElementById("btn").addEventListener("click", () => {
90
- // New city
91
- let el = document.querySelector('[data-name="Cities"]');
92
- const city = document.createElement("div");
93
- city.dataset.marker = "";
94
- city.dataset.latLng = "[39.60, -105.02]";
95
- el.appendChild(city);
96
-
98
+ document.getElementById("btn-remove").addEventListener("click", () => {
97
99
  // Remove Denver
98
- el = document.querySelector('[data-lat-lng="[39.74, -104.99]"]');
100
+ let el = document.querySelector('[lat-lng="[39.74, -104.99]"]');
99
101
  el.remove();
100
102
  });
103
+ document.getElementById("btn-move").addEventListener("click", () => {
104
+ // Move Denver
105
+ let el = document.querySelector('[lat-lng="[39.74, -104.99]"]');
106
+ el.setAttribute("lat-lng", "[39.74, -104.89]");
107
+ el.setAttribute("opacity", "0.5");
108
+ });
101
109
  </script>
102
110
  </body>
103
111
  </html>
@@ -15,60 +15,59 @@
15
15
  integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
16
16
  crossorigin=""
17
17
  ></script>
18
- <script src="/dist/leaflet-html.umd.js"></script>
18
+ <script type="module" src="/src/index.js"></script>
19
19
  <style>
20
20
  * {
21
21
  margin: 0;
22
22
  }
23
23
 
24
- [data-leaflet-html] {
24
+ l-map {
25
+ display: block;
25
26
  block-size: 100vh;
27
+ outline: 1px solid hotpink;
26
28
  isolation: isolate;
27
29
  z-index: 1;
28
30
  }
29
31
  </style>
30
32
  </head>
31
33
  <body>
32
- <div data-leaflet-html data-center="[37.8, -96]" data-zoom="4">
33
- <div
34
- data-lat-lng-bounds
35
- data-bounds="[[40.799311, -74.118464], [40.68202047785919, -74.33]]"
36
- ></div>
37
- <div
38
- data-tile-layer
39
- data-name="OpenStreetMap"
40
- data-url-template="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
41
- data-attribution=""
42
- ></div>
34
+ <l-map center="[37.8, -96]" zoom="4">
35
+ <l-lat-lng-bounds
36
+ bounds="[[40.799311, -74.118464], [40.68202047785919, -74.33]]"
37
+ ></l-lat-lng-bounds>
38
+ <l-tile-layer
39
+ name="OpenStreetMap"
40
+ url-template="https://tile.openstreetmap.org/{z}/{x}/{y}.png"
41
+ attribution=""
42
+ ></l-tile-layer>
43
43
  <!-- Newark -->
44
- <div
45
- data-image-overlay
46
- data-url="https://maps.lib.utexas.edu/maps/historical/newark_nj_1922.jpg"
47
- data-bounds="[[40.799311, -74.118464], [40.68202047785919, -74.33]]"
48
- data-opacity="0.8"
49
- data-interactive="true"
50
- data-error-overlay-url="https://cdn-icons-png.flaticon.com/512/110/110686.png"
51
- data-alt="Image of Newark, N.J. in 1922. Source: The University of Texas at Austin, UT Libraries Map Collection."
52
- ></div>
44
+ <l-image-overlay
45
+ url="https://maps.lib.utexas.edu/maps/historical/newark_nj_1922.jpg"
46
+ bounds="[[40.799311, -74.118464], [40.68202047785919, -74.33]]"
47
+ opacity="0.8"
48
+ interactive="true"
49
+ error-overlay-url="https://cdn-icons-png.flaticon.com/512/110/110686.png"
50
+ alt="Image of Newark, N.J. in 1922. Source: The University of Texas at Austin, UT Libraries Map Collection."
51
+ ></l-image-overlay>
53
52
  <!-- Hurricane Patricia -->
54
- <div
55
- data-video-overlay
56
- data-url='["https://www.mapbox.com/bites/00188/patricia_nasa.webm", "https://www.mapbox.com/bites/00188/patricia_nasa.mp4"]'
57
- data-error-overlay-url="https://cdn-icons-png.flaticon.com/512/110/110686.png"
58
- data-bounds="[[32, -130], [13, -100]]"
59
- ></div>
60
- </div>
53
+ <l-video-overlay
54
+ url='["https://www.mapbox.com/bites/00188/patricia_nasa.webm", "https://www.mapbox.com/bites/00188/patricia_nasa.mp4"]'
55
+ error-overlay-url="https://cdn-icons-png.flaticon.com/512/110/110686.png"
56
+ bounds="[[32, -130], [13, -100]]"
57
+ ></l-video-overlay>
58
+ </l-map>
59
+
61
60
  <script>
62
- el = document.querySelector("[data-lat-lng-bounds]")
61
+ el = document.querySelector("l-lat-lng-bounds")
63
62
  let counter = 0
64
63
  document.body.addEventListener("click", () => {
65
- console.log("click")
64
+ el.setAttribute("method", "flyToBounds")
66
65
  if (counter === 0) {
67
- const { bounds } = document.querySelector("[data-video-overlay]").dataset
68
- el.dataset.bounds = bounds
66
+ const bounds = document.querySelector("l-video-overlay").getAttribute("bounds")
67
+ el.setAttribute("bounds", bounds)
69
68
  } else {
70
- const { bounds } = document.querySelector("[data-image-overlay]").dataset
71
- el.dataset.bounds = bounds
69
+ const bounds = document.querySelector("l-image-overlay").getAttribute("bounds")
70
+ el.setAttribute("bounds", bounds)
72
71
  }
73
72
  counter += 1
74
73
  })
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "leaflet-html",
3
3
  "type": "module",
4
- "version": "0.1.7",
4
+ "version": "0.2.1",
5
5
  "description": "Leaflet expressed in HTML",
6
6
  "source": "src/index.js",
7
7
  "main": "./dist/leaflet-html.js",
8
8
  "umd:main": "./dist/leaflet-html.umd.js",
9
9
  "exports": {
10
- "default": "./dist/leaflet-html.js"
10
+ "module": "./dist/leaflet-html.js"
11
11
  },
12
12
  "module": "./dist/leaflet-html.esm.js",
13
13
  "author": "andrewgryan",
@@ -17,10 +17,17 @@
17
17
  },
18
18
  "license": "MIT",
19
19
  "scripts": {
20
- "build": "microbundle",
21
- "watch": "microbundle watch"
20
+ "build": "microbundle --external leaflet",
21
+ "watch": "microbundle watch",
22
+ "test": "vitest"
22
23
  },
23
24
  "devDependencies": {
24
- "microbundle": "^0.15.1"
25
+ "happy-dom": "^14.10.1",
26
+ "microbundle": "^0.15.1",
27
+ "prettier": "3.2.5",
28
+ "vitest": "^1.6.0"
29
+ },
30
+ "dependencies": {
31
+ "leaflet": "^1.9.4"
25
32
  }
26
33
  }
package/src/events.js ADDED
@@ -0,0 +1,3 @@
1
+ export const mapAddTo = "map:addTo";
2
+ export const popupAdd = "popup:add";
3
+ export const layerRemove = "layer:remove";
package/src/index.js CHANGED
@@ -1,191 +1,33 @@
1
1
  // @ts-check
2
-
3
- // Helpers
4
- const selector = (noun) => `[data-${noun}]`;
5
-
6
- /**
7
- * Parse L.tileLayer args from element attributes
8
- */
9
- const parseTileLayer = (el) => {
10
- const { urlTemplate } = el.dataset;
11
- const {
12
- attribution = null,
13
- maxZoom = "18",
14
- minZoom = "0",
15
- subdomains = "abc",
16
- } = el.dataset;
17
- const options = { attribution, maxZoom, minZoom, subdomains };
18
- return [urlTemplate, options];
19
- };
20
-
21
- /**
22
- * Parse L.imageOverlay args from element attributes
23
- */
24
- const parseImageOverlay = (el) => {
25
- let { url, bounds } = el.dataset;
26
- bounds = JSON.parse(bounds);
27
- const { opacity } = el.dataset;
28
- const options = { opacity: parseFloat(opacity) };
29
- return [url, bounds, options];
30
- };
31
-
32
- /**
33
- * Parse L.imageOverlay args from element attributes
34
- */
35
- const parseVideoOverlay = (el) => {
36
- let { url, bounds } = el.dataset;
37
- url = JSON.parse(url);
38
- bounds = JSON.parse(bounds);
39
- const {
40
- opacity,
41
- errorOverlayUrl,
42
- autoplay = true,
43
- muted = true,
44
- playsInline = true,
45
- } = el.dataset;
46
- const options = {
47
- opacity: parseFloat(opacity),
48
- errorOverlayUrl,
49
- autoplay,
50
- muted,
51
- playsInline,
52
- };
53
- return [url, bounds, options];
54
- };
55
-
56
- /**
57
- * @param {HTMLElement} el
58
- */
59
- const parseLatLngBounds = (el) => {
60
- let { bounds } = el.dataset;
61
- if (typeof bounds === "undefined") {
62
- throw Error("data-bounds not specified")
63
- }
64
- return [JSON.parse(bounds)];
65
- }
66
-
67
- const render = () => {
68
- // Render Leaflet API calls
69
- document.querySelectorAll(selector("leaflet-html")).forEach((el) => {
70
- const { center, zoom } = el.dataset;
71
- const map = L.map(el).setView(JSON.parse(center), parseInt(zoom));
72
-
73
- // L.latLngBounds
74
- el.querySelectorAll(selector("lat-lng-bounds")).forEach((el) => {
75
- const bounds = L.latLngBounds(...parseLatLngBounds(el))
76
- // TODO: encapsulate this design pattern
77
- const observer = new MutationObserver(function (mutations) {
78
- mutations.forEach((mutation) => {
79
- let [bounds] = parseLatLngBounds(mutation.target)
80
- map.flyToBounds(bounds); // TODO: Use HTML attrs for fly/fit bounds
81
- });
82
- });
83
- observer.observe(el, {
84
- attributes: true,
85
- attributeFilter: ["data-bounds"],
86
- });
87
- map.fitBounds(bounds)
88
- })
89
-
90
- // L.tileLayers
91
- el.querySelectorAll(selector("tile-layer")).forEach((el) => {
92
- L.tileLayer(...parseTileLayer(el)).addTo(map);
93
- });
94
-
95
- el.querySelectorAll(selector("image-overlay")).forEach((el) => {
96
- L.imageOverlay(...parseImageOverlay(el)).addTo(map);
97
- });
98
-
99
- el.querySelectorAll(selector("video-overlay")).forEach((el) => {
100
- L.videoOverlay(...parseVideoOverlay(el)).addTo(map);
101
- });
102
-
103
- // L.control.layers
104
- el.querySelectorAll(selector("control-layers")).forEach((el) => {
105
- const baseMaps = {};
106
-
107
- // L.tileLayers
108
- el.querySelectorAll(selector("tile-layer")).forEach((el) => {
109
- const { name, show } = el.dataset;
110
- baseMaps[name] = L.tileLayer(...parseTileLayer(el));
111
- if (show != null) {
112
- baseMaps[name].addTo(map);
113
- }
114
- });
115
-
116
- const overlayMaps = {};
117
- // L.layerGroup
118
- el.querySelectorAll(selector("layer-group")).forEach((el) => {
119
- const { name } = el.dataset;
120
- const layers = [];
121
-
122
- const observer = new MutationObserver(function (mutations) {
123
- const group = overlayMaps[name];
124
-
125
- mutations.forEach((mutation) => {
126
- mutation.addedNodes.forEach((node) => {
127
- const { latLng } = node.dataset; // MutationObserver needed
128
- const layer = L.marker(JSON.parse(latLng));
129
- group.addLayer(layer);
130
- map.addLayer(layer);
131
- });
132
-
133
- mutation.removedNodes.forEach((node) => {
134
- const { _leafletId } = node.dataset;
135
- const layer = group.getLayer(_leafletId);
136
- group.removeLayer(layer);
137
-
138
- map.removeLayer(layer);
139
- });
140
- });
141
- });
142
- observer.observe(el, { childList: true });
143
-
144
- // L.marker
145
- el.querySelectorAll(selector("marker")).forEach((el) => {
146
- const { latLng } = el.dataset;
147
- const { opacity = "1.0" } = el.dataset;
148
- const options = { opacity: parseFloat(opacity) };
149
- const marker = L.marker(JSON.parse(latLng), options).addTo(map);
150
- el.dataset._leafletId = L.stamp(marker); // Save ID for later
151
-
152
- const observer = new MutationObserver(function (mutations) {
153
- mutations.forEach((mutation) => {
154
- const { latLng } = mutation.target.dataset;
155
- marker.setLatLng(JSON.parse(latLng));
156
- });
157
- });
158
- observer.observe(el, {
159
- attributes: true,
160
- attributeFilter: ["data-lat-lng"],
161
- });
162
-
163
- // marker.bindPopup
164
- el.querySelectorAll(selector("popup")).forEach((el) => {
165
- const { content } = el.dataset;
166
- marker.bindPopup(content);
167
- const observer = new MutationObserver(function () {
168
- marker.getPopup().setContent(el.dataset.content);
169
- });
170
- observer.observe(el, {
171
- attributes: true,
172
- attributeFilter: ["data-content"],
173
- });
174
- });
175
-
176
- layers.push(marker);
177
- });
178
-
179
- overlayMaps[name] = L.layerGroup(layers);
180
- });
181
-
182
- L.control.layers(baseMaps, overlayMaps).addTo(map);
183
- });
184
- });
185
- };
2
+ import LBaseLayers from "./l-base-layers.js";
3
+ import LControlLayers from "./l-control-layers.js";
4
+ import LLayerGroup from "./l-layer-group.js";
5
+ import LMap from "./l-map.js";
6
+ import LMarker from "./l-marker.js";
7
+ import LOverlayLayers from "./l-overlay-layers.js";
8
+ import LPopup from "./l-popup.js";
9
+ import LTileLayer from "./l-tile-layer.js";
10
+ import LLatLngBounds from "./l-lat-lng-bounds.js";
11
+ import LImageOverlay from "./l-image-overlay.js";
12
+ import LVideoOverlay from "./l-video-overlay.js";
13
+ import LGeoJSON from "./l-geojson.js";
14
+ import LIcon from "./l-icon.js";
186
15
 
187
16
  const init = (() => {
188
- document.addEventListener("DOMContentLoaded", render);
17
+ // Custom elements (order of definition is important)
18
+ customElements.define("l-map", LMap);
19
+ customElements.define("l-control-layers", LControlLayers);
20
+ customElements.define("l-base-layers", LBaseLayers);
21
+ customElements.define("l-overlay-layers", LOverlayLayers);
22
+ customElements.define("l-layer-group", LLayerGroup);
23
+ customElements.define("l-tile-layer", LTileLayer);
24
+ customElements.define("l-marker", LMarker);
25
+ customElements.define("l-popup", LPopup);
26
+ customElements.define("l-lat-lng-bounds", LLatLngBounds);
27
+ customElements.define("l-image-overlay", LImageOverlay);
28
+ customElements.define("l-video-overlay", LVideoOverlay);
29
+ customElements.define("l-geojson", LGeoJSON);
30
+ customElements.define("l-icon", LIcon);
189
31
  })();
190
32
 
191
33
  export default init;