leaflet-html 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- package/.github/workflows/npm-publish.yml +27 -27
- package/.prettierignore +2 -0
- package/.prettierrc +1 -0
- package/README.md +2 -2
- package/dist/leaflet-html.cjs +1 -1
- package/dist/leaflet-html.cjs.map +1 -1
- package/dist/leaflet-html.esm.js +1 -1
- package/dist/leaflet-html.esm.js.map +1 -1
- package/dist/leaflet-html.js +1 -1
- package/dist/leaflet-html.js.map +1 -1
- package/dist/leaflet-html.umd.js +1 -1
- package/dist/leaflet-html.umd.js.map +1 -1
- package/docs/content/_index.md +7 -2
- package/docs/content/articles/_index.md +5 -0
- package/docs/content/articles/basic.md +105 -0
- package/docs/content/articles/icons.md +35 -0
- package/docs/content/articles/style.md +14 -0
- package/docs/public/icons/leaf-green.png +0 -0
- package/docs/public/icons/leaf-orange.png +0 -0
- package/docs/public/icons/leaf-red.png +0 -0
- package/docs/public/icons/leaf-shadow.png +0 -0
- package/docs/static/icons/leaf-green.png +0 -0
- package/docs/static/icons/leaf-orange.png +0 -0
- package/docs/static/icons/leaf-red.png +0 -0
- package/docs/static/icons/leaf-shadow.png +0 -0
- package/docs/templates/article-page.html +8 -0
- package/docs/templates/article.html +12 -0
- package/docs/templates/base.html +59 -0
- package/docs/templates/index.html +5 -56
- package/package.json +11 -4
- package/src/events.js +3 -3
- package/src/index.js +19 -18
- package/src/l-base-layers.js +6 -7
- package/src/l-control-layers.js +17 -17
- package/src/l-geojson.js +13 -11
- package/src/l-icon.js +124 -0
- package/src/l-image-overlay.js +22 -20
- package/src/l-lat-lng-bounds.js +7 -7
- package/src/l-layer-group.js +15 -15
- package/src/l-map.js +17 -17
- package/src/l-marker.js +67 -18
- package/src/l-overlay-layers.js +6 -6
- package/src/l-popup.js +8 -10
- package/src/l-tile-layer.js +13 -10
- package/src/l-video-overlay.js +17 -16
- package/vite.config.js +7 -0
package/dist/leaflet-html.umd.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t||self).leafletHtml=e()}(this,function(){function t(){try{var
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("leaflet")):"function"==typeof define&&define.amd?define(["leaflet"],e):(t||self).leafletHtml=e(t.leaflet)}(this,function(t){function e(t){if(t&&t.__esModule)return t;var e=Object.create(null);return t&&Object.keys(t).forEach(function(n){if("default"!==n){var r=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,r.get?r:{enumerable:!0,get:function(){return t[n]}})}}),e.default=t,e}var n=/*#__PURE__*/e(t);function r(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(r=function(){return!!t})()}function i(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,o(t,e)}function a(t){return a=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},a(t)}function o(t,e){return o=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},o(t,e)}function l(t){var e="function"==typeof Map?new Map:void 0;return l=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(r())return Reflect.construct.apply(null,arguments);var i=[null];i.push.apply(i,e);var a=new(t.bind.apply(t,i));return n&&o(a,n.prototype),a}(t,arguments,a(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),o(n,t)},l(t)}var u="map:addTo",c="popup:add",s=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){this.addEventListener(u,function(t){t.detail.type="base"})},e}(/*#__PURE__*/l(HTMLElement)),p=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){var t=L.control.layers({},{});this.addEventListener(u,function(e){var n=e.detail,r=n.type,i=n.name,a=n.layer;"overlay"===r?t.addOverlay(a,i):"base"===r&&t.addBaseLayer(a,i),e.preventDefault()});var e=new CustomEvent(u,{cancelable:!0,bubbles:!0,detail:{layer:t}});this.dispatchEvent(e)},e}(/*#__PURE__*/l(HTMLElement)),d=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){var t=this.getAttribute("name"),e=L.layerGroup(),n=new CustomEvent(u,{cancelable:!0,bubbles:!0,detail:{layer:e,name:t}});this.dispatchEvent(n),this.addEventListener(u,function(t){t.stopPropagation(),e.addLayer(t.detail.layer)}),new MutationObserver(function(t){t.forEach(function(t){t.removedNodes.forEach(function(t){var n=t.getAttribute("leaflet-id"),r=e.getLayer(n);e.removeLayer(r)})})}).observe(this,{childList:!0})},e}(/*#__PURE__*/l(HTMLElement)),f=/*#__PURE__*/function(t){function e(){var e;return(e=t.call(this)||this).map=null,e.addEventListener("map:bounds",function(t){var n=t.detail;e.map[n.method](n.bounds)}),e}return i(e,t),e.prototype.connectedCallback=function(){var t=this;this.map=L.map(this);var e=this.getAttribute("center"),n=this.getAttribute("zoom");null!==e&&null!==n&&this.map.setView(JSON.parse(e),parseInt(n)),this.addEventListener(u,function(e){e.detail.layer.addTo(t.map)}),this.addEventListener("layer:remove",function(e){t.map.remove(e.detail.layer)})},e}(/*#__PURE__*/l(HTMLElement)),h=/*#__PURE__*/function(t){function e(){var e;return(e=t.call(this)||this).layer=null,e.addEventListener("icon:add",function(t){t.stopPropagation(),e.layer.setIcon(t.detail.icon)}),e}i(e,t);var r=e.prototype;return r.connectedCallback=function(){var t=this,e=JSON.parse(this.getAttribute("lat-lng")),r=parseFloat(this.getAttribute("opacity")||"1.0");if(this.layer=n.marker(e,{opacity:r}),this.hasAttribute("icon")){var i=n.icon(JSON.parse(this.getAttribute("icon")));this.layer.setIcon(i)}this.setAttribute("leaflet-id",n.stamp(this.layer)),this.addEventListener(c,function(e){t.layer.bindPopup(e.detail.content)});var a=new CustomEvent(u,{cancelable:!0,bubbles:!0,detail:{layer:this.layer}});this.dispatchEvent(a)},r.attributeChangedCallback=function(t,e,r){null!==this.layer&&("lat-lng"===t&&this.layer.setLatLng(JSON.parse(r)),"opacity"===t&&this.layer.setOpacity(parseFloat(r)),"icon"===t&&this.layer.setIcon(n.icon(JSON.parse(r))))},e}(/*#__PURE__*/l(HTMLElement));h.observedAttributes=["lat-lng","opacity","icon"];var b=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){this.addEventListener(u,function(t){t.detail.type="overlay"})},e}(/*#__PURE__*/l(HTMLElement)),y=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){var t=this.getAttribute("content"),e=new CustomEvent(c,{cancelable:!0,bubbles:!0,detail:{content:t}});this.dispatchEvent(e)},e}(/*#__PURE__*/l(HTMLElement)),v=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){var t=this.getAttribute("name"),e=this.getAttribute("url-template"),n=this.getAttribute("attribution"),r=L.tileLayer(e,{attribution:n}),i=new CustomEvent(u,{detail:{name:t,layer:r},bubbles:!0});this.dispatchEvent(i)},e}(/*#__PURE__*/l(HTMLElement)),m=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.attributeChangedCallback=function(t,e,n){var r=new CustomEvent("map:bounds",{bubbles:!0,detail:{bounds:JSON.parse(n),method:this.getAttribute("method")||"fitBounds"}});this.dispatchEvent(r)},e}(/*#__PURE__*/l(HTMLElement));m.observedAttributes=["bounds"];var E=/*#__PURE__*/function(t){function e(){var e;return(e=t.call(this)||this).layer=null,e}i(e,t);var n=e.prototype;return n.connectedCallback=function(){var t=this.getAttribute("url"),e=JSON.parse(this.getAttribute("bounds")),n={opacity:parseFloat(this.getAttribute("opacity")||"1.0"),alt:this.getAttribute("alt")||""};this.layer=L.imageOverlay(t,e,n),this.dispatchEvent(new CustomEvent(u,{cancelable:!0,bubbles:!0,detail:{layer:this.layer}}))},n.attributeChangedCallback=function(t,e,n){null!==this.layer&&("url"===t?this.layer.setUrl(n):"bounds"===t?this.layer.setBounds(JSON.parse(n)):"opacity"===t&&this.layer.setOpacity(parseFloat(n)))},e}(/*#__PURE__*/l(HTMLElement));E.observedAttributes=["url","bounds","opacity"];var g=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){var t=JSON.parse(this.getAttribute("url")),e=JSON.parse(this.getAttribute("bounds")),n={opacity:parseFloat(this.getAttribute("opacity")||"1.0"),alt:this.getAttribute("alt")||"",autoplay:!0,muted:!0,playsInline:!0},r=L.videoOverlay(t,e,n);this.dispatchEvent(new CustomEvent(u,{cancelable:!0,bubbles:!0,detail:{layer:r}}))},e}(/*#__PURE__*/l(HTMLElement)),O=/*#__PURE__*/function(t){function e(){return t.call(this)||this}return i(e,t),e.prototype.connectedCallback=function(){var t=L.geoJSON(JSON.parse(this.getAttribute("geojson")));this.dispatchEvent(new CustomEvent(u,{bubbles:!0,cancelable:!0,detail:{layer:t}}))},e}(/*#__PURE__*/l(HTMLElement)),A=function(t){return t.replace(/-./g,function(t){return t[1].toUpperCase()})},C=/*#__PURE__*/function(t){function e(){var e;return(e=t.call(this)||this).icon=null,e}return i(e,t),e.prototype.connectedCallback=function(){var t=this,e={};["icon-url","icon-retina-url","shadow-url","shadow-retina-url","class-name"].forEach(function(n){t.hasAttribute(n)&&(e[A(n)]=t.getAttribute(n))}),["icon-anchor","icon-size","shadow-anchor","shadow-size","tooltip-anchor","popup-anchor"].forEach(function(n){t.hasAttribute(n)&&(e[A(n)]=JSON.parse(t.getAttribute(n)))}),this.hasAttribute("cross-origin")&&(e.crossOrigin="true"===this.getAttribute("cross-origin")),this.icon=n.icon(e);var r=new CustomEvent("icon:add",{cancelable:!0,bubbles:!0,detail:{icon:this.icon}});this.dispatchEvent(r)},e}(/*#__PURE__*/l(HTMLElement));return customElements.define("l-map",f),customElements.define("l-control-layers",p),customElements.define("l-base-layers",s),customElements.define("l-overlay-layers",b),customElements.define("l-layer-group",d),customElements.define("l-tile-layer",v),customElements.define("l-marker",h),customElements.define("l-popup",y),customElements.define("l-lat-lng-bounds",m),customElements.define("l-image-overlay",E),customElements.define("l-video-overlay",g),customElements.define("l-geojson",O),void customElements.define("l-icon",C)});
|
2
2
|
//# sourceMappingURL=leaflet-html.umd.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"leaflet-html.umd.js","sources":["../src/events.js","../src/l-base-layers.js","../src/l-control-layers.js","../src/l-layer-group.js","../src/l-map.js","../src/l-marker.js","../src/l-overlay-layers.js","../src/l-popup.js","../src/l-tile-layer.js","../src/l-lat-lng-bounds.js","../src/l-image-overlay.js","../src/l-video-overlay.js","../src/l-geojson.js","../src/index.js"],"sourcesContent":["export const mapAddTo = \"map:addTo\"\nexport const popupAdd = \"popup:add\"\nexport const layerRemove = \"layer:remove\"\n","import { mapAddTo } from \"./events.js\"\n\nclass LBaseLayers extends HTMLElement {\n constructor() {\n super()\n }\n \n connectedCallback() {\n this.addEventListener(mapAddTo, (ev) => {\n ev.detail[\"type\"] = \"base\"\n })\n }\n}\n\nexport default LBaseLayers\n\n","import { mapAddTo } from \"./events.js\"\n\nclass LControlLayers extends HTMLElement {\n constructor() {\n super()\n }\n \n connectedCallback() {\n const base = {}\n const overlay = {}\n const control = L.control.layers(base, overlay)\n\n this.addEventListener(mapAddTo, (ev) => {\n const { type, name, layer } = ev.detail\n if (type === \"overlay\") {\n control.addOverlay(layer, name)\n } else if (type === \"base\") {\n control.addBaseLayer(layer, name)\n }\n ev.preventDefault()\n })\n \n const event = new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: control\n }\n })\n this.dispatchEvent(event)\n }\n}\n\nexport default LControlLayers\n","import { mapAddTo } from \"./events.js\"\n\nclass LLayerGroup extends HTMLElement {\n constructor() {\n super()\n }\n \n connectedCallback() {\n const name = this.getAttribute(\"name\")\n const group = L.layerGroup()\n const event = new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: group,\n name\n }\n })\n this.dispatchEvent(event)\n\n this.addEventListener(mapAddTo, (ev) => {\n ev.stopPropagation()\n group.addLayer(ev.detail.layer)\n })\n\n const observer = new MutationObserver(function(mutations) {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n const leafletId = node.getAttribute(\"leaflet-id\");\n const layer = group.getLayer(leafletId);\n group.removeLayer(layer);\n });\n });\n });\n observer.observe(this, { childList: true })\n }\n}\n\nexport default LLayerGroup\n","// @ts-check\nimport { layerRemove, mapAddTo } from \"./events.js\"\n\nclass LMap extends HTMLElement {\n constructor() {\n super()\n\n this.map = null\n this.addEventListener(\"map:bounds\", (ev) => {\n const { bounds, method } = ev.detail\n this.map[method](bounds)\n })\n }\n\n connectedCallback() {\n this.map = L.map(this)\n const center = this.getAttribute(\"center\")\n const zoom = this.getAttribute(\"zoom\")\n if ((center !== null) && (zoom !== null)) {\n this.map.setView(JSON.parse(center), parseInt(zoom))\n }\n this.addEventListener(mapAddTo, (ev) => {\n const layer = ev.detail.layer\n layer.addTo(this.map)\n })\n\n this.addEventListener(layerRemove, (ev) => {\n this.map.remove(ev.detail.layer)\n })\n }\n}\n\nexport default LMap\n","import { mapAddTo, popupAdd } from \"./events.js\"; \n\nclass LMarker extends HTMLElement {\n static observedAttributes = [\"lat-lng\", \"opacity\"]\n\n constructor() {\n super()\n this.layer = null\n }\n\n connectedCallback() {\n const latLng = JSON.parse(this.getAttribute(\"lat-lng\"))\n const opacity = parseFloat(this.getAttribute(\"opacity\") || \"1.0\")\n this.layer = L.marker(latLng, { opacity });\n this.setAttribute(\"leaflet-id\", L.stamp(this.layer))\n\n this.addEventListener(popupAdd, (ev) => {\n const { content } = ev.detail\n this.layer.bindPopup(content)\n })\n \n const event = new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: this.layer\n }\n })\n this.dispatchEvent(event)\n }\n\n attributeChangedCallback(name, _oldValue, newValue) {\n if (this.layer !== null) {\n if (name === \"lat-lng\") {\n this.layer.setLatLng(JSON.parse(newValue))\n }\n if (name === \"opacity\") {\n this.layer.setOpacity(parseFloat(newValue))\n }\n }\n }\n}\n\n\nexport default LMarker\n","import { mapAddTo } from \"./events.js\"\n\nclass LOverlayLayers extends HTMLElement {\n constructor() {\n super()\n }\n \n connectedCallback() {\n this.addEventListener(mapAddTo, (ev) => {\n ev.detail[\"type\"] = \"overlay\"\n })\n }\n}\n\nexport default LOverlayLayers\n","import { popupAdd } from \"./events.js\"\n\nclass LPopup extends HTMLElement {\n constructor() {\n super()\n }\n\n connectedCallback() {\n const content = this.getAttribute(\"content\")\n const event = new CustomEvent(popupAdd, {\n cancelable: true,\n bubbles: true,\n detail: {\n content\n }\n })\n this.dispatchEvent(event)\n }\n}\n\n\nexport default LPopup\n\n","import { mapAddTo } from \"./events.js\"\n\nclass LTileLayer extends HTMLElement {\n constructor() {\n super()\n }\n\n connectedCallback() {\n const name = this.getAttribute(\"name\")\n const urlTemplate = this.getAttribute(\"url-template\")\n const attribution = this.getAttribute(\"attribution\")\n const options = { attribution }\n const layer = L.tileLayer(urlTemplate, options)\n const event = new CustomEvent(mapAddTo, { detail: { name, layer }, bubbles: true})\n this.dispatchEvent(event)\n }\n}\n\nexport default LTileLayer\n","class LLatLngBounds extends HTMLElement {\n static observedAttributes = [\"bounds\"]\n\n constructor() {\n super()\n }\n\n attributeChangedCallback(_name, _oldValue, newValue) {\n const event = new CustomEvent(\"map:bounds\", {\n bubbles: true,\n detail: {\n bounds: JSON.parse(newValue),\n method: this.getAttribute(\"method\") || \"fitBounds\"\n }\n })\n this.dispatchEvent(event)\n }\n}\n\nexport default LLatLngBounds\n","import { mapAddTo } from \"./events.js\"\n\nclass LImageOverlay extends HTMLElement {\n static observedAttributes = [\"url\", \"bounds\", \"opacity\"]\n\n constructor() {\n super()\n this.layer = null\n }\n\n connectedCallback() {\n const url = this.getAttribute(\"url\")\n const bounds = JSON.parse(this.getAttribute(\"bounds\"))\n const options = {\n opacity: parseFloat(this.getAttribute(\"opacity\") || \"1.0\"),\n alt: this.getAttribute(\"alt\") || \"\"\n }\n this.layer = L.imageOverlay(url, bounds, options)\n this.dispatchEvent(new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: this.layer\n }\n }))\n }\n\n attributeChangedCallback(name, _oldValue, newValue) {\n if (this.layer !== null) {\n if (name === \"url\") {\n this.layer.setUrl(newValue)\n } else if (name === \"bounds\") {\n this.layer.setBounds(JSON.parse(newValue))\n } else if (name === \"opacity\") {\n this.layer.setOpacity(parseFloat(newValue))\n }\n }\n }\n}\n\nexport default LImageOverlay\n","import { mapAddTo } from \"./events.js\"\n\nclass LVideoOverlay extends HTMLElement {\n constructor() {\n super()\n }\n\n connectedCallback() {\n const url = JSON.parse(this.getAttribute(\"url\"))\n const bounds = JSON.parse(this.getAttribute(\"bounds\"))\n const options = {\n opacity: parseFloat(this.getAttribute(\"opacity\") || \"1.0\"),\n alt: this.getAttribute(\"alt\") || \"\",\n autoplay: true,\n muted: true,\n playsInline: true\n }\n const layer = L.videoOverlay(url, bounds, options)\n this.dispatchEvent(new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer\n }\n }))\n }\n}\n\nexport default LVideoOverlay\n\n","import { mapAddTo } from \"./events.js\"\n\nclass LGeoJSON extends HTMLElement {\n constructor() {\n super()\n }\n\n connectedCallback() {\n const layer = L.geoJSON(JSON.parse(this.getAttribute(\"geojson\")))\n this.dispatchEvent(new CustomEvent(mapAddTo, {\n bubbles: true,\n cancelable: true,\n detail: {\n layer\n }\n }))\n }\n}\n\nexport default LGeoJSON\n","// @ts-check\nimport LBaseLayers from \"./l-base-layers.js\";\nimport LControlLayers from \"./l-control-layers.js\"; \nimport LLayerGroup from \"./l-layer-group.js\"; \nimport LMap from \"./l-map.js\"; \nimport LMarker from \"./l-marker.js\"; \nimport LOverlayLayers from \"./l-overlay-layers.js\";\nimport LPopup from \"./l-popup.js\"; \nimport LTileLayer from \"./l-tile-layer.js\";\nimport LLatLngBounds from \"./l-lat-lng-bounds.js\";\nimport LImageOverlay from \"./l-image-overlay.js\";\nimport LVideoOverlay from \"./l-video-overlay.js\";\nimport LGeoJSON from \"./l-geojson.js\";\n\n\nconst init = (() => {\n // Custom elements (order of definition is important)\n customElements.define(\"l-map\", LMap)\n customElements.define(\"l-control-layers\", LControlLayers)\n customElements.define(\"l-base-layers\", LBaseLayers)\n customElements.define(\"l-overlay-layers\", LOverlayLayers)\n customElements.define(\"l-layer-group\", LLayerGroup)\n customElements.define(\"l-tile-layer\", LTileLayer)\n customElements.define(\"l-marker\", LMarker)\n customElements.define(\"l-popup\", LPopup)\n customElements.define(\"l-lat-lng-bounds\", LLatLngBounds)\n customElements.define(\"l-image-overlay\", LImageOverlay)\n customElements.define(\"l-video-overlay\", LVideoOverlay)\n customElements.define(\"l-geojson\", LGeoJSON)\n})();\n\nexport default init;\n"],"names":["mapAddTo","popupAdd","LBaseLayers","_HTMLElement","call","this","_inheritsLoose","prototype","connectedCallback","addEventListener","ev","detail","_wrapNativeSuper","HTMLElement","LControlLayers","control","L","layers","_ev$detail","type","name","layer","addOverlay","addBaseLayer","preventDefault","event","CustomEvent","cancelable","bubbles","dispatchEvent","LLayerGroup","getAttribute","group","layerGroup","stopPropagation","addLayer","MutationObserver","mutations","forEach","mutation","removedNodes","node","leafletId","getLayer","removeLayer","observe","childList","LMap","_this","map","method","bounds","_this2","center","zoom","setView","JSON","parse","parseInt","addTo","remove","LMarker","_proto","latLng","opacity","parseFloat","marker","setAttribute","stamp","bindPopup","content","attributeChangedCallback","_oldValue","newValue","setLatLng","setOpacity","observedAttributes","LOverlayLayers","LPopup","LTileLayer","urlTemplate","attribution","tileLayer","LLatLngBounds","_name","LImageOverlay","url","options","alt","imageOverlay","setUrl","setBounds","LVideoOverlay","autoplay","muted","playsInline","videoOverlay","LGeoJSON","geoJSON","customElements","define"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"leaflet-html.umd.js","sources":["../src/events.js","../src/l-base-layers.js","../src/l-control-layers.js","../src/l-layer-group.js","../src/l-map.js","../src/l-marker.js","../src/l-overlay-layers.js","../src/l-popup.js","../src/l-tile-layer.js","../src/l-lat-lng-bounds.js","../src/l-image-overlay.js","../src/l-video-overlay.js","../src/l-geojson.js","../src/l-icon.js","../src/index.js"],"sourcesContent":["export const mapAddTo = \"map:addTo\";\nexport const popupAdd = \"popup:add\";\nexport const layerRemove = \"layer:remove\";\n","import { mapAddTo } from \"./events.js\";\n\nclass LBaseLayers extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.addEventListener(mapAddTo, (ev) => {\n ev.detail[\"type\"] = \"base\";\n });\n }\n}\n\nexport default LBaseLayers;\n","import { mapAddTo } from \"./events.js\";\n\nclass LControlLayers extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n const base = {};\n const overlay = {};\n const control = L.control.layers(base, overlay);\n\n this.addEventListener(mapAddTo, (ev) => {\n const { type, name, layer } = ev.detail;\n if (type === \"overlay\") {\n control.addOverlay(layer, name);\n } else if (type === \"base\") {\n control.addBaseLayer(layer, name);\n }\n ev.preventDefault();\n });\n\n const event = new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: control,\n },\n });\n this.dispatchEvent(event);\n }\n}\n\nexport default LControlLayers;\n","import { mapAddTo } from \"./events.js\";\n\nclass LLayerGroup extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n const name = this.getAttribute(\"name\");\n const group = L.layerGroup();\n const event = new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: group,\n name,\n },\n });\n this.dispatchEvent(event);\n\n this.addEventListener(mapAddTo, (ev) => {\n ev.stopPropagation();\n group.addLayer(ev.detail.layer);\n });\n\n const observer = new MutationObserver(function (mutations) {\n mutations.forEach((mutation) => {\n mutation.removedNodes.forEach((node) => {\n const leafletId = node.getAttribute(\"leaflet-id\");\n const layer = group.getLayer(leafletId);\n group.removeLayer(layer);\n });\n });\n });\n observer.observe(this, { childList: true });\n }\n}\n\nexport default LLayerGroup;\n","// @ts-check\nimport { layerRemove, mapAddTo } from \"./events.js\";\n\nclass LMap extends HTMLElement {\n constructor() {\n super();\n\n this.map = null;\n this.addEventListener(\"map:bounds\", (ev) => {\n const { bounds, method } = ev.detail;\n this.map[method](bounds);\n });\n }\n\n connectedCallback() {\n this.map = L.map(this);\n const center = this.getAttribute(\"center\");\n const zoom = this.getAttribute(\"zoom\");\n if (center !== null && zoom !== null) {\n this.map.setView(JSON.parse(center), parseInt(zoom));\n }\n this.addEventListener(mapAddTo, (ev) => {\n const layer = ev.detail.layer;\n layer.addTo(this.map);\n });\n\n this.addEventListener(layerRemove, (ev) => {\n this.map.remove(ev.detail.layer);\n });\n }\n}\n\nexport default LMap;\n","// @vitest-environment happy-dom\nimport * as L from \"leaflet\";\nimport { mapAddTo, popupAdd } from \"./events.js\";\n\nclass LMarker extends HTMLElement {\n static observedAttributes = [\"lat-lng\", \"opacity\", \"icon\"];\n\n constructor() {\n super();\n this.layer = null;\n this.addEventListener(\"icon:add\", (ev) => {\n ev.stopPropagation();\n this.layer.setIcon(ev.detail.icon);\n })\n }\n\n connectedCallback() {\n const latLng = JSON.parse(this.getAttribute(\"lat-lng\"));\n const opacity = parseFloat(this.getAttribute(\"opacity\") || \"1.0\");\n this.layer = L.marker(latLng, { opacity });\n if (this.hasAttribute(\"icon\")) {\n const icon = L.icon(JSON.parse(this.getAttribute(\"icon\")));\n this.layer.setIcon(icon);\n }\n\n this.setAttribute(\"leaflet-id\", L.stamp(this.layer));\n\n this.addEventListener(popupAdd, (ev) => {\n const { content } = ev.detail;\n this.layer.bindPopup(content);\n });\n\n const event = new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: this.layer,\n },\n });\n this.dispatchEvent(event);\n }\n\n attributeChangedCallback(name, _oldValue, newValue) {\n if (this.layer !== null) {\n if (name === \"lat-lng\") {\n this.layer.setLatLng(JSON.parse(newValue));\n }\n if (name === \"opacity\") {\n this.layer.setOpacity(parseFloat(newValue));\n }\n if (name === \"icon\") {\n this.layer.setIcon(L.icon(JSON.parse(newValue)));\n }\n }\n }\n}\n\nif (import.meta.vitest) {\n const { it, expect, beforeAll } = import.meta.vitest;\n\n beforeAll(() => {\n customElements.define(\"l-marker\", LMarker);\n });\n\n it(\"default icon\", () => {\n const el = document.createElement(\"l-marker\");\n document.body.appendChild(el);\n let actual = el.layer.getIcon();\n let expected = new L.Icon.Default();\n expect(actual).toEqual(expected);\n });\n\n it(\"adds an icon\", () => {\n const el = document.createElement(\"l-marker\");\n // Set attribute before appendChild\n el.setAttribute(\"icon\", JSON.stringify({ iconUrl: \"foo.png\" }));\n document.body.appendChild(el);\n let actual = el.layer.getIcon();\n let expected = L.icon({ iconUrl: \"foo.png\" });\n expect(actual).toEqual(expected);\n });\n\n it(\"changes an icon\", () => {\n const el = document.createElement(\"l-marker\");\n // Set attribute after appendChild\n document.body.appendChild(el);\n el.setAttribute(\"icon\", JSON.stringify({ iconUrl: \"bar.png\" }));\n let actual = el.layer.getIcon();\n let expected = L.icon({ iconUrl: \"bar.png\" });\n expect(actual).toEqual(expected);\n });\n}\n\nexport default LMarker;\n","import { mapAddTo } from \"./events.js\";\n\nclass LOverlayLayers extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n this.addEventListener(mapAddTo, (ev) => {\n ev.detail[\"type\"] = \"overlay\";\n });\n }\n}\n\nexport default LOverlayLayers;\n","import { popupAdd } from \"./events.js\";\n\nclass LPopup extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n const content = this.getAttribute(\"content\");\n const event = new CustomEvent(popupAdd, {\n cancelable: true,\n bubbles: true,\n detail: {\n content,\n },\n });\n this.dispatchEvent(event);\n }\n}\n\nexport default LPopup;\n","import { mapAddTo } from \"./events.js\";\n\nclass LTileLayer extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n const name = this.getAttribute(\"name\");\n const urlTemplate = this.getAttribute(\"url-template\");\n const attribution = this.getAttribute(\"attribution\");\n const options = { attribution };\n const layer = L.tileLayer(urlTemplate, options);\n const event = new CustomEvent(mapAddTo, {\n detail: { name, layer },\n bubbles: true,\n });\n this.dispatchEvent(event);\n }\n}\n\nexport default LTileLayer;\n","class LLatLngBounds extends HTMLElement {\n static observedAttributes = [\"bounds\"];\n\n constructor() {\n super();\n }\n\n attributeChangedCallback(_name, _oldValue, newValue) {\n const event = new CustomEvent(\"map:bounds\", {\n bubbles: true,\n detail: {\n bounds: JSON.parse(newValue),\n method: this.getAttribute(\"method\") || \"fitBounds\",\n },\n });\n this.dispatchEvent(event);\n }\n}\n\nexport default LLatLngBounds;\n","import { mapAddTo } from \"./events.js\";\n\nclass LImageOverlay extends HTMLElement {\n static observedAttributes = [\"url\", \"bounds\", \"opacity\"];\n\n constructor() {\n super();\n this.layer = null;\n }\n\n connectedCallback() {\n const url = this.getAttribute(\"url\");\n const bounds = JSON.parse(this.getAttribute(\"bounds\"));\n const options = {\n opacity: parseFloat(this.getAttribute(\"opacity\") || \"1.0\"),\n alt: this.getAttribute(\"alt\") || \"\",\n };\n this.layer = L.imageOverlay(url, bounds, options);\n this.dispatchEvent(\n new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer: this.layer,\n },\n }),\n );\n }\n\n attributeChangedCallback(name, _oldValue, newValue) {\n if (this.layer !== null) {\n if (name === \"url\") {\n this.layer.setUrl(newValue);\n } else if (name === \"bounds\") {\n this.layer.setBounds(JSON.parse(newValue));\n } else if (name === \"opacity\") {\n this.layer.setOpacity(parseFloat(newValue));\n }\n }\n }\n}\n\nexport default LImageOverlay;\n","import { mapAddTo } from \"./events.js\";\n\nclass LVideoOverlay extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n const url = JSON.parse(this.getAttribute(\"url\"));\n const bounds = JSON.parse(this.getAttribute(\"bounds\"));\n const options = {\n opacity: parseFloat(this.getAttribute(\"opacity\") || \"1.0\"),\n alt: this.getAttribute(\"alt\") || \"\",\n autoplay: true,\n muted: true,\n playsInline: true,\n };\n const layer = L.videoOverlay(url, bounds, options);\n this.dispatchEvent(\n new CustomEvent(mapAddTo, {\n cancelable: true,\n bubbles: true,\n detail: {\n layer,\n },\n }),\n );\n }\n}\n\nexport default LVideoOverlay;\n","import { mapAddTo } from \"./events.js\";\n\nclass LGeoJSON extends HTMLElement {\n constructor() {\n super();\n }\n\n connectedCallback() {\n const layer = L.geoJSON(JSON.parse(this.getAttribute(\"geojson\")));\n this.dispatchEvent(\n new CustomEvent(mapAddTo, {\n bubbles: true,\n cancelable: true,\n detail: {\n layer,\n },\n }),\n );\n }\n}\n\nexport default LGeoJSON;\n","// @vitest-environment happy-dom\nimport * as L from \"leaflet\";\n\nconst camelCase = (kebab) => kebab.replace(/-./g, (x) => x[1].toUpperCase());\n\nclass LIcon extends HTMLElement {\n constructor() {\n super();\n this.icon = null;\n }\n\n connectedCallback() {\n const options = {};\n\n // Strings\n let keys = [\n \"icon-url\",\n \"icon-retina-url\",\n \"shadow-url\",\n \"shadow-retina-url\",\n \"class-name\",\n ];\n keys.forEach((key) => {\n if (this.hasAttribute(key)) {\n options[camelCase(key)] = this.getAttribute(key);\n }\n });\n\n // Points\n let points = [\n \"icon-anchor\",\n \"icon-size\",\n \"shadow-anchor\",\n \"shadow-size\",\n \"tooltip-anchor\",\n \"popup-anchor\",\n ];\n points.forEach((key) => {\n if (this.hasAttribute(key)) {\n options[camelCase(key)] = JSON.parse(this.getAttribute(key));\n }\n });\n\n if (this.hasAttribute(\"cross-origin\")) {\n options.crossOrigin = this.getAttribute(\"cross-origin\") === \"true\";\n }\n this.icon = L.icon(options);\n\n const event = new CustomEvent(\"icon:add\", {\n cancelable: true,\n bubbles: true,\n detail: {\n icon: this.icon,\n },\n });\n this.dispatchEvent(event);\n }\n}\n\nif (import.meta.vitest) {\n const { it, expect, beforeAll } = import.meta.vitest;\n\n beforeAll(() => {\n customElements.define(\"l-icon\", LIcon);\n });\n\n it(\"default\", () => {\n const el = document.createElement(\"l-icon\");\n document.body.appendChild(el);\n\n let actual = el.icon;\n let expected = L.icon();\n expect(actual).toEqual(expected);\n });\n\n it(\"emits icon:add event\", async () => {\n const el = document.createElement(\"l-icon\");\n let promise = new Promise((resolve) => {\n el.addEventListener(\"icon:add\", (ev) => {\n resolve(ev.detail.icon);\n });\n });\n document.body.appendChild(el);\n let actual = await promise;\n let expected = L.icon();\n expect(actual).toEqual(expected);\n });\n\n it(\"options\", () => {\n const el = document.createElement(\"l-icon\");\n el.setAttribute(\"icon-url\", \"url.png\");\n el.setAttribute(\"icon-retina-url\", \"retina.png\");\n el.setAttribute(\"icon-size\", \"[0, 0]\");\n el.setAttribute(\"icon-anchor\", \"[0, 0]\");\n el.setAttribute(\"popup-anchor\", \"[0, 0]\");\n el.setAttribute(\"tooltip-anchor\", \"[0, 0]\");\n el.setAttribute(\"shadow-url\", \"urlShadow.png\");\n el.setAttribute(\"shadow-retina-url\", \"retinaShadow.png\");\n el.setAttribute(\"shadow-size\", \"[0, 0]\");\n el.setAttribute(\"shadow-anchor\", \"[0, 0]\");\n el.setAttribute(\"class-name\", \"foo\");\n el.setAttribute(\"cross-origin\", \"true\");\n document.body.appendChild(el);\n\n let actual = el.icon;\n let expected = L.icon({\n iconUrl: \"url.png\",\n iconRetinaUrl: \"retina.png\",\n iconSize: [0, 0],\n iconAnchor: [0, 0],\n popupAnchor: [0, 0],\n tooltipAnchor: [0, 0],\n shadowUrl: \"urlShadow.png\",\n shadowRetinaUrl: \"retinaShadow.png\",\n shadowSize: [0, 0],\n shadowAnchor: [0, 0],\n className: \"foo\",\n crossOrigin: true,\n });\n expect(actual).toEqual(expected);\n });\n}\n\nexport default LIcon;\n","// @ts-check\nimport LBaseLayers from \"./l-base-layers.js\";\nimport LControlLayers from \"./l-control-layers.js\";\nimport LLayerGroup from \"./l-layer-group.js\";\nimport LMap from \"./l-map.js\";\nimport LMarker from \"./l-marker.js\";\nimport LOverlayLayers from \"./l-overlay-layers.js\";\nimport LPopup from \"./l-popup.js\";\nimport LTileLayer from \"./l-tile-layer.js\";\nimport LLatLngBounds from \"./l-lat-lng-bounds.js\";\nimport LImageOverlay from \"./l-image-overlay.js\";\nimport LVideoOverlay from \"./l-video-overlay.js\";\nimport LGeoJSON from \"./l-geojson.js\";\nimport LIcon from \"./l-icon.js\";\n\nconst init = (() => {\n // Custom elements (order of definition is important)\n customElements.define(\"l-map\", LMap);\n customElements.define(\"l-control-layers\", LControlLayers);\n customElements.define(\"l-base-layers\", LBaseLayers);\n customElements.define(\"l-overlay-layers\", LOverlayLayers);\n customElements.define(\"l-layer-group\", LLayerGroup);\n customElements.define(\"l-tile-layer\", LTileLayer);\n customElements.define(\"l-marker\", LMarker);\n customElements.define(\"l-popup\", LPopup);\n customElements.define(\"l-lat-lng-bounds\", LLatLngBounds);\n customElements.define(\"l-image-overlay\", LImageOverlay);\n customElements.define(\"l-video-overlay\", LVideoOverlay);\n customElements.define(\"l-geojson\", LGeoJSON);\n customElements.define(\"l-icon\", LIcon);\n})();\n\nexport default init;\n"],"names":["mapAddTo","popupAdd","LBaseLayers","_HTMLElement","call","this","_inheritsLoose","prototype","connectedCallback","addEventListener","ev","detail","_wrapNativeSuper","HTMLElement","LControlLayers","control","L","layers","_ev$detail","type","name","layer","addOverlay","addBaseLayer","preventDefault","event","CustomEvent","cancelable","bubbles","dispatchEvent","LLayerGroup","getAttribute","group","layerGroup","stopPropagation","addLayer","MutationObserver","mutations","forEach","mutation","removedNodes","node","leafletId","getLayer","removeLayer","observe","childList","LMap","_this","map","method","bounds","_this2","center","zoom","setView","JSON","parse","parseInt","addTo","remove","LMarker","setIcon","icon","_proto","latLng","opacity","parseFloat","marker","hasAttribute","setAttribute","stamp","bindPopup","content","attributeChangedCallback","_oldValue","newValue","setLatLng","setOpacity","observedAttributes","LOverlayLayers","LPopup","LTileLayer","urlTemplate","attribution","tileLayer","LLatLngBounds","_name","LImageOverlay","url","options","alt","imageOverlay","setUrl","setBounds","LVideoOverlay","autoplay","muted","playsInline","videoOverlay","LGeoJSON","geoJSON","camelCase","kebab","replace","x","toUpperCase","LIcon","key","crossOrigin","customElements","define"],"mappings":"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"}
|
package/docs/content/_index.md
CHANGED
@@ -5,6 +5,11 @@
|
|
5
5
|
[LeafletJS](https://leafletjs.com/) is a library geared towards map based visualisations.
|
6
6
|
Leaflet HTML expresses that JavaScript API in HTML.
|
7
7
|
|
8
|
+
## How-to guides
|
9
|
+
|
10
|
+
[Articles](@/articles/_index.md) have been written to make adopting Leaflet HTML simpler.
|
11
|
+
These articles follow the Leaflet tutorials closely and add a few `leaflet-html` specific
|
12
|
+
tips and tricks.
|
8
13
|
|
9
14
|
## Design principles
|
10
15
|
|
@@ -47,9 +52,9 @@ The following is a live running example of Leaflet HTML.
|
|
47
52
|
</l-control-layers>
|
48
53
|
</l-map>
|
49
54
|
|
55
|
+
The above application is represented in HTML using the following syntax.
|
50
56
|
|
51
57
|
```html
|
52
|
-
<!-- Example -->
|
53
58
|
<l-map center="[39.61, -105.02]" zoom="10">
|
54
59
|
<l-control-layers>
|
55
60
|
<l-base-layers>
|
@@ -59,7 +64,6 @@ The following is a live running example of Leaflet HTML.
|
|
59
64
|
attribution='© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors © <a href="https://carto.com/attributions">CARTO</a>'
|
60
65
|
max-zoom="20"
|
61
66
|
subdomains="abcd"
|
62
|
-
show
|
63
67
|
></l-tile-layer>
|
64
68
|
</l-base-layers>
|
65
69
|
<l-overlay-layers>
|
@@ -82,3 +86,4 @@ The following is a live running example of Leaflet HTML.
|
|
82
86
|
</l-map>
|
83
87
|
```
|
84
88
|
|
89
|
+
The above example is a taste of the syntax and capabilities of wrapping Leaflet in HTML tags.
|
@@ -0,0 +1,105 @@
|
|
1
|
+
+++
|
2
|
+
title = "Basic usage"
|
3
|
+
+++
|
4
|
+
|
5
|
+
The minimal `leaflet-html` app is a basemap centered and zoomed on a location.
|
6
|
+
|
7
|
+
```html
|
8
|
+
<l-map center="[53, 0]" zoom="4">
|
9
|
+
<l-tile-layer
|
10
|
+
url-template="https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png"
|
11
|
+
></l-tile-layer>
|
12
|
+
</l-map>
|
13
|
+
```
|
14
|
+
|
15
|
+
<l-map center="[53, 0]" zoom="4">
|
16
|
+
<l-tile-layer
|
17
|
+
url-template="https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png"
|
18
|
+
></l-tile-layer>
|
19
|
+
</l-map>
|
20
|
+
|
21
|
+
To add the above widget to a HTML document both JS and CSS tags need to be included in the `<head>` of the page.
|
22
|
+
|
23
|
+
## Assets
|
24
|
+
|
25
|
+
Basic HTML recommended settings, e.g. `charset`, `lang`, and `viewport` to help with cross device support.
|
26
|
+
Can be placed in the `<head>` tag, along with CSS and JS assets.
|
27
|
+
|
28
|
+
```html
|
29
|
+
<head lang="en">
|
30
|
+
<meta charset="utf-8" />
|
31
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
32
|
+
</head>
|
33
|
+
```
|
34
|
+
|
35
|
+
### Leaflet
|
36
|
+
|
37
|
+
Leaflet is an external dependency of `leaflet-html`, as such,
|
38
|
+
the standard Leaflet assets should be included.
|
39
|
+
|
40
|
+
```html
|
41
|
+
<head>
|
42
|
+
...
|
43
|
+
<link
|
44
|
+
rel="stylesheet"
|
45
|
+
href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
|
46
|
+
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
|
47
|
+
crossorigin=""
|
48
|
+
/>
|
49
|
+
<script
|
50
|
+
src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
|
51
|
+
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
|
52
|
+
crossorigin=""
|
53
|
+
></script>
|
54
|
+
...
|
55
|
+
</head>
|
56
|
+
```
|
57
|
+
|
58
|
+
### Leaflet-HTML
|
59
|
+
|
60
|
+
Leaflet-HTML is available via **npm** and **unpkg**.
|
61
|
+
To get started quickly, use the CDN version available on **unpkg**.
|
62
|
+
|
63
|
+
```html
|
64
|
+
<script
|
65
|
+
type="module"
|
66
|
+
src="https://unpkg.com/leaflet-html@latest/dist/leaflet-html.js"
|
67
|
+
></script>
|
68
|
+
```
|
69
|
+
|
70
|
+
The `@latest` keyword should keep your site up to date during development.
|
71
|
+
|
72
|
+
## Minimal style
|
73
|
+
|
74
|
+
By default Custom elements are `display: inline`,
|
75
|
+
meaning they are unaffected by `height`.
|
76
|
+
Add the following ruleset to your stylesheet to enable map size.
|
77
|
+
|
78
|
+
```css
|
79
|
+
l-map {
|
80
|
+
display: block;
|
81
|
+
}
|
82
|
+
```
|
83
|
+
|
84
|
+
It's not always necessary to set `block` directly on an `l-map` tag.
|
85
|
+
For example, a parent with `display: grid`, will size the `l-map` tag appropriately.
|
86
|
+
|
87
|
+
### Z-index
|
88
|
+
|
89
|
+
Leaflet has fairly strong `z-index` settings that are not easy to override.
|
90
|
+
The easiest way to get around them is to start a new stacking context using `isolation: isolate`.
|
91
|
+
|
92
|
+
### Sensible defaults
|
93
|
+
|
94
|
+
Without knowing anything specific about your application the following settings should be a good starting place.
|
95
|
+
|
96
|
+
```css
|
97
|
+
l-map {
|
98
|
+
display: block;
|
99
|
+
block-size: 40ch;
|
100
|
+
isolation: isolate;
|
101
|
+
z-index: 1;
|
102
|
+
}
|
103
|
+
```
|
104
|
+
|
105
|
+
This allows overlaying your own UI elements and gives full control over size and position of each map on the page.
|
@@ -0,0 +1,35 @@
|
|
1
|
+
+++
|
2
|
+
title = "Custom icons"
|
3
|
+
+++
|
4
|
+
|
5
|
+
There are two ways to add an icon to a marker.
|
6
|
+
One is to specify a `icon` attribute containing a JSON string of `L.Icon` options.
|
7
|
+
|
8
|
+
```html
|
9
|
+
<l-marker
|
10
|
+
lat-lng="[51.5, -0.09]"
|
11
|
+
icon='{"iconUrl": "icons/leaf-green.png"}'
|
12
|
+
></l-marker>
|
13
|
+
```
|
14
|
+
|
15
|
+
The other way is to create a separate HTML tag to configure the icon.
|
16
|
+
This is a more HTML centered approach.
|
17
|
+
The above JSON approach may be suitable in cases where the icon data is available in a data structure.
|
18
|
+
|
19
|
+
```html
|
20
|
+
<l-marker lat-lng="[51.5, -0.09]">
|
21
|
+
<l-icon icon-url="icons/leaf-green.png"></l-icon>
|
22
|
+
</l-marker>
|
23
|
+
```
|
24
|
+
|
25
|
+
Both are supported, choose whichever is most convenient.
|
26
|
+
|
27
|
+
<l-map center="[51.5, -0.09]" zoom="12">
|
28
|
+
<l-tile-layer
|
29
|
+
url-template="https://{s}.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}{r}.png"
|
30
|
+
></l-tile-layer>
|
31
|
+
<l-marker
|
32
|
+
lat-lng="[51.5, -0.09]"
|
33
|
+
icon='{"iconUrl": "icons/leaf-green.png"}'
|
34
|
+
></l-marker>
|
35
|
+
</l-map>
|
@@ -0,0 +1,14 @@
|
|
1
|
+
+++
|
2
|
+
title = "Styling leaflet objects"
|
3
|
+
+++
|
4
|
+
|
5
|
+
## Naming convention
|
6
|
+
Leaflet styles objects using the `style` keyword option.
|
7
|
+
Leaflet HTML, on the other hand, needs to support inline style and leaflet style.
|
8
|
+
Therefore, the keyword `l-style` is used to style the underlying leaflet objects.
|
9
|
+
|
10
|
+
## Example
|
11
|
+
|
12
|
+
```html
|
13
|
+
<l-marker l-style='{"color": "hotpink"}'></l-marker>
|
14
|
+
```
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{% extends "base.html" %}
|
2
|
+
|
3
|
+
{% block content %}
|
4
|
+
<main>
|
5
|
+
<h1>{{section.title}}</h1>
|
6
|
+
<ul>
|
7
|
+
{% for page in section.pages %}
|
8
|
+
<li><a href="{{ page.permalink | safe }}">{{ page.title }}</a></li>
|
9
|
+
{% endfor %}
|
10
|
+
</ul>
|
11
|
+
</main>
|
12
|
+
{% endblock content %}
|
@@ -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,57 +1,6 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
<
|
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 {
|
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: scroll;
|
29
|
-
}
|
30
|
-
|
31
|
-
.wrapper {
|
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
|
-
<div class="wrapper">
|
1
|
+
{% extends "base.html" %}
|
2
|
+
{% block content %}
|
3
|
+
<main>
|
54
4
|
{{ section.content | safe }}
|
55
|
-
</
|
56
|
-
|
57
|
-
</html>
|
5
|
+
</main>
|
6
|
+
{% endblock %}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "leaflet-html",
|
3
3
|
"type": "module",
|
4
|
-
"version": "0.2.
|
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",
|
@@ -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
|
-
"
|
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
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
export const mapAddTo = "map:addTo"
|
2
|
-
export const popupAdd = "popup:add"
|
3
|
-
export const layerRemove = "layer:remove"
|
1
|
+
export const mapAddTo = "map:addTo";
|
2
|
+
export const popupAdd = "popup:add";
|
3
|
+
export const layerRemove = "layer:remove";
|
package/src/index.js
CHANGED
@@ -1,32 +1,33 @@
|
|
1
1
|
// @ts-check
|
2
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";
|
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
7
|
import LOverlayLayers from "./l-overlay-layers.js";
|
8
|
-
import LPopup from "./l-popup.js";
|
8
|
+
import LPopup from "./l-popup.js";
|
9
9
|
import LTileLayer from "./l-tile-layer.js";
|
10
10
|
import LLatLngBounds from "./l-lat-lng-bounds.js";
|
11
11
|
import LImageOverlay from "./l-image-overlay.js";
|
12
12
|
import LVideoOverlay from "./l-video-overlay.js";
|
13
13
|
import LGeoJSON from "./l-geojson.js";
|
14
|
-
|
14
|
+
import LIcon from "./l-icon.js";
|
15
15
|
|
16
16
|
const init = (() => {
|
17
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)
|
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);
|
30
31
|
})();
|
31
32
|
|
32
33
|
export default init;
|
package/src/l-base-layers.js
CHANGED
@@ -1,16 +1,15 @@
|
|
1
|
-
import { mapAddTo } from "./events.js"
|
1
|
+
import { mapAddTo } from "./events.js";
|
2
2
|
|
3
3
|
class LBaseLayers extends HTMLElement {
|
4
4
|
constructor() {
|
5
|
-
super()
|
5
|
+
super();
|
6
6
|
}
|
7
|
-
|
7
|
+
|
8
8
|
connectedCallback() {
|
9
9
|
this.addEventListener(mapAddTo, (ev) => {
|
10
|
-
ev.detail["type"] = "base"
|
11
|
-
})
|
10
|
+
ev.detail["type"] = "base";
|
11
|
+
});
|
12
12
|
}
|
13
13
|
}
|
14
14
|
|
15
|
-
export default LBaseLayers
|
16
|
-
|
15
|
+
export default LBaseLayers;
|