ol-contextmenu 5.4.0 → 6.0.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.
- package/README.md +141 -171
- package/dist/ol-contextmenu.d.ts +136 -3
- package/dist/ol-contextmenu.iife.js +4 -3
- package/dist/ol-contextmenu.js +256 -241
- package/dist/ol-contextmenu.umd.cjs +4 -3
- package/package.json +49 -39
- package/dist/constants.d.ts +0 -14
- package/dist/helpers/dom.d.ts +0 -18
- package/dist/main.d.ts +0 -55
- package/dist/ol-contextmenu.css +0 -8
- package/dist/types.d.ts +0 -55
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
|
|
2
2
|
/*!
|
|
3
|
-
* ol-contextmenu -
|
|
3
|
+
* ol-contextmenu - v6.0.0
|
|
4
4
|
* https://github.com/jonataswalker/ol-contextmenu
|
|
5
|
-
* Built:
|
|
5
|
+
* Built: 2026-01-05T22:44:21.378Z
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
(function(
|
|
8
|
+
(function(){"use strict";try{if(typeof document<"u"){var e=document.createElement("style");e.appendChild(document.createTextNode('.ol-ctx-menu-container{position:absolute;padding:8px;background:#fff;color:#222;font-size:13px;border-radius:5px;box-shadow:#0003 3px 3px 5px;box-sizing:border-box}.ol-ctx-menu-container div,.ol-ctx-menu-container span,.ol-ctx-menu-container a,.ol-ctx-menu-container img,.ol-ctx-menu-container ul,.ol-ctx-menu-container li{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}.ol-ctx-menu-container a img{border:none}.ol-ctx-menu-container *,.ol-ctx-menu-container *:before,.ol-ctx-menu-container *:after{box-sizing:inherit}.ol-ctx-menu-container.ol-ctx-menu-hidden{opacity:0;visibility:hidden;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container ul{list-style:none}.ol-ctx-menu-container li{position:relative;line-height:20px;padding:2px 5px;white-space:nowrap}.ol-ctx-menu-container li:not(.ol-ctx-menu-separator):hover{cursor:pointer;background-color:#333;color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-submenu .ol-ctx-menu-container{border:1px solid #eee;padding:8px;top:0;opacity:0;visibility:hidden;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:after{position:absolute;top:7px;right:10px;content:"";display:inline-block;width:.6em;height:.6em;border-right:.3em solid #222;border-top:.3em solid #222;transform:rotate(45deg)}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover:after{border-color:#eee}.ol-ctx-menu-container:not(.ol-ctx-menu-hidden) li.ol-ctx-menu-submenu:hover>.ol-ctx-menu-container{opacity:1;visibility:visible;transition-delay:0s}.ol-ctx-menu-container li.ol-ctx-menu-separator{padding:0}.ol-ctx-menu-container li.ol-ctx-menu-separator hr{border:0;height:1px;background-image:linear-gradient(to left,#0000,#000000bf,#0000)}.ol-ctx-menu-icon{text-indent:20px;background-size:20px auto;background-repeat:no-repeat;background-position:left center}.ol-ctx-menu-zoom-in{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABaUlEQVQ4T72U7VHCQBCGn90GtAMuNGCswFiBWIFQgWMFxg6wArECsQKhArEBiB1Qwa1zgQn5IAYcxv13k71n3919L8KJQ07M47+BzgG9TRfZ/JBuWhS6BJFHRJICYrZGZIz3z5Ct2+B7gG6I6kt+wewdkQVwjtkAkR5mC8yu26A1oItR/cTsOweQBdgutD8G7jGm2PJ2n8oqUKIpIjd4HxTM8gvaT/F+AlmWnyWaIXKF95eNguFzTYFhNsdWu9kFgFlaFMANUH3D8wDLoLgSTSD2il8NCe2ZXQBxWDGwxmyUzzOMBZ7wy7Qb2K0wQfXjMOBuhlFpZtNty5sFaTQBuTusZdymeqs1SpYKcO9HkE3KbTd9WFijMHJQ5hBNEAYNq5Qd0dhyke0GiE4QzjqfW23mHT8Hl4DG4Lce3FPE7AtbBSdsbNqpoJLgYkRnNeUV+xwJDHTnUEkxHGbhBXUs5TjJjew/KPy94g+NRaIVRYmMXwAAAABJRU5ErkJggg==)}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-in{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABc0lEQVQ4T71U21ECQRDsJgGdvQDECMQIxAjECMQILCPwzAAjECIQI0AiEDPQAPaWCBhrcKHuCUcV5f7dY3v6tUscefHIePhfwBBCF8CZqRCReRs1tQxDCH1VfQLQz4EsSY4AvIjIsgm8AhhCGKrqa9zwrqoLAKckB5HtguR1E2gBMITQU9VPAD8GICIGtl3e+xHJBwBT59xtHcsCYJZlUwA3kcGHbfDep51OZywi3/acZZm9vyJ5WR5o38uACmDunNt6ZwAkUxFZDwghDFT1jeSjiJinhVUBVNVJkiTDKO8CQA+AsbNQ7s1Ps0VVn5MkSfcCtmBoDZi1Bdx4eJ7zbBolrwPy3o9J3rWSHPs3A1BbjVKlYBaIyDgvu9LDXDU2RTZmXVW1oKyLxRD+OrkOrJLy5mVM0iaftDhuhVbsvBzMglzKUNW6IV/OOWtCM8MmVvEkmbwt83LaB19fdgOtVquUZJeknaDdobTwbOcvBzPcN/AXH1DFFWP7u9oAAAAASUVORK5CYII=)}.ol-ctx-menu-zoom-out{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABU0lEQVQ4T72U7VECMRRFz3sNaAdkacC1AtcKxApcKnCsQOwAK3CtQKxAqEBsANYOqCDPyTIC+8WCw5jfybn33dxEOPGSE/P4b6BzQG89RT47ZJoWhy5B5BGRZAMxWyEyxvtnyFdt8AagS1F9KQ6YvSMyB84xGyDSw2yO2XUbtAJ0MaqfmH0XAPIA2y7tj4F7jAm2uG1yWQZKNEHkBu+Dg2njWBJNEbnC+8uaIFRuWfuG2QxbbrOrUd0A1Tc8D7AIjkur7DAAsVf8MiWMZ3ZR2m02LPIMscATfjHqBnY7TFD9OAy4zTCCPG/MUKMM5O6wkXFr9dZq7FQqqHk/hDzbFa73cFONTZFDdRyiCcKg5rrSiLaXkiI6RjjrfG6VzDs+B5eAxuDXeYpmNRGzL2wZ/wof+du4GNFpBVqqz5HA4MM5VEYYDrOs+1I6Q9u/4Q8O9wN/AGgWjBVqQjjgAAAAAElFTkSuQmCC)}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-out{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABYklEQVQ4T72U4VHCQBCF36tA91KAWIFYgViBWIFYgWMFYgdYgVCBWAFSgdiBFpAsFWSdxcDkQoBkhnF/ZjbfvX377ogjF4/Mw/8CVbUD4MynEJF5k2lqFapqz8yeAPRKkCXJEYAXEVnugm8BVXVgZq/FD+9mtgBwSrJfqF2QvN4FjYCq2jWzTwA/DhARh20qTdMRyQcA0xDCbZ3KCJhl2RTATaHgo+6HLMv8+xXJy+qB3l8FGoB5CKHsXcRV1b6ZvZF8FBH3NKotoJlNkiQZFONdlLtJ3rufbouZPSdJMjwIbKDQEzBrClx7eC4i33Uepmk6JnnXaOQifzMAtdGoRApugYiMI1uqKkrRWAfZo9MxM1+UZzFewl8mN4nYdVM83L7BkwbXLUrF3sfBLQDQBbDy08x8vOohXyEE71lVq9emuEk+3gZa3XYroCvwFyjP8yHJDsnxwaU08GxvS2uFhw78BbzWrxXgMbsHAAAAAElFTkSuQmCC)}')),document.head.appendChild(e)}}catch(n){console.error("vite-plugin-css-injected-by-js",n)}})();
|
|
9
|
+
(function(c,h){typeof exports=="object"&&typeof module<"u"?module.exports=h(require("ol/control/Control"),require("ol/MapBrowserEvent")):typeof define=="function"&&define.amd?define(["ol/control/Control","ol/MapBrowserEvent"],h):(c=typeof globalThis<"u"?globalThis:c||self,c.ContextMenu=h(c.ol.control.Control,c.ol.MapBrowserEvent))})(this,(function(c,h){"use strict";var V=Object.defineProperty;var j=(c,h,p)=>h in c?V(c,h,{enumerable:!0,configurable:!0,writable:!0,value:p}):c[h]=p;var l=(c,h,p)=>j(c,typeof h!="symbol"?h+"":h,p);var p={exports:{}},C;function $(){if(C)return p.exports;C=1;function o(){}return o.prototype={on:function(i,t,e){var s=this.e||(this.e={});return(s[i]||(s[i]=[])).push({fn:t,ctx:e}),this},once:function(i,t,e){var s=this;function n(){s.off(i,n),t.apply(e,arguments)}return n._=t,this.on(i,n,e)},emit:function(i){var t=[].slice.call(arguments,1),e=((this.e||(this.e={}))[i]||[]).slice(),s=0,n=e.length;for(s;s<n;s++)e[s].fn.apply(e[s].ctx,t);return this},off:function(i,t){var e=this.e||(this.e={}),s=e[i],n=[];if(s&&t)for(var a=0,d=s.length;a<d;a++)s[a].fn!==t&&s[a].fn._!==t&&n.push(s[a]);return n.length?e[i]=n:delete e[i],this}},p.exports=o,p.exports.TinyEmitter=o,p.exports}var _=$(),L=(o=>(o.CONTEXTMENU="contextmenu",o.CLICK="click",o.DBLCLICK="dblclick",o))(L||{}),m=(o=>(o.BEFOREOPEN="beforeopen",o.OPEN="open",o.CLOSE="close",o.ADD_MENU_ENTRY="add-menu-entry",o))(m||{});class A extends h{constructor(i){super(i.type,i.map,i.originalEvent)}}const D={defaultItems:!0,eventType:L.CONTEXTMENU,items:[],scrollAt:4,width:150},E="ol-ctx-menu",r={container:`${E}-container`,hidden:`${E}-hidden`,icon:`${E}-icon`,separator:`${E}-separator`,submenu:`${E}-submenu`,unselectable:"ol-unselectable",zoomIn:`${E}-zoom-in`,zoomOut:`${E}-zoom-out`},P=8*2,S=10,M=2,T=[{callback:(o,i)=>{const t=i.getView();t.animate({center:o.coordinate,duration:700,zoom:Number(t.getZoom())+1})},classname:`${r.zoomIn} ${r.icon}`,text:"Zoom In"},{callback:(o,i)=>{const t=i.getView();t.animate({center:o.coordinate,duration:700,zoom:Number(t.getZoom())-1})},classname:`${r.zoomOut} ${r.icon}`,text:"Zoom Out"}];function v(o){const i=document.createDocumentFragment(),t=document.createElement("div");for(t.innerHTML=o;t.firstChild;)i.append(t.firstChild);return i}function k(o){const i=document.importNode(o),t=o.offsetWidth;i.style.cssText=`position: fixed; top: 0; left: 0; overflow: auto; visibility: hidden; pointer-events: none; height: unset; max-height: unset; width: ${t}px`;const e=v("<span>Foo</span>"),s=v("<span>Foo</span>"),n=document.createElement("li"),a=document.createElement("li");n.append(e),a.append(s),i.append(n),i.append(a),o.parentNode?.append(i);const d=i.offsetHeight/2;return o.parentNode?.removeChild(i),d}function I({emitter:o,isInsideSubmenu:i=!1,isSubmenu:t=!1,item:e,parentNode:s}){const n=`_${Math.random().toString(36).slice(2,11)}`;if(typeof e!="string"&&"text"in e){const b=`<span>${e.text}</span>`,y=v(b),u=document.createElement("li");e.classname=e.classname||"",e.icon&&(e.classname===""?e.classname=r.icon:e.classname.includes(r.icon)===!1&&(e.classname+=` ${r.icon}`),u.setAttribute("style",`background-image:url(${e.icon})`)),u.id=n,u.className=e.classname,u.append(y),s.append(u);const O={callback:"callback"in e?e.callback:null,data:"data"in e?e.data:null,id:n,isInsideSubmenu:i,isSeparator:!1,isSubmenu:t};return o.emit(m.ADD_MENU_ENTRY,O,u),u}const a=`<li id="${n}" class="${r.separator}"><hr></li>`,d=v(a);s.append(d);const g=s.lastChild,x={callback:null,data:null,id:n,isInsideSubmenu:!1,isSeparator:!0,isSubmenu:!1};return o.emit(m.ADD_MENU_ENTRY,x,g),g}function N({container:o,emitter:i,isInsideSubmenu:t,items:e,menuWidth:s}){e.forEach(n=>{if(typeof n!="string"&&"items"in n&&Array.isArray(n.items)){const a=I({emitter:i,isSubmenu:!0,item:n,parentNode:o});a.classList.add(r.submenu);const d=document.createElement("ul");d.classList.add(r.container),d.style.width=`${s}px`,a.append(d),N({container:d,emitter:i,isInsideSubmenu:!0,items:n.items,menuWidth:s})}else I({emitter:i,isInsideSubmenu:t,isSubmenu:!1,item:n,parentNode:o})})}function w(o,i){if(!o)throw new Error(i)}class H extends c{constructor(t={}){w(typeof t=="object","@param `opts` should be object type!");const e=document.createElement("div");super({element:e});l(this,"map");l(this,"emitter",new _.TinyEmitter);l(this,"container");l(this,"coordinate",[]);l(this,"pixel",[]);l(this,"contextMenuEventListener");l(this,"entryCallbackEventListener");l(this,"mapMoveListener");l(this,"lineHeight",0);l(this,"disabled");l(this,"opened");l(this,"items",[]);l(this,"menuEntries",new Map);l(this,"options");this.options={...D,...t};const s=document.createElement("ul");e.append(s),e.style.width=`${this.options.width}px`,e.classList.add(r.container,r.unselectable,r.hidden),this.container=e,this.contextMenuEventListener=n=>{this.handleContextMenu(n)},this.entryCallbackEventListener=n=>{this.handleEntryCallback(n)},this.mapMoveListener=()=>{this.handleMapMove()},this.disabled=!1,this.opened=!1,window.addEventListener("beforeunload",()=>{this.removeListeners()},{once:!0})}clear(){for(const t of this.menuEntries.keys())this.removeMenuEntry(t);this.container.replaceChildren(),this.container.append(document.createElement("ul"))}enable(){this.disabled=!1}disable(){this.disabled=!0}getDefaultItems(){return T}countItems(){return this.menuEntries.size}extend(t){w(Array.isArray(t),"@param `items` should be an Array."),N({container:this.container.firstElementChild,emitter:this.emitter,items:t,menuWidth:this.options.width})}closeMenu(){this.opened=!1,this.container.classList.add(r.hidden),this.dispatchEvent(m.CLOSE)}isOpen(){return this.opened}updatePosition(t){w(Array.isArray(t),"@param `pixel` should be an Array."),this.isOpen()&&(this.pixel=t,this.positionContainer())}pop(){const t=Array.from(this.menuEntries.keys()).pop();t&&this.removeMenuEntry(t)}shift(){const t=Array.from(this.menuEntries.keys()).shift();t&&this.removeMenuEntry(t)}push(t){t&&this.extend([t])}setMap(t){if(super.setMap(t),t){this.map=t,t.getViewport().addEventListener(this.options.eventType,this.contextMenuEventListener,!1),t.on("movestart",()=>{this.handleMapMove()}),this.emitter.on(m.ADD_MENU_ENTRY,(s,n)=>{this.handleAddMenuEntry(s,n)},this),this.items=this.options.defaultItems?this.options.items.concat(T):this.options.items,N({container:this.container.firstElementChild,emitter:this.emitter,items:this.items,menuWidth:this.options.width});const e=this.getMenuEntriesLength();this.lineHeight=e>0?this.container.offsetHeight/e:k(this.container)}else this.removeListeners(),this.clear()}removeListeners(){this.map.getViewport().removeEventListener(this.options.eventType,this.contextMenuEventListener,!1),this.emitter.off(m.ADD_MENU_ENTRY)}removeMenuEntry(t){let e=document.getElementById(t);e?.remove(),e=null,this.menuEntries.delete(t)}handleContextMenu(t){this.coordinate=this.map.getEventCoordinate(t),this.pixel=this.map.getEventPixel(t),this.dispatchEvent(new A({map:this.map,originalEvent:t,type:m.BEFOREOPEN})),!this.disabled&&(this.options.eventType===L.CONTEXTMENU&&(t.stopPropagation(),t.preventDefault()),setTimeout(()=>{this.openMenu(t)}),t.target?.addEventListener("pointerdown",e=>{this.opened&&(e.stopPropagation(),this.closeMenu())},{once:!0}))}openMenu(t){this.opened=!0,this.positionContainer(),this.container.classList.remove(r.hidden),this.dispatchEvent(new A({map:this.map,originalEvent:t,type:m.OPEN}))}getMenuEntriesLength(){return Array.from(this.menuEntries).filter(([,t])=>t.isSeparator===!1&&t.isSubmenu===!1&&t.isInsideSubmenu===!1).length}calculateMenuSize(){const t=this.getMenuEntriesLength(),s=Math.round(this.lineHeight*t)+P,n=this.container.offsetHeight,a=!this.container.classList.contains(r.hidden);return{h:n>0&&a?n:s,w:this.container.offsetWidth}}calculateVerticalPosition(t,e,s){let n;return e.h>=s.h?(n=this.pixel[1]-S,n+s.h>t[1]&&(n=Math.max(0,t[1]-s.h-M))):(n=this.pixel[1]-s.h,n<0&&(n=s.h<=t[1]?0:Math.max(0,t[1]-s.h)),n+s.h>t[1]&&(n=Math.max(0,t[1]-s.h-M))),Math.max(0,Math.min(n,t[1]-s.h-M))}adjustPositionAfterRender(t,e){if(!this.container.classList.contains(r.hidden)){const s=this.container.offsetHeight;s>0&&s!==e.h&&(Number.parseInt(this.container.style.top,10)||0)+s>t[1]&&(this.container.style.top=`${Math.max(0,t[1]-s-M)}px`)}}positionContainer(){const t=this.map.getSize()||[0,0],e=[t[0]||0,t[1]||0],s={h:e[1]-this.pixel[1],w:e[0]-this.pixel[0]},n=this.calculateMenuSize(),a=s.w>=n.w?this.pixel[0]+5:this.pixel[0]-n.w;this.container.style.left=`${a}px`;const d=this.calculateVerticalPosition(e,s,n);this.container.style.top=`${d}px`,this.container.style.right="auto",this.container.style.bottom="auto",this.adjustPositionAfterRender(e,n),s.w-=n.w;const g=y=>Array.from(y.children).filter(u=>u.tagName==="LI"&&u.classList.contains(r.submenu));let x=0;const b=(y,u)=>{x+=1,g(y).forEach(R=>{const U=u>=n.w?n.w-8:(n.w+8)*-1,f=R.querySelector(`ul.${r.container}`),F=Math.round(this.lineHeight*Array.from(f.children).filter(B=>B.tagName==="LI").length);f.style.left=`${U}px`,f.style.right="auto",f.style.top=s.h>=F+n.h?"0":`-${f.offsetHeight-25}px`,f.style.bottom="auto",f.style.zIndex=String(x),g(f).length>0&&b(f,u-n.w)})};b(this.container.firstElementChild,s.w)}handleMapMove(){this.closeMenu()}handleEntryCallback(t){t.preventDefault(),t.stopPropagation();const e=t.currentTarget,s=this.menuEntries.get(e.id);if(!s)return;const n={coordinate:this.coordinate,data:s.data};this.closeMenu(),s.callback?.(n,this.map)}handleAddMenuEntry(t,e){this.menuEntries.set(t.id,t),this.positionContainer(),"callback"in t&&typeof t.callback=="function"&&e.addEventListener("click",this.entryCallbackEventListener,!1)}}return H}));
|
package/package.json
CHANGED
|
@@ -1,24 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ol-contextmenu",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.0.0",
|
|
4
4
|
"description": "Custom Context Menu for Openlayers",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"openlayers",
|
|
7
|
+
"ol",
|
|
8
|
+
"contextmenu",
|
|
9
|
+
"context-menu",
|
|
10
|
+
"right-click",
|
|
11
|
+
"menu",
|
|
12
|
+
"map",
|
|
13
|
+
"gis",
|
|
14
|
+
"geospatial"
|
|
15
|
+
],
|
|
5
16
|
"type": "module",
|
|
6
17
|
"main": "./dist/ol-contextmenu.umd.cjs",
|
|
7
18
|
"jsdelivr": "./dist/ol-contextmenu.iife.js",
|
|
8
19
|
"module": "./dist/ol-contextmenu.js",
|
|
20
|
+
"browser": "./dist/ol-contextmenu.js",
|
|
21
|
+
"sideEffects": [
|
|
22
|
+
"./dist/ol-contextmenu.js",
|
|
23
|
+
"./dist/ol-contextmenu.umd.cjs",
|
|
24
|
+
"./dist/ol-contextmenu.iife.js"
|
|
25
|
+
],
|
|
9
26
|
"exports": {
|
|
10
27
|
".": {
|
|
11
|
-
"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
"./*": {
|
|
17
|
-
"import": "./*",
|
|
18
|
-
"require": "./*",
|
|
19
|
-
"style": "./*"
|
|
20
|
-
},
|
|
21
|
-
"./ol-contextmenu.css": "./dist/ol-contextmenu.css"
|
|
28
|
+
"types": "./dist/ol-contextmenu.d.ts",
|
|
29
|
+
"import": "./dist/ol-contextmenu.js",
|
|
30
|
+
"require": "./dist/ol-contextmenu.umd.cjs",
|
|
31
|
+
"default": "./dist/ol-contextmenu.js"
|
|
32
|
+
}
|
|
22
33
|
},
|
|
23
34
|
"files": [
|
|
24
35
|
"./dist"
|
|
@@ -35,44 +46,43 @@
|
|
|
35
46
|
"url": "https://github.com/jonataswalker/ol-contextmenu/issues"
|
|
36
47
|
},
|
|
37
48
|
"engines": {
|
|
38
|
-
"node": ">=
|
|
39
|
-
"npm": ">=
|
|
49
|
+
"node": ">=24",
|
|
50
|
+
"npm": ">=11"
|
|
40
51
|
},
|
|
41
52
|
"scripts": {
|
|
42
53
|
"dev": "vite",
|
|
43
|
-
"build": "
|
|
54
|
+
"build": "premove ./dist && vite build",
|
|
44
55
|
"preview": "vite preview",
|
|
45
|
-
"lint": "eslint .",
|
|
56
|
+
"lint": "eslint . --cache",
|
|
46
57
|
"lint:fix": "npm run lint -- --fix",
|
|
47
|
-
"test": "
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:ui": "vitest --ui",
|
|
48
60
|
"prepare": "husky",
|
|
49
61
|
"release": "release-it --no-npm.publish"
|
|
50
62
|
},
|
|
51
63
|
"devDependencies": {
|
|
52
|
-
"@
|
|
53
|
-
"@
|
|
54
|
-
"@
|
|
55
|
-
"
|
|
56
|
-
"
|
|
57
|
-
"eslint-config-
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"vite-plugin-banner": "^0.7.1",
|
|
72
|
-
"vite-plugin-dts": "^3.7.3"
|
|
64
|
+
"@types/node": "^25.0.3",
|
|
65
|
+
"@vitest/browser-webdriverio": "^4.0.16",
|
|
66
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
67
|
+
"@vitest/ui": "^4.0.16",
|
|
68
|
+
"auto-changelog": "^2.5.0",
|
|
69
|
+
"eslint-config-jwalker": "^12.1.0",
|
|
70
|
+
"husky": "^9.1.7",
|
|
71
|
+
"jsdom": "^27.4.0",
|
|
72
|
+
"ol": "^10.7.0",
|
|
73
|
+
"premove": "^4.0.0",
|
|
74
|
+
"release-it": "^19.2.2",
|
|
75
|
+
"sass": "^1.97.1",
|
|
76
|
+
"typescript": "^5.9.3",
|
|
77
|
+
"vite": "^7.3.0",
|
|
78
|
+
"vite-plugin-banner": "^0.8.1",
|
|
79
|
+
"vite-plugin-css-injected-by-js": "^3.5.2",
|
|
80
|
+
"vite-plugin-dts": "^4.5.4",
|
|
81
|
+
"vitest": "^4.0.16",
|
|
82
|
+
"webdriverio": "^9.23.0"
|
|
73
83
|
},
|
|
74
84
|
"peerDependencies": {
|
|
75
|
-
"ol": "> 7.x <=
|
|
85
|
+
"ol": "> 7.x <= 10.x"
|
|
76
86
|
},
|
|
77
87
|
"dependencies": {
|
|
78
88
|
"tiny-emitter": "^2.1.0"
|
package/dist/constants.d.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { type SingleItem, type Options } from './types';
|
|
2
|
-
export declare const DEFAULT_OPTIONS: Options;
|
|
3
|
-
export declare const CSS_CLASSES: {
|
|
4
|
-
namespace: string;
|
|
5
|
-
container: string;
|
|
6
|
-
separator: string;
|
|
7
|
-
submenu: string;
|
|
8
|
-
hidden: string;
|
|
9
|
-
icon: string;
|
|
10
|
-
zoomIn: string;
|
|
11
|
-
zoomOut: string;
|
|
12
|
-
unselectable: string;
|
|
13
|
-
};
|
|
14
|
-
export declare const DEFAULT_ITEMS: SingleItem[];
|
package/dist/helpers/dom.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { TinyEmitter } from 'tiny-emitter';
|
|
2
|
-
import { type Item } from '../types';
|
|
3
|
-
export declare function createFragment(html: string): DocumentFragment;
|
|
4
|
-
export declare function getLineHeight(container: HTMLDivElement): number;
|
|
5
|
-
export declare function addMenuEntry({ parentNode, item, isSubmenu, isInsideSubmenu, emitter, }: {
|
|
6
|
-
parentNode: HTMLUListElement;
|
|
7
|
-
item: Item;
|
|
8
|
-
isSubmenu: boolean;
|
|
9
|
-
isInsideSubmenu?: boolean;
|
|
10
|
-
emitter: TinyEmitter;
|
|
11
|
-
}): HTMLLIElement;
|
|
12
|
-
export declare function addMenuEntries({ container, items, menuWidth, isInsideSubmenu, emitter, }: {
|
|
13
|
-
container: HTMLUListElement;
|
|
14
|
-
items: Item[];
|
|
15
|
-
menuWidth: number;
|
|
16
|
-
isInsideSubmenu?: boolean;
|
|
17
|
-
emitter: TinyEmitter;
|
|
18
|
-
}): void;
|
package/dist/main.d.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import type OlMap from 'ol/Map';
|
|
2
|
-
import type { Pixel } from 'ol/pixel';
|
|
3
|
-
import type { EventsKey } from 'ol/events';
|
|
4
|
-
import type BaseEvent from 'ol/events/Event';
|
|
5
|
-
import type { ObjectEvent } from 'ol/Object';
|
|
6
|
-
import type { Coordinate } from 'ol/coordinate';
|
|
7
|
-
import type { Types as ObjectEventTypes } from 'ol/ObjectEventType';
|
|
8
|
-
import type { CombinedOnSignature, EventTypes as OlEventTypes, OnSignature } from 'ol/Observable';
|
|
9
|
-
import Control from 'ol/control/Control';
|
|
10
|
-
import { TinyEmitter } from 'tiny-emitter';
|
|
11
|
-
import { Item, Options, MenuEntry, ContextMenuEvent, CustomEventTypes } from './types';
|
|
12
|
-
import './sass/main.scss';
|
|
13
|
-
export default class ContextMenu extends Control {
|
|
14
|
-
protected map: OlMap;
|
|
15
|
-
protected emitter: TinyEmitter;
|
|
16
|
-
protected container: HTMLDivElement;
|
|
17
|
-
protected coordinate: Coordinate;
|
|
18
|
-
protected pixel: Pixel;
|
|
19
|
-
protected contextMenuEventListener: (evt: MouseEvent) => void;
|
|
20
|
-
protected entryCallbackEventListener: (evt: MouseEvent) => void;
|
|
21
|
-
protected mapMoveListener: () => void;
|
|
22
|
-
protected lineHeight: number;
|
|
23
|
-
protected disabled: boolean;
|
|
24
|
-
protected opened: boolean;
|
|
25
|
-
protected items: Item[];
|
|
26
|
-
protected menuEntries: Map<string, MenuEntry>;
|
|
27
|
-
on: OnSignature<OlEventTypes | `${CustomEventTypes.CLOSE}`, BaseEvent, EventsKey> & OnSignature<`${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}`, ContextMenuEvent, EventsKey> & OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> & CombinedOnSignature<`${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}` | ObjectEventTypes | `${CustomEventTypes.CLOSE}` | OlEventTypes, EventsKey>;
|
|
28
|
-
once: OnSignature<OlEventTypes | `${CustomEventTypes.CLOSE}`, BaseEvent, EventsKey> & OnSignature<`${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}`, ContextMenuEvent, EventsKey> & OnSignature<ObjectEventTypes, ObjectEvent, EventsKey> & CombinedOnSignature<`${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}` | ObjectEventTypes | `${CustomEventTypes.CLOSE}` | OlEventTypes, EventsKey>;
|
|
29
|
-
un: OnSignature<OlEventTypes | `${CustomEventTypes.CLOSE}`, BaseEvent, void> & OnSignature<`${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}`, ContextMenuEvent, EventsKey> & OnSignature<ObjectEventTypes, ObjectEvent, void> & CombinedOnSignature<`${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}` | ObjectEventTypes | `${CustomEventTypes.CLOSE}` | OlEventTypes, void>;
|
|
30
|
-
options: Options;
|
|
31
|
-
constructor(opts?: Partial<Options>);
|
|
32
|
-
clear(): void;
|
|
33
|
-
enable(): void;
|
|
34
|
-
disable(): void;
|
|
35
|
-
getDefaultItems(): import("./types").SingleItem[];
|
|
36
|
-
countItems(): number;
|
|
37
|
-
extend(items: Item[]): void;
|
|
38
|
-
closeMenu(): void;
|
|
39
|
-
isOpen(): boolean;
|
|
40
|
-
updatePosition(pixel: Pixel): void;
|
|
41
|
-
pop(): void;
|
|
42
|
-
shift(): void;
|
|
43
|
-
push(item: Item): void;
|
|
44
|
-
setMap(map: OlMap): void;
|
|
45
|
-
protected removeListeners(): void;
|
|
46
|
-
protected removeMenuEntry(id: string): void;
|
|
47
|
-
protected handleContextMenu(evt: MouseEvent): void;
|
|
48
|
-
protected openMenu(evt: MouseEvent): void;
|
|
49
|
-
protected getMenuEntriesLength(): number;
|
|
50
|
-
protected positionContainer(): void;
|
|
51
|
-
protected handleMapMove(): void;
|
|
52
|
-
protected handleEntryCallback(evt: MouseEvent): void;
|
|
53
|
-
protected handleAddMenuEntry(item: MenuEntry, element: HTMLLIElement): void;
|
|
54
|
-
}
|
|
55
|
-
export { type ItemSeparator, type ItemWithNested, type SingleItem, type Item, type Options, type MenuEntry, type EventTypes, type CallbackObject, type ContextMenuEvent, type CustomEventTypes, } from './types';
|
package/dist/ol-contextmenu.css
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/*!
|
|
3
|
-
* ol-contextmenu - v5.4.0
|
|
4
|
-
* https://github.com/jonataswalker/ol-contextmenu
|
|
5
|
-
* Built: Fri Mar 08 2024 12:11:47 GMT+0000 (Coordinated Universal Time)
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
.ol-ctx-menu-container{position:absolute;padding:8px;background:#fff;color:#222;font-size:13px;border-radius:5px;box-shadow:#0003 3px 3px 5px;box-sizing:border-box}.ol-ctx-menu-container div,.ol-ctx-menu-container span,.ol-ctx-menu-container a,.ol-ctx-menu-container img,.ol-ctx-menu-container ul,.ol-ctx-menu-container li{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}.ol-ctx-menu-container a img{border:none}.ol-ctx-menu-container *,.ol-ctx-menu-container *:before,.ol-ctx-menu-container *:after{box-sizing:inherit}.ol-ctx-menu-container.ol-ctx-menu-hidden{opacity:0;visibility:hidden;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container ul{list-style:none}.ol-ctx-menu-container li{position:relative;line-height:20px;padding:2px 5px;white-space:nowrap}.ol-ctx-menu-container li:not(.ol-ctx-menu-separator):hover{cursor:pointer;background-color:#333;color:#eee}.ol-ctx-menu-container li.ol-ctx-menu-submenu .ol-ctx-menu-container{border:1px solid #eee;padding:8px;top:0;opacity:0;visibility:hidden;transition:visibility 0s linear .3s,opacity .3s}.ol-ctx-menu-container li.ol-ctx-menu-submenu:after{position:absolute;top:7px;right:10px;content:"";display:inline-block;width:.6em;height:.6em;border-right:.3em solid #222;border-top:.3em solid #222;transform:rotate(45deg)}.ol-ctx-menu-container li.ol-ctx-menu-submenu:hover:after{border-color:#eee}.ol-ctx-menu-container:not(.ol-ctx-menu-hidden) li.ol-ctx-menu-submenu:hover>.ol-ctx-menu-container{opacity:1;visibility:visible;transition-delay:0s}.ol-ctx-menu-container li.ol-ctx-menu-separator{padding:0}.ol-ctx-menu-container li.ol-ctx-menu-separator hr{border:0;height:1px;background-image:linear-gradient(to left,#0000,#000000bf,#0000)}.ol-ctx-menu-icon{text-indent:20px;background-size:20px auto;background-repeat:no-repeat;background-position:left center}.ol-ctx-menu-zoom-in{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABaUlEQVQ4T72U7VHCQBCGn90GtAMuNGCswFiBWIFQgWMFxg6wArECsQKhArEBiB1Qwa1zgQn5IAYcxv13k71n3919L8KJQ07M47+BzgG9TRfZ/JBuWhS6BJFHRJICYrZGZIz3z5Ct2+B7gG6I6kt+wewdkQVwjtkAkR5mC8yu26A1oItR/cTsOweQBdgutD8G7jGm2PJ2n8oqUKIpIjd4HxTM8gvaT/F+AlmWnyWaIXKF95eNguFzTYFhNsdWu9kFgFlaFMANUH3D8wDLoLgSTSD2il8NCe2ZXQBxWDGwxmyUzzOMBZ7wy7Qb2K0wQfXjMOBuhlFpZtNty5sFaTQBuTusZdymeqs1SpYKcO9HkE3KbTd9WFijMHJQ5hBNEAYNq5Qd0dhyke0GiE4QzjqfW23mHT8Hl4DG4Lce3FPE7AtbBSdsbNqpoJLgYkRnNeUV+xwJDHTnUEkxHGbhBXUs5TjJjew/KPy94g+NRaIVRYmMXwAAAABJRU5ErkJggg==)}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-in{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABc0lEQVQ4T71U21ECQRDsJgGdvQDECMQIxAjECMQILCPwzAAjECIQI0AiEDPQAPaWCBhrcKHuCUcV5f7dY3v6tUscefHIePhfwBBCF8CZqRCReRs1tQxDCH1VfQLQz4EsSY4AvIjIsgm8AhhCGKrqa9zwrqoLAKckB5HtguR1E2gBMITQU9VPAD8GICIGtl3e+xHJBwBT59xtHcsCYJZlUwA3kcGHbfDep51OZywi3/acZZm9vyJ5WR5o38uACmDunNt6ZwAkUxFZDwghDFT1jeSjiJinhVUBVNVJkiTDKO8CQA+AsbNQ7s1Ps0VVn5MkSfcCtmBoDZi1Bdx4eJ7zbBolrwPy3o9J3rWSHPs3A1BbjVKlYBaIyDgvu9LDXDU2RTZmXVW1oKyLxRD+OrkOrJLy5mVM0iaftDhuhVbsvBzMglzKUNW6IV/OOWtCM8MmVvEkmbwt83LaB19fdgOtVquUZJeknaDdobTwbOcvBzPcN/AXH1DFFWP7u9oAAAAASUVORK5CYII=)}.ol-ctx-menu-zoom-out{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABU0lEQVQ4T72U7VECMRRFz3sNaAdkacC1AtcKxApcKnCsQOwAK3CtQKxAqEBsANYOqCDPyTIC+8WCw5jfybn33dxEOPGSE/P4b6BzQG89RT47ZJoWhy5B5BGRZAMxWyEyxvtnyFdt8AagS1F9KQ6YvSMyB84xGyDSw2yO2XUbtAJ0MaqfmH0XAPIA2y7tj4F7jAm2uG1yWQZKNEHkBu+Dg2njWBJNEbnC+8uaIFRuWfuG2QxbbrOrUd0A1Tc8D7AIjkur7DAAsVf8MiWMZ3ZR2m02LPIMscATfjHqBnY7TFD9OAy4zTCCPG/MUKMM5O6wkXFr9dZq7FQqqHk/hDzbFa73cFONTZFDdRyiCcKg5rrSiLaXkiI6RjjrfG6VzDs+B5eAxuDXeYpmNRGzL2wZ/wof+du4GNFpBVqqz5HA4MM5VEYYDrOs+1I6Q9u/4Q8O9wN/AGgWjBVqQjjgAAAAAElFTkSuQmCC)}.ol-ctx-menu-container li:hover.ol-ctx-menu-zoom-out{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABYklEQVQ4T72U4VHCQBCF36tA91KAWIFYgViBWIFYgWMFYgdYgVCBWAFSgdiBFpAsFWSdxcDkQoBkhnF/ZjbfvX377ogjF4/Mw/8CVbUD4MynEJF5k2lqFapqz8yeAPRKkCXJEYAXEVnugm8BVXVgZq/FD+9mtgBwSrJfqF2QvN4FjYCq2jWzTwA/DhARh20qTdMRyQcA0xDCbZ3KCJhl2RTATaHgo+6HLMv8+xXJy+qB3l8FGoB5CKHsXcRV1b6ZvZF8FBH3NKotoJlNkiQZFONdlLtJ3rufbouZPSdJMjwIbKDQEzBrClx7eC4i33Uepmk6JnnXaOQifzMAtdGoRApugYiMI1uqKkrRWAfZo9MxM1+UZzFewl8mN4nYdVM83L7BkwbXLUrF3sfBLQDQBbDy08x8vOohXyEE71lVq9emuEk+3gZa3XYroCvwFyjP8yHJDsnxwaU08GxvS2uFhw78BbzWrxXgMbsHAAAAAElFTkSuQmCC)}
|
package/dist/types.d.ts
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import type OlMap from 'ol/Map';
|
|
2
|
-
import type { Coordinate } from 'ol/coordinate';
|
|
3
|
-
import MapBrowserEvent from 'ol/MapBrowserEvent';
|
|
4
|
-
export declare enum EventTypes {
|
|
5
|
-
CONTEXTMENU = "contextmenu",
|
|
6
|
-
CLICK = "click",
|
|
7
|
-
DBLCLICK = "dblclick"
|
|
8
|
-
}
|
|
9
|
-
export declare enum CustomEventTypes {
|
|
10
|
-
BEFOREOPEN = "beforeopen",
|
|
11
|
-
OPEN = "open",
|
|
12
|
-
CLOSE = "close",
|
|
13
|
-
ADD_MENU_ENTRY = "add-menu-entry"
|
|
14
|
-
}
|
|
15
|
-
export declare class ContextMenuEvent extends MapBrowserEvent<MouseEvent> {
|
|
16
|
-
constructor(options: {
|
|
17
|
-
type: `${CustomEventTypes.BEFOREOPEN}` | `${CustomEventTypes.OPEN}`;
|
|
18
|
-
map: OlMap;
|
|
19
|
-
originalEvent: MouseEvent;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
export type CallbackObject = {
|
|
23
|
-
coordinate: Coordinate;
|
|
24
|
-
data: unknown;
|
|
25
|
-
};
|
|
26
|
-
export type ItemSeparator = '-';
|
|
27
|
-
export type SingleItem = {
|
|
28
|
-
text: string;
|
|
29
|
-
classname?: string;
|
|
30
|
-
icon?: string;
|
|
31
|
-
callback: (object: CallbackObject, map: OlMap) => void;
|
|
32
|
-
data?: unknown;
|
|
33
|
-
};
|
|
34
|
-
export type MenuEntry = {
|
|
35
|
-
id: string;
|
|
36
|
-
isSubmenu: boolean;
|
|
37
|
-
isInsideSubmenu: boolean;
|
|
38
|
-
isSeparator: boolean;
|
|
39
|
-
callback: SingleItem['callback'] | null;
|
|
40
|
-
data: unknown;
|
|
41
|
-
};
|
|
42
|
-
export type ItemWithNested = {
|
|
43
|
-
text: string;
|
|
44
|
-
classname?: string;
|
|
45
|
-
icon?: string;
|
|
46
|
-
items: Item[];
|
|
47
|
-
};
|
|
48
|
-
export type Item = SingleItem | ItemSeparator | ItemWithNested;
|
|
49
|
-
export type Options = {
|
|
50
|
-
width: number;
|
|
51
|
-
scrollAt: number;
|
|
52
|
-
eventType: `${EventTypes}`;
|
|
53
|
-
defaultItems: boolean;
|
|
54
|
-
items: Item[];
|
|
55
|
-
};
|