diff --git a/eslint.config.js b/eslint.config.js index 4addab3b..6912b807 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -3,11 +3,17 @@ import svelteParser from 'svelte-eslint-parser'; import tsParser from '@typescript-eslint/parser'; export default [ + { + rules: { + 'no-console': ['error', { allow: ['error'] }] + } + }, ...svelte.configs.recommended, { files: ['**/*.svelte', '*.svelte'], rules: { - 'svelte/no-object-in-text-mustaches': 'warn' + 'svelte/no-object-in-text-mustaches': 'warn', + 'svelte/no-inspect': 'warn' }, ignores: ['dist/*', '.sveltepress/*'], languageOptions: { diff --git a/package.json b/package.json index 4b512110..de1b9c55 100644 --- a/package.json +++ b/package.json @@ -72,13 +72,13 @@ "@types/d3-scale": "^4.0.9", "@types/d3-scale-chromatic": "^3.1.0", "@types/d3-shape": "^3.1.7", - "@typescript-eslint/eslint-plugin": "^8.32.1", - "@typescript-eslint/parser": "^8.32.1", + "@typescript-eslint/eslint-plugin": "^8.33.0", + "@typescript-eslint/parser": "^8.33.0", "csstype": "^3.1.3", "d3-dsv": "^3.0.1", "d3-fetch": "^3.0.1", "d3-force": "^3.0.0", - "eslint": "^9.27.0", + "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", "eslint-plugin-svelte": "3.9.0", "jsdom": "^26.1.0", @@ -122,6 +122,6 @@ "es-toolkit": "^1.38.0", "fast-equals": "^5.2.2", "merge-deep": "^3.0.3", - "svelte": "5.33.2" + "svelte": "5.33.10" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9817632..d7e4f5d5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,8 +57,8 @@ importers: specifier: ^3.0.3 version: 3.0.3 svelte: - specifier: 5.33.2 - version: 5.33.2 + specifier: 5.33.10 + version: 5.33.10 devDependencies: '@aitodotai/json-stringify-pretty-compact': specifier: ^1.3.0 @@ -68,34 +68,34 @@ importers: version: 11.13.5 '@sveltejs/adapter-auto': specifier: ^6.0.1 - version: 6.0.1(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))) + version: 6.0.1(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))) '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))) + version: 3.0.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))) '@sveltejs/eslint-config': specifier: ^8.2.0 - version: 8.2.0(@stylistic/eslint-plugin-js@1.7.2(eslint@9.27.0(jiti@1.21.0)))(eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@1.21.0)))(eslint-plugin-n@17.10.1(eslint@9.27.0(jiti@1.21.0)))(eslint-plugin-svelte@3.9.0(eslint@9.27.0(jiti@1.21.0))(svelte@5.33.2))(eslint@9.27.0(jiti@1.21.0))(typescript-eslint@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3))(typescript@5.8.3) + version: 8.2.0(@stylistic/eslint-plugin-js@1.7.2(eslint@9.28.0(jiti@1.21.0)))(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@1.21.0)))(eslint-plugin-n@17.10.1(eslint@9.28.0(jiti@1.21.0)))(eslint-plugin-svelte@3.9.0(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.10))(eslint@9.28.0(jiti@1.21.0))(typescript-eslint@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3))(typescript@5.8.3) '@sveltejs/kit': specifier: ^2.21.1 - version: 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + version: 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@sveltejs/package': specifier: ^2.3.11 - version: 2.3.11(svelte@5.33.2)(typescript@5.8.3) + version: 2.3.11(svelte@5.33.10)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte': specifier: 5.0.3 - version: 5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + version: 5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@sveltepress/theme-default': specifier: ^6.0.3 - version: 6.0.3(0f9affb99b0fca83246224c5605f9aba) + version: 6.0.3(f908a976304d51afdcc87135b1b5552a) '@sveltepress/twoslash': specifier: ^1.2.2 - version: 1.2.2(svelte@5.33.2)(typescript@5.8.3) + version: 1.2.2(svelte@5.33.10)(typescript@5.8.3) '@sveltepress/vite': specifier: ^1.2.2 - version: 1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + version: 1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@testing-library/svelte': specifier: ^5.2.8 - version: 5.2.8(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + version: 5.2.8(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@testing-library/user-event': specifier: ^14.6.1 version: 14.6.1(@testing-library/dom@10.4.0) @@ -130,11 +130,11 @@ importers: specifier: ^3.1.7 version: 3.1.7 '@typescript-eslint/eslint-plugin': - specifier: ^8.32.1 - version: 8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) + specifier: ^8.33.0 + version: 8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^8.32.1 - version: 8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) + specifier: ^8.33.0 + version: 8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) csstype: specifier: ^3.1.3 version: 3.1.3 @@ -148,14 +148,14 @@ importers: specifier: ^3.0.0 version: 3.0.0 eslint: - specifier: ^9.27.0 - version: 9.27.0(jiti@1.21.0) + specifier: ^9.28.0 + version: 9.28.0(jiti@1.21.0) eslint-config-prettier: specifier: ^10.1.5 - version: 10.1.5(eslint@9.27.0(jiti@1.21.0)) + version: 10.1.5(eslint@9.28.0(jiti@1.21.0)) eslint-plugin-svelte: specifier: 3.9.0 - version: 3.9.0(eslint@9.27.0(jiti@1.21.0))(svelte@5.33.2) + version: 3.9.0(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.10) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -164,7 +164,7 @@ importers: version: 3.5.3 prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.4.0(prettier@3.5.3)(svelte@5.33.2) + version: 3.4.0(prettier@3.5.3)(svelte@5.33.10) puppeteer: specifier: ^24.9.0 version: 24.9.0(typescript@5.8.3) @@ -182,10 +182,10 @@ importers: version: 1.89.0 svelte-check: specifier: ^4.2.1 - version: 4.2.1(picomatch@4.0.2)(svelte@5.33.2)(typescript@5.8.3) + version: 4.2.1(picomatch@4.0.2)(svelte@5.33.10)(typescript@5.8.3) svelte-eslint-parser: specifier: 1.2.0 - version: 1.2.0(svelte@5.33.2) + version: 1.2.0(svelte@5.33.10) svelte-highlight: specifier: ^7.8.3 version: 7.8.3 @@ -1303,8 +1303,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.27.0': - resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} + '@eslint/js@9.28.0': + resolution: {integrity: sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -1875,11 +1875,11 @@ packages: typescript: optional: true - '@typescript-eslint/eslint-plugin@8.32.1': - resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} + '@typescript-eslint/eslint-plugin@8.33.0': + resolution: {integrity: sha512-CACyQuqSHt7ma3Ns601xykeBK/rDeZa3w6IS6UtMQbixO5DWy+8TilKkviGDH6jtWCo8FGRKEK5cLLkPvEammQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.33.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' @@ -1893,20 +1893,30 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.32.1': - resolution: {integrity: sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg==} + '@typescript-eslint/parser@8.33.0': + resolution: {integrity: sha512-JaehZvf6m0yqYp34+RVnihBAChkqeH+tqqhS0GuX1qgPpwLvmTPheKEs6OeCK6hVJgXZHJ2vbjnC9j119auStQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/project-service@8.33.0': + resolution: {integrity: sha512-d1hz0u9l6N+u/gcrk6s6gYdl7/+pp8yHheRTqP6X5hVDKALEaTn8WfGiit7G511yueBEL3OpOEpD+3/MBdoN+A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@7.7.0': resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.32.1': - resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} + '@typescript-eslint/scope-manager@8.33.0': + resolution: {integrity: sha512-LMi/oqrzpqxyO72ltP+dBSP6V0xiUb4saY7WLtxSfiNEBI8m321LLVFU9/QDJxjDQG9/tjSqKz/E3380TEqSTw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.33.0': + resolution: {integrity: sha512-sTkETlbqhEoiFmGr1gsdq5HyVbSOF0145SYDJ/EQmXHtKViCaGvnyLqWFFHtEXoS0J1yU8Wyou2UGmgW88fEug==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/type-utils@7.7.0': resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} @@ -1918,8 +1928,8 @@ packages: typescript: optional: true - '@typescript-eslint/type-utils@8.32.1': - resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} + '@typescript-eslint/type-utils@8.33.0': + resolution: {integrity: sha512-lScnHNCBqL1QayuSrWeqAL5GmqNdVUQAAMTaCwdYEdWfIrSrOGzyLGRCHXcCixa5NK6i5l0AfSO2oBSjCjf4XQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1929,8 +1939,8 @@ packages: resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.32.1': - resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} + '@typescript-eslint/types@8.33.0': + resolution: {integrity: sha512-DKuXOKpM5IDT1FA2g9x9x1Ug81YuKrzf4mYX8FAVSNu5Wo/LELHWQyM1pQaDkI42bX15PWl0vNPt1uGiIFUOpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.7.0': @@ -1942,8 +1952,8 @@ packages: typescript: optional: true - '@typescript-eslint/typescript-estree@8.32.1': - resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} + '@typescript-eslint/typescript-estree@8.33.0': + resolution: {integrity: sha512-vegY4FQoB6jL97Tu/lWRsAiUUp8qJTqzAmENH2k59SJhw0Th1oszb9Idq/FyyONLuNqT1OADJPXfyUNOR8SzAQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1954,8 +1964,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/utils@8.32.1': - resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} + '@typescript-eslint/utils@8.33.0': + resolution: {integrity: sha512-lPFuQaLA9aSNa7D5u2EpRiqdAUhzShwGg/nhpBlc4GR6kcTABttCuyjFs8BcEZ8VWrjCBof/bePhP3Q3fS+Yrw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1965,8 +1975,8 @@ packages: resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.32.1': - resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} + '@typescript-eslint/visitor-keys@8.33.0': + resolution: {integrity: sha512-7RW7CMYoskiz5OOGAWjJFxgb7c5UNjTG292gYhWeOAcFmYCtVCSqjqSBj5zMhxbXo2JOW95YYrUWJfU0zrpaGQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/vfs@1.6.0': @@ -2810,8 +2820,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.27.0: - resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} + eslint@9.28.0: + resolution: {integrity: sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4355,8 +4365,8 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@5.33.2: - resolution: {integrity: sha512-uiyusx2rUa9NmVMaIcShnZyDhOfFXxgkn5eXOcgjDBL3RYQGR1+7TctPcI6AWNbu4gHWF5xZ/TlFM7nnw5H+JQ==} + svelte@5.33.10: + resolution: {integrity: sha512-/yArPQIBoQS2p86LKnvJywOXkVHeEXnFgrDPSxkEfIAEkykopYuy2bF6UUqHG4IbZlJD6OurLxJT8Kn7kTk9WA==} engines: {node: '>=18'} svg-path-parser@1.1.0: @@ -6069,9 +6079,9 @@ snapshots: '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0(jiti@1.21.0))': + '@eslint-community/eslint-utils@4.7.0(eslint@9.28.0(jiti@1.21.0))': dependencies: - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -6079,7 +6089,7 @@ snapshots: '@eslint/config-array@0.20.0': dependencies: '@eslint/object-schema': 2.1.6 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -6093,7 +6103,7 @@ snapshots: '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.1 @@ -6104,7 +6114,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.27.0': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} @@ -6427,12 +6437,12 @@ snapshots: '@sindresorhus/is@4.6.0': {} - '@stylistic/eslint-plugin-js@1.7.2(eslint@9.27.0(jiti@1.21.0))': + '@stylistic/eslint-plugin-js@1.7.2(eslint@9.28.0(jiti@1.21.0))': dependencies: '@types/eslint': 8.56.10 acorn: 8.14.1 escape-string-regexp: 4.0.0 - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) eslint-visitor-keys: 3.4.3 espree: 9.6.1 @@ -6447,29 +6457,29 @@ snapshots: dependencies: acorn: 8.14.1 - '@sveltejs/adapter-auto@6.0.1(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))': + '@sveltejs/adapter-auto@6.0.1(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))': dependencies: - '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) - '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))': + '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))': dependencies: - '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) - '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@1.7.2(eslint@9.27.0(jiti@1.21.0)))(eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@1.21.0)))(eslint-plugin-n@17.10.1(eslint@9.27.0(jiti@1.21.0)))(eslint-plugin-svelte@3.9.0(eslint@9.27.0(jiti@1.21.0))(svelte@5.33.2))(eslint@9.27.0(jiti@1.21.0))(typescript-eslint@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3))(typescript@5.8.3)': + '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@1.7.2(eslint@9.28.0(jiti@1.21.0)))(eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@1.21.0)))(eslint-plugin-n@17.10.1(eslint@9.28.0(jiti@1.21.0)))(eslint-plugin-svelte@3.9.0(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.10))(eslint@9.28.0(jiti@1.21.0))(typescript-eslint@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.27.0(jiti@1.21.0)) - eslint: 9.27.0(jiti@1.21.0) - eslint-config-prettier: 10.1.5(eslint@9.27.0(jiti@1.21.0)) - eslint-plugin-n: 17.10.1(eslint@9.27.0(jiti@1.21.0)) - eslint-plugin-svelte: 3.9.0(eslint@9.27.0(jiti@1.21.0))(svelte@5.33.2) + '@stylistic/eslint-plugin-js': 1.7.2(eslint@9.28.0(jiti@1.21.0)) + eslint: 9.28.0(jiti@1.21.0) + eslint-config-prettier: 10.1.5(eslint@9.28.0(jiti@1.21.0)) + eslint-plugin-n: 17.10.1(eslint@9.28.0(jiti@1.21.0)) + eslint-plugin-svelte: 3.9.0(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.10) globals: 15.9.0 typescript: 5.8.3 - typescript-eslint: 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) + typescript-eslint: 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) - '@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': + '@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@types/cookie': 0.6.0 acorn: 8.14.1 cookie: 0.6.0 @@ -6481,58 +6491,58 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 3.0.0 - svelte: 5.33.2 + svelte: 5.33.10 vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) - '@sveltejs/package@2.3.11(svelte@5.33.2)(typescript@5.8.3)': + '@sveltejs/package@2.3.11(svelte@5.33.10)(typescript@5.8.3)': dependencies: chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 semver: 7.6.3 - svelte: 5.33.2 - svelte2tsx: 0.7.34(svelte@5.33.2)(typescript@5.8.3) + svelte: 5.33.10 + svelte2tsx: 0.7.34(svelte@5.33.10)(typescript@5.8.3) transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) debug: 4.4.0 - svelte: 5.33.2 + svelte: 5.33.10 vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.33.2 + svelte: 5.33.10 vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) vitefu: 1.0.4(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) transitivePeerDependencies: - supports-color - '@sveltepress/theme-default@6.0.3(0f9affb99b0fca83246224c5605f9aba)': + '@sveltepress/theme-default@6.0.3(f908a976304d51afdcc87135b1b5552a)': dependencies: '@docsearch/css': 3.5.2 '@docsearch/js': 3.5.2(@algolia/client-search@4.22.1)(search-insights@2.13.0) '@shikijs/twoslash': 1.24.0(typescript@5.8.3) - '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) - '@sveltepress/twoslash': 1.2.2(svelte@5.33.2)(typescript@5.8.3) - '@sveltepress/vite': 1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltepress/twoslash': 1.2.2(svelte@5.33.10)(typescript@5.8.3) + '@sveltepress/vite': 1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@unocss/extractor-svelte': 0.61.9 - '@vite-pwa/sveltekit': 0.6.6(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(vite-plugin-pwa@0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0)) + '@vite-pwa/sveltekit': 0.6.6(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(vite-plugin-pwa@0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0)) lru-cache: 10.4.3 mdast-util-from-markdown: 2.0.0 mdast-util-gfm: 3.0.0 shiki: 1.24.0 - svelte: 5.33.2 + svelte: 5.33.10 uid: 2.0.2 unist-util-visit: 5.0.0 unocss: 0.61.9(postcss@8.5.3)(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) @@ -6553,7 +6563,7 @@ snapshots: - typescript - vite-plugin-pwa - '@sveltepress/twoslash@1.2.2(svelte@5.33.2)(typescript@5.8.3)': + '@sveltepress/twoslash@1.2.2(svelte@5.33.10)(typescript@5.8.3)': dependencies: '@floating-ui/dom': 1.6.3 '@shikijs/twoslash': 1.24.0(typescript@5.8.3) @@ -6562,18 +6572,18 @@ snapshots: mdast-util-to-hast: 13.1.0 shiki: 1.24.0 source-map-js: 1.2.1 - svelte: 5.33.2 - svelte2tsx: 0.7.34(svelte@5.33.2)(typescript@5.8.3) + svelte: 5.33.10 + svelte2tsx: 0.7.34(svelte@5.33.10)(typescript@5.8.3) twoslash: 0.2.12(typescript@5.8.3) twoslash-protocol: 0.2.12 transitivePeerDependencies: - supports-color - typescript - '@sveltepress/vite@1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': + '@sveltepress/vite@1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: - '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) cross-spawn: 7.0.6 fs-extra: 11.2.0 lru-cache: 10.4.3 @@ -6588,7 +6598,7 @@ snapshots: remark-rehype: 11.1.0 remark-stringify: 11.0.0 shiki: 1.24.0 - svelte: 5.33.2 + svelte: 5.33.10 unified: 11.0.4 unist-util-visit: 5.0.0 vfile: 6.0.1 @@ -6611,10 +6621,10 @@ snapshots: lz-string: 1.5.0 pretty-format: 27.5.1 - '@testing-library/svelte@5.2.8(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': + '@testing-library/svelte@5.2.8(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(vitest@3.1.4(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: '@testing-library/dom': 10.4.0 - svelte: 5.33.2 + svelte: 5.33.10 optionalDependencies: vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) vitest: 3.1.4(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) @@ -6734,16 +6744,16 @@ snapshots: '@types/node': 20.10.8 optional: true - '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/parser': 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) '@typescript-eslint/scope-manager': 7.7.0 - '@typescript-eslint/type-utils': 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - '@typescript-eslint/utils': 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/type-utils': 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/utils': 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.4.1 - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -6754,15 +6764,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.33.0(@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - eslint: 9.27.0(jiti@1.21.0) + '@typescript-eslint/parser': 8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/type-utils': 8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.0 + eslint: 9.28.0(jiti@1.21.0) graphemer: 1.4.0 ignore: 7.0.4 natural-compare: 1.4.0 @@ -6771,59 +6781,72 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/parser@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 7.7.0 '@typescript-eslint/types': 7.7.0 '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.8.3) '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.4.1 - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/parser@8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.0 - eslint: 9.27.0(jiti@1.21.0) + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.33.0 + debug: 4.4.1 + eslint: 9.28.0(jiti@1.21.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.33.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3) + '@typescript-eslint/types': 8.33.0 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/scope-manager@7.7.0': dependencies: '@typescript-eslint/types': 7.7.0 '@typescript-eslint/visitor-keys': 7.7.0 - '@typescript-eslint/scope-manager@8.32.1': + '@typescript-eslint/scope-manager@8.33.0': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/visitor-keys': 8.33.0 - '@typescript-eslint/type-utils@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.33.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.8.3) - '@typescript-eslint/utils': 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/utils': 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) ts-api-utils: 1.3.0(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - debug: 4.4.0 - eslint: 9.27.0(jiti@1.21.0) + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + debug: 4.4.1 + eslint: 9.28.0(jiti@1.21.0) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -6831,7 +6854,7 @@ snapshots: '@typescript-eslint/types@7.7.0': {} - '@typescript-eslint/types@8.32.1': {} + '@typescript-eslint/types@8.33.0': {} '@typescript-eslint/typescript-estree@7.7.0(typescript@5.8.3)': dependencies: @@ -6848,41 +6871,43 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.33.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/visitor-keys': 8.32.1 - debug: 4.4.0 + '@typescript-eslint/project-service': 8.33.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.33.0(typescript@5.8.3) + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/visitor-keys': 8.33.0 + debug: 4.4.1 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/utils@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@1.21.0)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.0)) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.7.0 '@typescript-eslint/types': 7.7.0 '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.8.3) - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) semver: 7.7.2 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/utils@8.32.1(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3)': + '@typescript-eslint/utils@8.33.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@1.21.0)) - '@typescript-eslint/scope-manager': 8.32.1 - '@typescript-eslint/types': 8.32.1 - '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) - eslint: 9.27.0(jiti@1.21.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.0)) + '@typescript-eslint/scope-manager': 8.33.0 + '@typescript-eslint/types': 8.33.0 + '@typescript-eslint/typescript-estree': 8.33.0(typescript@5.8.3) + eslint: 9.28.0(jiti@1.21.0) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -6892,9 +6917,9 @@ snapshots: '@typescript-eslint/types': 7.7.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.32.1': + '@typescript-eslint/visitor-keys@8.33.0': dependencies: - '@typescript-eslint/types': 8.32.1 + '@typescript-eslint/types': 8.33.0 eslint-visitor-keys: 4.2.0 '@typescript/vfs@1.6.0(typescript@5.8.3)': @@ -7068,9 +7093,9 @@ snapshots: - rollup - supports-color - '@vite-pwa/sveltekit@0.6.6(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(vite-plugin-pwa@0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0))': + '@vite-pwa/sveltekit@0.6.6(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(vite-plugin-pwa@0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0))': dependencies: - '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.2)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/kit': 2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.10)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) kolorist: 1.8.0 tinyglobby: 0.2.13 vite-plugin-pwa: 0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.0)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))(workbox-build@7.0.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) @@ -7817,39 +7842,39 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@9.27.0(jiti@1.21.0)): + eslint-compat-utils@0.5.1(eslint@9.28.0(jiti@1.21.0)): dependencies: - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) semver: 7.7.2 - eslint-config-prettier@10.1.5(eslint@9.27.0(jiti@1.21.0)): + eslint-config-prettier@10.1.5(eslint@9.28.0(jiti@1.21.0)): dependencies: - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) - eslint-plugin-es-x@7.8.0(eslint@9.27.0(jiti@1.21.0)): + eslint-plugin-es-x@7.8.0(eslint@9.28.0(jiti@1.21.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@1.21.0)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.0)) '@eslint-community/regexpp': 4.12.1 - eslint: 9.27.0(jiti@1.21.0) - eslint-compat-utils: 0.5.1(eslint@9.27.0(jiti@1.21.0)) + eslint: 9.28.0(jiti@1.21.0) + eslint-compat-utils: 0.5.1(eslint@9.28.0(jiti@1.21.0)) - eslint-plugin-n@17.10.1(eslint@9.27.0(jiti@1.21.0)): + eslint-plugin-n@17.10.1(eslint@9.28.0(jiti@1.21.0)): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@1.21.0)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.0)) enhanced-resolve: 5.17.1 - eslint: 9.27.0(jiti@1.21.0) - eslint-plugin-es-x: 7.8.0(eslint@9.27.0(jiti@1.21.0)) + eslint: 9.28.0(jiti@1.21.0) + eslint-plugin-es-x: 7.8.0(eslint@9.28.0(jiti@1.21.0)) get-tsconfig: 4.7.6 globals: 15.9.0 ignore: 5.3.1 minimatch: 9.0.5 semver: 7.7.2 - eslint-plugin-svelte@3.9.0(eslint@9.27.0(jiti@1.21.0))(svelte@5.33.2): + eslint-plugin-svelte@3.9.0(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.10): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@1.21.0)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.0)) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.27.0(jiti@1.21.0) + eslint: 9.28.0(jiti@1.21.0) esutils: 2.0.3 globals: 16.2.0 known-css-properties: 0.36.0 @@ -7857,9 +7882,9 @@ snapshots: postcss-load-config: 3.1.4(postcss@8.5.3) postcss-safe-parser: 7.0.1(postcss@8.5.3) semver: 7.6.3 - svelte-eslint-parser: 1.2.0(svelte@5.33.2) + svelte-eslint-parser: 1.2.0(svelte@5.33.10) optionalDependencies: - svelte: 5.33.2 + svelte: 5.33.10 transitivePeerDependencies: - ts-node @@ -7872,15 +7897,15 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.27.0(jiti@1.21.0): + eslint@9.28.0(jiti@1.21.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0(jiti@1.21.0)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.28.0(jiti@1.21.0)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.20.0 '@eslint/config-helpers': 0.2.1 '@eslint/core': 0.14.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.27.0 + '@eslint/js': 9.28.0 '@eslint/plugin-kit': 0.3.1 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -7890,7 +7915,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 escape-string-regexp: 4.0.0 eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -9204,10 +9229,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.33.2): + prettier-plugin-svelte@3.4.0(prettier@3.5.3)(svelte@5.33.10): dependencies: prettier: 3.5.3 - svelte: 5.33.2 + svelte: 5.33.10 prettier@3.5.3: {} @@ -9726,19 +9751,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.2.1(picomatch@4.0.2)(svelte@5.33.2)(typescript@5.8.3): + svelte-check@4.2.1(picomatch@4.0.2)(svelte@5.33.10)(typescript@5.8.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.4(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.33.2 + svelte: 5.33.10 typescript: 5.8.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@1.2.0(svelte@5.33.2): + svelte-eslint-parser@1.2.0(svelte@5.33.10): dependencies: eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -9747,20 +9772,20 @@ snapshots: postcss-scss: 4.0.9(postcss@8.5.3) postcss-selector-parser: 7.0.0 optionalDependencies: - svelte: 5.33.2 + svelte: 5.33.10 svelte-highlight@7.8.3: dependencies: highlight.js: 11.11.1 - svelte2tsx@0.7.34(svelte@5.33.2)(typescript@5.8.3): + svelte2tsx@0.7.34(svelte@5.33.10)(typescript@5.8.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.33.2 + svelte: 5.33.10 typescript: 5.8.3 - svelte@5.33.2: + svelte@5.33.10: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -9947,12 +9972,12 @@ snapshots: typescript: 5.8.3 yaml: 2.7.1 - typescript-eslint@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3): + typescript-eslint@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - '@typescript-eslint/parser': 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - '@typescript-eslint/utils': 7.7.0(eslint@9.27.0(jiti@1.21.0))(typescript@5.8.3) - eslint: 9.27.0(jiti@1.21.0) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3))(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/parser': 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + '@typescript-eslint/utils': 7.7.0(eslint@9.28.0(jiti@1.21.0))(typescript@5.8.3) + eslint: 9.28.0(jiti@1.21.0) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: diff --git a/src/lib/Mark.svelte b/src/lib/Mark.svelte index 35fd59bb..f5bcb7d4 100644 --- a/src/lib/Mark.svelte +++ b/src/lib/Mark.svelte @@ -56,7 +56,7 @@ const channelsWithFacets: ScaledChannelName[] = $derived([...channels, 'fx', 'fy']); - const { addMark, updateMark, updatePlotState, removeMark, getTopLevelFacet, getPlotState } = + const { addMark, removeMark, getTopLevelFacet, getPlotState } = getContext('svelteplot'); const plot = $derived(getPlotState()); @@ -258,16 +258,17 @@ if (options?.[channel] != null && out[channel] === undefined) { // resolve value const value = row[channel]; - const scaled = usedScales[channel] ? scale === 'x' ? projectX(channel as 'x' | 'x1' | 'x2', plot.scales, value) : scale === 'y' ? projectY(channel as 'y' | 'y1' | 'y1', plot.scales, value) - : plot.scales[scale].fn(value) + : scale === 'color' && !isValid(value) + ? plot.options.color.unknown + : plot.scales[scale].fn(value) : value; - out.valid = out.valid && isValid(value); + out.valid = out.valid && (scale === 'color' || isValid(value)); // apply dx/dy transform out[channel] = diff --git a/src/lib/Plot.svelte b/src/lib/Plot.svelte index 53750c28..fb54112b 100644 --- a/src/lib/Plot.svelte +++ b/src/lib/Plot.svelte @@ -117,7 +117,7 @@ scales, ...restProps })} - console.warn(err)}> + console.error(err)}> {#if !hasProjection && !hasExplicitAxisX} {#if options.axes && (options.x.axis === 'top' || options.x.axis === 'both')} diff --git a/src/lib/core/Plot.svelte b/src/lib/core/Plot.svelte index 2c6daae1..3e27fc04 100644 --- a/src/lib/core/Plot.svelte +++ b/src/lib/core/Plot.svelte @@ -62,7 +62,7 @@ initialWidth: 500, inset: 0, colorScheme: 'turbo', - unknown: '#cccccc', + unknown: '#cccccc99', dotRadius: 3, frame: false, axes: true, @@ -450,7 +450,7 @@ padding: 0, align: 0 }, - color: { type: 'auto' }, + color: { type: 'auto', unknown: DEFAULTS.unknown }, length: { type: 'linear' }, symbol: { type: 'ordinal' }, fx: { type: 'band', axis: 'top' }, diff --git a/src/lib/helpers/scales.ts b/src/lib/helpers/scales.ts index 87d3a411..d8e01723 100644 --- a/src/lib/helpers/scales.ts +++ b/src/lib/helpers/scales.ts @@ -30,6 +30,7 @@ import isDataRecord from './isDataRecord.js'; import { createProjection } from './projection.js'; import { maybeInterval } from './autoTicks.js'; +import { IS_SORTED } from 'svelteplot/transforms/sort.js'; /** * compute the plot scales @@ -183,7 +184,10 @@ export function createScale( // we're deliberately checking for !== undefined and not for != null // since the explicit sort transforms like shuffle will set the // sort channel to null to we know that there's an explicit order - if (mark.channels.sort !== undefined) sortOrdinalDomain = false; + if ((name === 'x' || name === 'y') && mark.options[IS_SORTED] != undefined) { + sortOrdinalDomain = false; + } + for (const channel of mark.channels) { // channelOptions can be passed as prop, but most often users will just // pass the channel accessor or constant value, so we may need to wrap @@ -278,6 +282,13 @@ export function createScale( } } + if ((name === 'x' || name === 'y') && scaleOptions.sort) { + sortOrdinalDomain = true; + } + if ((name === 'x' || name === 'y') && scaleOptions.sort === false) { + sortOrdinalDomain = false; + } + // construct domain from data values const valueArr = [...dataValues.values(), ...(scaleOptions.domain || [])].filter( (d) => d != null diff --git a/src/lib/marks/AxisX.svelte b/src/lib/marks/AxisX.svelte index 89593a11..d1256c48 100644 --- a/src/lib/marks/AxisX.svelte +++ b/src/lib/marks/AxisX.svelte @@ -99,7 +99,7 @@ const ticks: RawValue[] = $derived( data.length > 0 ? // use custom tick values if user passed any as prop - data + Array.from(new Set(data)) : // use custom scale tick values if user passed any as plot scale option autoTicks( plot.scales.x.type, diff --git a/src/lib/marks/ColorLegend.svelte b/src/lib/marks/ColorLegend.svelte index 75529dba..a6019388 100644 --- a/src/lib/marks/ColorLegend.svelte +++ b/src/lib/marks/ColorLegend.svelte @@ -167,6 +167,7 @@ .swatch { display: inline-flex; align-items: center; + column-gap: 0.3rem; } .item-label { vertical-align: super; diff --git a/src/lib/marks/Dot.svelte b/src/lib/marks/Dot.svelte index 73674db3..9ed2792e 100644 --- a/src/lib/marks/Dot.svelte +++ b/src/lib/marks/Dot.svelte @@ -49,9 +49,7 @@ return d3Symbol(maybeSymbol(symbolType), size)(); } - const { getTestFacet } = getContext('svelteplot/facet'); const { dotRadius } = getContext('svelteplot/_defaults'); - let testFacet = $derived(getTestFacet()); const args = $derived( // todo: move sorting to Mark @@ -84,7 +82,7 @@ defaults={{ r: dotRadius, symbol: 'circle' }} {...args}> {#snippet children({ mark, usedScales, scaledData })} - + {#if canvas} {:else} diff --git a/src/lib/transforms/sort.test.ts b/src/lib/transforms/sort.test.ts new file mode 100644 index 00000000..4799e026 --- /dev/null +++ b/src/lib/transforms/sort.test.ts @@ -0,0 +1,55 @@ +import { describe, it, expect } from 'vitest'; +import { sort, shuffle } from './sort.js'; +import type { DataRecord } from '$lib/types.js'; + +const data: DataRecord[] = [ + { A: 1, B: 7 }, + { A: 5, B: 4 }, + { A: 3, B: 3 } +]; + +const sortedByA = data.sort((a, b) => a.A - b.A); + +describe('sort transform', () => { + it('does not sort if no sort channel is defined', () => { + expect(sort({ data }).data).toStrictEqual(data); + }); + + it('sort data by string accessor', () => { + expect(sort({ data, sort: 'A' }).data).toStrictEqual(sortedByA); + }); + + it('sort data by accessor function', () => { + expect(sort({ data, sort: (d) => d.A }).data).toStrictEqual(sortedByA); + }); + + it('sort data by comperator function', () => { + expect(sort({ data, sort: (a, b) => a.A - b.A }).data).toStrictEqual(sortedByA); + }); + + it('sort data by channel', () => { + expect(sort({ data, x: 'A', sort: { channel: 'x' } }).data).toStrictEqual(sortedByA); + }); + + it('sort data by channel descending', () => { + expect( + sort({ data, x: 'A', sort: { channel: 'x', order: 'descending' } }).data + ).toStrictEqual(sortedByA.toReversed()); + }); + + it('sort data by channel descending alternative syntax', () => { + expect(sort({ data, y: 'A', sort: { channel: '-y' } }).data).toStrictEqual( + sortedByA.toReversed() + ); + }); +}); + +describe('shuffle transform', () => { + it('shuffles the data', () => { + const shuffled = shuffle({ data }, { seed: 1 }); + expect(shuffled.sort).toBe(null); + expect(shuffled.data).toHaveLength(data.length); + expect(shuffled.data).not.toStrictEqual(data); + expect(shuffled.data.sort((a, b) => a.A - b.A)).toStrictEqual(sortedByA); + }); +}); diff --git a/src/lib/transforms/sort.ts b/src/lib/transforms/sort.ts index b5a81155..1278cb13 100644 --- a/src/lib/transforms/sort.ts +++ b/src/lib/transforms/sort.ts @@ -5,6 +5,7 @@ import { shuffler } from 'd3-array'; import { randomLcg } from 'd3-random'; export const SORT_KEY = Symbol('sortKey'); +export const IS_SORTED = Symbol('isSorted'); export function sort( { data, ...channels }: TransformArg, @@ -21,23 +22,34 @@ export function sort( sort.channel = sort.channel.substring(1); sort.order = 'descending'; } + // if sort is a function that does not take exactly one argument, we treat it + // as comparator function, as you would pass to array.sort + const isComparator = typeof channels.sort === 'function' && channels.sort.length !== 1; + // sort data return { - data: data - .map((d) => ({ - ...d, - [SORT_KEY]: resolveChannel('sort', d, { ...channels, sort }) - })) - .toSorted( - (a, b) => - (a[SORT_KEY] > b[SORT_KEY] ? 1 : a[SORT_KEY] < b[SORT_KEY] ? -1 : 0) * - (options.reverse || (isDataRecord(sort) && sort?.order === 'descending') - ? -1 - : 1) - ) - .map(({ [SORT_KEY]: a, ...rest }) => rest), + data: isComparator + ? data.toSorted(channels.sort as (a: DataRecord, b: DataRecord) => number) + : data + .map((d) => ({ + ...d, + [SORT_KEY]: resolveChannel('sort', d, { ...channels, sort }) as + | number + | Date + | string + })) + .toSorted( + (a, b) => + (a[SORT_KEY] > b[SORT_KEY] ? 1 : a[SORT_KEY] < b[SORT_KEY] ? -1 : 0) * + (options.reverse || + (isDataRecord(sort) && sort?.order === 'descending') + ? -1 + : 1) + ) + .map(({ [SORT_KEY]: a, ...rest }) => rest), ...channels, + [IS_SORTED]: sort, // set the sort channel to null to disable the implicit alphabetical // ordering of ordinal domains, and also to avoid double sorting in case // this transform is used "outside" a mark @@ -51,7 +63,7 @@ export function sort( } /** - * reverses the data row order + * shuffles the data row order */ export function shuffle( { data, ...channels }: TransformArg, @@ -64,7 +76,8 @@ export function shuffle( ...channels, // set the sort channel to null to disable the implicit // alphabetical ordering of ordinal domains - sort: null + sort: null, + [IS_SORTED]: true }; } @@ -77,6 +90,7 @@ export function reverse({ data, ...channels }: TransformArg) { ...channels, // set the sort channel to null to disable the implicit // alphabetical ordering of ordinal domains - sort: null + sort: null, + [IS_SORTED]: true }; } diff --git a/src/lib/types.ts b/src/lib/types.ts index 7b782c76..862dc6cf 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -445,7 +445,7 @@ export type PlotDefaults = { css: (d: string) => string | undefined; }; -export type GenericMarkOptions = Record; +export type GenericMarkOptions = Record; export type DataRecord = Record & { ___orig___?: RawValue | [RawValue, RawValue]; @@ -657,6 +657,16 @@ export type BaseMarkProps = Partial<{ dy: ConstantAccessor; fill: ConstantAccessor; fillOpacity: ConstantAccessor; + sort: + | string + | ConstantAccessor + | ((a: RawValue, b: RawValue) => number) + | { + /** sort data using an already defined channel */ + channel: string; + /** sort order */ + order?: 'ascending' | 'descending'; + }; stroke: ConstantAccessor; strokeWidth: ConstantAccessor; strokeOpacity: ConstantAccessor; @@ -731,7 +741,7 @@ export type Channels = Record< ChannelAccessor | ConstantAccessor >; -export type TransformArg = Channels & { data: K[] }; +export type TransformArg = Channels & BaseMarkProps & { data: K[] }; export type MapArg = Channels & { data: K[] }; export type TransformArgsRow = Partial & { data: DataRow[] }; diff --git a/src/routes/+page.md b/src/routes/+page.md index 554d0ccc..f86c3a6e 100644 --- a/src/routes/+page.md +++ b/src/routes/+page.md @@ -5,11 +5,14 @@ heroImage: /logo.png tagline: A Svelte-native visualization framework based on the layered grammar of graphics principles. actions: - label: Getting started - type: flat + type: primary to: /getting-started - label: Why SveltePlot? to: /why-svelteplot - type: primary + type: flat + - label: Examples + to: /examples + type: flat _features: - title: Marks description: SveltePlot comes with a powerful set of built-in marks for building for your visualizations diff --git a/src/routes/examples/+layout.ts b/src/routes/examples/+layout.ts index 976ef042..2d4c6765 100644 --- a/src/routes/examples/+layout.ts +++ b/src/routes/examples/+layout.ts @@ -1,9 +1,9 @@ import { loadDatasets, loadJSON } from '$lib/helpers/data.js'; -import type { PageLoad } from './$types.js'; +import type { PageServerLoad } from '../$types'; export const ssr = true; -export const load: PageLoad = async ({ fetch }) => { +export const load: PageServerLoad = async ({ fetch }) => { return { data: { world: await loadJSON(fetch, 'countries-110m'), @@ -11,11 +11,13 @@ export const load: PageLoad = async ({ fetch }) => { ...(await loadDatasets( [ 'aapl', + 'alphabet', 'beagle', 'bls', 'co2', 'crimea', 'driving', + 'languages', 'penguins', 'riaa', 'stateage', diff --git a/src/routes/examples/bar/_index.svelte b/src/routes/examples/bar/_index.svelte new file mode 100644 index 00000000..51b5a7a8 --- /dev/null +++ b/src/routes/examples/bar/_index.svelte @@ -0,0 +1,5 @@ + + +

Bar examples

diff --git a/src/routes/examples/bar/shuffled-bars.svelte b/src/routes/examples/bar/shuffled-bars.svelte new file mode 100644 index 00000000..a061ba8d --- /dev/null +++ b/src/routes/examples/bar/shuffled-bars.svelte @@ -0,0 +1,25 @@ + + + + + + + + diff --git a/src/routes/examples/dot/3-dot-plot.svelte b/src/routes/examples/dot/3-dot-plot.svelte new file mode 100644 index 00000000..a04e1f62 --- /dev/null +++ b/src/routes/examples/dot/3-dot-plot.svelte @@ -0,0 +1,30 @@ + + + + + + + d['Total speakers'] >= 70e6 + )} + fill="currentColor" + sort={{ channel: '-x' }} + y="Language" + x="Total speakers" /> + diff --git a/src/routes/examples/dot/bubble-matrix.svelte b/src/routes/examples/dot/bubble-matrix.svelte new file mode 100644 index 00000000..eda1d5d4 --- /dev/null +++ b/src/routes/examples/dot/bubble-matrix.svelte @@ -0,0 +1,28 @@ + + + + + + + diff --git a/src/tests/axisX.test.ts b/src/tests/axisX.test.ts index 482365e7..ec7a2d36 100644 --- a/src/tests/axisX.test.ts +++ b/src/tests/axisX.test.ts @@ -1,6 +1,7 @@ import { describe, it, expect } from 'vitest'; import { render } from '@testing-library/svelte'; import AxisXTest from './axisX.test.svelte'; +import { getTranslate } from './utils'; describe('AxisX mark', () => { it('default axis', () => { @@ -176,4 +177,41 @@ describe('AxisX mark', () => { expect(tickLines.length).toBe(25); expect(tickLabels.length).toBe(0); }); + + it('sorts ordinal ticks by default', () => { + const { container } = render(AxisXTest, { + props: { + plotArgs: { + width: 400 + }, + axisArgs: { data: ['C', 'A', 'A', 'B', 'B', 'C', 'B', 'C'] } + } + }); + const ticks = Array.from( + container.querySelectorAll('g.axis-x > g.tick') as NodeListOf + ); + expect(ticks.length).toBe(3); + ticks.sort((a, b) => getTranslate(a)[0] - getTranslate(b)[0]); + const tickValues = ticks.map((t) => t.querySelector('text')?.textContent); + expect(tickValues).toStrictEqual(['A', 'B', 'C']); + }); + + it('does not ordinal ticks if turned off', () => { + const { container } = render(AxisXTest, { + props: { + plotArgs: { + width: 400, + x: { sort: false } + }, + axisArgs: { data: ['C', 'A', 'A', 'B', 'B', 'C', 'B', 'C'] } + } + }); + const ticks = Array.from( + container.querySelectorAll('g.axis-x > g.tick') as NodeListOf + ); + expect(ticks.length).toBe(3); + ticks.sort((a, b) => getTranslate(a)[0] - getTranslate(b)[0]); + const tickValues = ticks.map((t) => t.querySelector('text')?.textContent); + expect(tickValues).toStrictEqual(['C', 'A', 'B']); + }); }); diff --git a/src/tests/barX.test.ts b/src/tests/barX.test.ts index 19e74f70..6a10ba00 100644 --- a/src/tests/barX.test.ts +++ b/src/tests/barX.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; import { render } from '@testing-library/svelte'; import BarXTest from './barX.test.svelte'; -import { parseSVG, makeAbsolute } from 'svg-path-parser'; +import { getPathDims, getRectDims } from './utils'; const testData = [ { @@ -146,37 +146,3 @@ describe('BarX mark', () => { expect(labels.sort()).toEqual(['2019', '2020', '2021', '2022', '2023', '2024']); }); }); - -function getRectDims(rect: SVGRectElement) { - const t = rect - ?.getAttribute('transform') - ?.match(/translate\((\d+(?:\.\d+)?),(\d+(?:\.\d+)?)\)/); - return { - x: Math.round(+t[1]), - y: Math.round(+t[2]), - w: Math.round(+rect.getAttribute('width')), - h: Math.round(+rect.getAttribute('height')), - fill: rect.style.fill, - stroke: rect.style.stroke, - strokeWidth: rect.style.strokeWidth - }; -} - -function getPathDims(path: SVGPathElement) { - const r = makeAbsolute(parseSVG(path.getAttribute('d'))); - const x = r.flatMap((d) => [d.x, d.x0, d.x1]).filter((x) => x != null); - const y = r.flatMap((d) => [d.y, d.y0, d.y1]).filter((y) => y != null); - const t = path - ?.getAttribute('transform') - ?.match(/translate\((\d+(?:\.\d+)?),(\d+(?:\.\d+)?)\)/); - if (!r || !t) return { x: NaN, y: NaN, w: NaN, h: NaN }; - return { - x: Math.round(Math.min(...x)), - y: Math.round(Math.min(...y)), - w: Math.round(Math.max(...x) - Math.min(...x)), - h: Math.round(Math.max(...y) - Math.min(...y)), - fill: path.style.fill, - stroke: path.style.stroke, - strokeWidth: path.style.strokeWidth - }; -} diff --git a/src/tests/colors.test.ts b/src/tests/colors.test.ts index 4229456b..dae0c17d 100644 --- a/src/tests/colors.test.ts +++ b/src/tests/colors.test.ts @@ -27,11 +27,11 @@ describe('Colors', () => { colorOptions: {} } }); - const dots = container.querySelectorAll('g.dots > path') as NodeListOf; + const dots = container.querySelectorAll('g.dot > path') as NodeListOf; expect(dots.length).toBe(2); const styles = Array.from(dots).map(getDotStyle); - expect(styles[0].fill).toBe(observable10[0]); - expect(styles[1].fill).toBe(observable10[1]); + expect(styles[0].fill).toBe(observable10[1]); + expect(styles[1].fill).toBe(observable10[0]); }); it('set custom scheme as object', () => { @@ -64,12 +64,12 @@ describe('Colors', () => { } } }); - const dots = container.querySelectorAll('g.dots > path') as NodeListOf; + const dots = container.querySelectorAll('g.dot > path') as NodeListOf; expect(dots.length).toBe(3); const styles = Array.from(dots).map(getDotStyle); expect(styles[0].fill).toBe('green'); expect(styles[1].fill).toBe('violet'); - expect(styles[2].fill).toBe('#cccccc'); + expect(styles[2].fill).toBe('#cccccc99'); }); }); diff --git a/src/tests/dot.test.svelte b/src/tests/dot.test.svelte new file mode 100644 index 00000000..07762711 --- /dev/null +++ b/src/tests/dot.test.svelte @@ -0,0 +1,15 @@ + + + + + diff --git a/src/tests/dot.test.ts b/src/tests/dot.test.ts new file mode 100644 index 00000000..75b81d68 --- /dev/null +++ b/src/tests/dot.test.ts @@ -0,0 +1,85 @@ +import { describe, it, expect } from 'vitest'; +import { render } from '@testing-library/svelte'; +import DotTest from './dot.test.svelte'; +import { getTranslate } from './utils'; +import { symbol, symbolCircle } from 'd3-shape'; + +const testData = [ + { x: 10, y: 20, value: 5 }, + { x: 15, y: 25, value: 10 } +]; + +describe('Dot mark', () => { + it('renders dots with basic props', () => { + const { container } = render(DotTest, { + props: { + plotArgs: {}, + dotArgs: { + data: testData, + x: 'x', + y: 'y', + r: 5, + fill: 'red' + } + } + }); + + const dots = container.querySelectorAll('g.dot > path') as NodeListOf; + expect(dots.length).toBe(2); + const circle5 = symbol(symbolCircle).size(5 ** 2 * Math.PI)(); + const paths = Array.from(dots).map((d) => d.getAttribute('d')); + expect(paths[0]).toBe(circle5); + expect(paths[1]).toBe(circle5); + expect(dots[0].style.fill).toBe('red'); + expect(dots[1].style.fill).toBe('red'); + const positions = Array.from(dots).map(getTranslate); + expect(positions[0]).not.toStrictEqual(positions[1]); + }); + + it('scales dot size based on data', () => { + const { container } = render(DotTest, { + props: { + plotArgs: {}, + dotArgs: { + data: testData, + x: 'x', + y: 'y', + r: 'value', + fill: 'blue' + } + } + }); + + const dots = container.querySelectorAll('g.dot > path') as NodeListOf; + expect(dots.length).toBe(2); + const circle7 = symbol(symbolCircle).size(7.071 ** 2 * Math.PI)(); + const circle10 = symbol(symbolCircle).size(10 ** 2 * Math.PI)(); + const paths = Array.from(dots).map((d) => d.getAttribute('d')); + expect(paths[0]).toBe(circle10); + expect(paths[1]).toBe(circle7); + expect(dots[0].style.fill).toBe('blue'); + expect(dots[1].style.fill).toBe('blue'); + const positions = Array.from(dots).map(getTranslate); + expect(positions[0]).not.toStrictEqual(positions[1]); + }); + + it('maps colors based on data', () => { + const { container } = render(DotTest, { + props: { + plotArgs: {}, + dotArgs: { + data: testData, + x: 'x', + y: 'y', + r: 5, + fill: (d: any) => (d.value > 5 ? 'red' : 'blue') + } + } + }); + + const dots = container.querySelectorAll('g.dot > path') as NodeListOf; + expect(dots.length).toBe(2); + expect(dots[0].style.fill).toBe('blue'); + expect(dots[1].style.fill).toBe('red'); + }); +}); diff --git a/src/tests/utils.ts b/src/tests/utils.ts new file mode 100644 index 00000000..a1f88179 --- /dev/null +++ b/src/tests/utils.ts @@ -0,0 +1,40 @@ +import { parseSVG, makeAbsolute } from 'svg-path-parser'; + +export function getRectDims(rect: SVGRectElement) { + const t = rect + ?.getAttribute('transform') + ?.match(/translate\((\d+(?:\.\d+)?),(\d+(?:\.\d+)?)\)/); + return { + x: Math.round(+t[1]), + y: Math.round(+t[2]), + w: Math.round(+rect.getAttribute('width')), + h: Math.round(+rect.getAttribute('height')), + fill: rect.style.fill, + stroke: rect.style.stroke, + strokeWidth: rect.style.strokeWidth + }; +} + +export function getTranslate(element: SVGElement) { + const t = element + ?.getAttribute('transform') + ?.match(/translate\((\d+(?:\.\d+)?), *(\d+(?:\.\d+)?)\)/); + if (!t) return [0, 0]; + return [+t[1], +t[2]]; +} + +export function getPathDims(path: SVGPathElement) { + const r = makeAbsolute(parseSVG(path.getAttribute('d'))); + const x = r.flatMap((d) => [d.x, d.x0, d.x1]).filter((x) => x != null); + const y = r.flatMap((d) => [d.y, d.y0, d.y1]).filter((y) => y != null); + const [tx, ty] = getTranslate(path); + return { + x: Math.round(Math.min(...x)) + tx, + y: Math.round(Math.min(...y)) + ty, + w: Math.round(Math.max(...x) - Math.min(...x)), + h: Math.round(Math.max(...y) - Math.min(...y)), + fill: path.style.fill, + stroke: path.style.stroke, + strokeWidth: path.style.strokeWidth + }; +} diff --git a/static/examples/bar/shuffled-bars.dark.png b/static/examples/bar/shuffled-bars.dark.png new file mode 100644 index 00000000..e7014f8f Binary files /dev/null and b/static/examples/bar/shuffled-bars.dark.png differ diff --git a/static/examples/bar/shuffled-bars.png b/static/examples/bar/shuffled-bars.png new file mode 100644 index 00000000..cd0dfd95 Binary files /dev/null and b/static/examples/bar/shuffled-bars.png differ diff --git a/static/examples/dot/3-dot-plot.dark.png b/static/examples/dot/3-dot-plot.dark.png new file mode 100644 index 00000000..e8f0438d Binary files /dev/null and b/static/examples/dot/3-dot-plot.dark.png differ diff --git a/static/examples/dot/3-dot-plot.png b/static/examples/dot/3-dot-plot.png new file mode 100644 index 00000000..17a1df2f Binary files /dev/null and b/static/examples/dot/3-dot-plot.png differ diff --git a/static/examples/dot/bubble-matrix.dark.png b/static/examples/dot/bubble-matrix.dark.png new file mode 100644 index 00000000..e5403111 Binary files /dev/null and b/static/examples/dot/bubble-matrix.dark.png differ diff --git a/static/examples/dot/bubble-matrix.png b/static/examples/dot/bubble-matrix.png new file mode 100644 index 00000000..16e36606 Binary files /dev/null and b/static/examples/dot/bubble-matrix.png differ diff --git a/static/examples/geo/us-choropleth-canvas.dark.png b/static/examples/geo/us-choropleth-canvas.dark.png index dceedfb8..c4f80049 100644 Binary files a/static/examples/geo/us-choropleth-canvas.dark.png and b/static/examples/geo/us-choropleth-canvas.dark.png differ diff --git a/static/examples/geo/us-choropleth-canvas.png b/static/examples/geo/us-choropleth-canvas.png index 6c9934b1..5733af03 100644 Binary files a/static/examples/geo/us-choropleth-canvas.png and b/static/examples/geo/us-choropleth-canvas.png differ diff --git a/static/examples/geo/us-choropleth.dark.png b/static/examples/geo/us-choropleth.dark.png index 0973d26e..a11e1c70 100644 Binary files a/static/examples/geo/us-choropleth.dark.png and b/static/examples/geo/us-choropleth.dark.png differ diff --git a/static/examples/geo/us-choropleth.png b/static/examples/geo/us-choropleth.png index 55891957..be55cc71 100644 Binary files a/static/examples/geo/us-choropleth.png and b/static/examples/geo/us-choropleth.png differ pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy