iobroker.devices 1.2.14 → 2.0.2
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 +11 -5
- package/admin/assets/index-Csa94g2Q.js +845 -0
- package/admin/assets/index-pCeIEsc7.css +1 -0
- package/admin/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
- package/admin/index_m.html +2 -2
- package/admin/tab.html +2 -2
- package/build/lib/DeviceManagement.js +618 -0
- package/build/lib/DeviceManagement.js.map +1 -0
- package/build/lib/WidgetsManagement.js +627 -0
- package/build/lib/WidgetsManagement.js.map +1 -0
- package/build/main.js +53 -0
- package/build/main.js.map +1 -0
- package/build/widget-utils/WidgetsManagement.js +121 -0
- package/build/widget-utils/WidgetsManagement.js.map +1 -0
- package/build/widget-utils/index.js +18 -0
- package/build/widget-utils/index.js.map +1 -0
- package/build/widget-utils/types/api.js +3 -0
- package/build/widget-utils/types/api.js.map +1 -0
- package/build/widget-utils/types/base.js +3 -0
- package/build/widget-utils/types/base.js.map +1 -0
- package/build/widget-utils/types/common.js +3 -0
- package/build/widget-utils/types/common.js.map +1 -0
- package/build/widget-utils/types/index.js +3 -0
- package/build/widget-utils/types/index.js.map +1 -0
- package/img/ioBrokerLogo.png +0 -0
- package/io-package.json +45 -17
- package/package.json +27 -14
- package/www/assets/index-CmwOqvIb.css +1 -0
- package/www/assets/index-DHISOGRL.js +748 -0
- package/www/assets/ioBrokerLogo-D4L_xR2G.png +0 -0
- package/www/devices.svg +26 -0
- package/www/favicon.ico +0 -0
- package/www/index.html +30 -0
- package/www/manifest.json +15 -0
- package/admin/assets/index-CKue6Ph0.css +0 -1
- package/admin/assets/index-vG62vYjI.js +0 -826
package/build/main.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_fs_1 = require("node:fs");
|
|
7
|
+
const adapter_core_1 = require("@iobroker/adapter-core");
|
|
8
|
+
const WidgetsManagement_1 = __importDefault(require("./lib/WidgetsManagement"));
|
|
9
|
+
class DevicesAdapter extends adapter_core_1.Adapter {
|
|
10
|
+
deviceManagement = null;
|
|
11
|
+
language = 'en';
|
|
12
|
+
constructor(options = {}) {
|
|
13
|
+
super({
|
|
14
|
+
...options,
|
|
15
|
+
name: 'devices',
|
|
16
|
+
objectChange: (id, obj) => {
|
|
17
|
+
this.deviceManagement?.objectChange(id, obj);
|
|
18
|
+
},
|
|
19
|
+
ready: () => this.main(),
|
|
20
|
+
unload: cb => this.unload(cb),
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
unload(cb) {
|
|
24
|
+
//this.deviceManagement?.destroy();
|
|
25
|
+
cb?.();
|
|
26
|
+
}
|
|
27
|
+
async main() {
|
|
28
|
+
this.deviceManagement = new WidgetsManagement_1.default(this, true);
|
|
29
|
+
const systemConfig = await this.getForeignObjectAsync('system.config');
|
|
30
|
+
this.language = systemConfig?.common?.language || 'en';
|
|
31
|
+
this.subscribeForeignObjects('*');
|
|
32
|
+
// Upload one picture to devices.0, so it will be available in the File selector
|
|
33
|
+
try {
|
|
34
|
+
if (!(await this.fileExistsAsync(this.namespace, 'ioBrokerLogo.png'))) {
|
|
35
|
+
const image = (0, node_fs_1.readFileSync)(`${__dirname}/../img/ioBrokerLogo.png`);
|
|
36
|
+
await this.writeFileAsync(this.namespace, 'ioBrokerLogo.png', image);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.log.error(`Unable to upload default image: ${error}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.default = DevicesAdapter;
|
|
45
|
+
if (require.main !== module) {
|
|
46
|
+
// Export the constructor in compact mode
|
|
47
|
+
module.exports = (options) => new DevicesAdapter(options);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
// otherwise start the instance directly
|
|
51
|
+
(() => new DevicesAdapter())();
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;;;;AAAA,qCAAuC;AACvC,yDAAsE;AACtE,gFAA8D;AAE9D,MAAqB,cAAe,SAAQ,sBAAO;IACvC,gBAAgB,GAAmC,IAAI,CAAC;IACzD,QAAQ,GAAuB,IAAI,CAAC;IAE3C,YAAmB,UAAmC,EAAE;QACpD,KAAK,CAAC;YACF,GAAG,OAAO;YACV,IAAI,EAAE,SAAS;YACf,YAAY,EAAE,CAAC,EAAU,EAAE,GAAuC,EAAQ,EAAE;gBACxE,IAAI,CAAC,gBAAgB,EAAE,YAAY,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YACjD,CAAC;YACD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE;YACxB,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;SAChC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,EAAc;QACjB,mCAAmC;QACnC,EAAE,EAAE,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,IAAI;QACN,IAAI,CAAC,gBAAgB,GAAG,IAAI,2BAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,CAAC;QACvE,IAAI,CAAC,QAAQ,GAAG,YAAY,EAAE,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC;QACvD,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;QAElC,gFAAgF;QAChF,IAAI,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC;gBACpE,MAAM,KAAK,GAAG,IAAA,sBAAY,EAAC,GAAG,SAAS,0BAA0B,CAAC,CAAC;gBACnE,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;YACzE,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAmC,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;CACJ;AArCD,iCAqCC;AAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC1B,yCAAyC;IACzC,MAAM,CAAC,OAAO,GAAG,CAAC,OAA4C,EAAE,EAAE,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AACnG,CAAC;KAAM,CAAC;IACJ,wCAAwC;IACxC,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* The idea of a widgets manager to minimize the communication between GUI and backend.
|
|
4
|
+
* All items will be detected in the backend, and GUI must not load ALL objects.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.WidgetsManagement = void 0;
|
|
8
|
+
class WidgetsManagement {
|
|
9
|
+
widgets;
|
|
10
|
+
categories;
|
|
11
|
+
communicationStateId = '';
|
|
12
|
+
adapter;
|
|
13
|
+
constructor(adapter, communicationStateId) {
|
|
14
|
+
adapter.on('message', this.onMessage.bind(this));
|
|
15
|
+
this.adapter = adapter;
|
|
16
|
+
if (communicationStateId === true) {
|
|
17
|
+
// use standard ID `info.deviceManager`
|
|
18
|
+
this.communicationStateId = 'info.widgetManager';
|
|
19
|
+
}
|
|
20
|
+
else if (communicationStateId) {
|
|
21
|
+
this.communicationStateId = communicationStateId;
|
|
22
|
+
}
|
|
23
|
+
if (this.communicationStateId) {
|
|
24
|
+
this.ensureCommunicationState().catch(e => this.log.error(`Cannot initialize communication state: ${e}`));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async ensureCommunicationState() {
|
|
28
|
+
let stateObj = await this.adapter.getObjectAsync(this.communicationStateId);
|
|
29
|
+
if (!stateObj) {
|
|
30
|
+
stateObj = {
|
|
31
|
+
_id: this.communicationStateId,
|
|
32
|
+
type: 'state',
|
|
33
|
+
common: {
|
|
34
|
+
expert: true,
|
|
35
|
+
name: 'Communication with GUI for device manager',
|
|
36
|
+
type: 'string',
|
|
37
|
+
role: 'state',
|
|
38
|
+
def: '',
|
|
39
|
+
read: true,
|
|
40
|
+
write: false,
|
|
41
|
+
},
|
|
42
|
+
native: {},
|
|
43
|
+
};
|
|
44
|
+
await this.adapter.setObjectAsync(this.communicationStateId, stateObj);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async sendCommandToGui(command) {
|
|
48
|
+
if (this.communicationStateId) {
|
|
49
|
+
await this.adapter.setState(this.communicationStateId, JSON.stringify(command), true);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error('Communication state not found');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
get log() {
|
|
56
|
+
return this.adapter.log;
|
|
57
|
+
}
|
|
58
|
+
getWidgetStatus(_itemId) {
|
|
59
|
+
throw new Error('Do not send "statusUpdate" command without implementing getDeviceStatus method!');
|
|
60
|
+
}
|
|
61
|
+
onMessage(obj) {
|
|
62
|
+
if (!obj.command.startsWith('dm:')) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
void this.handleMessage(obj).catch(this.log.error);
|
|
66
|
+
}
|
|
67
|
+
async handleMessage(msg) {
|
|
68
|
+
this.log.debug(`DeviceManagement received: ${JSON.stringify(msg)}`);
|
|
69
|
+
switch (msg.command) {
|
|
70
|
+
case 'dm:loadItems': {
|
|
71
|
+
const [, adapterWidgets] = await Promise.all([this.loadItems(), this.loadCustomWidgets()]);
|
|
72
|
+
const response = {
|
|
73
|
+
categories: [...this.categories.values()],
|
|
74
|
+
widgets: [...this.widgets.values()],
|
|
75
|
+
};
|
|
76
|
+
if (Object.keys(adapterWidgets).length) {
|
|
77
|
+
response.adapterWidgets = adapterWidgets;
|
|
78
|
+
}
|
|
79
|
+
this.sendReply(response, msg);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Read all adapter instances that have `common.deviceWidgets` and return them
|
|
86
|
+
* as `{ adapterName: { widget1: any, widget2: any } }`.
|
|
87
|
+
*/
|
|
88
|
+
async loadCustomWidgets() {
|
|
89
|
+
const result = {};
|
|
90
|
+
try {
|
|
91
|
+
const instances = await this.adapter.getObjectViewAsync('system', 'instance', {
|
|
92
|
+
startkey: 'system.adapter.',
|
|
93
|
+
endkey: 'system.adapter.\u9999',
|
|
94
|
+
});
|
|
95
|
+
if (instances?.rows) {
|
|
96
|
+
for (const row of instances.rows) {
|
|
97
|
+
const common = row.value?.common;
|
|
98
|
+
// @ts-expect-error will be fixed in js-controller
|
|
99
|
+
if (common?.deviceWidgets && typeof common.deviceWidgets === 'object') {
|
|
100
|
+
// Extract adapter name from "system.adapter.adapterName.0"
|
|
101
|
+
const parts = row.id.split('.');
|
|
102
|
+
const adapterName = parts[2];
|
|
103
|
+
if (adapterName) {
|
|
104
|
+
// @ts-expect-error will be fixed in js-controller
|
|
105
|
+
result[adapterName] = common.deviceWidgets;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
this.log.error(`Cannot load custom widgets from instances: ${e}`);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
sendReply(reply, msg) {
|
|
117
|
+
this.adapter.sendTo(msg.from, msg.command, reply, msg.callback);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.WidgetsManagement = WidgetsManagement;
|
|
121
|
+
//# sourceMappingURL=WidgetsManagement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidgetsManagement.js","sourceRoot":"","sources":["../../src/widget-utils/WidgetsManagement.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./WidgetsManagement"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/widget-utils/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../src/widget-utils/types/api.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/widget-utils/types/base.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/widget-utils/types/common.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/widget-utils/types/index.ts"],"names":[],"mappings":""}
|
|
Binary file
|
package/io-package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"common": {
|
|
3
3
|
"name": "devices",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.2",
|
|
5
5
|
"news": {
|
|
6
|
+
"2.0.2": {
|
|
7
|
+
"en": "Added widgets' visualisation. Now it is possible to create a GUI within the adapter",
|
|
8
|
+
"de": "Die Visualisierung von Widgets wurde hinzugefügt. Jetzt ist es möglich, eine GUI innerhalb des Adapters zu erstellen",
|
|
9
|
+
"ru": "Добавлена визуализация виджетов. Теперь можно создать GUI внутри адаптера",
|
|
10
|
+
"pt": "Visualização de widgets adicionados. Agora é possível criar uma GUI dentro do adaptador",
|
|
11
|
+
"nl": "Toegevoegd widgets visualisatie. Nu is het mogelijk om een GUI te maken binnen de adapter",
|
|
12
|
+
"fr": "Ajout de la visualisation des widgets. Maintenant il est possible de créer une interface graphique dans l'adaptateur",
|
|
13
|
+
"it": "Aggiunta visualizzazione dei widget. Ora è possibile creare una GUI all'interno dell'adattatore",
|
|
14
|
+
"es": "Visualización de widgets añadidos. Ahora es posible crear un GUI dentro del adaptador",
|
|
15
|
+
"pl": "Dodano wizualizację widżetów. Teraz jest możliwe stworzenie GUI w adapterze",
|
|
16
|
+
"uk": "Додано візуалізацію віджетів. Тепер можна створювати GUI в адаптері",
|
|
17
|
+
"zh-cn": "添加部件的可视化 。 现在可以在适配器内创建图形界面"
|
|
18
|
+
},
|
|
6
19
|
"1.2.14": {
|
|
7
20
|
"en": "Correcting the scrolling on the touch devices\nFixing a problem with `ACTUAL` state\nCorrecting the hover effect under safari",
|
|
8
21
|
"de": "Korrektur des Scrollens auf den Touch-Geräten\nProblem mit `ACTUAL` Zustand beheben\nKorrektur der Hover-Effekt unter Safari",
|
|
@@ -80,19 +93,6 @@
|
|
|
80
93
|
"pl": "Aktualizacja czujnika typu\nWykonaj wzór konwersji na wartość bieżącą\nWybór lepszych kategorii\nPoprawiony importer wyrobów",
|
|
81
94
|
"uk": "Type-detector оновлений\nВиконувати формулу перетворення на поточну вартість\nКращий вибір категорій\nВиправлений пристрій імпортера",
|
|
82
95
|
"zh-cn": "类型检测器更新\n执行当前值的转换公式\n更好的类别选择器\n修正设备导入器"
|
|
83
|
-
},
|
|
84
|
-
"1.2.4": {
|
|
85
|
-
"en": "Corrected many GUI issues",
|
|
86
|
-
"de": "Viele GUI Probleme korrigiert",
|
|
87
|
-
"ru": "Исправлено много проблем GUI",
|
|
88
|
-
"pt": "Corrigido muitos problemas de GUI",
|
|
89
|
-
"nl": "Veel GUI-problemen gecorrigeerd",
|
|
90
|
-
"fr": "Correction de nombreux problèmes d'interface utilisateur",
|
|
91
|
-
"it": "Corretto molti problemi GUI",
|
|
92
|
-
"es": "Corregidos muchos problemas de GUI",
|
|
93
|
-
"pl": "Poprawiono wiele problemów GUI",
|
|
94
|
-
"uk": "Виправлено багато питань GUI",
|
|
95
|
-
"zh-cn": "更正了许多图形用户界面问题"
|
|
96
96
|
}
|
|
97
97
|
},
|
|
98
98
|
"titleLang": {
|
|
@@ -136,16 +136,16 @@
|
|
|
136
136
|
"connectionType": "none",
|
|
137
137
|
"dataSource": "none",
|
|
138
138
|
"tier": 3,
|
|
139
|
+
"onlyWWW": false,
|
|
139
140
|
"icon": "devices.svg",
|
|
140
141
|
"enabled": true,
|
|
141
142
|
"extIcon": "https://raw.githubusercontent.com/ioBroker/ioBroker.devices/master/admin/devices.svg",
|
|
142
143
|
"readme": "https://github.com/ioBroker/ioBroker.devices/blob/master/README.md",
|
|
143
144
|
"loglevel": "info",
|
|
144
|
-
"onlyWWW": true,
|
|
145
145
|
"singleton": true,
|
|
146
146
|
"type": "general",
|
|
147
147
|
"eraseOnUpload": true,
|
|
148
|
-
"mode": "
|
|
148
|
+
"mode": "daemon",
|
|
149
149
|
"adminTab": {
|
|
150
150
|
"singleton": true,
|
|
151
151
|
"name": {
|
|
@@ -162,9 +162,19 @@
|
|
|
162
162
|
"zh-cn": "设备"
|
|
163
163
|
}
|
|
164
164
|
},
|
|
165
|
+
"supportedMessages": {
|
|
166
|
+
"deviceManager": true
|
|
167
|
+
},
|
|
165
168
|
"adminUI": {
|
|
166
169
|
"config": "none"
|
|
167
170
|
},
|
|
171
|
+
"welcomeScreen": {
|
|
172
|
+
"link": "devices/index.html",
|
|
173
|
+
"name": "Devices",
|
|
174
|
+
"img": "devices.svg",
|
|
175
|
+
"color": "#2196F3",
|
|
176
|
+
"order": 10
|
|
177
|
+
},
|
|
168
178
|
"globalDependencies": [
|
|
169
179
|
{
|
|
170
180
|
"admin": ">=7.6.17"
|
|
@@ -173,5 +183,23 @@
|
|
|
173
183
|
},
|
|
174
184
|
"native": {},
|
|
175
185
|
"objects": [],
|
|
176
|
-
"instanceObjects": [
|
|
186
|
+
"instanceObjects": [
|
|
187
|
+
{
|
|
188
|
+
"_id": "",
|
|
189
|
+
"type": "meta",
|
|
190
|
+
"common": {
|
|
191
|
+
"name": "user files and images for GUI",
|
|
192
|
+
"type": "meta.user"
|
|
193
|
+
},
|
|
194
|
+
"native": {}
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"_id": "config",
|
|
198
|
+
"type": "channel",
|
|
199
|
+
"common": {
|
|
200
|
+
"name": "Stores the configuration of the GUI"
|
|
201
|
+
},
|
|
202
|
+
"native": {}
|
|
203
|
+
}
|
|
204
|
+
]
|
|
177
205
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "iobroker.devices",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.2",
|
|
4
4
|
"description": "Manage and create devices for using it in other adapters like material, iot,...",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "bluefox",
|
|
@@ -19,42 +19,55 @@
|
|
|
19
19
|
"type": "git",
|
|
20
20
|
"url": "https://github.com/ioBroker/ioBroker.devices"
|
|
21
21
|
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@iobroker/dm-utils": "^3.0.0",
|
|
24
|
+
"@iobroker/type-detector": "^5.0.10",
|
|
25
|
+
"typescript": "~5.9.3"
|
|
26
|
+
},
|
|
22
27
|
"devDependencies": {
|
|
23
|
-
"@alcalzone/release-script": "^5.
|
|
24
|
-
"@alcalzone/release-script-plugin-iobroker": "^
|
|
25
|
-
"@alcalzone/release-script-plugin-license": "^
|
|
28
|
+
"@alcalzone/release-script": "^5.1.1",
|
|
29
|
+
"@alcalzone/release-script-plugin-iobroker": "^5.1.2",
|
|
30
|
+
"@alcalzone/release-script-plugin-license": "^5.1.1",
|
|
26
31
|
"@iobroker/build-tools": "^3.0.1",
|
|
27
32
|
"@iobroker/eslint-config": "^2.2.0",
|
|
28
33
|
"@iobroker/legacy-testing": "^2.0.2",
|
|
29
34
|
"@iobroker/testing": "^5.2.2",
|
|
30
|
-
"@types
|
|
35
|
+
"@iobroker/types": "^7.1.0",
|
|
36
|
+
"@types/node": "^25.3.5",
|
|
31
37
|
"colorette": "^2.0.20",
|
|
32
|
-
"puppeteer": "^24.
|
|
38
|
+
"puppeteer": "^24.38.0"
|
|
33
39
|
},
|
|
34
|
-
"main": "
|
|
40
|
+
"main": "build/main.js",
|
|
35
41
|
"files": [
|
|
36
42
|
"admin/",
|
|
37
43
|
"img/",
|
|
44
|
+
"www/",
|
|
45
|
+
"build/",
|
|
38
46
|
"io-package.json",
|
|
39
47
|
"LICENSE"
|
|
40
48
|
],
|
|
41
49
|
"scripts": {
|
|
42
50
|
"prepublishOnly": "node tasks",
|
|
43
|
-
"build": "
|
|
44
|
-
"
|
|
51
|
+
"build:backend": "tsc -p tsconfig.build.json",
|
|
52
|
+
"build": "npm run build:backend && node tasks",
|
|
53
|
+
"lint": "eslint -c eslint.config.mjs && cd src-admin && npm run lint",
|
|
45
54
|
"test:package": "mocha test/package.test.js --exit",
|
|
46
55
|
"test:integration": "mocha test/testAdapter.gui.test.js --exit",
|
|
47
56
|
"release": "release-script",
|
|
48
57
|
"release-patch": "release-script patch --yes",
|
|
49
58
|
"release-minor": "release-script minor --yes",
|
|
50
59
|
"release-major": "release-script major --yes",
|
|
51
|
-
"update-packages": "npx -y npm-check-updates --upgrade && cd src-admin && npx -y npm-check-updates --upgrade",
|
|
52
|
-
"npm": "npm i && cd src-admin && npm i -f",
|
|
60
|
+
"update-packages": "npx -y npm-check-updates --upgrade && cd src-admin && npx -y npm-check-updates --upgrade && cd ../src-www && npx -y npm-check-updates --upgrade",
|
|
61
|
+
"npm": "npm i && cd src-admin && npm i -f && cd ../src-www && npm i -f",
|
|
53
62
|
"test": "npm run test:integration && npm run test:package",
|
|
54
63
|
"0-clean": "node tasks --0-clean",
|
|
55
|
-
"1-npm": "node tasks --1-npm",
|
|
56
|
-
"2-build": "node tasks --2-build",
|
|
57
|
-
"3-copy": "node tasks --3-copy"
|
|
64
|
+
"1-npm-admin": "node tasks --1-npm",
|
|
65
|
+
"2-build-admin": "node tasks --2-build",
|
|
66
|
+
"3-copy-admin": "node tasks --3-copy",
|
|
67
|
+
"0-clean-www": "node tasks --0-clean-www",
|
|
68
|
+
"1-npm-www": "node tasks --1-npm-www",
|
|
69
|
+
"2-build-www": "node tasks --2-build-www",
|
|
70
|
+
"3-copy-www": "node tasks --3-copy-www"
|
|
58
71
|
},
|
|
59
72
|
"bugs": {
|
|
60
73
|
"url": "https://github.com/ioBroker/ioBroker.devices/issues"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
html{height:100%}body{margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:100%;height:100%;overflow:hidden}::-webkit-scrollbar-track{background-color:#ccc;border-radius:5px}::-webkit-scrollbar{width:5px;height:5px;background-color:#ccc}::-webkit-scrollbar-thumb{background-color:#575757;border-radius:5px}#root,.App{height:100%}@keyframes glow{0%{background-color:initial}to{background-color:#58c458}}.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{-ms-touch-action:pan-x pan-y;touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{-ms-touch-action:pinch-zoom;touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{-ms-touch-action:none;touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;-moz-box-sizing:border-box;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;-webkit-transition:opacity .2s linear;-moz-transition:opacity .2s linear;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{-webkit-transition:-webkit-transform .25s cubic-bezier(0,0,.25,1);-moz-transition:-moz-transform .25s cubic-bezier(0,0,.25,1);transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{-webkit-transition:none;-moz-transition:none;transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:-webkit-grab;cursor:-moz-grab;cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:-webkit-grabbing;cursor:-moz-grabbing;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:#ffffff80}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px #000000a6;border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px #0006;background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=)}.leaflet-container .leaflet-control-attribution{background:#fff;background:#fffc;margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;-moz-box-sizing:border-box;box-sizing:border-box;background:#fffc;text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px #0006}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;print-color-adjust:exact}}
|