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/README.md b/README.md index 9930288d..3a9e1ea5 100644 --- a/README.md +++ b/README.md @@ -2,24 +2,40 @@ examples -> [!NOTE] -> The current next branch is implementing the new proposal API for production use. Please refer to the [main branch](https://github.com/charming-art/charming/tree/main) for the current release. +Charming is a JavaScript library for data-driven generative art that allows artists, designers, educators, and engineers to create expressive, accessible SVG graphics. -The JavaScript library for generative art based on SVG. +Charming’s API is inspired by data visualization grammar — systems like [AntV G2](https://g2.antv.antgroup.com/), [Observable Plot](https://observablehq.com/plot/) and [Vega-Lite](https://vega.github.io/vega-lite/) — where visuals are built from meaningful, composable units. By combining declarative structure with the power of SVG, Charming encourages a more thoughtful, expressive, inspectable and accessible approach to generative art. + +circles ```js import * as cm from "charmingjs"; -const svg = cm.svg("svg", { - width: 100, - height: 100, - children: [ - cm.svg("rect", {x: 0, y: 0, width: 100, height: 100, fill: "black"}), - cm.svg("circle", {cx: 50, cy: 50, r: 40, fill: "white"}), +function circles(x, y, r, data = []) { + if (r < 16) return; + data.push({x, y, r, depth}); + circles(x - r / 2, y, r * 0.5, data); + circles(x + r / 2, y, r * 0.5, data); + circles(x, y - r / 2, r * 0.5, data); + circles(x, y + r / 2, r * 0.5, data); + return data; +} + +const svg = cm.render({ + width: 480, + height: 480, + marks: [ + cm.svg("circle", circles(240, 240, 200), { + cx: (d) => d.x, + cy: (d) => d.y, + r: (d) => d.r, + stroke: "black", + fill: "transparent", + }), ], }); -document.body.appendChild(svg.render()); +document.body.appendChild(svg); ``` ## Resources 📚 diff --git a/docs/.vitepress/config.mjs b/docs/.vitepress/config.mjs index 994db324..46b8228f 100644 --- a/docs/.vitepress/config.mjs +++ b/docs/.vitepress/config.mjs @@ -28,13 +28,13 @@ export default defineConfig({ {text: "API Index", link: "/docs/api-index"}, ], }, - { - text: "Reference", - items: [ - {text: "Charming Mark", link: "/docs/charming-mark"}, - {text: "Charming Vector", link: "/docs/charming-vector"}, - ], - }, + // { + // text: "Reference", + // items: [ + // {text: "Charming Mark", link: "/docs/charming-mark"}, + // {text: "Charming Vector", link: "/docs/charming-vector"}, + // ], + // }, ], }, socialLinks: [{icon: "github", link: "https://github.com/charming-art/charming"}], diff --git a/docs/.vitepress/theme/index.js b/docs/.vitepress/theme/index.js index 6b466dbf..8118ffcf 100644 --- a/docs/.vitepress/theme/index.js +++ b/docs/.vitepress/theme/index.js @@ -6,57 +6,17 @@ import "d3-transition"; import * as cm from "../../../src/index.js"; import "./custom.css"; -const extended = { - random(min, max) { - return Math.random() * (max - min) + min; - }, - constrain(x, min, max) { - return Math.min(Math.max(x, min), max); - }, - transition(node, props) { - const {keyframes} = props; - const selection = selectAll([node]); - let transition = selection; - - for (const {duration, ease, delay, ...attr} of keyframes) { - transition = transition.transition(); - transition - .duration(duration) - .call((t) => ease && t.ease(ease)) - .call((t) => delay && t.delay(delay)); - for (const key in attr) { - if (key.startsWith("style")) { - const style = key.slice(5).toLowerCase(); - transition.style(style, attr[key]); - } else transition.attr(key, attr[key]); - } - } - - return node; - }, -}; - // More props: https://genji-md.dev/reference/props const props = { Theme: DefaultTheme, - library: {cm: {...cm, ...extended}}, + library: {cm}, transform: { module(code) { - let newCode = code - .replace("import {", "const {") - .replace(`from "charmingjs"`, "= cm") - .replace(`.render("#root")`, `.render(_root)`); - return `(() => { - const _root = document.createElement("div"); + const newCode = code.replace(`cm.render`, `return cm.render`); + const result = `(() => { ${newCode} - return _root; - })()`; - }, - replayable(code) { - return `(() => { - play; - return ${code}; })()`; + return result; }, }, }; diff --git a/docs/docs/api-index.md b/docs/docs/api-index.md index 82424dc2..ab287bb4 100644 --- a/docs/docs/api-index.md +++ b/docs/docs/api-index.md @@ -1,12 +1,115 @@ -# API Index +# API Reference -## [Charming Mark](/docs/charming-mark) +- [_cm_.**render**](/docs/api-index#cm-render) - render a SVG element. +- [_cm_.**renderMark**](/docs/api-index#cm-renderMark) - render a mark. +- [_cm_.**svg**](/docs/api-index#cm-svg) - create a SVG mark. +- [_cm_.**html**](/docs/api-index#cm-html) - create a HTML mark. +- [_cm_.**tag**](/docs/api-index#cm-tag) - create a new mark factory. +- [_mark_.**with**](/docs/api-index#mark-with) - append children to mark. -Creating SVG and HTML with pure function calls. +## _cm_.render(_options_) {#cm-render} -- [_cm_.**render**](/docs/charming-mark#render) - render a node. -- [_cm_.**svg**](/docs/charming-mark#svg) - create SVG elements with the specified attributes and child nodes. +```js eval t=module +cm.render({ + width: 200, + height: 100, + style_background: "black", + marks: [ + cm.svg("circle", { + cx: 100, + cy: 50, + r: 40, + fill: "white", + }), + ], +}); +``` -## [Charming Vector](/docs/charming-vector) +## _cm_.renderMark(_mark_) {#cm-renderMark} -> WIP +```js eval t=module +cm.renderMark( + cm.html("span", { + textContent: "Hello Charming.js", + style_color: "red", + }), +); +``` + +## _cm_.svg(_tag[, data[, options]]_) {#cm-svg} + +```js eval t=module +cm.render({ + width: 100, + height: 50, + marks: [ + cm.svg("circle", [1, 2, 3], { + cx: (d) => d * 30, + cy: 25, + r: 10, + }), + ], +}); +``` + +## _cm_.html(_tag[, data[, options]]_) {#cm-html} + +```js eval t=module +const table = [ + [11975, 5871, 8916, 2868], + [1951, 10048, 2060, 6171], + [8010, 16145, 8090, 8045], + [1013, 990, 940, 6907], +]; + +cm.renderMark( + cm.html("table").with([ + cm.html("tr", table).with([ + cm.html("td", (row) => row, { + textContent: (d) => d, + }), + ]), + ]), +); +``` + +## _cm_.tag(_namespace_) {#cm-tag} + +```js eval t=module +const math = cm.tag("http://www.w3.org/1998/Math/MathML"); + +cm.renderMark( + math("math").with([ + math("mrow").with([ + math("mrow").with([ + math("mi", {textContent: "x"}), + math("mo", {textContent: "∗"}), + math("mn", {textContent: "2"}), + ]), + math("mo", {textContent: "+"}), + math("mi", {textContent: "y"}), + ]), + ]), +); +``` + +## _mark_.with(_children_) {#mark-with} + +```js eval t=module +const svg = cm.svg; + +cm.render({ + width: 100, + height: 50, + marks: [ + svg("g", [1, 2, 3], { + transform: (d) => `translate(${d * 30},${25})`, + fill: "steelblue", + }).with([ + svg("circle", [1, 2, 3], { + r: 10, + }), + ]), + ], +}); +``` diff --git a/docs/docs/getting-started.md b/docs/docs/getting-started.md index 51af584f..578b714b 100644 --- a/docs/docs/getting-started.md +++ b/docs/docs/getting-started.md @@ -6,9 +6,9 @@ npm install charmingjs There are several way to using Charming. -## Try Online + ## Installing from Package Manager @@ -48,11 +48,11 @@ In vanilla HTML, Charming can be imported as an ES module, say from jsDelivr: ``` @@ -67,6 +67,6 @@ Charming is also available as a UMD bundle for legacy browsers. // ... }); - document.body.append(app.node()); + document.body.append(svg); ``` diff --git a/docs/docs/what-is-charming.md b/docs/docs/what-is-charming.md index 05098900..66be1f3d 100644 --- a/docs/docs/what-is-charming.md +++ b/docs/docs/what-is-charming.md @@ -1,136 +1,43 @@ # What is Charming? -**Charming** (or **Charming.js**) is a free, open-source JavaScript library that creates animated and interactive SVG. Charming lets you create dynamic and expressive generative art and visualizations effortlessly. Here's a quick example that give you a sense of Charming: - -```js eval t=module -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, - }), - ], -}); - -svg.render("#root"); -``` - -## Based on SVG - -Charming provides a _svg_ function for creating SVG elements. For example, to create a white circle on a black background: - -```js eval t=module -const svg = cm.svg("svg", { - width: 100, - height: 100, - children: [ - cm.svg("rect", {x: 0, y: 0, width: 100, height: 100, fill: "black"}), - cm.svg("circle", {cx: 50, cy: 50, r: 40, fill: "white"}), - ], -}); - -svg.render("#root"); +**Charming** is a JavaScript library for data-driven generative art that allows artists, designers, educators, and engineers to create expressive, accessible SVG graphics. + +Charming’s API is inspired by data visualization grammar — systems like [AntV G2](https://g2.antv.antgroup.com/), [Observable Plot](https://observablehq.com/plot/) and [Vega-Lite](https://vega.github.io/vega-lite/) — where visuals are built from meaningful, composable units. By combining declarative structure with the power of SVG, Charming encourages a more thoughtful, expressive, inspectable and accessible approach to generative art. + +For example, let's first define a function to generate circles recursively: + +```js eval inspector=false +function circles(x, y, r, data = []) { + if (r < 16) return; + data.push({x, y, r}); + circles(x - r / 2, y, r * 0.5, data); + circles(x + r / 2, y, r * 0.5, data); + circles(x, y - r / 2, r * 0.5, data); + circles(x, y + r / 2, r * 0.5, data); + return data; +} ``` -Please refer to [Charming Mark](/docs/charming-mark) for more information. - -## Fluid Transition - -Charming makes it easier than ever to create fluid transitions. The exported _transition_ decorators lets you apply transitions declaratively to child nodes, whether SVG or HTML. For example, you can create a circle that smoothly change colors and radius over time. +Then call the function to generate circles: -```js eval code=false -play = Inputs.button("Replay"); +```js eval +const data = circles(240, 240, 200); ``` -```js eval t=module,replayable -const svg = cm.svg("svg", { - width: 100, - height: 100, - use: {transition: cm.transition}, - children: [ - cm.svg("rect", {x: 0, y: 0, width: 100, height: 100, fill: "black"}), - cm.svg("circle", { - cx: 50, - cy: 50, - r: 40, - fill: "#4B68C9", - transition: { - keyframes: [ - {fill: "#E5B442", r: 0, duration: 1000}, - {fill: "#EE7A64", r: 40, duration: 2000}, - ], - }, +Finally draw or visualize the data with Charming's declarative API: + +```js eval +cm.render({ + width: 480, + height: 480, + marks: [ + cm.svg("circle", data, { + cx: (d) => d.x, + cy: (d) => d.y, + r: (d) => d.r, + stroke: "black", + fill: "transparent", }), ], }); - -svg.render("#root"); ``` - -## Incremental Updates - -Work in progress. - -```js eval t=module -const width = 600; -const height = 150; -let x = width / 2; -let y = height / 2; - -const svg = cm.svg("svg", { - width: 600, - height: 150, - loop: true, - children: () => { - x += cm.random(-1, 1); - y += cm.random(-1, 1); - x = cm.constrain(x, 0, width); - y = cm.constrain(y, 0, height); - return [cm.svg("circle", {cx: x, cy: y, fill: "black", r: 20})]; - }, -}); - -svg.render("#root"); -``` - -## Reactivity for Interaction - -```js eval t=module -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), - }), - ], -}); - -svg.render("#root"); -``` - -## A Collection of Tools - -Charming provides a set of modular tools that you can use together or independently. For example, - -- [Charming Mark](/docs/charming-mark) - Creating SVG and HTML with pure function calls. -- [Charming Vector](/docs/charming-vector) - Manipulating Euclidean vector. -- ... - -## Built on and learn with D3 - -Charming is built with D3 and integrates seamlessly with it. It simplifies D3's complexity, making it more accessible and easier to learn. diff --git a/docs/index.md b/docs/index.md index 0cae7294..18ff9cb6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,8 +3,8 @@ layout: home hero: name: Charming - text: A JavaScript library for generative art based on SVG - tagline: Craft expressive generative art with minimal effort or explore the most fun way to learn SVG + text: A JavaScript library for data-driven generative art + tagline: Create expressive, accessible SVG graphics with declarative code and creative flexibility image: src: /logo.svg alt: Charming @@ -17,10 +17,10 @@ hero: link: /docs/what-is-charming features: - - title: Based on SVG - details: TODO - - title: Fluid Transition - details: TODO - - title: Incremental Updates - details: TODO + - title: Declarative API + details: Inspired by visualization grammar, such as AntV G2, Vega and Observable Plot, where visuals are built from meaningful, composable units. + - title: Native SVG Power + details: "Leverage the full potential of SVG: crisp rendering, accessible structure, and smooth integration with design tools." + - title: Lightweight and Modular + details: Charming is a collection of lightweight tools focused on modularity, which can be used independently or work with D3 and p5.js. --- diff --git a/img/circles.png b/img/circles.png new file mode 100644 index 00000000..251e3b0f Binary files /dev/null and b/img/circles.png differ diff --git a/package.json b/package.json index d83680a6..b325d865 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ ], "scripts": { "dev": "vite", + "test:update": "vitest --update", "test": "npm run test:js && npm run test:lint && npm run test:format", "test:js": "vitest", "test:lint": "eslint src test", @@ -31,10 +32,6 @@ "docs:preview": "vitepress preview docs", "prepublishOnly": "rm -rf dist && rollup -c" }, - "dependencies": { - "charmingjs-vector": "^0.0.3", - "d3-timer": "^3.0.1" - }, "devDependencies": { "@rollup/plugin-node-resolve": "^15.3.1", "@rollup/plugin-terser": "^0.4.4", @@ -46,10 +43,10 @@ "js-beautify": "^1.15.4", "jsdom": "^26.1.0", "prettier": "^3.5.3", - "rollup": "^4.40.0", - "vite": "^6.3.3", + "rollup": "^4.43.0", + "vite": "^6.3.5", "vitepress": "^1.6.3", - "vitest": "^3.1.2" + "vitest": "^3.2.3" }, "publishConfig": { "access": "public" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fceeb9a7..63610364 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,20 +7,13 @@ settings: importers: .: - dependencies: - 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.43.0) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.40.0) + version: 0.4.4(rollup@4.43.0) d3-selection: specifier: ^3.0.0 version: 3.0.0 @@ -35,7 +28,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.5)(search-insights@2.17.2)(terser@5.42.0)(typescript@5.8.3))(vue@3.5.16(typescript@5.8.3)) js-beautify: specifier: ^1.15.4 version: 1.15.4 @@ -46,17 +39,17 @@ importers: specifier: ^3.5.3 version: 3.5.3 rollup: - specifier: ^4.40.0 - version: 4.40.0 + specifier: ^4.43.0 + version: 4.43.0 vite: - specifier: ^6.3.3 - version: 6.3.3(terser@5.39.0) + specifier: ^6.3.5 + version: 6.3.5(terser@5.42.0)(yaml@2.8.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.5)(search-insights@2.17.2)(terser@5.42.0)(typescript@5.8.3) vitest: - specifier: ^3.1.2 - version: 3.1.2(jsdom@26.1.0)(terser@5.39.0) + specifier: ^3.2.3 + version: 3.2.3(@types/debug@4.1.12)(jsdom@26.1.0)(terser@5.42.0)(yaml@2.8.0) packages: @@ -80,104 +73,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 +202,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 +214,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 +226,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 +238,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 +250,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 +262,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 +274,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 +286,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 +298,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 +310,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 +322,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 +334,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 +346,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 +358,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 +370,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 +382,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 +394,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 +412,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 +430,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 +442,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 +454,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 +466,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 +478,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 +515,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 +599,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.43.0': + resolution: {integrity: sha512-Krjy9awJl6rKbruhQDgivNbD1WuLb8xAclM4IR4cN5pHGAs2oIMMQJEiC3IC/9TZJ+QZkmZhlMO/6MBGxPidpw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.43.0': + resolution: {integrity: sha512-ss4YJwRt5I63454Rpj+mXCXicakdFmKnUNxr1dLK+5rv5FJgAxnN7s31a5VchRYxCFWdmnDWKd0wbAdTr0J5EA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.43.0': + resolution: {integrity: sha512-eKoL8ykZ7zz8MjgBenEF2OoTNFAPFz1/lyJ5UmmFSz5jW+7XbH1+MAgCVHy72aG59rbuQLcJeiMrP8qP5d/N0A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.43.0': + resolution: {integrity: sha512-SYwXJgaBYW33Wi/q4ubN+ldWC4DzQY62S4Ll2dgfr/dbPoF50dlQwEaEHSKrQdSjC6oIe1WgzosoaNoHCdNuMg==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.43.0': + resolution: {integrity: sha512-SV+U5sSo0yujrjzBF7/YidieK2iF6E7MdF6EbYxNz94lA+R0wKl3SiixGyG/9Klab6uNBIqsN7j4Y/Fya7wAjQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.43.0': + resolution: {integrity: sha512-J7uCsiV13L/VOeHJBo5SjasKiGxJ0g+nQTrBkAsmQBIdil3KhPnSE9GnRon4ejX1XDdsmK/l30IYLiAaQEO0Cg==} 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.43.0': + resolution: {integrity: sha512-gTJ/JnnjCMc15uwB10TTATBEhK9meBIY+gXP4s0sHD1zHOaIh4Dmy1X9wup18IiY9tTNk5gJc4yx9ctj/fjrIw==} 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.43.0': + resolution: {integrity: sha512-ZJ3gZynL1LDSIvRfz0qXtTNs56n5DI2Mq+WACWZ7yGHFUEirHBRt7fyIk0NsCKhmRhn7WAcjgSkSVVxKlPNFFw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.43.0': + resolution: {integrity: sha512-8FnkipasmOOSSlfucGYEu58U8cxEdhziKjPD2FIa0ONVMxvl/hmONtX/7y4vGjdUhjcTHlKlDhw3H9t98fPvyA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.43.0': + resolution: {integrity: sha512-KPPyAdlcIZ6S9C3S2cndXDkV0Bb1OSMsX0Eelr2Bay4EsF9yi9u9uzc9RniK3mcUGCLhWY9oLr6er80P5DE6XA==} 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.43.0': + resolution: {integrity: sha512-HPGDIH0/ZzAZjvtlXj6g+KDQ9ZMHfSP553za7o2Odegb/BEfwJcR0Sw0RLNpQ9nC6Gy8s+3mSS9xjZ0n3rhcYg==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': + resolution: {integrity: sha512-gEmwbOws4U4GLAJDhhtSPWPXUzDfMRedT3hFMyRAvM9Mrnj+dJIFIeL7otsv2WF3D7GrV0GIewW0y28dOYWkmw==} 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.43.0': + resolution: {integrity: sha512-XXKvo2e+wFtXZF/9xoWohHg+MuRnvO29TI5Hqe9xwN5uN8NKUYy7tXUG3EZAlfchufNCTHNGjEx7uN78KsBo0g==} 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.43.0': + resolution: {integrity: sha512-ruf3hPWhjw6uDFsOAzmbNIvlXFXlBQ4nk57Sec8E8rUxs/AI4HD6xmiiasOOx/3QxS2f5eQMKTAwk7KHwpzr/Q==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.43.0': + resolution: {integrity: sha512-QmNIAqDiEMEvFV15rsSnjoSmO0+eJLoKRD9EAa9rrYNwO/XRCtOGM3A5A0X+wmG+XRrw9Fxdsw+LnyYiZWWcVw==} 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.43.0': + resolution: {integrity: sha512-jAHr/S0iiBtFyzjhOkAics/2SrXE092qyqEg96e90L3t9Op8OTzS6+IX0Fy5wCt2+KqeHAkti+eitV0wvblEoQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.43.0': + resolution: {integrity: sha512-3yATWgdeXyuHtBhrLt98w+5fKurdqvs8B53LaoKD7P7H7FKOONLsBVMNl9ghPQZQuYcceV5CDyPfyfGpMWD9mQ==} 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.43.0': + resolution: {integrity: sha512-wVzXp2qDSCOpcBCT5WRWLmpJRIzv23valvcTwMHEobkjippNf+C3ys/+wf07poPkeNix0paTNemB2XrHr2TnGw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.43.0': + resolution: {integrity: sha512-fYCTEyzf8d+7diCw8b+asvWDCLMjsCEA8alvtAutqJOJp/wL5hs1rWSqJ1vkjgW0L2NB4bsYJrpKkiIPRR9dvw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.43.0': + resolution: {integrity: sha512-SnGhLiE5rlK0ofq8kzuDkM0g7FN1s5VYY+YSMTibP7CqShxCQvqtNxTARS4xX4PFJfHjG0ZQYX9iGzI3FQh5Aw==} cpu: [x64] os: [win32] @@ -730,9 +723,21 @@ 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/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@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==} @@ -748,6 +753,9 @@ packages: '@types/mdurl@2.0.0': resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -760,79 +768,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.3': + resolution: {integrity: sha512-W2RH2TPWVHA1o7UmaFKISPvdicFJH+mjykctJFoAkUw+SPTJTGjUNdKscFBrqM7IPnCVu6zihtKYa7TkZS1dkQ==} - '@vitest/mocker@3.1.2': - resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} + '@vitest/mocker@3.2.3': + resolution: {integrity: sha512-cP6fIun+Zx8he4rbWvi+Oya6goKQDZK+Yq4hhlggwQBbrlOQ4qtZ+G4nxB6ZnzI9lyIb+JnvyiJnPC2AGbKSPA==} 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.3': + resolution: {integrity: sha512-yFglXGkr9hW/yEXngO+IKMhP0jxyFw2/qys/CK4fFUZnSltD+MU7dVYGrH8rvPcK/O6feXQA+EU33gjaBBbAng==} - '@vitest/runner@3.1.2': - resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} + '@vitest/runner@3.2.3': + resolution: {integrity: sha512-83HWYisT3IpMaU9LN+VN+/nLHVBCSIUKJzGxC5RWUOsK1h3USg7ojL+UXQR3b4o4UBIWCYdD2fxuzM7PQQ1u8w==} - '@vitest/snapshot@3.1.2': - resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} + '@vitest/snapshot@3.2.3': + resolution: {integrity: sha512-9gIVWx2+tysDqUmmM1L0hwadyumqssOL1r8KJipwLx5JVYyxvVRfxvMq7DaWbZZsCqZnu/dZedaZQh4iYTtneA==} - '@vitest/spy@3.1.2': - resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} + '@vitest/spy@3.2.3': + resolution: {integrity: sha512-JHu9Wl+7bf6FEejTCREy+DmgWe+rQKbK+y32C/k5f4TBIAlijhJbRBIRIOCEpVevgRsCQR2iHRUH2/qKVM/plw==} - '@vitest/utils@3.1.2': - resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} + '@vitest/utils@3.2.3': + resolution: {integrity: sha512-4zFBCU5Pf+4Z6v+rwnZ1HU1yzOKKvDkMXZrymE2PBlbjKJRlrOxbvpfPSvJTGRIwGoahaOGvp+kbCoxifhzJ1Q==} - '@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 +901,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 +913,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: @@ -938,11 +946,11 @@ packages: birpc@2.3.0: resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -972,9 +980,6 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - charmingjs-vector@0.0.3: - resolution: {integrity: sha512-7nvY6XOgjErbj5M0hJzNCdjkFCF5JfWNp6wFyqVYPAGrK2hd78hr5GL8bHAUsZomH+eE9Co2AgBw24cwwQu+bg==} - check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -1010,8 +1015,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 +1056,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 +1111,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 +1123,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 +1199,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.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1217,8 +1222,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==} @@ -1373,6 +1378,9 @@ packages: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1543,12 +1551,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.5: + resolution: {integrity: sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.9: + resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -1559,8 +1567,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 +1613,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.43.0: + resolution: {integrity: sha512-wdN2Kd3Twh8MAEOEJZsuxuLKCsBEo4PVNLK6tQWAn10VhsVewQLzcucMgLolRlhFybGxfclbPeEYBaP6RvUFGg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -1629,8 +1637,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 @@ -1705,6 +1713,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + superjson@2.2.2: resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==} engines: {node: '>=16'} @@ -1723,8 +1734,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - terser@5.39.0: - resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} + terser@5.42.0: + resolution: {integrity: sha512-UYCvU9YQW2f/Vwl+P0GfhxJxbUGLwd+5QrrGgLajzWAtC/23AX0vcise32kkP7Eu0Wu9VlzzHAXkLObgjQfFlQ==} engines: {node: '>=10'} hasBin: true @@ -1737,20 +1748,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: @@ -1779,6 +1790,11 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} @@ -1803,13 +1819,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.3: + resolution: {integrity: sha512-gc8aAifGuDIpZHrPjuHyP4dpQmYXqWw7D1GmDnWeNWP654UEXzVfQ5IHPSK5HaHkwB/+p1atpYpSdw/2kOv8iQ==} 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 +1855,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 +1907,16 @@ packages: postcss: optional: true - vitest@3.1.2: - resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} + vitest@3.2.3: + resolution: {integrity: sha512-E6U2ZFXe3N/t4f5BwUaVCKRLHqUpk1CBWeMh78UT4VaTPH/2dyvH6ALl29JTovEPu9dVKr/K/J4PkXgrMbw4Ww==} 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.3 + '@vitest/ui': 3.2.3 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -1919,8 +1935,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 +1988,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 @@ -1991,6 +2007,11 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} + hasBin: true + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2000,158 +2021,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.9 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -2159,12 +2180,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 +2194,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 +2345,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 +2361,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 +2370,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 +2433,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.43.0)': dependencies: - '@rollup/pluginutils': 5.1.4(rollup@4.40.0) + '@rollup/pluginutils': 5.1.4(rollup@4.43.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.43.0 - '@rollup/plugin-terser@0.4.4(rollup@4.40.0)': + '@rollup/plugin-terser@0.4.4(rollup@4.43.0)': dependencies: serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.39.0 + terser: 5.42.0 optionalDependencies: - rollup: 4.40.0 + rollup: 4.43.0 - '@rollup/pluginutils@5.1.4(rollup@4.40.0)': + '@rollup/pluginutils@5.1.4(rollup@4.43.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.43.0 - '@rollup/rollup-android-arm-eabi@4.40.0': + '@rollup/rollup-android-arm-eabi@4.43.0': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@rollup/rollup-android-arm64@4.43.0': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@rollup/rollup-darwin-arm64@4.43.0': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@rollup/rollup-darwin-x64@4.43.0': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@rollup/rollup-freebsd-arm64@4.43.0': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@rollup/rollup-freebsd-x64@4.43.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@rollup/rollup-linux-arm-gnueabihf@4.43.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@rollup/rollup-linux-arm-musleabihf@4.43.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@rollup/rollup-linux-arm64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@rollup/rollup-linux-arm64-musl@4.43.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@rollup/rollup-linux-loongarch64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.43.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@rollup/rollup-linux-riscv64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@rollup/rollup-linux-riscv64-musl@4.43.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@rollup/rollup-linux-s390x-gnu@4.43.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@rollup/rollup-linux-x64-gnu@4.43.0': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@rollup/rollup-linux-x64-musl@4.43.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@rollup/rollup-win32-arm64-msvc@4.43.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@rollup/rollup-win32-ia32-msvc@4.43.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@rollup/rollup-win32-x64-msvc@4.43.0': optional: true '@shikijs/core@2.5.0': @@ -2538,8 +2559,21 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + optional: true + + '@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 @@ -2557,6 +2591,9 @@ snapshots: '@types/mdurl@2.0.0': {} + '@types/ms@2.1.0': + optional: true + '@types/resolve@1.20.2': {} '@types/unist@3.0.3': {} @@ -2565,88 +2602,90 @@ 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.42.0))(vue@3.5.16(typescript@5.8.3))': dependencies: - vite: 5.4.18(terser@5.39.0) - vue: 3.5.13 + vite: 5.4.19(terser@5.42.0) + vue: 3.5.16(typescript@5.8.3) - '@vitest/expect@3.1.2': + '@vitest/expect@3.2.3': dependencies: - '@vitest/spy': 3.1.2 - '@vitest/utils': 3.1.2 + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 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.3(vite@6.3.5(terser@5.42.0)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.1.2 + '@vitest/spy': 3.2.3 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.42.0)(yaml@2.8.0) - '@vitest/pretty-format@3.1.2': + '@vitest/pretty-format@3.2.3': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.2': + '@vitest/runner@3.2.3': dependencies: - '@vitest/utils': 3.1.2 + '@vitest/utils': 3.2.3 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.1.2': + '@vitest/snapshot@3.2.3': dependencies: - '@vitest/pretty-format': 3.1.2 + '@vitest/pretty-format': 3.2.3 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.2': + '@vitest/spy@3.2.3': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/utils@3.1.2': + '@vitest/utils@3.2.3': dependencies: - '@vitest/pretty-format': 3.1.2 + '@vitest/pretty-format': 3.2.3 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.5 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,68 +2693,68 @@ 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(typescript@5.8.3))': 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(typescript@5.8.3) - '@vue/shared@3.5.13': {} + '@vue/shared@3.5.16': {} - '@vueuse/core@12.8.2': + '@vueuse/core@12.8.2(typescript@5.8.3)': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 - '@vueuse/shared': 12.8.2 - vue: 3.5.13 + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.16(typescript@5.8.3) transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.4)': + '@vueuse/integrations@12.8.2(focus-trap@7.6.5)(typescript@5.8.3)': dependencies: - '@vueuse/core': 12.8.2 - '@vueuse/shared': 12.8.2 - vue: 3.5.13 + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.16(typescript@5.8.3) optionalDependencies: - focus-trap: 7.6.4 + focus-trap: 7.6.5 transitivePeerDependencies: - typescript '@vueuse/metadata@12.8.2': {} - '@vueuse/shared@12.8.2': + '@vueuse/shared@12.8.2(typescript@5.8.3)': dependencies: - vue: 3.5.13 + vue: 3.5.16(typescript@5.8.3) 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 +2765,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: {} @@ -2760,12 +2799,12 @@ snapshots: birpc@2.3.0: {} - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -2794,8 +2833,6 @@ snapshots: character-entities-legacy@3.0.0: {} - charmingjs-vector@0.0.3: {} - check-error@2.1.1: {} color-convert@2.0.1: @@ -2827,9 +2864,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 +2899,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 +2928,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 +2938,7 @@ snapshots: entities@4.5.0: {} - entities@6.0.0: {} + entities@6.0.1: {} es-module-lexer@1.7.0: {} @@ -2931,33 +2968,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 +3011,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 +3022,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 +3054,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 +3074,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -3053,7 +3090,7 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -3074,7 +3111,7 @@ snapshots: flatted@3.3.3: {} - focus-trap@7.6.4: + focus-trap@7.6.5: dependencies: tabbable: 6.2.0 @@ -3097,11 +3134,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.5)(search-insights@2.17.2)(terser@5.42.0)(typescript@5.8.3))(vue@3.5.16(typescript@5.8.3)): 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.5)(search-insights@2.17.2)(terser@5.42.0)(typescript@5.8.3) + vue: 3.5.16(typescript@5.8.3) glob-parent@6.0.2: dependencies: @@ -3146,7 +3183,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 +3205,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 @@ -3241,13 +3278,15 @@ snapshots: js-cookie@3.0.5: {} + js-tokens@9.0.1: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 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 +3304,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 @@ -3334,15 +3373,15 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@9.0.1: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minipass@7.1.2: {} @@ -3397,7 +3436,7 @@ snapshots: parse5@7.3.0: dependencies: - entities: 6.0.0 + entities: 6.0.1 path-exists@4.0.0: {} @@ -3422,19 +3461,19 @@ snapshots: picomatch@4.0.2: {} - postcss@8.5.3: + postcss@8.5.5: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.5: {} + preact@10.26.9: {} 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 +3511,30 @@ snapshots: dependencies: glob: 7.2.3 - rollup@4.40.0: + rollup@4.43.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.43.0 + '@rollup/rollup-android-arm64': 4.43.0 + '@rollup/rollup-darwin-arm64': 4.43.0 + '@rollup/rollup-darwin-x64': 4.43.0 + '@rollup/rollup-freebsd-arm64': 4.43.0 + '@rollup/rollup-freebsd-x64': 4.43.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.43.0 + '@rollup/rollup-linux-arm-musleabihf': 4.43.0 + '@rollup/rollup-linux-arm64-gnu': 4.43.0 + '@rollup/rollup-linux-arm64-musl': 4.43.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.43.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-gnu': 4.43.0 + '@rollup/rollup-linux-riscv64-musl': 4.43.0 + '@rollup/rollup-linux-s390x-gnu': 4.43.0 + '@rollup/rollup-linux-x64-gnu': 4.43.0 + '@rollup/rollup-linux-x64-musl': 4.43.0 + '@rollup/rollup-win32-arm64-msvc': 4.43.0 + '@rollup/rollup-win32-ia32-msvc': 4.43.0 + '@rollup/rollup-win32-x64-msvc': 4.43.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -3514,7 +3553,7 @@ snapshots: search-insights@2.17.2: {} - semver@7.7.1: {} + semver@7.7.2: {} serialize-javascript@6.0.2: dependencies: @@ -3587,6 +3626,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + superjson@2.2.2: dependencies: copy-anything: 3.0.5 @@ -3601,10 +3644,10 @@ snapshots: tabbable@6.2.0: {} - terser@5.39.0: + terser@5.42.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 +3657,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.6(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: {} @@ -3647,6 +3690,9 @@ snapshots: type-fest@0.20.2: {} + typescript@5.8.3: + optional: true + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.3 @@ -3684,13 +3730,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.3(terser@5.42.0)(yaml@2.8.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.42.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -3705,49 +3751,50 @@ snapshots: - tsx - yaml - vite@5.4.18(terser@5.39.0): + vite@5.4.19(terser@5.42.0): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.40.0 + postcss: 8.5.5 + rollup: 4.43.0 optionalDependencies: fsevents: 2.3.3 - terser: 5.39.0 + terser: 5.42.0 - vite@6.3.3(terser@5.39.0): + vite@6.3.5(terser@5.42.0)(yaml@2.8.0): dependencies: - esbuild: 0.25.3 - fdir: 6.4.4(picomatch@4.0.2) + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.40.0 - tinyglobby: 0.2.13 + postcss: 8.5.5 + rollup: 4.43.0 + tinyglobby: 0.2.14 optionalDependencies: fsevents: 2.3.3 - terser: 5.39.0 + terser: 5.42.0 + yaml: 2.8.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.5)(search-insights@2.17.2)(terser@5.42.0)(typescript@5.8.3): 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 - '@vueuse/core': 12.8.2 - '@vueuse/integrations': 12.8.2(focus-trap@7.6.4) - focus-trap: 7.6.4 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(terser@5.42.0))(vue@3.5.16(typescript@5.8.3)) + '@vue/devtools-api': 7.7.6 + '@vue/shared': 3.5.16 + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/integrations': 12.8.2(focus-trap@7.6.5)(typescript@5.8.3) + 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.42.0) + vue: 3.5.16(typescript@5.8.3) optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.5 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -3775,30 +3822,33 @@ snapshots: - typescript - universal-cookie - vitest@3.1.2(jsdom@26.1.0)(terser@5.39.0): + vitest@3.2.3(@types/debug@4.1.12)(jsdom@26.1.0)(terser@5.42.0)(yaml@2.8.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.3 + '@vitest/mocker': 3.2.3(vite@6.3.5(terser@5.42.0)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.3 + '@vitest/runner': 3.2.3 + '@vitest/snapshot': 3.2.3 + '@vitest/spy': 3.2.3 + '@vitest/utils': 3.2.3 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.42.0)(yaml@2.8.0) + vite-node: 3.2.3(terser@5.42.0)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.12 jsdom: 26.1.0 transitivePeerDependencies: - jiti @@ -3814,13 +3864,15 @@ snapshots: - tsx - yaml - vue@3.5.13: + vue@3.5.16(typescript@5.8.3): 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(typescript@5.8.3)) + '@vue/shared': 3.5.16 + optionalDependencies: + typescript: 5.8.3 w3c-xmlserializer@5.0.0: dependencies: @@ -3864,12 +3916,15 @@ snapshots: wrappy@1.0.2: {} - ws@8.18.1: {} + ws@8.18.2: {} xml-name-validator@5.0.0: {} xmlchars@2.2.0: {} + yaml@2.8.0: + optional: true + yocto-queue@0.1.0: {} zwitch@2.0.4: {} diff --git a/src/dom.js b/src/dom.js new file mode 100644 index 00000000..bad27cb2 --- /dev/null +++ b/src/dom.js @@ -0,0 +1,95 @@ +const propSetterCache = {}; + +const protoOf = Object.getPrototypeOf; + +const isFunc = (x) => typeof x === "function"; + +const isStr = (x) => typeof x === "string"; + +const isObjectLiteral = (x) => Object.prototype.toString.call(x) === "[object Object]"; + +const rename = (obj, oldKey, newKey) => (oldKey in obj ? ((obj[newKey] = obj[oldKey]), delete obj[oldKey], obj) : obj); + +function postprocess(nodes) { + if (!nodes) return null; + if (nodes.length === 1) return nodes[0]; + const fragment = document.createDocumentFragment(); + fragment.append(...nodes); + 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); +} + +class Mark { + constructor(ns, tag, data, options) { + if (isObjectLiteral(data)) (options = data), (data = undefined); + this._ns = ns; + this._tag = tag; + this._data = data; + this._options = options; + } + clone() { + return new Mark(this._ns, this._tag, this._data, this._options); + } + with(children) { + this._options = {...this._options, children}; + return this; + } +} + +function renderNodes(mark) { + const {_ns: ns, _tag: tag, _data: data = [undefined], _options: options = {}} = mark; + if (!isStr(tag)) return null; + 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); + } + return dom; + }); + for (const child of children.filter(Boolean).flat(Infinity)) { + if (child._data) { + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + const datum = data[i]; + const childData = child._data; + const clonedChild = child.clone(); + clonedChild._data = isFunc(childData) ? childData(datum, i, data) : childData; + const childNodes = renderNodes(clonedChild); + node.append(...childNodes); + } + } else { + const clonedChild = child.clone(); + clonedChild._data = data; + const childNodes = renderNodes(clonedChild); + for (let i = 0; i < nodes.length; i++) nodes[i].append(childNodes[i]); + } + } + return nodes; +} + +export const renderMark = (mark) => postprocess(renderNodes(mark)); + +export const render = (options) => renderMark(svg("svg", rename(options, "marks", "children"))); + +export const tag = (ns) => (tag, data, options) => new Mark(ns, tag, data, options); + +export const svg = tag("http://www.w3.org/2000/svg"); + +export const html = tag(null); diff --git a/src/index.js b/src/index.js index 90745697..8f623a73 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1 @@ -export {state} from "./state.js"; -export {constrain} from "./math.js"; -export {Mark, svg, html} from "./mark.js"; -export {Renderer} from "./renderer.js"; -export * from "charmingjs-vector"; +export {svg, html, tag, render, renderMark} from "./dom.js"; 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..64e3de3b --- /dev/null +++ b/test/dom.spec.js @@ -0,0 +1,18 @@ +import {test, expect, vi} from "vitest"; +import {svg, renderMark} from "../src/index.js"; + +test("svg(tag, options) should set events", () => { + const click = vi.fn(); + const root = renderMark(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 = renderMark(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/index.spec.js b/test/index.spec.js deleted file mode 100644 index 78b69eb0..00000000 --- a/test/index.spec.js +++ /dev/null @@ -1,9 +0,0 @@ -import * as cm from "../src/index.js"; -import * as cmVector from "charmingjs-vector"; -import {test, expect} from "vitest"; - -test("cm should have expected exports", () => { - for (const [key, value] of Object.entries(cmVector)) { - expect(cm[key]).toBe(value); - } -}); 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 @@ +