diff --git a/README.md b/README.md index 4f4900ee..cc3f8521 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 9c62f348..b37b8ee5 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 d3987795..2beaf960 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 feba7afc..b44d6e43 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 5dffd239..b3a666ba 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 f59b884c..743f07b2 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 d7c12761..ba33a325 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 49a9baa8..460df094 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 d00d6ad8..296681ee 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 703346f8..9482865e 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 @@ diff --git a/src/lib/Modal/MainItemConfig.svelte b/src/lib/Modal/MainItemConfig.svelte index d52d3c1c..5d673ae9 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 00000000..f498edf4 --- /dev/null +++ b/src/lib/Modal/PictureElements/ActionPanel.svelte @@ -0,0 +1,312 @@ + + + + +
{ + collapsed = !collapsed; + }} +> +
+ + +

Action

+
+ +
+ + + +
+
+ +{#if !collapsed} +
+
+ +
+ + + +
+ +
+ + +
+ +
+ + +
+
+{/if} + + + {#each serviceOptions as service} + + {/each} + + + + {#each entityOptions as entityId} + + {/each} + + + diff --git a/src/lib/Modal/PictureElements/ElementsPanel.svelte b/src/lib/Modal/PictureElements/ElementsPanel.svelte new file mode 100644 index 00000000..9a821bb3 --- /dev/null +++ b/src/lib/Modal/PictureElements/ElementsPanel.svelte @@ -0,0 +1,372 @@ + + + + +
+
+ + +

Elements

+
+ +
+ + + +
+
+ +
+ {#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 00000000..9678d29f --- /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 00000000..2300f4f8 --- /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 00000000..877714d3 --- /dev/null +++ b/src/lib/Modal/PictureElements/PictureElementsConfig.svelte @@ -0,0 +1,325 @@ + + + + + +{#if isOpen} + +

{$lang('picture_elements')}

+ + +
+{/if} + + diff --git a/src/lib/Modal/PictureElements/ResizePanel.svelte b/src/lib/Modal/PictureElements/ResizePanel.svelte new file mode 100644 index 00000000..69efac3e --- /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 00000000..96fc3a97 --- /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} + + {#each entityOptions as entityId} + + {/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 00000000..65c3181e --- /dev/null +++ b/src/lib/Modal/PictureElements/TextPanel.svelte @@ -0,0 +1,377 @@ + + + + +
{ + collapsed = !collapsed; + }} +> +
+ + +

Text

+
+ +
+ + + +
+
+ +{#if !collapsed} +
+
+ +
+ +
+ handleInput(attr?.id, 'fontFamily', event)} + on:change={(event) => setAttribute(attr?.id, 'fontFamily', event)} + {disabled} + /> + + + {#each fonts as font} + + {/each} + +
+ + +
+ setAttribute(attr?.id, 'fontSize', event)} + {disabled} + /> +
+
+ +
+ +
+
+ +
+ + setAttribute(attr?.id, 'letterSpacing', event)} + {disabled} + /> +
+ + +
+
+ +
+ + +
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
+
+{/if} + + diff --git a/src/lib/Modal/PictureElements/Toolbar.svelte b/src/lib/Modal/PictureElements/Toolbar.svelte new file mode 100644 index 00000000..173b5eb0 --- /dev/null +++ b/src/lib/Modal/PictureElements/Toolbar.svelte @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/lib/Modal/PictureElements/TransformAttributes.svelte b/src/lib/Modal/PictureElements/TransformAttributes.svelte new file mode 100644 index 00000000..7be90b3d --- /dev/null +++ b/src/lib/Modal/PictureElements/TransformAttributes.svelte @@ -0,0 +1,243 @@ + + +
+ {#each attributes as attr} +
+ {#if attr.type === 'button'} + + {:else} + + + handleInput(attr, event)} + disabled={attr?.disabled} + /> + {/if} +
+ {/each} + +
+ + + + + + + + +
+
+ + diff --git a/src/lib/Modal/PictureElements/computeIcon.ts b/src/lib/Modal/PictureElements/computeIcon.ts new file mode 100644 index 00000000..626c5337 --- /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 00000000..86e4ab00 --- /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 00000000..99fab57b --- /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 00000000..1abf7717 --- /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 = ` + + + ${data?.body || ''} + + + `; + + 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 00000000..35e7e97b --- /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 00000000..0db47101 --- /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 e5796023..090c5fd6 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 7121ff27..fdf03dc5 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 668ea59f..f98935e1 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 b27a61d0..8d0faa8a 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 de94b95b..6b09f39b 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 8df6257d..94a261e1 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 cfe8052e..27e6fed5 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 3c677b8f..71ec615f 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 d71839d5..1ca89713 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 ac7ddb89..87b27d40 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 842d8cb3..6bdde296 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 ef8736d7..f8f73105 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 eae03f6f..0c71ec39 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 93f03304..7eb95c35 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 04312e49..58f5bb4d 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 a0b8665f..93ffb494 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 bd60bc05..53812043 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 37c8c0ba..dd2d7fcb 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 b220da11..c9481225 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 379931c9..9b470abe 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 b607614c..988d1962 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 c53af85f..16041d8d 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 38187def..60ae1a69 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 f25950f1..ec78835b 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 6b397b0d..0c0acbd8 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 d765b96e..45754699 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 d18ea137..03632fdb 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 a0fdd5de..c50c8968 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 4e3e7fb8..09225fc6 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 00000000..567a35b0 --- /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 85b2c3af..365f65c4 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 3647473b..5fabd082 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 f6465cfe..d1876beb 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 1c684bce..3cc0eefd 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 d63a846b..222d8207 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 a6df49fd..100b303e 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 e9eda19a..545a6256 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 e4f8a780..edcb3d32 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 72204742..48785e61 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 839246ac..98fca8bd 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 4d6fa842..7a379d73 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 5a6d2058..6c055fd0 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 f0cedf9f..a79ef549 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 4b7dcf8a..060fa2c2 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 8a6eb98e..b582a6c2 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 bc30e8ee..9217a475 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 243e9d80..f846cd05 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 2a361efc..93ad1c77 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 abe73a89..02e041ec 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 8daaa559..56e59a7b 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 917367cb..ab6c3931 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 d3f64cb9..c794d1bf 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 9c5a3199..ad7f13ba 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 1f40f5a6..c31a6fa0 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 cf9bea60..9f4f20c1 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 acc25ec4..64863cde 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 78ff6a29..4b599471 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 6b9807c8..e882ea09 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 a575bc6a..ef8119f8 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 1d6f1d2b..a719ba63 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 89294240..7c48271e 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 56f9ab84..ddd13872 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 ef64cb4c..424352e6 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 bcce56bf..1b0f906f 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 e0c46198..408c21fb 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 812aa7ec..1d7a411e 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 09817c12..29497f67 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 59e680dd..99c02a91 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 c97d5773..0eb9e1e8 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 67894f63..d778a425 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 d15c6e97..ce80f35e 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 f10570f5..d8651617 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 6b382416..b162adc6 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