From ca490e2a4d272176b79b694c0aa9b9de3f5271e8 Mon Sep 17 00:00:00 2001 From: pearmini Date: Sun, 8 Jun 2025 18:20:07 -0400 Subject: [PATCH 1/4] Add charming-dom --- .prettierignore | 1 + package.json | 10 +- pnpm-lock.yaml | 1209 +++++++++++----------- src/dom.js | 65 ++ src/index.js | 5 +- src/mark.js | 264 ----- src/math.js | 3 - src/renderer.js | 26 - src/set.js | 80 -- src/state.js | 32 - test/apps/circle.js | 5 - test/apps/circleClick.js | 22 - test/apps/circleMoving.js | 21 - test/apps/circles.js | 18 - test/apps/circlesMoving.js | 26 - test/apps/groupCircles.js | 24 - test/apps/groupNested.js | 16 - test/apps/index.js | 8 - test/apps/textState.js | 31 - test/dom.spec.js | 18 + test/index.html | 76 -- test/mark.spec.js | 47 - test/output/circle.svg | 3 - test/output/circleClick.svg | 3 - test/output/circles.svg | 7 - test/output/cloneDataDrivenChildren.html | 26 + test/output/fragmentRoot.html | 17 + test/output/groupCircles.svg | 52 - test/output/groupNested.svg | 7 - test/output/htmlAttributes.html | 13 + test/output/setAttributes.html | 4 + test/output/setChildren.html | 6 + test/output/setDataDrivenAttributes.html | 20 + test/output/setDataDrivenChildren.html | 26 + test/output/setDirectAttributes.html | 3 + test/output/setFalsyChildren.html | 6 + test/output/setFunctionAttributes.html | 4 + test/output/setFunctionChildren.html | 6 + test/output/setInnerHTML.html | 7 + test/output/setKebabCaseAttributes.html | 4 + test/output/setSnakeCaseAttributes.html | 4 + test/output/setStyle.html | 3 + test/output/setTextContent.html | 3 + test/output/strictNull.html | 1 + test/output/strictString.html | 1 + test/renderer.spec.js | 24 - test/snapshot.spec.js | 63 +- test/snapshots.js | 137 +++ test/svg.spec.js | 113 -- vite.config.js | 1 - 50 files changed, 999 insertions(+), 1572 deletions(-) create mode 100644 .prettierignore create mode 100644 src/dom.js delete mode 100644 src/mark.js delete mode 100644 src/math.js delete mode 100644 src/renderer.js delete mode 100644 src/set.js delete mode 100644 src/state.js delete mode 100644 test/apps/circle.js delete mode 100644 test/apps/circleClick.js delete mode 100644 test/apps/circleMoving.js delete mode 100644 test/apps/circles.js delete mode 100644 test/apps/circlesMoving.js delete mode 100644 test/apps/groupCircles.js delete mode 100644 test/apps/groupNested.js delete mode 100644 test/apps/index.js delete mode 100644 test/apps/textState.js create mode 100644 test/dom.spec.js delete mode 100644 test/index.html delete mode 100644 test/mark.spec.js delete mode 100644 test/output/circle.svg delete mode 100644 test/output/circleClick.svg delete mode 100644 test/output/circles.svg create mode 100644 test/output/cloneDataDrivenChildren.html create mode 100644 test/output/fragmentRoot.html delete mode 100644 test/output/groupCircles.svg delete mode 100644 test/output/groupNested.svg create mode 100644 test/output/htmlAttributes.html create mode 100644 test/output/setAttributes.html create mode 100644 test/output/setChildren.html create mode 100644 test/output/setDataDrivenAttributes.html create mode 100644 test/output/setDataDrivenChildren.html create mode 100644 test/output/setDirectAttributes.html create mode 100644 test/output/setFalsyChildren.html create mode 100644 test/output/setFunctionAttributes.html create mode 100644 test/output/setFunctionChildren.html create mode 100644 test/output/setInnerHTML.html create mode 100644 test/output/setKebabCaseAttributes.html create mode 100644 test/output/setSnakeCaseAttributes.html create mode 100644 test/output/setStyle.html create mode 100644 test/output/setTextContent.html create mode 100644 test/output/strictNull.html create mode 100644 test/output/strictString.html delete mode 100644 test/renderer.spec.js create mode 100644 test/snapshots.js delete mode 100644 test/svg.spec.js diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..96dab5c0 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +test/output \ No newline at end of file diff --git a/package.json b/package.json index d83680a6..7fb23985 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ ], "scripts": { "dev": "vite", + "update": "vitest --update", "test": "npm run test:js && npm run test:lint && npm run test:format", "test:js": "vitest", "test:lint": "eslint src test", @@ -32,8 +33,7 @@ "prepublishOnly": "rm -rf dist && rollup -c" }, "dependencies": { - "charmingjs-vector": "^0.0.3", - "d3-timer": "^3.0.1" + "charmingjs-vector": "^0.0.3" }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.3.1", @@ -46,10 +46,10 @@ "js-beautify": "^1.15.4", "jsdom": "^26.1.0", "prettier": "^3.5.3", - "rollup": "^4.40.0", - "vite": "^6.3.3", + "rollup": "^4.42.0", + "vite": "^6.3.5", "vitepress": "^1.6.3", - "vitest": "^3.1.2" + "vitest": "^3.2.2" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fceeb9a7..4a525bd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,16 +11,13 @@ importers: charmingjs-vector: specifier: ^0.0.3 version: 0.0.3 - d3-timer: - specifier: ^3.0.1 - version: 3.0.1 devDependencies: '@rollup/plugin-node-resolve': specifier: ^15.3.1 - version: 15.3.1(rollup@4.40.0) + version: 15.3.1(rollup@4.42.0) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.40.0) + version: 0.4.4(rollup@4.42.0) d3-selection: specifier: ^3.0.0 version: 3.0.0 @@ -35,7 +32,7 @@ importers: version: 9.1.0(eslint@8.57.1) genji-theme-vitepress: specifier: ^0.2.8 - version: 0.2.8(vitepress@1.6.3(@algolia/client-search@5.23.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0))(vue@3.5.13) + version: 0.2.8(vitepress@1.6.3(@algolia/client-search@5.27.0)(postcss@8.5.4)(search-insights@2.17.2)(terser@5.41.0))(vue@3.5.16) js-beautify: specifier: ^1.15.4 version: 1.15.4 @@ -46,17 +43,17 @@ importers: specifier: ^3.5.3 version: 3.5.3 rollup: - specifier: ^4.40.0 - version: 4.40.0 + specifier: ^4.42.0 + version: 4.42.0 vite: - specifier: ^6.3.3 - version: 6.3.3(terser@5.39.0) + specifier: ^6.3.5 + version: 6.3.5(terser@5.41.0) vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.23.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0) + version: 1.6.3(@algolia/client-search@5.27.0)(postcss@8.5.4)(search-insights@2.17.2)(terser@5.41.0) vitest: - specifier: ^3.1.2 - version: 3.1.2(jsdom@26.1.0)(terser@5.39.0) + specifier: ^3.2.2 + version: 3.2.2(jsdom@26.1.0)(terser@5.41.0) packages: @@ -80,104 +77,104 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.23.4': - resolution: {integrity: sha512-WIMT2Kxy+FFWXWQxIU8QgbTioL+SGE24zhpj0kipG4uQbzXwONaWt7ffaYLjfge3gcGSgJVv+1VlahVckafluQ==} + '@algolia/client-abtesting@5.27.0': + resolution: {integrity: sha512-SITU5umoknxETtw67TxJu9njyMkWiH8pM+Bvw4dzfuIrIAT6Y1rmwV4y0A0didWoT+6xVuammIykbtBMolBcmg==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.23.4': - resolution: {integrity: sha512-4B9gChENsQA9kFmFlb+x3YhBz2Gx3vSsm81FHI1yJ3fn2zlxREHmfrjyqYoMunsU7BybT/o5Nb7ccCbm/vfseA==} + '@algolia/client-analytics@5.27.0': + resolution: {integrity: sha512-go1b9qIZK5vYEQ7jD2bsfhhhVsoh9cFxQ5xF8TzTsg2WOCZR3O92oXCkq15SOK0ngJfqDU6a/k0oZ4KuEnih1Q==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.23.4': - resolution: {integrity: sha512-bsj0lwU2ytiWLtl7sPunr+oLe+0YJql9FozJln5BnIiqfKOaseSDdV42060vUy+D4373f2XBI009K/rm2IXYMA==} + '@algolia/client-common@5.27.0': + resolution: {integrity: sha512-tnFOzdNuMzsz93kOClj3fKfuYoF3oYaEB5bggULSj075GJ7HUNedBEm7a6ScrjtnOaOtipbnT7veUpHA4o4wEQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.23.4': - resolution: {integrity: sha512-XSCtAYvJ/hnfDHfRVMbBH0dayR+2ofVZy3jf5qyifjguC6rwxDsSdQvXpT0QFVyG+h8UPGtDhMPoUIng4wIcZA==} + '@algolia/client-insights@5.27.0': + resolution: {integrity: sha512-y1qgw39qZijjQBXrqZTiwK1cWgWGRiLpJNWBv9w36nVMKfl9kInrfsYmdBAfmlhVgF/+Woe0y1jQ7pa4HyShAw==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.23.4': - resolution: {integrity: sha512-l/0QvqgRFFOf7BnKSJ3myd1WbDr86ftVaa3PQwlsNh7IpIHmvVcT83Bi5zlORozVGMwaKfyPZo6O48PZELsOeA==} + '@algolia/client-personalization@5.27.0': + resolution: {integrity: sha512-XluG9qPZKEbiLoIfXTKbABsWDNOMPx0t6T2ImJTTeuX+U/zBdmfcqqgcgkqXp+vbXof/XX/4of9Eqo1JaqEmKw==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.23.4': - resolution: {integrity: sha512-TB0htrDgVacVGtPDyENoM6VIeYqR+pMsDovW94dfi2JoaRxfqu/tYmLpvgWcOknP6wLbr8bA+G7t/NiGksNAwQ==} + '@algolia/client-query-suggestions@5.27.0': + resolution: {integrity: sha512-V8/To+SsAl2sdw2AAjeLJuCW1L+xpz+LAGerJK7HKqHzE5yQhWmIWZTzqYQcojkii4iBMYn0y3+uReWqT8XVSQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.23.4': - resolution: {integrity: sha512-uBGo6KwUP6z+u6HZWRui8UJClS7fgUIAiYd1prUqCbkzDiCngTOzxaJbEvrdkK0hGCQtnPDiuNhC5MhtVNN4Eg==} + '@algolia/client-search@5.27.0': + resolution: {integrity: sha512-EJJ7WmvmUXZdchueKFCK8UZFyLqy4Hz64snNp0cTc7c0MKaSeDGYEDxVsIJKp15r7ORaoGxSyS4y6BGZMXYuCg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.23.4': - resolution: {integrity: sha512-Si6rFuGnSeEUPU9QchYvbknvEIyCRK7nkeaPVQdZpABU7m4V/tsiWdHmjVodtx3h20VZivJdHeQO9XbHxBOcCw==} + '@algolia/ingestion@1.27.0': + resolution: {integrity: sha512-xNCyWeqpmEo4EdmpG57Fs1fJIQcPwt5NnJ6MBdXnUdMVXF4f5PHgza+HQWQQcYpCsune96jfmR0v7us6gRIlCw==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.23.4': - resolution: {integrity: sha512-EXGoVVTshraqPJgr5cMd1fq7Jm71Ew6MpGCEaxI5PErBpJAmKdtjRIzs6JOGKHRaWLi+jdbJPYc2y8RN4qcx5Q==} + '@algolia/monitoring@1.27.0': + resolution: {integrity: sha512-P0NDiEFyt9UYQLBI0IQocIT7xHpjMpoFN3UDeerbztlkH9HdqT0GGh1SHYmNWpbMWIGWhSJTtz6kSIWvFu4+pw==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.23.4': - resolution: {integrity: sha512-1t6glwKVCkjvBNlng2itTf8fwaLSqkL4JaMENgR3WTGR8mmW2akocUy/ZYSQcG4TcR7qu4zW2UMGAwLoWoflgQ==} + '@algolia/recommend@5.27.0': + resolution: {integrity: sha512-cqfTMF1d1cc7hg0vITNAFxJZas7MJ4Obc36WwkKpY23NOtGb+4tH9X7UKlQa2PmTgbXIANoJ/DAQTeiVlD2I4Q==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.23.4': - resolution: {integrity: sha512-UUuizcgc5+VSY8hqzDFVdJ3Wcto03lpbFRGPgW12pHTlUQHUTADtIpIhkLLOZRCjXmCVhtr97Z+eR6LcRYXa3Q==} + '@algolia/requester-browser-xhr@5.27.0': + resolution: {integrity: sha512-ErenYTcXl16wYXtf0pxLl9KLVxIztuehqXHfW9nNsD8mz9OX42HbXuPzT7y6JcPiWJpc/UU/LY5wBTB65vsEUg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.23.4': - resolution: {integrity: sha512-UhDg6elsek6NnV5z4VG1qMwR6vbp+rTMBEnl/v4hUyXQazU+CNdYkl++cpdmLwGI/7nXc28xtZiL90Es3I7viQ==} + '@algolia/requester-fetch@5.27.0': + resolution: {integrity: sha512-CNOvmXsVi+IvT7z1d+6X7FveVkgEQwTNgipjQCHTIbF9KSMfZR7tUsJC+NpELrm10ALdOMauah84ybs9rw1cKQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.23.4': - resolution: {integrity: sha512-jXGzGBRUS0oywQwnaCA6mMDJO7LoC3dYSLsyNfIqxDR4SNGLhtg3je0Y31lc24OA4nYyKAYgVLtjfrpcpsWShg==} + '@algolia/requester-node-http@5.27.0': + resolution: {integrity: sha512-Nx9EdLYZDsaYFTthqmc0XcVvsx6jqeEX8fNiYOB5i2HboQwl8pJPj1jFhGqoGd0KG7KFR+sdPO5/e0EDDAru2Q==} engines: {node: '>= 14.0.0'} - '@asamuzakjp/css-color@3.1.4': - resolution: {integrity: sha512-SeuBV4rnjpFNjI8HSgKUwteuFdkHwkboq31HWzznuqgySQir+jSTczoWVVL4jvOjKjuH80fMDG0Fvg1Sb+OJsA==} + '@asamuzakjp/css-color@3.2.0': + resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.27.5': + resolution: {integrity: sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.27.6': + resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} - '@csstools/css-calc@2.1.3': - resolution: {integrity: sha512-XBG3talrhid44BY1x3MHzUx/aTG8+x/Zi57M4aTKK9RFB4aLlF3TTSzfzn8nWVHWL3FgAXAxmupmDd6VWww+pw==} + '@csstools/css-calc@2.1.4': + resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-color-parser@3.0.9': - resolution: {integrity: sha512-wILs5Zk7BU86UArYBJTPy/FMPPKVKHMj1ycCEyf3VUptol0JNRLFU/BZsJ4aiIHJEbSLiizzRrw8Pc1uAEDrXw==} + '@csstools/css-color-parser@3.0.10': + resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-parser-algorithms': ^3.0.5 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + '@csstools/css-parser-algorithms@3.0.5': + resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} engines: {node: '>=18'} peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 + '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + '@csstools/css-tokenizer@3.0.4': + resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} '@docsearch/css@3.8.2': @@ -209,8 +206,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.3': - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -221,8 +218,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.3': - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -233,8 +230,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.3': - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -245,8 +242,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.3': - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -257,8 +254,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.3': - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -269,8 +266,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.3': - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -281,8 +278,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.3': - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -293,8 +290,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.3': - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -305,8 +302,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.3': - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -317,8 +314,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.3': - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -329,8 +326,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.3': - resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -341,8 +338,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.3': - resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -353,8 +350,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.3': - resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -365,8 +362,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.3': - resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -377,8 +374,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.3': - resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -389,8 +386,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.3': - resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -401,14 +398,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.3': - resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.3': - resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -419,14 +416,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.3': - resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.3': - resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -437,8 +434,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.3': - resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -449,8 +446,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.3': - resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -461,8 +458,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.3': - resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -473,8 +470,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.3': - resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -485,14 +482,14 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.3': - resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -522,8 +519,8 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - '@iconify-json/simple-icons@1.2.33': - resolution: {integrity: sha512-nL5/UmI9x5PQ/AHv6bOaL2pH6twEdEz4pI89efB/K7HFn5etQnxMtGx9DFlOg/sRA2/yFpX8KXvc95CSDv5bJA==} + '@iconify-json/simple-icons@1.2.38': + resolution: {integrity: sha512-mvMeFQgVjoHanQE9Q7ihmriEXAorjLZW+crUgQspDjFpzWuQp2RZMTppl1MN6TQztMVTsNFgF6LDKsp+v1RYRg==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} @@ -606,103 +603,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + '@rollup/rollup-android-arm-eabi@4.42.0': + resolution: {integrity: sha512-gldmAyS9hpj+H6LpRNlcjQWbuKUtb94lodB9uCz71Jm+7BxK1VIOo7y62tZZwxhA7j1ylv/yQz080L5WkS+LoQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.42.0': + resolution: {integrity: sha512-bpRipfTgmGFdCZDFLRvIkSNO1/3RGS74aWkJJTFJBH7h3MRV4UijkaEUeOMbi9wxtxYmtAbVcnMtHTPBhLEkaw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.42.0': + resolution: {integrity: sha512-JxHtA081izPBVCHLKnl6GEA0w3920mlJPLh89NojpU2GsBSB6ypu4erFg/Wx1qbpUbepn0jY4dVWMGZM8gplgA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.42.0': + resolution: {integrity: sha512-rv5UZaWVIJTDMyQ3dCEK+m0SAn6G7H3PRc2AZmExvbDvtaDc+qXkei0knQWcI3+c9tEs7iL/4I4pTQoPbNL2SA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.42.0': + resolution: {integrity: sha512-fJcN4uSGPWdpVmvLuMtALUFwCHgb2XiQjuECkHT3lWLZhSQ3MBQ9pq+WoWeJq2PrNxr9rPM1Qx+IjyGj8/c6zQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.42.0': + resolution: {integrity: sha512-CziHfyzpp8hJpCVE/ZdTizw58gr+m7Y2Xq5VOuCSrZR++th2xWAz4Nqk52MoIIrV3JHtVBhbBsJcAxs6NammOQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': + resolution: {integrity: sha512-UsQD5fyLWm2Fe5CDM7VPYAo+UC7+2Px4Y+N3AcPh/LdZu23YcuGPegQly++XEVaC8XUTFVPscl5y5Cl1twEI4A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + '@rollup/rollup-linux-arm-musleabihf@4.42.0': + resolution: {integrity: sha512-/i8NIrlgc/+4n1lnoWl1zgH7Uo0XK5xK3EDqVTf38KvyYgCU/Rm04+o1VvvzJZnVS5/cWSd07owkzcVasgfIkQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.42.0': + resolution: {integrity: sha512-eoujJFOvoIBjZEi9hJnXAbWg+Vo1Ov8n/0IKZZcPZ7JhBzxh2A+2NFyeMZIRkY9iwBvSjloKgcvnjTbGKHE44Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.42.0': + resolution: {integrity: sha512-/3NrcOWFSR7RQUQIuZQChLND36aTU9IYE4j+TB40VU78S+RA0IiqHR30oSh6P1S9f9/wVOenHQnacs/Byb824g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': + resolution: {integrity: sha512-O8AplvIeavK5ABmZlKBq9/STdZlnQo7Sle0LLhVA7QT+CiGpNVe197/t8Aph9bhJqbDVGCHpY2i7QyfEDDStDg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': + resolution: {integrity: sha512-6Qb66tbKVN7VyQrekhEzbHRxXXFFD8QKiFAwX5v9Xt6FiJ3BnCVBuyBxa2fkFGqxOCSGGYNejxd8ht+q5SnmtA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + '@rollup/rollup-linux-riscv64-gnu@4.42.0': + resolution: {integrity: sha512-KQETDSEBamQFvg/d8jajtRwLNBlGc3aKpaGiP/LvEbnmVUKlFta1vqJqTrvPtsYsfbE/DLg5CC9zyXRX3fnBiA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + '@rollup/rollup-linux-riscv64-musl@4.42.0': + resolution: {integrity: sha512-qMvnyjcU37sCo/tuC+JqeDKSuukGAd+pVlRl/oyDbkvPJ3awk6G6ua7tyum02O3lI+fio+eM5wsVd66X0jQtxw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.42.0': + resolution: {integrity: sha512-I2Y1ZUgTgU2RLddUHXTIgyrdOwljjkmcZ/VilvaEumtS3Fkuhbw4p4hgHc39Ypwvo2o7sBFNl2MquNvGCa55Iw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + '@rollup/rollup-linux-x64-gnu@4.42.0': + resolution: {integrity: sha512-Gfm6cV6mj3hCUY8TqWa63DB8Mx3NADoFwiJrMpoZ1uESbK8FQV3LXkhfry+8bOniq9pqY1OdsjFWNsSbfjPugw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.42.0': + resolution: {integrity: sha512-g86PF8YZ9GRqkdi0VoGlcDUb4rYtQKyTD1IVtxxN4Hpe7YqLBShA7oHMKU6oKTCi3uxwW4VkIGnOaH/El8de3w==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + '@rollup/rollup-win32-arm64-msvc@4.42.0': + resolution: {integrity: sha512-+axkdyDGSp6hjyzQ5m1pgcvQScfHnMCcsXkx8pTgy/6qBmWVhtRVlgxjWwDp67wEXXUr0x+vD6tp5W4x6V7u1A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.42.0': + resolution: {integrity: sha512-F+5J9pelstXKwRSDq92J0TEBXn2nfUrQGg+HK1+Tk7VOL09e0gBqUHugZv7SW4MGrYj41oNCUe3IKCDGVlis2g==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.42.0': + resolution: {integrity: sha512-LpHiJRwkaVz/LqjHjK8LCi8osq7elmpwujwbXKNW88bM8eeGxavJIKKjkjpMHAh/2xfnrt1ZSnhTv41WYUHYmA==} cpu: [x64] os: [win32] @@ -730,9 +727,18 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -760,79 +766,79 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-vue@5.2.3': - resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vitest/expect@3.1.2': - resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} + '@vitest/expect@3.2.2': + resolution: {integrity: sha512-ipHw0z669vEMjzz3xQE8nJX1s0rQIb7oEl4jjl35qWTwm/KIHERIg/p/zORrjAaZKXfsv7IybcNGHwhOOAPMwQ==} - '@vitest/mocker@3.1.2': - resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} + '@vitest/mocker@3.2.2': + resolution: {integrity: sha512-jKojcaRyIYpDEf+s7/dD3LJt53c0dPfp5zCPXz9H/kcGrSlovU/t1yEaNzM9oFME3dcd4ULwRI/x0Po1Zf+LTw==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.1.2': - resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} + '@vitest/pretty-format@3.2.2': + resolution: {integrity: sha512-FY4o4U1UDhO9KMd2Wee5vumwcaHw7Vg4V7yR4Oq6uK34nhEJOmdRYrk3ClburPRUA09lXD/oXWZ8y/Sdma0aUQ==} - '@vitest/runner@3.1.2': - resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} + '@vitest/runner@3.2.2': + resolution: {integrity: sha512-GYcHcaS3ejGRZYed2GAkvsjBeXIEerDKdX3orQrBJqLRiea4NSS9qvn9Nxmuy1IwIB+EjFOaxXnX79l8HFaBwg==} - '@vitest/snapshot@3.1.2': - resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} + '@vitest/snapshot@3.2.2': + resolution: {integrity: sha512-aMEI2XFlR1aNECbBs5C5IZopfi5Lb8QJZGGpzS8ZUHML5La5wCbrbhLOVSME68qwpT05ROEEOAZPRXFpxZV2wA==} - '@vitest/spy@3.1.2': - resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} + '@vitest/spy@3.2.2': + resolution: {integrity: sha512-6Utxlx3o7pcTxvp0u8kUiXtRFScMrUg28KjB3R2hon7w4YqOFAEA9QwzPVVS1QNL3smo4xRNOpNZClRVfpMcYg==} - '@vitest/utils@3.1.2': - resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} + '@vitest/utils@3.2.2': + resolution: {integrity: sha512-qJYMllrWpF/OYfWHP32T31QCaLa3BAzT/n/8mNGhPdVcjY+JYazQFO1nsJvXU12Kp1xMpNY4AGuljPTNjQve6A==} - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.16': + resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.16': + resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.16': + resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.16': + resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} - '@vue/devtools-api@7.7.5': - resolution: {integrity: sha512-HYV3tJGARROq5nlVMJh5KKHk7GU8Au3IrrmNNqr978m0edxgpHgYPDoNUGrvEgIbObz09SQezFR3A1EVmB5WZg==} + '@vue/devtools-api@7.7.6': + resolution: {integrity: sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==} - '@vue/devtools-kit@7.7.5': - resolution: {integrity: sha512-S9VAVJYVAe4RPx2JZb9ZTEi0lqTySz2CBeF0wHT5D3dkTLnT9yMMGegKNl4b2EIELwLSkcI9bl2qp0/jW+upqA==} + '@vue/devtools-kit@7.7.6': + resolution: {integrity: sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==} - '@vue/devtools-shared@7.7.5': - resolution: {integrity: sha512-QBjG72RfpM0DKtpns2RZOxBltO226kOAls9e4Lri6YxS2gWTgL0H+wj1R2K76lxxIeOrqo4+2Ty6RQnzv+WSTQ==} + '@vue/devtools-shared@7.7.6': + resolution: {integrity: sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==} - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.16': + resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.16': + resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.16': + resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/server-renderer@3.5.16': + resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} peerDependencies: - vue: 3.5.13 + vue: 3.5.16 - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.16': + resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} @@ -893,8 +899,8 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -905,8 +911,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - algoliasearch@5.23.4: - resolution: {integrity: sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg==} + algoliasearch@5.27.0: + resolution: {integrity: sha512-2PvAgvxxJzA3+dB+ERfS2JPdvUsxNf89Cc2GF5iCcFupTULOwmbfinvqrC4Qj9nHJJDNf494NqEN/1f9177ZTQ==} engines: {node: '>= 14.0.0'} ansi-regex@5.0.1: @@ -1010,8 +1016,8 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - cssstyle@4.3.1: - resolution: {integrity: sha512-ZgW+Jgdd7i52AaLYCriF8Mxqft0gD/R9i9wi6RWBhs1pqdPEzPjym7rvRKi397WmQFf3SlyUsszhw+VVCbx79Q==} + cssstyle@4.4.0: + resolution: {integrity: sha512-W0Y2HOXlPkb2yaKrCVRjinYKciu/qSLEmK0K9mcfDei3zwlnHFEHAs/Du3cIRwPqY+J4JsiBzUjoHyc8RsJ03A==} engines: {node: '>=18'} csstype@3.1.3: @@ -1051,8 +1057,8 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1106,8 +1112,8 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} - entities@6.0.0: - resolution: {integrity: sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==} + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} es-module-lexer@1.7.0: @@ -1118,8 +1124,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.3: - resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -1194,8 +1200,8 @@ packages: fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.4.5: + resolution: {integrity: sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1217,8 +1223,8 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - focus-trap@7.6.4: - resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} @@ -1543,12 +1549,12 @@ packages: resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} engines: {node: '>=12'} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.4: + resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.8: + resolution: {integrity: sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -1559,8 +1565,8 @@ packages: engines: {node: '>=14'} hasBin: true - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} @@ -1605,8 +1611,8 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + rollup@4.42.0: + resolution: {integrity: sha512-LW+Vse3BJPyGJGAJt1j8pWDKPd73QM8cRXYK1IxOBgL2AGLu7Xd2YOW0M2sLUBCkF5MshXXtMApyEAEzMVMsnw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1629,8 +1635,8 @@ packages: search-insights@2.17.2: resolution: {integrity: sha512-zFNpOpUO+tY2D85KrxJ+aqwnIfdEGi06UH2+xEb+Bp9Mwznmauqc9djbnBibJO5mpfUPPa8st6Sx65+vbeO45g==} - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -1723,8 +1729,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + terser@5.41.0: + resolution: {integrity: sha512-H406eLPXpZbAX14+B8psIuvIr8+3c+2hkuYzpMkoE0ij+NdsVATbA78vb8neA/eqrj7rywa2pIkdmWRsXW6wmw==} engines: {node: '>=10'} hasBin: true @@ -1737,20 +1743,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.0: + resolution: {integrity: sha512-7CotroY9a8DKsKprEy/a14aCCm8jYVmR7aFy4fpkZM8sdpNJbKkixuNjgM50yCmip2ezc8z4N7k3oe2+rfRJCQ==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} tldts-core@6.1.86: @@ -1803,13 +1809,13 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.1.2: - resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} + vite-node@3.2.2: + resolution: {integrity: sha512-Xj/jovjZvDXOq2FgLXu8NsY4uHUMWtzVmMC2LkCu9HWdr9Qu1Is5sanX3Z4jOFKdohfaWDnEJWp9pRP0vVpAcA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@5.4.18: - resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -1839,8 +1845,8 @@ packages: terser: optional: true - vite@6.3.3: - resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} + vite@6.3.5: + resolution: {integrity: sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -1891,16 +1897,16 @@ packages: postcss: optional: true - vitest@3.1.2: - resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} + vitest@3.2.2: + resolution: {integrity: sha512-fyNn/Rp016Bt5qvY0OQvIUCwW2vnaEBLxP42PmKbNIoasSYjML+8xyeADOPvBe+Xfl/ubIw4og7Lt9jflRsCNw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.2 - '@vitest/ui': 3.1.2 + '@vitest/browser': 3.2.2 + '@vitest/ui': 3.2.2 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1919,8 +1925,8 @@ packages: jsdom: optional: true - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue@3.5.16: + resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -1972,8 +1978,8 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2000,158 +2006,158 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.17.2)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.17.2) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.2) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.17.2)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) search-insights: 2.17.2 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) - '@algolia/client-search': 5.23.4 - algoliasearch: 5.23.4 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) + '@algolia/client-search': 5.27.0 + algoliasearch: 5.27.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)': dependencies: - '@algolia/client-search': 5.23.4 - algoliasearch: 5.23.4 + '@algolia/client-search': 5.27.0 + algoliasearch: 5.27.0 - '@algolia/client-abtesting@5.23.4': + '@algolia/client-abtesting@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/client-analytics@5.23.4': + '@algolia/client-analytics@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/client-common@5.23.4': {} + '@algolia/client-common@5.27.0': {} - '@algolia/client-insights@5.23.4': + '@algolia/client-insights@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/client-personalization@5.23.4': + '@algolia/client-personalization@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/client-query-suggestions@5.23.4': + '@algolia/client-query-suggestions@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/client-search@5.23.4': + '@algolia/client-search@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/ingestion@1.23.4': + '@algolia/ingestion@1.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/monitoring@1.23.4': + '@algolia/monitoring@1.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/recommend@5.23.4': + '@algolia/recommend@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 - '@algolia/requester-browser-xhr@5.23.4': + '@algolia/requester-browser-xhr@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 + '@algolia/client-common': 5.27.0 - '@algolia/requester-fetch@5.23.4': + '@algolia/requester-fetch@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 + '@algolia/client-common': 5.27.0 - '@algolia/requester-node-http@5.23.4': + '@algolia/requester-node-http@5.27.0': dependencies: - '@algolia/client-common': 5.23.4 + '@algolia/client-common': 5.27.0 - '@asamuzakjp/css-color@3.1.4': + '@asamuzakjp/css-color@3.2.0': dependencies: - '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-color-parser': 3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 lru-cache: 10.4.3 - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/parser@7.27.0': + '@babel/parser@7.27.5': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.27.6 - '@babel/types@7.27.0': + '@babel/types@7.27.6': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@csstools/color-helpers@5.0.2': {} - '@csstools/css-calc@2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-color-parser@3.0.9(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': dependencies: '@csstools/color-helpers': 5.0.2 - '@csstools/css-calc': 2.1.3(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': dependencies: - '@csstools/css-tokenizer': 3.0.3 + '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-tokenizer@3.0.3': {} + '@csstools/css-tokenizer@3.0.4': {} '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.23.4)(search-insights@2.17.2)': + '@docsearch/js@3.8.2(@algolia/client-search@5.27.0)(search-insights@2.17.2)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.23.4)(search-insights@2.17.2) - preact: 10.26.5 + '@docsearch/react': 3.8.2(@algolia/client-search@5.27.0)(search-insights@2.17.2) + preact: 10.26.8 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -2159,12 +2165,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.23.4)(search-insights@2.17.2)': + '@docsearch/react@3.8.2(@algolia/client-search@5.27.0)(search-insights@2.17.2)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.17.2) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0)(search-insights@2.17.2) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.27.0)(algoliasearch@5.27.0) '@docsearch/css': 3.8.2 - algoliasearch: 5.23.4 + algoliasearch: 5.27.0 optionalDependencies: search-insights: 2.17.2 transitivePeerDependencies: @@ -2173,148 +2179,148 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.25.3': + '@esbuild/aix-ppc64@0.25.5': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.25.3': + '@esbuild/android-arm64@0.25.5': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.25.3': + '@esbuild/android-arm@0.25.5': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.25.3': + '@esbuild/android-x64@0.25.5': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.25.3': + '@esbuild/darwin-arm64@0.25.5': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.25.3': + '@esbuild/darwin-x64@0.25.5': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.25.3': + '@esbuild/freebsd-arm64@0.25.5': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.25.3': + '@esbuild/freebsd-x64@0.25.5': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.25.3': + '@esbuild/linux-arm64@0.25.5': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.25.3': + '@esbuild/linux-arm@0.25.5': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.25.3': + '@esbuild/linux-ia32@0.25.5': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.25.3': + '@esbuild/linux-loong64@0.25.5': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.25.3': + '@esbuild/linux-mips64el@0.25.5': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.25.3': + '@esbuild/linux-ppc64@0.25.5': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.25.3': + '@esbuild/linux-riscv64@0.25.5': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.25.3': + '@esbuild/linux-s390x@0.25.5': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.25.3': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.3': + '@esbuild/netbsd-arm64@0.25.5': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.25.3': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.3': + '@esbuild/openbsd-arm64@0.25.5': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.25.3': + '@esbuild/openbsd-x64@0.25.5': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.25.3': + '@esbuild/sunos-x64@0.25.5': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.25.3': + '@esbuild/win32-arm64@0.25.5': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.25.3': + '@esbuild/win32-ia32@0.25.5': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.25.3': + '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.6.1(eslint@8.57.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 @@ -2324,7 +2330,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.1 espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -2340,7 +2346,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2349,7 +2355,7 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@iconify-json/simple-icons@1.2.33': + '@iconify-json/simple-icons@1.2.38': dependencies: '@iconify/types': 2.0.0 @@ -2412,90 +2418,90 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@rollup/plugin-node-resolve@15.3.1(rollup@4.40.0)': + '@rollup/plugin-node-resolve@15.3.1(rollup@4.42.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.42.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.10 optionalDependencies: - rollup: 4.40.0 + rollup: 4.42.0 - '@rollup/plugin-terser@0.4.4(rollup@4.40.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.42.0)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.39.0 + terser: 5.41.0 optionalDependencies: - rollup: 4.40.0 + rollup: 4.42.0 - '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + '@rollup/pluginutils@5.1.4(rollup@4.42.0)': dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.40.0 + rollup: 4.42.0 - '@rollup/rollup-android-arm-eabi@4.40.0': + '@rollup/rollup-android-arm-eabi@4.42.0': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@rollup/rollup-android-arm64@4.42.0': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@rollup/rollup-darwin-arm64@4.42.0': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@rollup/rollup-darwin-x64@4.42.0': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@rollup/rollup-freebsd-arm64@4.42.0': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@rollup/rollup-freebsd-x64@4.42.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@rollup/rollup-linux-arm-gnueabihf@4.42.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@rollup/rollup-linux-arm-musleabihf@4.42.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@rollup/rollup-linux-arm64-gnu@4.42.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@rollup/rollup-linux-arm64-musl@4.42.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@rollup/rollup-linux-loongarch64-gnu@4.42.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.42.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@rollup/rollup-linux-riscv64-gnu@4.42.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@rollup/rollup-linux-riscv64-musl@4.42.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@rollup/rollup-linux-s390x-gnu@4.42.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@rollup/rollup-linux-x64-gnu@4.42.0': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@rollup/rollup-linux-x64-musl@4.42.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@rollup/rollup-win32-arm64-msvc@4.42.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@rollup/rollup-win32-ia32-msvc@4.42.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@rollup/rollup-win32-x64-msvc@4.42.0': optional: true '@shikijs/core@2.5.0': @@ -2538,8 +2544,16 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/deep-eql@4.0.2': {} + '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} + '@types/hast@3.0.4': dependencies: '@types/unist': 3.0.3 @@ -2565,88 +2579,89 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.3(vite@5.4.18(terser@5.39.0))(vue@3.5.13)': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19(terser@5.41.0))(vue@3.5.16)': dependencies: - vite: 5.4.18(terser@5.39.0) - vue: 3.5.13 + vite: 5.4.19(terser@5.41.0) + vue: 3.5.16 - '@vitest/expect@3.1.2': + '@vitest/expect@3.2.2': dependencies: - '@vitest/spy': 3.1.2 - '@vitest/utils': 3.1.2 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.2 + '@vitest/utils': 3.2.2 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.2(vite@6.3.3(terser@5.39.0))': + '@vitest/mocker@3.2.2(vite@6.3.5(terser@5.41.0))': dependencies: - '@vitest/spy': 3.1.2 + '@vitest/spy': 3.2.2 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.3(terser@5.39.0) + vite: 6.3.5(terser@5.41.0) - '@vitest/pretty-format@3.1.2': + '@vitest/pretty-format@3.2.2': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.2': + '@vitest/runner@3.2.2': dependencies: - '@vitest/utils': 3.1.2 + '@vitest/utils': 3.2.2 pathe: 2.0.3 - '@vitest/snapshot@3.1.2': + '@vitest/snapshot@3.2.2': dependencies: - '@vitest/pretty-format': 3.1.2 + '@vitest/pretty-format': 3.2.2 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.2': + '@vitest/spy@3.2.2': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/utils@3.1.2': + '@vitest/utils@3.2.2': dependencies: - '@vitest/pretty-format': 3.1.2 + '@vitest/pretty-format': 3.2.2 loupe: 3.1.3 tinyrainbow: 2.0.0 - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.16': dependencies: - '@babel/parser': 7.27.0 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.5 + '@vue/shared': 3.5.16 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': + '@vue/compiler-dom@3.5.16': dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.16 + '@vue/shared': 3.5.16 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-sfc@3.5.16': dependencies: - '@babel/parser': 7.27.0 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@babel/parser': 7.27.5 + '@vue/compiler-core': 3.5.16 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.3 + postcss: 8.5.4 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.16': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.16 + '@vue/shared': 3.5.16 - '@vue/devtools-api@7.7.5': + '@vue/devtools-api@7.7.6': dependencies: - '@vue/devtools-kit': 7.7.5 + '@vue/devtools-kit': 7.7.6 - '@vue/devtools-kit@7.7.5': + '@vue/devtools-kit@7.7.6': dependencies: - '@vue/devtools-shared': 7.7.5 + '@vue/devtools-shared': 7.7.6 birpc: 2.3.0 hookable: 5.5.3 mitt: 3.0.1 @@ -2654,50 +2669,50 @@ snapshots: speakingurl: 14.0.1 superjson: 2.2.2 - '@vue/devtools-shared@7.7.5': + '@vue/devtools-shared@7.7.6': dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.5.13': + '@vue/reactivity@3.5.16': dependencies: - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.16 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.16': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.16 + '@vue/shared': 3.5.16 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.16': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.16 + '@vue/runtime-core': 3.5.16 + '@vue/shared': 3.5.16 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13)': + '@vue/server-renderer@3.5.16(vue@3.5.16)': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13 + '@vue/compiler-ssr': 3.5.16 + '@vue/shared': 3.5.16 + vue: 3.5.16 - '@vue/shared@3.5.13': {} + '@vue/shared@3.5.16': {} '@vueuse/core@12.8.2': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 '@vueuse/shared': 12.8.2 - vue: 3.5.13 + vue: 3.5.16 transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.4)': + '@vueuse/integrations@12.8.2(focus-trap@7.6.5)': dependencies: '@vueuse/core': 12.8.2 '@vueuse/shared': 12.8.2 - vue: 3.5.13 + vue: 3.5.16 optionalDependencies: - focus-trap: 7.6.4 + focus-trap: 7.6.5 transitivePeerDependencies: - typescript @@ -2705,17 +2720,17 @@ snapshots: '@vueuse/shared@12.8.2': dependencies: - vue: 3.5.13 + vue: 3.5.16 transitivePeerDependencies: - typescript abbrev@2.0.0: {} - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 - acorn@8.14.1: {} + acorn@8.15.0: {} agent-base@7.1.3: {} @@ -2726,21 +2741,21 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - algoliasearch@5.23.4: - dependencies: - '@algolia/client-abtesting': 5.23.4 - '@algolia/client-analytics': 5.23.4 - '@algolia/client-common': 5.23.4 - '@algolia/client-insights': 5.23.4 - '@algolia/client-personalization': 5.23.4 - '@algolia/client-query-suggestions': 5.23.4 - '@algolia/client-search': 5.23.4 - '@algolia/ingestion': 1.23.4 - '@algolia/monitoring': 1.23.4 - '@algolia/recommend': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + algoliasearch@5.27.0: + dependencies: + '@algolia/client-abtesting': 5.27.0 + '@algolia/client-analytics': 5.27.0 + '@algolia/client-common': 5.27.0 + '@algolia/client-insights': 5.27.0 + '@algolia/client-personalization': 5.27.0 + '@algolia/client-query-suggestions': 5.27.0 + '@algolia/client-search': 5.27.0 + '@algolia/ingestion': 1.27.0 + '@algolia/monitoring': 1.27.0 + '@algolia/recommend': 5.27.0 + '@algolia/requester-browser-xhr': 5.27.0 + '@algolia/requester-fetch': 5.27.0 + '@algolia/requester-node-http': 5.27.0 ansi-regex@5.0.1: {} @@ -2827,9 +2842,9 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cssstyle@4.3.1: + cssstyle@4.4.0: dependencies: - '@asamuzakjp/css-color': 3.1.4 + '@asamuzakjp/css-color': 3.2.0 rrweb-cssom: 0.8.0 csstype@3.1.3: {} @@ -2862,7 +2877,7 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 @@ -2891,7 +2906,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.7.1 + semver: 7.7.2 emoji-regex-xs@1.0.0: {} @@ -2901,7 +2916,7 @@ snapshots: entities@4.5.0: {} - entities@6.0.0: {} + entities@6.0.1: {} es-module-lexer@1.7.0: {} @@ -2931,33 +2946,33 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.3: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.3 - '@esbuild/android-arm': 0.25.3 - '@esbuild/android-arm64': 0.25.3 - '@esbuild/android-x64': 0.25.3 - '@esbuild/darwin-arm64': 0.25.3 - '@esbuild/darwin-x64': 0.25.3 - '@esbuild/freebsd-arm64': 0.25.3 - '@esbuild/freebsd-x64': 0.25.3 - '@esbuild/linux-arm': 0.25.3 - '@esbuild/linux-arm64': 0.25.3 - '@esbuild/linux-ia32': 0.25.3 - '@esbuild/linux-loong64': 0.25.3 - '@esbuild/linux-mips64el': 0.25.3 - '@esbuild/linux-ppc64': 0.25.3 - '@esbuild/linux-riscv64': 0.25.3 - '@esbuild/linux-s390x': 0.25.3 - '@esbuild/linux-x64': 0.25.3 - '@esbuild/netbsd-arm64': 0.25.3 - '@esbuild/netbsd-x64': 0.25.3 - '@esbuild/openbsd-arm64': 0.25.3 - '@esbuild/openbsd-x64': 0.25.3 - '@esbuild/sunos-x64': 0.25.3 - '@esbuild/win32-arm64': 0.25.3 - '@esbuild/win32-ia32': 0.25.3 - '@esbuild/win32-x64': 0.25.3 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escape-string-regexp@4.0.0: {} @@ -2974,7 +2989,7 @@ snapshots: eslint@8.57.1: dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@8.57.1) '@eslint-community/regexpp': 4.12.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.1 @@ -2985,7 +3000,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.1 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -3017,8 +3032,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -3037,7 +3052,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -3053,7 +3068,7 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.5(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -3074,7 +3089,7 @@ snapshots: flatted@3.3.3: {} - focus-trap@7.6.4: + focus-trap@7.6.5: dependencies: tabbable: 6.2.0 @@ -3097,11 +3112,11 @@ snapshots: esprima: 4.0.1 estraverse: 5.3.0 - genji-theme-vitepress@0.2.8(vitepress@1.6.3(@algolia/client-search@5.23.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0))(vue@3.5.13): + genji-theme-vitepress@0.2.8(vitepress@1.6.3(@algolia/client-search@5.27.0)(postcss@8.5.4)(search-insights@2.17.2)(terser@5.41.0))(vue@3.5.16): dependencies: genji-runtime: 0.2.8 - vitepress: 1.6.3(@algolia/client-search@5.23.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0) - vue: 3.5.13 + vitepress: 1.6.3(@algolia/client-search@5.27.0)(postcss@8.5.4)(search-insights@2.17.2)(terser@5.41.0) + vue: 3.5.16 glob-parent@6.0.2: dependencies: @@ -3146,7 +3161,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -3168,14 +3183,14 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -3247,7 +3262,7 @@ snapshots: jsdom@26.1.0: dependencies: - cssstyle: 4.3.1 + cssstyle: 4.4.0 data-urls: 5.0.0 decimal.js: 10.5.0 html-encoding-sniffer: 4.0.0 @@ -3265,7 +3280,7 @@ snapshots: whatwg-encoding: 3.1.1 whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 - ws: 8.18.1 + ws: 8.18.2 xml-name-validator: 5.0.0 transitivePeerDependencies: - bufferutil @@ -3397,7 +3412,7 @@ snapshots: parse5@7.3.0: dependencies: - entities: 6.0.0 + entities: 6.0.1 path-exists@4.0.0: {} @@ -3422,19 +3437,19 @@ snapshots: picomatch@4.0.2: {} - postcss@8.5.3: + postcss@8.5.4: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.5: {} + preact@10.26.8: {} prelude-ls@1.2.1: {} prettier@3.5.3: {} - property-information@7.0.0: {} + property-information@7.1.0: {} proto-list@1.2.4: {} @@ -3472,30 +3487,30 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.40.0: + rollup@4.42.0: dependencies: '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.42.0 + '@rollup/rollup-android-arm64': 4.42.0 + '@rollup/rollup-darwin-arm64': 4.42.0 + '@rollup/rollup-darwin-x64': 4.42.0 + '@rollup/rollup-freebsd-arm64': 4.42.0 + '@rollup/rollup-freebsd-x64': 4.42.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.42.0 + '@rollup/rollup-linux-arm-musleabihf': 4.42.0 + '@rollup/rollup-linux-arm64-gnu': 4.42.0 + '@rollup/rollup-linux-arm64-musl': 4.42.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.42.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.42.0 + '@rollup/rollup-linux-riscv64-gnu': 4.42.0 + '@rollup/rollup-linux-riscv64-musl': 4.42.0 + '@rollup/rollup-linux-s390x-gnu': 4.42.0 + '@rollup/rollup-linux-x64-gnu': 4.42.0 + '@rollup/rollup-linux-x64-musl': 4.42.0 + '@rollup/rollup-win32-arm64-msvc': 4.42.0 + '@rollup/rollup-win32-ia32-msvc': 4.42.0 + '@rollup/rollup-win32-x64-msvc': 4.42.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -3514,7 +3529,7 @@ snapshots: search-insights@2.17.2: {} - semver@7.7.1: {} + semver@7.7.2: {} serialize-javascript@6.0.2: dependencies: @@ -3601,10 +3616,10 @@ snapshots: tabbable@6.2.0: {} - terser@5.39.0: + terser@5.41.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -3614,16 +3629,16 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.13: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.4(picomatch@4.0.2) + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 - tinypool@1.0.2: {} + tinypool@1.1.0: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} tldts-core@6.1.86: {} @@ -3684,13 +3699,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.1.2(terser@5.39.0): + vite-node@3.2.2(terser@5.41.0): dependencies: cac: 6.7.14 - debug: 4.4.0 + debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.3(terser@5.39.0) + vite: 6.3.5(terser@5.41.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3705,49 +3720,49 @@ snapshots: - tsx - yaml - vite@5.4.18(terser@5.39.0): + vite@5.4.19(terser@5.41.0): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.40.0 + postcss: 8.5.4 + rollup: 4.42.0 optionalDependencies: fsevents: 2.3.3 - terser: 5.39.0 + terser: 5.41.0 - vite@6.3.3(terser@5.39.0): + vite@6.3.5(terser@5.41.0): dependencies: - esbuild: 0.25.3 - fdir: 6.4.4(picomatch@4.0.2) + esbuild: 0.25.5 + fdir: 6.4.5(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.13 + postcss: 8.5.4 + rollup: 4.42.0 + tinyglobby: 0.2.14 optionalDependencies: fsevents: 2.3.3 - terser: 5.39.0 + terser: 5.41.0 - vitepress@1.6.3(@algolia/client-search@5.23.4)(postcss@8.5.3)(search-insights@2.17.2)(terser@5.39.0): + vitepress@1.6.3(@algolia/client-search@5.27.0)(postcss@8.5.4)(search-insights@2.17.2)(terser@5.41.0): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.23.4)(search-insights@2.17.2) - '@iconify-json/simple-icons': 1.2.33 + '@docsearch/js': 3.8.2(@algolia/client-search@5.27.0)(search-insights@2.17.2) + '@iconify-json/simple-icons': 1.2.38 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.3(vite@5.4.18(terser@5.39.0))(vue@3.5.13) - '@vue/devtools-api': 7.7.5 - '@vue/shared': 3.5.13 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(terser@5.41.0))(vue@3.5.16) + '@vue/devtools-api': 7.7.6 + '@vue/shared': 3.5.16 '@vueuse/core': 12.8.2 - '@vueuse/integrations': 12.8.2(focus-trap@7.6.4) - focus-trap: 7.6.4 + '@vueuse/integrations': 12.8.2(focus-trap@7.6.5) + focus-trap: 7.6.5 mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.18(terser@5.39.0) - vue: 3.5.13 + vite: 5.4.19(terser@5.41.0) + vue: 3.5.16 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.4 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -3775,28 +3790,30 @@ snapshots: - typescript - universal-cookie - vitest@3.1.2(jsdom@26.1.0)(terser@5.39.0): + vitest@3.2.2(jsdom@26.1.0)(terser@5.41.0): dependencies: - '@vitest/expect': 3.1.2 - '@vitest/mocker': 3.1.2(vite@6.3.3(terser@5.39.0)) - '@vitest/pretty-format': 3.1.2 - '@vitest/runner': 3.1.2 - '@vitest/snapshot': 3.1.2 - '@vitest/spy': 3.1.2 - '@vitest/utils': 3.1.2 + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.2 + '@vitest/mocker': 3.2.2(vite@6.3.5(terser@5.41.0)) + '@vitest/pretty-format': 3.2.2 + '@vitest/runner': 3.2.2 + '@vitest/snapshot': 3.2.2 + '@vitest/spy': 3.2.2 + '@vitest/utils': 3.2.2 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 6.3.3(terser@5.39.0) - vite-node: 3.1.2(terser@5.39.0) + vite: 6.3.5(terser@5.41.0) + vite-node: 3.2.2(terser@5.41.0) why-is-node-running: 2.3.0 optionalDependencies: jsdom: 26.1.0 @@ -3814,13 +3831,13 @@ snapshots: - tsx - yaml - vue@3.5.13: + vue@3.5.16: dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13) - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.16 + '@vue/compiler-sfc': 3.5.16 + '@vue/runtime-dom': 3.5.16 + '@vue/server-renderer': 3.5.16(vue@3.5.16) + '@vue/shared': 3.5.16 w3c-xmlserializer@5.0.0: dependencies: @@ -3864,7 +3881,7 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.1: {} + ws@8.18.2: {} xml-name-validator@5.0.0: {} diff --git a/src/dom.js b/src/dom.js new file mode 100644 index 00000000..7d994430 --- /dev/null +++ b/src/dom.js @@ -0,0 +1,65 @@ +const propSetterCache = {}; + +const protoOf = Object.getPrototypeOf; + +const isFunc = (x) => typeof x === "function"; + +const isStr = (x) => typeof x === "string"; + +function postprocess(fragment) { + if (fragment.firstChild === fragment.lastChild) return fragment.firstChild; + return fragment; +} + +function snake2kebab(str) { + return str.replace(/_/g, "-"); +} + +// Ref: https://github.com/vanjs-org/van/blob/d09cfd1e1e3b5ea7cf8d0a9b5deacca4c0946fb4/src/van.js#L99 +function set(dom, k, v) { + k = snake2kebab(k); + if (k.startsWith("on")) return dom.addEventListener(k.slice(2), v); + if (k.startsWith("style-")) return dom.style.setProperty(k.slice(6), v); + const get = (proto) => (proto ? (Object.getOwnPropertyDescriptor(proto, k) ?? get(protoOf(proto))) : undefined); + const cacheKey = dom.nodeName + "," + k; + const propSetter = (propSetterCache[cacheKey] ??= get(protoOf(dom))?.set ?? 0); + const setter = propSetter ? propSetter.bind(dom) : dom.setAttribute.bind(dom, k); + setter(v); +} + +export function tag(ns, tag, data, options) { + if (!isStr(tag)) return null; + if (options === undefined) (options = data), (data = [0]); + const root = document.createDocumentFragment(); + const {children = [], ...attrs} = options ?? {}; + const nodes = data.map((d, i, array) => { + const dom = ns ? document.createElementNS(ns, tag) : document.createElement(tag); + for (const [k, v] of Object.entries(attrs)) { + const val = k.startsWith("on") ? (e) => v(e, d, i, array) : isFunc(v) ? v(d, i, array) : v; + set(dom, k, val); + } + const childNodes = isFunc(children) + ? children(d, i, array).filter(Boolean) + : children.filter(Boolean).map((child) => child.cloneNode(true)); + dom.append(...childNodes); + return dom; + }); + root.append(...nodes); + return postprocess(root); +} + +export function use(component, data, options) { + if (options === undefined) (options = data), (data = [0]); + const root = document.createDocumentFragment(); + const nodes = data.map((d, i, array) => { + const props = {}; + for (const [k, v] of Object.entries(options)) props[k] = isFunc(v) ? v(d, i, array) : v; + return component(props); + }); + root.append(...nodes); + return postprocess(root); +} + +export const svg = tag.bind(null, "http://www.w3.org/2000/svg"); + +export const html = tag.bind(null, null); diff --git a/src/index.js b/src/index.js index 90745697..5141d9dd 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,2 @@ -export {state} from "./state.js"; -export {constrain} from "./math.js"; -export {Mark, svg, html} from "./mark.js"; -export {Renderer} from "./renderer.js"; +export {svg, html} from "./dom.js"; export * from "charmingjs-vector"; diff --git a/src/mark.js b/src/mark.js deleted file mode 100644 index 23c1e115..00000000 --- a/src/mark.js +++ /dev/null @@ -1,264 +0,0 @@ -import {interval} from "d3-timer"; -import {Renderer} from "./renderer.js"; - -export const drawRef = {current: null}; - -const isFunction = (x) => typeof x === "function"; - -const isStr = (x) => typeof x === "string"; - -const isDefined = (x) => x !== undefined && x !== null; - -function applyAttributes(node, options, values, context = {}) { - const {use} = context; - const decorators = []; - const props = {}; - - for (const [k, v] of Object.entries(options)) { - if (use && k in use && isDefined(v)) decorators.push([use[k], v]); - else if (k !== "use") props[k] = v; - } - - const {attrs = () => ({}), renderer, ...rest} = props; - const {datum, i, data} = values; - const eventValues = {}; - const attrValues = {}; - for (const [k, v] of Object.entries({...attrs(datum, i, data), ...rest})) { - if (k.startsWith("on")) eventValues[k] = (event) => v(event, datum, i, data); - else attrValues[k] = isFunction(v) ? v(datum, i, data) : v; - } - renderer.events(node, eventValues); - renderer.attrs(node, attrValues); - - for (const [type, decorator] of decorators) { - const options = isFunction(decorator) ? decorator(datum, i, data) : decorator; - type(node, options, context); - } - - return node; -} - -function bindIndex(data, nodes, enter, update, exit) { - const dataLength = data.length; - const nodeLength = nodes.length; - - let i = 0; - let node; - - for (; i < dataLength; i++) { - if ((node = nodes[i])) update[i] = node; - else enter[i] = {datum: data[i], next: null}; - } - - for (; i < nodeLength; i++) exit[i] = nodes[i]; -} - -function addTimer(parent, key, timer) { - const timers = parent.__timers__ ?? new Map(); - parent.__timers__ = timers; - timers.set(key, timer); -} - -function removeTimer(parent, key) { - const timers = parent.__timers__ ?? new Map(); - parent.__timers__ = timers; - if (timers.has(key)) { - const timer = timers.get(key); - timer.stop(); - timers.delete(key); - return timer; - } - return null; -} - -function markof(group) { - if (!group) return []; - const {children, datum, i, data} = group; - return [isFunction(children) ? children(datum, i, data) : children].flat(Infinity).map((d) => d.clone()); -} - -function isDocumentFragment(node) { - return node.nodeName === "#document-fragment"; -} - -function postprocess(node) { - if (!isDocumentFragment(node)) return node; - if (node.childNodes.length === 1) return node.firstChild; - - const root = - node.firstChild instanceof SVGElement - ? document.createElementNS("http://www.w3.org/2000/svg", "g") - : document.createElement("span"); - - root.append(node); - return root; -} - -function patchMark(parent, mark, context) { - const data = mark._update?._data ?? mark._data; - const props = mark._update?._props ?? mark._props; - const children = mark._update?._children ?? mark._children; - const isStatic = mark._update?._static ?? mark._static; - const nextNode = mark._next?._nodes?.[0] ?? null; - const {loop, ...attrs} = props; - - const tag = mark._tag; - const nodes = mark._nodes ?? []; - const dataLength = data.length; - const nodeLength = nodes.length; - const enter = new Array(dataLength); - const update = new Array(dataLength); - const exit = new Array(nodeLength); - const newNodes = (mark._nodes = new Array(dataLength)); - const newGroups = new Array(dataLength); - - bindIndex(data, nodes, enter, update, exit); - - let previous, next; - for (let i0 = 0, i1 = 0; i0 < dataLength; i0++) { - if ((previous = enter[i0])) { - if (i0 >= i1) i1 = i0 + 1; - while (!(next = update[i1]) && ++i1 < nodeLength); - previous.next = next ?? nextNode; - } - } - - let current; - - for (let i = 0; i < dataLength; i++) { - if ((current = enter[i])) { - const {datum, next} = current; - const node = mark.create(tag, attrs, {datum, i, data}, context); - parent?.insertBefore(node, next); - newNodes[i] = node; - newGroups[i] = {children, datum, i, data, loop}; - } - } - - for (let i = 0; i < nodeLength; i++) { - if ((current = update[i])) { - const datum = data[i]; - newNodes[i] = mark.create(current, attrs, {datum, i, data}, context); - newGroups[i] = {children, datum, i, data, loop}; - } - } - - for (let i = 0; i < nodeLength; i++) if ((current = exit[i])) current.remove(); - - return [newNodes, newGroups, isStatic]; -} - -// Assume the structure is not going to change for now. -function patch(parent, prev, current, context, timers) { - let mark; - const m = current.length; - const update = new Array(m); - - for (let i = 0; i < m; i++) { - update[i] = (mark = prev[i]) ? ((mark._update = current[i]), mark) : (mark = current[i]); - mark._next = prev[i + 1] ?? null; - const [parents, childGroups, isStatic] = patchMark(parent, mark, context); - const groups = mark._groups ?? []; - - for (let j = 0; j < parents.length; j++) { - const groupParent = parents[j]; - const oldChildren = groups[j] ?? null; - const newChildren = childGroups[j]; - const newLoop = newChildren?.loop ?? false; - const isCallback = isFunction(newChildren?.children); - - // Remove old timer if exists. - const oldTimer = removeTimer(groupParent, oldChildren); - if (oldTimer) timers.delete(oldTimer); - - // Only static marks can be animated and interactive. - if (isStatic && (newLoop || isCallback)) { - const templateChildren = {...newChildren}; - - // Rerender the children. - let oldMarks = oldChildren?.children ?? []; - const frame = (options) => { - const {children} = templateChildren; - const newMarks = markof({...templateChildren, children: children(options)}); - const prev = (oldMarks = patch(groupParent, oldMarks, newMarks, context)); - newChildren.children = prev; - }; - - // Call frame and make it reactive. - let frameCount = 0; - drawRef.current = frame; - frame({time: 0, frameCount}); - drawRef.current = null; - - // Add new timer. - if (newLoop) { - const {frameRate} = newLoop; - const delay = frameRate ? 1000 / frameRate : undefined; - const timer = interval((time) => frame({time, frameCount: ++frameCount}), delay); - addTimer(groupParent, newChildren, timer); - timers.add(timer); - } - } else { - const prev = patch(groupParent, oldChildren?.children ?? [], markof(newChildren), context); - newChildren.children = prev; - } - - groups[j] = newChildren; - } - mark._groups = groups; - } - - return update; -} - -export class Mark { - constructor(tag, data, options) { - const isStatic = options === undefined; - if (isStatic) (options = data), (data = [0]); - const {children = [], ...props} = options ?? {}; - - this._tag = tag; - this._static = isStatic; - this._data = data; - this._options = options; - this._props = props; - this._children = children; - this._update = null; - this._nodes = null; - this._next = null; - this._groups = null; - this._timers = new Set(); - } - create(current, options, values, context) { - const renderer = options?.renderer ?? context?.renderer ?? new Renderer(); - const node = isStr(current) ? renderer.create(current) : current; - return applyAttributes(node, {...options, renderer}, values, context); - } - render(parent = document.createDocumentFragment()) { - const root = () => (parent = postprocess(parent)); - const context = {...this._props, root}; - patch(parent, [], [this], context, this._timers); - return postprocess(parent); - } - unmount() { - const nodes = this._nodes ?? []; - const timers = this._timers; - for (const node of nodes) node.remove(); - for (const timer of timers) timer.stop(); - } - nodes() { - return this._nodes; - } - node() { - return this._nodes?.[0] ?? null; - } - clone() { - const mark = new this.constructor(this._tag, this._data, this._options); - mark._static = this._static; - return mark; - } -} - -export const svg = (tag, data, options) => new Mark(`svg:${tag}`, data, options); - -export const html = (tag, data, options) => new Mark(tag, data, options); diff --git a/src/math.js b/src/math.js deleted file mode 100644 index 56b40d49..00000000 --- a/src/math.js +++ /dev/null @@ -1,3 +0,0 @@ -export function constrain(x, min, max) { - return x < min ? min : x > max ? max : x; -} diff --git a/src/renderer.js b/src/renderer.js deleted file mode 100644 index b921d74c..00000000 --- a/src/renderer.js +++ /dev/null @@ -1,26 +0,0 @@ -import {setAttribute} from "./set.js"; - -const namespaces = { - svg: "http://www.w3.org/2000/svg", -}; - -function addEventListener(node, k, handler) { - const key = "__" + k + "__"; - if (!node[key]) node.addEventListener(k.slice(2).toLowerCase(), (event) => node[key](event)); - node[key] = handler; -} - -export class Renderer { - create(tag) { - const [key, name] = tag.split(":"); - const namespace = namespaces[key]; - if (namespace) return document.createElementNS(namespace, name); - return document.createElement(key); - } - events(node, events) { - for (const [k, v] of Object.entries(events)) addEventListener(node, k, v); - } - attrs(node, attrs) { - for (const [k, v] of Object.entries(attrs)) setAttribute(node, k, v); - } -} diff --git a/src/set.js b/src/set.js deleted file mode 100644 index 49f85ab1..00000000 --- a/src/set.js +++ /dev/null @@ -1,80 +0,0 @@ -const svgCamelCaseAttributes = new Set([ - "attributeName", - "attributeType", - "baseFrequency", - "baseProfile", - "calcMode", - "clipPathUnits", - "diffuseConstant", - "edgeMode", - "filterUnits", - "glyphRef", - "gradientTransform", - "gradientUnits", - "kernelMatrix", - "kernelUnitLength", - "keyPoints", - "keySplines", - "keyTimes", - "lengthAdjust", - "limitingConeAngle", - "markerHeight", - "markerUnits", - "markerWidth", - "maskContentUnits", - "maskUnits", - "numOctaves", - "pathLength", - "patternContentUnits", - "patternTransform", - "patternUnits", - "pointsAtX", - "pointsAtY", - "pointsAtZ", - "preserveAlpha", - "preserveAspectRatio", - "primitiveUnits", - "refX", - "refY", - "repeatCount", - "repeatDur", - "requiredExtensions", - "requiredFeatures", - "specularConstant", - "specularExponent", - "spreadMethod", - "startOffset", - "stdDeviation", - "stitchTiles", - "surfaceScale", - "systemLanguage", - "tableValues", - "targetX", - "targetY", - "textContent", // For text elements. - "textLength", - "viewBox", - "viewTarget", - "xChannelSelector", - "yChannelSelector", - "zoomAndPan", -]); - -const directAttributes = new Set(["textContent", "innerHTML", "className", "innerText"]); - -const toKebabCase = (str) => str.replace(/[A-Z]/g, (m) => "-" + m.toLowerCase()); - -const svgKeyof = (key) => (svgCamelCaseAttributes.has(key) || directAttributes.has(key) ? key : toKebabCase(key)); - -const lowerFirst = (str) => str.charAt(0).toLowerCase() + str.slice(1); - -export function setAttribute(dom, k, v) { - if (k.startsWith("on")) return dom.addEventListener(k.slice(2).toLowerCase(), v); - if (k.startsWith("style")) return dom.style.setProperty(lowerFirst(k.slice(5)), v); - k = svgKeyof(k); - const [set, get] = directAttributes.has(k) - ? [() => (dom[k] = v), () => dom[k]] - : [dom.setAttribute.bind(dom, k), dom.getAttribute.bind(dom, k)]; - if (get() === v + "") return; // get() returns a string, such as stroke-width. - set(v); -} diff --git a/src/state.js b/src/state.js deleted file mode 100644 index 56593757..00000000 --- a/src/state.js +++ /dev/null @@ -1,32 +0,0 @@ -import {drawRef} from "./mark.js"; - -let active; - -function schedule(deps) { - if (active) deps.forEach((d) => active.add(d)); - else { - active = new Set(deps); - setTimeout(() => { - active.forEach((d) => d()); - active = null; - }); - } -} - -export function state(data) { - const depsByKey = new Map(); - for (const key in data) depsByKey.set(key, new Set()); - return new Proxy(data, { - get(target, key) { - if (drawRef.current && key in data) depsByKey.get(key).add(drawRef.current); - return target[key]; - }, - set(target, key, value) { - const oldValue = target[key]; - if (oldValue === value) return true; - if (depsByKey.has(key)) schedule(depsByKey.get(key)); - target[key] = value; - return true; - }, - }); -} diff --git a/test/apps/circle.js b/test/apps/circle.js deleted file mode 100644 index 73c3824b..00000000 --- a/test/apps/circle.js +++ /dev/null @@ -1,5 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function circle() { - return cm.svg("svg", {children: [cm.svg("circle", {cx: 50, cy: 50, r: 50})]}).render(); -} diff --git a/test/apps/circleClick.js b/test/apps/circleClick.js deleted file mode 100644 index d5dfbccd..00000000 --- a/test/apps/circleClick.js +++ /dev/null @@ -1,22 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function circleClick() { - const state = cm.state({clicked: false}); - - const svg = cm.svg("svg", { - width: 100, - height: 100, - styleBackground: "black", - children: () => - cm.svg("circle", { - cx: 50, - cy: 50, - r: 40, - fill: state.clicked ? "red" : "white", - styleCursor: "pointer", - onClick: () => (state.clicked = !state.clicked), - }), - }); - - return svg.render(); -} diff --git a/test/apps/circleMoving.js b/test/apps/circleMoving.js deleted file mode 100644 index 97b90b35..00000000 --- a/test/apps/circleMoving.js +++ /dev/null @@ -1,21 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function circleMoving() { - const svg = cm.svg("svg", { - width: 200, - height: 50, - loop: true, - children: () => [ - cm.svg("circle", { - cx: Math.abs(Math.sin(Date.now() / 1000) * 200), - cy: 25, - r: 20, - stroke: "red", - strokeWidth: 4, - }), - ], - }); - return svg.render(); -} - -circleMoving.skip = true; diff --git a/test/apps/circles.js b/test/apps/circles.js deleted file mode 100644 index 14b4a74b..00000000 --- a/test/apps/circles.js +++ /dev/null @@ -1,18 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function circles() { - const data = Array.from({length: 5}, (_, i) => i); - const svg = cm.svg("svg", { - width: 30 * (data.length + 1), - height: 40, - children: [ - cm.svg("circle", data, { - cy: 20, - r: 10, - fill: (i) => (i % 2 ? "steelblue" : "orange"), - attrs: (i) => ({fill: "red", cx: (i + 1) * 30}), - }), - ], - }); - return svg.render(); -} diff --git a/test/apps/circlesMoving.js b/test/apps/circlesMoving.js deleted file mode 100644 index 11774dcc..00000000 --- a/test/apps/circlesMoving.js +++ /dev/null @@ -1,26 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function circlesMoving() { - const svg = cm.svg("svg", { - width: 200, - height: 250, - loop: true, - stroke: "red", - strokeWidth: 4, - children: () => [ - cm.svg("g", new Array(5), { - transform: (_, i) => `translate(0, ${i * 50})`, - children: () => [ - cm.svg("circle", { - cx: Math.abs(Math.sin(Date.now() / 1000) * 200), - cy: 25, - r: 20, - }), - ], - }), - ], - }); - return svg.render(); -} - -circlesMoving.skip = true; diff --git a/test/apps/groupCircles.js b/test/apps/groupCircles.js deleted file mode 100644 index b2a226de..00000000 --- a/test/apps/groupCircles.js +++ /dev/null @@ -1,24 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function groupCircles() { - const data = Array.from({length: 5}, (_, i) => i); - const svg = cm.svg("svg", { - width: 30 * (data.length + 1), - height: 90, - children: [ - cm.svg("g", data, { - transform: (i) => `translate(${(i + 1) * 30}, 20)`, - children: [cm.svg("circle", {r: 10, fill: "black"})], - }), - cm.svg("g", data, { - transform: (i) => `translate(${(i + 1) * 30}, 50)`, - children: [[cm.svg("circle", {r: 10, fill: "black"}), cm.svg("circle", {r: 5, fill: "white"})]], - }), - cm.svg("g", data, { - transform: (i) => `translate(${(i + 1) * 30}, 80)`, - children: (i) => [cm.svg("circle", {r: (i + 1) * 2, fill: "black"})], - }), - ], - }); - return svg.render(); -} diff --git a/test/apps/groupNested.js b/test/apps/groupNested.js deleted file mode 100644 index 86982c5b..00000000 --- a/test/apps/groupNested.js +++ /dev/null @@ -1,16 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function groupNested() { - const svg = cm.svg("svg", { - children: [ - cm.svg("g", { - children: [ - cm.svg("g", { - children: [cm.svg("circle", {cx: 50, cy: 50, r: 50})], - }), - ], - }), - ], - }); - return svg.render(); -} diff --git a/test/apps/index.js b/test/apps/index.js deleted file mode 100644 index 89ab7782..00000000 --- a/test/apps/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export {circle} from "./circle.js"; -export {circles} from "./circles.js"; -export {circleMoving} from "./circleMoving.js"; -export {groupCircles} from "./groupCircles.js"; -export {groupNested} from "./groupNested.js"; -export {circleClick} from "./circleClick.js"; -export {circlesMoving} from "./circlesMoving.js"; -export {textState} from "./textState.js"; diff --git a/test/apps/textState.js b/test/apps/textState.js deleted file mode 100644 index 320a333a..00000000 --- a/test/apps/textState.js +++ /dev/null @@ -1,31 +0,0 @@ -import * as cm from "../../src/index.js"; - -export function textState() { - const state = cm.state({count: 0, fill: "steelblue"}); - - setTimeout(() => { - state.count = 0; - }, 500); - - setTimeout(() => { - state.count = 1; - state.fill = "black"; - }, 1000); - - const svg = cm.svg("svg", { - width: 100, - height: 100, - children: () => { - console.log("update"); - return cm.svg("text", { - textContent: state.count, - fill: state.fill, - dy: "1em", - }); - }, - }); - - return svg.render(); -} - -textState.skip = true; diff --git a/test/dom.spec.js b/test/dom.spec.js new file mode 100644 index 00000000..7d1fe278 --- /dev/null +++ b/test/dom.spec.js @@ -0,0 +1,18 @@ +import {test, expect, vi} from "vitest"; +import {svg} from "../src/index.js"; + +test("svg(tag, options) should set events", () => { + const click = vi.fn(); + const root = svg("svg", {onclick: click}); + root.dispatchEvent(new Event("click")); + expect(click).toHaveBeenCalled(); +}); + +test("svg(tag, options) should pass datum to event handler", () => { + const click = vi.fn(); + const root = svg("svg", [1, 2, 3], {onclick: click}); + const el = root.children[0]; + const event = new Event("click"); + el.dispatchEvent(event); + expect(click).toHaveBeenCalledWith(event, 1, 0, [1, 2, 3]); +}); diff --git a/test/index.html b/test/index.html deleted file mode 100644 index 30ce1ffb..00000000 --- a/test/index.html +++ /dev/null @@ -1,76 +0,0 @@ - - diff --git a/test/mark.spec.js b/test/mark.spec.js deleted file mode 100644 index 0a4b7385..00000000 --- a/test/mark.spec.js +++ /dev/null @@ -1,47 +0,0 @@ -import {Mark, svg} from "../src/index.js"; -import {test, expect} from "vitest"; - -test("Mark should have expected defaults.", () => { - const mark = new Mark(); - expect(mark._children).toEqual([]); - expect(mark._data).toEqual([0]); - expect(mark._options).toEqual(undefined); - expect(mark._props).toEqual({}); - expect(mark._tag).toBe(undefined); - expect(mark._update).toBe(null); - expect(mark._nodes).toBe(null); - expect(mark._next).toBe(null); - expect(mark._groups).toBe(null); -}); - -test("Mark.clone should return a new Mark with the same properties", () => { - const mark = new Mark("svg:circle", [1, 2, 3], {cx: 0, cy: 0, r: 10}, []); - const cloned = mark.clone(); - expect(cloned).toBeInstanceOf(Mark); - expect(cloned._tag).toBe("svg:circle"); - expect(cloned._data).toEqual([1, 2, 3]); - expect(cloned._options).toEqual({cx: 0, cy: 0, r: 10}); - expect(cloned._children).toEqual([]); -}); - -test("Mark should pass expected params to Mark.render", () => { - class Test extends Mark { - create(tag, options, values, context) { - expect(tag).toBe("svg:circle"); - expect(options).toEqual({cx: 0, cy: 0, r: 10}); - expect(values).toEqual({datum: 0, i: 0, data: [0]}); - const {root, ...rest} = context; - expect(rest).toEqual({width: 100, height: 200}); - expect(root()).toBeInstanceOf(SVGSVGElement); - return super.create(tag, options, values, context); - } - } - - const root = svg("svg", { - width: 100, - height: 200, - children: [new Test("svg:circle", {cx: 0, cy: 0, r: 10})], - }); - - root.render(); -}); diff --git a/test/output/circle.svg b/test/output/circle.svg deleted file mode 100644 index 8b4fe50d..00000000 --- a/test/output/circle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/test/output/circleClick.svg b/test/output/circleClick.svg deleted file mode 100644 index d3fe590c..00000000 --- a/test/output/circleClick.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/test/output/circles.svg b/test/output/circles.svg deleted file mode 100644 index ecb3e9f8..00000000 --- a/test/output/circles.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/test/output/cloneDataDrivenChildren.html b/test/output/cloneDataDrivenChildren.html new file mode 100644 index 00000000..23d463cf --- /dev/null +++ b/test/output/cloneDataDrivenChildren.html @@ -0,0 +1,26 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/test/output/fragmentRoot.html b/test/output/fragmentRoot.html new file mode 100644 index 00000000..0826cb2b --- /dev/null +++ b/test/output/fragmentRoot.html @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/test/output/groupCircles.svg b/test/output/groupCircles.svg deleted file mode 100644 index b51a005c..00000000 --- a/test/output/groupCircles.svg +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/output/groupNested.svg b/test/output/groupNested.svg deleted file mode 100644 index fa8f607c..00000000 --- a/test/output/groupNested.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/test/output/htmlAttributes.html b/test/output/htmlAttributes.html new file mode 100644 index 00000000..570a7ebf --- /dev/null +++ b/test/output/htmlAttributes.html @@ -0,0 +1,13 @@ +