@nextgis/leaflet-control-container 4.0.0-alpha.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/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 NextGIS
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,40 @@
1
+ # Leaflet Control Container
2
+
3
+ ![size](https://img.shields.io/bundlephobia/minzip/@nextgis/leaflet-control-container) ![version](https://img.shields.io/npm/v/@nextgis/leaflet-control-container)
4
+
5
+ Leaflet integration for `@nextgis/control-container`.
6
+
7
+ The package exposes Leaflet-compatible control factories and a control container
8
+ that integrates with native Leaflet control corners.
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ npm install @nextgis/leaflet-control-container
14
+ ```
15
+
16
+ ## Usage
17
+
18
+ ```javascript
19
+ import {
20
+ LeafletControlContainer,
21
+ createButtonControl,
22
+ } from '@nextgis/leaflet-control-container';
23
+
24
+ const controls = new LeafletControlContainer(map);
25
+ const button = createButtonControl({
26
+ html: '+',
27
+ title: 'Action',
28
+ onClick: () => {},
29
+ });
30
+
31
+ controls.addControl(button, 'top-right');
32
+ ```
33
+
34
+ ## Commercial support
35
+
36
+ Need to fix a bug or add a feature to `@nextgis/leaflet-control-container`?
37
+ We provide custom development and support for this software.
38
+ [Contact us](http://nextgis.com/contact/) to discuss options!
39
+
40
+ [![http://nextgis.com](https://nextgis.com/img/nextgis.png)](http://nextgis.com)
package/index.js ADDED
@@ -0,0 +1,7 @@
1
+ 'use strict';
2
+
3
+ if (process.env.NODE_ENV === 'development') {
4
+ module.exports = require('./lib/leaflet-control-container.cjs.js');
5
+ } else {
6
+ module.exports = require('./lib/leaflet-control-container.cjs.prod.js');
7
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import ControlContainer, { ButtonControlOptions, MapControl, CreateControlOptions, ToggleControlOptions, ToggleControl, ControlContainerOptions, ControlTargetPosition, AddControlOptions } from '@nextgis/control-container';
2
+ import { Map, Control } from 'leaflet';
3
+
4
+ declare function createButtonControl<M = Map>(options: ButtonControlOptions, map?: M): Control;
5
+
6
+ declare function createControl<M = Map>(control: MapControl<M | Map>, options?: CreateControlOptions, map?: M): Control;
7
+
8
+ declare function createToggleControl<M = Map>(options: ToggleControlOptions, map?: M): Control & ToggleControl;
9
+
10
+ type LeafletControlContainerOptions = Omit<ControlContainerOptions<Map>, 'container' | 'positionContainers' | 'map'>;
11
+ declare class LeafletControlContainer {
12
+ private readonly map;
13
+ private readonly controlContainer;
14
+ private readonly targets;
15
+ private readonly ids;
16
+ constructor(map: Map, options?: LeafletControlContainerOptions);
17
+ addControl(control: Control, position: ControlTargetPosition, options?: AddControlOptions): Control;
18
+ removeControl(control: Control): void;
19
+ append(element: HTMLElement | string, position: ControlTargetPosition, order?: number): void;
20
+ registerIDContainer(id: string, controlRoot: HTMLElement, control?: Control): void;
21
+ unregisterIDContainer(id: string): void;
22
+ detach(): void;
23
+ getContainer(): HTMLElement;
24
+ getControlContainer(): ControlContainer;
25
+ private createControlContainer;
26
+ }
27
+
28
+ export { LeafletControlContainer, createButtonControl, createControl, createToggleControl };
29
+ export type { LeafletControlContainerOptions };
@@ -0,0 +1,158 @@
1
+ /** Bundle of @nextgis/leaflet-control-container; version: 4.0.0-alpha.0; author: NextGIS */
2
+ 'use strict';
3
+
4
+ Object.defineProperty(exports, '__esModule', { value: true });
5
+
6
+ var ControlContainer = require('@nextgis/control-container');
7
+ var leaflet = require('leaflet');
8
+
9
+ function createControl(control, options = {}, map) {
10
+ const resolvedOptions = ControlContainer.resolveControlOptions(options);
11
+ const C = leaflet.Control.extend({
12
+ onAdd(leafletMap) {
13
+ const addClass = [
14
+ "leaflet-control",
15
+ resolvedOptions.bar ? "leaflet-bar" : "",
16
+ resolvedOptions.addClass
17
+ ].filter(Boolean).join(" ");
18
+ const element = ControlContainer.createControlElement(
19
+ control,
20
+ { ...resolvedOptions, addClass },
21
+ map != null ? map : leafletMap
22
+ );
23
+ if (!resolvedOptions.margin) {
24
+ element.style.margin = "0px";
25
+ }
26
+ return element;
27
+ },
28
+ onRemove(leafletMap) {
29
+ control.onRemove(map != null ? map : leafletMap);
30
+ }
31
+ });
32
+ const instance = new C();
33
+ ControlContainer.setControlOptions(instance, resolvedOptions);
34
+ return instance;
35
+ }
36
+
37
+ function createButtonControl(options, map) {
38
+ return createControl(
39
+ ControlContainer.createButtonControlContent(options),
40
+ { bar: true, margin: options.margin },
41
+ map
42
+ );
43
+ }
44
+
45
+ function createToggleControl(options, map) {
46
+ const toggleContent = ControlContainer.createToggleControlContent(options);
47
+ const control = createControl(
48
+ toggleContent,
49
+ { bar: true, margin: options.margin },
50
+ map
51
+ );
52
+ control.onClick = toggleContent.onClick;
53
+ control.changeStatus = toggleContent.changeStatus;
54
+ control.getStatus = toggleContent.getStatus;
55
+ control.switch = toggleContent.switch;
56
+ Object.defineProperty(control, "disableOnSecondClick", {
57
+ configurable: true,
58
+ get: () => toggleContent.disableOnSecondClick,
59
+ set: (value) => {
60
+ toggleContent.disableOnSecondClick = value;
61
+ }
62
+ });
63
+ control.onStatusChange = toggleContent.onStatusChange;
64
+ return control;
65
+ }
66
+
67
+ var __defProp = Object.defineProperty;
68
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
69
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
70
+ class LeafletControlContainer {
71
+ constructor(map, options = {}) {
72
+ __publicField(this, "map");
73
+ __publicField(this, "controlContainer");
74
+ __publicField(this, "targets", /* @__PURE__ */ new WeakMap());
75
+ __publicField(this, "ids", /* @__PURE__ */ new WeakMap());
76
+ this.map = map;
77
+ this.controlContainer = this.createControlContainer(options);
78
+ this.controlContainer.addTo(map.getContainer());
79
+ }
80
+ addControl(control, position, options = {}) {
81
+ const targetPosition = typeof position === "string" ? position : "top-left";
82
+ control.options.position = targetPosition.replace(
83
+ "-",
84
+ ""
85
+ );
86
+ this.map.addControl(control);
87
+ const container = control.getContainer();
88
+ if (container) {
89
+ this.controlContainer.append(container, position, options.order, control);
90
+ this.targets.set(control, container);
91
+ if (options.id) {
92
+ this.controlContainer.registerIDContainer(
93
+ options.id,
94
+ container,
95
+ control
96
+ );
97
+ this.ids.set(control, options.id);
98
+ }
99
+ }
100
+ return control;
101
+ }
102
+ removeControl(control) {
103
+ this.map.removeControl(control);
104
+ const id = this.ids.get(control);
105
+ if (id) {
106
+ this.controlContainer.unregisterIDContainer(id);
107
+ this.ids.delete(control);
108
+ }
109
+ const target = this.targets.get(control);
110
+ if (target) {
111
+ this.controlContainer.removeTarget(target);
112
+ this.targets.delete(control);
113
+ }
114
+ }
115
+ append(element, position, order = 0) {
116
+ this.controlContainer.append(element, position, order);
117
+ }
118
+ registerIDContainer(id, controlRoot, control) {
119
+ this.controlContainer.registerIDContainer(id, controlRoot, control);
120
+ }
121
+ unregisterIDContainer(id) {
122
+ this.controlContainer.unregisterIDContainer(id);
123
+ }
124
+ detach() {
125
+ this.controlContainer.detach();
126
+ }
127
+ getContainer() {
128
+ return this.controlContainer.getContainer();
129
+ }
130
+ getControlContainer() {
131
+ return this.controlContainer;
132
+ }
133
+ createControlContainer(options) {
134
+ const mapAny = this.map;
135
+ const controlCorners = mapAny._controlCorners || {};
136
+ const getCorner = (key, selector) => controlCorners[key] || this.map.getContainer().querySelector(selector) || void 0;
137
+ return new ControlContainer({
138
+ ...options,
139
+ map: this.map,
140
+ container: mapAny._controlContainer,
141
+ positionContainers: {
142
+ "top-left": getCorner("topleft", ".leaflet-top.leaflet-left"),
143
+ "top-right": getCorner("topright", ".leaflet-top.leaflet-right"),
144
+ "bottom-left": getCorner("bottomleft", ".leaflet-bottom.leaflet-left"),
145
+ "bottom-right": getCorner(
146
+ "bottomright",
147
+ ".leaflet-bottom.leaflet-right"
148
+ )
149
+ }
150
+ });
151
+ }
152
+ }
153
+
154
+ exports.LeafletControlContainer = LeafletControlContainer;
155
+ exports.createButtonControl = createButtonControl;
156
+ exports.createControl = createControl;
157
+ exports.createToggleControl = createToggleControl;
158
+ //# sourceMappingURL=leaflet-control-container.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leaflet-control-container.cjs.js","sources":["../src/createControl.ts","../src/createButtonControl.ts","../src/createToggleControl.ts","../src/LeafletControlContainer.ts"],"sourcesContent":["import {\n createControlElement,\n resolveControlOptions,\n setControlOptions,\n} from '@nextgis/control-container';\nimport { Control } from 'leaflet';\n\nimport type {\n CreateControlOptions,\n MapControl,\n} from '@nextgis/control-container';\nimport type { Map as LeafletMap } from 'leaflet';\n\nexport function createControl<M = LeafletMap>(\n control: MapControl<M | LeafletMap>,\n options: CreateControlOptions = {},\n map?: M,\n): Control {\n const resolvedOptions = resolveControlOptions(options);\n const C = Control.extend({\n onAdd(leafletMap: LeafletMap) {\n const addClass = [\n 'leaflet-control',\n resolvedOptions.bar ? 'leaflet-bar' : '',\n resolvedOptions.addClass,\n ]\n .filter(Boolean)\n .join(' ');\n const element = createControlElement(\n control,\n { ...resolvedOptions, addClass },\n map ?? leafletMap,\n );\n if (!resolvedOptions.margin) {\n element.style.margin = '0px';\n }\n\n return element;\n },\n onRemove(leafletMap: LeafletMap) {\n control.onRemove(map ?? leafletMap);\n },\n });\n const instance = new C();\n setControlOptions(instance, resolvedOptions);\n return instance;\n}\n","import { createButtonControlContent } from '@nextgis/control-container';\n\nimport { createControl } from './createControl';\n\nimport type { ButtonControlOptions } from '@nextgis/control-container';\nimport type { Control, Map as LeafletMap } from 'leaflet';\n\nexport function createButtonControl<M = LeafletMap>(\n options: ButtonControlOptions,\n map?: M,\n): Control {\n return createControl<M>(\n createButtonControlContent(options),\n { bar: true, margin: options.margin },\n map,\n );\n}\n","import { createToggleControlContent } from '@nextgis/control-container';\n\nimport { createControl } from './createControl';\n\nimport type {\n ToggleControl,\n ToggleControlOptions,\n} from '@nextgis/control-container';\nimport type { Control, Map as LeafletMap } from 'leaflet';\n\nexport function createToggleControl<M = LeafletMap>(\n options: ToggleControlOptions,\n map?: M,\n): Control & ToggleControl {\n const toggleContent = createToggleControlContent(options);\n const control = createControl<M>(\n toggleContent,\n { bar: true, margin: options.margin },\n map,\n ) as Control & ToggleControl;\n control.onClick = toggleContent.onClick;\n control.changeStatus = toggleContent.changeStatus;\n control.getStatus = toggleContent.getStatus;\n control.switch = toggleContent.switch;\n Object.defineProperty(control, 'disableOnSecondClick', {\n configurable: true,\n get: () => toggleContent.disableOnSecondClick,\n set: (value) => {\n toggleContent.disableOnSecondClick = value;\n },\n });\n control.onStatusChange = toggleContent.onStatusChange;\n return control;\n}\n","import ControlContainer from '@nextgis/control-container';\n\nimport type {\n AddControlOptions,\n ControlContainerOptions,\n ControlTargetPosition,\n} from '@nextgis/control-container';\nimport type {\n Control as LeafletControl,\n ControlPosition,\n Map as LeafletMap,\n} from 'leaflet';\n\nexport type LeafletControlContainerOptions = Omit<\n ControlContainerOptions<LeafletMap>,\n 'container' | 'positionContainers' | 'map'\n>;\n\nexport class LeafletControlContainer {\n private readonly map: LeafletMap;\n private readonly controlContainer: ControlContainer;\n private readonly targets = new WeakMap<LeafletControl, HTMLElement>();\n private readonly ids = new WeakMap<LeafletControl, string>();\n\n constructor(map: LeafletMap, options: LeafletControlContainerOptions = {}) {\n this.map = map;\n this.controlContainer = this.createControlContainer(options);\n this.controlContainer.addTo(map.getContainer());\n }\n\n addControl(\n control: LeafletControl,\n position: ControlTargetPosition,\n options: AddControlOptions = {},\n ): LeafletControl {\n const targetPosition = typeof position === 'string' ? position : 'top-left';\n control.options.position = targetPosition.replace(\n '-',\n '',\n ) as ControlPosition;\n this.map.addControl(control);\n\n const container = control.getContainer();\n if (container) {\n this.controlContainer.append(container, position, options.order, control);\n this.targets.set(control, container);\n if (options.id) {\n this.controlContainer.registerIDContainer(\n options.id,\n container,\n control,\n );\n this.ids.set(control, options.id);\n }\n }\n\n return control;\n }\n\n removeControl(control: LeafletControl): void {\n this.map.removeControl(control);\n\n const id = this.ids.get(control);\n if (id) {\n this.controlContainer.unregisterIDContainer(id);\n this.ids.delete(control);\n }\n\n const target = this.targets.get(control);\n if (target) {\n this.controlContainer.removeTarget(target);\n this.targets.delete(control);\n }\n }\n\n append(\n element: HTMLElement | string,\n position: ControlTargetPosition,\n order = 0,\n ): void {\n this.controlContainer.append(element, position, order);\n }\n\n registerIDContainer(\n id: string,\n controlRoot: HTMLElement,\n control?: LeafletControl,\n ): void {\n this.controlContainer.registerIDContainer(id, controlRoot, control);\n }\n\n unregisterIDContainer(id: string): void {\n this.controlContainer.unregisterIDContainer(id);\n }\n\n detach(): void {\n this.controlContainer.detach();\n }\n\n getContainer(): HTMLElement {\n return this.controlContainer.getContainer();\n }\n\n getControlContainer(): ControlContainer {\n return this.controlContainer;\n }\n\n private createControlContainer(\n options: LeafletControlContainerOptions,\n ): ControlContainer {\n const mapAny = this.map as any;\n const controlCorners = mapAny._controlCorners || {};\n const getCorner = (key: string, selector: string) =>\n (controlCorners[key] as HTMLElement | undefined) ||\n (this.map.getContainer().querySelector(selector) as HTMLElement | null) ||\n undefined;\n\n return new ControlContainer({\n ...options,\n map: this.map,\n container: mapAny._controlContainer as HTMLElement | undefined,\n positionContainers: {\n 'top-left': getCorner('topleft', '.leaflet-top.leaflet-left'),\n 'top-right': getCorner('topright', '.leaflet-top.leaflet-right'),\n 'bottom-left': getCorner('bottomleft', '.leaflet-bottom.leaflet-left'),\n 'bottom-right': getCorner(\n 'bottomright',\n '.leaflet-bottom.leaflet-right',\n ),\n },\n });\n }\n}\n"],"names":["resolveControlOptions","Control","createControlElement","setControlOptions","createButtonControlContent","createToggleControlContent"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@nextgis/control-container"),e=require("leaflet");function o(o,n={},r){const i=t.resolveControlOptions(n),a=new(e.Control.extend({onAdd(e){const n=["leaflet-control",i.bar?"leaflet-bar":"",i.addClass].filter(Boolean).join(" "),a=t.createControlElement(o,{...i,addClass:n},null!=r?r:e);return i.margin||(a.style.margin="0px"),a},onRemove(t){o.onRemove(null!=r?r:t)}}));return t.setControlOptions(a,i),a}var n=Object.defineProperty,r=(t,e,o)=>((t,e,o)=>e in t?n(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o)(t,"symbol"!=typeof e?e+"":e,o);exports.LeafletControlContainer=class{constructor(t,e={}){r(this,"map"),r(this,"controlContainer"),r(this,"targets",new WeakMap),r(this,"ids",new WeakMap),this.map=t,this.controlContainer=this.createControlContainer(e),this.controlContainer.addTo(t.getContainer())}addControl(t,e,o={}){t.options.position=("string"==typeof e?e:"top-left").replace("-",""),this.map.addControl(t);const n=t.getContainer();return n&&(this.controlContainer.append(n,e,o.order,t),this.targets.set(t,n),o.id&&(this.controlContainer.registerIDContainer(o.id,n,t),this.ids.set(t,o.id))),t}removeControl(t){this.map.removeControl(t);const e=this.ids.get(t);e&&(this.controlContainer.unregisterIDContainer(e),this.ids.delete(t));const o=this.targets.get(t);o&&(this.controlContainer.removeTarget(o),this.targets.delete(t))}append(t,e,o=0){this.controlContainer.append(t,e,o)}registerIDContainer(t,e,o){this.controlContainer.registerIDContainer(t,e,o)}unregisterIDContainer(t){this.controlContainer.unregisterIDContainer(t)}detach(){this.controlContainer.detach()}getContainer(){return this.controlContainer.getContainer()}getControlContainer(){return this.controlContainer}createControlContainer(e){const o=this.map,n=o._controlCorners||{},r=(t,e)=>n[t]||this.map.getContainer().querySelector(e)||void 0;return new t({...e,map:this.map,container:o._controlContainer,positionContainers:{"top-left":r("topleft",".leaflet-top.leaflet-left"),"top-right":r("topright",".leaflet-top.leaflet-right"),"bottom-left":r("bottomleft",".leaflet-bottom.leaflet-left"),"bottom-right":r("bottomright",".leaflet-bottom.leaflet-right")}})}},exports.createButtonControl=function(e,n){return o(t.createButtonControlContent(e),{bar:!0,margin:e.margin},n)},exports.createControl=o,exports.createToggleControl=function(e,n){const r=t.createToggleControlContent(e),i=o(r,{bar:!0,margin:e.margin},n);return i.onClick=r.onClick,i.changeStatus=r.changeStatus,i.getStatus=r.getStatus,i.switch=r.switch,Object.defineProperty(i,"disableOnSecondClick",{configurable:!0,get:()=>r.disableOnSecondClick,set:t=>{r.disableOnSecondClick=t}}),i.onStatusChange=r.onStatusChange,i};
2
+ //# sourceMappingURL=leaflet-control-container.cjs.prod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leaflet-control-container.cjs.prod.js","sources":["../src/createControl.ts","../src/LeafletControlContainer.ts","../src/createButtonControl.ts","../src/createToggleControl.ts"],"sourcesContent":["import {\n createControlElement,\n resolveControlOptions,\n setControlOptions,\n} from '@nextgis/control-container';\nimport { Control } from 'leaflet';\n\nimport type {\n CreateControlOptions,\n MapControl,\n} from '@nextgis/control-container';\nimport type { Map as LeafletMap } from 'leaflet';\n\nexport function createControl<M = LeafletMap>(\n control: MapControl<M | LeafletMap>,\n options: CreateControlOptions = {},\n map?: M,\n): Control {\n const resolvedOptions = resolveControlOptions(options);\n const C = Control.extend({\n onAdd(leafletMap: LeafletMap) {\n const addClass = [\n 'leaflet-control',\n resolvedOptions.bar ? 'leaflet-bar' : '',\n resolvedOptions.addClass,\n ]\n .filter(Boolean)\n .join(' ');\n const element = createControlElement(\n control,\n { ...resolvedOptions, addClass },\n map ?? leafletMap,\n );\n if (!resolvedOptions.margin) {\n element.style.margin = '0px';\n }\n\n return element;\n },\n onRemove(leafletMap: LeafletMap) {\n control.onRemove(map ?? leafletMap);\n },\n });\n const instance = new C();\n setControlOptions(instance, resolvedOptions);\n return instance;\n}\n","import ControlContainer from '@nextgis/control-container';\n\nimport type {\n AddControlOptions,\n ControlContainerOptions,\n ControlTargetPosition,\n} from '@nextgis/control-container';\nimport type {\n Control as LeafletControl,\n ControlPosition,\n Map as LeafletMap,\n} from 'leaflet';\n\nexport type LeafletControlContainerOptions = Omit<\n ControlContainerOptions<LeafletMap>,\n 'container' | 'positionContainers' | 'map'\n>;\n\nexport class LeafletControlContainer {\n private readonly map: LeafletMap;\n private readonly controlContainer: ControlContainer;\n private readonly targets = new WeakMap<LeafletControl, HTMLElement>();\n private readonly ids = new WeakMap<LeafletControl, string>();\n\n constructor(map: LeafletMap, options: LeafletControlContainerOptions = {}) {\n this.map = map;\n this.controlContainer = this.createControlContainer(options);\n this.controlContainer.addTo(map.getContainer());\n }\n\n addControl(\n control: LeafletControl,\n position: ControlTargetPosition,\n options: AddControlOptions = {},\n ): LeafletControl {\n const targetPosition = typeof position === 'string' ? position : 'top-left';\n control.options.position = targetPosition.replace(\n '-',\n '',\n ) as ControlPosition;\n this.map.addControl(control);\n\n const container = control.getContainer();\n if (container) {\n this.controlContainer.append(container, position, options.order, control);\n this.targets.set(control, container);\n if (options.id) {\n this.controlContainer.registerIDContainer(\n options.id,\n container,\n control,\n );\n this.ids.set(control, options.id);\n }\n }\n\n return control;\n }\n\n removeControl(control: LeafletControl): void {\n this.map.removeControl(control);\n\n const id = this.ids.get(control);\n if (id) {\n this.controlContainer.unregisterIDContainer(id);\n this.ids.delete(control);\n }\n\n const target = this.targets.get(control);\n if (target) {\n this.controlContainer.removeTarget(target);\n this.targets.delete(control);\n }\n }\n\n append(\n element: HTMLElement | string,\n position: ControlTargetPosition,\n order = 0,\n ): void {\n this.controlContainer.append(element, position, order);\n }\n\n registerIDContainer(\n id: string,\n controlRoot: HTMLElement,\n control?: LeafletControl,\n ): void {\n this.controlContainer.registerIDContainer(id, controlRoot, control);\n }\n\n unregisterIDContainer(id: string): void {\n this.controlContainer.unregisterIDContainer(id);\n }\n\n detach(): void {\n this.controlContainer.detach();\n }\n\n getContainer(): HTMLElement {\n return this.controlContainer.getContainer();\n }\n\n getControlContainer(): ControlContainer {\n return this.controlContainer;\n }\n\n private createControlContainer(\n options: LeafletControlContainerOptions,\n ): ControlContainer {\n const mapAny = this.map as any;\n const controlCorners = mapAny._controlCorners || {};\n const getCorner = (key: string, selector: string) =>\n (controlCorners[key] as HTMLElement | undefined) ||\n (this.map.getContainer().querySelector(selector) as HTMLElement | null) ||\n undefined;\n\n return new ControlContainer({\n ...options,\n map: this.map,\n container: mapAny._controlContainer as HTMLElement | undefined,\n positionContainers: {\n 'top-left': getCorner('topleft', '.leaflet-top.leaflet-left'),\n 'top-right': getCorner('topright', '.leaflet-top.leaflet-right'),\n 'bottom-left': getCorner('bottomleft', '.leaflet-bottom.leaflet-left'),\n 'bottom-right': getCorner(\n 'bottomright',\n '.leaflet-bottom.leaflet-right',\n ),\n },\n });\n }\n}\n","import { createButtonControlContent } from '@nextgis/control-container';\n\nimport { createControl } from './createControl';\n\nimport type { ButtonControlOptions } from '@nextgis/control-container';\nimport type { Control, Map as LeafletMap } from 'leaflet';\n\nexport function createButtonControl<M = LeafletMap>(\n options: ButtonControlOptions,\n map?: M,\n): Control {\n return createControl<M>(\n createButtonControlContent(options),\n { bar: true, margin: options.margin },\n map,\n );\n}\n","import { createToggleControlContent } from '@nextgis/control-container';\n\nimport { createControl } from './createControl';\n\nimport type {\n ToggleControl,\n ToggleControlOptions,\n} from '@nextgis/control-container';\nimport type { Control, Map as LeafletMap } from 'leaflet';\n\nexport function createToggleControl<M = LeafletMap>(\n options: ToggleControlOptions,\n map?: M,\n): Control & ToggleControl {\n const toggleContent = createToggleControlContent(options);\n const control = createControl<M>(\n toggleContent,\n { bar: true, margin: options.margin },\n map,\n ) as Control & ToggleControl;\n control.onClick = toggleContent.onClick;\n control.changeStatus = toggleContent.changeStatus;\n control.getStatus = toggleContent.getStatus;\n control.switch = toggleContent.switch;\n Object.defineProperty(control, 'disableOnSecondClick', {\n configurable: true,\n get: () => toggleContent.disableOnSecondClick,\n set: (value) => {\n toggleContent.disableOnSecondClick = value;\n },\n });\n control.onStatusChange = toggleContent.onStatusChange;\n return control;\n}\n"],"names":["createControl","control","options","map","resolvedOptions","resolveControlOptions","instance","Control","extend","onAdd","leafletMap","addClass","bar","filter","Boolean","join","element","createControlElement","margin","style","onRemove","setControlOptions","constructor","__publicField","this","WeakMap","controlContainer","createControlContainer","addTo","getContainer","addControl","position","replace","container","append","order","targets","set","id","registerIDContainer","ids","removeControl","get","unregisterIDContainer","delete","target","removeTarget","controlRoot","detach","getControlContainer","mapAny","controlCorners","_controlCorners","getCorner","key","selector","querySelector","ControlContainer","_controlContainer","positionContainers","createButtonControlContent","toggleContent","createToggleControlContent","onClick","changeStatus","getStatus","switch","Object","defineProperty","configurable","disableOnSecondClick","value","onStatusChange"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ .webmap-ctrl-bottom-left,.webmap-ctrl-bottom-right,.webmap-ctrl-left,.webmap-ctrl-right,.webmap-ctrl-top-left,.webmap-ctrl-top-right{pointer-events:none;position:absolute;z-index:9999}.webmap-ctrl-left,.webmap-ctrl-right{height:100%}.webmap-ctrl-left{padding-right:0}.webmap-ctrl-right{padding-left:0}.webmap-ctrl-top-left{left:0;top:0}.webmap-ctrl-top-right{right:0;top:0}.webmap-ctrl-bottom-left{bottom:0;left:0}.webmap-ctrl-bottom-right{bottom:0;right:0}.webmap-ctrl,.webmap-ctrl-wrapper{clear:both;pointer-events:auto;transform:translate(0)}.webmap-ctrl-top-left>.webmap-ctrl,.webmap-ctrl-top-left>.webmap-ctrl-wrapper{float:left}.webmap-ctrl-top-right>.webmap-ctrl,.webmap-ctrl-top-right>.webmap-ctrl-wrapper{float:right}.webmap-ctrl-bottom-left>.webmap-ctrl,.webmap-ctrl-bottom-left>.webmap-ctrl-wrapper{float:left}.webmap-ctrl-bottom-right>.webmap-ctrl,.webmap-ctrl-bottom-right>.webmap-ctrl-wrapper{float:right}.webmap-ctrl-top-left>.webmap-ctrl-margin{margin:10px 0 0 10px}.webmap-ctrl-top-right>.webmap-ctrl-margin{margin:10px 10px 0 0}.webmap-ctrl-bottom-left>.webmap-ctrl-margin{margin:0 0 10px 10px}.webmap-ctrl-bottom-right>.webmap-ctrl-margin{margin:0 10px 10px 0}.webmap-ctrl-group{background:#fff;border-radius:4px}.webmap-ctrl .webmap-ctrl-wrapper{clear:none;float:none;margin:0}.webmap-ctrl .webmap-ctrl-wrapper>.webmap-ctrl,.webmap-ctrl>.webmap-ctrl{clear:none;float:none;margin:0!important}.webmap-ctrl-horizontal,.webmap-ctrl-vertical{display:flex}.webmap-ctrl-vertical{align-items:var(--webmap-ctrl-align,flex-start);flex-direction:column}.webmap-ctrl-horizontal{align-items:var(--webmap-ctrl-align,stretch);flex-direction:row}.webmap-ctrl:not(.webmap-ctrl-group).webmap-ctrl-horizontal,.webmap-ctrl:not(.webmap-ctrl-group).webmap-ctrl-vertical{gap:var(--webmap-ctrl-gap,0)}.webmap-ctrl-gapless:not(.webmap-ctrl-group){background:#fff;border:2px solid rgba(0,0,0,.1);border-radius:4px;box-sizing:border-box;overflow:hidden}.webmap-ctrl-gapless:not(.webmap-ctrl-group):not(:empty){box-shadow:none}.webmap-ctrl-gapless>.webmap-ctrl-group,.webmap-ctrl-gapless>.webmap-ctrl-wrapper>.webmap-ctrl-group{border:0!important;border-radius:0;box-shadow:none!important}.webmap-ctrl-gapless>.leaflet-bar,.webmap-ctrl-gapless>.maplibregl-ctrl-group,.webmap-ctrl-gapless>.ol-control,.webmap-ctrl-gapless>.webmap-ctrl,.webmap-ctrl-gapless>.webmap-ctrl-wrapper>.leaflet-bar,.webmap-ctrl-gapless>.webmap-ctrl-wrapper>.maplibregl-ctrl-group,.webmap-ctrl-gapless>.webmap-ctrl-wrapper>.ol-control,.webmap-ctrl-gapless>.webmap-ctrl-wrapper>.webmap-ctrl{border:0!important;box-shadow:none!important}.webmap-ctrl-gapless.webmap-ctrl-horizontal>.webmap-ctrl-group:first-child,.webmap-ctrl-gapless.webmap-ctrl-horizontal>.webmap-ctrl-wrapper:first-child>.webmap-ctrl-group{border-radius:4px 0 0 4px}.webmap-ctrl-gapless.webmap-ctrl-horizontal>.webmap-ctrl-group:last-child,.webmap-ctrl-gapless.webmap-ctrl-horizontal>.webmap-ctrl-wrapper:last-child>.webmap-ctrl-group{border-radius:0 4px 4px 0}.webmap-ctrl-gapless.webmap-ctrl-vertical>.webmap-ctrl-group:first-child,.webmap-ctrl-gapless.webmap-ctrl-vertical>.webmap-ctrl-wrapper:first-child>.webmap-ctrl-group{border-radius:4px 4px 0 0}.webmap-ctrl-gapless.webmap-ctrl-vertical>.webmap-ctrl-group:last-child,.webmap-ctrl-gapless.webmap-ctrl-vertical>.webmap-ctrl-wrapper:last-child>.webmap-ctrl-group{border-radius:0 0 4px 4px}.webmap-ctrl-gapless>.webmap-ctrl-group:only-child,.webmap-ctrl-gapless>.webmap-ctrl-wrapper:only-child>.webmap-ctrl-group{border-radius:4px}.webmap-ctrl-horizontal>.webmap-ctrl-wrapper,.webmap-ctrl-vertical>.webmap-ctrl-wrapper{display:flex}.webmap-ctrl-group:not(:empty){box-shadow:0 0 0 2px rgba(0,0,0,.1)}@media (-ms-high-contrast:active){.webmap-ctrl-group:not(:empty){box-shadow:0 0 0 2px ButtonText}.webmap-ctrl-gapless:not(.webmap-ctrl-group){border-color:ButtonText}}.webmap-ctrl-gapless>.webmap-ctrl-group:not(:empty),.webmap-ctrl-gapless>.webmap-ctrl-wrapper>.webmap-ctrl-group:not(:empty){border:0!important;box-shadow:none!important}.webmap-ctrl-group button{background-color:transparent;border:0;box-sizing:border-box;cursor:pointer;display:block;height:29px;outline:none;padding:0;width:29px}.webmap-ctrl-button{font-weight:400!important;line-height:inherit!important}.webmap-ctrl-group button+button{border-top:1px solid #ddd}.webmap-ctrl-group.webmap-ctrl-horizontal>button+button{border-left:1px solid #ddd;border-top:0}.webmap-ctrl-gapless .webmap-ctrl-group button+button,.webmap-ctrl-group.webmap-ctrl-gapless button+button{border-left:0!important;border-top:0!important}.webmap-ctrl-gapless .webmap-ctrl-group button{border:0!important;border-radius:0!important;box-shadow:none!important}.webmap-ctrl button .webmap-ctrl-icon{background-position:50%;background-repeat:no-repeat;display:block;height:100%;width:100%}@media (-ms-high-contrast:active){.webmap-ctrl-icon{background-color:transparent}.webmap-ctrl-group button+button{border-top:1px solid ButtonText}}.webmap-ctrl button::-moz-focus-inner{border:0;padding:0}.webmap-ctrl-group button:focus{box-shadow:0 0 2px 2px #0096ff}.webmap-ctrl button:disabled{cursor:not-allowed}.webmap-ctrl button:disabled .webmap-ctrl-icon{opacity:.25}.webmap-ctrl button:not(:disabled):hover{background-color:rgba(0,0,0,.05)}.webmap-ctrl-group button:focus:focus-visible{box-shadow:0 0 2px 2px #0096ff}.webmap-ctrl-group button:focus:not(:focus-visible){box-shadow:none}.webmap-ctrl-group button:focus:first-child{border-radius:4px 4px 0 0}.webmap-ctrl-group button:focus:last-child{border-radius:0 0 4px 4px}.webmap-ctrl-group button:focus:only-child{border-radius:inherit}.webmap-ctrl button.webmap-ctrl-zoom-out .webmap-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E%3C/svg%3E")}.webmap-ctrl button.webmap-ctrl-zoom-in .webmap-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E%3C/svg%3E")}@media (-ms-high-contrast:active){.webmap-ctrl button.webmap-ctrl-zoom-out .webmap-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E%3C/svg%3E")}.webmap-ctrl button.webmap-ctrl-zoom-in .webmap-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E%3C/svg%3E")}}@media (-ms-high-contrast:black-on-white){.webmap-ctrl button.webmap-ctrl-zoom-out .webmap-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M10 13c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h9c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13z'/%3E%3C/svg%3E")}.webmap-ctrl button.webmap-ctrl-zoom-in .webmap-ctrl-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='29' height='29' viewBox='0 0 29 29'%3E%3Cpath d='M14.5 8.5c-.75 0-1.5.75-1.5 1.5v3h-3c-.75 0-1.5.75-1.5 1.5S9.25 16 10 16h3v3c0 .75.75 1.5 1.5 1.5S16 19.75 16 19v-3h3c.75 0 1.5-.75 1.5-1.5S19.75 13 19 13h-3v-3c0-.75-.75-1.5-1.5-1.5'/%3E%3C/svg%3E")}}