diff --git a/.prettierignore b/.prettierignore index 96d673f6..2bc356ea 100644 --- a/.prettierignore +++ b/.prettierignore @@ -7,8 +7,7 @@ node_modules .env.* !.env.example -# Ignore files for PNPM, NPM and YARN +# Ignore files for PNPM, NPM pnpm-lock.yaml package-lock.json -yarn.lock static/data/* \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b3b7e47..706c4241 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,3 @@ # Changelog -## 0.2.0 - -- Add Brush, BrushX, and BrushY components with comprehensive documentation and examples -- Add support for onpointer\* events and add missing onmouseover event -- Replace types for CSS-properties with rules from csstype package -- Improve documentation for interactivity features - -## 0.1.1-alpha.29 - -- fix bug in BoxX and BoxY marks when some groups are empty -- remove underscore.js dependency - -## 0.1.1-alpha.28 - -- upgrade to svelte@5.0.0-next.130 -- upgrade some more dev dependencies - -## 0.1.1-alpha.27 - -- add BoxX and BoxY marks +see [releases](https://github.com/svelteplot/svelteplot/releases) diff --git a/README.md b/README.md index 10f72287..203eac9f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # SveltePlot -![Tests](https://github.com/svelteplot/svelteplot/actions/workflows/test.yml/badge.svg) +![License](https://img.shields.io/npm/l/svelteplot.svg) ![Tests](https://github.com/svelteplot/svelteplot/actions/workflows/test.yml/badge.svg) SveltePlot is a visualization framework based on the [layered grammar of graphics](https://vita.had.co.nz/papers/layered-grammar.html) ideas. It's API is heavily inspired by [Observable Plot](https://github.com/observablehq/plot). Created by Gregor Aisch. diff --git a/eslint.config.js b/eslint.config.js index 4addab3b..a92a9b75 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: { @@ -30,8 +36,7 @@ export default [ '.env.*', '!.env.example', 'pnpm-lock.yaml', - 'package-lock.json', - 'yarn.lock' + 'package-lock.json' ] } ]; diff --git a/package.json b/package.json index 4b512110..31f01918 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelteplot", - "version": "0.2.9", + "version": "0.2.10", "license": "ISC", "author": { "name": "Gregor Aisch", @@ -72,23 +72,23 @@ "@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", + "eslint-plugin-svelte": "3.9.1", "jsdom": "^26.1.0", "prettier": "^3.5.3", "prettier-plugin-svelte": "^3.4.0", - "puppeteer": "^24.9.0", + "puppeteer": "^24.10.0", "remark-code-extra": "^1.0.1", "remark-code-frontmatter": "^1.0.0", "resize-observer-polyfill": "^1.5.1", - "sass": "^1.89.0", + "sass": "^1.89.1", "svelte-check": "^4.2.1", "svelte-eslint-parser": "1.2.0", "svelte-highlight": "^7.8.3", @@ -97,7 +97,7 @@ "ts-essentials": "^10.0.4", "tslib": "^2.8.1", "typedoc": "^0.28.5", - "typedoc-plugin-markdown": "^4.6.3", + "typedoc-plugin-markdown": "^4.6.4", "typescript": "^5.8.3", "vite": "^6.3.5", "vitest": "^3.1.4", @@ -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.13" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c9817632..367ec738 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.13 + version: 5.33.13 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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.13))(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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(59f0df36ae1b5b57f950c9a9086bb872) '@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.13)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1)(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) + specifier: 3.9.1 + version: 3.9.1(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.13) jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -164,10 +164,10 @@ 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.13) puppeteer: - specifier: ^24.9.0 - version: 24.9.0(typescript@5.8.3) + specifier: ^24.10.0 + version: 24.10.0(typescript@5.8.3) remark-code-extra: specifier: ^1.0.1 version: 1.0.1 @@ -178,14 +178,14 @@ importers: specifier: ^1.5.1 version: 1.5.1 sass: - specifier: ^1.89.0 - version: 1.89.0 + specifier: ^1.89.1 + version: 1.89.1 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.13)(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.13) svelte-highlight: specifier: ^7.8.3 version: 7.8.3 @@ -205,20 +205,20 @@ importers: specifier: ^0.28.5 version: 0.28.5(typescript@5.8.3) typedoc-plugin-markdown: - specifier: ^4.6.3 - version: 4.6.3(typedoc@0.28.5(typescript@5.8.3)) + specifier: ^4.6.4 + version: 4.6.4(typedoc@0.28.5(typescript@5.8.3)) typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.3.5 - version: 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.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) vitest: specifier: ^3.1.4 - version: 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: 3.1.4(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) vitest-matchmedia-mock: specifier: ^2.0.3 - version: 2.0.3(@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: 2.0.3(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) packages: @@ -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,21 +1893,31 @@ 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==} engines: {node: ^18.18.0 || >=20.0.0} @@ -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': @@ -2111,11 +2121,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} @@ -2645,8 +2650,8 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - devtools-protocol@0.0.1439962: - resolution: {integrity: sha512-jJF48UdryzKiWhJ1bLKr7BFWUQCEIT5uCNbDLqkQJBtkFxYzILJH44WN0PDKMIlGDN7Utb8vyUY85C3w4R/t2g==} + devtools-protocol@0.0.1452169: + resolution: {integrity: sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g==} dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -2788,8 +2793,8 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-svelte@3.9.0: - resolution: {integrity: sha512-nvIUNyyPGbr5922Kd1p/jXe+FfNdVPXsxLyrrXpwfSbZZEFdAYva9O/gm2lObC/wXkQo/AUmQkAihfmNJYeCjA==} + eslint-plugin-svelte@3.9.1: + resolution: {integrity: sha512-mXFulSdD/0/p+zwENjPNsiVwAqmSRp90sy5zvVQBX1yAXhJbdhIn6C/tn8BZYjU94Ia7Y87d1Xdbvi49DeWyHQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.1 || ^9.0.0 @@ -2810,8 +2815,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: @@ -3961,12 +3966,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - puppeteer-core@24.9.0: - resolution: {integrity: sha512-HFdCeH/wx6QPz8EncafbCqJBqaCG1ENW75xg3cLFMRUoqZDgByT6HSueiumetT2uClZxwqj0qS4qMVZwLHRHHw==} + puppeteer-core@24.10.0: + resolution: {integrity: sha512-xX0QJRc8t19iAwRDsAOR38Q/Zx/W6WVzJCEhKCAwp2XMsaWqfNtQ+rBfQW9PlF+Op24d7c8Zlgq9YNmbnA7hdQ==} engines: {node: '>=18'} - puppeteer@24.9.0: - resolution: {integrity: sha512-L0pOtALIx8rgDt24Y+COm8X52v78gNtBOW6EmUcEPci0TYD72SAuaXKqasRIx4JXxmg2Tkw5ySKcpPOwN8xXnQ==} + puppeteer@24.10.0: + resolution: {integrity: sha512-Oua9VkGpj0S2psYu5e6mCer6W9AU9POEQh22wRgSXnLXASGH+MwLUVWgLCLeP9QPHHcJ7tySUlg4Sa9OJmaLpw==} engines: {node: '>=18'} hasBin: true @@ -4128,8 +4133,8 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.89.0: - resolution: {integrity: sha512-ld+kQU8YTdGNjOLfRWBzewJpU5cwEv/h5yyqlSeJcj6Yh8U4TDA9UA5FPicqDz/xgRPWRSYIQNiFks21TbA9KQ==} + sass@1.89.1: + resolution: {integrity: sha512-eMLLkl+qz7tx/0cJ9wI+w09GQ2zodTkcE/aVfywwdlRcI3EO19xGnbmJwg/JMIm+5MxVJ6outddLZ4Von4E++Q==} engines: {node: '>=14.0.0'} hasBin: true @@ -4355,8 +4360,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.13: + resolution: {integrity: sha512-uT3BAPpHGaJqpOgdwJwIK7P4JkBkSS0vylbaRXxQjt1gr+DZ9BiPkhmbZw3ql8LJofUyz5XyrzzQDgQQdfP86Q==} engines: {node: '>=18'} svg-path-parser@1.1.0: @@ -4515,8 +4520,8 @@ packages: typed-query-selector@2.12.0: resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} - typedoc-plugin-markdown@4.6.3: - resolution: {integrity: sha512-86oODyM2zajXwLs4Wok2mwVEfCwCnp756QyhLGX2IfsdRYr1DXLCgJgnLndaMUjJD7FBhnLk2okbNE9PdLxYRw==} + typedoc-plugin-markdown@4.6.4: + resolution: {integrity: sha512-AnbToFS1T1H+n40QbO2+i0wE6L+55rWnj7zxnM1r781+2gmhMF2dB6dzFpaylWLQYkbg4D1Y13sYnne/6qZwdw==} engines: {node: '>= 18'} peerDependencies: typedoc: 0.28.x @@ -5071,7 +5076,7 @@ snapshots: '@babel/traverse': 7.25.3 '@babel/types': 7.25.2 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5816,7 +5821,7 @@ snapshots: '@babel/parser': 7.25.3 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6069,9 +6074,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 +6084,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 +6098,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 +6109,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.27.0': {} + '@eslint/js@9.28.0': {} '@eslint/object-schema@2.1.6': {} @@ -6152,7 +6157,7 @@ snapshots: '@antfu/install-pkg': 0.1.1 '@antfu/utils': 0.7.10 '@iconify/types': 2.0.0 - debug: 4.4.0 + debug: 4.4.1 kolorist: 1.8.0 local-pkg: 0.5.0 mlly: 1.7.1 @@ -6427,12 +6432,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 +6452,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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.13))(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.1(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.13) 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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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,62 +6486,62 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 3.0.0 - 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.13 + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(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.13 + svelte2tsx: 0.7.34(svelte@5.33.13)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) debug: 4.4.0 - 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.13 + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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 - 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)) + svelte: 5.33.13 + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1)(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(59f0df36ae1b5b57f950c9a9086bb872)': 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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltepress/twoslash': 1.2.2(svelte@5.33.13)(typescript@5.8.3) + '@sveltepress/vite': 1.2.2(@sveltejs/kit@2.21.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1)(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.13 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)) - 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: 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.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) workbox-precaching: 7.0.0 workbox-routing: 7.0.0 transitivePeerDependencies: @@ -6553,7 +6558,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.13)(typescript@5.8.3)': dependencies: '@floating-ui/dom': 1.6.3 '@shikijs/twoslash': 1.24.0(typescript@5.8.3) @@ -6562,18 +6567,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.13 + svelte2tsx: 0.7.34(svelte@5.33.13)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(rollup@2.79.1)(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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,12 +6593,12 @@ snapshots: remark-rehype: 11.1.0 remark-stringify: 11.0.0 shiki: 1.24.0 - svelte: 5.33.2 + svelte: 5.33.13 unified: 11.0.4 unist-util-visit: 5.0.0 vfile: 6.0.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) - vite-plugin-inspect: 0.8.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)) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) + vite-plugin-inspect: 0.8.3(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) yaml: 2.7.1 transitivePeerDependencies: - '@nuxt/kit' @@ -6611,13 +6616,13 @@ 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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1)(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.13 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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: @@ -6734,16 +6739,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 +6759,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 +6776,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 +6849,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 +6866,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,27 +6912,27 @@ 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)': dependencies: - debug: 4.4.0 + debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.61.9(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))': + '@unocss/astro@0.61.9(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: '@unocss/core': 0.61.9 '@unocss/reset': 0.61.9 - '@unocss/vite': 0.61.9(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)) + '@unocss/vite': 0.61.9(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) 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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - rollup - supports-color @@ -7051,7 +7071,7 @@ snapshots: dependencies: '@unocss/core': 0.61.9 - '@unocss/vite@0.61.9(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))': + '@unocss/vite@0.61.9(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.0(rollup@2.79.1) @@ -7063,17 +7083,17 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.17 - 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: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - 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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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.1)(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.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)))(svelte@5.33.13)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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) + vite-plugin-pwa: 0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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) '@vitest/expect@3.1.4': dependencies: @@ -7082,13 +7102,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.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))': + '@vitest/mocker@3.1.4(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1))': dependencies: '@vitest/spy': 3.1.4 estree-walker: 3.0.3 magic-string: 0.30.17 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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) '@vitest/pretty-format@3.1.4': dependencies: @@ -7115,16 +7135,10 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 - acorn-jsx@5.3.2(acorn@8.14.1): dependencies: acorn: 8.14.1 - acorn@8.14.0: {} - acorn@8.14.1: {} agent-base@7.1.3: {} @@ -7393,9 +7407,9 @@ snapshots: dependencies: readdirp: 4.0.1 - chromium-bidi@5.1.0(devtools-protocol@0.0.1439962): + chromium-bidi@5.1.0(devtools-protocol@0.0.1452169): dependencies: - devtools-protocol: 0.0.1439962 + devtools-protocol: 0.0.1452169 mitt: 3.0.1 zod: 3.25.34 @@ -7632,7 +7646,7 @@ snapshots: dependencies: dequal: 2.0.3 - devtools-protocol@0.0.1439962: {} + devtools-protocol@0.0.1452169: {} dir-glob@3.0.1: dependencies: @@ -7817,49 +7831,49 @@ 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.1(eslint@9.28.0(jiti@1.21.0))(svelte@5.33.13): 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 postcss: 8.5.3 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) + semver: 7.7.2 + svelte-eslint-parser: 1.2.0(svelte@5.33.13) optionalDependencies: - svelte: 5.33.2 + svelte: 5.33.13 transitivePeerDependencies: - ts-node @@ -7872,15 +7886,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 +7904,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 @@ -7918,8 +7932,8 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 espree@9.6.1: @@ -8270,7 +8284,7 @@ snapshots: importx@0.4.3: dependencies: bundle-require: 5.0.0(esbuild@0.21.5) - debug: 4.4.0 + debug: 4.4.1 esbuild: 0.21.5 jiti: 2.0.0-beta.2 jiti-v1: jiti@1.21.0 @@ -8947,7 +8961,7 @@ snapshots: micromark@4.0.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.1 decode-named-character-reference: 1.0.2 devlop: 1.1.0 micromark-core-commonmark: 2.0.0 @@ -8994,7 +9008,7 @@ snapshots: mlly@1.7.1: dependencies: - acorn: 8.14.0 + acorn: 8.14.1 pathe: 1.1.2 pkg-types: 1.1.3 ufo: 1.5.4 @@ -9204,10 +9218,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.13): dependencies: prettier: 3.5.3 - svelte: 5.33.2 + svelte: 5.33.13 prettier@3.5.3: {} @@ -9249,12 +9263,12 @@ snapshots: punycode@2.3.1: {} - puppeteer-core@24.9.0: + puppeteer-core@24.10.0: dependencies: '@puppeteer/browsers': 2.10.5 - chromium-bidi: 5.1.0(devtools-protocol@0.0.1439962) + chromium-bidi: 5.1.0(devtools-protocol@0.0.1452169) debug: 4.4.1 - devtools-protocol: 0.0.1439962 + devtools-protocol: 0.0.1452169 typed-query-selector: 2.12.0 ws: 8.18.2 transitivePeerDependencies: @@ -9263,13 +9277,13 @@ snapshots: - supports-color - utf-8-validate - puppeteer@24.9.0(typescript@5.8.3): + puppeteer@24.10.0(typescript@5.8.3): dependencies: '@puppeteer/browsers': 2.10.5 - chromium-bidi: 5.1.0(devtools-protocol@0.0.1439962) + chromium-bidi: 5.1.0(devtools-protocol@0.0.1452169) cosmiconfig: 9.0.0(typescript@5.8.3) - devtools-protocol: 0.0.1439962 - puppeteer-core: 24.9.0 + devtools-protocol: 0.0.1452169 + puppeteer-core: 24.10.0 typed-query-selector: 2.12.0 transitivePeerDependencies: - bare-buffer @@ -9497,7 +9511,7 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.89.0: + sass@1.89.1: dependencies: chokidar: 4.0.3 immutable: 5.0.2 @@ -9726,19 +9740,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.13)(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.13 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.13): dependencies: eslint-scope: 8.3.0 eslint-visitor-keys: 4.2.0 @@ -9747,20 +9761,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.13 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.13)(typescript@5.8.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.33.2 + svelte: 5.33.13 typescript: 5.8.3 - svelte@5.33.2: + svelte@5.33.13: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -9934,7 +9948,7 @@ snapshots: typed-query-selector@2.12.0: {} - typedoc-plugin-markdown@4.6.3(typedoc@0.28.5(typescript@5.8.3)): + typedoc-plugin-markdown@4.6.4(typedoc@0.28.5(typescript@5.8.3)): dependencies: typedoc: 0.28.5(typescript@5.8.3) @@ -9947,12 +9961,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: @@ -10047,9 +10061,9 @@ snapshots: universalify@2.0.1: {} - 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)): + 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.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)): dependencies: - '@unocss/astro': 0.61.9(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)) + '@unocss/astro': 0.61.9(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@unocss/cli': 0.61.9(rollup@2.79.1) '@unocss/core': 0.61.9 '@unocss/extractor-arbitrary-variants': 0.61.9 @@ -10068,9 +10082,9 @@ snapshots: '@unocss/transformer-compile-class': 0.61.9 '@unocss/transformer-directives': 0.61.9 '@unocss/transformer-variant-group': 0.61.9 - '@unocss/vite': 0.61.9(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)) + '@unocss/vite': 0.61.9(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) 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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - postcss - rollup @@ -10101,13 +10115,13 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite-node@3.1.4(@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-node@3.1.4(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - 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: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - '@types/node' - jiti @@ -10122,34 +10136,34 @@ snapshots: - tsx - yaml - vite-plugin-inspect@0.8.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)): + vite-plugin-inspect@0.8.3(rollup@2.79.1)(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)): dependencies: '@antfu/utils': 0.7.10 '@rollup/pluginutils': 5.1.0(rollup@2.79.1) - debug: 4.4.0 + debug: 4.4.1 error-stack-parser-es: 0.1.1 fs-extra: 11.2.0 open: 10.0.4 perfect-debounce: 1.0.0 picocolors: 1.1.1 sirv: 2.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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - rollup - supports-color - 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-plugin-pwa@0.19.0(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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: debug: 4.4.1 fast-glob: 3.3.2 pretty-bytes: 6.1.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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(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 transitivePeerDependencies: - supports-color - 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@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1): dependencies: esbuild: 0.25.2 fdir: 6.4.4(picomatch@4.0.2) @@ -10161,18 +10175,18 @@ snapshots: '@types/node': 20.10.8 fsevents: 2.3.3 jiti: 1.21.0 - sass: 1.89.0 + sass: 1.89.1 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)): + vitefu@1.0.4(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)): 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) + vite: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) - vitest-matchmedia-mock@2.0.3(@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): + vitest-matchmedia-mock@2.0.3(@types/debug@4.1.12)(@types/node@20.10.8)(jiti@1.21.0)(jsdom@26.1.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1): dependencies: - 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) + 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.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) transitivePeerDependencies: - '@edge-runtime/vm' - '@types/debug' @@ -10194,10 +10208,10 @@ snapshots: - tsx - yaml - 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): + 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.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1): dependencies: '@vitest/expect': 3.1.4 - '@vitest/mocker': 3.1.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)) + '@vitest/mocker': 3.1.4(vite@6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1)) '@vitest/pretty-format': 3.1.4 '@vitest/runner': 3.1.4 '@vitest/snapshot': 3.1.4 @@ -10214,8 +10228,8 @@ snapshots: tinyglobby: 0.2.13 tinypool: 1.0.2 tinyrainbow: 2.0.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) - vite-node: 3.1.4(@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: 6.3.5(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) + vite-node: 3.1.4(@types/node@20.10.8)(jiti@1.21.0)(sass@1.89.1)(terser@5.26.0)(tsx@4.16.5)(yaml@2.7.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 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/Area.svelte b/src/lib/marks/Area.svelte index f9adda22..0dfa4710 100644 --- a/src/lib/marks/Area.svelte +++ b/src/lib/marks/Area.svelte @@ -29,6 +29,7 @@ import { maybeCurve } from '$lib/helpers/curves.js'; import { isValid } from '$lib/helpers/index.js'; import AreaCanvas from './helpers/AreaCanvas.svelte'; + import Anchor from './helpers/Anchor.svelte'; import type { CurveName, @@ -37,7 +38,6 @@ BaseMarkProps, ConstantAccessor, ChannelAccessor, - FacetContext, ScaledDataRecord, LinkableMarkProps } from '../types.js'; @@ -113,32 +113,24 @@ {:else} {#each grouped as areaData, i (i)} - {#snippet el(datum: ScaledDataRecord)} - {@const title = resolveProp(options.title, datum.datum, '')} - {@const [style, styleClass] = resolveStyles( - plot, - datum, - options, - 'fill', - usedScales - )} - {#if title}{title}{/if} - {/snippet} + {@const datum = areaData[0]} {#if areaData.length > 0} - {#if options.href} - - {@render el(areaData[0])} - - {:else} - {@render el(areaData[0])} - {/if} + + {@const title = resolveProp(options.title, datum.datum, '')} + {@const [style, styleClass] = resolveStyles( + plot, + datum, + options, + 'fill', + usedScales + )} + {#if title}{title}{/if} + {/if} {/each} diff --git a/src/lib/marks/AxisX.svelte b/src/lib/marks/AxisX.svelte index df156afb..d1256c48 100644 --- a/src/lib/marks/AxisX.svelte +++ b/src/lib/marks/AxisX.svelte @@ -25,6 +25,8 @@ tickClass?: ConstantAccessor; /** ticks is a shorthand for defining data, tickCount or interval */ ticks?: number | string | RawValue[]; + /** set to false or null to disable tick labels */ + text: boolean | null; } & XOR< { /** approximate number of ticks to be generated */ @@ -79,6 +81,7 @@ class: className, tickCount = typeof magicTicks === 'number' ? magicTicks : undefined, tickSpacing, + text = true, ...options }: AxisXMarkProps = $props(); @@ -96,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, @@ -220,6 +223,7 @@ {tickPadding} {tickFontSize} {tickClass} + {text} {options} title={useTitle} {plot} /> diff --git a/src/lib/marks/AxisY.svelte b/src/lib/marks/AxisY.svelte index 642747f9..e65703dd 100644 --- a/src/lib/marks/AxisY.svelte +++ b/src/lib/marks/AxisY.svelte @@ -26,6 +26,8 @@ tickClass?: ConstantAccessor; /** ticks is a shorthand for defining data, tickCount or interval */ ticks?: number | string | RawValue[]; + /** set to false or null to disable tick labels */ + text: boolean | null; } & XOR< { /** approximate number of ticks to be generated */ @@ -78,6 +80,7 @@ tickClass, tickCount = typeof magicTicks === 'number' ? magicTicks : undefined, tickSpacing, + text = true, ...options }: AxisYMarkProps = $props(); @@ -200,6 +203,7 @@ {tickFontSize} {tickClass} {options} + {text} title={useTitle} {plot} /> {/if} diff --git a/src/lib/marks/BarX.svelte b/src/lib/marks/BarX.svelte index bb65106f..f87da7e0 100644 --- a/src/lib/marks/BarX.svelte +++ b/src/lib/marks/BarX.svelte @@ -7,10 +7,12 @@ PlotContext, BaseMarkProps, BaseRectMarkProps, - ChannelAccessor + ChannelAccessor, + LinkableMarkProps } from '../types.js'; export type BarXMarkProps = BaseMarkProps & + LinkableMarkProps & BaseRectMarkProps & { data: DataRow[]; x?: ChannelAccessor; diff --git a/src/lib/marks/BarY.svelte b/src/lib/marks/BarY.svelte index b00c8e9a..14a90153 100644 --- a/src/lib/marks/BarY.svelte +++ b/src/lib/marks/BarY.svelte @@ -12,6 +12,7 @@ } from '../types.js'; export type BarYMarkProps = BaseMarkProps & + LinkableMarkProps & BaseRectMarkProps & { data: DataRow[]; x?: ChannelAccessor; diff --git a/src/lib/marks/BrushX.svelte b/src/lib/marks/BrushX.svelte index 9ce89f27..e52a3042 100644 --- a/src/lib/marks/BrushX.svelte +++ b/src/lib/marks/BrushX.svelte @@ -1,4 +1,4 @@ - diff --git a/src/lib/marks/BrushY.svelte b/src/lib/marks/BrushY.svelte index 5fe054f6..e16e45a5 100644 --- a/src/lib/marks/BrushY.svelte +++ b/src/lib/marks/BrushY.svelte @@ -1,4 +1,4 @@ - diff --git a/src/lib/marks/Cell.svelte b/src/lib/marks/Cell.svelte index 60daa848..dfc9f22d 100644 --- a/src/lib/marks/Cell.svelte +++ b/src/lib/marks/Cell.svelte @@ -12,6 +12,7 @@ } from '../types.js'; export type CellMarkProps = BaseMarkProps & + LinkableMarkProps & BaseRectMarkProps & { data: DataRecord[]; x?: ChannelAccessor; 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..2a4019be 100644 --- a/src/lib/marks/Dot.svelte +++ b/src/lib/marks/Dot.svelte @@ -10,7 +10,7 @@ symbol?: ChannelAccessor | Snippet<[number, string]>; canvas?: boolean; dotClass?: ConstantAccessor; - }; + } & LinkableMarkProps; @@ -31,6 +33,7 @@ import GeoCanvas from './helpers/GeoCanvas.svelte'; import { recordize } from '$lib/transforms/recordize.js'; import { GEOJSON_PREFER_STROKE } from '$lib/helpers/index.js'; + import Anchor from './helpers/Anchor.svelte'; const { getPlotState } = getContext('svelteplot'); const plot = $derived(getPlotState()); @@ -68,28 +71,6 @@ channels={['fill', 'stroke', 'opacity', 'fillOpacity', 'strokeOpacity', 'r']} {...args}> {#snippet children({ mark, scaledData, usedScales })} - {#snippet el(d)} - {@const title = resolveProp(args.title, d.datum, '')} - {@const geometry = resolveProp(args.geometry, d.datum, d.datum)} - {@const [style, styleClass] = resolveStyles( - plot, - d, - args, - GEOJSON_PREFER_STROKE.has(geometry.type) ? 'stroke' : 'fill', - usedScales - )} - - {#if title}{title}{/if} - - {/snippet} - {@render el(d)} - - {:else} - {@render el(d)} - {/if} + + {@const title = resolveProp(args.title, d.datum, '')} + {@const geometry = resolveProp(args.geometry, d.datum, d.datum)} + {@const [style, styleClass] = resolveStyles( + plot, + d, + args, + GEOJSON_PREFER_STROKE.has(geometry.type) ? 'stroke' : 'fill', + usedScales + )} + + {#if title}{title}{/if} + + {/if} {/each} {/if} diff --git a/src/lib/marks/Rect.svelte b/src/lib/marks/Rect.svelte index 8a40ac0c..679477e7 100644 --- a/src/lib/marks/Rect.svelte +++ b/src/lib/marks/Rect.svelte @@ -13,6 +13,7 @@ y2?: ChannelAccessor; interval?: number | string; } & BaseMarkProps & + LinkableMarkProps & BaseRectMarkProps; diff --git a/src/lib/marks/Sphere.svelte b/src/lib/marks/Sphere.svelte index 594d06ff..158e5c63 100644 --- a/src/lib/marks/Sphere.svelte +++ b/src/lib/marks/Sphere.svelte @@ -2,8 +2,8 @@ Geo mark with Sphere geometry object --> + +{#if href} + + + {@render children?.()} + +{:else} + {@render children?.()} +{/if} diff --git a/src/lib/marks/helpers/BaseAxisX.svelte b/src/lib/marks/helpers/BaseAxisX.svelte index daa2f33d..c9c22d12 100644 --- a/src/lib/marks/helpers/BaseAxisX.svelte +++ b/src/lib/marks/helpers/BaseAxisX.svelte @@ -33,6 +33,7 @@ dy: ConstantAccessor; filter: ChannelAccessor; }; + text: boolean; plot: PlotState; }; @@ -50,7 +51,8 @@ height, options, plot, - title + title, + text = true }: BaseAxisXProps = $props(); function splitTick(tick: string | string[]) { @@ -86,15 +88,17 @@ }) ); const T = tickObjects.length; - for (let i = 0; i < T; i++) { - let j = i; - // find the preceding tick that was not hidden - do { - j--; - } while (j >= 0 && tickObjects[j].hidden); - if (j >= 0) { - const tickLabelSpace = Math.abs(tickObjects[i].x - tickObjects[j].x); - tickObjects[i].hidden = tickLabelSpace < 15; + if (text) { + for (let i = 0; i < T; i++) { + let j = i; + // find the preceding tick that was not hidden + do { + j--; + } while (j >= 0 && tickObjects[j].hidden); + if (j >= 0) { + const tickLabelSpace = Math.abs(tickObjects[i].x - tickObjects[j].x); + tickObjects[i].hidden = tickLabelSpace < 15; + } } } return tickObjects; @@ -102,6 +106,7 @@ $effect(() => { untrack(() => [$autoMarginTop, $autoMarginBottom]); + if (!text) return; const outsideTextAnchor = anchor === 'top' ? 'end' : 'start'; // measure tick label heights const maxLabelHeight = @@ -144,26 +149,7 @@ {#each positionedTicks as tick, t (t)} {#if testFilter(tick.value, options) && !tick.hidden} - {@const textLines = tick.text} - {@const prevTextLines = t && positionedTicks[t - 1].text} - {@const fontSize = resolveProp(tickFontSize, tick)} {@const tickClass_ = resolveProp(tickClass, tick.value)} - {@const estLabelWidth = max(textLines.map((t) => t.length)) * fontSize * 0.2} - {@const moveDown = - (tickSize + tickPadding + (tickRotate !== 0 ? tickFontSize * 0.35 : 0)) * - (anchor === 'bottom' ? 1 : -1)} - {@const [textStyle, textClass] = resolveStyles( - plot, - tick, - { - fontVariant: isQuantitative ? 'tabular-nums' : 'normal', - ...options, - fontSize: tickFontSize, - stroke: null - }, - 'fill', - { x: true } - )} {/if} - - {#if ticks.length > 0 || t === 0 || t === ticks.length - 1} - {#if textLines.length === 1} - {textLines[0]} - {:else} - {#each textLines as line, i (i)} - {!prevTextLines || prevTextLines[i] !== line - ? line - : ''} - {/each} + {#if text} + {@const textLines = tick.text} + {@const prevTextLines = t && positionedTicks[t - 1].text} + + {@const moveDown = + (tickSize + tickPadding + (tickRotate !== 0 ? tickFontSize * 0.35 : 0)) * + (anchor === 'bottom' ? 1 : -1)} + {@const [textStyle, textClass] = resolveStyles( + plot, + tick, + { + fontVariant: isQuantitative ? 'tabular-nums' : 'normal', + ...options, + fontSize: tickFontSize, + stroke: null + }, + 'fill', + { x: true } + )} + + {#if ticks.length > 0 || t === 0 || t === ticks.length - 1} + {#if textLines.length === 1} + {textLines[0]} + {:else} + {#each textLines as line, i (i)} + {!prevTextLines || prevTextLines[i] !== line + ? line + : ''} + {/each} + {/if} {/if} - {/if} - + + {/if} {/if} {/each} diff --git a/src/lib/marks/helpers/BaseAxisY.svelte b/src/lib/marks/helpers/BaseAxisY.svelte index 119bef86..5f045fd8 100644 --- a/src/lib/marks/helpers/BaseAxisY.svelte +++ b/src/lib/marks/helpers/BaseAxisY.svelte @@ -29,6 +29,7 @@ dy: ConstantAccessor; }; plot: PlotState; + text: boolean | null; }; let { @@ -46,7 +47,8 @@ width, title, plot, - options + options, + text = true }: BaseAxisYProps = $props(); const LINE_ANCHOR = { @@ -67,16 +69,18 @@ element: null as SVGTextElement | null }; }); - const T = tickObjects.length; - for (let i = 0; i < T; i++) { - let j = i; - // find the preceding tick that was not hidden - do { - j--; - } while (j >= 0 && tickObjects[j].hidden); - if (j >= 0) { - const tickLabelSpace = Math.abs(tickObjects[i].y - tickObjects[j].y); - tickObjects[i].hidden = tickLabelSpace < 15; + if (text) { + const T = tickObjects.length; + for (let i = 0; i < T; i++) { + let j = i; + // find the preceding tick that was not hidden + do { + j--; + } while (j >= 0 && tickObjects[j].hidden); + if (j >= 0) { + const tickLabelSpace = Math.abs(tickObjects[i].y - tickObjects[j].y); + tickObjects[i].hidden = tickLabelSpace < 15; + } } } return tickObjects; @@ -176,13 +180,15 @@ class={tickLineClass} x2={anchor === 'left' ? -tickSize : tickSize} /> {/if} - {Array.isArray(tick.text) ? tick.text.join(' ') : tick.text} + {#if text} + {Array.isArray(tick.text) ? tick.text.join(' ') : tick.text} + {/if} {/if} {/each} diff --git a/src/lib/marks/helpers/RectPath.svelte b/src/lib/marks/helpers/RectPath.svelte index 0b35cc65..0fe258ee 100644 --- a/src/lib/marks/helpers/RectPath.svelte +++ b/src/lib/marks/helpers/RectPath.svelte @@ -14,6 +14,7 @@ Helper component for rendering rectangular marks in SVG } from 'svelteplot/types'; import { addEventHandlers } from './events'; import { getContext } from 'svelte'; + import Anchor from './Anchor.svelte'; let { datum, @@ -101,33 +102,35 @@ Helper component for rendering rectangular marks in SVG ); -{#if hasBorderRadius} - -{:else} - -{/if} + + {#if hasBorderRadius} + + {:else} + + {/if} + diff --git a/src/lib/marks/helpers/Regression.svelte b/src/lib/marks/helpers/Regression.svelte index 19f6ae8a..80b8224b 100644 --- a/src/lib/marks/helpers/Regression.svelte +++ b/src/lib/marks/helpers/Regression.svelte @@ -123,7 +123,7 @@ ); let confBandGen = $derived( - confidence !== false + confidence !== false && regression.predict ? confidenceInterval( data .map((d) => ({ 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..e2a58fb9 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]; @@ -634,15 +634,31 @@ export type FacetContext = { export type LinkableMarkProps = { /** - * simple browser tooltip to be displayed on mouseover + * if set, the mark element will be wrapped in a link element */ - title: ConstantAccessor; + href: ConstantAccessor; /** - * if set, the mark element will be wrapped in a link - * element + * the relationship of the target object to the link object (e.g. "noopener") + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#rel */ - href: ConstantAccessor; - target: ConstantAccessor<'_self' | '_blank' | string>; + rel: ConstantAccessor; + /** + * the link target mime type, e.g. "text/csv" + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#type + */ + type: ConstantAccessor; + /** + * the target of the link, e.g. "_blank" or "_self" + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/a#target + */ + target: ConstantAccessor<'_self' | '_blank' | '_parent' | '_top' | string>; + /** + * if set to true, the link will be downloaded instead of navigating to it + * @see https://developer.mozilla.org/en-US/docs/Web/HTML/Element/a#download + */ + download: ConstantAccessor; + // allow data-sveltekit-* attributes on the link element, e.g. data-sveltekit-reload + [key: `data-sveltekit-${string}`]: string | boolean; }; export type BaseMarkProps = Partial<{ @@ -657,6 +673,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 +757,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..5fa96da7 100644 --- a/src/routes/examples/+layout.ts +++ b/src/routes/examples/+layout.ts @@ -1,21 +1,25 @@ 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'), us: await loadJSON(fetch, 'us-counties-10m'), + earthquakes: await loadJSON(fetch, 'earthquakes'), ...(await loadDatasets( [ 'aapl', + 'alphabet', 'beagle', 'bls', + 'cars', 'co2', 'crimea', 'driving', + 'languages', 'penguins', 'riaa', 'stateage', diff --git a/src/routes/examples/+page.svelte b/src/routes/examples/+page.svelte index 48d0e854..160b6564 100644 --- a/src/routes/examples/+page.svelte +++ b/src/routes/examples/+page.svelte @@ -9,7 +9,9 @@ 'line/gradient-line', 'dot/1-colored-scatterplot', 'geo/us-choropleth', - 'axis/datawrapper-ticks' + 'axis/datawrapper-ticks', + 'geo/earthquakes', + 'regression/grouped' ]; diff --git a/src/routes/examples/axis/major-minor.svelte b/src/routes/examples/axis/major-minor.svelte new file mode 100644 index 00000000..2c04a0bf --- /dev/null +++ b/src/routes/examples/axis/major-minor.svelte @@ -0,0 +1,19 @@ + + + + + + + + + + + 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/linked-bars.svelte b/src/routes/examples/bar/linked-bars.svelte new file mode 100644 index 00000000..327a2cfb --- /dev/null +++ b/src/routes/examples/bar/linked-bars.svelte @@ -0,0 +1,36 @@ + + + + + + + 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/routes/examples/geo/earthquakes.svelte b/src/routes/examples/geo/earthquakes.svelte new file mode 100644 index 00000000..8cb7b9ff --- /dev/null +++ b/src/routes/examples/geo/earthquakes.svelte @@ -0,0 +1,41 @@ + + + + + + + + + d.properties.title} + href={(d) => d.properties.url} + r={(d) => Math.pow(10, d.properties.mag)} /> + diff --git a/src/routes/examples/regression/_index.svelte b/src/routes/examples/regression/_index.svelte new file mode 100644 index 00000000..409a34f3 --- /dev/null +++ b/src/routes/examples/regression/_index.svelte @@ -0,0 +1,5 @@ + + +

Regression examples

diff --git a/src/routes/examples/regression/cars.svelte b/src/routes/examples/regression/cars.svelte new file mode 100644 index 00000000..72276325 --- /dev/null +++ b/src/routes/examples/regression/cars.svelte @@ -0,0 +1,50 @@ + + + + + `${d * 100}%`} + options={[0.8, 0.9, 0.95, 0.99, 0.999, 0.9999]} /> + + + + + diff --git a/src/routes/examples/regression/faceted.svelte b/src/routes/examples/regression/faceted.svelte new file mode 100644 index 00000000..69ca1a8f --- /dev/null +++ b/src/routes/examples/regression/faceted.svelte @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/src/routes/examples/regression/grouped.svelte b/src/routes/examples/regression/grouped.svelte new file mode 100644 index 00000000..864e211a --- /dev/null +++ b/src/routes/examples/regression/grouped.svelte @@ -0,0 +1,29 @@ + + + + + + + + + diff --git a/src/routes/examples/regression/loess.svelte b/src/routes/examples/regression/loess.svelte new file mode 100644 index 00000000..609c3702 --- /dev/null +++ b/src/routes/examples/regression/loess.svelte @@ -0,0 +1,36 @@ + + + + + + + + + + diff --git a/src/routes/examples/regression/log.svelte b/src/routes/examples/regression/log.svelte new file mode 100644 index 00000000..fc26f1ef --- /dev/null +++ b/src/routes/examples/regression/log.svelte @@ -0,0 +1,26 @@ + + + + + + + + diff --git a/src/routes/features/plot/+page.md b/src/routes/features/plot/+page.md index dbdaafbc..936add59 100644 --- a/src/routes/features/plot/+page.md +++ b/src/routes/features/plot/+page.md @@ -314,7 +314,7 @@ to add events and scoped styles. {#snippet footer()}

Centered headline below plot with - alert('works')} + alert('works')} >custom link

{/snippet} diff --git a/src/routes/features/projections/+page.md b/src/routes/features/projections/+page.md index 2f480e5f..300fd117 100644 --- a/src/routes/features/projections/+page.md +++ b/src/routes/features/projections/+page.md @@ -67,7 +67,7 @@ title: Projections {options} label="Projection" /> diff --git a/src/tests/axisX.test.ts b/src/tests/axisX.test.ts index ab174fed..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', () => { @@ -153,4 +154,64 @@ describe('AxisX mark', () => { expect(ticks.length).toBe(5); expect(tickValues).toStrictEqual(['Jan2000', 'Jul', 'Jan2001', 'Jul', 'Jan2002']); }); + + it('disable tick texts', () => { + const { container } = render(AxisXTest, { + props: { + plotArgs: { + width: 400, + x: { domain: [new Date(2000, 0, 1), new Date(2002, 0, 1)] } + }, + axisArgs: { ticks: '1 month', text: null } + } + }); + + const ticks = container.querySelectorAll('g.axis-x > g.tick') as NodeListOf; + const tickLines = container.querySelectorAll( + 'g.axis-x > g.tick line' + ) as NodeListOf; + const tickLabels = container.querySelectorAll( + 'g.axis-x > g.tick text' + ) as NodeListOf; + expect(ticks.length).toBe(25); + 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/axis/major-minor.dark.png b/static/examples/axis/major-minor.dark.png new file mode 100644 index 00000000..bd510653 Binary files /dev/null and b/static/examples/axis/major-minor.dark.png differ diff --git a/static/examples/axis/major-minor.png b/static/examples/axis/major-minor.png new file mode 100644 index 00000000..6142b110 Binary files /dev/null and b/static/examples/axis/major-minor.png differ diff --git a/static/examples/axis/tick-spacing.dark.png b/static/examples/axis/tick-spacing.dark.png index e451e2de..6c76ebc9 100644 Binary files a/static/examples/axis/tick-spacing.dark.png and b/static/examples/axis/tick-spacing.dark.png differ diff --git a/static/examples/axis/tick-spacing.png b/static/examples/axis/tick-spacing.png index bea52550..9d13a011 100644 Binary files a/static/examples/axis/tick-spacing.png and b/static/examples/axis/tick-spacing.png differ diff --git a/static/examples/bar/linked-bars.dark.png b/static/examples/bar/linked-bars.dark.png new file mode 100644 index 00000000..dd75f024 Binary files /dev/null and b/static/examples/bar/linked-bars.dark.png differ diff --git a/static/examples/bar/linked-bars.png b/static/examples/bar/linked-bars.png new file mode 100644 index 00000000..866dacc6 Binary files /dev/null and b/static/examples/bar/linked-bars.png differ 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/2-symbol-channel.dark.png b/static/examples/dot/2-symbol-channel.dark.png new file mode 100644 index 00000000..5815684d Binary files /dev/null and b/static/examples/dot/2-symbol-channel.dark.png differ diff --git a/static/examples/dot/2-symbol-channel.png b/static/examples/dot/2-symbol-channel.png new file mode 100644 index 00000000..7c7aa271 Binary files /dev/null and b/static/examples/dot/2-symbol-channel.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/earthquakes.dark.png b/static/examples/geo/earthquakes.dark.png new file mode 100644 index 00000000..9871bb50 Binary files /dev/null and b/static/examples/geo/earthquakes.dark.png differ diff --git a/static/examples/geo/earthquakes.png b/static/examples/geo/earthquakes.png new file mode 100644 index 00000000..e5dbf6a6 Binary files /dev/null and b/static/examples/geo/earthquakes.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 diff --git a/static/examples/regression/cars.dark.png b/static/examples/regression/cars.dark.png new file mode 100644 index 00000000..edab8608 Binary files /dev/null and b/static/examples/regression/cars.dark.png differ diff --git a/static/examples/regression/cars.png b/static/examples/regression/cars.png new file mode 100644 index 00000000..878c3938 Binary files /dev/null and b/static/examples/regression/cars.png differ diff --git a/static/examples/regression/faceted.dark.png b/static/examples/regression/faceted.dark.png new file mode 100644 index 00000000..66e7b1ff Binary files /dev/null and b/static/examples/regression/faceted.dark.png differ diff --git a/static/examples/regression/faceted.png b/static/examples/regression/faceted.png new file mode 100644 index 00000000..729e2c77 Binary files /dev/null and b/static/examples/regression/faceted.png differ diff --git a/static/examples/regression/grouped.dark.png b/static/examples/regression/grouped.dark.png new file mode 100644 index 00000000..1686d1d7 Binary files /dev/null and b/static/examples/regression/grouped.dark.png differ diff --git a/static/examples/regression/grouped.png b/static/examples/regression/grouped.png new file mode 100644 index 00000000..3a8460b9 Binary files /dev/null and b/static/examples/regression/grouped.png differ diff --git a/static/examples/regression/loess.dark.png b/static/examples/regression/loess.dark.png new file mode 100644 index 00000000..418f6ddf Binary files /dev/null and b/static/examples/regression/loess.dark.png differ diff --git a/static/examples/regression/loess.png b/static/examples/regression/loess.png new file mode 100644 index 00000000..4394992c Binary files /dev/null and b/static/examples/regression/loess.png differ diff --git a/static/examples/regression/log.dark.png b/static/examples/regression/log.dark.png new file mode 100644 index 00000000..3bbf5dd5 Binary files /dev/null and b/static/examples/regression/log.dark.png differ diff --git a/static/examples/regression/log.png b/static/examples/regression/log.png new file mode 100644 index 00000000..fb7e017b Binary files /dev/null and b/static/examples/regression/log.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