diff --git a/README.md b/README.md
index 4f4900e..cc3f852 100644
--- a/README.md
+++ b/README.md
@@ -136,7 +136,7 @@ npm run dev -- --open
# dependencies
pnpm outdated
-pnpm upgrade
+pnpm update
# lint
npm run check
diff --git a/eslint.config.js b/eslint.config.js
index 9c62f34..b37b8ee 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -1,13 +1,12 @@
-import js from '@eslint/js';
-import ts from 'typescript-eslint';
-import svelte from 'eslint-plugin-svelte';
+import eslint from '@eslint/js';
import prettier from 'eslint-config-prettier';
+import svelte from 'eslint-plugin-svelte';
import globals from 'globals';
+import tseslint from 'typescript-eslint';
-/** @type {import('eslint').Linter.FlatConfig[]} */
-export default [
- js.configs.recommended,
- ...ts.configs.recommended,
+export default tseslint.config(
+ eslint.configs.recommended,
+ ...tseslint.configs.recommended,
...svelte.configs['flat/recommended'],
prettier,
...svelte.configs['flat/prettier'],
@@ -24,22 +23,22 @@ export default [
files: ['**/*.svelte'],
languageOptions: {
parserOptions: {
- parser: ts.parser
+ parser: tseslint.parser
}
}
},
{
ignores: ['build/', '.svelte-kit/', 'dist/']
},
- /*
- * Temporarily disable certain rules to mitigate
- * unnecessary distractions during development.
- */
{
+ /*
+ * Temporarily disable certain rules to mitigate
+ * unnecessary distractions during development.
+ */
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/ban-ts-comment': 'off',
'svelte/no-at-html-tags': 'off'
}
}
-];
+);
diff --git a/package.json b/package.json
index d398779..2beaf96 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "ha-fusion",
- "version": "2024.7.1",
+ "version": "2024.10.0",
"private": true,
"scripts": {
"dev": "vite dev",
@@ -12,65 +12,64 @@
"format": "prettier --write ."
},
"devDependencies": {
- "@event-calendar/core": "^3.1.0",
- "@event-calendar/day-grid": "^3.1.0",
- "@event-calendar/list": "^3.1.0",
+ "@event-calendar/core": "^3.6.1",
+ "@event-calendar/day-grid": "^3.6.1",
+ "@event-calendar/list": "^3.6.1",
"@iconify/svelte": "^4.0.2",
- "@sveltejs/adapter-node": "^5.2.0",
- "@sveltejs/kit": "^2.5.18",
- "@sveltejs/vite-plugin-svelte": "^3.1.1",
+ "@sveltejs/adapter-node": "^5.2.6",
+ "@sveltejs/kit": "^2.6.4",
+ "@sveltejs/vite-plugin-svelte": "^3.1.2",
"@types/d3-array": "^3.2.1",
"@types/d3-scale": "^4.0.8",
"@types/d3-shape": "^3.1.6",
- "@types/eslint": "^8.56.10",
- "@types/express": "^4.17.21",
+ "@types/eslint": "^9.6.1",
+ "@types/express": "^5.0.0",
"@types/js-yaml": "^4.0.9",
"@types/promise-fs": "^2.1.5",
- "eslint": "^9.6.0",
+ "eslint": "^9.12.0",
"eslint-config-prettier": "^9.1.0",
- "eslint-plugin-svelte": "^2.41.0",
- "globals": "^15.8.0",
- "prettier": "^3.3.2",
- "prettier-plugin-svelte": "^3.2.5",
- "svelte": "^4.2.18",
- "svelte-check": "^3.8.4",
- "svelte-confetti": "^2.0.1",
+ "eslint-plugin-svelte": "^2.44.1",
+ "globals": "^15.11.0",
+ "prettier": "^3.3.3",
+ "prettier-plugin-svelte": "^3.2.7",
+ "svelte": "^4.2.19",
+ "svelte-check": "^4.0.4",
+ "svelte-confetti": "1.4.0",
"svelte-fast-dimension": "^1.1.0",
- "tslib": "^2.6.3",
- "typescript": "^5.5.3",
- "typescript-eslint": "8.0.0-alpha.39",
- "vite": "^5.3.3"
+ "typescript": "^5.6.3",
+ "typescript-eslint": "^8.8.1",
+ "vite": "^5.4.8"
},
"type": "module",
"dependencies": {
- "@codemirror/autocomplete": "^6.17.0",
- "@codemirror/commands": "^6.6.0",
- "@codemirror/language": "^6.10.2",
- "@codemirror/legacy-modes": "^6.4.0",
- "@codemirror/lint": "^6.8.1",
+ "@codemirror/autocomplete": "^6.18.1",
+ "@codemirror/commands": "^6.7.0",
+ "@codemirror/language": "^6.10.3",
+ "@codemirror/legacy-modes": "^6.4.1",
+ "@codemirror/lint": "^6.8.2",
"@codemirror/state": "^6.4.1",
"@codemirror/theme-one-dark": "^6.1.2",
- "@codemirror/view": "^6.28.4",
- "@fontsource-variable/inter": "^5.0.19",
+ "@codemirror/view": "^6.34.1",
+ "@fontsource-variable/inter": "^5.1.0",
"@jaames/iro": "^5.5.2",
"codemirror": "^6.0.1",
"d3-array": "^3.2.4",
"d3-scale": "^4.0.2",
"d3-shape": "^3.2.0",
"dotenv": "^16.4.5",
- "express": "^4.19.2",
- "hls.js": "^1.5.13",
+ "express": "^4.21.1",
+ "hls.js": "^1.5.16",
"home-assistant-js-websocket": "^9.4.0",
- "http-proxy-middleware": "^3.0.0",
+ "http-proxy-middleware": "^3.0.3",
"js-yaml": "^4.1.0",
- "konva": "^9.3.13",
- "maplibre-gl": "^4.5.0",
- "marked": "^13.0.2",
- "svelte-dnd-action": "^0.9.49",
+ "konva": "^9.3.15",
+ "maplibre-gl": "^4.7.1",
+ "marked": "^14.1.2",
+ "svelte-dnd-action": "^0.9.51",
"svelte-modals": "^1.3.0",
"svelte-ripple": "^0.1.1",
"svelte-tiny-virtual-list": "^2.1.2",
"weekstart": "^2.0.0",
- "youtubei.js": "^10.0.0"
+ "youtubei.js": "^10.5.0"
}
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index feba7af..b44d6e4 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -9,20 +9,20 @@ importers:
.:
dependencies:
'@codemirror/autocomplete':
- specifier: ^6.17.0
- version: 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1)
+ specifier: ^6.18.1
+ version: 6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.2)
'@codemirror/commands':
- specifier: ^6.6.0
- version: 6.6.0
+ specifier: ^6.7.0
+ version: 6.7.0
'@codemirror/language':
- specifier: ^6.10.2
- version: 6.10.2
+ specifier: ^6.10.3
+ version: 6.10.3
'@codemirror/legacy-modes':
- specifier: ^6.4.0
- version: 6.4.0
+ specifier: ^6.4.1
+ version: 6.4.1
'@codemirror/lint':
- specifier: ^6.8.1
- version: 6.8.1
+ specifier: ^6.8.2
+ version: 6.8.2
'@codemirror/state':
specifier: ^6.4.1
version: 6.4.1
@@ -30,17 +30,17 @@ importers:
specifier: ^6.1.2
version: 6.1.2
'@codemirror/view':
- specifier: ^6.28.4
- version: 6.28.4
+ specifier: ^6.34.1
+ version: 6.34.1
'@fontsource-variable/inter':
- specifier: ^5.0.19
- version: 5.0.19
+ specifier: ^5.1.0
+ version: 5.1.0
'@jaames/iro':
specifier: ^5.5.2
version: 5.5.2
codemirror:
specifier: ^6.0.1
- version: 6.0.1(@lezer/common@1.2.1)
+ version: 6.0.1(@lezer/common@1.2.2)
d3-array:
specifier: ^3.2.4
version: 3.2.4
@@ -54,35 +54,35 @@ importers:
specifier: ^16.4.5
version: 16.4.5
express:
- specifier: ^4.19.2
- version: 4.19.2
+ specifier: ^4.21.1
+ version: 4.21.1
hls.js:
- specifier: ^1.5.13
- version: 1.5.13
+ specifier: ^1.5.16
+ version: 1.5.16
home-assistant-js-websocket:
specifier: ^9.4.0
version: 9.4.0
http-proxy-middleware:
- specifier: ^3.0.0
- version: 3.0.0
+ specifier: ^3.0.3
+ version: 3.0.3
js-yaml:
specifier: ^4.1.0
version: 4.1.0
konva:
- specifier: ^9.3.13
- version: 9.3.13
+ specifier: ^9.3.15
+ version: 9.3.15
maplibre-gl:
- specifier: ^4.5.0
- version: 4.5.0
+ specifier: ^4.7.1
+ version: 4.7.1
marked:
- specifier: ^13.0.2
- version: 13.0.2
+ specifier: ^14.1.2
+ version: 14.1.2
svelte-dnd-action:
- specifier: ^0.9.49
- version: 0.9.49(svelte@4.2.18)
+ specifier: ^0.9.51
+ version: 0.9.51(svelte@4.2.19)
svelte-modals:
specifier: ^1.3.0
- version: 1.3.0(svelte@4.2.18)
+ version: 1.3.0(svelte@4.2.19)
svelte-ripple:
specifier: ^0.1.1
version: 0.1.1
@@ -93,30 +93,30 @@ importers:
specifier: ^2.0.0
version: 2.0.0
youtubei.js:
- specifier: ^10.0.0
- version: 10.0.0
+ specifier: ^10.5.0
+ version: 10.5.0
devDependencies:
'@event-calendar/core':
- specifier: ^3.1.0
- version: 3.1.0
+ specifier: ^3.6.1
+ version: 3.6.1
'@event-calendar/day-grid':
- specifier: ^3.1.0
- version: 3.1.0
+ specifier: ^3.6.1
+ version: 3.6.1
'@event-calendar/list':
- specifier: ^3.1.0
- version: 3.1.0
+ specifier: ^3.6.1
+ version: 3.6.1
'@iconify/svelte':
specifier: ^4.0.2
- version: 4.0.2(svelte@4.2.18)
+ version: 4.0.2(svelte@4.2.19)
'@sveltejs/adapter-node':
- specifier: ^5.2.0
- version: 5.2.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))
+ specifier: ^5.2.6
+ version: 5.2.6(@sveltejs/kit@2.6.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))
'@sveltejs/kit':
- specifier: ^2.5.18
- version: 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
+ specifier: ^2.6.4
+ version: 2.6.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))
'@sveltejs/vite-plugin-svelte':
- specifier: ^3.1.1
- version: 3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
+ specifier: ^3.1.2
+ version: 3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))
'@types/d3-array':
specifier: ^3.2.1
version: 3.2.1
@@ -127,11 +127,11 @@ importers:
specifier: ^3.1.6
version: 3.1.6
'@types/eslint':
- specifier: ^8.56.10
- version: 8.56.10
+ specifier: ^9.6.1
+ version: 9.6.1
'@types/express':
- specifier: ^4.17.21
- version: 4.17.21
+ specifier: ^5.0.0
+ version: 5.0.0
'@types/js-yaml':
specifier: ^4.0.9
version: 4.0.9
@@ -139,47 +139,44 @@ importers:
specifier: ^2.1.5
version: 2.1.5
eslint:
- specifier: ^9.6.0
- version: 9.6.0
+ specifier: ^9.12.0
+ version: 9.12.0
eslint-config-prettier:
specifier: ^9.1.0
- version: 9.1.0(eslint@9.6.0)
+ version: 9.1.0(eslint@9.12.0)
eslint-plugin-svelte:
- specifier: ^2.41.0
- version: 2.41.0(eslint@9.6.0)(svelte@4.2.18)
+ specifier: ^2.44.1
+ version: 2.44.1(eslint@9.12.0)(svelte@4.2.19)
globals:
- specifier: ^15.8.0
- version: 15.8.0
+ specifier: ^15.11.0
+ version: 15.11.0
prettier:
- specifier: ^3.3.2
- version: 3.3.2
+ specifier: ^3.3.3
+ version: 3.3.3
prettier-plugin-svelte:
- specifier: ^3.2.5
- version: 3.2.5(prettier@3.3.2)(svelte@4.2.18)
+ specifier: ^3.2.7
+ version: 3.2.7(prettier@3.3.3)(svelte@4.2.19)
svelte:
- specifier: ^4.2.18
- version: 4.2.18
+ specifier: ^4.2.19
+ version: 4.2.19
svelte-check:
- specifier: ^3.8.4
- version: 3.8.4(@babel/core@7.24.7)(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(svelte@4.2.18)
+ specifier: ^4.0.4
+ version: 4.0.4(picomatch@2.3.1)(svelte@4.2.19)(typescript@5.6.3)
svelte-confetti:
- specifier: ^2.0.1
- version: 2.0.1(svelte@4.2.18)
+ specifier: 1.4.0
+ version: 1.4.0(svelte@4.2.19)
svelte-fast-dimension:
specifier: ^1.1.0
- version: 1.1.0(svelte@4.2.18)
- tslib:
- specifier: ^2.6.3
- version: 2.6.3
+ version: 1.1.0(svelte@4.2.19)
typescript:
- specifier: ^5.5.3
- version: 5.5.3
+ specifier: ^5.6.3
+ version: 5.6.3
typescript-eslint:
- specifier: 8.0.0-alpha.39
- version: 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
+ specifier: ^8.8.1
+ version: 8.8.1(eslint@9.12.0)(typescript@5.6.3)
vite:
- specifier: ^5.3.3
- version: 5.3.3(@types/node@20.14.10)(terser@5.31.1)
+ specifier: ^5.4.8
+ version: 5.4.8(@types/node@22.7.5)
packages:
@@ -187,112 +184,28 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
- '@babel/code-frame@7.24.7':
- resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/compat-data@7.24.7':
- resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.24.7':
- resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==}
- engines: {node: '>=6.9.0'}
-
- '@babel/generator@7.24.7':
- resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-compilation-targets@7.24.7':
- resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-environment-visitor@7.24.7':
- resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-function-name@7.24.7':
- resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
- engines: {node: '>=6.9.0'}
+ '@bufbuild/protobuf@2.2.0':
+ resolution: {integrity: sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==}
- '@babel/helper-hoist-variables@7.24.7':
- resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-imports@7.24.7':
- resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-module-transforms@7.24.7':
- resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
- '@babel/helper-simple-access@7.24.7':
- resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-split-export-declaration@7.24.7':
- resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-string-parser@7.24.7':
- resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-identifier@7.24.7':
- resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helper-validator-option@7.24.7':
- resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.24.7':
- resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/highlight@7.24.7':
- resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/parser@7.24.7':
- resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
- '@babel/template@7.24.7':
- resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
- engines: {node: '>=6.9.0'}
-
- '@babel/traverse@7.24.7':
- resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==}
- engines: {node: '>=6.9.0'}
-
- '@babel/types@7.24.7':
- resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==}
- engines: {node: '>=6.9.0'}
-
- '@codemirror/autocomplete@6.17.0':
- resolution: {integrity: sha512-fdfj6e6ZxZf8yrkMHUSJJir7OJkHkZKaOZGzLWIYp2PZ3jd+d+UjG8zVPqJF6d3bKxkhvXTPan/UZ1t7Bqm0gA==}
+ '@codemirror/autocomplete@6.18.1':
+ resolution: {integrity: sha512-iWHdj/B1ethnHRTwZj+C1obmmuCzquH29EbcKr0qIjA9NfDeBDJ7vs+WOHsFeLeflE4o+dHfYndJloMKHUkWUA==}
peerDependencies:
'@codemirror/language': ^6.0.0
'@codemirror/state': ^6.0.0
'@codemirror/view': ^6.0.0
'@lezer/common': ^1.0.0
- '@codemirror/commands@6.6.0':
- resolution: {integrity: sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==}
+ '@codemirror/commands@6.7.0':
+ resolution: {integrity: sha512-+cduIZ2KbesDhbykV02K25A5xIVrquSPz4UxxYBemRlAT2aW8dhwUgLDwej7q/RJUHKk4nALYcR1puecDvbdqw==}
- '@codemirror/language@6.10.2':
- resolution: {integrity: sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==}
+ '@codemirror/language@6.10.3':
+ resolution: {integrity: sha512-kDqEU5sCP55Oabl6E7m5N+vZRoc0iWqgDVhEKifcHzPzjqCegcO4amfrYVL9PmPZpl4G0yjkpTpUO/Ui8CzO8A==}
- '@codemirror/legacy-modes@6.4.0':
- resolution: {integrity: sha512-5m/K+1A6gYR0e+h/dEde7LoGimMjRtWXZFg4Lo70cc8HzjSdHe3fLwjWMR0VRl5KFT1SxalSap7uMgPKF28wBA==}
+ '@codemirror/legacy-modes@6.4.1':
+ resolution: {integrity: sha512-vdg3XY7OAs5uLDx2Iw+cGfnwtd7kM+Et/eMsqAGTfT/JKiVBQZXosTzjEbWAi/FrY6DcQIz8mQjBozFHZEUWQA==}
- '@codemirror/lint@6.8.1':
- resolution: {integrity: sha512-IZ0Y7S4/bpaunwggW2jYqwLuHj0QtESf5xcROewY6+lDNwZ/NzvR4t+vpYgg9m7V8UXLPYqG+lu3DF470E5Oxg==}
+ '@codemirror/lint@6.8.2':
+ resolution: {integrity: sha512-PDFG5DjHxSEjOXk9TQYYVjZDqlZTFaDBfhQixHnQOEVDDNHUbEh/hstAjcQJaA6FQdZTD1hquXTK0rVBLADR1g==}
'@codemirror/search@6.5.6':
resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==}
@@ -303,8 +216,8 @@ packages:
'@codemirror/theme-one-dark@6.1.2':
resolution: {integrity: sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==}
- '@codemirror/view@6.28.4':
- resolution: {integrity: sha512-QScv95fiviSQ/CaVGflxAvvvDy/9wi0RFyDl4LkHHWiMr/UPebyuTspmYSeN5Nx6eujcPYwsQzA6ZIZucKZVHQ==}
+ '@codemirror/view@6.34.1':
+ resolution: {integrity: sha512-t1zK/l9UiRqwUNPm+pdIT0qzJlzuVckbTEMVNFhfWkGiBQClstzg+78vedCvLSX0xJEZ6lwZbPpnljL7L6iwMQ==}
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
@@ -450,48 +363,64 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.11.0':
- resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
+ '@eslint-community/regexpp@4.11.1':
+ resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
- '@eslint/config-array@0.17.0':
- resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==}
+ '@eslint/config-array@0.18.0':
+ resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.6.0':
+ resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.1.0':
resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.6.0':
- resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==}
+ '@eslint/js@9.12.0':
+ resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.4':
resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@event-calendar/core@3.1.0':
- resolution: {integrity: sha512-hz6jpFeFUEb/mOu2vFn96wBFYEDYHb8lPyDjlaHqD4E02OXnLb/ej0kRWMu5NnF4aE7UEKq648Lx3cbH1QJrIw==}
+ '@eslint/plugin-kit@0.2.0':
+ resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@event-calendar/day-grid@3.1.0':
- resolution: {integrity: sha512-koaIBZxYB+SrjvgvJmehFI4SrDqd4PdN8aPb+7f7HYWrFKA3SZmVr6WHaPTog34p4bFjMYiJC3gJfaNK/KhEpw==}
+ '@event-calendar/core@3.6.1':
+ resolution: {integrity: sha512-Q2ungvu3h/aZTf8bWDHUIja7Hxea2Et31riR+U8c95ZuCtwnLhxff1PSvrbGIOR1LPgZc9XYvPx91sM+Z/7Ybg==}
- '@event-calendar/list@3.1.0':
- resolution: {integrity: sha512-EivcJ5jwA1kS7milhppPZ4/ys+YdqEHLwyUSoO4LjB99M3czgyyoaa7BzWMThSmF5xdqhcPBa9so5b41A/rJwQ==}
+ '@event-calendar/day-grid@3.6.1':
+ resolution: {integrity: sha512-YKJwysDnnys1knIlCV6W2AS1r+zC0P5Xcc8TPW7uAmXF/C/GO4nobi78xJXw8U1suYV3zXzY5vG1+s/wUIEyaA==}
+
+ '@event-calendar/list@3.6.1':
+ resolution: {integrity: sha512-X6ZvSrAheYEyuvlnV9lzGqpXnYp7nqvXwumF82Rf326vpi8yjcLV5PiTBXEoQDfvzeLXDv7K/2FpYcdnW6/llQ==}
'@fastify/busboy@2.1.1':
resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
engines: {node: '>=14'}
- '@fontsource-variable/inter@5.0.19':
- resolution: {integrity: sha512-V5KPpF5o0sI1uNWAdFArC87NDOb/ZJDPXLomEiKmDCYMlDUCTn2flkuAZkyME2rtGOKO7vzCuDJAND0m/5PhDA==}
+ '@fontsource-variable/inter@5.1.0':
+ resolution: {integrity: sha512-Wj2dUGP0vUpxRGQTXQTCNJO+aLcFcQm+gUPXfj/aS877bQkEPBPv9JvZJpwdm2vzelt8NTZ+ausKlBCJjh2XIg==}
+
+ '@humanfs/core@0.19.0':
+ resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.5':
+ resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==}
+ engines: {node: '>=18.18.0'}
'@humanwhocodes/module-importer@1.0.1':
resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
engines: {node: '>=12.22'}
- '@humanwhocodes/retry@0.3.0':
- resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==}
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
engines: {node: '>=18.18'}
'@iconify/svelte@4.0.2':
@@ -505,10 +434,6 @@ packages:
'@irojs/iro-core@1.2.1':
resolution: {integrity: sha512-p2OvsBSSmidsDsTSkID6jEyXDF7lcyxPrkh3qBzasBZFpjkYd6kZ3yMWai3MlAaQ3F7li/Et7rSJVV09Fpei+A==}
- '@isaacs/cliui@8.0.2':
- resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
- engines: {node: '>=12'}
-
'@jaames/iro@5.5.2':
resolution: {integrity: sha512-Fbi5U4Vdkw6UsF+R3oMlPONqkvUDMkwzh+mX718gQsDFt3+1r1jvGsrfCbedmXAAy0WsjDHOrefK0BkDk99TQg==}
@@ -524,23 +449,20 @@ packages:
resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
engines: {node: '>=6.0.0'}
- '@jridgewell/source-map@0.3.6':
- resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==}
-
- '@jridgewell/sourcemap-codec@1.4.15':
- resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
- '@lezer/common@1.2.1':
- resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==}
+ '@lezer/common@1.2.2':
+ resolution: {integrity: sha512-Z+R3hN6kXbgBWAuejUNPihylAL1Z5CaFqnIe0nTX8Ej+XlIy3EGtXxn6WtLMO+os2hRkQvm2yvaGMYliUzlJaw==}
- '@lezer/highlight@1.2.0':
- resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==}
+ '@lezer/highlight@1.2.1':
+ resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==}
- '@lezer/lr@1.4.1':
- resolution: {integrity: sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==}
+ '@lezer/lr@1.4.2':
+ resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==}
'@mapbox/geojson-rewind@0.5.2':
resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==}
@@ -566,8 +488,8 @@ packages:
resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==}
engines: {node: '>=6.0.0'}
- '@maplibre/maplibre-gl-style-spec@20.3.0':
- resolution: {integrity: sha512-eSiQ3E5LUSxAOY9ABXGyfNhout2iEa6mUxKeaQ9nJ8NL1NuaQYU7zKqzx/LEYcXe1neT4uYAgM1wYZj3fTSXtA==}
+ '@maplibre/maplibre-gl-style-spec@20.3.1':
+ resolution: {integrity: sha512-5ueL4UDitzVtceQ8J4kY+Px3WK+eZTsmGwha3MBKHKqiHvKrjWWwBCIl1K8BuJSc5OFh83uI8IFNoFvQxX2uUw==}
hasBin: true
'@nodelib/fs.scandir@2.1.5':
@@ -582,15 +504,11 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
- '@pkgjs/parseargs@0.11.0':
- resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
- engines: {node: '>=14'}
-
- '@polka/url@1.0.0-next.25':
- resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==}
+ '@polka/url@1.0.0-next.28':
+ resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
- '@rollup/plugin-commonjs@26.0.1':
- resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==}
+ '@rollup/plugin-commonjs@28.0.0':
+ resolution: {integrity: sha512-BJcu+a+Mpq476DMXG+hevgPSl56bkUoi88dKT8t3RyUp8kGuOh+2bU8Gs7zXDlu+fyZggnJ+iOBGrb/O1SorYg==}
engines: {node: '>=16.0.0 || 14 >= 14.17'}
peerDependencies:
rollup: ^2.68.0||^3.0.0||^4.0.0
@@ -607,8 +525,8 @@ packages:
rollup:
optional: true
- '@rollup/plugin-node-resolve@15.2.3':
- resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==}
+ '@rollup/plugin-node-resolve@15.3.0':
+ resolution: {integrity: sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^2.78.0||^3.0.0||^4.0.0
@@ -616,8 +534,8 @@ packages:
rollup:
optional: true
- '@rollup/pluginutils@5.1.0':
- resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==}
+ '@rollup/pluginutils@5.1.2':
+ resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
@@ -625,97 +543,97 @@ packages:
rollup:
optional: true
- '@rollup/rollup-android-arm-eabi@4.18.0':
- resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==}
+ '@rollup/rollup-android-arm-eabi@4.24.0':
+ resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.18.0':
- resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==}
+ '@rollup/rollup-android-arm64@4.24.0':
+ resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.18.0':
- resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==}
+ '@rollup/rollup-darwin-arm64@4.24.0':
+ resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.18.0':
- resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==}
+ '@rollup/rollup-darwin-x64@4.24.0':
+ resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
- resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
+ resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.18.0':
- resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
+ '@rollup/rollup-linux-arm-musleabihf@4.24.0':
+ resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.18.0':
- resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==}
+ '@rollup/rollup-linux-arm64-gnu@4.24.0':
+ resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.18.0':
- resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
+ '@rollup/rollup-linux-arm64-musl@4.24.0':
+ resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
- resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==}
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
+ resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.18.0':
- resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==}
+ '@rollup/rollup-linux-riscv64-gnu@4.24.0':
+ resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.18.0':
- resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==}
+ '@rollup/rollup-linux-s390x-gnu@4.24.0':
+ resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.18.0':
- resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==}
+ '@rollup/rollup-linux-x64-gnu@4.24.0':
+ resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.18.0':
- resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==}
+ '@rollup/rollup-linux-x64-musl@4.24.0':
+ resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.18.0':
- resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==}
+ '@rollup/rollup-win32-arm64-msvc@4.24.0':
+ resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.18.0':
- resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==}
+ '@rollup/rollup-win32-ia32-msvc@4.24.0':
+ resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.18.0':
- resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==}
+ '@rollup/rollup-win32-x64-msvc@4.24.0':
+ resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==}
cpu: [x64]
os: [win32]
- '@sveltejs/adapter-node@5.2.0':
- resolution: {integrity: sha512-HVZoei2078XSyPmvdTHE03VXDUD0ytTvMuMHMQP0j6zX4nPDpCcKrgvU7baEblMeCCMdM/shQvstFxOJPQKlUQ==}
+ '@sveltejs/adapter-node@5.2.6':
+ resolution: {integrity: sha512-FT9MDduZT2srUz/gDFFhQ3U2Mp9reZ3xJdJBEhr/lk+dkieSSpdgIDNNbMkm84hTaXXiC7f4cPNk8fB5nT3N2g==}
peerDependencies:
'@sveltejs/kit': ^2.4.0
- '@sveltejs/kit@2.5.18':
- resolution: {integrity: sha512-+g06hvpVAnH7b4CDjhnTDgFWBKBiQJpuSmQeGYOuzbO3SC3tdYjRNlDCrafvDtKbGiT2uxY5Dn9qdEUGVZdWOQ==}
+ '@sveltejs/kit@2.6.4':
+ resolution: {integrity: sha512-qfcbyWw35cy6k9sQ1GUkhuE5qj+PgPKJx3/Aa3+veooWgN0DXZXqMS2PDgpgKDXRIFj6V1KWmMZYYPOhL45lXg==}
engines: {node: '>=18.13'}
hasBin: true
peerDependencies:
- '@sveltejs/vite-plugin-svelte': ^3.0.0
+ '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1
svelte: ^4.0.0 || ^5.0.0-next.0
vite: ^5.0.3
@@ -727,8 +645,8 @@ packages:
svelte: ^4.0.0 || ^5.0.0-next.0
vite: ^5.0.0
- '@sveltejs/vite-plugin-svelte@3.1.1':
- resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==}
+ '@sveltejs/vite-plugin-svelte@3.1.2':
+ resolution: {integrity: sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==}
engines: {node: ^18.0.0 || >=20}
peerDependencies:
svelte: ^4.0.0 || ^5.0.0-next.0
@@ -758,17 +676,17 @@ packages:
'@types/d3-time@3.0.3':
resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==}
- '@types/eslint@8.56.10':
- resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==}
+ '@types/eslint@9.6.1':
+ resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
- '@types/estree@1.0.5':
- resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
- '@types/express-serve-static-core@4.19.5':
- resolution: {integrity: sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==}
+ '@types/express-serve-static-core@5.0.0':
+ resolution: {integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==}
- '@types/express@4.17.21':
- resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==}
+ '@types/express@5.0.0':
+ resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==}
'@types/geojson-vt@3.2.5':
resolution: {integrity: sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==}
@@ -779,8 +697,8 @@ packages:
'@types/http-errors@2.0.4':
resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==}
- '@types/http-proxy@1.17.14':
- resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==}
+ '@types/http-proxy@1.17.15':
+ resolution: {integrity: sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==}
'@types/js-yaml@4.0.9':
resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
@@ -788,9 +706,6 @@ packages:
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
- '@types/junit-report-builder@3.0.2':
- resolution: {integrity: sha512-R5M+SYhMbwBeQcNXYWNCZkl09vkVfAtcPIaCGdzIkkbeaTrVbGQ7HVgi4s+EmM/M1K4ZuWQH0jGcvMvNePfxYA==}
-
'@types/mapbox__point-geometry@0.1.4':
resolution: {integrity: sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==}
@@ -800,8 +715,8 @@ packages:
'@types/mime@1.3.5':
resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==}
- '@types/node@20.14.10':
- resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
+ '@types/node@22.7.5':
+ resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==}
'@types/pbf@3.0.5':
resolution: {integrity: sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==}
@@ -809,11 +724,8 @@ packages:
'@types/promise-fs@2.1.5':
resolution: {integrity: sha512-C8bi4Xh6HlixkGspIDaX/zFA+r1+UHUuXYJCCqi6oBlVjxF870kPv38aJlSRo0u1j+2YBi0PLP7PGMZIBbCQ6Q==}
- '@types/pug@2.0.10':
- resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==}
-
- '@types/qs@6.9.15':
- resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==}
+ '@types/qs@6.9.16':
+ resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==}
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
@@ -830,8 +742,8 @@ packages:
'@types/supercluster@7.1.3':
resolution: {integrity: sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==}
- '@typescript-eslint/eslint-plugin@8.0.0-alpha.39':
- resolution: {integrity: sha512-ILv1vDA8M9ah1vzYpnOs4UOLRdB63Ki/rsxedVikjMLq68hFfpsDR25bdMZ4RyUkzLJwOhcg3Jujm/C1nupXKA==}
+ '@typescript-eslint/eslint-plugin@8.8.1':
+ resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
@@ -841,8 +753,8 @@ packages:
typescript:
optional: true
- '@typescript-eslint/parser@8.0.0-alpha.39':
- resolution: {integrity: sha512-5k+pwV91plJojHgZkWlq4/TQdOrnEaeSvt48V0m8iEwdMJqX/63BXYxy8BUOSghWcjp05s73vy9HJjovAKmHkQ==}
+ '@typescript-eslint/parser@8.8.1':
+ resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
@@ -851,12 +763,12 @@ packages:
typescript:
optional: true
- '@typescript-eslint/scope-manager@8.0.0-alpha.39':
- resolution: {integrity: sha512-HCBlKQROY+JIgWolucdFMj1W3VUnnIQTdxAhxJTAj3ix2nASmvKIFgrdo5KQMrXxQj6tC4l3zva10L+s0dUIIw==}
+ '@typescript-eslint/scope-manager@8.8.1':
+ resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/type-utils@8.0.0-alpha.39':
- resolution: {integrity: sha512-alO13fRU6yVeJbwl9ESI3AYhq5dQdz3Dpd0I5B4uezs2lvgYp44dZsj5hWyPz/kL7JFEsjbn+4b/CZA0OQJzjA==}
+ '@typescript-eslint/type-utils@8.8.1':
+ resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -864,12 +776,12 @@ packages:
typescript:
optional: true
- '@typescript-eslint/types@8.0.0-alpha.39':
- resolution: {integrity: sha512-yINN7j0/+S1VGSp0IgH52oQvUx49vkOug6xbrDA/9o+U55yCAQKSvYWvzYjNa+SZE3hXI0zwvYtMVsIAAMmKIQ==}
+ '@typescript-eslint/types@8.8.1':
+ resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.0.0-alpha.39':
- resolution: {integrity: sha512-S8gREuP8r8PCxGegeojeXntx0P50ul9YH7c7JYpbLIIsEPNr5f7UHlm+I1NUbL04CBin4kvZ60TG4eWr/KKN9A==}
+ '@typescript-eslint/typescript-estree@8.8.1':
+ resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -877,14 +789,14 @@ packages:
typescript:
optional: true
- '@typescript-eslint/utils@8.0.0-alpha.39':
- resolution: {integrity: sha512-Nr2PrlfNhrNQTlFHlD7XJdTGw/Vt8qY44irk6bfjn9LxGdSG5e4c1R2UN6kvGMhhx20DBPbM7q3Z3r+huzmL1w==}
+ '@typescript-eslint/utils@8.8.1':
+ resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- '@typescript-eslint/visitor-keys@8.0.0-alpha.39':
- resolution: {integrity: sha512-DVJ0UdhucZy+/1GlIy7FX2+CFhCeNAi4VwaEAe7u2UDenQr9/kGqvzx00UlpWibmEVDw4KsPOI7Aqa1+2Vqfmw==}
+ '@typescript-eslint/visitor-keys@8.8.1':
+ resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
accepts@1.3.8:
@@ -904,35 +816,16 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
- ansi-regex@5.0.1:
- resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
- engines: {node: '>=8'}
-
- ansi-regex@6.0.1:
- resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
- engines: {node: '>=12'}
-
- ansi-styles@3.2.1:
- resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
- engines: {node: '>=4'}
-
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
- ansi-styles@6.2.1:
- resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
- engines: {node: '>=12'}
-
- anymatch@3.1.3:
- resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
- engines: {node: '>= 8'}
-
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
- aria-query@5.3.0:
- resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
arr-union@3.1.0:
resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
@@ -941,26 +834,19 @@ packages:
array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
- array-union@2.1.0:
- resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
- engines: {node: '>=8'}
-
assign-symbols@1.0.0:
resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
engines: {node: '>=0.10.0'}
- axobject-query@4.0.0:
- resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==}
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- binary-extensions@2.3.0:
- resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
- engines: {node: '>=8'}
-
- body-parser@1.20.2:
- resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==}
+ body-parser@1.20.3:
+ resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
brace-expansion@1.1.11:
@@ -973,22 +859,6 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.23.1:
- resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
- buffer-crc32@1.0.0:
- resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==}
- engines: {node: '>=8.0.0'}
-
- buffer-from@1.1.2:
- resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
- builtin-modules@3.3.0:
- resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==}
- engines: {node: '>=6'}
-
bytes@3.1.2:
resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
engines: {node: '>= 0.8'}
@@ -1007,20 +877,13 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001640:
- resolution: {integrity: sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==}
-
- chalk@2.4.2:
- resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
- engines: {node: '>=4'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
- chokidar@3.6.0:
- resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
- engines: {node: '>= 8.10.0'}
+ chokidar@4.0.1:
+ resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
+ engines: {node: '>= 14.16.0'}
code-red@1.0.4:
resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==}
@@ -1028,22 +891,13 @@ packages:
codemirror@6.0.1:
resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==}
- color-convert@1.9.3:
- resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
- color-name@1.1.3:
- resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- commander@2.20.3:
- resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
-
commondir@1.0.1:
resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
@@ -1058,9 +912,6 @@ packages:
resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
engines: {node: '>= 0.6'}
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-
cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
@@ -1068,6 +919,10 @@ packages:
resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==}
engines: {node: '>= 0.6'}
+ cookie@0.7.1:
+ resolution: {integrity: sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==}
+ engines: {node: '>= 0.6'}
+
crelt@1.0.6:
resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==}
@@ -1128,8 +983,8 @@ packages:
supports-color:
optional: true
- debug@4.3.5:
- resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
+ debug@4.3.7:
+ resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
peerDependencies:
supports-color: '*'
@@ -1152,51 +1007,31 @@ packages:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
- dequal@2.0.3:
- resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
- engines: {node: '>=6'}
-
destroy@1.2.0:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- detect-indent@6.1.0:
- resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
- engines: {node: '>=8'}
-
- devalue@5.0.0:
- resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==}
-
- dir-glob@3.0.1:
- resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
- engines: {node: '>=8'}
+ devalue@5.1.1:
+ resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
dotenv@16.4.5:
resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==}
engines: {node: '>=12'}
- earcut@2.2.4:
- resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==}
-
- eastasianwidth@0.2.0:
- resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+ earcut@3.0.0:
+ resolution: {integrity: sha512-41Fs7Q/PLq1SDbqjsgcY7GA42T0jvaCNGXgGtsNdvg+Yv8eIu06bxv4/PoREkZ9nMDNwnUSG9OFB9+yv8eKhDg==}
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- electron-to-chromium@1.4.818:
- resolution: {integrity: sha512-eGvIk2V0dGImV9gWLq8fDfTTsCAeMDwZqEPMr+jMInxZdnp9Us8UpovYpRCf9NQ7VOFgrN2doNSgvISbsbNpxA==}
-
- emoji-regex@8.0.0:
- resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
- emoji-regex@9.2.2:
- resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-
encodeurl@1.0.2:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
+ encodeurl@2.0.0:
+ resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==}
+ engines: {node: '>= 0.8'}
+
es-define-property@1.0.0:
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
engines: {node: '>= 0.4'}
@@ -1205,25 +1040,14 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es6-promise@3.3.1:
- resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
-
esbuild@0.21.5:
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
engines: {node: '>=12'}
hasBin: true
- escalade@3.1.2:
- resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
- engines: {node: '>=6'}
-
escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
- escape-string-regexp@1.0.5:
- resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
- engines: {node: '>=0.8.0'}
-
escape-string-regexp@4.0.0:
resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
engines: {node: '>=10'}
@@ -1240,12 +1064,12 @@ packages:
peerDependencies:
eslint: '>=7.0.0'
- eslint-plugin-svelte@2.41.0:
- resolution: {integrity: sha512-gjU9Q/psxbWG1VNwYbEb0Q6U4W5PBGaDpYmO2zlQ+zlAMVS3Qt0luAK0ACi/tMSwRK6JENiySvMyJbO0YWmXSg==}
+ eslint-plugin-svelte@2.44.1:
+ resolution: {integrity: sha512-w6wkoJPw1FJKFtM/2oln21rlu5+HTd2CSkkzhm32A+trNoW2EYQqTQAbDTU6k2GI/6Vh64rBHYQejqEgDld7fw==}
engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0
- svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.155
+ svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191
peerDependenciesMeta:
svelte:
optional: true
@@ -1254,36 +1078,41 @@ packages:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- eslint-scope@8.0.1:
- resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==}
+ eslint-scope@8.1.0:
+ resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- eslint-visitor-keys@4.0.0:
- resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==}
+ eslint-visitor-keys@4.1.0:
+ resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.6.0:
- resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==}
+ eslint@9.12.0:
+ resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
esm-env@1.0.0:
resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==}
- espree@10.1.0:
- resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==}
+ espree@10.2.0:
+ resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
espree@9.6.1:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- esquery@1.5.0:
- resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
engines: {node: '>=0.10'}
esrecurse@4.3.0:
@@ -1311,8 +1140,8 @@ packages:
eventemitter3@4.0.7:
resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
- express@4.19.2:
- resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==}
+ express@4.21.1:
+ resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==}
engines: {node: '>= 0.10.0'}
extend-shallow@2.0.1:
@@ -1339,6 +1168,14 @@ packages:
fastq@1.17.1:
resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ fdir@6.4.0:
+ resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
@@ -1347,8 +1184,8 @@ packages:
resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
engines: {node: '>=8'}
- finalhandler@1.2.0:
- resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
+ finalhandler@1.3.1:
+ resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==}
engines: {node: '>= 0.8'}
find-up@5.0.0:
@@ -1362,8 +1199,8 @@ packages:
flatted@3.3.1:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
- follow-redirects@1.15.6:
- resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
@@ -1371,10 +1208,6 @@ packages:
debug:
optional: true
- foreground-child@3.2.1:
- resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==}
- engines: {node: '>=14'}
-
forwarded@0.2.0:
resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
engines: {node: '>= 0.6'}
@@ -1383,9 +1216,6 @@ packages:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
- fs.realpath@1.0.0:
- resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -1394,10 +1224,6 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
geojson-vt@4.0.2:
resolution: {integrity: sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==}
@@ -1424,54 +1250,30 @@ packages:
resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
engines: {node: '>=10.13.0'}
- glob@10.4.3:
- resolution: {integrity: sha512-Q38SGlYRpVtDBPSWEylRyctn7uDeTp4NQERTLiCT1FqA9JXPYWqAVmQU6qh4r/zMM5ehxTcbaO8EjhWnvEhmyg==}
- engines: {node: '>=18'}
- hasBin: true
-
- glob@7.2.3:
- resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
- deprecated: Glob versions prior to v9 are no longer supported
-
- global-prefix@3.0.0:
- resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
- engines: {node: '>=6'}
-
- globals@11.12.0:
- resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
- engines: {node: '>=4'}
+ global-prefix@4.0.0:
+ resolution: {integrity: sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==}
+ engines: {node: '>=16'}
globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
engines: {node: '>=18'}
- globals@15.8.0:
- resolution: {integrity: sha512-VZAJ4cewHTExBWDHR6yptdIBlx9YSSZuwojj9Nt5mBRXQzrKakDsVKQ1J63sklLvzAJm0X5+RpO4i3Y2hcOnFw==}
+ globals@15.11.0:
+ resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==}
engines: {node: '>=18'}
globalyzer@0.1.0:
resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==}
- globby@11.1.0:
- resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
- engines: {node: '>=10'}
-
globrex@0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
- graceful-fs@4.2.11:
- resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
-
graphemer@1.4.0:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
- has-flag@3.0.0:
- resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
- engines: {node: '>=4'}
-
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -1491,8 +1293,8 @@ packages:
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
engines: {node: '>= 0.4'}
- hls.js@1.5.13:
- resolution: {integrity: sha512-xRgKo84nsC7clEvSfIdgn/Tc0NOT+d7vdiL/wvkLO+0k0juc26NRBPPG1SfB8pd5bHXIjMW/F5VM8VYYkOYYdw==}
+ hls.js@1.5.16:
+ resolution: {integrity: sha512-+wAWr4aeRq9ODN8/Vgz0Cee1Cw6Ysr7vyEkZJCwOJYNwlld7CNmhKE+dLwfpUO2UuotYLGF0of6UFiN6zA7mig==}
home-assistant-js-websocket@9.4.0:
resolution: {integrity: sha512-312TuI63IfKf8G+iWvKmPYIdxWMNojwVk03o9OSpQFFDjSCNAYdCUfuPCFs73SuJ1Xpd4D1Eo11CB33MGMqZ+Q==}
@@ -1501,8 +1303,8 @@ packages:
resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
engines: {node: '>= 0.8'}
- http-proxy-middleware@3.0.0:
- resolution: {integrity: sha512-36AV1fIaI2cWRzHo+rbcxhe3M3jUDCNzc4D5zRl57sEWRAxdXYtw7FSQKYY6PDKssiAKjLYypbssHk+xs/kMXw==}
+ http-proxy-middleware@3.0.3:
+ resolution: {integrity: sha512-usY0HG5nyDUwtqpiZdETNbmKtw3QQ1jwYFZ9wi5iHzX2BcILwQKtYDJPo7XHTsu5Z0B2Hj3W9NNnbd+AjFWjqg==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
http-proxy@1.18.1:
@@ -1516,8 +1318,8 @@ packages:
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
- ignore@5.3.1:
- resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
import-fresh@3.3.0:
@@ -1531,15 +1333,12 @@ packages:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
- inflight@1.0.6:
- resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
- deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
-
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
- ini@1.3.8:
- resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+ ini@4.1.3:
+ resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
internmap@2.0.3:
resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==}
@@ -1549,16 +1348,8 @@ packages:
resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
engines: {node: '>= 0.10'}
- is-binary-path@2.1.0:
- resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
- engines: {node: '>=8'}
-
- is-builtin-module@3.2.1:
- resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==}
- engines: {node: '>=6'}
-
- is-core-module@2.14.0:
- resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==}
+ is-core-module@2.15.1:
+ resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
engines: {node: '>= 0.4'}
is-extendable@0.1.1:
@@ -1573,10 +1364,6 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-fullwidth-code-point@3.0.0:
- resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
- engines: {node: '>=8'}
-
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
@@ -1588,18 +1375,14 @@ packages:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
- is-path-inside@3.0.3:
- resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
- engines: {node: '>=8'}
-
- is-plain-obj@3.0.0:
- resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
- engines: {node: '>=10'}
-
is-plain-object@2.0.4:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
engines: {node: '>=0.10.0'}
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
is-reference@1.2.1:
resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==}
@@ -1609,29 +1392,21 @@ packages:
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ isexe@3.1.1:
+ resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==}
+ engines: {node: '>=16'}
+
isobject@3.0.1:
resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
engines: {node: '>=0.10.0'}
- jackspeak@3.4.1:
- resolution: {integrity: sha512-U23pQPDnmYybVkYjObcuYMk43VRlMLLqLI+RdZy8s8WV8WsxO9SnqSroKaluuvcNOdCAlauKszDwd+umbot5Mg==}
- engines: {node: '>=18'}
-
- jintr@1.1.0:
- resolution: {integrity: sha512-Tu9wk3BpN2v+kb8yT6YBtue+/nbjeLFv4vvVC4PJ7oCidHKbifWhvORrAbQfxVIQZG+67am/mDagpiGSVtvrZg==}
-
- js-tokens@4.0.0:
- resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ jintr@2.1.1:
+ resolution: {integrity: sha512-89cwX4ouogeDGOBsEVsVYsnWWvWjchmwXBB4kiBhmjOKw19FiOKhNhMhpxhTlK2ctl7DS+d/ethfmuBpzoNNgA==}
js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsesc@2.5.2:
- resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
- engines: {node: '>=4'}
- hasBin: true
-
json-buffer@3.0.1:
resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
@@ -1644,11 +1419,6 @@ packages:
json-stringify-pretty-compact@4.0.0:
resolution: {integrity: sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==}
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
-
kdbush@4.0.2:
resolution: {integrity: sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==}
@@ -1666,8 +1436,8 @@ packages:
known-css-properties@0.34.0:
resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==}
- konva@9.3.13:
- resolution: {integrity: sha512-hs0ysHnqjK9noZ/rkfDNJINfbNhkXMgjgkJ8uc6vU0amu05mSDtRlukz5kKHOaSnWHA6miXcHJydvPABh18Y8A==}
+ konva@9.3.15:
+ resolution: {integrity: sha512-6jceV1u75a41Fwky7HIg7Xr092sn9g+emE/F4KrkNey9j5IwM/No91z4g13P9kbh0NePzC20YvfyGVS5EzliUA==}
levn@0.4.1:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
@@ -1687,22 +1457,15 @@ packages:
lodash.merge@4.6.2:
resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
- lru-cache@10.3.1:
- resolution: {integrity: sha512-9/8QXrtbGeMB6LxwQd4x1tIMnsmUxMvIH/qWGsccz6bt9Uln3S+sgAaqfQNhbGA8ufzs2fHuP/yqapGgP9Hh2g==}
- engines: {node: '>=18'}
-
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-
- magic-string@0.30.10:
- resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
+ magic-string@0.30.12:
+ resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==}
- maplibre-gl@4.5.0:
- resolution: {integrity: sha512-qOS1hn4d/pn2i0uva4S5Oz+fACzTkgBKq+NpwT/Tqzi4MSyzcWNtDELzLUSgWqHfNIkGCl5CZ/w7dtis+t4RCw==}
+ maplibre-gl@4.7.1:
+ resolution: {integrity: sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==}
engines: {node: '>=16.14.0', npm: '>=8.1.0'}
- marked@13.0.2:
- resolution: {integrity: sha512-J6CPjP8pS5sgrRqxVRvkCIkZ6MFdRIjDkwUwgJ9nL2fbmM6qGQeB2C16hi8Cc9BOzj6xXzy0jyi0iPIfnMHYzA==}
+ marked@14.1.2:
+ resolution: {integrity: sha512-f3r0yqpz31VXiDB/wj9GaOB0a2PRLQl6vJmXiFrniNwjkKdvakqJRULhjFKJpxOchlCRiG5fcacoUZY5Xa6PEQ==}
engines: {node: '>= 18'}
hasBin: true
@@ -1713,8 +1476,8 @@ packages:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
- merge-descriptors@1.0.1:
- resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
+ merge-descriptors@1.0.3:
+ resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==}
merge2@1.4.1:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
@@ -1724,8 +1487,8 @@ packages:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
- micromatch@4.0.7:
- resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.52.0:
@@ -1741,10 +1504,6 @@ packages:
engines: {node: '>=4'}
hasBin: true
- min-indent@1.0.1:
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
- engines: {node: '>=4'}
-
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -1755,14 +1514,6 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- minipass@7.1.2:
- resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
- engines: {node: '>=16 || 14 >=14.17'}
-
- mkdirp@0.5.6:
- resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
- hasBin: true
-
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@@ -1774,9 +1525,6 @@ packages:
ms@2.0.0:
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
- ms@2.1.2:
- resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -1795,13 +1543,6 @@ packages:
resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
engines: {node: '>= 0.6'}
- node-releases@2.0.14:
- resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
-
- normalize-path@3.0.0:
- resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
- engines: {node: '>=0.10.0'}
-
object-inspect@1.13.2:
resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
engines: {node: '>= 0.4'}
@@ -1810,9 +1551,6 @@ packages:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
optionator@0.9.4:
resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
engines: {node: '>= 0.8.0'}
@@ -1825,9 +1563,6 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
- package-json-from-dist@1.0.0:
- resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==}
-
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@@ -1840,10 +1575,6 @@ packages:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
- path-is-absolute@1.0.1:
- resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
- engines: {node: '>=0.10.0'}
-
path-key@3.1.1:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
@@ -1851,16 +1582,8 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- path-scurry@1.11.1:
- resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
- engines: {node: '>=16 || 14 >=14.18'}
-
- path-to-regexp@0.1.7:
- resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
-
- path-type@4.0.0:
- resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
- engines: {node: '>=8'}
+ path-to-regexp@0.1.10:
+ resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
pbf@3.3.0:
resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==}
@@ -1869,8 +1592,8 @@ packages:
periscopic@3.1.0:
resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==}
- picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ picocolors@1.1.0:
+ resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -1900,32 +1623,32 @@ packages:
peerDependencies:
postcss: ^8.4.29
- postcss-selector-parser@6.1.0:
- resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==}
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
engines: {node: '>=4'}
- postcss@8.4.39:
- resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
+ postcss@8.4.47:
+ resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
potpack@2.0.0:
resolution: {integrity: sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==}
- preact@10.22.1:
- resolution: {integrity: sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==}
+ preact@10.24.2:
+ resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==}
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
- prettier-plugin-svelte@3.2.5:
- resolution: {integrity: sha512-vP/M/Goc8z4iVIvrwXwbrYVjJgA0Hf8PO1G4LBh/ocSt6vUP6sLvyu9F3ABEGr+dbKyxZjEKLkeFsWy/yYl0HQ==}
+ prettier-plugin-svelte@3.2.7:
+ resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==}
peerDependencies:
prettier: ^3.0.0
svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0
- prettier@3.3.2:
- resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==}
+ prettier@3.3.3:
+ resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
engines: {node: '>=14'}
hasBin: true
@@ -1940,8 +1663,8 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
- qs@6.11.0:
- resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+ qs@6.13.0:
+ resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==}
engines: {node: '>=0.6'}
queue-microtask@1.2.3:
@@ -1950,6 +1673,9 @@ packages:
quickselect@2.0.0:
resolution: {integrity: sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==}
+ quickselect@3.0.0:
+ resolution: {integrity: sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==}
+
range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
@@ -1958,9 +1684,9 @@ packages:
resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==}
engines: {node: '>= 0.8'}
- readdirp@3.6.0:
- resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
- engines: {node: '>=8.10.0'}
+ readdirp@4.0.2:
+ resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==}
+ engines: {node: '>= 14.16.0'}
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
@@ -1980,13 +1706,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
- rimraf@2.7.1:
- resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
- deprecated: Rimraf versions prior to v4 are no longer supported
- hasBin: true
-
- rollup@4.18.0:
- resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==}
+ rollup@4.24.0:
+ resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -2006,28 +1727,21 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- sander@0.5.1:
- resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==}
-
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.6.2:
- resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==}
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
hasBin: true
- send@0.18.0:
- resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
+ send@0.19.0:
+ resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==}
engines: {node: '>= 0.8.0'}
- serve-static@1.15.0:
- resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
+ serve-static@1.16.2:
+ resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
- set-cookie-parser@2.6.0:
- resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==}
+ set-cookie-parser@2.7.0:
+ resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==}
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
@@ -2052,22 +1766,10 @@ packages:
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
engines: {node: '>= 0.4'}
- signal-exit@4.1.0:
- resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
- engines: {node: '>=14'}
-
sirv@2.0.4:
resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==}
engines: {node: '>= 10'}
- slash@3.0.0:
- resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
- engines: {node: '>=8'}
-
- sorcery@0.11.1:
- resolution: {integrity: sha512-o7npfeJE6wi6J9l0/5LKshFzZ2rMatRiCDwYeDQaOzqdzRJwALhX7mk/A/ecg6wjMu7wdZbmXfD2S/vpOg0bdQ==}
- hasBin: true
-
sort-asc@0.2.0:
resolution: {integrity: sha512-umMGhjPeHAI6YjABoSTrFp2zaBtXBej1a0yKkuMUyjjqu6FJsTF+JYwCswWDg+zJfk/5npWUUbd33HH/WLzpaA==}
engines: {node: '>=0.10.0'}
@@ -2080,15 +1782,8 @@ packages:
resolution: {integrity: sha512-nK7WOY8jik6zaG9CRwZTaD5O7ETWDLZYMM12pqY8htll+7dYeqGfEUPcUBHOpSJg2vJOrvFIY2Dl5cX2ih1hAQ==}
engines: {node: '>=0.10.0'}
- source-map-js@1.2.0:
- resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
- engines: {node: '>=0.10.0'}
-
- source-map-support@0.5.21:
- resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
-
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
split-string@3.1.0:
@@ -2099,26 +1794,6 @@ packages:
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
engines: {node: '>= 0.8'}
- string-width@4.2.3:
- resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
- engines: {node: '>=8'}
-
- string-width@5.1.2:
- resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
- engines: {node: '>=12'}
-
- strip-ansi@6.0.1:
- resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
- engines: {node: '>=8'}
-
- strip-ansi@7.1.0:
- resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
- engines: {node: '>=12'}
-
- strip-indent@3.0.0:
- resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
- engines: {node: '>=8'}
-
strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
@@ -2129,10 +1804,6 @@ packages:
supercluster@8.0.1:
resolution: {integrity: sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==}
- supports-color@5.5.0:
- resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
- engines: {node: '>=4'}
-
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -2141,27 +1812,29 @@ packages:
resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
engines: {node: '>= 0.4'}
- svelte-check@3.8.4:
- resolution: {integrity: sha512-61aHMkdinWyH8BkkTX9jPLYxYzaAAz/FK/VQqdr2FiCQQ/q04WCwDlpGbHff1GdrMYTmW8chlTFvRWL9k0A8vg==}
+ svelte-check@4.0.4:
+ resolution: {integrity: sha512-AcHWIPuZb1mh/jKoIrww0ebBPpAvwWd1bfXCnwC2dx4OkydNMaiG//+Xnry91RJMHFH7CiE+6Y2p332DRIaOXQ==}
+ engines: {node: '>= 18.0.0'}
hasBin: true
peerDependencies:
- svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
+ svelte: ^4.0.0 || ^5.0.0-next.0
+ typescript: '>=5.0.0'
- svelte-confetti@2.0.1:
- resolution: {integrity: sha512-o8jQ9GD6riVqQj7ndcdJFXoYIYw21AAnVKoQSxY1FgXoT1uTgJvsTdrDadlkjGmHNpg8Y5Ya0AzZfkESOGpcuQ==}
+ svelte-confetti@1.4.0:
+ resolution: {integrity: sha512-B0woNwpsFGwhkEoP48BIDQgvW0bMxPhavLVD+E+tsTWevlpr1aiz1S2wA8ArIXX957BiaZWHRHKmI5/pFRDbdg==}
peerDependencies:
- svelte: ^4.0.0 || ^5.0.0
+ svelte: ^4.0.0
- svelte-dnd-action@0.9.49:
- resolution: {integrity: sha512-kAIDTSMoTZcJCqUpT8COLAkF0/NRBoJ/pIbPUra9UVRnyJljLy6dLgRuL2OojSqyNs3nToBvn5XOGaFMREwjfQ==}
+ svelte-dnd-action@0.9.51:
+ resolution: {integrity: sha512-/0DEK+QqWf6QYtJgbQPJE/LSzo6JAE00oWVtBWZrBDAMXeN4cYVd0Z7sSpbu00Sm/h03t/RF4UGUMwosmrseQw==}
peerDependencies:
svelte: '>=3.23.0 || ^5.0.0-next.0'
- svelte-eslint-parser@0.39.2:
- resolution: {integrity: sha512-87UwLuWTtDIuzWOhOi1zBL5wYVd07M5BK1qZ57YmXJB5/UmjUNJqGy3XSOhPqjckY1dATNV9y+mx+nI0WH6HPA==}
+ svelte-eslint-parser@0.41.1:
+ resolution: {integrity: sha512-08ndI6zTghzI8SuJAFpvMbA/haPSGn3xz19pjre19yYMw8Nw/wQJ2PrZBI/L8ijGTgtkWCQQiLLy+Z1tfaCwNA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
- svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115
+ svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191
peerDependenciesMeta:
svelte:
optional: true
@@ -2187,70 +1860,24 @@ packages:
peerDependencies:
svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1
- svelte-preprocess@5.1.4:
- resolution: {integrity: sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==}
- engines: {node: '>= 16.0.0'}
- peerDependencies:
- '@babel/core': ^7.10.2
- coffeescript: ^2.5.1
- less: ^3.11.3 || ^4.0.0
- postcss: ^7 || ^8
- postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0
- pug: ^3.0.0
- sass: ^1.26.8
- stylus: ^0.55.0
- sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0
- svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0
- typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0'
- peerDependenciesMeta:
- '@babel/core':
- optional: true
- coffeescript:
- optional: true
- less:
- optional: true
- postcss:
- optional: true
- postcss-load-config:
- optional: true
- pug:
- optional: true
- sass:
- optional: true
- stylus:
- optional: true
- sugarss:
- optional: true
- typescript:
- optional: true
-
svelte-ripple@0.1.1:
resolution: {integrity: sha512-MW/TBYus/2k9ccTTx2LvSv+wbmGN+CYLgiCMPa5fK7DXlUUmIuGKFBtN+90rECpSOOR+W7Uhm2qJemLptS6ahw==}
svelte-tiny-virtual-list@2.1.2:
resolution: {integrity: sha512-jeP/WMvgFUR4mYXHGPiCexjX5DuzSO+3xzHNhxfcsFyy+uYPtnqI5UGb383swpzQAyXB0OBqYfzpYihD/5gxnA==}
- svelte@4.2.18:
- resolution: {integrity: sha512-d0FdzYIiAePqRJEb90WlJDkjUEx42xhivxN8muUBmfZnP+tzUgz12DJ2hRJi8sIHCME7jeK1PTMgKPSfTd8JrA==}
+ svelte@4.2.19:
+ resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==}
engines: {node: '>=16'}
- terser@5.31.1:
- resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==}
- engines: {node: '>=10'}
- hasBin: true
-
text-table@0.2.0:
resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
tiny-glob@0.2.9:
resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==}
- tinyqueue@2.0.3:
- resolution: {integrity: sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==}
-
- to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
+ tinyqueue@3.0.0:
+ resolution: {integrity: sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -2270,8 +1897,8 @@ packages:
peerDependencies:
typescript: '>=4.2.0'
- tslib@2.6.3:
- resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==}
+ tslib@2.7.0:
+ resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
@@ -2281,8 +1908,8 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
- typescript-eslint@8.0.0-alpha.39:
- resolution: {integrity: sha512-bsuR1BVJfHr7sBh7Cca962VPIcP+5UWaIa/+6PpnFZ+qtASjGTxKWIF5dG2o73BX9NsyqQfvRWujb3M9CIoRXA==}
+ typescript-eslint@8.8.1:
+ resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '*'
@@ -2290,8 +1917,8 @@ packages:
typescript:
optional: true
- typescript@5.5.3:
- resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
hasBin: true
@@ -2301,8 +1928,8 @@ packages:
typewise@1.0.3:
resolution: {integrity: sha512-aXofE06xGhaQSPzt8hlTY+/YWQhm9P0jYUp1f2XtmW/3Bk0qzXcyFWAtPoo2uTGQj1ZwbDuSyuxicq+aDo8lCQ==}
- undici-types@5.26.5:
- resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
undici@5.28.4:
resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==}
@@ -2316,12 +1943,6 @@ packages:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
engines: {node: '>= 0.8'}
- update-browserslist-db@1.1.0:
- resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -2336,8 +1957,8 @@ packages:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- vite@5.3.3:
- resolution: {integrity: sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==}
+ vite@5.4.8:
+ resolution: {integrity: sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
@@ -2345,6 +1966,7 @@ packages:
less: '*'
lightningcss: ^1.21.0
sass: '*'
+ sass-embedded: '*'
stylus: '*'
sugarss: '*'
terser: ^5.4.0
@@ -2357,6 +1979,8 @@ packages:
optional: true
sass:
optional: true
+ sass-embedded:
+ optional: true
stylus:
optional: true
sugarss:
@@ -2381,33 +2005,20 @@ packages:
weekstart@2.0.0:
resolution: {integrity: sha512-HjYc14IQUwDcnGICuc8tVtqAd6EFpoAQMqgrqcNtWWZB+F1b7iTq44GzwM1qvnH4upFgbhJsaNHuK93NOFheSg==}
- which@1.3.1:
- resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
- hasBin: true
-
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
hasBin: true
+ which@4.0.0:
+ resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==}
+ engines: {node: ^16.13.0 || >=18.0.0}
+ hasBin: true
+
word-wrap@1.2.5:
resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
engines: {node: '>=0.10.0'}
- wrap-ansi@7.0.0:
- resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
- engines: {node: '>=10'}
-
- wrap-ansi@8.1.0:
- resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
- engines: {node: '>=12'}
-
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
yaml@1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
@@ -2416,8 +2027,8 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
- youtubei.js@10.0.0:
- resolution: {integrity: sha512-4Mmguxyw1TK1Co+gbx+41SFR55DR3OzMCdFW8OrSENjAjjOY9RDg7sKFbR+ZLsT3ga9AH1/nq+14KUItT9pPHQ==}
+ youtubei.js@10.5.0:
+ resolution: {integrity: sha512-iyA+VF28c15tCCKH9ExM2RKC3zYiHzA/eixGlJ3vERANkuI+xYKzAZ4vtOhmyqwrAddu88R/DkzEsmpph5NWjg==}
snapshots:
@@ -2426,209 +2037,57 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
- '@babel/code-frame@7.24.7':
- dependencies:
- '@babel/highlight': 7.24.7
- picocolors: 1.0.1
- optional: true
-
- '@babel/compat-data@7.24.7':
- optional: true
-
- '@babel/core@7.24.7':
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/helper-compilation-targets': 7.24.7
- '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7)
- '@babel/helpers': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/template': 7.24.7
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
- convert-source-map: 2.0.0
- debug: 4.3.5
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- '@babel/generator@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
- '@jridgewell/gen-mapping': 0.3.5
- '@jridgewell/trace-mapping': 0.3.25
- jsesc: 2.5.2
- optional: true
-
- '@babel/helper-compilation-targets@7.24.7':
- dependencies:
- '@babel/compat-data': 7.24.7
- '@babel/helper-validator-option': 7.24.7
- browserslist: 4.23.1
- lru-cache: 5.1.1
- semver: 6.3.1
- optional: true
-
- '@babel/helper-environment-visitor@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
- optional: true
-
- '@babel/helper-function-name@7.24.7':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
- optional: true
-
- '@babel/helper-hoist-variables@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
- optional: true
+ '@bufbuild/protobuf@2.2.0': {}
- '@babel/helper-module-imports@7.24.7':
+ '@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.2)':
dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)':
- dependencies:
- '@babel/core': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-module-imports': 7.24.7
- '@babel/helper-simple-access': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- '@babel/helper-simple-access@7.24.7':
- dependencies:
- '@babel/traverse': 7.24.7
- '@babel/types': 7.24.7
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- '@babel/helper-split-export-declaration@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
- optional: true
-
- '@babel/helper-string-parser@7.24.7':
- optional: true
-
- '@babel/helper-validator-identifier@7.24.7':
- optional: true
-
- '@babel/helper-validator-option@7.24.7':
- optional: true
-
- '@babel/helpers@7.24.7':
- dependencies:
- '@babel/template': 7.24.7
- '@babel/types': 7.24.7
- optional: true
-
- '@babel/highlight@7.24.7':
- dependencies:
- '@babel/helper-validator-identifier': 7.24.7
- chalk: 2.4.2
- js-tokens: 4.0.0
- picocolors: 1.0.1
- optional: true
-
- '@babel/parser@7.24.7':
- dependencies:
- '@babel/types': 7.24.7
- optional: true
-
- '@babel/template@7.24.7':
- dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
- optional: true
-
- '@babel/traverse@7.24.7':
- dependencies:
- '@babel/code-frame': 7.24.7
- '@babel/generator': 7.24.7
- '@babel/helper-environment-visitor': 7.24.7
- '@babel/helper-function-name': 7.24.7
- '@babel/helper-hoist-variables': 7.24.7
- '@babel/helper-split-export-declaration': 7.24.7
- '@babel/parser': 7.24.7
- '@babel/types': 7.24.7
- debug: 4.3.5
- globals: 11.12.0
- transitivePeerDependencies:
- - supports-color
- optional: true
-
- '@babel/types@7.24.7':
- dependencies:
- '@babel/helper-string-parser': 7.24.7
- '@babel/helper-validator-identifier': 7.24.7
- to-fast-properties: 2.0.0
- optional: true
-
- '@codemirror/autocomplete@6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1)':
- dependencies:
- '@codemirror/language': 6.10.2
+ '@codemirror/language': 6.10.3
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
- '@lezer/common': 1.2.1
+ '@codemirror/view': 6.34.1
+ '@lezer/common': 1.2.2
- '@codemirror/commands@6.6.0':
+ '@codemirror/commands@6.7.0':
dependencies:
- '@codemirror/language': 6.10.2
+ '@codemirror/language': 6.10.3
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
- '@lezer/common': 1.2.1
+ '@codemirror/view': 6.34.1
+ '@lezer/common': 1.2.2
- '@codemirror/language@6.10.2':
+ '@codemirror/language@6.10.3':
dependencies:
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
- '@lezer/common': 1.2.1
- '@lezer/highlight': 1.2.0
- '@lezer/lr': 1.4.1
+ '@codemirror/view': 6.34.1
+ '@lezer/common': 1.2.2
+ '@lezer/highlight': 1.2.1
+ '@lezer/lr': 1.4.2
style-mod: 4.1.2
- '@codemirror/legacy-modes@6.4.0':
+ '@codemirror/legacy-modes@6.4.1':
dependencies:
- '@codemirror/language': 6.10.2
+ '@codemirror/language': 6.10.3
- '@codemirror/lint@6.8.1':
+ '@codemirror/lint@6.8.2':
dependencies:
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
+ '@codemirror/view': 6.34.1
crelt: 1.0.6
'@codemirror/search@6.5.6':
dependencies:
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
+ '@codemirror/view': 6.34.1
crelt: 1.0.6
'@codemirror/state@6.4.1': {}
'@codemirror/theme-one-dark@6.1.2':
dependencies:
- '@codemirror/language': 6.10.2
+ '@codemirror/language': 6.10.3
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
- '@lezer/highlight': 1.2.0
+ '@codemirror/view': 6.34.1
+ '@lezer/highlight': 1.2.1
- '@codemirror/view@6.28.4':
+ '@codemirror/view@6.34.1':
dependencies:
'@codemirror/state': 6.4.1
style-mod: 4.1.2
@@ -2703,28 +2162,30 @@ snapshots:
'@esbuild/win32-x64@0.21.5':
optional: true
- '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)':
+ '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0)':
dependencies:
- eslint: 9.6.0
+ eslint: 9.12.0
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.11.0': {}
+ '@eslint-community/regexpp@4.11.1': {}
- '@eslint/config-array@0.17.0':
+ '@eslint/config-array@0.18.0':
dependencies:
'@eslint/object-schema': 2.1.4
- debug: 4.3.5
+ debug: 4.3.7
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
+ '@eslint/core@0.6.0': {}
+
'@eslint/eslintrc@3.1.0':
dependencies:
ajv: 6.12.6
- debug: 4.3.5
- espree: 10.1.0
+ debug: 4.3.7
+ espree: 10.2.0
globals: 14.0.0
- ignore: 5.3.1
+ ignore: 5.3.2
import-fresh: 3.3.0
js-yaml: 4.1.0
minimatch: 3.1.2
@@ -2732,87 +2193,83 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.6.0': {}
+ '@eslint/js@9.12.0': {}
'@eslint/object-schema@2.1.4': {}
- '@event-calendar/core@3.1.0':
+ '@eslint/plugin-kit@0.2.0':
+ dependencies:
+ levn: 0.4.1
+
+ '@event-calendar/core@3.6.1':
dependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
- '@event-calendar/day-grid@3.1.0':
+ '@event-calendar/day-grid@3.6.1':
dependencies:
- '@event-calendar/core': 3.1.0
- svelte: 4.2.18
+ '@event-calendar/core': 3.6.1
+ svelte: 4.2.19
- '@event-calendar/list@3.1.0':
+ '@event-calendar/list@3.6.1':
dependencies:
- '@event-calendar/core': 3.1.0
- svelte: 4.2.18
+ '@event-calendar/core': 3.6.1
+ svelte: 4.2.19
'@fastify/busboy@2.1.1': {}
- '@fontsource-variable/inter@5.0.19': {}
+ '@fontsource-variable/inter@5.1.0': {}
+
+ '@humanfs/core@0.19.0': {}
+
+ '@humanfs/node@0.16.5':
+ dependencies:
+ '@humanfs/core': 0.19.0
+ '@humanwhocodes/retry': 0.3.1
'@humanwhocodes/module-importer@1.0.1': {}
- '@humanwhocodes/retry@0.3.0': {}
+ '@humanwhocodes/retry@0.3.1': {}
- '@iconify/svelte@4.0.2(svelte@4.2.18)':
+ '@iconify/svelte@4.0.2(svelte@4.2.19)':
dependencies:
'@iconify/types': 2.0.0
- svelte: 4.2.18
+ svelte: 4.2.19
'@iconify/types@2.0.0': {}
'@irojs/iro-core@1.2.1': {}
- '@isaacs/cliui@8.0.2':
- dependencies:
- string-width: 5.1.2
- string-width-cjs: string-width@4.2.3
- strip-ansi: 7.1.0
- strip-ansi-cjs: strip-ansi@6.0.1
- wrap-ansi: 8.1.0
- wrap-ansi-cjs: wrap-ansi@7.0.0
-
'@jaames/iro@5.5.2':
dependencies:
'@irojs/iro-core': 1.2.1
- preact: 10.22.1
+ preact: 10.24.2
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
- '@jridgewell/source-map@0.3.6':
- dependencies:
- '@jridgewell/gen-mapping': 0.3.5
- '@jridgewell/trace-mapping': 0.3.25
- optional: true
-
- '@jridgewell/sourcemap-codec@1.4.15': {}
+ '@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
- '@lezer/common@1.2.1': {}
+ '@lezer/common@1.2.2': {}
- '@lezer/highlight@1.2.0':
+ '@lezer/highlight@1.2.1':
dependencies:
- '@lezer/common': 1.2.1
+ '@lezer/common': 1.2.2
- '@lezer/lr@1.4.1':
+ '@lezer/lr@1.4.2':
dependencies:
- '@lezer/common': 1.2.1
+ '@lezer/common': 1.2.2
'@mapbox/geojson-rewind@0.5.2':
dependencies:
@@ -2833,7 +2290,7 @@ snapshots:
'@mapbox/whoots-js@3.1.0': {}
- '@maplibre/maplibre-gl-style-spec@20.3.0':
+ '@maplibre/maplibre-gl-style-spec@20.3.1':
dependencies:
'@mapbox/jsonlint-lines-primitives': 2.0.2
'@mapbox/unitbezier': 0.0.1
@@ -2842,7 +2299,7 @@ snapshots:
quickselect: 2.0.0
rw: 1.3.3
sort-object: 3.0.3
- tinyqueue: 2.0.3
+ tinyqueue: 3.0.0
'@nodelib/fs.scandir@2.1.5':
dependencies:
@@ -2856,152 +2313,149 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
- '@pkgjs/parseargs@0.11.0':
- optional: true
-
- '@polka/url@1.0.0-next.25': {}
+ '@polka/url@1.0.0-next.28': {}
- '@rollup/plugin-commonjs@26.0.1(rollup@4.18.0)':
+ '@rollup/plugin-commonjs@28.0.0(rollup@4.24.0)':
dependencies:
- '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
+ '@rollup/pluginutils': 5.1.2(rollup@4.24.0)
commondir: 1.0.1
estree-walker: 2.0.2
- glob: 10.4.3
+ fdir: 6.4.0(picomatch@2.3.1)
is-reference: 1.2.1
- magic-string: 0.30.10
+ magic-string: 0.30.12
+ picomatch: 2.3.1
optionalDependencies:
- rollup: 4.18.0
+ rollup: 4.24.0
- '@rollup/plugin-json@6.1.0(rollup@4.18.0)':
+ '@rollup/plugin-json@6.1.0(rollup@4.24.0)':
dependencies:
- '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
+ '@rollup/pluginutils': 5.1.2(rollup@4.24.0)
optionalDependencies:
- rollup: 4.18.0
+ rollup: 4.24.0
- '@rollup/plugin-node-resolve@15.2.3(rollup@4.18.0)':
+ '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.0)':
dependencies:
- '@rollup/pluginutils': 5.1.0(rollup@4.18.0)
+ '@rollup/pluginutils': 5.1.2(rollup@4.24.0)
'@types/resolve': 1.20.2
deepmerge: 4.3.1
- is-builtin-module: 3.2.1
is-module: 1.0.0
resolve: 1.22.8
optionalDependencies:
- rollup: 4.18.0
+ rollup: 4.24.0
- '@rollup/pluginutils@5.1.0(rollup@4.18.0)':
+ '@rollup/pluginutils@5.1.2(rollup@4.24.0)':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 2.3.1
optionalDependencies:
- rollup: 4.18.0
+ rollup: 4.24.0
- '@rollup/rollup-android-arm-eabi@4.18.0':
+ '@rollup/rollup-android-arm-eabi@4.24.0':
optional: true
- '@rollup/rollup-android-arm64@4.18.0':
+ '@rollup/rollup-android-arm64@4.24.0':
optional: true
- '@rollup/rollup-darwin-arm64@4.18.0':
+ '@rollup/rollup-darwin-arm64@4.24.0':
optional: true
- '@rollup/rollup-darwin-x64@4.18.0':
+ '@rollup/rollup-darwin-x64@4.24.0':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
+ '@rollup/rollup-linux-arm-gnueabihf@4.24.0':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.18.0':
+ '@rollup/rollup-linux-arm-musleabihf@4.24.0':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.18.0':
+ '@rollup/rollup-linux-arm64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.18.0':
+ '@rollup/rollup-linux-arm64-musl@4.24.0':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
+ '@rollup/rollup-linux-powerpc64le-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.18.0':
+ '@rollup/rollup-linux-riscv64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.18.0':
+ '@rollup/rollup-linux-s390x-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.18.0':
+ '@rollup/rollup-linux-x64-gnu@4.24.0':
optional: true
- '@rollup/rollup-linux-x64-musl@4.18.0':
+ '@rollup/rollup-linux-x64-musl@4.24.0':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.18.0':
+ '@rollup/rollup-win32-arm64-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.18.0':
+ '@rollup/rollup-win32-ia32-msvc@4.24.0':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.18.0':
+ '@rollup/rollup-win32-x64-msvc@4.24.0':
optional: true
- '@sveltejs/adapter-node@5.2.0(@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))':
+ '@sveltejs/adapter-node@5.2.6(@sveltejs/kit@2.6.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))':
dependencies:
- '@rollup/plugin-commonjs': 26.0.1(rollup@4.18.0)
- '@rollup/plugin-json': 6.1.0(rollup@4.18.0)
- '@rollup/plugin-node-resolve': 15.2.3(rollup@4.18.0)
- '@sveltejs/kit': 2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
- rollup: 4.18.0
+ '@rollup/plugin-commonjs': 28.0.0(rollup@4.24.0)
+ '@rollup/plugin-json': 6.1.0(rollup@4.24.0)
+ '@rollup/plugin-node-resolve': 15.3.0(rollup@4.24.0)
+ '@sveltejs/kit': 2.6.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))
+ rollup: 4.24.0
- '@sveltejs/kit@2.5.18(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))':
+ '@sveltejs/kit@2.6.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
+ '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))
'@types/cookie': 0.6.0
cookie: 0.6.0
- devalue: 5.0.0
+ devalue: 5.1.1
esm-env: 1.0.0
import-meta-resolve: 4.1.0
kleur: 4.1.5
- magic-string: 0.30.10
+ magic-string: 0.30.12
mrmime: 2.0.0
sade: 1.8.1
- set-cookie-parser: 2.6.0
+ set-cookie-parser: 2.7.0
sirv: 2.0.4
- svelte: 4.2.18
+ svelte: 4.2.19
tiny-glob: 0.2.9
- vite: 5.3.3(@types/node@20.14.10)(terser@5.31.1)
+ vite: 5.4.8(@types/node@22.7.5)
- '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))':
+ '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))':
dependencies:
- '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
- debug: 4.3.5
- svelte: 4.2.18
- vite: 5.3.3(@types/node@20.14.10)(terser@5.31.1)
+ '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))
+ debug: 4.3.7
+ svelte: 4.2.19
+ vite: 5.4.8(@types/node@22.7.5)
transitivePeerDependencies:
- supports-color
- '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))':
+ '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))':
dependencies:
- '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)))(svelte@4.2.18)(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
- debug: 4.3.5
+ '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5)))(svelte@4.2.19)(vite@5.4.8(@types/node@22.7.5))
+ debug: 4.3.7
deepmerge: 4.3.1
kleur: 4.1.5
- magic-string: 0.30.10
- svelte: 4.2.18
- svelte-hmr: 0.16.0(svelte@4.2.18)
- vite: 5.3.3(@types/node@20.14.10)(terser@5.31.1)
- vitefu: 0.2.5(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1))
+ magic-string: 0.30.12
+ svelte: 4.2.19
+ svelte-hmr: 0.16.0(svelte@4.2.19)
+ vite: 5.4.8(@types/node@22.7.5)
+ vitefu: 0.2.5(vite@5.4.8(@types/node@22.7.5))
transitivePeerDependencies:
- supports-color
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
- '@types/node': 20.14.10
+ '@types/node': 22.7.5
'@types/connect@3.4.38':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 22.7.5
'@types/cookie@0.6.0': {}
@@ -3019,25 +2473,25 @@ snapshots:
'@types/d3-time@3.0.3': {}
- '@types/eslint@8.56.10':
+ '@types/eslint@9.6.1':
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
'@types/json-schema': 7.0.15
- '@types/estree@1.0.5': {}
+ '@types/estree@1.0.6': {}
- '@types/express-serve-static-core@4.19.5':
+ '@types/express-serve-static-core@5.0.0':
dependencies:
- '@types/node': 20.14.10
- '@types/qs': 6.9.15
+ '@types/node': 22.7.5
+ '@types/qs': 6.9.16
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
- '@types/express@4.17.21':
+ '@types/express@5.0.0':
dependencies:
'@types/body-parser': 1.19.5
- '@types/express-serve-static-core': 4.19.5
- '@types/qs': 6.9.15
+ '@types/express-serve-static-core': 5.0.0
+ '@types/qs': 6.9.16
'@types/serve-static': 1.15.7
'@types/geojson-vt@3.2.5':
@@ -3048,16 +2502,14 @@ snapshots:
'@types/http-errors@2.0.4': {}
- '@types/http-proxy@1.17.14':
+ '@types/http-proxy@1.17.15':
dependencies:
- '@types/node': 20.14.10
+ '@types/node': 22.7.5
'@types/js-yaml@4.0.9': {}
'@types/json-schema@7.0.15': {}
- '@types/junit-report-builder@3.0.2': {}
-
'@types/mapbox__point-geometry@0.1.4': {}
'@types/mapbox__vector-tile@1.3.4':
@@ -3068,19 +2520,17 @@ snapshots:
'@types/mime@1.3.5': {}
- '@types/node@20.14.10':
+ '@types/node@22.7.5':
dependencies:
- undici-types: 5.26.5
+ undici-types: 6.19.8
'@types/pbf@3.0.5': {}
'@types/promise-fs@2.1.5':
dependencies:
- '@types/node': 20.14.10
-
- '@types/pug@2.0.10': {}
+ '@types/node': 22.7.5
- '@types/qs@6.9.15': {}
+ '@types/qs@6.9.16': {}
'@types/range-parser@1.2.7': {}
@@ -3089,97 +2539,97 @@ snapshots:
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
- '@types/node': 20.14.10
+ '@types/node': 22.7.5
'@types/serve-static@1.15.7':
dependencies:
'@types/http-errors': 2.0.4
- '@types/node': 20.14.10
+ '@types/node': 22.7.5
'@types/send': 0.17.4
'@types/supercluster@7.1.3':
dependencies:
'@types/geojson': 7946.0.14
- '@typescript-eslint/eslint-plugin@8.0.0-alpha.39(@typescript-eslint/parser@8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3)':
+ '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)':
dependencies:
- '@eslint-community/regexpp': 4.11.0
- '@typescript-eslint/parser': 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
- '@typescript-eslint/scope-manager': 8.0.0-alpha.39
- '@typescript-eslint/type-utils': 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
- '@typescript-eslint/utils': 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.39
- eslint: 9.6.0
+ '@eslint-community/regexpp': 4.11.1
+ '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.8.1
+ '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.8.1
+ eslint: 9.12.0
graphemer: 1.4.0
- ignore: 5.3.1
+ ignore: 5.3.2
natural-compare: 1.4.0
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)':
+ '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.0.0-alpha.39
- '@typescript-eslint/types': 8.0.0-alpha.39
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.39(typescript@5.5.3)
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.39
- debug: 4.3.5
- eslint: 9.6.0
+ '@typescript-eslint/scope-manager': 8.8.1
+ '@typescript-eslint/types': 8.8.1
+ '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.8.1
+ debug: 4.3.7
+ eslint: 9.12.0
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.0.0-alpha.39':
+ '@typescript-eslint/scope-manager@8.8.1':
dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.39
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.39
+ '@typescript-eslint/types': 8.8.1
+ '@typescript-eslint/visitor-keys': 8.8.1
- '@typescript-eslint/type-utils@8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)':
+ '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.39(typescript@5.5.3)
- '@typescript-eslint/utils': 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
- debug: 4.3.5
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+ debug: 4.3.7
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- eslint
- supports-color
- '@typescript-eslint/types@8.0.0-alpha.39': {}
+ '@typescript-eslint/types@8.8.1': {}
- '@typescript-eslint/typescript-estree@8.0.0-alpha.39(typescript@5.5.3)':
+ '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.39
- '@typescript-eslint/visitor-keys': 8.0.0-alpha.39
- debug: 4.3.5
- globby: 11.1.0
+ '@typescript-eslint/types': 8.8.1
+ '@typescript-eslint/visitor-keys': 8.8.1
+ debug: 4.3.7
+ fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
- semver: 7.6.2
- ts-api-utils: 1.3.0(typescript@5.5.3)
+ semver: 7.6.3
+ ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)':
+ '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0)
- '@typescript-eslint/scope-manager': 8.0.0-alpha.39
- '@typescript-eslint/types': 8.0.0-alpha.39
- '@typescript-eslint/typescript-estree': 8.0.0-alpha.39(typescript@5.5.3)
- eslint: 9.6.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+ '@typescript-eslint/scope-manager': 8.8.1
+ '@typescript-eslint/types': 8.8.1
+ '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3)
+ eslint: 9.12.0
transitivePeerDependencies:
- supports-color
- typescript
- '@typescript-eslint/visitor-keys@8.0.0-alpha.39':
+ '@typescript-eslint/visitor-keys@8.8.1':
dependencies:
- '@typescript-eslint/types': 8.0.0-alpha.39
+ '@typescript-eslint/types': 8.8.1
eslint-visitor-keys: 3.4.3
accepts@1.3.8:
@@ -3200,49 +2650,25 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
- ansi-regex@5.0.1: {}
-
- ansi-regex@6.0.1: {}
-
- ansi-styles@3.2.1:
- dependencies:
- color-convert: 1.9.3
- optional: true
-
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
- ansi-styles@6.2.1: {}
-
- anymatch@3.1.3:
- dependencies:
- normalize-path: 3.0.0
- picomatch: 2.3.1
-
argparse@2.0.1: {}
- aria-query@5.3.0:
- dependencies:
- dequal: 2.0.3
+ aria-query@5.3.2: {}
arr-union@3.1.0: {}
array-flatten@1.1.1: {}
- array-union@2.1.0: {}
-
assign-symbols@1.0.0: {}
- axobject-query@4.0.0:
- dependencies:
- dequal: 2.0.3
+ axobject-query@4.1.0: {}
balanced-match@1.0.2: {}
- binary-extensions@2.3.0: {}
-
- body-parser@1.20.2:
+ body-parser@1.20.3:
dependencies:
bytes: 3.1.2
content-type: 1.0.5
@@ -3252,7 +2678,7 @@ snapshots:
http-errors: 2.0.0
iconv-lite: 0.4.24
on-finished: 2.4.1
- qs: 6.11.0
+ qs: 6.13.0
raw-body: 2.5.2
type-is: 1.6.18
unpipe: 1.0.0
@@ -3272,21 +2698,6 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.23.1:
- dependencies:
- caniuse-lite: 1.0.30001640
- electron-to-chromium: 1.4.818
- node-releases: 2.0.14
- update-browserslist-db: 1.1.0(browserslist@4.23.1)
- optional: true
-
- buffer-crc32@1.0.0: {}
-
- buffer-from@1.1.2:
- optional: true
-
- builtin-modules@3.3.0: {}
-
bytes@3.1.2: {}
bytewise-core@1.2.3:
@@ -3308,70 +2719,41 @@ snapshots:
callsites@3.1.0: {}
- caniuse-lite@1.0.30001640:
- optional: true
-
- chalk@2.4.2:
- dependencies:
- ansi-styles: 3.2.1
- escape-string-regexp: 1.0.5
- supports-color: 5.5.0
- optional: true
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
supports-color: 7.2.0
- chokidar@3.6.0:
+ chokidar@4.0.1:
dependencies:
- anymatch: 3.1.3
- braces: 3.0.3
- glob-parent: 5.1.2
- is-binary-path: 2.1.0
- is-glob: 4.0.3
- normalize-path: 3.0.0
- readdirp: 3.6.0
- optionalDependencies:
- fsevents: 2.3.3
+ readdirp: 4.0.2
code-red@1.0.4:
dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
- '@types/estree': 1.0.5
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@types/estree': 1.0.6
acorn: 8.12.1
estree-walker: 3.0.3
periscopic: 3.1.0
- codemirror@6.0.1(@lezer/common@1.2.1):
+ codemirror@6.0.1(@lezer/common@1.2.2):
dependencies:
- '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.28.4)(@lezer/common@1.2.1)
- '@codemirror/commands': 6.6.0
- '@codemirror/language': 6.10.2
- '@codemirror/lint': 6.8.1
+ '@codemirror/autocomplete': 6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.34.1)(@lezer/common@1.2.2)
+ '@codemirror/commands': 6.7.0
+ '@codemirror/language': 6.10.3
+ '@codemirror/lint': 6.8.2
'@codemirror/search': 6.5.6
'@codemirror/state': 6.4.1
- '@codemirror/view': 6.28.4
+ '@codemirror/view': 6.34.1
transitivePeerDependencies:
- '@lezer/common'
- color-convert@1.9.3:
- dependencies:
- color-name: 1.1.3
- optional: true
-
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
- color-name@1.1.3:
- optional: true
-
color-name@1.1.4: {}
- commander@2.20.3:
- optional: true
-
commondir@1.0.1: {}
concat-map@0.0.1: {}
@@ -3382,13 +2764,12 @@ snapshots:
content-type@1.0.5: {}
- convert-source-map@2.0.0:
- optional: true
-
cookie-signature@1.0.6: {}
cookie@0.6.0: {}
+ cookie@0.7.1: {}
+
crelt@1.0.6: {}
cross-spawn@7.0.3:
@@ -3400,7 +2781,7 @@ snapshots:
css-tree@2.3.1:
dependencies:
mdn-data: 2.0.30
- source-map-js: 1.2.0
+ source-map-js: 1.2.1
cssesc@3.0.0: {}
@@ -3442,9 +2823,9 @@ snapshots:
dependencies:
ms: 2.0.0
- debug@4.3.5:
+ debug@4.3.7:
dependencies:
- ms: 2.1.2
+ ms: 2.1.3
deep-is@0.1.4: {}
@@ -3458,43 +2839,26 @@ snapshots:
depd@2.0.0: {}
- dequal@2.0.3: {}
-
destroy@1.2.0: {}
- detect-indent@6.1.0: {}
-
- devalue@5.0.0: {}
-
- dir-glob@3.0.1:
- dependencies:
- path-type: 4.0.0
+ devalue@5.1.1: {}
dotenv@16.4.5: {}
- earcut@2.2.4: {}
-
- eastasianwidth@0.2.0: {}
+ earcut@3.0.0: {}
ee-first@1.1.1: {}
- electron-to-chromium@1.4.818:
- optional: true
-
- emoji-regex@8.0.0: {}
-
- emoji-regex@9.2.2: {}
-
encodeurl@1.0.2: {}
+ encodeurl@2.0.0: {}
+
es-define-property@1.0.0:
dependencies:
get-intrinsic: 1.2.4
es-errors@1.3.0: {}
- es6-promise@3.3.1: {}
-
esbuild@0.21.5:
optionalDependencies:
'@esbuild/aix-ppc64': 0.21.5
@@ -3521,41 +2885,35 @@ snapshots:
'@esbuild/win32-ia32': 0.21.5
'@esbuild/win32-x64': 0.21.5
- escalade@3.1.2:
- optional: true
-
escape-html@1.0.3: {}
- escape-string-regexp@1.0.5:
- optional: true
-
escape-string-regexp@4.0.0: {}
- eslint-compat-utils@0.5.1(eslint@9.6.0):
+ eslint-compat-utils@0.5.1(eslint@9.12.0):
dependencies:
- eslint: 9.6.0
- semver: 7.6.2
+ eslint: 9.12.0
+ semver: 7.6.3
- eslint-config-prettier@9.1.0(eslint@9.6.0):
+ eslint-config-prettier@9.1.0(eslint@9.12.0):
dependencies:
- eslint: 9.6.0
+ eslint: 9.12.0
- eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@4.2.18):
+ eslint-plugin-svelte@2.44.1(eslint@9.12.0)(svelte@4.2.19):
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0)
- '@jridgewell/sourcemap-codec': 1.4.15
- eslint: 9.6.0
- eslint-compat-utils: 0.5.1(eslint@9.6.0)
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+ '@jridgewell/sourcemap-codec': 1.5.0
+ eslint: 9.12.0
+ eslint-compat-utils: 0.5.1(eslint@9.12.0)
esutils: 2.0.3
known-css-properties: 0.34.0
- postcss: 8.4.39
- postcss-load-config: 3.1.4(postcss@8.4.39)
- postcss-safe-parser: 6.0.0(postcss@8.4.39)
- postcss-selector-parser: 6.1.0
- semver: 7.6.2
- svelte-eslint-parser: 0.39.2(svelte@4.2.18)
+ postcss: 8.4.47
+ postcss-load-config: 3.1.4(postcss@8.4.47)
+ postcss-safe-parser: 6.0.0(postcss@8.4.47)
+ postcss-selector-parser: 6.1.2
+ semver: 7.6.3
+ svelte-eslint-parser: 0.41.1(svelte@4.2.19)
optionalDependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
transitivePeerDependencies:
- ts-node
@@ -3564,61 +2922,62 @@ snapshots:
esrecurse: 4.3.0
estraverse: 5.3.0
- eslint-scope@8.0.1:
+ eslint-scope@8.1.0:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
eslint-visitor-keys@3.4.3: {}
- eslint-visitor-keys@4.0.0: {}
+ eslint-visitor-keys@4.1.0: {}
- eslint@9.6.0:
+ eslint@9.12.0:
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0)
- '@eslint-community/regexpp': 4.11.0
- '@eslint/config-array': 0.17.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
+ '@eslint-community/regexpp': 4.11.1
+ '@eslint/config-array': 0.18.0
+ '@eslint/core': 0.6.0
'@eslint/eslintrc': 3.1.0
- '@eslint/js': 9.6.0
+ '@eslint/js': 9.12.0
+ '@eslint/plugin-kit': 0.2.0
+ '@humanfs/node': 0.16.5
'@humanwhocodes/module-importer': 1.0.1
- '@humanwhocodes/retry': 0.3.0
- '@nodelib/fs.walk': 1.2.8
+ '@humanwhocodes/retry': 0.3.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.3
- debug: 4.3.5
+ debug: 4.3.7
escape-string-regexp: 4.0.0
- eslint-scope: 8.0.1
- eslint-visitor-keys: 4.0.0
- espree: 10.1.0
- esquery: 1.5.0
+ eslint-scope: 8.1.0
+ eslint-visitor-keys: 4.1.0
+ espree: 10.2.0
+ esquery: 1.6.0
esutils: 2.0.3
fast-deep-equal: 3.1.3
file-entry-cache: 8.0.0
find-up: 5.0.0
glob-parent: 6.0.2
- ignore: 5.3.1
+ ignore: 5.3.2
imurmurhash: 0.1.4
is-glob: 4.0.3
- is-path-inside: 3.0.3
json-stable-stringify-without-jsonify: 1.0.1
- levn: 0.4.1
lodash.merge: 4.6.2
minimatch: 3.1.2
natural-compare: 1.4.0
optionator: 0.9.4
- strip-ansi: 6.0.1
text-table: 0.2.0
transitivePeerDependencies:
- supports-color
esm-env@1.0.0: {}
- espree@10.1.0:
+ espree@10.2.0:
dependencies:
acorn: 8.12.1
acorn-jsx: 5.3.2(acorn@8.12.1)
- eslint-visitor-keys: 4.0.0
+ eslint-visitor-keys: 4.1.0
espree@9.6.1:
dependencies:
@@ -3626,7 +2985,7 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.12.1)
eslint-visitor-keys: 3.4.3
- esquery@1.5.0:
+ esquery@1.6.0:
dependencies:
estraverse: 5.3.0
@@ -3640,7 +2999,7 @@ snapshots:
estree-walker@3.0.3:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
esutils@2.0.3: {}
@@ -3648,34 +3007,34 @@ snapshots:
eventemitter3@4.0.7: {}
- express@4.19.2:
+ express@4.21.1:
dependencies:
accepts: 1.3.8
array-flatten: 1.1.1
- body-parser: 1.20.2
+ body-parser: 1.20.3
content-disposition: 0.5.4
content-type: 1.0.5
- cookie: 0.6.0
+ cookie: 0.7.1
cookie-signature: 1.0.6
debug: 2.6.9
depd: 2.0.0
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
etag: 1.8.1
- finalhandler: 1.2.0
+ finalhandler: 1.3.1
fresh: 0.5.2
http-errors: 2.0.0
- merge-descriptors: 1.0.1
+ merge-descriptors: 1.0.3
methods: 1.1.2
on-finished: 2.4.1
parseurl: 1.3.3
- path-to-regexp: 0.1.7
+ path-to-regexp: 0.1.10
proxy-addr: 2.0.7
- qs: 6.11.0
+ qs: 6.13.0
range-parser: 1.2.1
safe-buffer: 5.2.1
- send: 0.18.0
- serve-static: 1.15.0
+ send: 0.19.0
+ serve-static: 1.16.2
setprototypeof: 1.2.0
statuses: 2.0.1
type-is: 1.6.18
@@ -3701,7 +3060,7 @@ snapshots:
'@nodelib/fs.walk': 1.2.8
glob-parent: 5.1.2
merge2: 1.4.1
- micromatch: 4.0.7
+ micromatch: 4.0.8
fast-json-stable-stringify@2.1.0: {}
@@ -3711,6 +3070,10 @@ snapshots:
dependencies:
reusify: 1.0.4
+ fdir@6.4.0(picomatch@2.3.1):
+ optionalDependencies:
+ picomatch: 2.3.1
+
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
@@ -3719,10 +3082,10 @@ snapshots:
dependencies:
to-regex-range: 5.0.1
- finalhandler@1.2.0:
+ finalhandler@1.3.1:
dependencies:
debug: 2.6.9
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
on-finished: 2.4.1
parseurl: 1.3.3
@@ -3743,29 +3106,19 @@ snapshots:
flatted@3.3.1: {}
- follow-redirects@1.15.6(debug@4.3.5):
+ follow-redirects@1.15.9(debug@4.3.7):
optionalDependencies:
- debug: 4.3.5
-
- foreground-child@3.2.1:
- dependencies:
- cross-spawn: 7.0.3
- signal-exit: 4.1.0
+ debug: 4.3.7
forwarded@0.2.0: {}
fresh@0.5.2: {}
- fs.realpath@1.0.0: {}
-
fsevents@2.3.3:
optional: true
function-bind@1.1.2: {}
- gensync@1.0.0-beta.2:
- optional: true
-
geojson-vt@4.0.2: {}
get-intrinsic@1.2.4:
@@ -3790,61 +3143,26 @@ snapshots:
dependencies:
is-glob: 4.0.3
- glob@10.4.3:
- dependencies:
- foreground-child: 3.2.1
- jackspeak: 3.4.1
- minimatch: 9.0.5
- minipass: 7.1.2
- package-json-from-dist: 1.0.0
- path-scurry: 1.11.1
-
- glob@7.2.3:
+ global-prefix@4.0.0:
dependencies:
- fs.realpath: 1.0.0
- inflight: 1.0.6
- inherits: 2.0.4
- minimatch: 3.1.2
- once: 1.4.0
- path-is-absolute: 1.0.1
-
- global-prefix@3.0.0:
- dependencies:
- ini: 1.3.8
+ ini: 4.1.3
kind-of: 6.0.3
- which: 1.3.1
-
- globals@11.12.0:
- optional: true
+ which: 4.0.0
globals@14.0.0: {}
- globals@15.8.0: {}
+ globals@15.11.0: {}
globalyzer@0.1.0: {}
- globby@11.1.0:
- dependencies:
- array-union: 2.1.0
- dir-glob: 3.0.1
- fast-glob: 3.3.2
- ignore: 5.3.1
- merge2: 1.4.1
- slash: 3.0.0
-
globrex@0.1.2: {}
gopd@1.0.1:
dependencies:
get-intrinsic: 1.2.4
- graceful-fs@4.2.11: {}
-
graphemer@1.4.0: {}
- has-flag@3.0.0:
- optional: true
-
has-flag@4.0.0: {}
has-property-descriptors@1.0.2:
@@ -3859,7 +3177,7 @@ snapshots:
dependencies:
function-bind: 1.1.2
- hls.js@1.5.13: {}
+ hls.js@1.5.16: {}
home-assistant-js-websocket@9.4.0: {}
@@ -3871,21 +3189,21 @@ snapshots:
statuses: 2.0.1
toidentifier: 1.0.1
- http-proxy-middleware@3.0.0:
+ http-proxy-middleware@3.0.3:
dependencies:
- '@types/http-proxy': 1.17.14
- debug: 4.3.5
- http-proxy: 1.18.1(debug@4.3.5)
+ '@types/http-proxy': 1.17.15
+ debug: 4.3.7
+ http-proxy: 1.18.1(debug@4.3.7)
is-glob: 4.0.3
- is-plain-obj: 3.0.0
- micromatch: 4.0.7
+ is-plain-object: 5.0.0
+ micromatch: 4.0.8
transitivePeerDependencies:
- supports-color
- http-proxy@1.18.1(debug@4.3.5):
+ http-proxy@1.18.1(debug@4.3.7):
dependencies:
eventemitter3: 4.0.7
- follow-redirects: 1.15.6(debug@4.3.5)
+ follow-redirects: 1.15.9(debug@4.3.7)
requires-port: 1.0.0
transitivePeerDependencies:
- debug
@@ -3896,7 +3214,7 @@ snapshots:
ieee754@1.2.1: {}
- ignore@5.3.1: {}
+ ignore@5.3.2: {}
import-fresh@3.3.0:
dependencies:
@@ -3907,28 +3225,15 @@ snapshots:
imurmurhash@0.1.4: {}
- inflight@1.0.6:
- dependencies:
- once: 1.4.0
- wrappy: 1.0.2
-
inherits@2.0.4: {}
- ini@1.3.8: {}
+ ini@4.1.3: {}
internmap@2.0.3: {}
ipaddr.js@1.9.1: {}
- is-binary-path@2.1.0:
- dependencies:
- binary-extensions: 2.3.0
-
- is-builtin-module@3.2.1:
- dependencies:
- builtin-modules: 3.3.0
-
- is-core-module@2.14.0:
+ is-core-module@2.15.1:
dependencies:
hasown: 2.0.2
@@ -3940,8 +3245,6 @@ snapshots:
is-extglob@2.1.1: {}
- is-fullwidth-code-point@3.0.0: {}
-
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
@@ -3950,46 +3253,34 @@ snapshots:
is-number@7.0.0: {}
- is-path-inside@3.0.3: {}
-
- is-plain-obj@3.0.0: {}
-
is-plain-object@2.0.4:
dependencies:
isobject: 3.0.1
+ is-plain-object@5.0.0: {}
+
is-reference@1.2.1:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
is-reference@3.0.2:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
isexe@2.0.0: {}
- isobject@3.0.1: {}
+ isexe@3.1.1: {}
- jackspeak@3.4.1:
- dependencies:
- '@isaacs/cliui': 8.0.2
- optionalDependencies:
- '@pkgjs/parseargs': 0.11.0
+ isobject@3.0.1: {}
- jintr@1.1.0:
+ jintr@2.1.1:
dependencies:
acorn: 8.12.1
- js-tokens@4.0.0:
- optional: true
-
js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
- jsesc@2.5.2:
- optional: true
-
json-buffer@3.0.1: {}
json-schema-traverse@0.4.1: {}
@@ -3998,9 +3289,6 @@ snapshots:
json-stringify-pretty-compact@4.0.0: {}
- json5@2.2.3:
- optional: true
-
kdbush@4.0.2: {}
keyv@4.5.4:
@@ -4013,7 +3301,7 @@ snapshots:
known-css-properties@0.34.0: {}
- konva@9.3.13: {}
+ konva@9.3.15: {}
levn@0.4.1:
dependencies:
@@ -4030,18 +3318,11 @@ snapshots:
lodash.merge@4.6.2: {}
- lru-cache@10.3.1: {}
-
- lru-cache@5.1.1:
+ magic-string@0.30.12:
dependencies:
- yallist: 3.1.1
- optional: true
-
- magic-string@0.30.10:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
- maplibre-gl@4.5.0:
+ maplibre-gl@4.7.1:
dependencies:
'@mapbox/geojson-rewind': 0.5.2
'@mapbox/jsonlint-lines-primitives': 2.0.2
@@ -4050,40 +3331,39 @@ snapshots:
'@mapbox/unitbezier': 0.0.1
'@mapbox/vector-tile': 1.3.1
'@mapbox/whoots-js': 3.1.0
- '@maplibre/maplibre-gl-style-spec': 20.3.0
+ '@maplibre/maplibre-gl-style-spec': 20.3.1
'@types/geojson': 7946.0.14
'@types/geojson-vt': 3.2.5
- '@types/junit-report-builder': 3.0.2
'@types/mapbox__point-geometry': 0.1.4
'@types/mapbox__vector-tile': 1.3.4
'@types/pbf': 3.0.5
'@types/supercluster': 7.1.3
- earcut: 2.2.4
+ earcut: 3.0.0
geojson-vt: 4.0.2
gl-matrix: 3.4.3
- global-prefix: 3.0.0
+ global-prefix: 4.0.0
kdbush: 4.0.2
murmurhash-js: 1.0.0
pbf: 3.3.0
potpack: 2.0.0
- quickselect: 2.0.0
+ quickselect: 3.0.0
supercluster: 8.0.1
- tinyqueue: 2.0.3
+ tinyqueue: 3.0.0
vt-pbf: 3.1.3
- marked@13.0.2: {}
+ marked@14.1.2: {}
mdn-data@2.0.30: {}
media-typer@0.3.0: {}
- merge-descriptors@1.0.1: {}
+ merge-descriptors@1.0.3: {}
merge2@1.4.1: {}
methods@1.1.2: {}
- micromatch@4.0.7:
+ micromatch@4.0.8:
dependencies:
braces: 3.0.3
picomatch: 2.3.1
@@ -4096,8 +3376,6 @@ snapshots:
mime@1.6.0: {}
- min-indent@1.0.1: {}
-
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@@ -4108,20 +3386,12 @@ snapshots:
minimist@1.2.8: {}
- minipass@7.1.2: {}
-
- mkdirp@0.5.6:
- dependencies:
- minimist: 1.2.8
-
mri@1.2.0: {}
mrmime@2.0.0: {}
ms@2.0.0: {}
- ms@2.1.2: {}
-
ms@2.1.3: {}
murmurhash-js@1.0.0: {}
@@ -4132,21 +3402,12 @@ snapshots:
negotiator@0.6.3: {}
- node-releases@2.0.14:
- optional: true
-
- normalize-path@3.0.0: {}
-
object-inspect@1.13.2: {}
on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
-
optionator@0.9.4:
dependencies:
deep-is: 0.1.4
@@ -4164,8 +3425,6 @@ snapshots:
dependencies:
p-limit: 3.1.0
- package-json-from-dist@1.0.0: {}
-
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
@@ -4174,20 +3433,11 @@ snapshots:
path-exists@4.0.0: {}
- path-is-absolute@1.0.1: {}
-
path-key@3.1.1: {}
path-parse@1.0.7: {}
- path-scurry@1.11.1:
- dependencies:
- lru-cache: 10.3.1
- minipass: 7.1.2
-
- path-to-regexp@0.1.7: {}
-
- path-type@4.0.0: {}
+ path-to-regexp@0.1.10: {}
pbf@3.3.0:
dependencies:
@@ -4196,52 +3446,52 @@ snapshots:
periscopic@3.1.0:
dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
estree-walker: 3.0.3
is-reference: 3.0.2
- picocolors@1.0.1: {}
+ picocolors@1.1.0: {}
picomatch@2.3.1: {}
- postcss-load-config@3.1.4(postcss@8.4.39):
+ postcss-load-config@3.1.4(postcss@8.4.47):
dependencies:
lilconfig: 2.1.0
yaml: 1.10.2
optionalDependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-safe-parser@6.0.0(postcss@8.4.39):
+ postcss-safe-parser@6.0.0(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-scss@4.0.9(postcss@8.4.39):
+ postcss-scss@4.0.9(postcss@8.4.47):
dependencies:
- postcss: 8.4.39
+ postcss: 8.4.47
- postcss-selector-parser@6.1.0:
+ postcss-selector-parser@6.1.2:
dependencies:
cssesc: 3.0.0
util-deprecate: 1.0.2
- postcss@8.4.39:
+ postcss@8.4.47:
dependencies:
nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
+ picocolors: 1.1.0
+ source-map-js: 1.2.1
potpack@2.0.0: {}
- preact@10.22.1: {}
+ preact@10.24.2: {}
prelude-ls@1.2.1: {}
- prettier-plugin-svelte@3.2.5(prettier@3.3.2)(svelte@4.2.18):
+ prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@4.2.19):
dependencies:
- prettier: 3.3.2
- svelte: 4.2.18
+ prettier: 3.3.3
+ svelte: 4.2.19
- prettier@3.3.2: {}
+ prettier@3.3.3: {}
protocol-buffers-schema@3.6.0: {}
@@ -4252,7 +3502,7 @@ snapshots:
punycode@2.3.1: {}
- qs@6.11.0:
+ qs@6.13.0:
dependencies:
side-channel: 1.0.6
@@ -4260,6 +3510,8 @@ snapshots:
quickselect@2.0.0: {}
+ quickselect@3.0.0: {}
+
range-parser@1.2.1: {}
raw-body@2.5.2:
@@ -4269,9 +3521,7 @@ snapshots:
iconv-lite: 0.4.24
unpipe: 1.0.0
- readdirp@3.6.0:
- dependencies:
- picomatch: 2.3.1
+ readdirp@4.0.2: {}
requires-port@1.0.0: {}
@@ -4283,36 +3533,32 @@ snapshots:
resolve@1.22.8:
dependencies:
- is-core-module: 2.14.0
+ is-core-module: 2.15.1
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
reusify@1.0.4: {}
- rimraf@2.7.1:
+ rollup@4.24.0:
dependencies:
- glob: 7.2.3
-
- rollup@4.18.0:
- dependencies:
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.18.0
- '@rollup/rollup-android-arm64': 4.18.0
- '@rollup/rollup-darwin-arm64': 4.18.0
- '@rollup/rollup-darwin-x64': 4.18.0
- '@rollup/rollup-linux-arm-gnueabihf': 4.18.0
- '@rollup/rollup-linux-arm-musleabihf': 4.18.0
- '@rollup/rollup-linux-arm64-gnu': 4.18.0
- '@rollup/rollup-linux-arm64-musl': 4.18.0
- '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0
- '@rollup/rollup-linux-riscv64-gnu': 4.18.0
- '@rollup/rollup-linux-s390x-gnu': 4.18.0
- '@rollup/rollup-linux-x64-gnu': 4.18.0
- '@rollup/rollup-linux-x64-musl': 4.18.0
- '@rollup/rollup-win32-arm64-msvc': 4.18.0
- '@rollup/rollup-win32-ia32-msvc': 4.18.0
- '@rollup/rollup-win32-x64-msvc': 4.18.0
+ '@rollup/rollup-android-arm-eabi': 4.24.0
+ '@rollup/rollup-android-arm64': 4.24.0
+ '@rollup/rollup-darwin-arm64': 4.24.0
+ '@rollup/rollup-darwin-x64': 4.24.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.24.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.24.0
+ '@rollup/rollup-linux-arm64-gnu': 4.24.0
+ '@rollup/rollup-linux-arm64-musl': 4.24.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.24.0
+ '@rollup/rollup-linux-s390x-gnu': 4.24.0
+ '@rollup/rollup-linux-x64-gnu': 4.24.0
+ '@rollup/rollup-linux-x64-musl': 4.24.0
+ '@rollup/rollup-win32-arm64-msvc': 4.24.0
+ '@rollup/rollup-win32-ia32-msvc': 4.24.0
+ '@rollup/rollup-win32-x64-msvc': 4.24.0
fsevents: 2.3.3
run-parallel@1.2.0:
@@ -4329,19 +3575,9 @@ snapshots:
safer-buffer@2.1.2: {}
- sander@0.5.1:
- dependencies:
- es6-promise: 3.3.1
- graceful-fs: 4.2.11
- mkdirp: 0.5.6
- rimraf: 2.7.1
-
- semver@6.3.1:
- optional: true
-
- semver@7.6.2: {}
+ semver@7.6.3: {}
- send@0.18.0:
+ send@0.19.0:
dependencies:
debug: 2.6.9
depd: 2.0.0
@@ -4359,16 +3595,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
- serve-static@1.15.0:
+ serve-static@1.16.2:
dependencies:
- encodeurl: 1.0.2
+ encodeurl: 2.0.0
escape-html: 1.0.3
parseurl: 1.3.3
- send: 0.18.0
+ send: 0.19.0
transitivePeerDependencies:
- supports-color
- set-cookie-parser@2.6.0: {}
+ set-cookie-parser@2.7.0: {}
set-function-length@1.2.2:
dependencies:
@@ -4401,23 +3637,12 @@ snapshots:
get-intrinsic: 1.2.4
object-inspect: 1.13.2
- signal-exit@4.1.0: {}
-
sirv@2.0.4:
dependencies:
- '@polka/url': 1.0.0-next.25
+ '@polka/url': 1.0.0-next.28
mrmime: 2.0.0
totalist: 3.0.1
- slash@3.0.0: {}
-
- sorcery@0.11.1:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
- buffer-crc32: 1.0.0
- minimist: 1.2.8
- sander: 0.5.1
-
sort-asc@0.2.0: {}
sort-desc@0.2.0: {}
@@ -4431,16 +3656,7 @@ snapshots:
sort-desc: 0.2.0
union-value: 1.0.1
- source-map-js@1.2.0: {}
-
- source-map-support@0.5.21:
- dependencies:
- buffer-from: 1.1.2
- source-map: 0.6.1
- optional: true
-
- source-map@0.6.1:
- optional: true
+ source-map-js@1.2.1: {}
split-string@3.1.0:
dependencies:
@@ -4448,30 +3664,6 @@ snapshots:
statuses@2.0.1: {}
- string-width@4.2.3:
- dependencies:
- emoji-regex: 8.0.0
- is-fullwidth-code-point: 3.0.0
- strip-ansi: 6.0.1
-
- string-width@5.1.2:
- dependencies:
- eastasianwidth: 0.2.0
- emoji-regex: 9.2.2
- strip-ansi: 7.1.0
-
- strip-ansi@6.0.1:
- dependencies:
- ansi-regex: 5.0.1
-
- strip-ansi@7.1.0:
- dependencies:
- ansi-regex: 6.0.1
-
- strip-indent@3.0.0:
- dependencies:
- min-indent: 1.0.1
-
strip-json-comments@3.1.1: {}
style-mod@4.1.2: {}
@@ -4480,116 +3672,81 @@ snapshots:
dependencies:
kdbush: 4.0.2
- supports-color@5.5.0:
- dependencies:
- has-flag: 3.0.0
- optional: true
-
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
supports-preserve-symlinks-flag@1.0.0: {}
- svelte-check@3.8.4(@babel/core@7.24.7)(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(svelte@4.2.18):
+ svelte-check@4.0.4(picomatch@2.3.1)(svelte@4.2.19)(typescript@5.6.3):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
- chokidar: 3.6.0
- picocolors: 1.0.1
+ chokidar: 4.0.1
+ fdir: 6.4.0(picomatch@2.3.1)
+ picocolors: 1.1.0
sade: 1.8.1
- svelte: 4.2.18
- svelte-preprocess: 5.1.4(@babel/core@7.24.7)(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(svelte@4.2.18)(typescript@5.5.3)
- typescript: 5.5.3
+ svelte: 4.2.19
+ typescript: 5.6.3
transitivePeerDependencies:
- - '@babel/core'
- - coffeescript
- - less
- - postcss
- - postcss-load-config
- - pug
- - sass
- - stylus
- - sugarss
+ - picomatch
- svelte-confetti@2.0.1(svelte@4.2.18):
+ svelte-confetti@1.4.0(svelte@4.2.19):
dependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
- svelte-dnd-action@0.9.49(svelte@4.2.18):
+ svelte-dnd-action@0.9.51(svelte@4.2.19):
dependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
- svelte-eslint-parser@0.39.2(svelte@4.2.18):
+ svelte-eslint-parser@0.41.1(svelte@4.2.19):
dependencies:
eslint-scope: 7.2.2
eslint-visitor-keys: 3.4.3
espree: 9.6.1
- postcss: 8.4.39
- postcss-scss: 4.0.9(postcss@8.4.39)
+ postcss: 8.4.47
+ postcss-scss: 4.0.9(postcss@8.4.47)
optionalDependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
- svelte-fast-dimension@1.1.0(svelte@4.2.18):
+ svelte-fast-dimension@1.1.0(svelte@4.2.19):
dependencies:
- magic-string: 0.30.10
- svelte: 4.2.18
- svelte-parse-markup: 0.1.5(svelte@4.2.18)
+ magic-string: 0.30.12
+ svelte: 4.2.19
+ svelte-parse-markup: 0.1.5(svelte@4.2.19)
- svelte-hmr@0.16.0(svelte@4.2.18):
+ svelte-hmr@0.16.0(svelte@4.2.19):
dependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
- svelte-modals@1.3.0(svelte@4.2.18):
+ svelte-modals@1.3.0(svelte@4.2.19):
dependencies:
- svelte: 4.2.18
+ svelte: 4.2.19
- svelte-parse-markup@0.1.5(svelte@4.2.18):
+ svelte-parse-markup@0.1.5(svelte@4.2.19):
dependencies:
- svelte: 4.2.18
-
- svelte-preprocess@5.1.4(@babel/core@7.24.7)(postcss-load-config@3.1.4(postcss@8.4.39))(postcss@8.4.39)(svelte@4.2.18)(typescript@5.5.3):
- dependencies:
- '@types/pug': 2.0.10
- detect-indent: 6.1.0
- magic-string: 0.30.10
- sorcery: 0.11.1
- strip-indent: 3.0.0
- svelte: 4.2.18
- optionalDependencies:
- '@babel/core': 7.24.7
- postcss: 8.4.39
- postcss-load-config: 3.1.4(postcss@8.4.39)
- typescript: 5.5.3
+ svelte: 4.2.19
svelte-ripple@0.1.1: {}
svelte-tiny-virtual-list@2.1.2: {}
- svelte@4.2.18:
+ svelte@4.2.19:
dependencies:
'@ampproject/remapping': 2.3.0
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
- '@types/estree': 1.0.5
+ '@types/estree': 1.0.6
acorn: 8.12.1
- aria-query: 5.3.0
- axobject-query: 4.0.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
code-red: 1.0.4
css-tree: 2.3.1
estree-walker: 3.0.3
is-reference: 3.0.2
locate-character: 3.0.0
- magic-string: 0.30.10
+ magic-string: 0.30.12
periscopic: 3.1.0
- terser@5.31.1:
- dependencies:
- '@jridgewell/source-map': 0.3.6
- acorn: 8.12.1
- commander: 2.20.3
- source-map-support: 0.5.21
- optional: true
-
text-table@0.2.0: {}
tiny-glob@0.2.9:
@@ -4597,10 +3754,7 @@ snapshots:
globalyzer: 0.1.0
globrex: 0.1.2
- tinyqueue@2.0.3: {}
-
- to-fast-properties@2.0.0:
- optional: true
+ tinyqueue@3.0.0: {}
to-regex-range@5.0.1:
dependencies:
@@ -4610,11 +3764,11 @@ snapshots:
totalist@3.0.1: {}
- ts-api-utils@1.3.0(typescript@5.5.3):
+ ts-api-utils@1.3.0(typescript@5.6.3):
dependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
- tslib@2.6.3: {}
+ tslib@2.7.0: {}
type-check@0.4.0:
dependencies:
@@ -4625,18 +3779,18 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
- typescript-eslint@8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3):
+ typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.3):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.0.0-alpha.39(@typescript-eslint/parser@8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3))(eslint@9.6.0)(typescript@5.5.3)
- '@typescript-eslint/parser': 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
- '@typescript-eslint/utils': 8.0.0-alpha.39(eslint@9.6.0)(typescript@5.5.3)
+ '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3))(eslint@9.12.0)(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3)
optionalDependencies:
- typescript: 5.5.3
+ typescript: 5.6.3
transitivePeerDependencies:
- eslint
- supports-color
- typescript@5.5.3: {}
+ typescript@5.6.3: {}
typewise-core@1.2.0: {}
@@ -4644,7 +3798,7 @@ snapshots:
dependencies:
typewise-core: 1.2.0
- undici-types@5.26.5: {}
+ undici-types@6.19.8: {}
undici@5.28.4:
dependencies:
@@ -4659,13 +3813,6 @@ snapshots:
unpipe@1.0.0: {}
- update-browserslist-db@1.1.0(browserslist@4.23.1):
- dependencies:
- browserslist: 4.23.1
- escalade: 3.1.2
- picocolors: 1.0.1
- optional: true
-
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@@ -4676,19 +3823,18 @@ snapshots:
vary@1.1.2: {}
- vite@5.3.3(@types/node@20.14.10)(terser@5.31.1):
+ vite@5.4.8(@types/node@22.7.5):
dependencies:
esbuild: 0.21.5
- postcss: 8.4.39
- rollup: 4.18.0
+ postcss: 8.4.47
+ rollup: 4.24.0
optionalDependencies:
- '@types/node': 20.14.10
+ '@types/node': 22.7.5
fsevents: 2.3.3
- terser: 5.31.1
- vitefu@0.2.5(vite@5.3.3(@types/node@20.14.10)(terser@5.31.1)):
+ vitefu@0.2.5(vite@5.4.8(@types/node@22.7.5)):
optionalDependencies:
- vite: 5.3.3(@types/node@20.14.10)(terser@5.31.1)
+ vite: 5.4.8(@types/node@22.7.5)
vt-pbf@3.1.3:
dependencies:
@@ -4700,39 +3846,23 @@ snapshots:
weekstart@2.0.0: {}
- which@1.3.1:
- dependencies:
- isexe: 2.0.0
-
which@2.0.2:
dependencies:
isexe: 2.0.0
- word-wrap@1.2.5: {}
-
- wrap-ansi@7.0.0:
- dependencies:
- ansi-styles: 4.3.0
- string-width: 4.2.3
- strip-ansi: 6.0.1
-
- wrap-ansi@8.1.0:
+ which@4.0.0:
dependencies:
- ansi-styles: 6.2.1
- string-width: 5.1.2
- strip-ansi: 7.1.0
+ isexe: 3.1.1
- wrappy@1.0.2: {}
-
- yallist@3.1.1:
- optional: true
+ word-wrap@1.2.5: {}
yaml@1.10.2: {}
yocto-queue@0.1.0: {}
- youtubei.js@10.0.0:
+ youtubei.js@10.5.0:
dependencies:
- jintr: 1.1.0
- tslib: 2.6.3
+ '@bufbuild/protobuf': 2.2.0
+ jintr: 2.1.1
+ tslib: 2.7.0
undici: 5.28.4
diff --git a/scripts/translations/fetch.py b/scripts/translations/fetch.py
index 5dffd23..b3a666b 100755
--- a/scripts/translations/fetch.py
+++ b/scripts/translations/fetch.py
@@ -559,6 +559,7 @@ def process_dir(_dir, _output, _keys):
("condition_pass", ["ui.panel.lovelace.editor.condition-editor.testing_pass"]),
("condition_error", ["ui.panel.lovelace.editor.condition-editor.testing_error"]),
("current_state", ["ui.panel.lovelace.editor.condition-editor.condition.state.current_state"]),
+ ("picture_elements", ["ui.panel.lovelace.editor.card.picture-elements.name"]),
],
),
( # DEVELOPER-TOOLS
diff --git a/src/app.d.ts b/src/app.d.ts
index f59b884..743f07b 100644
--- a/src/app.d.ts
+++ b/src/app.d.ts
@@ -5,6 +5,7 @@ declare global {
// interface Error {}
// interface Locals {}
// interface PageData {}
+ // interface PageState {}
// interface Platform {}
}
}
diff --git a/src/app.html b/src/app.html
index d7c1276..ba33a32 100644
--- a/src/app.html
+++ b/src/app.html
@@ -3,7 +3,7 @@
-
+
%sveltekit.head%
diff --git a/src/lib/Components/ComputeIcon.svelte b/src/lib/Components/ComputeIcon.svelte
index 49a9baa..460df09 100644
--- a/src/lib/Components/ComputeIcon.svelte
+++ b/src/lib/Components/ComputeIcon.svelte
@@ -1,12 +1,13 @@
diff --git a/src/lib/Main/ConditionalMedia.svelte b/src/lib/Main/ConditionalMedia.svelte
index d00d6ad..296681e 100644
--- a/src/lib/Main/ConditionalMedia.svelte
+++ b/src/lib/Main/ConditionalMedia.svelte
@@ -343,14 +343,14 @@
{#if currentAttr?.icon}
{:else if current_media_player}
-
+
{/if}
{:else if sel?.icon || entity?.attributes?.icon}
{:else if sel?.entity_id}
-
+
{:else}
{/if}
diff --git a/src/lib/Main/Content.svelte b/src/lib/Main/Content.svelte
index 703346f..9482865 100644
--- a/src/lib/Main/Content.svelte
+++ b/src/lib/Main/Content.svelte
@@ -2,15 +2,18 @@
import { SHADOW_ITEM_MARKER_PROPERTY_NAME } from 'svelte-dnd-action';
import Button from '$lib/Main/Button.svelte';
import ConditionalMedia from '$lib/Main/ConditionalMedia.svelte';
+ import PictureElements from '$lib/Main/PictureElements.svelte';
import Camera from '$lib/Main/Camera.svelte';
import Configure from '$lib/Main/Configure.svelte';
import Empty from '$lib/Main/Empty.svelte';
export let item: any;
export let sectionName: string | undefined = undefined;
+
+ const large = ['conditional_media', 'picture_elements', 'camera'];
-{#if item?.[SHADOW_ITEM_MARKER_PROPERTY_NAME] && item?.type === 'conditional_media'}
+{#if item?.[SHADOW_ITEM_MARKER_PROPERTY_NAME] && large.includes(item?.type)}
{/if}
@@ -20,6 +23,8 @@
{:else if item?.type === 'conditional_media'}
+{:else if item?.type === 'picture_elements'}
+
{:else if item?.type === 'camera'}
{:else if item?.type === 'empty'}
diff --git a/src/lib/Main/Index.svelte b/src/lib/Main/Index.svelte
index 12fce92..52e6c68 100644
--- a/src/lib/Main/Index.svelte
+++ b/src/lib/Main/Index.svelte
@@ -29,8 +29,7 @@
flipDurationMs: $motion,
dragDisabled: !$editMode,
dropTargetStyle: {},
- zoneTabIndex: -1,
- centreDraggedOnCursor: false
+ zoneTabIndex: -1
};
/**
@@ -182,9 +181,10 @@
}
function itemStyles(type: string) {
+ const large = ['conditional_media', 'picture_elements', 'camera'];
return `
- grid-column: ${type === 'conditional_media' || type === 'camera' ? 'span 2' : 'span 1'};
- grid-row: ${type === 'conditional_media' || type === 'camera' ? 'span 4' : 'span 1'};
+ grid-column: ${large.includes(type) ? 'span 2' : 'span 1'};
+ grid-row: ${large.includes(type) ? 'span 4' : 'span 1'};
display: ${type ? '' : 'none'};
`;
}
@@ -200,16 +200,27 @@
* Helper function to transform the dragged element
*/
function transformElement(element: HTMLElement) {
- const container = element.firstElementChild as HTMLDivElement;
+ const container = element.firstElementChild as HTMLElement;
+ if (!container) return;
+
+ const pictureElement = container?.firstElementChild?.className === 'konvajs-content';
if (!altKeyPressed) skipTransformElement = true;
- if (!skipTransformElement && container) {
+ // alt-duplicate add yellow outline
+ if (!skipTransformElement) {
Object.assign(container.style, {
- outline: 'rgb(255, 192, 8) dashed 2px',
+ outline: '2px dashed rgb(255, 192, 8)',
outlineOffset: '-2px',
borderRadius: '0.65rem'
});
+
+ // if picture element set z-index on konva
+ // container to be able to see the outline...
+ if (pictureElement) {
+ const konva = container.firstElementChild as HTMLElement;
+ if (konva) konva.style.zIndex = '-1';
+ }
}
}
@@ -313,7 +324,6 @@
...dndOptions,
type: 'item',
items: stackSection.items,
- centreDraggedOnCursor: true,
transformDraggedElement
}}
on:consider={(event) => dragItem__stack(stackSection.id, event)}
@@ -349,8 +359,7 @@
...dndOptions,
type: 'item',
items: section.items,
- transformDraggedElement: transformScenesElement,
- centreDraggedOnCursor: true
+ transformDraggedElement: transformScenesElement
}}
on:consider={(event) => dragItem(section.id, event)}
on:finalize={(event) => dragItem(section.id, event)}
@@ -382,7 +391,6 @@
...dndOptions,
type: 'item',
items: section.items,
- centreDraggedOnCursor: true,
transformDraggedElement
}}
on:consider={(event) => dragItem(section.id, event)}
diff --git a/src/lib/Main/PictureElements.svelte b/src/lib/Main/PictureElements.svelte
new file mode 100644
index 0000000..09caab7
--- /dev/null
+++ b/src/lib/Main/PictureElements.svelte
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+
diff --git a/src/lib/Main/Scenes.svelte b/src/lib/Main/Scenes.svelte
index c38d0dd..e0f8bf9 100644
--- a/src/lib/Main/Scenes.svelte
+++ b/src/lib/Main/Scenes.svelte
@@ -72,7 +72,7 @@
{/await}
{:else if sel?.entity_id}
-
+
{:else}
{/if}
diff --git a/src/lib/Modal/CalendarModal.svelte b/src/lib/Modal/CalendarModal.svelte
index 85f7e86..3132b13 100644
--- a/src/lib/Modal/CalendarModal.svelte
+++ b/src/lib/Modal/CalendarModal.svelte
@@ -176,7 +176,6 @@
// cleanup
onDestroy(() => {
clearTimeout(timeout);
- ec?.destroy();
});
diff --git a/src/lib/Modal/Index.svelte b/src/lib/Modal/Index.svelte
index 66621a8..def68eb 100644
--- a/src/lib/Modal/Index.svelte
+++ b/src/lib/Modal/Index.svelte
@@ -197,6 +197,7 @@
aria-label="close"
style:outline="none"
use:Ripple={$ripple}
+ tabindex="-1"
>
diff --git a/src/lib/Modal/MainItemConfig.svelte b/src/lib/Modal/MainItemConfig.svelte
index d52d3c1..5d673ae 100644
--- a/src/lib/Modal/MainItemConfig.svelte
+++ b/src/lib/Modal/MainItemConfig.svelte
@@ -19,6 +19,7 @@
import Empty from '$lib/Main/Empty.svelte';
import ConfigButtons from '$lib/Modal/ConfigButtons.svelte';
import Ripple from 'svelte-ripple';
+ import PictureElements from '$lib/Main/PictureElements.svelte';
export let isOpen: boolean;
export let sel: any;
@@ -31,7 +32,10 @@
if (!$demo.sensor) $demo.sensor = getSensorEntity($states);
if (!$demo.media_player) $demo.media_player = getMediaPlayerEntity($states);
- onMount(() => {
+ let loadIcons: (typeof import('@iconify/svelte'))['loadIcons'];
+ let icons: Record;
+
+ onMount(async () => {
if (searchElement) {
searchElement.focus();
}
@@ -46,6 +50,15 @@
sel.type = 'configure';
$dashboard = $dashboard;
}
+
+ // picture elements config, need to be loaded before click but can be deferred to onmount
+ const [iconifyModule, iconsModule] = await Promise.all([
+ import('@iconify/svelte'),
+ import('$lib/Modal/PictureElements/icons')
+ ]);
+
+ loadIcons = iconifyModule.loadIcons;
+ icons = iconsModule.icons;
});
$: filter = itemTypes
@@ -86,6 +99,14 @@
muted: true
}
},
+ {
+ id: 'picture_elements',
+ type: $lang('picture_elements'),
+ component: PictureElements,
+ props: {
+ sel
+ }
+ },
{
id: 'empty',
type: $lang('empty'),
@@ -134,6 +155,16 @@
sel
});
break;
+ case 'picture_elements': {
+ loadIcons(Object.values(icons));
+
+ openModal(() => import('$lib/Modal/PictureElements/PictureElementsConfig.svelte'), {
+ sel
+ });
+
+ break;
+ }
+
case 'empty':
openModal(() => import('$lib/Modal/EmptyConfig.svelte'), { sel });
break;
diff --git a/src/lib/Modal/PictureElements/ActionPanel.svelte b/src/lib/Modal/PictureElements/ActionPanel.svelte
new file mode 100644
index 0000000..f498edf
--- /dev/null
+++ b/src/lib/Modal/PictureElements/ActionPanel.svelte
@@ -0,0 +1,312 @@
+
+
+
+
+
+
+{#if !collapsed}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{/if}
+
+
+
+
+
+
diff --git a/src/lib/Modal/PictureElements/ElementsPanel.svelte b/src/lib/Modal/PictureElements/ElementsPanel.svelte
new file mode 100644
index 0000000..9a821bb
--- /dev/null
+++ b/src/lib/Modal/PictureElements/ElementsPanel.svelte
@@ -0,0 +1,372 @@
+
+
+
+
+
+
+
+ {#each layers as shape (shape.id)}
+ {@const konvaStoreEquivalent = $konvaStore?.children?.find(
+ (item) => item?.attrs?.id === shape?.attrs?.id
+ )}
+
+
+
node?.attrs?.id === shape?.attrs?.id)}
+ on:dragstart={() => handleDragStart(shape?.attrs?.id)}
+ on:click={async (event) => {
+ // blur any active attr input to trigger onchange before switching layer
+ if (
+ document?.activeElement instanceof HTMLInputElement ||
+ document?.activeElement instanceof HTMLTextAreaElement
+ ) {
+ document?.activeElement?.blur?.();
+ await tick();
+ }
+ konva.handleElementClick(event, shape?.attrs?.id);
+ }}
+ >
+
+
+
+
+
+ {#if shape?.attrs?.type === 'icon' || shape?.attrs?.type === 'state-icon'}
+ {#if shape?.attrs?.type === 'state-icon' && !shape?.attrs?.entity_id}
+
+ {:else if iconExists(konvaStoreEquivalent?.attrs?.icon)}
+
+ {:else}
+ {#await loadIcon(konvaStoreEquivalent?.attrs?.icon)}
+
+ {:then iconName}
+
+ {:catch}
+
+ {/await}
+ {/if}
+ {:else if shape?.attrs?.type === 'image'}
+
+
+
+
+ {:else}
+
+ {/if}
+
+
+
+ {#if editingId === shape?.id}
+
+
handleKeydown(event, shape)}
+ on:blur={() => (editingId = undefined)}
+ on:click|stopPropagation
+ autofocus={true}
+ />
+ {:else}
+
(editingId = shape?.id)}>
+ {shape?.attrs?.name}
+
+ {/if}
+
+
+ {#if !shape?.attrs?.draggable}
+
+ {/if}
+
+ {/each}
+
+
+
diff --git a/src/lib/Modal/PictureElements/HelpOverlay.svelte b/src/lib/Modal/PictureElements/HelpOverlay.svelte
new file mode 100644
index 0000000..9678d29
--- /dev/null
+++ b/src/lib/Modal/PictureElements/HelpOverlay.svelte
@@ -0,0 +1,218 @@
+
+
+
+
+
+
+
diff --git a/src/lib/Modal/PictureElements/KeyboardHandler.svelte b/src/lib/Modal/PictureElements/KeyboardHandler.svelte
new file mode 100644
index 0000000..2300f4f
--- /dev/null
+++ b/src/lib/Modal/PictureElements/KeyboardHandler.svelte
@@ -0,0 +1,111 @@
+
+
+
diff --git a/src/lib/Modal/PictureElements/PictureElementsConfig.svelte b/src/lib/Modal/PictureElements/PictureElementsConfig.svelte
new file mode 100644
index 0000000..877714d
--- /dev/null
+++ b/src/lib/Modal/PictureElements/PictureElementsConfig.svelte
@@ -0,0 +1,325 @@
+
+
+
+
+
+{#if isOpen}
+
+ {$lang('picture_elements')}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if showHelp}
+
+ {/if}
+
+
+
+
+
+
+
+{/if}
+
+
diff --git a/src/lib/Modal/PictureElements/ResizePanel.svelte b/src/lib/Modal/PictureElements/ResizePanel.svelte
new file mode 100644
index 0000000..69efac3
--- /dev/null
+++ b/src/lib/Modal/PictureElements/ResizePanel.svelte
@@ -0,0 +1,45 @@
+
+
+ (resizing = false)} />
+
+ (resizing = true)}>
+
+
diff --git a/src/lib/Modal/PictureElements/SelectedAttributes.svelte b/src/lib/Modal/PictureElements/SelectedAttributes.svelte
new file mode 100644
index 0000000..96fc3a9
--- /dev/null
+++ b/src/lib/Modal/PictureElements/SelectedAttributes.svelte
@@ -0,0 +1,408 @@
+
+
+
+ {#if selectedShapes?.length === 0}
+
+
+
+
+ Click an element to select it
+ {:else if selectedShapes?.length === 1}
+
+ {#if selectedShape?.attrs?.type === 'group'}
+
+
+
+ Group ({countGroupShapes(selectedShape)} elements)
+ {:else}
+
+
+
+
+ {#each attributes as attr}
+
+
+ {#if attr.type === 'button'}
+
+
+
+
+ {:else if attr.type === 'color'}
+
+ setAttribute(selectedShape?.attrs?.id, attr?.id, event)}
+ on:input={(event) => handleInput(selectedShape?.attrs?.id, attr?.id, event)}
+ style:width={attr?.width}
+ disabled={attr?.disabled}
+ />
+ {:else}
+
+ setAttribute(selectedShape?.attrs?.id, attr?.id, event)}
+ style:width={attr?.width}
+ disabled={attr?.disabled}
+ />
+ {/if}
+
+ {/each}
+
+ {/if}
+ {:else if selectedShapes?.length > 1}
+
+
+
+
+
+ {selectedShapes?.length} elements selected
+ {/if}
+
+
+
diff --git a/src/lib/Modal/PictureElements/TextPanel.svelte b/src/lib/Modal/PictureElements/TextPanel.svelte
new file mode 100644
index 0000000..65c3181
--- /dev/null
+++ b/src/lib/Modal/PictureElements/TextPanel.svelte
@@ -0,0 +1,377 @@
+
+
+
+
+
+
+{#if !collapsed}
+
+
+
+
+
+
+
+
+
+
+
+
+
setAttribute(attr?.id, 'letterSpacing', event)}
+ {disabled}
+ />
+
+
+
+
+
+
+
+
+
+ handleFontStyle(attr?.fontStyle, bold)}
+ class:selected={attr?.fontStyle?.includes(bold)}
+ {disabled}
+ >
+
+
+
+
+ handleFontStyle(attr?.fontStyle, 'italic')}
+ class:selected={attr?.fontStyle?.includes('italic')}
+ {disabled}
+ >
+
+
+
+
+
+
+
+ konva.updateAttr(attr?.id, 'align', 'left')}
+ class:selected={align === 'left'}
+ {disabled}
+ >
+
+
+
+
+ konva.updateAttr(attr?.id, 'align', 'center')}
+ class:selected={align === 'center'}
+ {disabled}
+ >
+
+
+
+
+ konva.updateAttr(attr?.id, 'align', 'right')}
+ class:selected={align === 'right'}
+ {disabled}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+{/if}
+
+
diff --git a/src/lib/Modal/PictureElements/Toolbar.svelte b/src/lib/Modal/PictureElements/Toolbar.svelte
new file mode 100644
index 0000000..173b5eb
--- /dev/null
+++ b/src/lib/Modal/PictureElements/Toolbar.svelte
@@ -0,0 +1,123 @@
+
+
+ konva.setMode('default')}
+ on:dblclick={() => {
+ konva.deselectAll();
+ if ($konvaStore?.selectedShapes) {
+ $konvaStore.selectedShapes = [];
+ }
+ }}
+ class:selected={$konvaStore?.mode === 'default'}
+>
+
+
+
+ konva.setMode('pan')}
+ on:dblclick={() => konva.fitCanvas()}
+ class:selected={$konvaStore?.mode === 'pan'}
+>
+
+
+
+ konva.setMode('zoom')}
+ on:dblclick={() => {
+ konva.setZoom('reset', {
+ x: konva.stage.width() / 2,
+ y: konva.stage.height() / 2
+ });
+ }}
+ class:selected={$konvaStore?.mode === 'zoom'}
+>
+
+
+
+
+
+ konva.addStateLabel()}>
+
+
+
+ konva.addStateIcon()}>
+
+
+
+
+
+ konva.addText()}>
+
+
+
+ konva.addIcon()}>
+
+
+
+ konva.addImage()}>
+
+
+
+ konva.addRectangle()}>
+
+
+
+ konva.addCircle()}>
+
+
+
+
+
+ konva.addVerticalGuide()}>
+
+
+
+ konva.addHorizontalGuide()}>
+
+
+
+
diff --git a/src/lib/Modal/PictureElements/TransformAttributes.svelte b/src/lib/Modal/PictureElements/TransformAttributes.svelte
new file mode 100644
index 0000000..7be90b3
--- /dev/null
+++ b/src/lib/Modal/PictureElements/TransformAttributes.svelte
@@ -0,0 +1,243 @@
+
+
+
+ {#each attributes as attr}
+
+ {#if attr.type === 'button'}
+ 0 && selectedShape?.attrs?.draggable
+ ? '1'
+ : '0.5'}
+ disabled={selectedShapes?.length < 1 && !selectedShape?.attrs?.draggable}
+ title={attr?.label}
+ >
+
+
+ {:else}
+
+
+ handleInput(attr, event)}
+ disabled={attr?.disabled}
+ />
+ {/if}
+
+ {/each}
+
+
+
+ konva.undo()}
+ title="Undo"
+ disabled={!($konvaStore?.undoStack?.length > 1)}
+ >
+
+
+
+
+ konva.redo()}
+ title="Redo"
+ disabled={!($konvaStore?.redoStack?.length > 0)}
+ >
+
+
+
+
+ (showHelp = true)} title="Help">
+
+
+
+
+
+
diff --git a/src/lib/Modal/PictureElements/computeIcon.ts b/src/lib/Modal/PictureElements/computeIcon.ts
new file mode 100644
index 0000000..626c533
--- /dev/null
+++ b/src/lib/Modal/PictureElements/computeIcon.ts
@@ -0,0 +1,717 @@
+import type { HassEntities, HassEntity } from 'home-assistant-js-websocket';
+import { getDomain } from '$lib/Utils';
+
+/**
+ * New computeIcon.ts for picture elements
+ * This should replace computeIcon.svelte
+ */
+
+// https://github.com/home-assistant/frontend/blob/dev/src/common/const.ts
+const FIXED_DOMAIN_ICONS: Record = {
+ air_quality: 'air-filter',
+ alert: 'alert',
+ automation: 'robot',
+ calendar: 'calendar',
+ climate: 'thermostat',
+ configurator: 'cog',
+ conversation: 'forum-outline',
+ counter: 'counter',
+ date: 'calendar',
+ datetime: 'calendar-clock',
+ demo: 'home-assistant',
+ device_tracker: 'account',
+ google_assistant: 'google-assistant',
+ group: 'google-circles-communities',
+ homeassistant: 'home-assistant',
+ homekit: 'home-automation',
+ image_processing: 'image-filter-frames',
+ image: 'image',
+ input_boolean: 'toggle-switch',
+ input_button: 'button-pointer',
+ input_datetime: 'calendar-clock',
+ input_number: 'ray-vertex',
+ input_select: 'format-list-bulleted',
+ input_text: 'rorm-textbox',
+ lawn_mower: 'robot-mower',
+ light: 'lightbulb',
+ notify: 'comment-alert',
+ number: 'ray-vertex',
+ persistent_notification: 'bell',
+ person: 'account',
+ plant: 'flower',
+ proximity: 'apple-safari',
+ remote: 'remote',
+ scene: 'palette',
+ schedule: 'calendar-clock',
+ script: 'script-text',
+ select: 'format-list-bulleted',
+ sensor: 'eye',
+ simple_alarm: 'bell',
+ siren: 'bullhorn',
+ stt: 'microphone-message',
+ sun: 'white-balance-sunny',
+ text: 'form-textbox',
+ time: 'clock',
+ timer: 'timer-outline',
+ todo: 'clipboard-list',
+ tts: 'speaker-message',
+ vacuum: 'robot-vacuum',
+ wake_word: 'chat-sleep',
+ weather: 'weather-partly-cloudy',
+ zone: 'map-marker-radius'
+};
+
+const FIXED_DEVICE_CLASS_ICONS: Record = {
+ apparent_power: 'flash',
+ aqi: 'air-filter',
+ atmospheric_pressure: 'thermometer-lines',
+ carbon_dioxide: 'molecule-co2',
+ carbon_monoxide: 'molecule-co',
+ current: 'current-ac',
+ data_rate: 'transmission-tower',
+ data_size: 'database',
+ date: 'calendar',
+ distance: 'arrow-left-right',
+ duration: 'progress-clock',
+ energy: 'lightning-bolt',
+ frequency: 'sine-wave',
+ gas: 'meter-gas',
+ humidity: 'water-percent',
+ illuminance: 'brightness-5',
+ irradiance: 'sun-wireless',
+ moisture: 'water-percent',
+ monetary: 'cash',
+ nitrogen_dioxide: 'molecule',
+ nitrogen_monoxide: 'molecule',
+ nitrous_oxide: 'molecule',
+ ozone: 'molecule',
+ ph: 'ph',
+ pm1: 'molecule',
+ pm10: 'molecule',
+ pm25: 'molecule',
+ power: 'flash',
+ power_factor: 'angle-acute',
+ precipitation: 'weather-rainy',
+ precipitation_intensity: 'weather-pouring',
+ pressure: 'gauge',
+ reactive_power: 'flash',
+ shopping_List: 'format-list-checkbox',
+ signal_strength: 'wifi',
+ sound_pressure: 'ear-hearing',
+ speed: 'speedometer',
+ sulphur_dioxide: 'molecule',
+ temperature: 'thermometer',
+ timestamp: 'clock',
+ volatile_organic_compounds: 'molecule',
+ volatile_organic_compounds_parts: 'molecule',
+ voltage: 'sine-wave',
+ volume: 'car-coolant-level',
+ volume_flow_rate: 'pipe',
+ water: 'water',
+ weight: 'weight',
+ wind_speed: 'weather-windy'
+};
+
+const STATE_ICONS: Record string> = {
+ alarm_control_panel: handleAlarmControlPanel,
+ automation: handleAutomation,
+ binary_sensor: handleBinarySensor,
+ button: handleButton,
+ calendar: handleCalendar,
+ camera: handleCamera,
+ climate: handleClimate,
+ cover: handleCover,
+ device_tracker: handleDeviceTracker,
+ event: handleEvent,
+ fan: handleFan,
+ humidifier: handleHumidifier,
+ input_boolean: handleInputBoolean,
+ input_datetime: handleInputDatetime,
+ lock: handleLock,
+ media_player: handleMediaPlayer,
+ person: handlePerson,
+ script: handleScript,
+ sensor: handleSensor,
+ sun: handleSun,
+ switch: handleSwitch,
+ update: handleUpdate,
+ valve: handleValve,
+ water_heater: handleWaterHeater,
+ weather: handleWeather
+};
+
+// https://github.com/home-assistant/frontend/blob/dev/src/common/entity/device_tracker_icon.ts
+function handleDeviceTracker(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ if (attributes?.source_type === 'router') {
+ return state === 'home' ? 'lan-connect' : 'lan-disconnect';
+ }
+ if (['bluetooth', 'bluetooth_le'].includes(attributes?.source_type)) {
+ return state === 'home' ? 'bluetooth-connect' : 'bluetooth';
+ }
+ return state === 'not_home' ? 'account-arrow-right' : 'account';
+}
+
+// https://github.com/home-assistant/frontend/blob/dev/src/common/entity/state_icon.ts
+function handleInputDatetime(stateObj: HassEntity) {
+ const { attributes } = stateObj;
+
+ if (!attributes?.has_date) {
+ return 'clock';
+ }
+ if (!attributes?.has_time) {
+ return 'calendar';
+ }
+ return FIXED_DOMAIN_ICONS['input_datetime'];
+}
+
+function handleSun(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'above_horizon' ? 'white-balance-sunny' : 'weather-night';
+}
+
+function handleUpdate(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ const updateIsInstalling =
+ ((attributes.supported_features ?? 0) & 4 && typeof attributes.in_progress === 'number') ||
+ !!attributes.in_progress;
+
+ return state === 'on' ? (updateIsInstalling ? 'package-down' : 'package-up') : 'package';
+}
+
+// https://github.com/home-assistant/frontend/blob/dev/src/fake_data/entity_component_icons.ts
+function handleAlarmControlPanel(stateObj: HassEntity) {
+ const { state } = stateObj;
+
+ switch (state) {
+ case 'armed_away':
+ return 'shield-lock';
+ case 'armed_custom_bypass':
+ return 'security';
+ case 'armed_home':
+ return 'shield-home';
+ case 'armed_night':
+ return 'shield-moon';
+ case 'armed_vacation':
+ return 'shield-airplane';
+ case 'disarmed':
+ return 'shield-off';
+ case 'pending':
+ return 'shield-outline';
+ case 'triggered':
+ return 'bell-ring';
+ default:
+ return 'shield';
+ }
+}
+
+function handleAutomation(stateObj: HassEntity) {
+ const { state } = stateObj;
+ if (state === 'unavailable') return 'robot-confused';
+ return state === 'on' ? FIXED_DOMAIN_ICONS['automation'] : 'robot-off';
+}
+
+function handleInputBoolean(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'on' ? 'check-circle-outline' : 'close-circle-outline';
+}
+
+function handlePerson(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'not_home' ? 'account-arrow-right' : FIXED_DOMAIN_ICONS['person'];
+}
+
+function handleCamera(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'off' ? 'video-off' : 'video';
+}
+
+function handleFan(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'off' ? 'fan-off' : 'fan';
+}
+
+function handleHumidifier(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'off' ? 'air-humidifier-off' : 'air-humidifier';
+}
+
+function handleButton(stateObj: HassEntity) {
+ const { attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'restart':
+ return 'restart';
+ case 'update':
+ return 'package-up';
+ case 'identify':
+ return 'crosshairs-question';
+ default:
+ return 'button-pointer';
+ }
+}
+
+function handleEvent(stateObj: HassEntity) {
+ const { attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'button':
+ return 'gesture-tap-button';
+ case 'doorbell':
+ return 'doorbell';
+ case 'motion':
+ return 'motion-sensor';
+ default:
+ return 'eye-check';
+ }
+}
+
+function handleLock(stateObj: HassEntity) {
+ const { state } = stateObj;
+
+ switch (state) {
+ case 'jammed':
+ return 'lock-alert';
+ case 'unlocked':
+ return 'lock-open';
+ case 'locking':
+ case 'unlocking':
+ case 'opening':
+ return 'lock-clock';
+ case 'open':
+ return 'lock-open-variant';
+ default:
+ return 'lock';
+ }
+}
+
+function handleWaterHeater(stateObj: HassEntity) {
+ const { state } = stateObj;
+ return state === 'off' ? 'water-boiler-off' : 'water-boiler';
+}
+
+function handleValve(stateObj: HassEntity) {
+ const { attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'gas':
+ return 'meter-gas';
+ case 'water':
+ return 'pipe-valve';
+ default:
+ return 'pipe-valve';
+ }
+}
+
+function handleSwitch(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'switch':
+ return state === 'on' ? 'toggle-switch-variant' : 'toggle-switch-variant-off';
+ case 'outlet':
+ return state === 'on' ? 'power-plug' : 'power-plug-off';
+ default:
+ return 'toggle-switch-variant';
+ }
+}
+
+function handleMediaPlayer(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'receiver':
+ switch (state) {
+ case 'off':
+ return 'audio-video-off';
+ default:
+ return 'audio-video';
+ }
+ case 'speaker':
+ switch (state) {
+ case 'off':
+ return 'speaker-off';
+ case 'paused':
+ return 'speaker-pause';
+ case 'playing':
+ return 'speaker-play';
+ default:
+ return 'speaker';
+ }
+ case 'tv':
+ switch (state) {
+ case 'off':
+ return 'television-off';
+ case 'paused':
+ return 'television-pause';
+ case 'playing':
+ return 'television-play';
+ default:
+ return 'television';
+ }
+ default:
+ switch (state) {
+ case 'off':
+ return 'cast-off';
+ case 'playing':
+ case 'paused':
+ return 'cast-connected';
+ default:
+ return 'cast';
+ }
+ }
+}
+
+// https://github.com/home-assistant/frontend/blob/dev/src/common/entity/battery_icon.ts
+function batteryIcon(state: number | string, attributes: any) {
+ const BATTERY_ICONS: Record = {
+ 10: 'battery-10',
+ 20: 'battery-20',
+ 30: 'battery-30',
+ 40: 'battery-40',
+ 50: 'battery-50',
+ 60: 'battery-60',
+ 70: 'battery-70',
+ 80: 'battery-80',
+ 90: 'battery-90',
+ 100: 'battery'
+ };
+
+ const BATTERY_CHARGING_ICONS: Record = {
+ 10: 'battery-charging-10',
+ 20: 'battery-charging-20',
+ 30: 'battery-charging-30',
+ 40: 'battery-charging-40',
+ 50: 'battery-charging-50',
+ 60: 'battery-charging-60',
+ 70: 'battery-charging-70',
+ 80: 'battery-charging-80',
+ 90: 'battery-charging-90',
+ 100: 'battery-charging'
+ };
+
+ const batteryValue = Number(state);
+ if (isNaN(batteryValue)) {
+ if (state === 'off') {
+ return 'battery';
+ }
+ if (state === 'on') {
+ return 'battery-alert';
+ }
+ return 'battery-unknown';
+ }
+
+ const batteryRound = Math.round(batteryValue / 10) * 10;
+ if (attributes?.is_charging && batteryValue >= 10) {
+ return BATTERY_CHARGING_ICONS[batteryRound];
+ }
+ if (attributes?.is_charging) {
+ return 'battery-charging-outline';
+ }
+ if (batteryValue <= 5) {
+ return 'battery-alert-variant-outline';
+ }
+ return BATTERY_ICONS[batteryRound];
+}
+
+function handleSensor(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ if (attributes?.device_class === 'battery') {
+ return batteryIcon(state, attributes);
+ }
+
+ if (attributes?.unit_of_measurement === '°C' || attributes?.unit_of_measurement === '°F') {
+ return 'thermometer';
+ }
+
+ return FIXED_DOMAIN_ICONS['sensor'];
+}
+
+function handleWeather(stateObj: HassEntity): string {
+ const { state } = stateObj;
+
+ switch (state) {
+ case 'clear-night':
+ return 'weather-night';
+ case 'cloudy':
+ return 'weather-cloudy';
+ case 'exceptional':
+ return 'alert-circle-outline';
+ case 'fog':
+ return 'weather-fog';
+ case 'hail':
+ return 'weather-hail';
+ case 'lightning':
+ return 'weather-lightning';
+ case 'lightning-rainy':
+ return 'weather-lightning-rainy';
+ case 'pouring':
+ return 'weather-pouring';
+ case 'rainy':
+ return 'weather-rainy';
+ case 'snowy':
+ return 'weather-snowy';
+ case 'snowy-rainy':
+ return 'weather-snowy-rainy';
+ case 'sunny':
+ return 'weather-sunny';
+ case 'windy':
+ return 'weather-windy';
+ case 'windy-variant':
+ return 'weather-windy-variant';
+ default:
+ return 'weather-partly-cloudy';
+ }
+}
+
+function handleCalendar(stateObj: HassEntity): string {
+ const { state } = stateObj;
+
+ switch (state) {
+ case 'on':
+ return 'calendar-check';
+ case 'off':
+ return 'calendar-blank';
+ default:
+ return 'calendar';
+ }
+}
+
+function handleScript(stateObj: HassEntity): string {
+ const { state } = stateObj;
+ return state === 'on' ? 'script-text-play' : 'script-text';
+}
+
+function handleClimate(stateObj: HassEntity): string {
+ const { attributes } = stateObj;
+
+ switch (attributes?.hvac_action) {
+ case 'cooling':
+ return 'snowflake';
+ case 'drying':
+ return 'water-percent';
+ case 'fan':
+ return 'fan';
+ case 'heating':
+ return 'fire';
+ case 'idle':
+ return 'clock-outline';
+ case 'off':
+ return 'power';
+ case 'preheating':
+ return 'heat-wave';
+ case 'defrosting':
+ return 'snowflake-melt';
+ }
+
+ switch (attributes?.preset_mode) {
+ case 'activity':
+ return 'motion-sensor';
+ case 'away':
+ return 'account-arrow-right';
+ case 'boost':
+ return 'rocket-launch';
+ case 'comfort':
+ return 'sofa';
+ case 'eco':
+ return 'leaf';
+ case 'home':
+ return 'home';
+ case 'sleep':
+ return 'bed';
+ }
+
+ return 'thermostat';
+}
+
+function handleBinarySensor(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'battery':
+ return state === 'on' ? 'battery-outline' : 'battery';
+ case 'battery_charging':
+ return state === 'on' ? 'battery-charging' : 'battery';
+ case 'carbon_monoxide':
+ return state === 'on' ? 'smoke-detector-alert' : 'smoke-detector';
+ case 'cold':
+ return state === 'on' ? 'snowflake' : 'thermometer';
+ case 'connectivity':
+ return state === 'on' ? 'check-network-outline' : 'close-network-outline';
+ case 'door':
+ return state === 'on' ? 'door-open' : 'door-closed';
+ case 'garage_door':
+ return state === 'on' ? 'garage-open' : 'garage';
+ case 'gas':
+ case 'problem':
+ case 'safety':
+ case 'tamper':
+ return state === 'on' ? 'alert-circle' : 'check-circle';
+ case 'power':
+ case 'plug':
+ return state === 'on' ? 'power-plug' : 'power-plug-off';
+ case 'heat':
+ return state === 'on' ? 'fire' : 'thermometer';
+ case 'light':
+ return state === 'on' ? 'brightness-7' : 'brightness-5';
+ case 'lock':
+ return state === 'on' ? 'lock-open' : 'lock';
+ case 'moisture':
+ return state === 'on' ? 'water' : 'water-off';
+ case 'motion':
+ return state === 'on' ? 'motion-sensor' : 'motion-sensor-off';
+ case 'moving':
+ return state === 'on' ? 'octagon' : 'arrow-right';
+ case 'occupancy':
+ case 'presence':
+ return state === 'on' ? 'home' : 'home-outline';
+ case 'opening':
+ return state === 'on' ? 'square-outline' : 'square';
+ case 'running':
+ return state === 'on' ? 'play' : 'stop';
+ case 'smoke':
+ return state === 'on' ? 'smoke-detector-variant-alert' : 'smoke-detector-variant';
+ case 'sound':
+ return state === 'on' ? 'music-note' : 'music-note-off';
+ case 'update':
+ return state === 'on' ? 'package-up' : 'package';
+ case 'vibration':
+ return state === 'on' ? 'vibrate' : 'crop-portrait';
+ case 'window':
+ return state === 'on' ? 'window-open' : 'window-closed';
+ default:
+ return state === 'on' ? 'checkbox-marked-circle' : 'radiobox-blank';
+ }
+}
+
+function handleCover(stateObj: HassEntity) {
+ const { state, attributes } = stateObj;
+
+ switch (attributes?.device_class) {
+ case 'blind':
+ switch (state) {
+ case 'closed':
+ return 'blinds-horizontal-closed';
+ case 'closing':
+ return 'arrow-down-box';
+ case 'opening':
+ return 'arrow-up-box';
+ default:
+ return 'blinds-horizontal';
+ }
+ case 'curtain':
+ switch (state) {
+ case 'closed':
+ return 'curtains-closed';
+ case 'closing':
+ return 'arrow-collapse-horizontal';
+ case 'opening':
+ return 'arrow-split-vertical';
+ default:
+ return 'curtains';
+ }
+ case 'damper':
+ return state === 'closed' ? 'circle-slice-8' : 'circle';
+ case 'door':
+ return state === 'closed' ? 'door-closed' : 'door-open';
+ case 'garage':
+ switch (state) {
+ case 'closed':
+ return 'garage';
+ case 'closing':
+ return 'arrow-down-box';
+ case 'opening':
+ return 'arrow-up-box';
+ default:
+ return 'garage-open';
+ }
+ case 'gate':
+ switch (state) {
+ case 'closed':
+ return 'gate';
+ case 'closing':
+ case 'opening':
+ return 'arrow-right';
+ default:
+ return 'gate-open';
+ }
+ case 'shade':
+ switch (state) {
+ case 'closed':
+ return 'roller-shade-closed';
+ case 'closing':
+ return 'arrow-down-box';
+ case 'opening':
+ return 'arrow-up-box';
+ default:
+ return 'roller-shade';
+ }
+ case 'shutter':
+ switch (state) {
+ case 'closed':
+ return 'window-shutter';
+ case 'closing':
+ return 'arrow-down-box';
+ case 'opening':
+ return 'arrow-up-box';
+ default:
+ return 'window-shutter-open';
+ }
+ case 'window':
+ switch (state) {
+ case 'closed':
+ return 'window-closed';
+ case 'closing':
+ return 'arrow-down-box';
+ case 'opening':
+ return 'arrow-up-box';
+ default:
+ return 'window-open';
+ }
+ default:
+ switch (state) {
+ case 'closed':
+ return 'window-closed';
+ case 'closing':
+ return 'arrow-down-box';
+ case 'opening':
+ return 'arrow-up-box';
+ default:
+ return 'window-open';
+ }
+ }
+}
+
+export function computeIcon(entity_id: string, $states: HassEntities) {
+ const stateObj = $states?.[entity_id];
+ const domain = getDomain(entity_id);
+
+ if (!stateObj || !domain) return 'mdi:help-circle-outline';
+ const { attributes } = stateObj;
+
+ // icon
+ if (attributes?.icon && attributes?.icon?.startsWith('mdi')) {
+ return attributes.icon;
+ }
+
+ // device class
+ if (attributes?.device_class && FIXED_DEVICE_CLASS_ICONS[attributes.device_class]) {
+ return `mdi:${FIXED_DEVICE_CLASS_ICONS[attributes.device_class]}`;
+ }
+
+ // state
+ if (STATE_ICONS[domain] && typeof STATE_ICONS[domain] === 'function') {
+ return `mdi:${STATE_ICONS[domain](stateObj)}`;
+ }
+
+ // domain
+ if (FIXED_DOMAIN_ICONS[domain]) {
+ return `mdi:${FIXED_DOMAIN_ICONS[domain]}`;
+ }
+
+ // fallback
+ return 'mdi:help-circle-outline';
+}
diff --git a/src/lib/Modal/PictureElements/fonts.ts b/src/lib/Modal/PictureElements/fonts.ts
new file mode 100644
index 0000000..86e4ab0
--- /dev/null
+++ b/src/lib/Modal/PictureElements/fonts.ts
@@ -0,0 +1,140 @@
+/**
+ * There is no way to know which fonts are installed on the client...
+ * This compares the width of commonly installed fonts against a baseline
+ */
+export async function getFontList(): Promise {
+ await document.fonts.ready;
+
+ const canvas =
+ typeof OffscreenCanvas !== 'undefined'
+ ? new OffscreenCanvas(0, 0)
+ : document.createElement('canvas');
+
+ const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
+ if (!ctx) return [];
+
+ const test = 'abcdefghijklmnopqrstuvwxyz0123456789';
+ ctx.font = '12px monospace';
+ const baseline = ctx.measureText(test).width;
+
+ return fonts.filter((font) => {
+ ctx.font = `12px "${font}", monospace`;
+ return ctx.measureText(test).width !== baseline;
+ });
+}
+
+/**
+ * Common fonts that might be available
+ */
+const fonts = [
+ 'American Typewriter',
+ 'Andale Mono',
+ 'Arial',
+ 'Arial Black',
+ 'Arial Narrow',
+ 'Arial Rounded MT Bold',
+ 'Arial Unicode MS',
+ 'Avenir',
+ 'Avenir Next',
+ 'Avenir Next Condensed',
+ 'Bahnschrift',
+ 'Baskerville',
+ 'Big Caslon',
+ 'Bodoni 72',
+ 'Bodoni 72 Oldstyle',
+ 'Bodoni 72 Smallcaps',
+ 'Bradley Hand',
+ 'Brush Script MT',
+ 'Calibri',
+ 'Cambria',
+ 'Cambria Math',
+ 'Candara',
+ 'Chalkboard',
+ 'Chalkboard SE',
+ 'Chalkduster',
+ 'Charter',
+ 'Cochin',
+ 'Comic Sans MS',
+ 'Consolas',
+ 'Constantia',
+ 'Copperplate',
+ 'Corbel',
+ 'Courier',
+ 'Courier New',
+ 'DIN Alternate',
+ 'DIN Condensed',
+ 'Didot',
+ 'Ebrima',
+ 'Franklin Gothic Medium',
+ 'Futura',
+ 'Gabriola',
+ 'Gadugi',
+ 'Geneva',
+ 'Georgia',
+ 'Gill Sans',
+ 'Helvetica',
+ 'Helvetica Neue',
+ 'Herculanum',
+ 'Hoefler Text',
+ 'HoloLens MDL2 Assets',
+ 'Impact',
+ 'Ink Free',
+ 'Inter Variable',
+ 'Javanese Text',
+ 'Leelawadee UI',
+ 'Lucida Console',
+ 'Lucida Grande',
+ 'Lucida Sans Unicode',
+ 'Luminari',
+ 'MS Gothic',
+ 'MV Boli',
+ 'Malgun Gothic',
+ 'Marker Felt',
+ 'Marlett',
+ 'Menlo',
+ 'Microsoft Himalaya',
+ 'Microsoft JhengHei',
+ 'Microsoft New Tai Lue',
+ 'Microsoft PhagsPa',
+ 'Microsoft Sans Serif',
+ 'Microsoft Tai Le',
+ 'Microsoft YaHei',
+ 'Microsoft Yi Baiti',
+ 'MingLiU-ExtB',
+ 'Monaco',
+ 'Mongolian Baiti',
+ 'Myanmar Text',
+ 'Nirmala UI',
+ 'Noteworthy',
+ 'Optima',
+ 'Palatino',
+ 'Palatino Linotype',
+ 'Papyrus',
+ 'Phosphate',
+ 'Rockwell',
+ 'Savoye LET',
+ 'Segoe MDL2 Assets',
+ 'Segoe Print',
+ 'Segoe Script',
+ 'Segoe UI',
+ 'Segoe UI Emoji',
+ 'Segoe UI Historic',
+ 'Segoe UI Symbol',
+ 'SignPainter',
+ 'SimSun',
+ 'Sitka',
+ 'Skia',
+ 'Snell Roundhand',
+ 'Symbol',
+ 'Sylfaen',
+ 'Tahoma',
+ 'Times',
+ 'Times New Roman',
+ 'Trattatello',
+ 'Trebuchet MS',
+ 'Verdana',
+ 'Webdings',
+ 'Wingdings',
+ 'Yu Gothic',
+ 'Zapfino'
+];
diff --git a/src/lib/Modal/PictureElements/icons.ts b/src/lib/Modal/PictureElements/icons.ts
new file mode 100644
index 0000000..99fab57
--- /dev/null
+++ b/src/lib/Modal/PictureElements/icons.ts
@@ -0,0 +1,54 @@
+export const icons: Record = {
+ // ActionPanel.svelte
+ tapAction: 'game-icons:click',
+ expand: 'octicon:chevron-down-12',
+ collapse: 'octicon:chevron-up-12',
+ test: 'mdi:call-bell',
+ success: 'mdi:success-bold',
+ fail: 'mdi:alert',
+
+ // ElementsPanel.svelte
+ elements: 'ic:baseline-layers',
+ locked: 'mdi:lock',
+ unlocked: 'mdi:lock-open',
+ delete: 'ic:round-delete',
+ hidden: 'lucide:eye-off',
+ visible: 'lucide:eye',
+ broken: 'mdi:image-broken',
+ group: 'tabler:folder-filled',
+
+ // SelectedAttributes.svelte
+ tip: 'fxemoji:lightbulb',
+ shapes: 'material-symbols-light:shapes',
+
+ // TextPanel.svelte
+ text: 'fluent:text-12-filled',
+ textBox: 'solar:text-selection-bold',
+ letterSpacing: 'tabler:letter-spacing',
+ lineHeight: 'tabler:line-height',
+ bold: 'mdi:format-bold',
+ italic: 'mdi:format-italic',
+ alignLeft: 'bi:text-left',
+ alignCenter: 'bi:text-center',
+ alignRight: 'bi:text-right',
+ ellipsis: 'lucide:ellipsis',
+
+ // Toolbar.svelte
+ default: 'mage:mouse-pointer-fill',
+ pan: 'fa6-solid:hand',
+ zoom: 'streamline:magnifying-glass-solid',
+ 'state-label': 'majesticons:comment-text',
+ 'state-icon': 'mdi:lightbulb',
+ icon: 'mdi:shape',
+ image: 'mdi:image',
+ rectangle: 'ic:round-rectangle',
+ circle: 'material-symbols:circle',
+
+ // TransformAttributes.svelte
+ 'v-guide': 'vaadin:resize-v',
+ 'h-guide': 'vaadin:resize-h',
+ chain: 'akar-icons:link-chain',
+ undo: 'ion:arrow-undo-sharp',
+ redo: 'ion:arrow-redo-sharp',
+ help: 'material-symbols:help-rounded'
+};
diff --git a/src/lib/Modal/PictureElements/konvaBase.ts b/src/lib/Modal/PictureElements/konvaBase.ts
new file mode 100644
index 0000000..1abf771
--- /dev/null
+++ b/src/lib/Modal/PictureElements/konvaBase.ts
@@ -0,0 +1,516 @@
+import Konva from 'konva';
+import { get, type Unsubscriber } from 'svelte/store';
+import { konvaImageCache, states } from '$lib/Stores';
+import type { HassEntities } from 'home-assistant-js-websocket';
+import { getIcon, iconExists, loadIcon, type IconifyIcon } from '@iconify/svelte';
+import type { ContainerConfig } from 'konva/lib/Container';
+import { icons } from '$lib/Modal/PictureElements/icons';
+import { computeIcon } from './computeIcon';
+
+/**
+ * Shared methods for `KonvaViewer` and `KonvaEditor`
+ */
+export class KonvaBase {
+ public stage: Konva.Stage;
+ public layer: Konva.Layer;
+
+ // svg parser
+ private parser = new DOMParser();
+ private serializer = new XMLSerializer();
+
+ // states store
+ protected unsubscribe: Unsubscriber | undefined;
+
+ private defaultIconColor = '#d5d5d5';
+
+ // instance id
+ protected selId: string;
+
+ // browser zoom pixel ratio
+ private devicePixelRatio = window.devicePixelRatio || 1;
+ private visualViewportScale = visualViewport?.scale || 1;
+ private debounceFunction: (event: Event) => void;
+
+ constructor(container: HTMLDivElement, data: ContainerConfig) {
+ const stageData = JSON.stringify(data);
+ this.stage = Konva.Node.create(stageData, container);
+ this.layer = this.stage.findOne('Layer') as Konva.Layer;
+ this.selId = data?.attrs?.id;
+
+ if (this.devicePixelRatio && this.visualViewportScale) {
+ const canvas = this.layer.getCanvas();
+ canvas.setPixelRatio(this.devicePixelRatio * this.visualViewportScale);
+ }
+
+ this.debounceFunction = this.debounce(this.handleScaleChange, 50);
+ visualViewport?.addEventListener('resize', this.debounceFunction);
+ window.addEventListener('resize', this.handleZoomChange);
+ }
+
+ /**
+ * Can be overridden in `KonvaEditor`
+ */
+ protected updateCallback() {
+ // this.update();
+ }
+
+ /**
+ * Helper to check for `Konva.Line` guides
+ */
+ protected isGuide(node: Konva.Node): boolean {
+ return node?.attrs?.type?.includes('-guide');
+ }
+
+ /**
+ * Handles updating `state-icon`
+ * - sets default icon if `entity_id` is missing
+ * - updates `icon` if it doesn't match previous icon
+ * - updates icon `state_color` if icon matches but not color
+ */
+ protected async updateStateIcon(node: Konva.Image, $states: HassEntities | undefined) {
+ const entity_id = node.getAttr('entity_id');
+
+ if (!entity_id) {
+ node.setAttr('icon', icons['state-icon']);
+ node.setAttr('state_color', undefined);
+ this.updateIcon(node);
+ return;
+ }
+
+ if (!$states) $states = get(states);
+
+ const nodeIcon = node.getAttr('icon');
+ const nodeColor = node.getAttr('color');
+ const nodeStateColor = node.getAttr('state_color');
+
+ const computedIcon = computeIcon(entity_id, $states);
+ const entityAttrs = $states?.[entity_id]?.attributes;
+ const computedStateColor = entityAttrs?.hs_color
+ ? `hsl(${entityAttrs?.hs_color}%, 50%)`
+ : undefined;
+
+ node.setAttrs({
+ icon: computedIcon,
+ color: nodeColor,
+ state_color: computedStateColor
+ });
+
+ if (computedIcon && computedIcon !== nodeIcon) {
+ node.setAttrs({
+ icon: computedIcon,
+ color: nodeColor,
+ state_color: computedStateColor
+ });
+ await this.updateIcon(node);
+ } else if (computedStateColor && computedStateColor !== nodeStateColor) {
+ node.setAttr('state_color', computedStateColor);
+ this.updateIconColor(node, computedStateColor);
+ } else if (!computedStateColor) {
+ this.updateIconColor(node, nodeColor);
+ }
+ }
+
+ /**
+ * Handles updating `state-label`
+ * - Updates `text` if it doesn't match previous text
+ * - Sets text to 'unknown' if it can't update
+ */
+ protected updateStateLabel(node: Konva.Text, $states: HassEntities | undefined) {
+ const unknownState = 'unknown';
+ const entity_id = node.getAttr('entity_id');
+
+ if (!entity_id || entity_id?.trim() === '') {
+ if (node.text() !== unknownState) {
+ node.text(unknownState);
+ }
+ return;
+ }
+
+ if (!$states) $states = get(states);
+
+ const entity = $states?.[entity_id];
+ const entityState = entity?.state;
+
+ if (entityState) {
+ if (node.text() !== entityState) node.text(entityState);
+ } else {
+ if (node.text() !== unknownState) node.text(unknownState);
+ }
+ }
+
+ /**
+ * Update image
+ * - Sets gray placeholder on error
+ */
+ protected async updateImage(node: Konva.Image, src: string, fitImage: boolean) {
+ return new Promise((resolve) => {
+ const image = new Image();
+
+ image.onload = () => {
+ node.image(image);
+ node.width(image.naturalWidth);
+ node.height(image.naturalHeight);
+
+ if (fitImage) this.fitImage(node);
+ this.updateCallback();
+ resolve();
+ };
+
+ image.onerror = () => {
+ const canvas = document.createElement('canvas');
+ canvas.width = node.width() || 100;
+ canvas.height = node.height() || 100;
+
+ const ctx = canvas.getContext('2d');
+ if (ctx) {
+ ctx.fillStyle = 'gray';
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ }
+
+ node.image(canvas);
+ resolve();
+ };
+
+ node.setAttr('src', src);
+ image.src = src;
+ });
+ }
+
+ /**
+ * Fits image to canvas
+ * - canvas reference is defined in editor
+ */
+ protected fitImage(node: Konva.Image) {
+ const canvasLayer = this.stage.findOne('Layer') as Konva.Layer;
+ const canvas = canvasLayer.findOne('Rect') as Konva.Rect;
+
+ const padding = 15;
+
+ const centerX = canvas.x() + canvas.width() / 2;
+ const centerY = canvas.y() + canvas.height() / 2;
+
+ const maxWidth = canvas.width() - padding * 2;
+ const maxHeight = canvas.height() - padding * 2;
+ const scale = Math.min(1, maxWidth / node.width(), maxHeight / node.height());
+
+ node.setAttrs({
+ x: centerX - (node.width() * scale) / 2,
+ y: centerY - (node.height() * scale) / 2,
+ scaleX: scale,
+ scaleY: scale
+ });
+
+ node.move({
+ x: -this.layer.x(),
+ y: -this.layer.y()
+ });
+ }
+
+ /**
+ * Helper method to load image
+ */
+ protected async loadImage(src: string): Promise {
+ return new Promise((resolve, reject) => {
+ const image = new Image();
+ image.onload = () => resolve(image);
+ image.onerror = () => reject(new Error(`Failed to load image: ${src}`));
+ image.src = src;
+ });
+ }
+
+ /**
+ * Handles $konvaImageCache store
+ *
+ * Stores images by id so it can be passed
+ * to KonvaEditor without refetching images
+ */
+ protected updateImageCache(id: string, image: HTMLImageElement) {
+ konvaImageCache.update((cache) => {
+ if (!cache[this.selId]) cache[this.selId] = {};
+ cache[this.selId][id] = image;
+ return cache;
+ });
+ }
+
+ /**
+ * Updates icon
+ * - Loads new icon from `handleSvg` data
+ * - Adds it to `$konvaImageCache`
+ * - Update callback for `KonvaEditor`
+ */
+ protected async updateIcon(node: Konva.Image) {
+ if (!node.getAttr('icon')) return;
+
+ const result = await this.handleSvg(node, undefined);
+ if (!result) return;
+ const { width, height, url } = result;
+
+ return new Promise((resolve, reject) => {
+ const image = new Image();
+
+ image.onload = () => {
+ node.image(image);
+ node.setAttrs({ width, height });
+ if (node.getAttr('id')) {
+ this.updateImageCache(node.getAttr('id'), image);
+ }
+ this.updateCallback();
+ resolve();
+ };
+
+ image.onerror = (err) => reject(err);
+ image.src = url;
+ });
+ }
+
+ /**
+ * Sets icon color by decoding svg
+ * uri without fetching icon again
+ */
+ protected updateIconColor(node: Konva.Image, color: string) {
+ const image = node.getAttr('image') as HTMLImageElement;
+ if (!image) return;
+
+ const parts = image.src.split(',');
+ const decoded = decodeURIComponent(parts[1]);
+ const parsed = this.parser.parseFromString(decoded, 'image/svg+xml');
+ const svg = parsed.documentElement;
+
+ svg.style.color = color;
+
+ const svgString = this.serializer.serializeToString(svg);
+ image.src = 'data:image/svg+xml,' + encodeURIComponent(svgString);
+
+ this.updateCallback();
+ }
+
+ /**
+ * Loads iconify data and returns an svg encoded uri
+ * - handles either a `node` or string like 'mdi:dog'
+ * - fetches new icon using iconify api
+ * - handles aspect ratio for non-uniform icons like 'fa6-solid:arrow-down-long'
+ */
+ protected async handleSvg(
+ node: Konva.Image | undefined,
+ icon: string | undefined,
+ color?: string
+ ): Promise<{
+ url: string;
+ width: number;
+ height: number;
+ color: string;
+ } | void> {
+ icon = icon || node?.getAttr('icon');
+
+ if (!icon) {
+ console.error('no icon specified');
+ return;
+ }
+
+ let data: IconifyIcon;
+
+ try {
+ if (iconExists(icon)) {
+ const existingIcon = getIcon(icon);
+ if (existingIcon) {
+ data = existingIcon;
+ } else {
+ data = await loadIcon(icon);
+ }
+ } else {
+ data = await loadIcon(icon);
+ }
+ } catch {
+ data = await loadIcon('mdi:image-broken');
+ }
+
+ const defaultSize = 64;
+ const iconWidth = data?.width || defaultSize;
+ const iconHeight = data?.height || defaultSize;
+ const iconColor = color || node?.getAttr('state_color') || node?.getAttr('color');
+
+ const scalingFactor = defaultSize / Math.max(iconWidth, iconHeight);
+ const maxWidth = Math.round(iconWidth * scalingFactor);
+ const maxHeight = Math.round(iconHeight * scalingFactor);
+
+ const offsetX = (defaultSize - maxWidth) / 2;
+ const offsetY = (defaultSize - maxHeight) / 2;
+ const scale = `${maxWidth / iconWidth}, ${maxHeight / iconHeight}`;
+
+ const svg = `
+
+ `;
+
+ return {
+ url: `data:image/svg+xml,${encodeURIComponent(svg)}`,
+ width: node?.getAttr('width') || defaultSize,
+ height: node?.getAttr('height') || defaultSize,
+ color: iconColor
+ };
+ }
+
+ /**
+ * Explicitly get shape attributes, because
+ * Konva doesn't include default values with `toJSON()` ...
+ */
+ protected getShapeAttrs(node: Konva.Node) {
+ const type = node?.attrs?.type;
+
+ let attrs: Record = {
+ id: node.id(),
+ type: node?.attrs?.type,
+ name: node.name(),
+ x: node.x(),
+ y: node.y(),
+ width: node.width(),
+ height: node.height(),
+ scaleX: node.scaleX(),
+ scaleY: node.scaleY(),
+ rotation: node.rotation(),
+ opacity: node.opacity(),
+ draggable: node.draggable(),
+ listening: node.listening(),
+ visible: node.visible(),
+ prevDraggable: node?.getAttr('prevDraggable')
+ };
+
+ const onclick = node.getAttr('onclick');
+ if (onclick) attrs.onclick = JSON.parse(JSON.stringify(onclick));
+
+ if (node instanceof Konva.Image) {
+ if (type === 'image') {
+ attrs = {
+ ...attrs,
+ image: node.image(),
+ src: node.getAttr('src')
+ };
+ } else if (type === 'icon') {
+ attrs = {
+ ...attrs,
+ image: node.image(),
+ icon: node.getAttr('icon'),
+ color: node.getAttr('color')
+ };
+ } else if (type === 'state-icon') {
+ attrs = {
+ ...attrs,
+ entity_id: node.getAttr('entity_id'),
+ state_color: node.getAttr('state_color'),
+ color: node.getAttr('color')
+ };
+ }
+ } else if (node instanceof Konva.Text) {
+ attrs = {
+ ...attrs,
+ box: !!node?.getAttr('box'),
+ fill: node.fill(),
+ fontFamily: node.fontFamily(),
+ fontSize: node.fontSize(),
+ letterSpacing: node.letterSpacing(),
+ lineHeight: node.lineHeight(),
+ fontStyle: node.fontStyle(),
+ align: node.align(),
+ ellipsis: node.ellipsis()
+ };
+
+ if (!node.getAttr('box')) {
+ attrs.width = undefined;
+ attrs.height = undefined;
+ }
+
+ if (type === 'state-label') {
+ attrs.entity_id = node.getAttr('entity_id');
+ } else if (type !== 'state-label') {
+ attrs.text = node.text();
+ }
+ } else if (node instanceof Konva.Rect) {
+ attrs = {
+ ...attrs,
+ fill: node.fill(),
+ cornerRadius: node.cornerRadius()
+ };
+ } else if (node instanceof Konva.Circle) {
+ attrs = {
+ ...attrs,
+ fill: node.fill(),
+ radius: node.radius()
+ };
+ } else if (node instanceof Konva.Line) {
+ attrs = {
+ ...attrs,
+ points: node.points(),
+ stroke: node.stroke(),
+ strokeWidth: node.strokeWidth(),
+ hitStrokeWidth: node.hitStrokeWidth(),
+ strokeScaleEnabled: node.strokeScaleEnabled()
+ };
+ }
+
+ return attrs;
+ }
+
+ /**
+ * Debounce method for `handleScaleChange()`
+ */
+ private debounce(func: (event: Event) => void, wait: number) {
+ let timeout: ReturnType;
+ return (event: Event) => {
+ clearTimeout(timeout);
+ timeout = setTimeout(() => func(event), wait);
+ };
+ }
+
+ /**
+ * Handles canvas pixel ratio on viewport scale (smart zoom)
+ * by multiplying devicePixelRatio with visualViewport scale
+ */
+ private handleScaleChange = (event: Event) => {
+ const visualViewport = event.target as VisualViewport;
+ const current = visualViewport?.scale;
+ if (this.visualViewportScale !== current) {
+ this.stage.getLayers().forEach((layer) => {
+ if (this.devicePixelRatio && current) {
+ layer.getCanvas().setPixelRatio(this.devicePixelRatio * current);
+ }
+ });
+ this.stage.batchDraw();
+ this.visualViewportScale = current;
+ }
+ };
+
+ /**
+ * Handles canvas pixel ratio on browser zoom (cmd +/-)
+ * by directly applying devicePixelRatio to layers
+ */
+ private handleZoomChange = () => {
+ const current = window.devicePixelRatio;
+ if (current && this.devicePixelRatio !== current) {
+ this.stage.getLayers().forEach((layer) => {
+ layer.getCanvas().setPixelRatio(current);
+ });
+ this.stage.batchDraw();
+ this.devicePixelRatio = current;
+ }
+ };
+
+ /**
+ * Destroy konva
+ */
+ protected destroyBase() {
+ if (visualViewport) {
+ visualViewport.removeEventListener('resize', this.debounceFunction);
+ }
+ window.removeEventListener('resize', this.handleZoomChange);
+ this.stage.destroy();
+ }
+}
diff --git a/src/lib/Modal/PictureElements/konvaEditor.ts b/src/lib/Modal/PictureElements/konvaEditor.ts
new file mode 100644
index 0000000..35e7e97
--- /dev/null
+++ b/src/lib/Modal/PictureElements/konvaEditor.ts
@@ -0,0 +1,2053 @@
+import Konva from 'konva';
+import { KonvaBase } from '$lib/Modal/PictureElements/konvaBase';
+import { get } from 'svelte/store';
+import { states, konvaStore, konvaImageCache } from '$lib/Stores';
+import { tick } from 'svelte';
+import type { Box } from 'konva/lib/shapes/Transformer';
+import type { ContainerConfig } from 'konva/lib/Container';
+import type { ShapeConfig } from 'konva/lib/Shape';
+import type { KonvaMode, KonvaHistory } from '$lib/Types';
+import { icons } from './icons';
+
+/**
+ * Picture elements config
+ */
+export class KonvaEditor extends KonvaBase {
+ // canvas
+ private canvasLayer = new Konva.Layer();
+ public canvas = new Konva.Rect();
+ private readonly canvasWidth = 470;
+ private readonly canvasHeight = 265;
+ private dragDirection: 'x' | 'y' | undefined;
+
+ // mode
+ private mode: KonvaMode = 'default';
+
+ // select
+ private selectionLayer = new Konva.Layer();
+ public transformer = new Konva.Transformer();
+ private selectionRect = new Konva.Rect();
+
+ private x1 = 0;
+ private y1 = 0;
+ private x2 = 0;
+ private y2 = 0;
+
+ private readonly selectionThreshold = 5;
+ private selectionStartX: number = 0;
+ private selectionStartY: number = 0;
+
+ public selecting = false;
+ public shiftPressed: boolean = false;
+ private dragSelecting = false;
+ private selectedShapes: (Konva.Shape | Konva.Group)[] = [];
+
+ // pan
+ private panning = false;
+ public spaceKey = false;
+
+ // zoom
+ private zoomFactor = 1;
+ private readonly minZoom = 0.4;
+ private readonly maxZoom = 40;
+ private currentTween: Konva.Tween | undefined;
+ public altKey = false;
+
+ // history
+ private undoStack: KonvaHistory[] = [];
+ private redoStack: KonvaHistory[] = [];
+ private readonly maxHistory = 50;
+ private applyingState = false;
+
+ // guides
+ private readonly snapOffset = 5;
+ private guides: Konva.Line[] = [];
+
+ constructor(container: HTMLDivElement, data: ContainerConfig) {
+ super(container, data);
+
+ this.handleMount();
+ this.setupCanvas();
+ this.setupTransformer();
+ this.setupEvents();
+ this.subscribeStates();
+
+ // reset zoom on mount to fix grapical issue with zoomToArea
+ const point = { x: this.stage.width() / 2, y: this.stage.height() / 2 };
+ this.setZoom('reset', point);
+
+ this.update();
+ }
+
+ /**
+ * Update $konvaStore to render ui updates
+ */
+ private update() {
+ konvaStore.set({
+ children: this.layer.toObject()?.children || [],
+ selectedShapes: this.selectedShapes.map((shape) => this.getNodeData(shape)),
+ mode: this.mode,
+ undoStack: this.undoStack,
+ redoStack: this.redoStack
+ });
+ }
+
+ /**
+ * Runs update if called from `KonvaBase`
+ */
+ protected updateCallback() {
+ this.update();
+ }
+
+ /**
+ * Handles mount
+ * - handles state-label with no entity_id
+ * - loads images from $konvaImageCache
+ */
+ private async handleMount() {
+ this.layer.find('Text').forEach((node) => {
+ if (node?.attrs?.type === 'state-label' && node instanceof Konva.Text) {
+ this.updateStateLabel(node, undefined);
+ }
+ });
+
+ const images = this.layer.find('Image');
+ const imageCache = get(konvaImageCache)?.[this.selId] || {};
+
+ await Promise.all(
+ images.map(async (node) => {
+ if (node instanceof Konva.Image) {
+ const cachedImage = imageCache[node.id()];
+ const src = node.getAttr('src');
+
+ if (cachedImage instanceof HTMLImageElement) {
+ node.image(cachedImage);
+ } else {
+ await this.updateImage(node, src, false);
+ const image = node.image();
+ if (image instanceof HTMLImageElement && node.id()) {
+ this.updateImageCache(node.id(), image);
+ }
+ }
+ }
+ })
+ );
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Setup canvas layer
+ */
+ private setupCanvas() {
+ this.stage.add(this.canvasLayer);
+ this.canvasLayer.moveToBottom();
+ this.canvasLayer.listening(false);
+
+ this.canvas.setAttrs({
+ x: (this.stage.width() - this.canvasWidth) / 2,
+ y: (this.stage.height() - this.canvasHeight) / 2,
+ width: this.canvasWidth,
+ height: this.canvasHeight,
+ fill: 'rgba(0, 0, 0, 0.2)',
+ stroke: 'rgba(255, 255, 255, 0.25)',
+ strokeWidth: 1,
+ strokeScaleEnabled: false,
+ cornerRadius: 9.6
+ });
+ this.canvasLayer.add(this.canvas);
+
+ this.layer.position({
+ x: this.canvas.x(),
+ y: this.canvas.y()
+ });
+ }
+
+ /**
+ * Setup selection layer
+ * - `rotationSnapTolerance` is half of a `rotationSnap`
+ * - handle dragging corner anchors when shift is pressed
+ * - limit `boundBox` if text node has custom `box` attribute
+ * - add any text `box` event listeners
+ * - add selection rectangle (mouse drag)
+ */
+ private setupTransformer() {
+ this.stage.add(this.selectionLayer);
+ this.selectionLayer.add(this.transformer);
+
+ this.transformer.setAttrs({
+ keepRatio: true,
+ rotationSnapTolerance: 15 / 2
+ });
+
+ this.transformer.on('transformstart transform transformend', (event) => {
+ const activeAnchor = this.transformer.getActiveAnchor();
+ const cornerHandles = ['top-left', 'top-right', 'bottom-left', 'bottom-right'];
+ if (activeAnchor && cornerHandles.includes(activeAnchor)) {
+ this.transformer.shiftBehavior(this.transformer.keepRatio() ? 'inverted' : 'default');
+ }
+
+ this.transformer.setAttr('boundBoxFunc', (oldBox: Box, newBox: Box) => {
+ const shapes = this.transformer.nodes();
+ const textBox = shapes.some((shape) => shape instanceof Konva.Text && shape.getAttr('box'));
+ return textBox && (newBox.width < 0 || newBox.height < 0) ? oldBox : newBox;
+ });
+
+ if (event.type === 'transformend') this.record();
+ this.update();
+ });
+
+ const nodes = this.layer.find('Text') as Konva.Text[];
+ nodes.forEach((node) => {
+ if (node.getAttr('box')) {
+ this.addTextBoxEventListener(node);
+ }
+ });
+
+ this.selectionLayer.add(this.selectionRect);
+ this.selectionRect.setAttrs({
+ stroke: 'rgba(255, 255, 255, 0.75)',
+ strokeWidth: 1,
+ fill: 'rgba(255, 255, 255, 0.025)',
+ visible: false,
+ listening: false,
+ strokeScaleEnabled: false
+ });
+ }
+
+ /**
+ * Adds event listeners
+ * - handle click event
+ * - record history and update on drag event
+ * - handle mousedown/mouseup event
+ * - handle mousemove event
+ * - adds events guides
+ * - add events for alt-duplicate
+ * - adds guide snapping events
+ */
+ private setupEvents() {
+ this.stage.on('click tap dragstart', (event) => this.handleClick(event));
+
+ this.stage.on('add remove dragmove dragend', (event) => {
+ const { type, target } = event;
+
+ if (type === 'dragmove' && this.panning) {
+ this.updateGuidePos();
+ }
+
+ // prevent `record` when panning with guides drawn
+ if (type === 'dragend' && target?.className !== undefined) {
+ this.record();
+ }
+
+ this.update();
+ });
+
+ this.stage.on('mousedown', (event) => this.handleMousedown(event));
+ window.addEventListener('mouseup', this.handleMouseup.bind(this));
+ window.addEventListener('mousemove', this.handleMouseMove.bind(this));
+
+ this.layer
+ .find('Line')
+ .filter((node) => this.isGuide(node))
+ .forEach((node) => this.setupGuideEvents(node as Konva.Line));
+
+ this.layer.on('dragmove', this.handleShiftDragMove);
+
+ this.setupAltDuplicateEvents();
+ this.setupGuideSnap();
+ }
+
+ /**
+ * Updates `v-guide | h-guide` position
+ *
+ * Guides are drawn to fit stage dimensions, so
+ * by zooming or panning they need to be updated
+ */
+ public updateGuidePos = () => {
+ const nodes = this.layer.find('Line').filter((node): node is Konva.Line => this.isGuide(node));
+
+ if (!nodes?.length) {
+ this.guides = [];
+ return;
+ }
+
+ const stagePos = this.stage.position();
+ const scaleX = this.stage.scaleX();
+ const scaleY = this.stage.scaleY();
+
+ this.guides = nodes.map((node) => {
+ if (node?.attrs?.type === 'v-guide') {
+ const lineX = node.points()[0];
+ node.points([
+ lineX,
+ -stagePos.y / scaleY - this.canvas.y(),
+ lineX,
+ (this.stage.height() - stagePos.y) / scaleY - this.canvas.y()
+ ]);
+ } else if (node?.attrs?.type === 'h-guide') {
+ const lineY = node.points()[1];
+ node.points([
+ -stagePos.x / scaleX - this.canvas.x(),
+ lineY,
+ (this.stage.width() - stagePos.x) / scaleX - this.canvas.x(),
+ lineY
+ ]);
+ }
+ return node;
+ });
+ };
+
+ /**
+ * Handle click event
+ * - blurs any active input field so data can be saved
+ * - handle pan and zoom clicks
+ * - handle stage click (no nodes)
+ * - get node parent if group
+ * - handle mutiselect cmd click
+ */
+ private async handleClick(event: Konva.KonvaEventObject) {
+ const activeElement = document?.activeElement;
+ if (activeElement instanceof HTMLInputElement || activeElement instanceof HTMLTextAreaElement) {
+ activeElement.blur();
+ await tick();
+ }
+
+ if (this.mode === 'pan' || this.spaceKey) return;
+
+ if (this.mode === 'zoom') {
+ const pointerPos = this.stage.getPointerPosition();
+ if (pointerPos) {
+ if (!this.altKey) {
+ this.setZoom('in', pointerPos);
+ } else if (this.altKey) {
+ this.setZoom('out', pointerPos);
+ }
+ }
+ return;
+ }
+
+ const target = event.target;
+
+ if (target === this.stage) {
+ this.deselectAll();
+ this.update();
+ return;
+ }
+
+ const getParentNode = (node: Konva.Node) => {
+ const parent = node.getParent();
+ if (parent !== this.layer && parent instanceof Konva.Group) {
+ return getParentNode(parent);
+ }
+ return node;
+ };
+
+ const node = getParentNode(target);
+ if (!node) return;
+
+ if (node.visible() && node.draggable() && !this.isGuide(node)) {
+ const { ctrlKey, metaKey } = event.evt;
+ const cmd = ctrlKey || metaKey;
+ const selected = this.transformer.nodes().indexOf(node) >= 0;
+
+ type Node = Konva.Shape | Konva.Group;
+
+ if (event.type === 'dragstart') {
+ if (!selected) {
+ if (!cmd) {
+ this.transformer.nodes([node]);
+ this.selectedShapes = [node as Node];
+ } else {
+ const nodes = this.transformer.nodes().concat([node]);
+ this.transformer.nodes(nodes);
+ this.selectedShapes = nodes as Node[];
+ }
+ }
+ } else {
+ if (!cmd && !selected) {
+ this.transformer.nodes([node]);
+ this.selectedShapes = [node as Node];
+ } else if (cmd && selected) {
+ const nodes = this.transformer.nodes().slice();
+ nodes.splice(nodes.indexOf(node), 1);
+ this.transformer.nodes(nodes);
+ this.selectedShapes = nodes as Node[];
+ } else if (cmd && !selected) {
+ const nodes = this.transformer.nodes().concat([node]);
+ this.transformer.nodes(nodes);
+ this.selectedShapes = nodes as Node[];
+ }
+ }
+ }
+
+ this.update();
+ }
+
+ /**
+ * Handle mousedown event
+ * - handles panning
+ * - checks if target is `stage` or non-draggable node
+ * - starts selection rectangle
+ */
+ private handleMousedown(event: Konva.KonvaEventObject) {
+ if (this.mode === 'pan' || this.panning) return;
+
+ const draggableNode = (node: Konva.Node): boolean => {
+ if (node.draggable()) return true;
+ const parent = node.getParent();
+ return parent && parent !== this.stage ? draggableNode(parent) : false;
+ };
+
+ const target = event.target;
+ const startSelection = target === this.stage || !draggableNode(target);
+
+ if (startSelection) {
+ event.evt.preventDefault();
+ const pos = this.stage.getPointerPosition();
+ if (pos) {
+ const x = (pos.x - this.stage.x()) / this.zoomFactor;
+ const y = (pos.y - this.stage.y()) / this.zoomFactor;
+ this.x1 = this.x2 = x;
+ this.y1 = this.y2 = y;
+ this.selectionStartX = x;
+ this.selectionStartY = y;
+ }
+
+ this.selectionRect.setAttrs({
+ width: 0,
+ height: 0,
+ visible: false
+ });
+
+ this.selecting = true;
+ this.dragSelecting = false;
+ } else {
+ this.selecting = false;
+
+ if (target instanceof Konva.Shape || target instanceof Konva.Group) {
+ target.setAttr('startPos', { x: target.x(), y: target.y() });
+ }
+ }
+ }
+
+ /**
+ * Handle mouseup event
+ * - handle `zoomToArea`
+ * - select nodes that intersects with selection rectangle
+ */
+ private handleMouseup = (event: MouseEvent) => {
+ this.selecting = false;
+ if (!this.selectionRect.visible()) return;
+ event.preventDefault();
+
+ if (this.mode === 'zoom') {
+ if (this.dragSelecting) {
+ const box = this.selectionRect.getClientRect();
+ const minSize = 15;
+ if (box.width > minSize && box.height > minSize) {
+ this.zoomToArea(box);
+ }
+ }
+ this.selectionRect.visible(false);
+ this.dragSelecting = false;
+ return;
+ }
+
+ const stageRect = this.stage.container().getBoundingClientRect();
+ const scaleX = this.stage.width() / stageRect.width;
+ const scaleY = this.stage.height() / stageRect.height;
+
+ const pos = {
+ x: (event.clientX - stageRect.left) * scaleX,
+ y: (event.clientY - stageRect.top) * scaleY
+ };
+
+ this.x2 = (pos.x - this.stage.x()) / this.zoomFactor;
+ this.y2 = (pos.y - this.stage.y()) / this.zoomFactor;
+
+ this.selectionRect.setAttrs({
+ x: Math.min(this.x1, this.x2),
+ y: Math.min(this.y1, this.y2),
+ width: Math.abs(this.x2 - this.x1),
+ height: Math.abs(this.y2 - this.y1)
+ });
+
+ if (this.mode === 'default') {
+ this.currentTween = new Konva.Tween({
+ node: this.selectionRect,
+ duration: 0.1,
+ opacity: 0,
+ onFinish: () => {
+ this.selectionRect.setAttrs({
+ visible: false,
+ opacity: 1
+ });
+ }
+ }).play();
+ }
+
+ const box = this.selectionRect.getClientRect();
+ const selected = this.layer
+ .getChildren()
+ .filter(
+ (node) =>
+ Konva.Util.haveIntersection(box, node.getClientRect()) &&
+ node.visible() &&
+ node.draggable() &&
+ !this.isGuide(node)
+ );
+
+ this.transformer.nodes(selected);
+ this.selectedShapes = selected as (Konva.Shape | Konva.Group)[];
+
+ this.update();
+ };
+
+ /**
+ * Handle mousemove event
+ * - handles pan
+ * - draws selection rectangle
+ */
+ private handleMouseMove = (event: MouseEvent) => {
+ if (this.mode === 'pan' || this.panning) return;
+ if (!this.selecting) return;
+
+ event.preventDefault();
+
+ const stageRect = this.stage.container().getBoundingClientRect();
+ const scaleX = this.stage.width() / stageRect.width;
+ const scaleY = this.stage.height() / stageRect.height;
+
+ const pos = {
+ x: (event.clientX - stageRect.left) * scaleX,
+ y: (event.clientY - stageRect.top) * scaleY
+ };
+
+ const currentX = (pos.x - this.stage.x()) / this.zoomFactor;
+ const currentY = (pos.y - this.stage.y()) / this.zoomFactor;
+
+ const dx = currentX - this.selectionStartX;
+ const dy = currentY - this.selectionStartY;
+ const distance = Math.sqrt(dx * dx + dy * dy);
+
+ if (distance > this.selectionThreshold / this.zoomFactor) {
+ if (!this.dragSelecting) {
+ this.x1 = currentX;
+ this.y1 = currentY;
+ this.dragSelecting = true;
+ }
+
+ this.x2 = currentX;
+ this.y2 = currentY;
+
+ this.selectionRect.setAttrs({
+ x: Math.min(this.x1, this.x2),
+ y: Math.min(this.y1, this.y2),
+ width: Math.abs(this.x2 - this.x1),
+ height: Math.abs(this.y2 - this.y1),
+ visible: true
+ });
+ }
+ };
+
+ /**
+ * Handles shift drag axis lock
+ */
+ private handleShiftDragMove = (event: Konva.KonvaEventObject) => {
+ const target = event.target;
+ if (!(target instanceof Konva.Shape) && !(target instanceof Konva.Group)) return;
+
+ if (this.shiftPressed) {
+ const startPos = target.getAttr('startPos') || { x: target.x(), y: target.y() };
+
+ if (!this.dragDirection) {
+ const dx = Math.abs(target.x() - startPos.x);
+ const dy = Math.abs(target.y() - startPos.y);
+ this.dragDirection = dx > dy ? 'x' : 'y';
+ }
+
+ if (this.dragDirection === 'x') {
+ target.y(startPos.y);
+ } else {
+ target.x(startPos.x);
+ }
+ } else {
+ this.dragDirection = undefined;
+ }
+ };
+
+ /**
+ * Handles alt-duplicate
+ * - original nodes are already being dragged, so move them to top
+ * - keep clones in place, so it looks like the original node is the clone
+ * - keeps the original layer children node order when cloning
+ */
+ private setupAltDuplicateEvents() {
+ let nodes: (Konva.Shape | Konva.Group)[] = [];
+ let clones: (Konva.Shape | Konva.Group)[] = [];
+ let duplicating = false;
+
+ this.stage.on('dragstart', (event) => {
+ if (!this.altKey || duplicating || event?.target instanceof Konva.Line) return;
+ duplicating = true;
+
+ const children = this.layer.getChildren();
+ nodes = this.selectedShapes
+ .filter((node): node is Konva.Shape | Konva.Group => !this.isGuide(node))
+ .sort((a, b) => children.indexOf(a) - children.indexOf(b));
+
+ const nodeOrder = nodes.map((shape) => shape.zIndex());
+
+ clones = nodes
+ .map((node) => {
+ const clone = node.clone({
+ id: this.generateUniqueId(node?.attrs?.type)
+ });
+
+ if (clone) {
+ this.layer.add(clone);
+
+ if (node instanceof Konva.Image) {
+ const image = node.image();
+
+ if (image instanceof HTMLImageElement) {
+ clone.image(image);
+
+ if (image instanceof HTMLImageElement && clone.id()) {
+ this.updateImageCache(clone.id(), image);
+ }
+ }
+ }
+ }
+ return clone;
+ })
+ .filter((clone): clone is Konva.Shape | Konva.Group => clone !== null);
+
+ clones.forEach((clone, index) => {
+ clone.zIndex(nodeOrder[index]);
+ });
+
+ nodes.forEach((node) => node.moveToTop());
+ });
+
+ this.stage.on('dragend', () => {
+ if (!duplicating) return;
+ duplicating = false;
+ nodes = [];
+ clones = [];
+
+ this.record();
+ this.update();
+ });
+ }
+
+ /**
+ * Sets up event listener for snap functionality
+ * for when dragging shapes in close proximity to guides
+ */
+ private setupGuideSnap() {
+ this.layer.on('dragmove', (event) => {
+ if (this.isGuide(event.target)) return;
+
+ const nodes = this.selectedShapes.filter(
+ (node): node is Konva.Shape | Konva.Group => !this.isGuide(node)
+ );
+
+ const box = this.getSnapBoundingBox(nodes);
+ const points = this.getSnapPoints(box);
+
+ if (points.length) {
+ let offsetX = 0;
+ let offsetY = 0;
+
+ points.forEach((point) => {
+ if (point.orientation === 'v-guide') {
+ switch (point.snap) {
+ case 'start':
+ offsetX = point.pos - box.x;
+ break;
+ case 'center':
+ offsetX = point.pos - (box.x + box.width / 2);
+ break;
+ case 'end':
+ offsetX = point.pos - (box.x + box.width);
+ break;
+ }
+ } else if (point.orientation === 'h-guide') {
+ switch (point.snap) {
+ case 'start':
+ offsetY = point.pos - box.y;
+ break;
+ case 'center':
+ offsetY = point.pos - (box.y + box.height / 2);
+ break;
+ case 'end':
+ offsetY = point.pos - (box.y + box.height);
+ break;
+ }
+ }
+ });
+
+ nodes.forEach((node) => {
+ const pos = node.position();
+ node.position({
+ x: pos.x + offsetX,
+ y: pos.y + offsetY
+ });
+ });
+ }
+ });
+ }
+
+ /**
+ * Calculates bounding box that encloses selected nodes
+ */
+ private getSnapBoundingBox(nodes: (Konva.Shape | Konva.Group)[]) {
+ const boxes = nodes.map((node) => node.getClientRect({ relativeTo: this.layer }));
+
+ const x = Math.min(...boxes.map((box) => box.x));
+ const y = Math.min(...boxes.map((box) => box.y));
+ const width = Math.max(...boxes.map((box) => box.x + box.width)) - x;
+ const height = Math.max(...boxes.map((box) => box.y + box.height)) - y;
+
+ return {
+ x,
+ y,
+ width,
+ height
+ };
+ }
+
+ /**
+ * Subscribes to $states store
+ * and updates 'state-' nodes
+ */
+ subscribeStates() {
+ this.unsubscribe = states.subscribe(($states) => {
+ if (this.layer && $states) {
+ const shapes = this.layer.getChildren(
+ (node) => node.getAttr('entity_id') && node?.attrs?.type?.startsWith('state-')
+ );
+ shapes.forEach((node) => {
+ if (!this.transformer.nodes().includes(node)) {
+ if (node instanceof Konva.Image) {
+ this.updateStateIcon(node, $states);
+ } else if (node instanceof Konva.Text) {
+ this.updateStateLabel(node, $states);
+ }
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * Saves history state
+ */
+ private record() {
+ if (this.applyingState) return;
+
+ const currentState: KonvaHistory = {
+ elements: this.layer.children.map((shape) => this.getNodeData(shape)),
+ selectedShapes: this.selectedShapes.map((shape) => shape.id())
+ };
+
+ const previousState = this.undoStack[this.undoStack.length - 1];
+
+ if (!this.stateEqual(previousState, currentState)) {
+ this.undoStack.push(currentState);
+
+ if (this.undoStack.length > this.maxHistory) {
+ this.undoStack.shift();
+ }
+
+ this.redoStack = [];
+ }
+
+ this.update();
+ }
+
+ /**
+ * Handle undo
+ */
+ public undo() {
+ if (this.undoStack.length > 1) {
+ const currentState = this.undoStack.pop();
+ if (currentState) this.redoStack.push(currentState);
+
+ const previousState = this.undoStack[this.undoStack.length - 1];
+ this.applyState(previousState);
+
+ if (previousState.selectedShapes.length === 0) {
+ this.restoreSelection(this.selectedShapes.map((shape) => shape.id()));
+ }
+
+ this.update();
+ }
+ }
+
+ /**
+ * Handle redo
+ */
+ public redo() {
+ if (this.redoStack.length > 0) {
+ const previousState = this.redoStack.pop();
+
+ if (previousState) {
+ this.undoStack.push(previousState);
+ this.applyState(previousState);
+
+ if (previousState.selectedShapes.length === 0) {
+ this.restoreSelection(this.selectedShapes.map((shape) => shape.id()));
+ }
+
+ this.update();
+ }
+ }
+ }
+
+ /**
+ * Sets state from that point in history
+ */
+ private applyState(state: KonvaHistory) {
+ this.applyingState = true;
+
+ /**
+ * Handles history state
+ * - remove, updates or add nodes
+ */
+ const localHandleState = (layer: Konva.Container, nodes: Konva.Node[]) => {
+ layer.children.slice().forEach((node) => {
+ const exists = nodes.some((item) => item?.attrs?.id === node.id());
+ if (!exists) node.destroy();
+ });
+
+ nodes.forEach(async (item, index) => {
+ if (!item.attrs?.id) return;
+
+ let node = layer.findOne(`#${item?.attrs?.id}`) as Konva.Shape | Konva.Group;
+ if (node) {
+ localUpdateNode(node, item?.attrs);
+ } else {
+ const newNode = await localAddNode(item);
+ if (newNode) {
+ node = newNode;
+ layer.add(node);
+ } else {
+ console.error(`failed to create node with id ${item?.attrs?.id}`);
+ return;
+ }
+ }
+
+ if (node instanceof Konva.Group && 'children' in item) {
+ localHandleState(node, item?.children as Konva.Node[]);
+ }
+
+ node.zIndex(index);
+ });
+ };
+
+ /**
+ * Update node
+ */
+ const localUpdateNode = async (node: Konva.Shape | Konva.Group, attrs: ShapeConfig) => {
+ const onclick = attrs?.onclick;
+ node.setAttr('onclick', onclick ? JSON.parse(JSON.stringify(onclick)) : undefined);
+
+ const type = node?.attrs?.type;
+
+ if (type === 'state-label') {
+ node.setAttrs({ ...attrs, text: node.getAttr('text') });
+ } else if (type === 'state-icon') {
+ node.setAttrs({
+ ...attrs,
+ ...{
+ image: node.getAttr('image'),
+ color: node.getAttr('color'),
+ icon: node.getAttr('icon')
+ }
+ });
+ } else if (node instanceof Konva.Image && ['image', 'icon'].includes(type)) {
+ const src = node.getAttr('src');
+ node.setAttrs(attrs);
+
+ if (attrs?.src !== src) {
+ await this.updateImage(node, attrs?.src, false);
+ const image = node.image();
+ if (image instanceof HTMLImageElement && attrs?.id) {
+ this.updateImageCache(attrs?.id, image);
+ }
+ }
+ } else {
+ node.setAttrs(attrs);
+ }
+ };
+
+ /**
+ * Add node
+ */
+ const localAddNode = async (nodeData: Konva.Node) => {
+ let node: any;
+
+ const attrs = nodeData?.attrs;
+ const type = attrs?.type;
+ switch (type) {
+ case 'state-label':
+ node = new Konva.Text(attrs);
+ this.updateStateLabel(node, undefined);
+ break;
+ case 'text':
+ node = new Konva.Text(attrs);
+ break;
+ case 'rectangle':
+ node = new Konva.Rect(attrs);
+ break;
+ case 'circle':
+ node = new Konva.Circle(attrs);
+ break;
+ case 'v-guide':
+ case 'h-guide':
+ node = new Konva.Line(attrs);
+ this.setupGuideEvents(node);
+ break;
+ case 'group':
+ node = new Konva.Group(attrs);
+ if (
+ nodeData instanceof Konva.Group &&
+ nodeData.children &&
+ Array.isArray(nodeData.children)
+ ) {
+ nodeData.children.forEach((child: Konva.Shape | Konva.Group) => {
+ const childNode = localAddNode(child);
+ if (childNode) node.add(childNode);
+ });
+ }
+ break;
+ case 'image':
+ case 'icon':
+ case 'state-icon': {
+ node = new Konva.Image(attrs);
+
+ const imageCache = get(konvaImageCache)?.[this?.selId]?.[attrs?.id];
+ if (imageCache instanceof HTMLImageElement) {
+ node.image(imageCache);
+ } else {
+ await this.updateImage(node, attrs?.src, false);
+ const image = node.image();
+ if (image instanceof HTMLImageElement && attrs?.id) {
+ this.updateImageCache(attrs?.id, image);
+ }
+ }
+
+ if (type === 'state-icon') {
+ this.updateStateIcon(node as Konva.Image, undefined);
+ } else if (type === 'icon') {
+ this.updateIcon(node as Konva.Image);
+ }
+
+ break;
+ }
+ default:
+ console.error(type, 'type not found');
+ node = new Konva.Shape(attrs);
+ }
+
+ return node;
+ };
+
+ localHandleState(this.layer, state.elements);
+
+ if (state.selectedShapes.length > 0) {
+ this.restoreSelection(state.selectedShapes);
+ }
+
+ this.updateGuidePos();
+ this.applyingState = false;
+ this.update();
+ }
+
+ /**
+ * Restores transformer nodes on redo/undo
+ */
+ private restoreSelection(selectedShapes: string[]) {
+ this.selectedShapes = selectedShapes
+ .map((id) => this.layer.findOne(`#${id}`))
+ .filter(
+ (shape): shape is Konva.Shape | Konva.Group =>
+ shape instanceof Konva.Shape || shape instanceof Konva.Group
+ );
+
+ this.transformer.nodes(this.selectedShapes);
+ }
+
+ /**
+ * Helper method to check history state equality
+ * Prevents duplicate entries if mutiple events are fired
+ */
+ private stateEqual(state1: KonvaHistory, state2: KonvaHistory) {
+ if (!state1) return false;
+
+ if (!this.arraysEqual(state1.selectedShapes, state2.selectedShapes)) return false;
+ if (state1.elements.length !== state2.elements.length) return false;
+
+ return state1.elements.every((node1: Konva.Node, index: number) => {
+ const node2 = state2.elements[index];
+ return this.nodeEqual(node1, node2);
+ });
+ }
+
+ private arraysEqual(arr1: any[], arr2: any[]) {
+ if (arr1.length !== arr2.length) return false;
+ return arr1.every((item, index) => item === arr2[index]);
+ }
+
+ private nodeEqual(node1: any, node2: any) {
+ if (Object.keys(node1).length !== Object.keys(node2).length) return false;
+
+ for (const key in node1) {
+ if (key === 'children') {
+ if (!Array.isArray(node1[key]) || !Array.isArray(node2[key])) return false;
+ if (node1[key].length !== node2[key].length) return false;
+
+ if (
+ !node1[key].every((child: any, index: number) => this.nodeEqual(child, node2[key][index]))
+ ) {
+ return false;
+ }
+ } else if (key === 'attrs') {
+ if (!this.attrsEqual(node1[key], node2[key])) return false;
+ } else if (node1[key] !== node2[key]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ private attrsEqual(attrs1: any, attrs2: any): boolean {
+ const keys1 = Object.keys(attrs1);
+ const keys2 = Object.keys(attrs2);
+
+ if (keys1.length !== keys2.length) return false;
+
+ for (const key of keys1) {
+ if (key === 'onclick') {
+ if (JSON.stringify(attrs1[key]) !== JSON.stringify(attrs2[key])) return false;
+ } else if (attrs1[key] !== attrs2[key]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Duplicate selected shape (with Ctrl+J)
+ */
+ public duplicateSelected() {
+ if (this.selectedShapes.length === 0) return;
+
+ const clones: (Konva.Shape | Konva.Group)[] = [];
+ const layerChildren = this.layer.getChildren();
+
+ const layerOrder = this.selectedShapes.sort(
+ (a, b) => layerChildren.indexOf(a) - layerChildren.indexOf(b)
+ );
+
+ layerOrder.forEach((node) => {
+ const clone = node.clone({
+ id: this.generateUniqueId(node?.attrs?.type)
+ });
+
+ if (clone instanceof Konva.Image && node instanceof Konva.Image) {
+ const image = node.image();
+ if (image instanceof HTMLImageElement && clone.id()) {
+ clone.image(image);
+ this.updateImageCache(clone.id(), image);
+ }
+ }
+
+ this.layer.add(clone);
+ clones.push(clone);
+ });
+
+ if (this.selectedShapes.length === 1) {
+ clones[0].zIndex(this.selectedShapes[0].zIndex() + 1);
+ } else {
+ clones.forEach((clone) => clone.moveToTop());
+ }
+
+ this.selectedShapes = clones;
+ this.transformer.nodes(clones);
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Determines snapping points for the bounding box relative to guide lines
+ */
+ private getSnapPoints(box: { x: number; y: number; width: number; height: number }) {
+ const points: { pos: number; diff: number; snap: string; orientation: string }[] = [];
+
+ const pos = (start: number, size: number) => [
+ { guide: Math.round(start), snap: 'start' },
+ { guide: Math.round(start + size / 2), snap: 'center' },
+ { guide: Math.round(start + size), snap: 'end' }
+ ];
+
+ const nodeEdges = {
+ vertical: pos(box.x, box.width),
+ horizontal: pos(box.y, box.height)
+ };
+
+ const offsetX = this.canvas.width() / 2;
+ const offsetY = this.canvas.height() / 2;
+
+ this.guides.forEach((node) => {
+ if (!node.visible()) return;
+
+ const type = node?.attrs?.type;
+ const vertical = type === 'v-guide';
+ const edges = vertical ? nodeEdges.vertical : nodeEdges.horizontal;
+ const position = vertical ? node.x() + offsetX : node.y() + offsetY;
+
+ edges.forEach((edge) => {
+ const diff = Math.abs(position - edge.guide);
+ if (diff < this.snapOffset / this.stage.scaleX()) {
+ points.push({
+ pos: position,
+ diff: diff,
+ snap: edge.snap,
+ orientation: type
+ });
+ }
+ });
+ });
+
+ return points;
+ }
+
+ /**
+ * Setup special guide events for `v-guide | h-guide`
+ * - handle cursor update
+ * - limit guide x/y position
+ */
+ private setupGuideEvents(node: Konva.Line) {
+ if (!this.isGuide(node)) return;
+
+ node.on('mouseover dragstart', (event) => {
+ if (node.visible() && node.draggable() && !this.selectionRect.isVisible()) {
+ this.updateCursor(event);
+ }
+ });
+
+ node.on('dragmove', () => {
+ if (node.attrs.type === 'v-guide') {
+ node.y(0);
+ } else if (node.attrs.type === 'h-guide') {
+ node.x(0);
+ }
+ });
+
+ node.on('mouseout dragend', (event) => {
+ this.updateCursor();
+ if (event.type === 'dragend') {
+ this.record();
+ }
+ });
+ }
+
+ /**
+ * Updates mouse cursor
+ * - guide
+ * - pan
+ * - zoom
+ * - default
+ */
+ public updateCursor(event?: Konva.KonvaEventObject) {
+ const container = this.stage.container();
+
+ if (event && this.isGuide(event.target)) {
+ const type = event.target?.attrs?.type;
+ container.style.cursor = type === 'v-guide' ? 'col-resize' : 'row-resize';
+ return;
+ }
+
+ if (this.mode === 'pan' || this.panning) {
+ container.style.cursor = 'grab';
+ } else if (this.mode === 'zoom') {
+ container.style.cursor = this.altKey ? 'zoom-out' : 'zoom-in';
+ } else {
+ container.style.cursor = 'default';
+ }
+ }
+
+ /**
+ * Toggles text box attribute
+ * - adds/removes event listener
+ */
+ public toggleTextBox(id: string) {
+ const node = this.layer.findOne(`#${id}`);
+
+ if (node instanceof Konva.Text) {
+ if (node.getAttr('box')) {
+ node.setAttrs({
+ box: false,
+ width: undefined,
+ height: undefined,
+ scaleX: 1,
+ scaleY: 1
+ });
+
+ node.off('transform');
+ this.transformer.setAttr('boundBoxFunc', undefined);
+ } else if (!node.getAttr('box')) {
+ node.setAttrs({
+ box: true,
+ width: node.width() * node.scaleX(),
+ height: node.height() * node.scaleY(),
+ scaleX: 1,
+ scaleY: 1
+ });
+ this.addTextBoxEventListener(node);
+ }
+
+ this.record();
+ this.update();
+ }
+ }
+
+ /**
+ * Adds shape event listener to set fixed scale on text
+ */
+ private addTextBoxEventListener(node: Konva.Text) {
+ node.off('transform');
+
+ node.on('transform', () => {
+ node.setAttrs({
+ width: node.width() * node.scaleX(),
+ height: node.height() * node.scaleY(),
+ scaleX: 1,
+ scaleY: 1
+ });
+ });
+ }
+
+ /**
+ * Fits canvas to stage (double-clicking pan tool)
+ */
+ public fitCanvas() {
+ const padding = 15;
+
+ const stageWidth = this.stage.width() - padding * 2;
+ const stageHeight = this.stage.height() - padding * 2;
+ const scale = Math.min(stageWidth / this.canvasWidth, stageHeight / this.canvasHeight);
+
+ const x = (this.stage.width() - this.canvasWidth * scale) / 2 - this.canvas.x() * scale;
+ const y = (this.stage.height() - this.canvasHeight * scale) / 2 - this.canvas.y() * scale;
+
+ this.currentTween = new Konva.Tween({
+ node: this.stage,
+ duration: 0.15,
+ easing: Konva.Easings.EaseInOut,
+ scaleX: scale,
+ scaleY: scale,
+ x: x,
+ y: y,
+ onUpdate: () => {
+ this.zoomFactor = this.stage.scaleX();
+ this.updateGuidePos();
+ },
+ onFinish: () => {
+ this.currentTween = undefined;
+ }
+ }).play();
+ }
+
+ /**
+ * Move nodes (arrow keys)
+ * - don't record
+ */
+ public moveSelectedShapes(x: number, y: number) {
+ if (this.mode !== 'default' || this.selectedShapes.length === 0) return;
+
+ this.selectedShapes.forEach((node) => {
+ if (node.draggable()) {
+ node.position({
+ x: node.x() + x,
+ y: node.y() + y
+ });
+ }
+ });
+
+ this.update();
+ }
+
+ /**
+ * Helper method for `setAttr`
+ */
+ public async updateAttr(id: string, key: string, value: any, oninput = false) {
+ const node = this.layer.findOne(`#${id}`);
+ if (!node) return;
+
+ const attrs = node.attrs;
+ const type = attrs?.type;
+
+ switch (true) {
+ case key === 'src' && node instanceof Konva.Image:
+ await this.updateImage(node, value, true);
+ break;
+
+ case key === 'icon' && node instanceof Konva.Image:
+ node.setAttr('icon', value);
+ await this.updateIcon(node);
+ break;
+
+ case type === 'state-icon' && key === 'entity_id' && node instanceof Konva.Image:
+ if (value.trim() !== '') {
+ node.setAttr('entity_id', value);
+ this.updateStateIcon(node, undefined);
+ } else {
+ node.setAttrs({
+ entity_id: '',
+ icon: icons['state-icon']
+ });
+
+ await this.updateIcon(node);
+ }
+ break;
+
+ case type === 'state-icon' && key === 'color' && node instanceof Konva.Image:
+ node.setAttr('color', value);
+ this.updateStateIcon(node, undefined);
+ break;
+
+ case type === 'state-label' && key === 'entity_id' && node instanceof Konva.Text:
+ node.setAttr('entity_id', value);
+ this.updateStateLabel(node, undefined);
+ break;
+
+ case type === 'icon' && key === 'color' && node instanceof Konva.Image:
+ node.setAttr('color', value);
+ this.updateIconColor(node, value);
+ break;
+
+ case typeof node.getAttr(key) === 'number': {
+ const parsedValue = parseFloat(value);
+ if (!isNaN(parsedValue)) {
+ if ((key === 'scaleX' || key === 'scaleY') && this.transformer.keepRatio()) {
+ node.setAttrs({
+ scaleX: parsedValue,
+ scaleY: parsedValue
+ });
+ } else if (key === 'opacity') {
+ const opacityRange = Math.max(0, Math.min(100, parsedValue));
+ node.setAttr(key, opacityRange / 100);
+ } else {
+ node.setAttr(key, parsedValue);
+ }
+ }
+ break;
+ }
+
+ default:
+ node.setAttr(key, value);
+ break;
+ }
+
+ if (this.transformer && node instanceof Konva.Text) {
+ this.transformer.forceUpdate();
+ }
+
+ if (!oninput) this.record();
+
+ this.update();
+ }
+
+ /**
+ * Handles node visibility
+ */
+ public toggleVisibility(id?: string) {
+ const nodes = id ? [this.layer.findOne(`#${id}`)] : this.selectedShapes;
+
+ nodes.forEach((node) => {
+ if (node) node.visible(!node.visible());
+ });
+
+ this.transformer.nodes(
+ this.selectedShapes.filter(
+ (node) => node.visible() && node.draggable() && !this.isGuide(node)
+ )
+ );
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Toggles node lock
+ */
+ public toggleDraggable(id?: string) {
+ const nodes = id ? [this.layer.findOne(`#${id}`)] : this.selectedShapes;
+
+ const validNodes = nodes.filter(
+ (shape): shape is Konva.Shape | Konva.Group =>
+ shape instanceof Konva.Shape || shape instanceof Konva.Group
+ );
+
+ if (validNodes.length) {
+ const state = !validNodes[0].draggable();
+
+ validNodes.forEach((node) => {
+ node.draggable(state);
+ node.listening(state);
+ });
+
+ this.transformer.nodes(state ? validNodes.filter((shape) => shape.visible()) : []);
+
+ this.record();
+ this.update();
+ }
+ }
+
+ /**
+ * Toggles shape scale ratio lock
+ */
+ public toggleKeepRatio() {
+ if (this.transformer) {
+ this.transformer.keepRatio(!this.transformer.keepRatio());
+
+ this.update();
+ }
+ }
+
+ /**
+ * Handle node select in elements panel (outside of canvas)
+ * - handles range select (shift)
+ * - handles multi select (cmd)
+ * - handles default click
+ */
+ public handleElementClick(event: MouseEvent, id: string) {
+ const { shiftKey, ctrlKey, metaKey } = event;
+
+ if (shiftKey && this.selectedShapes.length > 0) {
+ const start = this.layer.findOne(`#${this.selectedShapes[0].id()}`) as Konva.Shape;
+ const end = this.layer.findOne(`#${id}`) as Konva.Shape;
+ if (!start && !end) return;
+
+ const nodes = this.layer.getChildren().map((node) => node as Konva.Shape);
+ const startIndex = nodes.indexOf(start);
+ const endIndex = nodes.indexOf(end);
+
+ this.selectedShapes = nodes.slice(
+ Math.min(startIndex, endIndex),
+ Math.max(startIndex, endIndex) + 1
+ );
+ } else if (ctrlKey || metaKey) {
+ const node = this.layer.findOne(`#${id}`) as Konva.Shape;
+ if (!node) return;
+
+ const index = this.selectedShapes.indexOf(node);
+ if (index > -1) {
+ this.selectedShapes.splice(index, 1);
+ } else {
+ this.selectedShapes.push(node);
+ }
+ } else {
+ this.selectShapesById([id]);
+ }
+
+ this.transformer.nodes(
+ this.selectedShapes.filter(
+ (node) => node.visible() && node.draggable() && !this.isGuide(node)
+ )
+ );
+
+ this.update();
+ }
+
+ /**
+ * Selects nodes by ids
+ */
+ public selectShapesById(ids: string[]) {
+ this.selectedShapes = ids
+ .map((id) => this.layer.findOne(`#${id}`))
+ .filter((node) => node instanceof Konva.Shape || node instanceof Konva.Group);
+
+ this.transformer.nodes(
+ this.selectedShapes.filter(
+ (node) => node.visible() && node.draggable() && !this.isGuide(node)
+ )
+ );
+
+ this.update();
+ }
+
+ /**
+ * Selects all nodes (Ctrl+A)
+ */
+ public selectAll() {
+ this.selectedShapes = this.layer.getChildren(
+ (node) => node instanceof Konva.Shape || node instanceof Konva.Group
+ );
+
+ this.transformer.nodes(
+ this.selectedShapes.filter(
+ (node) => node.visible() && node.draggable() && !this.isGuide(node)
+ )
+ );
+
+ this.update();
+ }
+
+ /**
+ * Deselects all nodes
+ */
+ public deselectAll() {
+ this.selectedShapes = [];
+ this.transformer.nodes([]);
+ }
+
+ /**
+ * Delete selected nodes
+ */
+ public deleteSelected() {
+ this.selectedShapes.forEach((node) => {
+ node.destroy();
+ });
+
+ this.deselectAll();
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Reorders nodes with drag and drop
+ */
+ public async reorderElements(shapes: string[]) {
+ shapes.forEach((id, index) => {
+ const node = this.layer.findOne(`#${id}`);
+ if (node) node.zIndex(this.layer.children.length - 1 - index);
+ });
+
+ await tick();
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Handles rotation snapping
+ */
+ public updateRotationSnaps() {
+ const snapPoints = [
+ 0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240, 255, 270, 285,
+ 300, 315, 330, 345
+ ];
+
+ this.transformer.rotationSnaps(this.shiftPressed ? snapPoints : []);
+ }
+
+ /**
+ * Handles group and ungrouping
+ */
+ public handleGroup() {
+ if (this.selectedShapes.length > 1) {
+ this.group();
+ } else if (this.selectedShapes.length === 1 && this.selectedShapes[0] instanceof Konva.Group) {
+ this.ungroup();
+ }
+ }
+
+ /**
+ * Groups nodes
+ */
+ private group() {
+ const nodes = this.selectedShapes
+ .filter((node) => !this.isGuide(node))
+ .sort((a, b) => {
+ return this.layer.children.indexOf(a) - this.layer.children.indexOf(b);
+ });
+
+ if (nodes.length < 2) return;
+
+ const group = new Konva.Group({
+ id: this.generateUniqueId('group'),
+ type: 'group',
+ name: 'Group',
+ draggable: true
+ });
+
+ let index = Infinity;
+
+ nodes.forEach((node) => {
+ index = Math.min(index, this.layer.children.indexOf(node));
+ node.setAttr('prevDraggable', node.draggable());
+ node.draggable(false);
+ node.remove();
+ group.add(node);
+ });
+
+ this.layer.add(group);
+ group.zIndex(index);
+
+ this.selectedShapes = [group];
+ this.transformer.nodes([group]);
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Ungroups nodes
+ */
+ private ungroup() {
+ if (this.selectedShapes.length !== 1 && !(this.selectedShapes[0] instanceof Konva.Group))
+ return;
+
+ const selectedShapes: (Konva.Shape | Konva.Group)[] = [];
+
+ const group = this.selectedShapes[0] as Konva.Group;
+ const groupIndex = this.layer.children.indexOf(group);
+
+ group
+ .getChildren()
+ .map((node) => node as Konva.Shape | Konva.Group)
+ .forEach((node, index) => {
+ node.setAttrs({
+ id: this.generateUniqueId(node?.attrs?.type),
+ draggable: !!node.getAttr('prevDraggable'),
+ prevDraggable: undefined
+ });
+
+ this.layer.add(node);
+ node.zIndex(groupIndex + index);
+
+ selectedShapes.push(node);
+ });
+
+ group.destroy();
+
+ this.selectedShapes = selectedShapes;
+ this.transformer.nodes(selectedShapes);
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * Set tool mode
+ */
+ public setMode(mode: KonvaMode) {
+ this.mode = mode;
+
+ if (mode === 'pan') {
+ this.startPan();
+ } else {
+ this.stopPan();
+ }
+
+ this.update();
+ }
+
+ /**
+ * Starts pan mode (space)
+ */
+ public startPan() {
+ this.panning = true;
+ this.stage.draggable(true);
+
+ this.layer.setAttr('listening', false);
+ this.selectionLayer.setAttr('listening', false);
+
+ this.updateCursor();
+ }
+
+ /**
+ * Stops pan mode (space release)
+ */
+ public stopPan() {
+ this.panning = false;
+ this.stage.draggable(false);
+
+ this.layer.setAttr('listening', this.mode === 'default');
+ this.selectionLayer.setAttr('listening', this.mode === 'default');
+
+ this.updateCursor();
+ }
+
+ /**
+ * Handle zoom
+ * - logarithmic scale otherwise it takes forever to zoom with extreme values
+ */
+ public setZoom(type: 'in' | 'out' | 'reset', point: { x: number; y: number }) {
+ if (this.currentTween) {
+ this.currentTween.finish();
+ this.currentTween = undefined;
+ }
+
+ let scale;
+
+ if (type === 'reset') {
+ scale = 1;
+ } else {
+ const duration = 0.4;
+ const zoomFactor = this.zoomFactor * Math.exp(duration * (type === 'in' ? 1 : -1));
+ scale = Math.exp(
+ Math.min(Math.max(Math.log(zoomFactor), Math.log(this.minZoom)), Math.log(this.maxZoom))
+ );
+ }
+
+ this.currentTween = new Konva.Tween({
+ node: this.stage,
+ duration: 0.15,
+ easing: Konva.Easings.StrongEaseOut,
+ x: point.x - (point.x - this.stage.x()) * (scale / this.zoomFactor),
+ y: point.y - (point.y - this.stage.y()) * (scale / this.zoomFactor),
+ scaleX: scale,
+ scaleY: scale,
+ onUpdate: () => {
+ this.zoomFactor = this.stage.scaleX();
+ this.updateGuidePos();
+ },
+ onFinish: () => {
+ this.currentTween = undefined;
+ }
+ }).play();
+ }
+
+ /**
+ * Zooms to area within selection rectangle
+ */
+ private zoomToArea(box: { x: number; y: number; width: number; height: number }) {
+ if (this.altKey) return;
+
+ box = {
+ x: (box.x - this.stage.x()) / this.zoomFactor,
+ y: (box.y - this.stage.y()) / this.zoomFactor,
+ width: box.width / this.zoomFactor,
+ height: box.height / this.zoomFactor
+ };
+
+ const centerX = box.x + box.width / 2;
+ const centerY = box.y + box.height / 2;
+
+ const scaleX = this.stage.width() / box.width;
+ const scaleY = this.stage.height() / box.height;
+ const scale = Math.min(Math.max(Math.min(scaleX, scaleY), this.minZoom), this.maxZoom);
+
+ this.currentTween = new Konva.Tween({
+ node: this.stage,
+ duration: 0.25,
+ easing: Konva.Easings.StrongEaseOut,
+ x: this.stage.width() / 2 - centerX * scale,
+ y: this.stage.height() / 2 - centerY * scale,
+ scaleX: scale,
+ scaleY: scale,
+ onUpdate: () => {
+ this.zoomFactor = this.stage.scaleX();
+ this.updateGuidePos();
+ },
+ onFinish: () => {
+ this.currentTween = undefined;
+ }
+ }).play();
+ }
+
+ /**
+ * Add state-label
+ */
+ public addStateLabel() {
+ const node = new Konva.Text({
+ type: 'state-label',
+ name: 'State Label',
+ entity_id: '',
+ fontSize: 60,
+ fill: '#ffffff',
+ fontStyle: 'normal',
+ fontFamily: 'Inter Variable',
+ draggable: true
+ });
+
+ this.updateStateLabel(node, undefined);
+
+ this.handleAddNode(node);
+ }
+
+ /**
+ * Adds state-icon
+ */
+ public async addStateIcon() {
+ try {
+ const icon = icons['state-icon'];
+ const color = '#d5d5d5';
+
+ const result = await this.handleSvg(undefined, icon, color);
+
+ if (!result) return;
+
+ const { width, height, url } = result;
+
+ const image = await this.loadImage(url);
+
+ const node = new Konva.Image({
+ type: 'state-icon',
+ name: 'State Icon',
+ entity_id: '',
+ icon,
+ color,
+ image,
+ width,
+ height,
+ draggable: true
+ });
+
+ this.handleAddNode(node);
+ } catch (err) {
+ console.error('error adding state-icon:', err);
+ }
+ }
+
+ /**
+ * Add text
+ */
+ public addText() {
+ const node = new Konva.Text({
+ type: 'text',
+ name: 'Text',
+ text: 'Text',
+ fontSize: 60,
+ fill: '#ffffff',
+ fontFamily: 'Inter Variable',
+ draggable: true,
+ align: 'left'
+ });
+
+ this.handleAddNode(node);
+ }
+
+ /**
+ * Add icon
+ */
+ public async addIcon() {
+ try {
+ const icon = icons['icon'];
+ const color = '#d5d5d5';
+
+ const result = await this.handleSvg(undefined, icon, color);
+
+ if (!result) return;
+
+ const { width, height, url } = result;
+
+ const image = await this.loadImage(url);
+
+ const node = new Konva.Image({
+ type: 'icon',
+ name: 'Icon',
+ icon: icon,
+ color: color,
+ image: image,
+ width: width,
+ height: height,
+ draggable: true
+ });
+
+ this.handleAddNode(node);
+ } catch (err) {
+ console.error('error adding icon:', err);
+ }
+ }
+
+ /**
+ * Add image
+ */
+ public async addImage() {
+ const src = '/favicon.png';
+
+ try {
+ const image = await this.loadImage(src);
+
+ const node = new Konva.Image({
+ type: 'image',
+ name: 'Image',
+ image: image,
+ src: src,
+ width: image.naturalWidth || 64,
+ height: image.naturalHeight || 64,
+ draggable: true
+ });
+
+ this.handleAddNode(node);
+ } catch (err) {
+ console.error('error adding image:', err);
+ }
+ }
+
+ /**
+ * Add rectangle
+ */
+ public addRectangle() {
+ const node = new Konva.Rect({
+ type: 'rectangle',
+ name: 'Rectangle',
+ width: 150,
+ height: 80,
+ fill: '#ffffff',
+ draggable: true
+ });
+
+ this.handleAddNode(node);
+ }
+
+ /**
+ * Add circle
+ */
+ public addCircle() {
+ const node = new Konva.Circle({
+ type: 'circle',
+ name: 'Circle',
+ radius: 50,
+ fill: '#ffffff',
+ draggable: true
+ });
+
+ this.handleAddNode(node);
+ }
+
+ /**
+ * Add v-guide
+ */
+ public addVerticalGuide() {
+ const stageHeight = this.stage.height();
+ const centerX = this.canvasWidth / 2;
+ const topY = -(stageHeight - this.canvasHeight) / 2;
+ const bottomY = stageHeight / 2 + this.canvasHeight / 2;
+
+ const node = new Konva.Line({
+ type: 'v-guide',
+ points: [centerX, topY, centerX, bottomY],
+ stroke: '#75fcfd',
+ name: 'Vertical Guide',
+ strokeWidth: 1,
+ hitStrokeWidth: 8,
+ draggable: true,
+ strokeScaleEnabled: false
+ });
+
+ this.handleAddNode(node);
+ }
+
+ /**
+ * Add h-guide
+ */
+ public addHorizontalGuide() {
+ const stageWidth = this.stage.width();
+ const centerY = this.canvasHeight / 2;
+ const leftX = -(stageWidth - this.canvasWidth) / 2;
+ const rightX = stageWidth / 2 + this.canvasWidth / 2;
+
+ const node = new Konva.Line({
+ type: 'h-guide',
+ points: [leftX, centerY, rightX, centerY],
+ stroke: '#75fcfd',
+ name: 'Horizontal Guide',
+ strokeWidth: 1,
+ hitStrokeWidth: 8,
+ draggable: true,
+ strokeScaleEnabled: false
+ });
+
+ this.handleAddNode(node);
+ }
+
+ /**
+ * Handle add node
+ */
+ private handleAddNode(node: Konva.Shape) {
+ const type = node?.attrs?.type;
+
+ node.setAttrs({
+ id: this.generateUniqueId(type)
+ });
+
+ if (node instanceof Konva.Circle)
+ node.position({
+ x: this.canvasWidth / 2,
+ y: this.canvasHeight / 2
+ });
+ else if (!this.isGuide(node)) {
+ node.position({
+ x: (this.canvasWidth - node.width()) / 2,
+ y: (this.canvasHeight - node.height()) / 2
+ });
+ }
+
+ if (type === 'image' && node instanceof Konva.Image) {
+ this.fitImage(node);
+ }
+
+ this.layer.add(node);
+
+ if (this.isGuide(node) && node instanceof Konva.Line) {
+ this.setupGuideEvents(node);
+ this.updateGuidePos();
+ } else {
+ this.selectedShapes = [node];
+ this.transformer.nodes([node]);
+ }
+
+ this.record();
+ this.update();
+ }
+
+ /**
+ * onDestroy helper to record data
+ */
+ public getElementsData() {
+ return this.layer.getChildren().map((node) => this.getNodeData(node));
+ }
+
+ /**
+ * Get node
+ * - removes image attribute because it can't be serialized
+ * - removes state-icon color
+ * - handles nested group nodes
+ */
+ private getNodeData(node: Konva.Node) {
+ const attrs = this.getShapeAttrs(node);
+
+ delete attrs.image;
+ if (attrs.type === 'state-icon') delete attrs.state_color;
+
+ const data: any = {
+ attrs,
+ className: node.getClassName()
+ };
+
+ if (node instanceof Konva.Group) {
+ data.children = node.getChildren().map((child) => this.getNodeData(child));
+ }
+
+ return data;
+ }
+
+ private generateUniqueId(type: string) {
+ const timestamp = Date.now();
+ const randomPart = Math.random().toString(36).slice(2, 11);
+ return `${type}-${timestamp}-${randomPart}`;
+ }
+
+ /**
+ * Destroy editor
+ */
+ public destroyEditor() {
+ window.removeEventListener('mousemove', this.handleMouseMove);
+ window.removeEventListener('mouseup', this.handleMouseup);
+ this.unsubscribe?.();
+ super.destroyBase();
+ }
+}
diff --git a/src/lib/Modal/PictureElements/konvaViewer.ts b/src/lib/Modal/PictureElements/konvaViewer.ts
new file mode 100644
index 0000000..0db4710
--- /dev/null
+++ b/src/lib/Modal/PictureElements/konvaViewer.ts
@@ -0,0 +1,314 @@
+import Konva from 'konva';
+import { KonvaBase } from '$lib/Modal/PictureElements/konvaBase';
+import { get } from 'svelte/store';
+import { editMode, states, connection } from '$lib/Stores';
+import { callService } from 'home-assistant-js-websocket';
+import type { ContainerConfig } from 'konva/lib/Container';
+
+/**
+ * Picture elements
+ */
+export class KonvaViewer extends KonvaBase {
+ constructor(container: HTMLDivElement, data: ContainerConfig) {
+ super(container, data);
+
+ this.handleMount();
+ this.subscribeStates();
+ }
+
+ /**
+ * Handles mount
+ * - removes guides and hidden shapes
+ * - disables `draggable` attribute
+ * - handles state-label with no entity_id
+ * - loads images and icons
+ * - updates $konvaImageCache
+ */
+ private async handleMount() {
+ this.layer
+ .getChildren((node) => node instanceof Konva.Shape || node instanceof Konva.Group)
+ .forEach((node) => {
+ if (!node.isVisible() || this.isGuide(node)) {
+ node.remove();
+ } else {
+ this.handleNodeClick(node);
+
+ if (node?.attrs?.type === 'state-label' && node instanceof Konva.Text) {
+ this.updateStateLabel(node, undefined);
+ }
+ }
+ });
+
+ await Promise.all(
+ this.layer.find('Image').map(async (node) => {
+ if (node instanceof Konva.Image) {
+ const type = node.attrs.type;
+ switch (type) {
+ case 'icon':
+ case 'state-icon':
+ await this.updateIcon(node);
+ break;
+ case 'image':
+ await this.updateImage(node, node.getAttr('src'), false);
+ if (node.getAttr('id')) {
+ const image = node.image();
+ if (image instanceof HTMLImageElement) {
+ this.updateImageCache(node.getAttr('id'), image);
+ }
+ }
+ break;
+ }
+ }
+ })
+ );
+
+ // update state-icon again when everything's loaded
+ await Promise.all(
+ this.layer.find('Image').map(async (node) => {
+ if (node instanceof Konva.Image && node.attrs.type === 'state-icon') {
+ await this.updateStateIcon(node, undefined);
+ }
+ })
+ );
+ }
+
+ /**
+ * Subscribes to $states store
+ * and updates 'state-' shapes
+ */
+ private subscribeStates() {
+ this.unsubscribe = states.subscribe(($states) => {
+ if (this.layer && $states) {
+ const nodes = this.layer.getChildren(
+ (node) => node.getAttr('entity_id') && node?.attrs?.type?.startsWith('state-')
+ );
+ nodes.forEach((node) => {
+ if (node instanceof Konva.Image) {
+ this.updateStateIcon(node, $states);
+ } else if (node instanceof Konva.Text) {
+ this.updateStateLabel(node, $states);
+ }
+ });
+ }
+ });
+ }
+
+ /**
+ * Handle click events
+ */
+ private handleNodeClick(node: Konva.Node) {
+ const onclick = node.getAttr('onclick');
+
+ node.listening(!!onclick);
+ node.draggable(false);
+ node.off('mouseenter mouseleave click tap');
+
+ if (onclick && typeof onclick === 'object') {
+ const setCursor = (cursor: string) => {
+ this.stage.container().style.cursor = get(editMode) ? 'unset' : cursor;
+ };
+
+ node.on('mouseenter', () => setCursor('pointer'));
+ node.on('mouseleave', () => setCursor('default'));
+
+ node.on('click tap', async () => {
+ if (get(editMode)) return;
+
+ const conn = get(connection);
+ if (!conn) {
+ console.error('No connection', conn);
+ return;
+ }
+
+ const { domain, service, data, target } = onclick;
+
+ if (!domain || !service) {
+ console.error('Invalid service call', onclick);
+ return;
+ }
+
+ const pos = this.stage.getPointerPosition();
+ if (pos) this.ripple(pos.x, pos.y);
+
+ try {
+ await callService(conn, domain, service, data, target);
+ } catch (err) {
+ console.error('Error calling service:', err);
+ }
+ });
+ }
+ }
+
+ /**
+ * Updates layer children
+ * - removes nonexistent nodes
+ * - updates or creates nodes
+ * - updates $konvaImageCache
+ */
+ public async updateLayerChildren(data: any[]) {
+ this.layer
+ .getChildren((node) => !data.some((nodeData) => nodeData?.attrs?.id === node.getAttr('id')))
+ .forEach((node) => node.destroy());
+
+ await Promise.all(
+ data
+ .filter((nodeData) => !this.isGuide(nodeData))
+ .map(async (nodeData, index) => {
+ let node = this.layer.findOne(`#${nodeData?.attrs?.id}`) as Konva.Node;
+ if (node) {
+ await this.updateNode(node, nodeData);
+ } else {
+ node = await this.createNode(nodeData);
+ this.layer.add(node as Konva.Shape | Konva.Group);
+ }
+ if (node) {
+ node.zIndex(index);
+
+ if (node instanceof Konva.Image && node.getAttr('id')) {
+ const image = node.image();
+ if (image instanceof HTMLImageElement) {
+ this.updateImageCache(node.getAttr('id'), image);
+ }
+ }
+ }
+ })
+ );
+ }
+
+ /**
+ * Handle node updates
+ * - updates `onclick` attribute
+ * - updates node attributes
+ * - loads any icons/images
+ *
+ * does not update reactive attributes:
+ * - state-label `text`
+ * - state-icon `image`, `icon` and `state_color`
+ */
+ private async updateNode(node: Konva.Node, nodeData: Konva.Node) {
+ const onclick = nodeData?.attrs?.onclick;
+ node.setAttr('onclick', onclick ? JSON.parse(JSON.stringify(onclick)) : undefined);
+
+ const type = node?.attrs?.type;
+ if (type === 'state-label' && node instanceof Konva.Text) {
+ node.setAttrs({
+ ...nodeData?.attrs,
+ text: node.getAttr('text')
+ });
+ } else if (type === 'state-icon' && node instanceof Konva.Image) {
+ node.setAttrs({
+ ...nodeData?.attrs,
+ ...{
+ image: node.getAttr('image'),
+ icon: node.getAttr('icon'),
+ state_color: node.getAttr('state_color')
+ }
+ });
+ } else {
+ node.setAttrs(nodeData?.attrs);
+ }
+
+ if (node instanceof Konva.Image) {
+ if (type === 'state-icon') {
+ await this.updateStateIcon(node, undefined);
+ } else if (type === 'icon') {
+ await this.updateIcon(node);
+ } else if (type === 'image') {
+ await this.updateImage(node, node.getAttr('src'), false);
+ }
+ }
+
+ this.handleNodeClick(node);
+ }
+
+ /**
+ * Handle node creation
+ */
+ private async createNode(nodeData: Konva.Node) {
+ let node;
+
+ const attrs = nodeData?.attrs;
+ const type = attrs?.type;
+ switch (type) {
+ case 'state-label':
+ node = new Konva.Text(attrs);
+ this.updateStateLabel(node, undefined);
+ break;
+ case 'state-icon':
+ node = new Konva.Image(attrs);
+ this.updateStateIcon(node, undefined);
+ break;
+ case 'text':
+ node = new Konva.Text(attrs);
+ break;
+ case 'icon':
+ node = new Konva.Image(attrs);
+ await this.updateIcon(node);
+ break;
+ case 'image':
+ node = new Konva.Image(attrs);
+ await this.updateImage(node, attrs?.src, false);
+ break;
+ case 'rectangle':
+ node = new Konva.Rect(attrs);
+ break;
+ case 'circle':
+ node = new Konva.Circle(attrs);
+ break;
+ case 'group':
+ node = new Konva.Group(attrs);
+ if ('children' in nodeData && Array.isArray(nodeData?.children)) {
+ for (const child of nodeData.children) {
+ // recursive
+ const childNode = await this.createNode(child);
+ node.add(childNode);
+ }
+ }
+ break;
+ default:
+ console.error(type, 'type not found');
+ node = new Konva.Shape(attrs);
+ }
+
+ this.handleNodeClick(node);
+
+ return node;
+ }
+
+ /**
+ * Handle ripple effect
+ */
+ private ripple(x: number, y: number) {
+ const shape = new Konva.Circle({
+ x,
+ y,
+ fill: 'rgba(255, 255, 255, 0.75)'
+ });
+
+ this.layer.add(shape);
+
+ const duration = 380;
+ const radius = 35;
+
+ const animation = new Konva.Animation((frame) => {
+ if (!frame) return;
+
+ const progress = Math.min(frame.time / duration, 1);
+ shape.radius(Konva.Easings.StrongEaseOut(progress, 0, radius, 1));
+ shape.opacity(Konva.Easings.StrongEaseOut(progress, 1, -1, 1));
+
+ if (progress >= 1) {
+ animation.stop();
+ shape.destroy();
+ }
+ }, this.layer).start();
+ }
+
+ /**
+ * Destroy konva
+ */
+ public destroyViewer() {
+ this.unsubscribe?.();
+ super.destroyBase();
+ }
+}
diff --git a/src/lib/Modal/TodoModal.svelte b/src/lib/Modal/TodoModal.svelte
index e579602..090c5fd 100644
--- a/src/lib/Modal/TodoModal.svelte
+++ b/src/lib/Modal/TodoModal.svelte
@@ -26,8 +26,7 @@
$: dndOptions = {
flipDurationMs: $motion,
dropTargetStyle: {},
- zoneTabIndex: -1,
- centreDraggedOnCursor: false
+ zoneTabIndex: -1
};
/**
diff --git a/src/lib/Modal/VisibilityConfig/Index.svelte b/src/lib/Modal/VisibilityConfig/Index.svelte
index 7121ff2..fdf03dc 100644
--- a/src/lib/Modal/VisibilityConfig/Index.svelte
+++ b/src/lib/Modal/VisibilityConfig/Index.svelte
@@ -114,9 +114,9 @@
item.condition === 'screen'
? [{ id: item.id, media_query: item.media_query }]
: item.condition === 'and' || item.condition === 'or'
- ? item.conditions
+ ? (item.conditions
?.filter((cond) => cond.condition === 'screen')
- .map(({ id, media_query }) => ({ id, media_query })) ?? []
+ .map(({ id, media_query }) => ({ id, media_query })) ?? [])
: []
);
diff --git a/src/lib/Modal/trapFocus.ts b/src/lib/Modal/trapFocus.ts
index 668ea59..f98935e 100644
--- a/src/lib/Modal/trapFocus.ts
+++ b/src/lib/Modal/trapFocus.ts
@@ -5,9 +5,7 @@
export function trapFocus(node: HTMLElement) {
function focusable() {
return Array.from(
- node.querySelectorAll(
- 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
- )
+ node.querySelectorAll('button:not([tabindex="-1"]), [href], input, select, textarea')
).map((element) => element as HTMLElement);
}
diff --git a/src/lib/Sidebar/Notifications.svelte b/src/lib/Sidebar/Notifications.svelte
index b27a61d..8d0faa8 100644
--- a/src/lib/Sidebar/Notifications.svelte
+++ b/src/lib/Sidebar/Notifications.svelte
@@ -37,7 +37,6 @@
// markdown modify local links
marked.use({
- useNewRenderer: true,
renderer: {
link(token) {
let href = token?.href || '#';
diff --git a/src/lib/Stores.ts b/src/lib/Stores.ts
index de94b95..6b09f39 100644
--- a/src/lib/Stores.ts
+++ b/src/lib/Stores.ts
@@ -5,7 +5,9 @@ import type {
PersistentNotification,
Template,
Translations,
- Views
+ Views,
+ KonvaStore,
+ KonvaImageCache
} from '$lib/Types';
import type {
Connection,
@@ -180,3 +182,14 @@ export const event = writable();
export const persistentNotifications = writable<{
[notificationId: string]: PersistentNotification;
}>({});
+
+// konva
+export const konvaImageCache = writable({});
+
+export const konvaStore = writable({
+ children: [],
+ selectedShapes: [],
+ mode: 'default',
+ undoStack: [],
+ redoStack: []
+});
diff --git a/src/lib/Types.ts b/src/lib/Types.ts
index 8df6257..94a261e 100644
--- a/src/lib/Types.ts
+++ b/src/lib/Types.ts
@@ -1,3 +1,6 @@
+import type Konva from 'konva';
+import type { ShapeConfig } from 'konva/lib/Shape';
+
// configuration.yaml
export interface Configuration {
@@ -280,3 +283,24 @@ export interface YouTubeEvent {
timestamp?: number;
error?: any;
}
+
+export type KonvaMode = 'default' | 'pan' | 'zoom';
+
+export interface KonvaImageCache {
+ [selId: string]: {
+ [id: string]: HTMLImageElement;
+ };
+}
+
+export interface KonvaHistory {
+ elements: Konva.Node[];
+ selectedShapes: string[];
+}
+
+export interface KonvaStore {
+ children: Konva.Node[];
+ selectedShapes: ShapeConfig[];
+ mode: KonvaMode;
+ undoStack: KonvaHistory[];
+ redoStack: KonvaHistory[];
+}
diff --git a/src/lib/Utils.ts b/src/lib/Utils.ts
index cfe8052..27e6fed 100644
--- a/src/lib/Utils.ts
+++ b/src/lib/Utils.ts
@@ -1,5 +1,5 @@
import type { HassEntity } from 'home-assistant-js-websocket';
-import type { Dashboard } from '$lib/Types';
+import type { Dashboard, Section } from '$lib/Types';
/**
* Updates a selected object's property based on the event or direct value.
@@ -23,12 +23,36 @@ export function updateObj(sel: any, key: string, event?: any) {
* It first searches within the sidebar, then the views sections
*/
export function getSelected(id: number | undefined, data: Dashboard) {
- return (
- data.sidebar.find((item) => item.id === id) ||
- data.views?.find((view) =>
- view.sections?.flatMap((section) => section.items).find((item) => item?.id === id)
- )
- );
+ if (data.sidebar) {
+ const sidebarItem = data.sidebar.find((item) => item.id === id);
+ if (sidebarItem) return sidebarItem;
+ }
+
+ if (data.views) {
+ for (const view of data.views) {
+ if (view.sections) {
+ const result = findInSections(view.sections, id);
+ if (result) return result;
+ }
+ }
+ }
+
+ return undefined;
+}
+
+function findInSections(sections: Section[], id: number | undefined): any {
+ for (const section of sections) {
+ if (section.items) {
+ for (const item of section.items) {
+ if (item.id === id) return item;
+ }
+ }
+ if (section.type === 'horizontal-stack' && section.sections) {
+ const result = findInSections(section.sections, id);
+ if (result) return result;
+ }
+ }
+ return undefined;
}
/**
diff --git a/static/translations/af.json b/static/translations/af.json
index 3c677b8..71ec615 100644
--- a/static/translations/af.json
+++ b/static/translations/af.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Posisie",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "Opstellings",
diff --git a/static/translations/ar.json b/static/translations/ar.json
index d71839d..1ca8971 100644
--- a/static/translations/ar.json
+++ b/static/translations/ar.json
@@ -175,6 +175,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "\u0635\u0648\u0631\u0629",
+ "picture_elements": "\u0639\u0646\u0627\u0635\u0631 \u0627\u0644\u0635\u0648\u0631\u0629",
"position": "\u0645\u0648\u0636\u0639",
"precision": "\u062f\u0642\u0629",
"preview": "\u0645\u0639\u0627\u064a\u0646\u0629 \u0645\u062e\u0637\u0637",
@@ -193,7 +194,6 @@
"section": "Section",
"sensor": "\u0645\u0633\u062a\u0634\u0639\u0631",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a",
diff --git a/static/translations/bg.json b/static/translations/bg.json
index ac7ddb8..87b27d4 100644
--- a/static/translations/bg.json
+++ b/static/translations/bg.json
@@ -156,7 +156,7 @@
"invalid_auth": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e \u0438\u043c\u0435 \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u0430",
"invalid_code": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043a\u043e\u0434 \u0437\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u044f",
"invalid_timestamp": "Invalid timestamp",
- "javascript_module": "JavaScript module",
+ "javascript_module": "JavaScript \u043c\u043e\u0434\u0443\u043b",
"key_missing": "\u041b\u0438\u043f\u0441\u0432\u0430 \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u043d\u0438\u044f\u0442 \u043a\u043b\u044e\u0447 \"{key}\".",
"language": "\u0415\u0437\u0438\u043a",
"last_triggered": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u0430\u043d\u0435",
@@ -224,6 +224,7 @@
"period_month": "\u041c\u0435\u0441\u0435\u0446",
"period_week": "\u0421\u0435\u0434\u043c\u0438\u0446\u0430",
"picture": "\u0421\u043d\u0438\u043c\u043a\u0430",
+ "picture_elements": "\u0415\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u0430",
"playing": "\u0412\u044a\u0437\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0436\u0434\u0430\u043d\u0435",
"position": "\u041f\u043e\u0437\u0438\u0446\u0438\u044f",
"precision": "\u041f\u0440\u0435\u0446\u0438\u0437\u043d\u043e\u0441\u0442 \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u044f",
@@ -244,7 +245,6 @@
"section": "\u0420\u0430\u0437\u0434\u0435\u043b",
"sensor": "\u0421\u0435\u043d\u0437\u043e\u0440",
"service": "\u0423\u0441\u043b\u0443\u0433\u0430",
- "service_data": "Service data",
"set_state": "\u0417\u0430\u0434\u0430\u0432\u0430\u043d\u0435 \u043d\u0430 \u0441\u044a\u0441\u0442\u043e\u044f\u043d\u0438\u0435",
"set_white": "Set white",
"settings": "\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438",
@@ -261,7 +261,7 @@
"standby": "\u0412 \u0433\u043e\u0442\u043e\u0432\u043d\u043e\u0441\u0442",
"start": "\u0421\u0442\u0430\u0440\u0442",
"start_mowing": "Start mowing",
- "start_over": "Start over",
+ "start_over": "\u0417\u0430\u043f\u043e\u0447\u043d\u0438 \u043e\u0442\u043d\u0430\u0447\u0430\u043b\u043e",
"start_pause": "\u0421\u0442\u0430\u0440\u0442/\u041f\u0430\u0443\u0437\u0430",
"state": "State",
"state_equal": "\u0421\u044a\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u0442\u043e \u0435 \u0435\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e \u043d\u0430",
diff --git a/static/translations/bn.json b/static/translations/bn.json
index 842d8cb..6bdde29 100644
--- a/static/translations/bn.json
+++ b/static/translations/bn.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Position",
"precision": "Display precision",
"preview": "\u09aa\u09c2\u09b0\u09cd\u09ac\u09b0\u09c2\u09aa \u09ac\u09cd\u09b2\u09c1\u09aa\u09cd\u09b0\u09bf\u09a8\u09cd\u099f",
@@ -190,12 +191,11 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u0995\u09a8\u09ab\u09bf\u0997\u09be\u09b0\u09c7\u09b6\u09a8",
"shortcuts": "Shortcuts",
- "show": "Show",
+ "show": "\u09a6\u09c7\u0996\u09be\u09a8",
"show_area": "Show {area}",
"show_in_sidebar": "Show in sidebar",
"show_more_info": "Show more information",
@@ -249,8 +249,9 @@
"url": "URL",
"username": "Username",
"vacuum_commands": "Vacuum cleaner commands:",
+ "value": "\u09ae\u09be\u09a8",
"visibility": "Visibility",
- "visibility_explanation": "The card will be shown when ALL conditions below are fulfilled. If no conditions are set, the card will always be shown.",
+ "visibility_explanation": "\u09a8\u09c0\u099a\u09c7\u09b0 \u09b8\u09ae\u09b8\u09cd\u09a4 \u09b6\u09b0\u09cd\u09a4 \u09aa\u09c2\u09b0\u09a3 \u09b9\u09b2\u09c7 \u0995\u09be\u09b0\u09cd\u09a1\u099f\u09bf \u09a6\u09c7\u0996\u09be\u09a8\u09cb \u09b9\u09ac\u09c7\u0964 \u09af\u09a6\u09bf \u0995\u09cb\u09a8\u0993 \u09b6\u09b0\u09cd\u09a4 \u09b8\u09c7\u099f \u09a8\u09be \u09a5\u09c7\u0995\u09c7 \u09a5\u09be\u0995\u09c7 \u09a4\u09ac\u09c7 \u0995\u09be\u09b0\u09cd\u09a1\u099f\u09bf \u09b8\u09b0\u09cd\u09ac\u09a6\u09be \u09aa\u09cd\u09b0\u09a6\u09b0\u09cd\u09b6\u09bf\u09a4 \u09b9\u09ac\u09c7\u0964",
"visible": "Visible",
"weather_forecast": "Forecast",
"week": "Week",
diff --git a/static/translations/bs.json b/static/translations/bs.json
index ef8736d..f8f7310 100644
--- a/static/translations/bs.json
+++ b/static/translations/bs.json
@@ -174,6 +174,7 @@
"period_month": "Mjesec",
"period_week": "Week",
"picture": "Slika",
+ "picture_elements": "Elementi slike",
"position": "Pozicija",
"precision": "Display precision",
"preview": "Pregled",
diff --git a/static/translations/ca.json b/static/translations/ca.json
index eae03f6..0c71ec3 100644
--- a/static/translations/ca.json
+++ b/static/translations/ca.json
@@ -195,7 +195,7 @@
"login_error": "Error: {error}",
"low": "Baix",
"manage_account": "Gesti\u00f3 del compte",
- "max": "M\u00e0xima",
+ "max": "M\u00e0x.",
"max_length": "Longitud m\u00e0xima",
"max_plus": "M\u00e0xima+",
"media": "Multim\u00e8dia",
@@ -253,6 +253,7 @@
"period_month": "Mes",
"period_week": "Setmana",
"picture": "Imatge",
+ "picture_elements": "Imatge amb elements",
"playing": "Reproduint",
"position": "Posici\u00f3",
"precision": "Precisi\u00f3 de visualitzaci\u00f3",
diff --git a/static/translations/cs.json b/static/translations/cs.json
index 93f0330..7eb95c3 100644
--- a/static/translations/cs.json
+++ b/static/translations/cs.json
@@ -155,7 +155,7 @@
"history": "Historie",
"home": "Doma",
"horizontal": "Horizont\u00e1ln\u00ed",
- "horizontal_stack": "Horizont\u00e1ln\u00ed uskupen\u00ed",
+ "horizontal_stack": "Horizont\u00e1ln\u00ed seskupen\u00ed",
"hours": "Hodiny",
"humidifier": "Zvlh\u010dova\u010d",
"humidifier_drying": "Odvlh\u010dov\u00e1n\u00ed",
@@ -195,7 +195,7 @@
"login_error": "Chyba: {error}",
"low": "N\u00edzk\u00fd",
"manage_account": "Spravovat \u00fa\u010det",
- "max": "Maxim\u00e1ln\u00ed",
+ "max": "Max",
"max_length": "Maxim\u00e1ln\u00ed d\u00e9lka",
"max_plus": "Maxim\u00e1ln\u00ed+",
"media": "M\u00e9dia",
@@ -253,6 +253,7 @@
"period_month": "M\u011bs\u00edc",
"period_week": "T\u00fdden",
"picture": "Obr\u00e1zek",
+ "picture_elements": "Obr\u00e1zkov\u00e9 prvky",
"playing": "P\u0159ehr\u00e1v\u00e1",
"position": "Pozice",
"precision": "P\u0159esnost zobrazen\u00ed",
diff --git a/static/translations/cy.json b/static/translations/cy.json
index 04312e4..58f5bb4 100644
--- a/static/translations/cy.json
+++ b/static/translations/cy.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Llun",
+ "picture_elements": "Elfennau'r Llun",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Synhwyrydd",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "Ffurfweddu",
diff --git a/static/translations/da.json b/static/translations/da.json
index a0b8665..93ffb49 100644
--- a/static/translations/da.json
+++ b/static/translations/da.json
@@ -189,7 +189,6 @@
"login_error": "Fejl: {error}",
"low": "Lav",
"manage_account": "Administr\u00e9r konto",
- "max": "Maks",
"max_length": "Maksimumsl\u00e6ngde",
"max_plus": "Maks plus",
"media": "Medier",
@@ -247,6 +246,7 @@
"period_month": "M\u00e5ned",
"period_week": "Uge",
"picture": "Billede",
+ "picture_elements": "Billedelementer",
"playing": "Afspiller",
"position": "Position",
"precision": "Visningspr\u00e6cision",
diff --git a/static/translations/de.json b/static/translations/de.json
index bd60bc0..5381204 100644
--- a/static/translations/de.json
+++ b/static/translations/de.json
@@ -46,8 +46,8 @@
"breakpoints_wide": "Breit",
"brightness": "Helligkeit",
"buffering": "Puffern",
- "button": "Schalter",
- "buttons": "Tasten",
+ "button": "Button",
+ "buttons": "Buttons",
"calendar": "Kalender",
"calendar_error": "Ereignisse f\u00fcr Kalender konnten nicht abgerufen werden:",
"camera": "Kamera",
@@ -55,7 +55,7 @@
"card_configuration": "Kartenkonfiguration",
"change_color": "Farbe \u00e4ndern",
"change_type": "Typ \u00e4ndern",
- "check_updates": "Auf Updates pr\u00fcfen",
+ "check_updates": "Nach Updates suchen",
"checking_updates": "Suche nach Updates...",
"clean_spot": "Stelle s\u00e4ubern",
"cleaning": "Reinigt",
@@ -88,7 +88,7 @@
"current_state": "aktuell",
"custom": "Benutzerdefiniert",
"date": "Datum",
- "date_or_time": "Datum und/oder Uhrzeit",
+ "date_or_time": "Eingabe f\u00fcr Datum und/oder Uhrzeit",
"day": "Tag",
"days_to_show": "Anzuzeigende Tage",
"decrement": "Verringern",
@@ -171,7 +171,7 @@
"humidifier_mode_sleep": "Schlafen",
"hvac_modes": "HLK-Modi",
"icon": "Symbol",
- "icons": "Icons",
+ "icons": "Symbole",
"idle": "Unt\u00e4tig",
"iframe": "Webseite",
"increment": "Erh\u00f6hen",
@@ -195,7 +195,7 @@
"login_error": "Fehler: {error}",
"low": "Niedrig",
"manage_account": "Konto verwalten",
- "max": "Max",
+ "max": "Maximum",
"max_length": "Maximale L\u00e4nge",
"max_plus": "Max plus",
"media": "Medien",
@@ -253,6 +253,7 @@
"period_month": "Monat",
"period_week": "Woche",
"picture": "Bild",
+ "picture_elements": "Bildelemente",
"playing": "Spielt ab",
"position": "Position",
"precision": "Anzeigegenauigkeit",
@@ -277,7 +278,7 @@
"sensor": "Sensor",
"service": "Dienst",
"service_data": "Dienstdaten",
- "set_state": "Status setzen",
+ "set_state": "Zustand setzen",
"set_white": "Wei\u00df einstellen",
"settings": "Einstellungen",
"shortcuts": "Verkn\u00fcpfungen",
@@ -299,7 +300,7 @@
"state": "Zustand",
"state_equal": "Zustand ist gleich",
"state_not_equal": "Zustand ist nicht gleich",
- "status": "Status",
+ "status": "Zustand",
"stop": "Stoppen",
"stop_cover": "Abdeckung stoppen",
"stop_valve": "Ventil stoppen",
diff --git a/static/translations/el.json b/static/translations/el.json
index 37c8c0b..dd2d7fc 100644
--- a/static/translations/el.json
+++ b/static/translations/el.json
@@ -79,7 +79,7 @@
"connection_lost": "\u0397 \u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7 \u03c7\u03ac\u03b8\u03b7\u03ba\u03b5. \u0395\u03c0\u03b1\u03bd\u03b1\u03c3\u03cd\u03bd\u03b4\u03b5\u03c3\u03b7\u2026",
"connection_started": "\u03a4\u03bf Home Assistant \u03ad\u03c7\u03b5\u03b9 \u03be\u03b5\u03ba\u03b9\u03bd\u03ae\u03c3\u03b5\u03b9!",
"connection_starting": "\u03a4\u03bf Home Assistant \u03be\u03b5\u03ba\u03b9\u03bd\u03ac, \u03b5\u03bd\u03b4\u03ad\u03c7\u03b5\u03c4\u03b1\u03b9 \u03bd\u03b1 \u03bc\u03b7\u03bd \u03b5\u03af\u03bd\u03b1\u03b9 \u03b1\u03ba\u03cc\u03bc\u03b1 \u03cc\u03bb\u03b1 \u03b4\u03b9\u03b1\u03b8\u03ad\u03c3\u03b9\u03bc\u03b1.",
- "cool": "\u0394\u03c1\u03bf\u03c3\u03b5\u03c1\u03cc\u03c2",
+ "cool": "\u03a8\u03cd\u03be\u03b7",
"cooling": "\u03a8\u03cd\u03be\u03b7",
"copied": "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03ac\u03c6\u03b7\u03ba\u03b5",
"copy": "\u0391\u03bd\u03c4\u03b9\u03b3\u03c1\u03b1\u03c6\u03ae",
@@ -109,7 +109,7 @@
"duration": "\u0394\u03b9\u03ac\u03c1\u03ba\u03b5\u03b9\u03b1",
"edit": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1",
"edit_title": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c4\u03af\u03c4\u03bb\u03bf\u03c5",
- "edit_ui": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03b5\u03c1\u03b9\u03b2\u03ac\u03bb\u03bb\u03bf\u03bd\u03c4\u03bf\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
+ "edit_ui": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03b4\u03b9\u03b5\u03c0\u03b1\u03c6\u03ae\u03c2 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7",
"edit_view": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c0\u03c1\u03bf\u03b2\u03bf\u03bb\u03ae\u03c2",
"edit_yaml": "\u0395\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1 \u03c3\u03b5 YAML",
"empty": "\u0386\u03b4\u03b5\u03b9\u03bf",
@@ -135,7 +135,7 @@
"fan_speed_low": "\u03a7\u03b1\u03bc\u03b7\u03bb\u03ae",
"fan_speed_medium": "\u039c\u03b5\u03c3\u03b1\u03af\u03b1",
"fill": "\u0393\u03ad\u03bc\u03b9\u03c3\u03bc\u03b1",
- "finish": "\u039f\u03bb\u03bf\u03ba\u03bb\u03b7\u03c1\u03ce\u03b8\u03b7\u03ba\u03b1\u03bd",
+ "finish": "\u03bf\u03bb\u03bf\u03ba\u03bb\u03ae\u03c1\u03c9\u03c3\u03b7",
"forecast_daily": "\u039a\u03b1\u03b8\u03b7\u03bc\u03b5\u03c1\u03b9\u03bd\u03ac",
"forecast_hourly": "\u03a9\u03c1\u03b9\u03b1\u03af\u03b1",
"forecast_twice_daily": "\u0394\u03cd\u03bf \u03c6\u03bf\u03c1\u03ad\u03c2 \u03c4\u03b7\u03bd \u03b7\u03bc\u03ad\u03c1\u03b1",
@@ -172,7 +172,7 @@
"hvac_modes": "\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b5\u03c2 HVAC",
"icon": "\u0395\u03b9\u03ba\u03bf\u03bd\u03af\u03b4\u03b9\u03bf",
"icons": "\u0395\u03b9\u03ba\u03bf\u03bd\u03af\u03b4\u03b9\u03b1",
- "idle": "\u0391\u03b4\u03c1\u03b1\u03bd\u03ae\u03c2",
+ "idle": "\u03a3\u03b5 \u03b1\u03b4\u03c1\u03ac\u03bd\u03b5\u03b9\u03b1",
"iframe": "\u0399\u03c3\u03c4\u03bf\u03c3\u03b5\u03bb\u03af\u03b4\u03b1",
"increment": "\u0391\u03cd\u03be\u03b7\u03c3\u03b7",
"invalid_auth": "\u039c\u03b7 \u03ad\u03b3\u03ba\u03c5\u03c1\u03bf \u03cc\u03bd\u03bf\u03bc\u03b1 \u03c7\u03c1\u03ae\u03c3\u03c4\u03b7 \u03ae \u03ba\u03c9\u03b4\u03b9\u03ba\u03cc\u03c2 \u03c0\u03c1\u03cc\u03c3\u03b2\u03b1\u03c3\u03b7\u03c2",
@@ -194,7 +194,6 @@
"login_error": "\u03a3\u03c6\u03ac\u03bb\u03bc\u03b1: {error}",
"low": "\u03a7\u03b1\u03bc\u03b7\u03bb\u03cc",
"manage_account": "\u0394\u03b9\u03b1\u03c7\u03b5\u03af\u03c1\u03b9\u03c3\u03b7 \u03bb\u03bf\u03b3\u03b1\u03c1\u03b9\u03b1\u03c3\u03bc\u03bf\u03cd",
- "max": "\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7",
"max_length": "\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03bf \u03bc\u03ae\u03ba\u03bf\u03c2",
"max_plus": "\u039c\u03ad\u03b3\u03b9\u03c3\u03c4\u03b7 plus",
"media": "\u03a0\u03bf\u03bb\u03c5\u03bc\u03ad\u03c3\u03b1",
@@ -209,6 +208,7 @@
"mode": "\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b1",
"month": "\u039c\u03ae\u03bd\u03b1\u03c2",
"motion": "\u039a\u03af\u03bd\u03b7\u03c3\u03b7",
+ "mowing": "\u039a\u03bf\u03cd\u03c1\u03b5\u03bc\u03b1",
"name": "\u039f\u03bd\u03bf\u03bc\u03b1",
"navigate": "\u03a0\u03bb\u03bf\u03ae\u03b3\u03b7\u03c3\u03b7",
"never_triggered": "\u0394\u03b5\u03bd \u03c0\u03c5\u03c1\u03bf\u03b4\u03bf\u03c4\u03ae\u03b8\u03b7\u03ba\u03b5 \u03c0\u03bf\u03c4\u03ad",
@@ -251,6 +251,7 @@
"period_month": "\u039c\u03ae\u03bd\u03b1\u03c2",
"period_week": "\u0395\u03b2\u03b4\u03bf\u03bc\u03ac\u03b4\u03b1",
"picture": "\u0395\u03b9\u03ba\u03cc\u03bd\u03b1",
+ "picture_elements": "\u03a3\u03c4\u03bf\u03b9\u03c7\u03b5\u03af\u03b1 \u03b5\u03b9\u03ba\u03cc\u03bd\u03b1\u03c2",
"playing": "\u03a0\u03b1\u03af\u03b6\u03b5\u03b9",
"position": "\u0398\u03ad\u03c3\u03b7",
"precision": "\u0391\u03ba\u03c1\u03af\u03b2\u03b5\u03b9\u03b1 \u03bf\u03b8\u03cc\u03bd\u03b7\u03c2",
@@ -309,6 +310,8 @@
"swing_modes": "\u039b\u03b5\u03b9\u03c4\u03bf\u03c5\u03c1\u03b3\u03af\u03b5\u03c2 \u03c4\u03b1\u03bb\u03ac\u03bd\u03c4\u03b5\u03c5\u03c3\u03b7\u03c2",
"target": "\u03a3\u03c4\u03cc\u03c7\u03bf\u03c2",
"target_humidity": "\u0395\u03c0\u03b9\u03b8\u03c5\u03bc\u03b7\u03c4\u03ae \u03c5\u03b3\u03c1\u03b1\u03c3\u03af\u03b1",
+ "target_temp_high": "\u0398\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1-\u03c3\u03c4\u03cc\u03c7\u03bf\u03c2 \u03c5\u03c8\u03b7\u03bb\u03ae",
+ "target_temp_low": "\u0398\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1-\u03c3\u03c4\u03cc\u03c7\u03bf\u03c2 \u03c7\u03b1\u03bc\u03b7\u03bb\u03ae",
"target_temperature": "\u0395\u03c0\u03b9\u03b8\u03c5\u03bc\u03b7\u03c4\u03ae \u03b8\u03b5\u03c1\u03bc\u03bf\u03ba\u03c1\u03b1\u03c3\u03af\u03b1",
"template": "\u03a0\u03c1\u03cc\u03c4\u03c5\u03c0\u03bf",
"template_editor": "\u03a0\u03c1\u03cc\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1 \u03b5\u03c0\u03b5\u03be\u03b5\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2 \u03c0\u03c1\u03bf\u03c4\u03cd\u03c0\u03c9\u03bd",
diff --git a/static/translations/en-GB.json b/static/translations/en-GB.json
index b220da1..c948122 100644
--- a/static/translations/en-GB.json
+++ b/static/translations/en-GB.json
@@ -158,6 +158,7 @@
"ok": "OK",
"open_cover": "Open cover",
"open_door": "Open door",
+ "open_door_success": "Door open",
"open_menu": "Open dashboard menu",
"open_tilt_cover": "Open cover tilt",
"open_valve": "Open valve",
@@ -174,6 +175,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture Elements",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
diff --git a/static/translations/en.json b/static/translations/en.json
index 379931c..9b470ab 100644
--- a/static/translations/en.json
+++ b/static/translations/en.json
@@ -250,6 +250,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"playing": "Playing",
"position": "Position",
"precision": "Display precision",
@@ -273,7 +274,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "Settings",
diff --git a/static/translations/eo.json b/static/translations/eo.json
index b607614..988d196 100644
--- a/static/translations/eo.json
+++ b/static/translations/eo.json
@@ -173,6 +173,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Bildo",
+ "picture_elements": "Bildaj Elementoj",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -191,7 +192,6 @@
"section": "Section",
"sensor": "Sensilo",
"service": "Service",
- "service_data": "Service data",
"set_state": "Fiksita Stato",
"set_white": "Set white",
"settings": "Settings",
diff --git a/static/translations/es-419.json b/static/translations/es-419.json
index c53af85..16041d8 100644
--- a/static/translations/es-419.json
+++ b/static/translations/es-419.json
@@ -157,7 +157,7 @@
"object": "Objeto",
"ok": "OK",
"open_cover": "Abrir cortina",
- "open_door": "Abrir puerta",
+ "open_door": "Puerta abierta",
"open_door_success": "Puerta abierta",
"open_menu": "Abre el men\u00fa de la interfaz de usuario de Lovelace",
"open_tilt_cover": "Inclinaci\u00f3n abierta de la cortina",
@@ -175,6 +175,7 @@
"period_month": "Mes",
"period_week": "Semana",
"picture": "Imagen",
+ "picture_elements": "Elementos de imagen",
"position": "Posici\u00f3n",
"precision": "Precisi\u00f3n",
"preview": "Vista previa del plano",
@@ -254,7 +255,7 @@
"vacuum_commands": "Comandos de la aspiradora:",
"value": "Valor",
"visibility": "Visibilidad",
- "visibility_explanation": "La tarjeta se mostrar\u00e1 cuando se cumplan TODAS las condiciones siguientes. Si no se establecen condiciones, la tarjeta siempre se mostrar\u00e1.",
+ "visibility_explanation": "La tarjeta se mostrar\u00e1 cuando se cumplan TODAS las condiciones que se indican a continuaci\u00f3n. Si no se establecen condiciones, siempre se mostrar\u00e1 la tarjeta.",
"visible": "Visible",
"weather_forecast": "Pron\u00f3stico",
"week": "Semana",
diff --git a/static/translations/es.json b/static/translations/es.json
index 38187de..60ae1a6 100644
--- a/static/translations/es.json
+++ b/static/translations/es.json
@@ -195,7 +195,7 @@
"login_error": "Error: {error}",
"low": "Bajo",
"manage_account": "Administrar cuenta",
- "max": "M\u00e1x",
+ "max": "M\u00e1x.",
"max_length": "Longitud m\u00e1xima",
"max_plus": "M\u00e1x plus",
"media": "Medios",
@@ -253,6 +253,7 @@
"period_month": "Mes",
"period_week": "Semana",
"picture": "Imagen",
+ "picture_elements": "Elementos de imagen",
"playing": "Reproduciendo",
"position": "Posici\u00f3n",
"precision": "Precisi\u00f3n de visualizaci\u00f3n",
diff --git a/static/translations/et.json b/static/translations/et.json
index f25950f..ec78835 100644
--- a/static/translations/et.json
+++ b/static/translations/et.json
@@ -253,6 +253,7 @@
"period_month": "Kuu",
"period_week": "N\u00e4dal",
"picture": "Pilt",
+ "picture_elements": "Pildi elemendid",
"playing": "M\u00e4ngib",
"position": "Asend",
"precision": "Kuvamise t\u00e4psus",
diff --git a/static/translations/eu.json b/static/translations/eu.json
index 6b397b0..0c0acbd 100644
--- a/static/translations/eu.json
+++ b/static/translations/eu.json
@@ -174,6 +174,7 @@
"period_month": "Hilabetea",
"period_week": "Astea",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Posizioa",
"precision": "Display precision",
"preview": "Aurreikusi",
@@ -192,7 +193,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "Konfigurazioa",
diff --git a/static/translations/fa.json b/static/translations/fa.json
index d765b96..4575469 100644
--- a/static/translations/fa.json
+++ b/static/translations/fa.json
@@ -173,6 +173,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "\u062a\u0635\u0648\u06cc\u0631",
+ "picture_elements": "Picture elements",
"position": "\u0645\u0648\u0642\u0639\u06cc\u062a",
"precision": "Display precision",
"preview": "Preview",
@@ -191,7 +192,6 @@
"section": "Section",
"sensor": "\u0633\u0646\u0633\u0648\u0631",
"service": "Service",
- "service_data": "Service data",
"set_state": "Fixeaza stare",
"set_white": "Set white",
"settings": "\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc",
diff --git a/static/translations/fi.json b/static/translations/fi.json
index d18ea13..03632fd 100644
--- a/static/translations/fi.json
+++ b/static/translations/fi.json
@@ -195,7 +195,6 @@
"login_error": "Virhe: {error}",
"low": "Hidas",
"manage_account": "Tilin Hallinta",
- "max": "Max",
"max_length": "Enimm\u00e4ispituus",
"max_plus": "Max plus",
"media": "Media",
@@ -253,6 +252,7 @@
"period_month": "Kuukausi",
"period_week": "Viikko",
"picture": "Kuva",
+ "picture_elements": "Kuvaelementit",
"playing": "Toistetaan",
"position": "Sijainti",
"precision": "N\u00e4yt\u00f6n tarkkuus",
diff --git a/static/translations/fr.json b/static/translations/fr.json
index a0fdd5d..c50c896 100644
--- a/static/translations/fr.json
+++ b/static/translations/fr.json
@@ -102,7 +102,7 @@
"divider": "Diviseur",
"docked": "Sur la base",
"docs": "Documentation",
- "done": "Termin\u00e9",
+ "done": "Terminer",
"drag_and_drop": "Glisser-d\u00e9poser",
"dry": "D\u00e9shumidification",
"drying": "D\u00e9shumidifie",
@@ -120,7 +120,7 @@
"error_save_yaml": "Impossible d'enregistrer le YAML\u00a0: {error}",
"event_delete": "Supprimer l'\u00e9v\u00e9nement",
"event_fired": "L'\u00e9v\u00e9nement {type} a \u00e9t\u00e9 d\u00e9clench\u00e9 avec succ\u00e8s\u00a0!",
- "exit_edit_mode": "Termin\u00e9",
+ "exit_edit_mode": "Terminer",
"expand": "D\u00e9velopper",
"fan": "Ventile",
"fan_direction": "Direction",
@@ -252,6 +252,7 @@
"period_month": "Mois",
"period_week": "Semaine",
"picture": "Image",
+ "picture_elements": "\u00c9l\u00e9ments d'image",
"playing": "Lecture en cours",
"position": "Position",
"precision": "Pr\u00e9cision d'affichage",
diff --git a/static/translations/fy.json b/static/translations/fy.json
index 4e3e7fb..09225fc 100644
--- a/static/translations/fy.json
+++ b/static/translations/fy.json
@@ -174,6 +174,7 @@
"period_month": "Moanne",
"period_week": "Wike",
"picture": "\u00d4fbylding",
+ "picture_elements": "\u00d4fbylding eleminten",
"position": "Posysje",
"precision": "Presyzje sjen litte",
"preview": "Foarbyld",
diff --git a/static/translations/ga.json b/static/translations/ga.json
new file mode 100644
index 0000000..567a35b
--- /dev/null
+++ b/static/translations/ga.json
@@ -0,0 +1,260 @@
+{
+ "abort_login": "Login aborted",
+ "above": "Above",
+ "add": "Add",
+ "add_condition": "Add condition",
+ "add_item": "Add item",
+ "add_view": "Add view",
+ "addons": "Add-ons",
+ "after": "After",
+ "alarm_modes_armed_away": "Away",
+ "alarm_modes_armed_custom_bypass": "Custom",
+ "alarm_modes_armed_home": "Home",
+ "alarm_modes_armed_night": "Night",
+ "alarm_modes_armed_vacation": "Vacation",
+ "alarm_modes_disarmed": "Disarmed",
+ "alarm_modes_label": "Alarm modes",
+ "and": "And",
+ "appearance": "Appearance",
+ "aspect_ratio": "Aspect ratio",
+ "attributes": "Attributes",
+ "auth": "Application credentials",
+ "authorizing_client": "You're about to give {clientId} access to your Home Assistant instance.",
+ "back": "Back",
+ "battery": "Battery",
+ "before": "Before",
+ "below": "Below",
+ "breakpoints": "Screen sizes",
+ "breakpoints_desktop": "Desktop",
+ "breakpoints_mobile": "Mobile",
+ "breakpoints_tablet": "Tablet",
+ "breakpoints_wide": "Wide",
+ "brightness": "Brightness",
+ "button": "Button",
+ "buttons": "Buttons",
+ "calendar": "Calendar",
+ "calendar_error": "Could not retrieve events for calendars:",
+ "cancel": "Cancel",
+ "card_configuration": "Card configuration",
+ "change_color": "Change color",
+ "change_type": "Change type",
+ "check_updates": "Check for updates",
+ "checking_updates": "Checking for updates...",
+ "clean_spot": "Clean spot",
+ "clear_items": "Remove completed items",
+ "close_cover": "Close cover",
+ "close_tilt_cover": "Close cover tilt",
+ "close_valve": "Close valve",
+ "color": "Color",
+ "color_temp": "Temperature",
+ "columns": "Columns",
+ "condition_error": "Condition did not pass",
+ "condition_pass": "Condition passes",
+ "conditional": "Conditional",
+ "conditions": "Conditions",
+ "configure": "Configure",
+ "confirm_log_out": "Are you sure you want to log out?",
+ "connection_lost": "Connection lost. Reconnecting\u2026",
+ "connection_started": "Home Assistant has started!",
+ "connection_starting": "Home Assistant is starting, not everything will be available until it is finished.",
+ "copied": "Copied",
+ "copy": "Copy",
+ "current_state": "current",
+ "date": "Date",
+ "date_or_time": "Date and/or time",
+ "day": "Day",
+ "days_to_show": "Days to show",
+ "delete": "Delete",
+ "description": "Description",
+ "detect": "Detect",
+ "discovered": "Discovered",
+ "divider": "Divider",
+ "docs": "Documentation",
+ "done": "Done",
+ "drag_and_drop": "Drag and drop",
+ "edit": "Edit",
+ "edit_title": "Edit title",
+ "edit_ui": "Edit UI",
+ "edit_view": "Edit view",
+ "edit_yaml": "Edit in YAML",
+ "entities": "Entities",
+ "entity": "Entity",
+ "entity_not_found": "Entity not found",
+ "error": "Error",
+ "error_save_yaml": "Unable to save YAML: {error}",
+ "event_delete": "Delete event",
+ "event_fired": "Event {type} successfully fired!",
+ "exit_edit_mode": "Done",
+ "expand": "Expand",
+ "fan_direction": "Direction",
+ "fan_forward": "Forward",
+ "fan_oscillate": "Oscillate",
+ "fan_preset_mode": "Preset mode",
+ "fan_reverse": "Reverse",
+ "fan_speed": "Fan speed",
+ "fan_speed_high": "High",
+ "fan_speed_low": "Low",
+ "fan_speed_medium": "Medium",
+ "finish": "finish",
+ "forecast_daily": "Daily",
+ "forecast_hourly": "Hourly",
+ "forecast_twice_daily": "Twice daily",
+ "forecast_type": "Select forecast type",
+ "forward": "Forward",
+ "graph": "Graph",
+ "group": "Group",
+ "ha_url": "Home Assistant URL",
+ "hidden": "Hidden",
+ "hide": "Hide",
+ "history": "History",
+ "horizontal_stack": "Horizontal stack",
+ "hours": "Hours",
+ "icon": "Icon",
+ "icons": "Icons",
+ "iframe": "Webpage",
+ "invalid_auth": "Invalid username or password",
+ "invalid_code": "Invalid authentication code",
+ "invalid_timestamp": "Invalid timestamp",
+ "javascript_module": "JavaScript module",
+ "key_missing": "Required key ''{key}'' is missing.",
+ "language": "Language",
+ "last_triggered": "Last triggered",
+ "lawn_mower_commands": "Lawn mower commands:",
+ "loading": "Loading\u2026",
+ "locate": "Locate",
+ "log_in": "Log in",
+ "log_out": "Log out",
+ "login": "Log in",
+ "login_error": "Error: {error}",
+ "manage_account": "Manage account",
+ "max_length": "Maximum length",
+ "media": "Media",
+ "media_player": "Media control",
+ "menu": "Menu",
+ "mfa_code": "Two-factor authentication code",
+ "mfa_description": "Open the {mfa_module_name} on your device to view your two-factor authentication code.",
+ "min_length": "Minimum length",
+ "minutes": "Minutes",
+ "mobile": "Mobile",
+ "month": "Month",
+ "motion": "Motion",
+ "name": "Name",
+ "navigate": "Navigate",
+ "never_triggered": "Never triggered",
+ "no": "No",
+ "no_entities": "No entities",
+ "no_options": "There are no options yet.",
+ "none": "None",
+ "nothing_configured": "Nothing configured yet",
+ "nothing_found": "Nothing found!",
+ "nothing_playing": "Nothing playing",
+ "notifications": "Notifications",
+ "notifications_dismiss": "Dismiss",
+ "notifications_empty": "No notifications",
+ "numeric_state": "Numeric state",
+ "object": "Object",
+ "ok": "OK",
+ "open_cover": "Open cover",
+ "open_door": "Open door",
+ "open_menu": "Open dashboard menu",
+ "open_tilt_cover": "Open cover tilt",
+ "open_valve": "Open valve",
+ "optional": "optional",
+ "options": "Options",
+ "or": "Or",
+ "overview": "Overview",
+ "password": "Password",
+ "pause": "Pause",
+ "period": "Period",
+ "period_5minute": "5 Minutes",
+ "period_day": "Day",
+ "period_hour": "Hour",
+ "period_month": "Month",
+ "period_week": "Week",
+ "picture": "Picture",
+ "picture_elements": "Picture elements",
+ "position": "Position",
+ "precision": "Display precision",
+ "preview": "Preview",
+ "raw": "Raw configuration editor",
+ "remove": "Remove",
+ "return_home": "Return home",
+ "running": "Running\u2026",
+ "save": "Save",
+ "saved": "Saved",
+ "say": "Say",
+ "scenes": "Scenes",
+ "screen": "Screen",
+ "script": "Script",
+ "search": "Search",
+ "seconds": "Seconds",
+ "section": "Section",
+ "sensor": "Sensor",
+ "service": "Service",
+ "set_state": "Set state",
+ "set_white": "Set white",
+ "settings": "Settings",
+ "shortcuts": "Shortcuts",
+ "show": "Show",
+ "show_area": "Show {area}",
+ "show_in_sidebar": "Show in sidebar",
+ "show_more_info": "Show more information",
+ "show_password": "Show password",
+ "sidebar": "Sidebar",
+ "size": "Size",
+ "start": "Start",
+ "start_mowing": "Start mowing",
+ "start_over": "Start over",
+ "start_pause": "Start/pause",
+ "state": "State",
+ "state_equal": "State is equal to",
+ "state_not_equal": "State is not equal to",
+ "status": "Status",
+ "stop": "Stop",
+ "stop_cover": "Stop cover",
+ "stop_valve": "Stop valve",
+ "successfully_saved": "Successfully saved",
+ "suggestion": "We created a suggestion for you",
+ "summary": "Summary",
+ "target": "Target",
+ "template": "Template",
+ "template_editor": "Template editor",
+ "text": "Text",
+ "theme": "Theme",
+ "tilt_position": "Tilt position",
+ "time": "Time",
+ "time_format_12": "12 hours (AM/PM)",
+ "time_format_24": "24 hours",
+ "time_format_auto": "Auto (use language setting)",
+ "time_format_description": "Choose how times are formatted.",
+ "time_format_header": "Time format",
+ "timer": "Timer",
+ "today": "Today",
+ "todo_list": "To-do list",
+ "toggle": "Toggle",
+ "token": "Long-lived access tokens",
+ "trigger": "Run actions",
+ "unavailable": "Unavailable",
+ "undo": "Undo",
+ "unknown": "Unknown",
+ "unsaved_changes": "You have unsaved changes, are you sure you want to exit?",
+ "unsaved_changes_title": "Unsaved changes",
+ "update_clear_skipped": "Clear skipped",
+ "update_create_backup": "Create backup before updating",
+ "update_install": "Install",
+ "update_installing": "Installing",
+ "update_installing_progress": "Installing ({progress}%)",
+ "update_release_notes": "Read release announcement",
+ "update_skip": "Skip",
+ "url": "URL",
+ "username": "Username",
+ "vacuum_commands": "Vacuum cleaner commands:",
+ "visibility": "Visibility",
+ "visibility_explanation": "The card will be shown when ALL conditions below are fulfilled. If no conditions are set, the card will always be shown.",
+ "visible": "Visible",
+ "weather_forecast": "Forecast",
+ "week": "Week",
+ "welcome_home": "Welcome Home",
+ "year": "year",
+ "yes": "Yes"
+}
diff --git a/static/translations/gl.json b/static/translations/gl.json
index 85b2c3a..365f65c 100644
--- a/static/translations/gl.json
+++ b/static/translations/gl.json
@@ -108,12 +108,15 @@
"forecast_daily": "Diariamente",
"forecast_hourly": "Cada hora",
"forecast_twice_daily": "D\u00faas veces ao d\u00eda",
- "forecast_type": "Seleccione o tipo de previsi\u00f3n",
+ "forecast_type": "Seleccione o tipo de predici\u00f3n",
"forward": "Adiante",
"gentle": "Suave",
"graph": "Gr\u00e1fico",
"group": "Grupo",
"ha_url": "URL de Home Assistant",
+ "heat": "Calor",
+ "heat_cool": "Calor/Fr\u00edo",
+ "heating": "Calefacci\u00f3n",
"hidden": "Oculta",
"hide": "Esconder",
"history": "Historial",
@@ -138,7 +141,6 @@
"login": "Iniciar sesi\u00f3n",
"login_error": "Erro: {error}",
"manage_account": "Xestionar conta",
- "max": "M\u00e1ximo",
"max_length": "Lonxitude m\u00e1xima",
"max_plus": "M\u00e1ximo plus",
"media": "Medio",
@@ -189,6 +191,7 @@
"period_month": "Mes",
"period_week": "Semana",
"picture": "Imaxe",
+ "picture_elements": "Elementos da imaxe",
"position": "Posici\u00f3n",
"precision": "Mostrar precisi\u00f3n",
"preview": "Vista previa",
@@ -278,6 +281,13 @@
"visibility": "Visibilidade",
"visibility_explanation": "A tarxeta mostrarase cando TODAS as condici\u00f3ns se cumpran. Se non se establecen condici\u00f3ns, a tarxeta sempre se mostrar\u00e1.",
"visible": "Vis\u00edbel",
+ "water_heater_away_mode": "Modo ausente",
+ "water_heater_eco": "Eco",
+ "water_heater_electric": "El\u00e9ctrico",
+ "water_heater_gas": "Gas",
+ "water_heater_heat_pump": "Bomba de calor",
+ "water_heater_high_demand": "Alta Demanda",
+ "water_heater_performance": "Rendemento",
"weather": "Clima",
"weather_clear_night": "Despexado, de noite",
"weather_cloudy": "Nubrado",
diff --git a/static/translations/gsw.json b/static/translations/gsw.json
index 3647473..5fabd08 100644
--- a/static/translations/gsw.json
+++ b/static/translations/gsw.json
@@ -188,6 +188,7 @@
"period_month": "Monet",
"period_week": "Wuche",
"picture": "Biud",
+ "picture_elements": "Biudelem\u00e4nt",
"position": "Position",
"precision": "Gnauigkeit aazeige",
"preview": "Vorschou",
diff --git a/static/translations/he.json b/static/translations/he.json
index f6465cf..d1876be 100644
--- a/static/translations/he.json
+++ b/static/translations/he.json
@@ -249,6 +249,7 @@
"period_month": "\u05d7\u05d5\u05d3\u05e9",
"period_week": "\u05e9\u05d1\u05d5\u05e2",
"picture": "\u05ea\u05de\u05d5\u05e0\u05d4",
+ "picture_elements": "\u05e8\u05db\u05d9\u05d1\u05d9 \u05ea\u05de\u05d5\u05e0\u05d4",
"playing": "\u05de\u05e0\u05d2\u05df",
"position": "\u05de\u05d9\u05e7\u05d5\u05dd",
"precision": "\u05d3\u05d9\u05d5\u05e7 \u05ea\u05e6\u05d5\u05d2\u05d4",
diff --git a/static/translations/hi.json b/static/translations/hi.json
index 1c684bc..3cc0eef 100644
--- a/static/translations/hi.json
+++ b/static/translations/hi.json
@@ -60,7 +60,7 @@
"copied": "Copied",
"copy": "Copy",
"current_state": "current",
- "date": "Date",
+ "date": "\u0924\u093e\u0930\u0940\u0916",
"date_or_time": "Date and/or time",
"day": "Day",
"days_to_show": "Days to show",
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "\u0938\u094d\u0925\u093f\u0924\u093f \u0928\u093f\u0930\u094d\u0927\u093e\u0930\u093f\u0924 \u0915\u0930\u0947",
"set_white": "Set white",
"settings": "\u0915\u0949\u0902\u092b\u093c\u093f\u0917\u0930\u0947\u0936\u0928",
diff --git a/static/translations/hr.json b/static/translations/hr.json
index d63a846..222d820 100644
--- a/static/translations/hr.json
+++ b/static/translations/hr.json
@@ -177,6 +177,7 @@
"period_month": "Mjesec",
"period_week": "Tjedan",
"picture": "Slika",
+ "picture_elements": "Elementi slike",
"position": "Pozicija",
"precision": "Preciznost prikaza",
"preview": "Preview",
diff --git a/static/translations/hu.json b/static/translations/hu.json
index a6df49f..100b303 100644
--- a/static/translations/hu.json
+++ b/static/translations/hu.json
@@ -187,7 +187,7 @@
"live": "\u00e9l\u0151",
"loading": "Bet\u00f6lt\u00e9s\u2026",
"locate": "Keres\u00e9s",
- "locked": "Z\u00e1rva",
+ "locked": "Z\u00e1rolt",
"locking": "Z\u00e1r\u00e1s",
"log_in": "Bejelentkez\u00e9s",
"log_out": "Kijelentkez\u00e9s",
@@ -195,7 +195,7 @@
"login_error": "Hiba: {error}",
"low": "Alacsony",
"manage_account": "Fi\u00f3k kezel\u00e9se",
- "max": "Maximum",
+ "max": "Max",
"max_length": "Maxim\u00e1lis hossz",
"max_plus": "Max plusz",
"media": "M\u00e9diatartalmak",
@@ -253,6 +253,7 @@
"period_month": "H\u00f3nap",
"period_week": "H\u00e9t",
"picture": "K\u00e9p",
+ "picture_elements": "K\u00e9p elemek",
"playing": "Lej\u00e1tsz\u00e1s",
"position": "Poz\u00edci\u00f3",
"precision": "Pontoss\u00e1g",
diff --git a/static/translations/hy.json b/static/translations/hy.json
index e9eda19..545a625 100644
--- a/static/translations/hy.json
+++ b/static/translations/hy.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "\u0534\u056b\u0580\u0584",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u053f\u0561\u0580\u0563\u0561\u057e\u0578\u0580\u0578\u0582\u0574",
diff --git a/static/translations/id.json b/static/translations/id.json
index e4f8a78..edcb3d3 100644
--- a/static/translations/id.json
+++ b/static/translations/id.json
@@ -195,7 +195,6 @@
"login_error": "Kesalahan: {error}",
"low": "Rendah",
"manage_account": "Kelola akun",
- "max": "Maks",
"max_length": "Panjang maksimum",
"max_plus": "Maks plus",
"media": "Media",
@@ -253,6 +252,7 @@
"period_month": "Bulan",
"period_week": "Pekan",
"picture": "Gambar",
+ "picture_elements": "Elemen gambar",
"playing": "Memutar",
"position": "Posisi",
"precision": "Presisi tampilan",
diff --git a/static/translations/is.json b/static/translations/is.json
index 7220474..48785e6 100644
--- a/static/translations/is.json
+++ b/static/translations/is.json
@@ -213,6 +213,7 @@
"period_month": "M\u00e1nu\u00f0ur",
"period_week": "Vika",
"picture": "Mynd",
+ "picture_elements": "Myndaeiningar",
"position": "Sta\u00f0setning",
"precision": "S\u00fdna n\u00e1kv\u00e6mni",
"preview": "Forsko\u00f0a uppdr\u00e1tt",
diff --git a/static/translations/it.json b/static/translations/it.json
index 839246a..98fca8b 100644
--- a/static/translations/it.json
+++ b/static/translations/it.json
@@ -187,7 +187,7 @@
"live": "dal vivo",
"loading": "Caricamento\u2026",
"locate": "Individua",
- "locked": "Chiuso/a",
+ "locked": "Bloccato/a",
"locking": "In chiusura",
"log_in": "Accedi",
"log_out": "Disconnetti",
@@ -195,7 +195,6 @@
"login_error": "Errore: {error}",
"low": "Basso",
"manage_account": "Gestisci account",
- "max": "Massimo",
"max_length": "Lunghezza massima",
"max_plus": "Estremo",
"media": "Media",
@@ -253,6 +252,7 @@
"period_month": "Mese",
"period_week": "Settimana",
"picture": "Immagine",
+ "picture_elements": "Elementi Immagine",
"playing": "In esecuzione",
"position": "Apertura",
"precision": "Visualizza la precisione",
@@ -336,7 +336,7 @@
"unavailable": "Non disponibile",
"undo": "Annulla",
"unknown": "Sconosciuto",
- "unlocked": "Aperto/a",
+ "unlocked": "Sbloccato/a",
"unlocking": "In apertura",
"unsaved_changes": "Hai delle modifiche non salvate, sei sicuro di voler uscire?",
"unsaved_changes_title": "Modifiche non salvate",
diff --git a/static/translations/ja.json b/static/translations/ja.json
index 4d6fa84..7a379d7 100644
--- a/static/translations/ja.json
+++ b/static/translations/ja.json
@@ -9,9 +9,9 @@
"add_view": "\u30d3\u30e5\u30fc\u3092\u8ffd\u52a0",
"addons": "\u30a2\u30c9\u30aa\u30f3",
"after": "\u4ee5\u5f8c",
- "alarm_modes_armed_away": "\u5916\u51fa",
+ "alarm_modes_armed_away": "\u4e0d\u5728",
"alarm_modes_armed_custom_bypass": "\u30ab\u30b9\u30bf\u30e0",
- "alarm_modes_armed_home": "\u30db\u30fc\u30e0",
+ "alarm_modes_armed_home": "\u5728\u5b85",
"alarm_modes_armed_night": "\u591c\u9593",
"alarm_modes_armed_vacation": "\u30d0\u30b1\u30fc\u30b7\u30e7\u30f3",
"alarm_modes_disarmed": "\u8b66\u6212\u89e3\u9664",
@@ -147,7 +147,7 @@
"group": "\u30b0\u30eb\u30fc\u30d7",
"ha_url": "Home Assistant \u306eURL",
"heat": "\u6696\u623f",
- "heat_cool": "\u6696/\u51b7",
+ "heat_cool": "\u51b7\u6696\u623f",
"heating": "\u6696\u623f",
"hidden": "\u975e\u8868\u793a",
"hide": "\u975e\u8868\u793a",
@@ -253,6 +253,7 @@
"period_month": "\u6708",
"period_week": "\u9031",
"picture": "\u753b\u50cf",
+ "picture_elements": "\u30d4\u30af\u30c1\u30e3\u30fc\u30a8\u30ec\u30e1\u30f3\u30c8",
"playing": "\u30d7\u30ec\u30a4\u4e2d",
"position": "\u4f4d\u7f6e",
"precision": "\u8868\u793a\u7cbe\u5ea6",
diff --git a/static/translations/ka.json b/static/translations/ka.json
index 5a6d205..6c055fd 100644
--- a/static/translations/ka.json
+++ b/static/translations/ka.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "\u10d9\u10d5\u10d8\u10e0\u10d0",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "\u10de\u10dd\u10d6\u10d8\u10ea\u10d8\u10d0",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "\u10d3\u10d0\u10d0\u10e7\u10d4\u10dc\u10d4\u10d7 \u10d7\u10d4\u10d7\u10e0\u10d8",
"settings": "\u10de\u10d0\u10e0\u10d0\u10db\u10d4\u10e2\u10e0\u10d4\u10d1\u10d8",
diff --git a/static/translations/ko.json b/static/translations/ko.json
index f0cedf9..a79ef54 100644
--- a/static/translations/ko.json
+++ b/static/translations/ko.json
@@ -131,9 +131,9 @@
"fan_preset_mode": "\ud504\ub9ac\uc14b \ubaa8\ub4dc",
"fan_reverse": "\ub4a4\ub85c",
"fan_speed": "\ud32c \uc18d\ub3c4",
- "fan_speed_high": "\ub192\uc74c",
- "fan_speed_low": "\ub0ae\uc74c",
- "fan_speed_medium": "\ubcf4\ud1b5",
+ "fan_speed_high": "\uac15",
+ "fan_speed_low": "\uc57d",
+ "fan_speed_medium": "\uc911",
"fill": "\ucc44\uc6b0\uae30",
"finish": "\uc644\ub8cc",
"forecast_daily": "\ub9e4\uc77c",
@@ -152,7 +152,7 @@
"hidden": "\uc228\uae30\uae30",
"hide": "\uc228\uae30\uae30",
"high": "\ub192\uc74c",
- "history": "\uae30\ub85d \uadf8\ub798\ud504",
+ "history": "\ud788\uc2a4\ud1a0\ub9ac",
"home": "\uc7ac\uc2e4",
"horizontal": "\uc218\ud3c9",
"horizontal_stack": "\uc218\ud3c9 \ubaa8\uc544\ubcf4\uae30",
@@ -195,7 +195,6 @@
"login_error": "\uc624\ub958: {error}",
"low": "\ub0ae\uc74c",
"manage_account": "\uacc4\uc815 \uad00\ub9ac",
- "max": "\ucd5c\ub300",
"max_length": "\ucd5c\ub300 \uae38\uc774",
"max_plus": "\ucd5c\ub300 \ud50c\ub7ec\uc2a4",
"media": "\ubbf8\ub514\uc5b4",
@@ -253,6 +252,7 @@
"period_month": "\uc6d4",
"period_week": "\uc8fc",
"picture": "\uadf8\ub9bc",
+ "picture_elements": "\uadf8\ub9bc \ubcf5\ud569\uc694\uc18c",
"playing": "\uc7ac\uc0dd \uc911",
"position": "\uc704\uce58",
"precision": "\ub514\uc2a4\ud50c\ub808\uc774 \uc815\ubc00\ub3c4",
diff --git a/static/translations/lb.json b/static/translations/lb.json
index 4b7dcf8..060fa2c 100644
--- a/static/translations/lb.json
+++ b/static/translations/lb.json
@@ -175,6 +175,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Bild",
+ "picture_elements": "Biller Elementer",
"position": "Positioun",
"precision": "Display precision",
"preview": "Virschau vum Plang",
@@ -193,7 +194,6 @@
"section": "Sektioun",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Zoustand setzen",
"set_white": "Set white",
"settings": "Astellungen",
diff --git a/static/translations/lt.json b/static/translations/lt.json
index 8a6eb98..b582a6c 100644
--- a/static/translations/lt.json
+++ b/static/translations/lt.json
@@ -85,7 +85,7 @@
"copy": "Kopijuoti",
"counter": "Skaitiklis",
"current_humidity": "Dabartin\u0117 dr\u0117gm\u0117",
- "current_state": "srov\u0117",
+ "current_state": "dabar",
"custom": "Pasirinktinis",
"date": "Data",
"date_or_time": "Data ir (arba) laikas",
@@ -253,9 +253,10 @@
"period_month": "M\u0117nuo",
"period_week": "Savait\u0117",
"picture": "Paveiksl\u0117lis",
+ "picture_elements": "Paveiksl\u0117lio elementai",
"playing": "Groja",
"position": "Pad\u0117tis",
- "precision": "Ekrano tikslumas",
+ "precision": "Rodomas tikslumas",
"preview": "Per\u017ei\u016br\u0117ti technin\u012f plan\u0105",
"quiet": "Tyliai",
"raw": "Konfig\u016bracijos redaktorius",
@@ -381,7 +382,7 @@
"weather_lightning": "\u017daibas",
"weather_lightning_rainy": "\u017daibuoja, lietinga",
"weather_partlycloudy": "Debesuota",
- "weather_pouring": "Pilant",
+ "weather_pouring": "Lyja lietus",
"weather_rainy": "Lietinga",
"weather_snowy": "Snieguota",
"weather_snowy_rainy": "Snieguota, lietinga",
diff --git a/static/translations/lv.json b/static/translations/lv.json
index bc30e8e..9217a47 100644
--- a/static/translations/lv.json
+++ b/static/translations/lv.json
@@ -184,7 +184,6 @@
"login_error": "K\u013c\u016bda: {error}",
"low": "Zems",
"manage_account": "P\u0101rvald\u012bt kontu",
- "max": "Maks.",
"max_length": "Maksim\u0101lais garums",
"max_plus": "Max plus",
"media": "Mediji",
@@ -240,6 +239,7 @@
"period_month": "M\u0113nesis",
"period_week": "Ned\u0113\u013ca",
"picture": "Att\u0113ls",
+ "picture_elements": "Att\u0113la elementi",
"playing": "Atska\u0146o",
"position": "Poz\u012bcija",
"precision": "Noapa\u013co\u0161ana",
@@ -267,7 +267,7 @@
"set_white": "Uzst\u0101d\u012bt baltu",
"settings": "Konfigur\u0101cija",
"shortcuts": "Sa\u012bsnes",
- "show": "par\u0101d\u012bt",
+ "show": "Par\u0101d\u012bt",
"show_area": "Show {area}",
"show_in_sidebar": "R\u0101d\u012bt s\u0101njosl\u0101",
"show_more_info": "R\u0101d\u012bt vair\u0101k inform\u0101cijas",
@@ -324,13 +324,17 @@
"unsaved_changes": "Jums ir nesaglab\u0101tas izmai\u0146as. Vai esat p\u0101rliecin\u0101ts, ka v\u0113laties iziet?",
"unsaved_changes_title": "Nesaglab\u0101t\u0101s izmai\u0146as",
"update": "Atjaunin\u0101t",
+ "update_available": "Pieejams atjaunin\u0101jums",
"update_clear_skipped": "Not\u012br\u012bt izlaisto",
"update_create_backup": "Izveidot rezerves kopiju pirms atjaunin\u0101\u0161anas",
"update_install": "Uzst\u0101d\u012bt",
+ "update_installed_version": "Instal\u0113t\u0101 versija",
"update_installing": "Uzst\u0101d\u012b\u0161ana",
"update_installing_progress": "Uzst\u0101d\u012b\u0161ana ({progress}%)",
+ "update_latest_version": "Jaun\u0101k\u0101 versija",
"update_release_notes": "Las\u012bt rel\u012bzes pazi\u0146ojumu",
"update_skip": "Izlaist",
+ "update_up_to_date": "Aktu\u0101ls",
"url": "URL",
"username": "Lietot\u0101jv\u0101rds",
"vacuum": "Putek\u013cs\u016bc\u0113js",
diff --git a/static/translations/mk.json b/static/translations/mk.json
index 243e9d8..f846cd0 100644
--- a/static/translations/mk.json
+++ b/static/translations/mk.json
@@ -1,260 +1,265 @@
{
- "abort_login": "Login aborted",
- "above": "Above",
- "add": "Add",
- "add_condition": "Add condition",
- "add_item": "Add item",
- "add_view": "Add view",
- "addons": "Add-ons",
- "after": "After",
- "alarm_modes_armed_away": "Away",
- "alarm_modes_armed_custom_bypass": "Custom",
- "alarm_modes_armed_home": "Home",
- "alarm_modes_armed_night": "Night",
- "alarm_modes_armed_vacation": "Vacation",
- "alarm_modes_disarmed": "Disarmed",
- "alarm_modes_label": "Alarm modes",
- "and": "And",
- "appearance": "Appearance",
- "aspect_ratio": "Aspect ratio",
- "attributes": "Attributes",
- "auth": "Application credentials",
- "authorizing_client": "You're about to give {clientId} access to your Home Assistant instance.",
- "back": "Back",
- "battery": "Battery",
- "before": "Before",
- "below": "Below",
- "breakpoints": "Screen sizes",
- "breakpoints_desktop": "Desktop",
- "breakpoints_mobile": "Mobile",
- "breakpoints_tablet": "Tablet",
- "breakpoints_wide": "Wide",
- "brightness": "Brightness",
- "button": "Button",
- "buttons": "Buttons",
- "calendar": "Calendar",
- "calendar_error": "Could not retrieve events for calendars:",
- "cancel": "Cancel",
- "card_configuration": "Card configuration",
- "change_color": "Change color",
- "change_type": "Change type",
- "check_updates": "Check for updates",
- "checking_updates": "Checking for updates...",
- "clean_spot": "Clean spot",
- "clear_items": "Remove completed items",
- "close_cover": "Close cover",
- "close_tilt_cover": "Close cover tilt",
- "close_valve": "Close valve",
- "color": "Color",
- "color_temp": "Temperature",
- "columns": "Columns",
- "condition_error": "Condition did not pass",
- "condition_pass": "Condition passes",
- "conditional": "Conditional",
- "conditions": "Conditions",
- "configure": "Configure",
- "confirm_log_out": "Are you sure you want to log out?",
- "connection_lost": "Connection lost. Reconnecting\u2026",
- "connection_started": "Home Assistant has started!",
- "connection_starting": "Home Assistant is starting, not everything will be available until it is finished.",
- "copied": "Copied",
- "copy": "Copy",
- "current_state": "current",
- "date": "Date",
- "date_or_time": "Date and/or time",
- "day": "Day",
- "days_to_show": "Days to show",
- "delete": "Delete",
- "description": "Description",
- "detect": "Detect",
- "discovered": "Discovered",
- "divider": "Divider",
- "docs": "Documentation",
- "done": "Done",
- "drag_and_drop": "Drag and drop",
- "edit": "Edit",
- "edit_title": "Edit title",
- "edit_ui": "Edit UI",
- "edit_view": "Edit view",
- "edit_yaml": "Edit in YAML",
- "entities": "Entities",
- "entity": "Entity",
- "entity_not_found": "Entity not found",
- "error": "Error",
- "error_save_yaml": "Unable to save YAML: {error}",
- "event_delete": "Delete event",
- "event_fired": "Event {type} successfully fired!",
- "exit_edit_mode": "Done",
- "expand": "Expand",
- "fan_direction": "Direction",
- "fan_forward": "Forward",
- "fan_oscillate": "Oscillate",
- "fan_preset_mode": "Preset mode",
- "fan_reverse": "Reverse",
- "fan_speed": "Fan speed",
- "fan_speed_high": "High",
- "fan_speed_low": "Low",
- "fan_speed_medium": "Medium",
- "finish": "finish",
- "forecast_daily": "Daily",
- "forecast_hourly": "Hourly",
- "forecast_twice_daily": "Twice daily",
- "forecast_type": "Select forecast type",
- "forward": "Forward",
- "graph": "Graph",
- "group": "Group",
- "ha_url": "Home Assistant URL",
- "hidden": "Hidden",
- "hide": "Hide",
- "history": "History",
- "horizontal_stack": "Horizontal stack",
- "hours": "Hours",
- "icon": "Icon",
- "icons": "Icons",
- "iframe": "Webpage",
- "invalid_auth": "Invalid username or password",
- "invalid_code": "Invalid authentication code",
- "invalid_timestamp": "Invalid timestamp",
- "javascript_module": "JavaScript module",
- "key_missing": "Required key ''{key}'' is missing.",
- "language": "Language",
- "last_triggered": "Last triggered",
- "lawn_mower_commands": "Lawn mower commands:",
- "loading": "Loading\u2026",
- "locate": "Locate",
- "log_in": "Log in",
- "log_out": "Log out",
- "login": "Log in",
- "login_error": "Error: {error}",
- "manage_account": "Manage account",
- "max_length": "Maximum length",
- "media": "Media",
- "media_player": "Media control",
- "menu": "Menu",
- "mfa_code": "Two-factor authentication code",
- "mfa_description": "Open the {mfa_module_name} on your device to view your two-factor authentication code.",
- "min_length": "Minimum length",
- "minutes": "Minutes",
- "mobile": "Mobile",
- "month": "Month",
- "motion": "Motion",
- "name": "Name",
- "navigate": "Navigate",
- "never_triggered": "Never triggered",
- "no": "No",
- "no_entities": "No entities",
- "no_options": "There are no options yet.",
- "none": "None",
- "nothing_configured": "Nothing configured yet",
- "nothing_found": "Nothing found!",
- "nothing_playing": "Nothing playing",
- "notifications": "Notifications",
- "notifications_dismiss": "Dismiss",
- "notifications_empty": "No notifications",
- "numeric_state": "Numeric state",
- "object": "Object",
+ "abort_login": "\u041d\u0430\u0458\u0430\u0432\u0430\u0442\u0430 \u0435 \u043f\u0440\u0435\u043a\u0438\u043d\u0430\u0442\u0430",
+ "above": "\u041d\u0430\u0434",
+ "add": "\u0414\u043e\u0434\u0430\u0458\u0442\u0435",
+ "add_condition": "\u0414\u043e\u0434\u0430\u0434\u0435\u0442\u0435 \u0443\u0441\u043b\u043e\u0432",
+ "add_item": "\u0414\u043e\u0434\u0430\u0434\u0435\u0442\u0435 \u0441\u0442\u0430\u0432\u043a\u0430",
+ "add_view": "\u0414\u043e\u0434\u0430\u0434\u0438 \u043f\u043e\u0433\u043b\u0435\u0434",
+ "addons": "\u0414\u043e\u0434\u0430\u0442\u043e\u0446\u0438",
+ "after": "\u041f\u043e",
+ "alarm_modes_armed_away": "\u041d\u0430\u0434\u0432\u043e\u0440 \u043e\u0434 \u0434\u043e\u043c\u0430",
+ "alarm_modes_armed_custom_bypass": "\u041f\u0440\u0438\u043b\u0430\u0433\u043e\u0434\u0435\u043d\u043e",
+ "alarm_modes_armed_home": "\u0414\u043e\u043c\u0430",
+ "alarm_modes_armed_night": "\u041d\u043e\u045c",
+ "alarm_modes_armed_vacation": "\u041e\u0434\u043c\u043e\u0440",
+ "alarm_modes_disarmed": "\u0418\u0441\u043a\u043b\u0443\u0447\u0435\u043d",
+ "alarm_modes_label": "\u0420\u0435\u0436\u0438\u043c\u0438 \u043d\u0430 \u0430\u043b\u0430\u0440\u043c",
+ "and": "\u0418",
+ "appearance": "\u0418\u0437\u0433\u043b\u0435\u0434",
+ "aspect_ratio": "\u0421\u043e\u043e\u0434\u043d\u043e\u0441",
+ "attributes": "\u0410\u0442\u0440\u0438\u0431\u0443\u0442\u0438",
+ "auth": "\u041a\u0440\u0435\u0434\u0435\u043d\u0446\u0438\u0458\u0430\u043b\u0438 \u043d\u0430 \u0430\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0458\u0430\u0442\u0430",
+ "authorizing_client": "\u040c\u0435 \u0434\u0430\u0434\u0435\u0442\u0435 \u043f\u0440\u0438\u0441\u0442\u0430\u043f \u043d\u0430 {clientid} \u0434\u043e \u0432\u0430\u0448\u0430\u0442\u0430 Home Assistant \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0430.",
+ "back": "\u041d\u0430\u0437\u0430\u0434",
+ "battery": "\u0411\u0430\u0442\u0435\u0440\u0438\u0458\u0430",
+ "before": "\u041f\u0440\u0435\u0434",
+ "below": "\u041f\u043e\u0434",
+ "breakpoints": "\u0413\u043e\u043b\u0435\u043c\u0438\u043d\u0438 \u043d\u0430 \u0435\u043a\u0440\u0430\u043d\u043e\u0442",
+ "breakpoints_desktop": "\u0414\u0435\u0441\u043a\u0442\u043e\u043f",
+ "breakpoints_mobile": "\u041c\u043e\u0431\u0438\u043b\u0435\u043d",
+ "breakpoints_tablet": "\u0422\u0430\u0431\u043b\u0435\u0442",
+ "breakpoints_wide": "\u0428\u0438\u0440\u043e\u043a",
+ "brightness": "\u041e\u0441\u0432\u0435\u0442\u043b\u0435\u043d\u043e\u0441\u0442",
+ "button": "\u041a\u043e\u043f\u0447\u0435",
+ "buttons": "\u041a\u043e\u043f\u0447\u0438\u045a\u0430",
+ "calendar": "\u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440",
+ "calendar_error": "\u041d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0432\u0440\u0430\u0442\u0430\u0442 \u043d\u0430\u0441\u0442\u0430\u043d\u0438\u0442\u0435 \u0437\u0430 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0438\u0442\u0435:",
+ "cancel": "\u041e\u0442\u043a\u0430\u0436\u0438",
+ "card_configuration": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0458\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u0447\u043a\u0430",
+ "change_color": "\u041f\u0440\u043e\u043c\u0435\u043d\u0435\u0442\u0435 \u0458\u0430 \u0431\u043e\u0458\u0430\u0442\u0430",
+ "change_type": "\u041f\u0440\u043e\u043c\u0435\u043d\u0435\u0442\u0435 \u0433\u043e \u0442\u0438\u043f\u043e\u0442",
+ "check_updates": "\u041f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0434\u0430\u043b\u0438 \u0438\u043c\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045a\u0430",
+ "checking_updates": "\u0421\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0443\u0432\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045a\u0430...",
+ "clean_spot": "\u0427\u0438\u0441\u0442\u043e \u043c\u0435\u0441\u0442\u043e",
+ "clear_items": "\u041e\u0442\u0441\u0442\u0440\u0430\u043d\u0435\u0442\u0435 \u0433\u0438 \u0437\u0430\u0432\u0440\u0448\u0435\u043d\u0438\u0442\u0435 \u0441\u0442\u0430\u0432\u043a\u0438",
+ "close_cover": "\u0417\u0430\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0433\u043e \u043a\u0430\u043f\u0430\u043a\u043e\u0442",
+ "close_tilt_cover": "\u0417\u0430\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0433\u043e \u043a\u0430\u043f\u0430\u043a\u043e\u0442 (\u043d\u0430\u043a\u043b\u043e\u043d\u0435\u0442)",
+ "close_valve": "\u0417\u0430\u0442\u0432\u043e\u0440\u0438 \u0432\u0435\u043d\u0442\u0438\u043b",
+ "code": "\u041a\u043e\u0434",
+ "color": "\u0411\u043e\u0458\u0430",
+ "color_temp": "\u0422\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",
+ "columns": "\u041a\u043e\u043b\u043e\u043d\u0438",
+ "condition_error": "\u0423\u0441\u043b\u043e\u0432\u043e\u0442 \u043d\u0435 \u043f\u043e\u043c\u0438\u043d\u0430",
+ "condition_pass": "\u0423\u0441\u043b\u043e\u0432\u043e\u0442 \u043f\u043e\u043c\u0438\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e",
+ "conditional": "\u0423\u0441\u043b\u043e\u0432\u043d\u043e",
+ "conditions": "\u0423\u0441\u043b\u043e\u0432\u0438",
+ "configure": "\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0458",
+ "confirm_delete_message": "\u0414\u0430\u043b\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0435\u043a\u0430 \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u0433\u043e \u0438\u0437\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u0432\u0430\u0448\u0438\u043e\u0442 \u043f\u0440\u0438\u043a\u0430\u0437 '' {name} ''? \u041f\u0440\u0438\u043a\u0430\u0437\u043e\u0442 \u0441\u043e\u0434\u0440\u0436\u0438 {number} \u043a\u0430\u0440\u0442\u0438\u0447\u043a\u0438 \u0448\u0442\u043e \u045c\u0435 \u0441\u0435 \u0438\u0437\u0431\u0440\u0438\u0448\u0430\u0442. \u041e\u0432\u0430 \u0434\u0435\u0458\u0441\u0442\u0432\u043e \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0432\u0440\u0430\u0442\u0438.",
+ "confirm_log_out": "\u0414\u0430\u043b\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0435\u043a\u0430 \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u0441\u0435 \u043e\u0434\u0458\u0430\u0432\u0438\u0442\u0435?",
+ "connection_lost": "\u0418\u0437\u0433\u0443\u0431\u0435\u043d\u0430 \u043a\u043e\u043d\u0435\u043a\u0446\u0438\u0458\u0430. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043f\u043e\u0432\u0440\u0437\u0443\u0432\u0430\u045a\u0435\u2026",
+ "connection_started": "Home Assistant \u0435 \u0441\u0442\u0430\u0440\u0442\u0443\u0432\u0430\u043d!",
+ "connection_starting": "\u0421\u0435 \u0441\u0442\u0430\u0440\u0442\u0443\u0432\u0430 Home Assistant, \u043d\u0435\u043c\u0430 \u0441\u00e8 \u0434\u0430 \u0431\u0438\u0434\u0435 \u0434\u043e\u0441\u0442\u0430\u043f\u043d\u043e \u0434\u043e\u0434\u0435\u043a\u0430 \u043d\u0435 \u0441\u0435 \u0437\u0430\u0432\u0440\u0448\u0438.",
+ "copied": "\u041a\u043e\u043f\u0438\u0440\u0430\u043d\u043e",
+ "copy": "\u041a\u043e\u043f\u0438\u0440\u0430\u0458",
+ "current_state": "\u0442\u0435\u043a\u043e\u0432\u0435\u043d",
+ "date": "\u0414\u0430\u0442\u0443\u043c",
+ "date_or_time": "\u0414\u0430\u0442\u0443\u043c \u0438/\u0438\u043b\u0438 \u0432\u0440\u0435\u043c\u0435",
+ "day": "\u0414\u0435\u043d",
+ "days_to_show": "\u0414\u0435\u043d\u043e\u0432\u0438 \u0437\u0430 \u043f\u0440\u0438\u043a\u0430\u0436\u0443\u0432\u0430\u045a\u0435",
+ "delete": "\u0418\u0437\u0431\u0440\u0438\u0448\u0438",
+ "description": "\u041e\u043f\u0438\u0441",
+ "detect": "\u041e\u0442\u043a\u0440\u0438",
+ "discovered": "\u041e\u0442\u043a\u0440\u0438\u0435\u043d\u0438",
+ "divider": "\u0420\u0430\u0437\u0434\u0435\u043b\u043d\u0438\u043a",
+ "docs": "\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0458\u0430",
+ "done": "\u0413\u043e\u0442\u043e\u0432\u043e",
+ "drag_and_drop": "\u041f\u043e\u0432\u043b\u0435\u0447\u0438 \u0438 \u043f\u0443\u0448\u0442\u0438",
+ "edit": "\u0423\u0440\u0435\u0434\u0438",
+ "edit_title": "\u0423\u0440\u0435\u0434\u0438 \u043d\u0430\u0441\u043b\u043e\u0432",
+ "edit_ui": "\u0423\u0440\u0435\u0434\u0438 UI",
+ "edit_view": "\u0423\u0440\u0435\u0434\u0438 \u043f\u043e\u0433\u043b\u0435\u0434",
+ "edit_yaml": "\u0423\u0440\u0435\u0434\u0438 \u0432\u043e YAML",
+ "entities": "\u0415\u043d\u0442\u0438\u0442\u0435\u0442\u0438",
+ "entity": "\u0415\u043d\u0442\u0438\u0442\u0435\u0442",
+ "entity_not_found": "\u0415\u043d\u0442\u0438\u0442\u0435\u0442\u043e\u0442 \u043d\u0435 \u0435 \u043f\u0440\u043e\u043d\u0430\u0458\u0434\u0435\u043d",
+ "error": "\u0413\u0440\u0435\u0448\u043a\u0430",
+ "error_save_yaml": "\u041d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0437\u0430\u0447\u0443\u0432\u0430 YAML: {error}",
+ "event_delete": "\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043d\u0430\u0441\u0442\u0430\u043d",
+ "event_fired": "\u041d\u0430\u0441\u0442\u0430\u043d\u043e\u0442 {type} \u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u043a\u043b\u0443\u0447\u0435\u043d!",
+ "exit_edit_mode": "\u0413\u043e\u0442\u043e\u0432\u043e",
+ "expand": "\u041f\u0440\u043e\u0448\u0438\u0440\u0438",
+ "fan_direction": "\u041d\u0430\u0441\u043e\u043a\u0430",
+ "fan_forward": "\u041d\u0430\u043f\u0440\u0435\u0434",
+ "fan_oscillate": "\u041e\u0441\u0446\u0438\u043b\u0438\u0440\u0430\u045a\u0435",
+ "fan_preset_mode": "\u041f\u0440\u0435\u0442\u0445\u043e\u0434\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0435\u043d \u0440\u0435\u0436\u0438\u043c",
+ "fan_reverse": "\u041e\u0431\u0440\u0430\u0442\u043d\u043e",
+ "fan_speed": "\u0411\u0440\u0437\u0438\u043d\u0430 \u043d\u0430 \u0432\u0435\u043d\u0442\u0438\u043b\u0430\u0442\u043e\u0440",
+ "fan_speed_high": "\u0412\u0438\u0441\u043e\u043a\u043e",
+ "fan_speed_low": "\u041d\u0438\u0441\u043a\u043e",
+ "fan_speed_medium": "\u0421\u0440\u0435\u0434\u043d\u043e",
+ "finish": "\u0437\u0430\u0432\u0440\u0448\u0438",
+ "forecast_daily": "\u0414\u043d\u0435\u0432\u043d\u043e",
+ "forecast_hourly": "\u0421\u0435\u043a\u043e\u0458 \u0447\u0430\u0441",
+ "forecast_twice_daily": "\u0414\u0432\u0430\u043f\u0430\u0442\u0438 \u0434\u043d\u0435\u0432\u043d\u043e",
+ "forecast_type": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0442\u0438\u043f \u043d\u0430 \u043f\u0440\u043e\u0433\u043d\u043e\u0437\u0430",
+ "forward": "\u041d\u0430\u043f\u0440\u0435\u0434",
+ "graph": "\u0413\u0440\u0430\u0444\u0438\u043a\u043e\u043d",
+ "group": "\u0413\u0440\u0443\u043f\u0430",
+ "ha_url": "URL \u043d\u0430 Home Assistant",
+ "hidden": "\u0421\u043a\u0440\u0438\u0435\u043d\u0438",
+ "hide": "\u0421\u043e\u043a\u0440\u0438\u0458",
+ "history": "\u0418\u0441\u0442\u043e\u0440\u0438\u0458\u0430",
+ "horizontal_stack": "\u0425\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0435\u043d \u0441\u0442\u0435\u043a",
+ "hours": "\u0427\u0430\u0441\u043e\u0432\u0438",
+ "icon": "\u0418\u043a\u043e\u043d\u0430",
+ "icons": "\u0418\u043a\u043e\u043d\u0438",
+ "iframe": "\u0412\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0430",
+ "invalid_auth": "\u041f\u043e\u0433\u0440\u0435\u0448\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u043e \u0438\u043c\u0435 \u0438\u043b\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0430",
+ "invalid_code": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u0435\u043d \u043a\u043e\u0434 \u0437\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u0458\u0430",
+ "invalid_timestamp": "\u041d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0441\u043a\u0430 \u043e\u0437\u043d\u0430\u043a\u0430",
+ "javascript_module": "JavaScript \u043c\u043e\u0434\u0443\u043b",
+ "key_missing": "\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0441\u0443\u0432\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0435\u043d \u043a\u043b\u0443\u0447 ''{key}''.",
+ "language": "\u0408\u0430\u0437\u0438\u043a",
+ "last_triggered": "\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u043e \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043d\u043e",
+ "lawn_mower_commands": "\u041a\u043e\u043c\u0430\u043d\u0434\u0438 \u043d\u0430 \u043a\u043e\u0441\u0438\u043b\u043a\u0430\u0442\u0430 \u0437\u0430 \u0442\u0440\u0435\u0432\u0430:",
+ "loading": "\u0421\u0435 \u0432\u0447\u0438\u0442\u0443\u0432\u0430\u2026",
+ "locate": "\u041b\u043e\u0446\u0438\u0440\u0430\u0458\u0442\u0435",
+ "log_in": "\u041b\u043e\u0433\u0438\u0440\u0430\u0458 \u0441\u0435",
+ "log_out": "\u041e\u0434\u0458\u0430\u0432\u0438 \u0441\u0435",
+ "login": "\u041b\u043e\u0433\u0438\u0440\u0430\u0458 \u0441\u0435",
+ "login_error": "\u0413\u0440\u0435\u0448\u043a\u0430: {error}",
+ "manage_account": "\u0423\u043f\u0440\u0430\u0432\u0443\u0432\u0430\u045a\u0435 \u0441\u043e \u0441\u043c\u0435\u0442\u043a\u0430",
+ "max_length": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u043d\u0430 \u0434\u043e\u043b\u0436\u0438\u043d\u0430",
+ "media": "\u041c\u0435\u0434\u0438\u0443\u043c\u0438",
+ "media_player": "\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u0430 \u0437\u0430 \u043c\u0435\u0434\u0438\u0443\u043c\u0438\u0442\u0435",
+ "menu": "\u041c\u0435\u043d\u0438",
+ "mfa_code": "\u041a\u043e\u0434 \u0437\u0430 \u0434\u0432\u043e\u0444\u0430\u043a\u0442\u043e\u0440\u0441\u043a\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u0458\u0430",
+ "mfa_description": "\u041e\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0433\u043e {mfa_module_name} \u043d\u0430 \u0432\u0430\u0448\u0438\u043e\u0442 \u0443\u0440\u0435\u0434 \u0437\u0430 \u0434\u0430 \u0433\u043e \u0432\u0438\u0434\u0438\u0442\u0435 \u0432\u0430\u0448\u0438\u043e\u0442 \u0434\u0432\u043e\u0444\u0430\u043a\u0442\u043e\u0440\u0441\u043a\u0438 \u043a\u043e\u0434 \u0437\u0430 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u043a\u0430\u0446\u0438\u0458\u0430.",
+ "min_length": "\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u043d\u0430 \u0434\u043e\u043b\u0436\u0438\u043d\u0430",
+ "minutes": "\u041c\u0438\u043d\u0443\u0442\u0438",
+ "mobile": "\u041c\u043e\u0431\u0438\u043b\u0435\u043d",
+ "month": "\u041c\u0435\u0441\u0435\u0446",
+ "motion": "\u0414\u0432\u0438\u0436\u0435\u045a\u0435",
+ "name": "\u0418\u043c\u0435",
+ "navigate": "\u041d\u0430\u0432\u0438\u0433\u0438\u0440\u0430\u0458",
+ "never_triggered": "\u041d\u0438\u043a\u043e\u0433\u0430\u0448 \u043d\u0435 \u0441\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u043b",
+ "no": "\u041d\u0435",
+ "no_entities": "\u041d\u0435\u043c\u0430 \u0435\u043d\u0442\u0438\u0442\u0435\u0442\u0438",
+ "no_options": "\u0421\u00e8 \u0443\u0448\u0442\u0435 \u043d\u0435\u043c\u0430 \u043e\u043f\u0446\u0438\u0438.",
+ "none": "\u041d\u0435\u043c\u0430",
+ "nothing_configured": "\u0421\u00e8 \u0443\u0448\u0442\u0435 \u043d\u0438\u0448\u0442\u043e \u043d\u0435 \u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u043d\u043e",
+ "nothing_found": "\u041d\u0438\u0448\u0442\u043e \u043d\u0435 \u0435 \u043f\u0440\u043e\u043d\u0430\u0458\u0434\u0435\u043d\u043e!",
+ "nothing_playing": "\u041d\u0438\u0448\u0442\u043e \u043d\u0435 \u0435 \u043f\u0443\u0448\u0442\u0435\u043d\u043e",
+ "notifications": "\u0418\u0437\u0432\u0435\u0441\u0442\u0443\u0432\u0430\u045a\u0430",
+ "notifications_dismiss": "\u041e\u0442\u0444\u0440\u043b\u0438",
+ "notifications_empty": "\u041d\u0435\u043c\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u0443\u0432\u0430\u045a\u0430",
+ "numeric_state": "\u041d\u0443\u043c\u0435\u0440\u0438\u0447\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u0458\u0431\u0430",
+ "object": "\u041e\u0431\u0458\u0435\u043a\u0442",
"ok": "OK",
- "open_cover": "Open cover",
- "open_door": "Open door",
- "open_menu": "Open dashboard menu",
- "open_tilt_cover": "Open cover tilt",
- "open_valve": "Open valve",
- "optional": "optional",
- "options": "Options",
- "or": "Or",
- "overview": "Overview",
- "password": "Password",
- "pause": "Pause",
- "period": "Period",
- "period_5minute": "5 Minutes",
- "period_day": "Day",
- "period_hour": "Hour",
- "period_month": "Month",
- "period_week": "Week",
- "picture": "Picture",
- "position": "Position",
- "precision": "Display precision",
- "preview": "Preview",
- "raw": "Raw configuration editor",
- "remove": "Remove",
- "return_home": "Return home",
- "running": "Running\u2026",
- "save": "Save",
- "saved": "Saved",
- "say": "Say",
- "scenes": "Scenes",
- "screen": "Screen",
- "script": "Script",
- "search": "Search",
- "seconds": "Seconds",
- "section": "Section",
- "sensor": "Sensor",
- "service": "Service",
- "service_data": "Service data",
- "set_state": "Set state",
- "set_white": "Set white",
- "settings": "Settings",
- "shortcuts": "Shortcuts",
- "show": "Show",
- "show_area": "Show {area}",
- "show_in_sidebar": "Show in sidebar",
- "show_more_info": "Show more information",
- "show_password": "Show password",
- "sidebar": "Sidebar",
- "size": "Size",
- "start": "Start",
- "start_mowing": "Start mowing",
- "start_over": "Start over",
- "start_pause": "Start/pause",
- "state": "State",
- "state_equal": "State is equal to",
- "state_not_equal": "State is not equal to",
- "status": "Status",
- "stop": "Stop",
- "stop_cover": "Stop cover",
- "stop_valve": "Stop valve",
- "successfully_saved": "Successfully saved",
- "suggestion": "We created a suggestion for you",
- "summary": "Summary",
- "target": "Target",
- "template": "Template",
- "template_editor": "Template editor",
- "text": "Text",
- "theme": "Theme",
- "tilt_position": "Tilt position",
- "time": "Time",
- "time_format_12": "12 hours (AM/PM)",
- "time_format_24": "24 hours",
- "time_format_auto": "Auto (use language setting)",
- "time_format_description": "Choose how times are formatted.",
- "time_format_header": "Time format",
- "timer": "Timer",
- "today": "Today",
- "todo_list": "To-do list",
- "toggle": "Toggle",
- "token": "Long-lived access tokens",
- "trigger": "Run actions",
- "unavailable": "Unavailable",
- "undo": "Undo",
- "unknown": "Unknown",
- "unsaved_changes": "You have unsaved changes, are you sure you want to exit?",
- "unsaved_changes_title": "Unsaved changes",
- "update_clear_skipped": "Clear skipped",
- "update_create_backup": "Create backup before updating",
- "update_install": "Install",
- "update_installing": "Installing",
- "update_installing_progress": "Installing ({progress}%)",
- "update_release_notes": "Read release announcement",
- "update_skip": "Skip",
+ "open_cover": "\u041e\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0433\u043e \u043a\u0430\u043f\u0430\u043a\u043e\u0442",
+ "open_door": "\u041e\u0442\u0432\u043e\u0440\u0438 \u0432\u0440\u0430\u0442\u0430",
+ "open_door_success": "\u041e\u0442\u0432\u043e\u0440\u0435\u043d\u0430 \u0432\u0440\u0430\u0442\u0430",
+ "open_menu": "\u041e\u0442\u0432\u043e\u0440\u0438 \u0433\u043e \u043c\u0435\u043d\u0438\u0442\u043e \u043d\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043d\u0430\u0442\u0430 \u0442\u0430\u0431\u043b\u0430",
+ "open_tilt_cover": "\u041e\u0442\u0432\u043e\u0440\u0435\u0442\u0435 \u0433\u043e \u043a\u0430\u043f\u0430\u043a\u043e\u0442 (\u043d\u0430\u043a\u043b\u043e\u043d\u0435\u0442)",
+ "open_valve": "\u041e\u0442\u0432\u043e\u0440\u0438 \u0432\u0435\u043d\u0442\u0438\u043b",
+ "optional": "\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u043d\u043e",
+ "options": "\u041e\u043f\u0446\u0438\u0438",
+ "or": "\u0418\u043b\u0438",
+ "overview": "\u041f\u0440\u0435\u0433\u043b\u0435\u0434",
+ "password": "\u041b\u043e\u0437\u0438\u043d\u043a\u0430",
+ "pause": "\u041f\u0430\u0443\u0437\u0430",
+ "period": "\u041f\u0435\u0440\u0438\u043e\u0434",
+ "period_5minute": "5 \u043c\u0438\u043d\u0443\u0442\u0438",
+ "period_day": "\u0414\u0435\u043d",
+ "period_hour": "\u0427\u0430\u0441",
+ "period_month": "\u041c\u0435\u0441\u0435\u0446",
+ "period_week": "\u041d\u0435\u0434\u0435\u043b\u0430",
+ "picture": "\u0421\u043b\u0438\u043a\u0430",
+ "picture_elements": "\u0415\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u043d\u0430 \u0441\u043b\u0438\u043a\u0430\u0442\u0430",
+ "position": "\u041f\u043e\u0437\u0438\u0446\u0438\u0458\u0430",
+ "precision": "\u041f\u0440\u0435\u0446\u0438\u0437\u043d\u043e\u0441\u0442 \u043d\u0430 \u043f\u0440\u0438\u043a\u0430\u0436\u0443\u0432\u0430\u045a\u0435",
+ "preview": "\u041f\u0440\u0435\u0433\u043b\u0435\u0434",
+ "raw": "\u041d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0435\u043d \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0441\u043a\u0438 \u0443\u0440\u0435\u0434\u043d\u0438\u043a",
+ "remove": "\u041e\u0442\u0441\u0442\u0440\u0430\u043d\u0438",
+ "return_home": "\u0412\u0440\u0430\u0442\u0438 \u0441\u0435 \u0434\u043e\u043c\u0430",
+ "running": "\u0421\u0435 \u0438\u0437\u0432\u0440\u0448\u0443\u0432\u0430\u2026",
+ "save": "\u0417\u0430\u0447\u0443\u0432\u0430\u0458",
+ "saved": "\u0417\u0430\u0447\u0443\u0432\u0430\u043d\u043e",
+ "say": "\u041a\u0430\u0436\u0438",
+ "scenes": "\u0421\u0446\u0435\u043d\u0438",
+ "screen": "\u0415\u043a\u0440\u0430\u043d",
+ "script": "\u0421\u043a\u0440\u0438\u043f\u0442\u0430",
+ "search": "\u041f\u0440\u0435\u0431\u0430\u0440\u0430\u0458\u0442\u0435",
+ "seconds": "\u0421\u0435\u043a\u0443\u043d\u0434\u0438",
+ "section": "\u0421\u0435\u043a\u0446\u0438\u0458\u0430",
+ "sensor": "\u041a\u043b\u0430\u0441\u0438 \u043d\u0430 \u0441\u0435\u043d\u0437\u043e\u0440\u0438",
+ "service": "\u0421\u0435\u0440\u0432\u0438\u0441",
+ "service_data": "\u041f\u043e\u0434\u0430\u0442\u043e\u0446\u0438 \u0437\u0430 \u0443\u0441\u043b\u0443\u0433\u0430\u0442\u0430",
+ "set_state": "\u041f\u043e\u0441\u0442\u0430\u0432\u0438 \u0441\u043e\u0441\u0442\u043e\u0458\u0431\u0430",
+ "set_white": "\u041f\u043e\u0441\u0442\u0430\u0432\u0435\u0442\u0435 \u0431\u0435\u043b\u043e",
+ "settings": "\u041f\u043e\u0441\u0442\u0430\u0432\u0443\u0432\u0430\u045a\u0430",
+ "shortcuts": "\u041a\u0440\u0430\u0442\u0435\u043d\u043a\u0438",
+ "show": "\u041f\u0440\u0438\u043a\u0430\u0436\u0438",
+ "show_area": "\u041f\u0440\u0438\u043a\u0430\u0436\u0438 {area}",
+ "show_in_sidebar": "\u041f\u0440\u0438\u043a\u0430\u0436\u0438 \u0432\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u0430\u0442\u0430 \u043b\u0435\u043d\u0442\u0430",
+ "show_more_info": "\u041f\u0440\u0438\u043a\u0430\u0436\u0435\u0442\u0435 \u043f\u043e\u0432\u0435\u045c\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438",
+ "show_password": "\u041f\u043e\u043a\u0430\u0436\u0438 \u043b\u043e\u0437\u0438\u043d\u043a\u0430",
+ "sidebar": "\u0421\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u0430 \u043b\u0435\u043d\u0442\u0430",
+ "size": "\u0413\u043e\u043b\u0435\u043c\u0438\u043d\u0430",
+ "start": "\u0421\u0442\u0430\u0440\u0442",
+ "start_mowing": "\u0417\u0430\u043f\u043e\u0447\u043d\u0435\u0442\u0435 \u0441\u043e \u043a\u043e\u0441\u0435\u045a\u0435",
+ "start_over": "\u0417\u0430\u043f\u043e\u0447\u043d\u0435\u0442\u0435 \u043e\u0434\u043d\u043e\u0432\u043e",
+ "start_pause": "\u0421\u0442\u0430\u0440\u0442/\u043f\u0430\u0443\u0437\u0430",
+ "state": "\u0421\u043e\u0441\u0442\u043e\u0458\u0431\u0430",
+ "state_equal": "\u0421\u043e\u0441\u0442\u043e\u0458\u0431\u0430\u0442\u0430 \u0435 \u0435\u0434\u043d\u0430\u043a\u0432\u0430 \u043d\u0430",
+ "state_not_equal": "\u0421\u043e\u0441\u0442\u043e\u0458\u0431\u0430\u0442\u0430 \u043d\u0435 \u0435 \u0435\u0434\u043d\u0430\u043a\u0432\u0430 \u043d\u0430",
+ "status": "\u0421\u0442\u0430\u0442\u0443\u0441",
+ "stop": "\u0421\u0442\u043e\u043f",
+ "stop_cover": "\u0417\u0430\u043f\u0440\u0438 \u043f\u043e\u043a\u0440\u0438\u0435\u043d\u043e\u0441\u0442",
+ "stop_valve": "\u0417\u0430\u043f\u0440\u0438 \u0432\u0435\u043d\u0442\u0438\u043b",
+ "successfully_saved": "\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0447\u0443\u0432\u0430\u043d\u043e",
+ "suggestion": "\u041d\u0438\u0435 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0432\u043c\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0433 \u0437\u0430 \u0432\u0430\u0441",
+ "summary": "\u0420\u0435\u0437\u0438\u043c\u0435",
+ "target": "\u0426\u0435\u043b",
+ "template": "\u0428\u0430\u0431\u043b\u043e\u043d",
+ "template_editor": "\u0423\u0440\u0435\u0434\u0443\u0432\u0430\u0447 \u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0438",
+ "text": "\u0422\u0435\u043a\u0441\u0442",
+ "theme": "\u0422\u0435\u043c\u0430",
+ "tilt_position": "\u041d\u0430\u043a\u043b\u043e\u043d\u0435\u0442\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0458\u0430",
+ "time": "\u0412\u0440\u0435\u043c\u0435",
+ "time_format_12": "12 \u0447\u0430\u0441\u0430 (AM/PM)",
+ "time_format_24": "24 \u0447\u0430\u0441\u0430",
+ "time_format_auto": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0441\u043a\u043e (\u043a\u043e\u0440\u0438\u0441\u0442\u0435\u0442\u0435 \u0458\u0430\u0437\u0438\u0447\u043d\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0430)",
+ "time_format_description": "\u0418\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u043a\u0430\u043a\u043e \u0434\u0430 \u0441\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0430\u0430\u0442 \u0432\u0440\u0435\u043c\u0438\u045a\u0430\u0442\u0430.",
+ "time_format_header": "\u0424\u043e\u0440\u043c\u0430\u0442 \u043d\u0430 \u0432\u0440\u0435\u043c\u0435",
+ "timer": "\u0422\u0430\u0458\u043c\u0435\u0440",
+ "today": "\u0414\u0435\u043d\u0435\u0441",
+ "todo_list": "\u041b\u0438\u0441\u0442a \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438",
+ "toggle": "\u0412\u043a\u043b\u0443\u0447\u0438/\u0438\u0441\u043a\u043b\u0443\u0447\u0438",
+ "token": "\u0414\u043e\u043b\u0433\u043e\u0442\u0440\u0430\u0435\u043d \u0442\u043e\u043a\u0435\u043d \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u043f",
+ "trigger": "\u0418\u0437\u0432\u0440\u0448\u0435\u0442\u0435 \u0430\u043a\u0446\u0438\u0438",
+ "unavailable": "\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u043f\u043d\u043e",
+ "undo": "\u0412\u0440\u0430\u0442\u0438",
+ "unknown": "\u041d\u0435\u043f\u043e\u0437\u043d\u0430\u0442\u043e",
+ "unsaved_changes": "\u0418\u043c\u0430\u0442\u0435 \u043d\u0435\u0437\u0430\u0447\u0443\u0432\u0430\u043d\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438, \u0434\u0430\u043b\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043d\u0438 \u0434\u0435\u043a\u0430 \u0441\u0430\u043a\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u043b\u0435\u0437\u0435\u0442\u0435?",
+ "unsaved_changes_title": "\u041d\u0435\u0437\u0430\u0447\u0443\u0432\u0430\u043d\u0438 \u043f\u0440\u043e\u043c\u0435\u043d\u0438",
+ "update_clear_skipped": "\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043f\u0440\u0435\u0441\u043a\u043e\u043a\u043d\u0430\u0442\u0438",
+ "update_create_backup": "\u041d\u0430\u043f\u0440\u0430\u0432\u0435\u0442\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0430 \u043a\u043e\u043f\u0438\u0458\u0430 \u043f\u0440\u0435\u0434 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045a\u0435\u0442\u043e",
+ "update_install": "\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u0458\u0442\u0435",
+ "update_installing": "\u0418\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u045a\u0435",
+ "update_installing_progress": "\u0421\u0435 \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430 ({progress}%)",
+ "update_release_notes": "\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0433\u043e \u0441\u043e\u043e\u043f\u0448\u0442\u0435\u043d\u0438\u0435\u0442\u043e \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045a\u0435\u0442\u043e",
+ "update_skip": "\u041f\u0440\u0435\u0441\u043a\u043e\u043a\u043d\u0435\u0442\u0435",
"url": "URL",
- "username": "Username",
- "vacuum_commands": "Vacuum cleaner commands:",
- "visibility": "Visibility",
- "visibility_explanation": "The card will be shown when ALL conditions below are fulfilled. If no conditions are set, the card will always be shown.",
- "visible": "Visible",
- "weather_forecast": "Forecast",
- "week": "Week",
- "welcome_home": "Welcome Home",
- "year": "year",
- "yes": "Yes"
+ "username": "\u041a\u043e\u0440\u0438\u0441\u043d\u0438\u0447\u043a\u043e \u0438\u043c\u0435",
+ "vacuum_commands": "\u041a\u043e\u043c\u0430\u043d\u0434\u0438 \u0437\u0430 \u043f\u0440\u0430\u0432\u043e\u0441\u043c\u0443\u043a\u0430\u043b\u043a\u0430",
+ "value": "\u0412\u0440\u0435\u0434\u043d\u043e\u0441\u0442",
+ "visibility": "\u0412\u0438\u0434\u043b\u0438\u0432\u043e\u0441\u0442",
+ "visibility_explanation": "\u041a\u0430\u0440\u0442\u0438\u0447\u043a\u0430\u0442\u0430 \u045c\u0435 \u0441\u0435 \u043f\u0440\u0438\u043a\u0430\u0436\u0435 \u043a\u043e\u0433\u0430 \u045c\u0435 \u0441\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0430\u0442 \u0421\u0418\u0422\u0415 \u0443\u0441\u043b\u043e\u0432\u0438 \u043f\u043e\u0434\u043e\u043b\u0443. \u0410\u043a\u043e \u043d\u0435 \u0441\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0435\u043d\u0438 \u0443\u0441\u043b\u043e\u0432\u0438, \u043a\u0430\u0440\u0442\u0438\u0447\u043a\u0430\u0442\u0430 \u0441\u0435\u043a\u043e\u0433\u0430\u0448 \u045c\u0435 \u0441\u0435 \u043f\u0440\u0438\u043a\u0430\u0436\u0443\u0432\u0430.",
+ "visible": "\u0412\u0438\u0434\u043b\u0438\u0432\u043e",
+ "weather_forecast": "\u041f\u0440\u043e\u0433\u043d\u043e\u0437\u0430",
+ "week": "\u041d\u0435\u0434\u0435\u043b\u0430",
+ "welcome_home": "\u0414\u043e\u0431\u0440\u0435\u0434\u043e\u0458\u0434\u0435 \u0434\u043e\u043c\u0430",
+ "year": "\u0433\u043e\u0434\u0438\u043d\u0430",
+ "yes": "\u0414\u0430"
}
diff --git a/static/translations/ml.json b/static/translations/ml.json
index 2a361ef..93ad1c7 100644
--- a/static/translations/ml.json
+++ b/static/translations/ml.json
@@ -174,6 +174,7 @@
"period_month": "\u0d2e\u0d3e\u0d38\u0d02",
"period_week": "\u0d06\u0d34\u0d4d\u0d1a",
"picture": "\u0d1a\u0d3f\u0d24\u0d4d\u0d30\u0d02",
+ "picture_elements": "\u0d1a\u0d3f\u0d24\u0d4d\u0d30 \u0d18\u0d1f\u0d15\u0d19\u0d4d\u0d19\u0d7e",
"position": "\u0d28\u0d3f\u0d32",
"precision": "\u0d15\u0d43\u0d24\u0d4d\u0d2f\u0d24",
"preview": "\u0d15\u0d30\u0d1f\u0d41\u0d15\u0d3e\u0d34\u0d4d\u0d1a\u0d4d\u0d1a",
diff --git a/static/translations/nb.json b/static/translations/nb.json
index abe73a8..02e041e 100644
--- a/static/translations/nb.json
+++ b/static/translations/nb.json
@@ -54,7 +54,7 @@
"change_color": "Endre farge",
"change_type": "Endre type",
"check_updates": "Se etter oppdateringer",
- "checking_updates": "Checking for updates...",
+ "checking_updates": "Se etter oppdateringer...",
"clean_spot": "Rengj\u00f8r flekk",
"cleaning": "Rengj\u00f8r",
"clear_items": "Fjern fullf\u00f8rte gj\u00f8rem\u00e5l",
@@ -111,7 +111,7 @@
"empty": "Tom",
"entities": "Entiteter",
"entity": "Entitet",
- "entity_not_found": "Enheten ble ikke funnet",
+ "entity_not_found": "Entiteten ble ikke funnet",
"error": "Feil",
"error_save_yaml": "Kan ikke lagre YAML: {error}",
"event_delete": "Slett hendelse",
@@ -179,7 +179,6 @@
"login_error": "Feil: {error}",
"low": "Lav",
"manage_account": "Administrer konto",
- "max": "Maks",
"max_length": "Maksimumslengde",
"media": "Media",
"media_player": "Mediekontroll",
@@ -235,6 +234,7 @@
"period_month": "M\u00e5ned",
"period_week": "Uke",
"picture": "Bilde",
+ "picture_elements": "Bildeelementer",
"playing": "Spiller",
"position": "Posisjon",
"precision": "Vis presisjon",
@@ -336,7 +336,7 @@
"version": "Versjon",
"vertical": "Vertikal",
"visibility": "Synlighet",
- "visibility_explanation": "The card will be shown when ALL conditions below are fulfilled. If no conditions are set, the card will always be shown.",
+ "visibility_explanation": "Kortet vil bli vist n\u00e5r ALLE betingelsene nedenfor er oppfylt. Hvis ingen betingelser er satt, vil kortet alltid bli vist.",
"visible": "Synlig",
"volume_level": "Volum",
"water_heater_away_mode": "Bortemodus",
diff --git a/static/translations/nl.json b/static/translations/nl.json
index 8daaa55..56e59a7 100644
--- a/static/translations/nl.json
+++ b/static/translations/nl.json
@@ -251,6 +251,7 @@
"period_month": "Maand",
"period_week": "Week",
"picture": "Afbeelding",
+ "picture_elements": "Afbeelding met elementen",
"playing": "Speelt",
"position": "Positie",
"precision": "Precisie weergeven",
diff --git a/static/translations/nn.json b/static/translations/nn.json
index 917367c..ab6c393 100644
--- a/static/translations/nn.json
+++ b/static/translations/nn.json
@@ -178,6 +178,7 @@
"period_month": "M\u00e5nad",
"period_week": "Veke",
"picture": "Bilete",
+ "picture_elements": "Bileteelementer",
"position": "Posisjon",
"precision": "Display precision",
"preview": "F\u00f8rehandsvis teikning",
diff --git a/static/translations/no.json b/static/translations/no.json
index d3f64cb..c794d1b 100644
--- a/static/translations/no.json
+++ b/static/translations/no.json
@@ -34,7 +34,7 @@
"buttons": "Buttons",
"calendar": "Kalender",
"calendar_error": "Kunne ikke hente hendelser for kalendere:",
- "cancel": "Cancel",
+ "cancel": "Avbryt",
"card_configuration": "Card configuration",
"change_color": "Change color",
"change_type": "Change type",
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Uke",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "Innstillinger",
diff --git a/static/translations/pl.json b/static/translations/pl.json
index 9c5a319..ad7f13b 100644
--- a/static/translations/pl.json
+++ b/static/translations/pl.json
@@ -247,6 +247,7 @@
"period_month": "Miesi\u0105c",
"period_week": "Tydzie\u0144",
"picture": "Obraz",
+ "picture_elements": "Elementy obrazu",
"playing": "odtwarzanie",
"position": "Pozycja",
"precision": "Precyzja",
diff --git a/static/translations/pt-BR.json b/static/translations/pt-BR.json
index 1f40f5a..c31a6fa 100644
--- a/static/translations/pt-BR.json
+++ b/static/translations/pt-BR.json
@@ -175,6 +175,7 @@
"period_month": "M\u00eas",
"period_week": "Semana",
"picture": "Imagem",
+ "picture_elements": "Elementos de Imagem",
"position": "Posi\u00e7\u00e3o",
"precision": "Precis\u00e3o de exibi\u00e7\u00e3o",
"preview": "Visualizar",
diff --git a/static/translations/pt.json b/static/translations/pt.json
index cf9bea6..9f4f20c 100644
--- a/static/translations/pt.json
+++ b/static/translations/pt.json
@@ -192,7 +192,6 @@
"login_error": "Erro: {error}",
"low": "Baixo",
"manage_account": "Gerir conta",
- "max": "M\u00e1ximo",
"max_length": "Comprimento m\u00e1ximo",
"max_plus": "M\u00e1ximo +",
"media": "Multim\u00e9dia",
@@ -231,7 +230,7 @@
"open_cover": "Abrir",
"open_door": "Abrir porta",
"open_door_success": "Porta aberta",
- "open_menu": "Abrir painel de instrumentos",
+ "open_menu": "Abrir menu do painel",
"open_tilt_cover": "Abrir inclina\u00e7\u00e3o da cobertura",
"open_valve": "Abrir v\u00e1lvula",
"opening": "A abrir",
@@ -250,6 +249,7 @@
"period_month": "M\u00eas",
"period_week": "Semana",
"picture": "Imagem Est\u00e1tica",
+ "picture_elements": "Entidades sobre uma imagem",
"playing": "A reproduzir",
"position": "Posi\u00e7\u00e3o",
"precision": "Mostrar precis\u00e3o",
diff --git a/static/translations/ro.json b/static/translations/ro.json
index acc25ec..64863cd 100644
--- a/static/translations/ro.json
+++ b/static/translations/ro.json
@@ -62,7 +62,7 @@
"clear_items": "\u0218terge elementele bifate",
"close_cover": "\u00cenchide acoperitoarea",
"close_tilt_cover": "\u00cenchide \u00eenclinarea acoperitorii",
- "close_valve": "Close valve",
+ "close_valve": "\u00cenchide\u021bi supapa",
"closed": "\u00cenchis\u0103",
"closing": "\u00cen curs de \u00eenchidere",
"code": "Cod",
@@ -189,7 +189,6 @@
"login_error": "Eroare: {error}",
"low": "Sc\u0103zut",
"manage_account": "Gestionare contul",
- "max": "Maxim",
"max_length": "Lungimea maxim\u0103",
"max_plus": "Max plus",
"media": "Media",
@@ -226,10 +225,11 @@
"on": "Pornit",
"open": "Deschis\u0103",
"open_cover": "Deschide acoperitoarea",
- "open_door": "Open door",
+ "open_door": "Deschide u\u0219a",
+ "open_door_success": "U\u0219\u0103 deschis\u0103",
"open_menu": "Deschide meniul tabloului de bord",
"open_tilt_cover": "Deschide \u00eenclinarea acoperitorii",
- "open_valve": "Open valve",
+ "open_valve": "Deschide\u021bi supapa",
"opening": "\u00cen curs de deschidere",
"optional": "op\u021bional",
"options": "Op\u021biuni",
@@ -246,6 +246,7 @@
"period_month": "Lun\u0103",
"period_week": "S\u0103pt\u0103m\u00e2n\u0103",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"playing": "Redare",
"position": "Pozi\u0163ie",
"precision": "Precizie",
@@ -256,7 +257,7 @@
"remove": "Elimin\u0103",
"return_home": "\u00centoarcere acas\u0103",
"returning": "\u00cen curs de \u00eentoarcere la doc",
- "running": "Running\u2026",
+ "running": "Ruleaz\u0103...",
"save": "Salveaz\u0103",
"saved": "Salvat",
"say": "Spune",
@@ -293,7 +294,7 @@
"status": "Stare",
"stop": "Stop",
"stop_cover": "Opre\u0219te",
- "stop_valve": "Stop valve",
+ "stop_valve": "Opri\u021bi supapa",
"stopped": "Oprit\u0103",
"streaming": "\u00cen curs de redare",
"successfully_saved": "Salvat cu succes",
diff --git a/static/translations/ru.json b/static/translations/ru.json
index 78ff6a2..4b59947 100644
--- a/static/translations/ru.json
+++ b/static/translations/ru.json
@@ -210,7 +210,7 @@
"month": "\u041c\u0435\u0441\u044f\u0446",
"motion": "\u0414\u0432\u0438\u0436\u0435\u043d\u0438\u0435",
"name": "\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435",
- "navigate": "\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f",
+ "navigate": "\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443",
"never_triggered": "\u0417\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0435 \u0431\u044b\u043b\u043e",
"no": "\u041d\u0435\u0442",
"no_entities": "\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e",
@@ -243,7 +243,7 @@
"password": "\u041f\u0430\u0440\u043e\u043b\u044c",
"pause": "\u041f\u0430\u0443\u0437\u0430",
"paused": "\u041f\u0430\u0443\u0437\u0430",
- "pending": "\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043e\u0445\u0440\u0430\u043d\u0443",
+ "pending": "\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435",
"period": "\u041f\u0435\u0440\u0438\u043e\u0434",
"period_5minute": "5 \u043c\u0438\u043d\u0443\u0442",
"period_day": "\u0414\u0435\u043d\u044c",
@@ -251,6 +251,7 @@
"period_month": "\u041c\u0435\u0441\u044f\u0446",
"period_week": "\u041d\u0435\u0434\u0435\u043b\u044f",
"picture": "\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435",
+ "picture_elements": "\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f",
"playing": "\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435",
"position": "\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435",
"precision": "\u041e\u043a\u0440\u0443\u0433\u043b\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439",
@@ -321,7 +322,7 @@
"time_format_12": "12-\u0447\u0430\u0441\u043e\u0432\u043e\u0439 (AM/PM)",
"time_format_24": "24-\u0447\u0430\u0441\u043e\u0432\u043e\u0439",
"time_format_auto": "\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 (\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0442\u044c \u0438\u0437 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u044f\u0437\u044b\u043a\u0430)",
- "time_format_description": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435",
+ "time_format_description": "\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 \u0432\u0435\u0431-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435",
"time_format_header": "\u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438",
"timer": "\u0422\u0430\u0439\u043c\u0435\u0440",
"today": "\u0421\u0435\u0433\u043e\u0434\u043d\u044f",
diff --git a/static/translations/sk.json b/static/translations/sk.json
index 6b9807c..e882ea0 100644
--- a/static/translations/sk.json
+++ b/static/translations/sk.json
@@ -14,7 +14,7 @@
"alarm_modes_armed_home": "Doma",
"alarm_modes_armed_night": "Noc",
"alarm_modes_armed_vacation": "Dovolenka",
- "alarm_modes_disarmed": "Deaktivovan\u00e9",
+ "alarm_modes_disarmed": "Odisten\u00e9",
"alarm_modes_label": "Re\u017eimy alarmu",
"and": "A",
"apparent_temperature": "Zdanliv\u00e1 teplota",
@@ -253,6 +253,7 @@
"period_month": "Mesiac",
"period_week": "T\u00fd\u017ede\u0148",
"picture": "Obr\u00e1zok",
+ "picture_elements": "Obr\u00e1zkov\u00e9 elementy",
"playing": "Prehr\u00e1vanie",
"position": "Poloha",
"precision": "Presnos\u0165 zobrazenia",
diff --git a/static/translations/sl.json b/static/translations/sl.json
index a575bc6..ef8119f 100644
--- a/static/translations/sl.json
+++ b/static/translations/sl.json
@@ -203,6 +203,7 @@
"period_month": "Mesec",
"period_week": "Teden",
"picture": "Slika",
+ "picture_elements": "Slikovni elementi",
"position": "Polo\u017eaj",
"precision": "Display precision",
"preview": "Predogled na\u010drta",
diff --git a/static/translations/sr-Latn.json b/static/translations/sr-Latn.json
index 1d6f1d2..a719ba6 100644
--- a/static/translations/sr-Latn.json
+++ b/static/translations/sr-Latn.json
@@ -104,7 +104,7 @@
"forward": "Forward",
"graph": "Grafikon",
"group": "Grupa",
- "ha_url": "Home Assistant URL",
+ "ha_url": "URL Home Assistant-a",
"hidden": "Skriveno",
"hide": "Sakriti",
"history": "Istorija",
@@ -173,6 +173,7 @@
"period_month": "Mesec",
"period_week": "Nedelja",
"picture": "Slika",
+ "picture_elements": "Picture elements",
"position": "Pozicija",
"precision": "Preciznost prikaza",
"preview": "Pregled",
diff --git a/static/translations/sr.json b/static/translations/sr.json
index 8929424..7c48271 100644
--- a/static/translations/sr.json
+++ b/static/translations/sr.json
@@ -103,11 +103,11 @@
"exit_edit_mode": "Done",
"expand": "Pro\u0161iri",
"fan": "Ventilator",
- "fan_direction": "Direction",
+ "fan_direction": "Pravac",
"fan_forward": "Forward",
"fan_modes": "Re\u017eimi ventilatora",
"fan_only": "Ventilator",
- "fan_oscillate": "Oscillate",
+ "fan_oscillate": "Osciliranje",
"fan_preset_mode": "Preset mode",
"fan_reverse": "Reverse",
"fan_speed": "Fan speed",
@@ -142,7 +142,7 @@
"javascript_module": "JavaScript module",
"key_missing": "Required key ''{key}'' is missing.",
"language": "\u0408\u0435\u0437\u0438\u043a",
- "last_triggered": "Last triggered",
+ "last_triggered": "Zadnji put aktiviran",
"lawn_mower_commands": "Lawn mower commands:",
"loading": "U\u010ditavanje\u2026",
"locate": "Locate",
@@ -200,6 +200,7 @@
"period_month": "Mesec",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Pozicija",
"precision": "Display precision",
"preview": "Preview",
@@ -218,7 +219,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Servis",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u041f\u043e\u0434\u0435\u0448\u0430\u0432\u0430\u045a\u0430",
@@ -288,7 +288,7 @@
"weather_cloudy": "Obla\u010dno",
"weather_exceptional": "Izuzetno",
"weather_fog": "Magla",
- "weather_forecast": "Forecast",
+ "weather_forecast": "Prognoza",
"weather_hail": "Grad",
"weather_lightning": "Grmljavina",
"weather_lightning_rainy": "Grmljavina sa ki\u0161om",
diff --git a/static/translations/sv.json b/static/translations/sv.json
index 56f9ab8..ddd1387 100644
--- a/static/translations/sv.json
+++ b/static/translations/sv.json
@@ -253,6 +253,7 @@
"period_month": "M\u00e5nad",
"period_week": "Vecka",
"picture": "Bild",
+ "picture_elements": "Bildelement",
"playing": "Spelar",
"position": "Position",
"precision": "Visningsprecision",
diff --git a/static/translations/ta.json b/static/translations/ta.json
index ef64cb4..424352e 100644
--- a/static/translations/ta.json
+++ b/static/translations/ta.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u0b85\u0bae\u0bc8\u0baa\u0bcd\u0baa\u0bc1\u0b95\u0bb3\u0bcd",
diff --git a/static/translations/te.json b/static/translations/te.json
index bcce56b..1b0f906 100644
--- a/static/translations/te.json
+++ b/static/translations/te.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u0c05\u0c2e\u0c30\u0c3f\u0c15",
diff --git a/static/translations/th.json b/static/translations/th.json
index e0c4619..408c21f 100644
--- a/static/translations/th.json
+++ b/static/translations/th.json
@@ -130,7 +130,6 @@
"login": "Log in",
"login_error": "Error: {error}",
"manage_account": "Manage account",
- "max": "\u0e2a\u0e39\u0e07\u0e2a\u0e38\u0e14",
"max_length": "Maximum length",
"media": "\u0e2a\u0e37\u0e48\u0e2d",
"media_player": "Media control",
@@ -177,6 +176,7 @@
"period_month": "Month",
"period_week": "Week",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "\u0e15\u0e33\u0e41\u0e2b\u0e19\u0e48\u0e07",
"precision": "Display precision",
"preview": "Preview",
@@ -196,7 +196,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u0e01\u0e32\u0e23\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32",
diff --git a/static/translations/tr.json b/static/translations/tr.json
index 812aa7e..1d7a411 100644
--- a/static/translations/tr.json
+++ b/static/translations/tr.json
@@ -253,6 +253,7 @@
"period_month": "Ay",
"period_week": "Hafta",
"picture": "Resim",
+ "picture_elements": "Resim \u00f6\u011feleri",
"playing": "Oynat\u0131l\u0131yor",
"position": "Pozisyon",
"precision": "Ekran hassasiyeti",
diff --git a/static/translations/uk.json b/static/translations/uk.json
index 09817c1..29497f6 100644
--- a/static/translations/uk.json
+++ b/static/translations/uk.json
@@ -76,7 +76,7 @@
"configure": "\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u0442\u0438",
"confirm_delete_message": "\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \"{name}\"? \u0426\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0430 \u043c\u0456\u0441\u0442\u0438\u0442\u044c {number} \u043a\u0430\u0440\u0442\u043e\u043a, \u044f\u043a\u0456 \u0442\u0430\u043a\u043e\u0436 \u0431\u0443\u0434\u0443\u0442\u044c \u0432\u0438\u0434\u0430\u043b\u0435\u043d\u0456. \u0412\u0438\u0434\u0430\u043b\u0435\u043d\u043d\u044f \u0441\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438 \u0431\u0443\u0434\u0435 \u043d\u0435\u043c\u043e\u0436\u043b\u0438\u0432\u043e.",
"confirm_log_out": "\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0439\u0442\u0438?",
- "connection_lost": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u0432\u0442\u0440\u0430\u0447\u0435\u043d\u043e. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0435 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u2026",
+ "connection_lost": "\u0417'\u0454\u0434\u043d\u0430\u043d\u043d\u044f \u0432\u0442\u0440\u0430\u0447\u0435\u043d\u0435. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0435 \u043f\u0456\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044f \u2026",
"connection_started": "Home Assistant \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0438\u0439!",
"connection_starting": "Home Assistant \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0454\u0442\u044c\u0441\u044f, \u043f\u043e\u043a\u0438 \u0449\u043e \u043d\u0435 \u0432\u0441\u0435 \u043c\u043e\u0436\u0435 \u0431\u0443\u0442\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e",
"cool": "\u041e\u0445\u043e\u043b\u043e\u0434\u0436\u0435\u043d\u043d\u044f",
@@ -87,7 +87,7 @@
"current_humidity": "\u041f\u043e\u0442\u043e\u0447\u043d\u0430 \u0432\u043e\u043b\u043e\u0433\u0456\u0441\u0442\u044c",
"current_state": "\u043f\u043e\u0442\u043e\u0447\u043d\u0438\u0439",
"date": "\u0414\u0430\u0442\u0430",
- "date_or_time": "Input Datetime",
+ "date_or_time": "\u0414\u0430\u0442\u0430 \u0442\u0430/\u0430\u0431\u043e \u0447\u0430\u0441",
"day": "\u0414\u0435\u043d\u044c",
"days_to_show": "\u0414\u043d\u0456 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0443",
"dehumidifier": "\u041e\u0441\u0443\u0448\u0443\u0432\u0430\u0447",
@@ -189,11 +189,10 @@
"login_error": "\u041f\u043e\u043c\u0438\u043b\u043a\u0430: {error}",
"low": "\u041d\u0438\u0437\u044c\u043a\u0438\u0439",
"manage_account": "\u041a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f \u043e\u0431\u043b\u0456\u043a\u043e\u0432\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u043e\u043c",
- "max": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e",
"max_length": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430 \u0434\u043e\u0432\u0436\u0438\u043d\u0430",
"max_plus": "\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043b\u044e\u0441",
"media": "\u041c\u0435\u0434\u0456\u0430",
- "media_player": "\u041c\u0435\u0434\u0456\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u0432\u0430\u0447",
+ "media_player": "\u041a\u0435\u0440\u0443\u0432\u0430\u043d\u043d\u044f \u043c\u0435\u0434\u0456\u0430",
"medium": "\u0421\u0435\u0440\u0435\u0434\u043d\u0456\u0439",
"menu": "\u041c\u0435\u043d\u044e",
"mfa_code": "\u041a\u043e\u0434 \u0434\u0432\u043e\u0444\u0430\u043a\u0442\u043e\u0440\u043d\u043e\u0457 \u0430\u0432\u0442\u0435\u043d\u0442\u0438\u0444\u0456\u043a\u0430\u0446\u0456\u0457",
@@ -214,7 +213,7 @@
"not_home": "\u041d\u0435 \u0432\u0434\u043e\u043c\u0430",
"nothing_configured": "\u0429\u0435 \u043d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u043d\u0430\u043b\u0430\u0448\u0442\u043e\u0432\u0430\u043d\u043e",
"nothing_found": "\u041d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u0439\u0434\u0435\u043d\u043e!",
- "nothing_playing": "\u041d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u0433\u0440\u0430\u0454",
+ "nothing_playing": "\u041d\u0456\u0447\u043e\u0433\u043e \u043d\u0435 \u0432\u0456\u0434\u0442\u0432\u043e\u0440\u044e\u0454\u0442\u044c\u0441\u044f",
"notifications": "\u0421\u043f\u043e\u0432\u0456\u0449\u0435\u043d\u043d\u044f",
"notifications_dismiss": "\u0412\u0456\u0434\u0445\u0438\u043b\u0438\u0442\u0438",
"notifications_empty": "\u041d\u0435\u043c\u0430\u0454 \u0441\u043f\u043e\u0432\u0456\u0449\u0435\u043d\u044c",
@@ -245,8 +244,9 @@
"period_hour": "\u0413\u043e\u0434\u0438\u043d\u0430",
"period_month": "\u041c\u0456\u0441\u044f\u0446\u044c",
"period_week": "\u0422\u0438\u0436\u0434\u0435\u043d\u044c",
- "picture": "Picture",
- "playing": "\u0413\u0440\u0430\u0454",
+ "picture": "\u0417\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",
+ "picture_elements": "\u0415\u043b\u0435\u043c\u0435\u043d\u0442\u0438 \u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043d\u044f",
+ "playing": "\u0412\u0456\u0434\u0442\u0432\u043e\u0440\u044e\u0454\u0442\u044c\u0441\u044f",
"position": "\u041f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044f",
"precision": "\u0422\u043e\u0447\u043d\u0456\u0441\u0442\u044c",
"preview": "\u041f\u043e\u043f\u0435\u0440\u0435\u0434\u043d\u0456\u0439 \u043f\u0435\u0440\u0435\u0433\u043b\u044f\u0434",
@@ -286,7 +286,7 @@
"start": "\u041f\u0440\u0438\u0431\u0440\u0430\u0442\u0438",
"start_mowing": "\u041f\u043e\u0447\u0430\u0442\u0438 \u043a\u043e\u0441\u0438\u0442\u0438",
"start_over": "\u041f\u043e\u0447\u0430\u0442\u0438 \u0437\u0430\u043d\u043e\u0432\u043e",
- "start_pause": "\u0421\u0442\u0430\u0440\u0442/\u041f\u0430\u0443\u0437\u0430",
+ "start_pause": "\u0421\u0442\u0430\u0440\u0442/\u043f\u0430\u0443\u0437\u0430",
"state": "\u0421\u0442\u0430\u043d",
"state_equal": "\u0421\u0442\u0430\u043d \u0434\u043e\u0440\u0456\u0432\u043d\u044e\u0454",
"state_not_equal": "\u0421\u0442\u0430\u043d \u043d\u0435 \u0434\u043e\u0440\u0456\u0432\u043d\u044e\u0454",
@@ -302,6 +302,8 @@
"swing_modes": "\u0420\u0435\u0436\u0438\u043c\u0438 \u0433\u043e\u0439\u0434\u0430\u043d\u043d\u044f",
"target": "\u0426\u0456\u043b\u044c",
"target_humidity": "\u0426\u0456\u043b\u044c\u043e\u0432\u0430 \u0432\u043e\u043b\u043e\u0433\u0456\u0441\u0442\u044c",
+ "target_temp_high": "\u0412\u0435\u0440\u0445\u043d\u044f \u0446\u0456\u043b\u044c\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",
+ "target_temp_low": "\u041d\u0438\u0436\u043d\u044f \u0446\u0456\u043b\u044c\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",
"target_temperature": "\u0426\u0456\u043b\u044c\u043e\u0432\u0430 \u0442\u0435\u043c\u043f\u0435\u0440\u0430\u0442\u0443\u0440\u0430",
"template": "\u0428\u0430\u0431\u043b\u043e\u043d",
"template_editor": "\u0420\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u0448\u0430\u0431\u043b\u043e\u043d\u0456\u0432",
@@ -322,7 +324,7 @@
"trigger": "\u0417\u0430\u043f\u0443\u0441\u043a",
"triggered": "\u0421\u043f\u0440\u0430\u0446\u044c\u043e\u0432\u0430\u043d\u043e",
"turbo": "\u0422\u0443\u0440\u0431\u043e",
- "unavailable": "\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0438\u0439",
+ "unavailable": "\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e",
"undo": "\u0421\u043a\u0430\u0441\u0443\u0432\u0430\u0442\u0438",
"unknown": "\u041d\u0435\u0432\u0456\u0434\u043e\u043c\u043e",
"unlocked": "\u0420\u043e\u0437\u0431\u043b\u043e\u043a\u043e\u0432\u0430\u043d\u043e",
diff --git a/static/translations/ur.json b/static/translations/ur.json
index 59e680d..99c02a9 100644
--- a/static/translations/ur.json
+++ b/static/translations/ur.json
@@ -172,6 +172,7 @@
"period_month": "Month",
"period_week": "\u06c1\u0641\u062a\u06c1",
"picture": "Picture",
+ "picture_elements": "Picture elements",
"position": "Position",
"precision": "Display precision",
"preview": "Preview",
@@ -190,7 +191,6 @@
"section": "Section",
"sensor": "Sensor",
"service": "Service",
- "service_data": "Service data",
"set_state": "Set state",
"set_white": "Set white",
"settings": "\u062a\u0631\u062a\u06cc\u0628\u0627\u062a",
diff --git a/static/translations/vi.json b/static/translations/vi.json
index c97d577..0eb9e1e 100644
--- a/static/translations/vi.json
+++ b/static/translations/vi.json
@@ -165,7 +165,7 @@
"icons": "Bi\u1ec3u t\u01b0\u1ee3ng",
"idle": "Nh\u00e0n r\u1ed7i",
"iframe": "Trang web",
- "invalid_auth": "T\u00ean \u0111\u0103ng nh\u1eadp ho\u1eb7c m\u1eadt kh\u1ea9u kh\u00f4ng ch\u00ednh x\u00e1c",
+ "invalid_auth": "T\u00ean ng\u01b0\u1eddi d\u00f9ng ho\u1eb7c m\u1eadt kh\u1ea9u kh\u00f4ng h\u1ee3p l\u1ec7",
"invalid_code": "M\u00e3 x\u00e1c th\u1ef1c kh\u00f4ng h\u1ee3p l\u1ec7",
"invalid_timestamp": "D\u1ea5u th\u1eddi gian kh\u00f4ng h\u1ee3p l\u1ec7",
"jammed": "B\u1ecb k\u1eb9t",
@@ -240,6 +240,7 @@
"period_month": "Th\u00e1ng",
"period_week": "Tu\u1ea7n",
"picture": "H\u00ecnh \u1ea3nh",
+ "picture_elements": "Ph\u1ea7n t\u1eed h\u00ecnh \u1ea3nh",
"playing": "\u0110ang ch\u01a1i",
"position": "V\u1ecb tr\u00ed",
"precision": "\u0110\u1ed9 ch\u00ednh x\u00e1c hi\u1ec3n th\u1ecb",
@@ -332,13 +333,13 @@
"update_release_notes": "\u0110\u1ecdc th\u00f4ng b\u00e1o ph\u00e1t h\u00e0nh",
"update_skip": "B\u1ecf qua",
"url": "URL",
- "username": "T\u00ean \u0111\u0103ng nh\u1eadp",
+ "username": "T\u00ean ng\u01b0\u1eddi d\u00f9ng",
"vacuum": "M\u00e1y h\u00fat b\u1ee5i",
"vacuum_commands": "C\u00e1c l\u1ec7nh \u0111i\u1ec1u khi\u1ec3n m\u00e1y h\u00fat b\u1ee5i:",
"value": "Gi\u00e1 tr\u1ecb",
"vertical": "D\u1ecdc",
"visibility": "Hi\u1ec3n th\u1ecb",
- "visibility_explanation": "The card will be shown when ALL conditions below are fulfilled. If no conditions are set, the card will always be shown.",
+ "visibility_explanation": "Th\u1ebb s\u1ebd \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb khi T\u1ea4T C\u1ea2 c\u00e1c \u0111i\u1ec1u ki\u1ec7n b\u00ean d\u01b0\u1edbi \u0111\u01b0\u1ee3c \u0111\u00e1p \u1ee9ng. N\u1ebfu kh\u00f4ng c\u00f3 \u0111i\u1ec1u ki\u1ec7n n\u00e0o \u0111\u01b0\u1ee3c \u0111\u1eb7t, th\u1ebb s\u1ebd lu\u00f4n \u0111\u01b0\u1ee3c hi\u1ec3n th\u1ecb.",
"visible": "Hi\u1ec3n th\u1ecb",
"volume_level": "\u00c2m l\u01b0\u1ee3ng",
"water_heater_away_mode": "Ch\u1ebf \u0111\u1ed9 \u0111i v\u1eafng",
diff --git a/static/translations/zh-Hans.json b/static/translations/zh-Hans.json
index 67894f6..d778a42 100644
--- a/static/translations/zh-Hans.json
+++ b/static/translations/zh-Hans.json
@@ -125,7 +125,7 @@
"loading": "\u52a0\u8f7d\u4e2d\u2026",
"locate": "\u5b9a\u4f4d",
"log_in": "\u767b\u5f55",
- "log_out": "\u9000\u51fa",
+ "log_out": "\u9000\u51fa\u767b\u5f55",
"login": "\u767b\u5f55",
"login_error": "\u9519\u8bef\uff1a{error}",
"manage_account": "\u7ba1\u7406\u8d26\u6237",
@@ -148,7 +148,7 @@
"no_options": "\u76ee\u524d\u6ca1\u6709\u9009\u9879\u3002",
"none": "\u65e0",
"nothing_configured": "\u5c1a\u672a\u914d\u7f6e\u4efb\u4f55\u96c6\u6210",
- "nothing_found": "\u672a\u627e\u5230\u5185\u5bb9\u3002",
+ "nothing_found": "\u4ec0\u4e48\u90fd\u6ca1\u627e\u5230\uff01",
"nothing_playing": "\u672a\u5728\u64ad\u653e",
"notifications": "\u901a\u77e5",
"notifications_dismiss": "\u5173\u95ed",
@@ -175,6 +175,7 @@
"period_month": "\u6708",
"period_week": "\u5468",
"picture": "\u56fe\u7247",
+ "picture_elements": "\u56fe\u7247\u5143\u7d20",
"position": "\u4f4d\u7f6e",
"precision": "\u663e\u793a\u7cbe\u5ea6",
"preview": "\u9884\u89c8",
@@ -196,7 +197,7 @@
"service_data": "\u670d\u52a1\u6570\u636e",
"set_state": "\u8bbe\u7f6e\u72b6\u6001",
"set_white": "\u8c03\u767d",
- "settings": "\u914d\u7f6e",
+ "settings": "\u8bbe\u7f6e",
"shortcuts": "\u6377\u5f84",
"show": "\u663e\u793a",
"show_area": "\u663e\u793a{area}",
diff --git a/static/translations/zh-Hant.json b/static/translations/zh-Hant.json
index d15c6e9..ce80f35 100644
--- a/static/translations/zh-Hant.json
+++ b/static/translations/zh-Hant.json
@@ -175,6 +175,7 @@
"period_month": "\u6708",
"period_week": "\u9031",
"picture": "\u5716\u7247\u9762\u677f",
+ "picture_elements": "\u5716\u7247\u8981\u7d20\u9762\u677f",
"position": "\u4f4d\u7f6e",
"precision": "\u986f\u793a\u6e96\u78ba\u5ea6",
"preview": "\u9810\u89bd",
@@ -254,7 +255,7 @@
"vacuum_commands": "\u6383\u5730\u6a5f\u5668\u4eba\u6e05\u6383\u6307\u4ee4\uff1a",
"value": "\u6578\u503c",
"visibility": "\u986f\u793a\u9078\u9805",
- "visibility_explanation": "\u7576\u4ee5\u4e0b\u6240\u6709\u689d\u4ef6\u90fd\u6eff\u8db3\u6642\u5c07\u6703\u986f\u793a\u9762\u672c\u3002\u5047\u5982\u672a\u8a2d\u5b9a\u689d\u4ef6\u3001\u5247\u5c07\u59cb\u7d42\u986f\u793a\u9762\u677f\u3002",
+ "visibility_explanation": "\u7576\u4ee5\u4e0b\u6240\u6709\u689d\u4ef6\u90fd\u6eff\u8db3\u6642\u5c07\u6703\u986f\u793a\u9762\u677f\u3002\u5047\u5982\u672a\u8a2d\u5b9a\u689d\u4ef6\u3001\u5247\u5c07\u59cb\u7d42\u986f\u793a\u9762\u677f\u3002",
"visible": "\u53ef\u898b",
"weather_forecast": "\u9810\u5831",
"week": "\u9031",
diff --git a/static/translations/zh.json b/static/translations/zh.json
index f10570f..d865161 100644
--- a/static/translations/zh.json
+++ b/static/translations/zh.json
@@ -65,7 +65,7 @@
"locked": "\u5df2\u4e0a\u9396",
"locking": "\u4e0a\u9396\u4e2d",
"low": "\u4f4e",
- "max": "\u5168\u901f",
+ "max": "\u6700\u9ad8",
"max_plus": "\u8d85\u901f",
"medium": "\u4e2d",
"mode": "\u6a21\u5f0f",
diff --git a/vite.config.ts b/vite.config.ts
index 6b38241..b162adc 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -42,7 +42,8 @@ export default defineConfig({
'svelte-fast-dimension/action',
'@event-calendar/core',
'@event-calendar/day-grid',
- '@event-calendar/list'
+ '@event-calendar/list',
+ 'konva/lib/Shape'
],
exclude: [
// exclude codemirror to avoid state duplication