diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 2e94ce0e..ac478a2e 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -13,7 +13,7 @@ jobs: name: 'Playwright Tests' runs-on: ubuntu-latest container: - image: mcr.microsoft.com/playwright:v1.45.0-jammy + image: mcr.microsoft.com/playwright:v1.51.1-jammy steps: - name: Checkout repo uses: actions/checkout@v4 diff --git a/examples/astro-xyflow/src/env.d.ts b/examples/astro-xyflow/src/env.d.ts index f964fe0c..acef35f1 100644 --- a/examples/astro-xyflow/src/env.d.ts +++ b/examples/astro-xyflow/src/env.d.ts @@ -1 +1,2 @@ +/// /// diff --git a/examples/react/package.json b/examples/react/package.json index 31099a74..981f2054 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -7,6 +7,7 @@ "dev": "vite --port 3000 --open --host", "serve": "vite serve --port 3000", "build": "vite build", + "preview": "vite preview", "test:dev": "cypress open", "test": "pnpm test-component && pnpm test-e2e", "test-component": "cypress run --component", diff --git a/examples/react/src/generic-tests/edges/general.ts b/examples/react/src/generic-tests/edges/general.ts index 3daceec8..d00c57cc 100644 --- a/examples/react/src/generic-tests/edges/general.ts +++ b/examples/react/src/generic-tests/edges/general.ts @@ -4,6 +4,7 @@ export default { flowProps: { fitView: true, multiSelectionKeyCode: 's', + deleteKeyCode: 'd', nodes: [ { id: '1', diff --git a/examples/react/src/generic-tests/nodes/general.ts b/examples/react/src/generic-tests/nodes/general.ts index d45091dd..c8fb744a 100644 --- a/examples/react/src/generic-tests/nodes/general.ts +++ b/examples/react/src/generic-tests/nodes/general.ts @@ -3,6 +3,8 @@ import DragHandleNode from './components/DragHandleNode'; export default { flowProps: { fitView: true, + deleteKeyCode: 'd', + multiSelectionKeyCode: 's', nodeTypes: { DragHandleNode, }, diff --git a/examples/svelte/package.json b/examples/svelte/package.json index cfd2ecea..feeb3b7e 100644 --- a/examples/svelte/package.json +++ b/examples/svelte/package.json @@ -12,25 +12,25 @@ "format": "prettier --plugin-search-dir . --write ." }, "devDependencies": { - "@sveltejs/adapter-auto": "^3.2.1", - "@sveltejs/kit": "^2.5.10", - "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-svelte": "^2.35.0", - "prettier": "^3.0.3", - "prettier-plugin-svelte": "^3.0.3", - "svelte": "^4.2.12", - "svelte-check": "^3.6.6", - "tslib": "^2.6.2", - "typescript": "^5.4.5", - "vite": "^5.2.12" + "@sveltejs/adapter-auto": "^6.0.0", + "@sveltejs/kit": "^2.20.7", + "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/parser": "^8.30.1", + "eslint": "^9.24.0", + "eslint-config-prettier": "^10.1.2", + "eslint-plugin-svelte": "^3.5.1", + "prettier": "^3.5.3", + "prettier-plugin-svelte": "^3.3.3", + "svelte": "^5.27.0", + "svelte-check": "^4.1.6", + "tslib": "^2.8.1", + "typescript": "^5.8.3", + "vite": "^6.3.0" }, "type": "module", "dependencies": { - "@dagrejs/dagre": "^1.0.4", - "@sveltejs/vite-plugin-svelte": "^3.1.1", + "@dagrejs/dagre": "^1.1.4", + "@sveltejs/vite-plugin-svelte": "^5.0.3", "@xyflow/svelte": "workspace:^" } } diff --git a/examples/svelte/src/components/Header/Header.svelte b/examples/svelte/src/components/Header/Header.svelte index 007d8ded..1c251c67 100644 --- a/examples/svelte/src/components/Header/Header.svelte +++ b/examples/svelte/src/components/Header/Header.svelte @@ -35,7 +35,7 @@
- {#each routes as route} {/each} diff --git a/examples/svelte/src/generic-tests/edges/general.ts b/examples/svelte/src/generic-tests/edges/general.ts index 5e94d2fb..e17da374 100644 --- a/examples/svelte/src/generic-tests/edges/general.ts +++ b/examples/svelte/src/generic-tests/edges/general.ts @@ -3,6 +3,8 @@ import { MarkerType } from '@xyflow/svelte'; export default { flowProps: { fitView: true, + multiSelectionKey: ['Meta', 's'], + deleteKey: 'd', nodes: [ { id: '1', diff --git a/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte b/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte index 0a998217..d6fb5b0d 100644 --- a/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte +++ b/examples/svelte/src/generic-tests/node-toolbar/components/ToolbarNode.svelte @@ -1,9 +1,18 @@ import type { NodeProps } from '@xyflow/svelte'; - type $$Props = NodeProps; + let {}: NodeProps = $props();
-
+
+ + + diff --git a/examples/svelte/src/routes/examples/overview/CustomEdge.svelte b/examples/svelte/src/routes/examples/overview/CustomEdge.svelte index 5f22a826..96be0b03 100644 --- a/examples/svelte/src/routes/examples/overview/CustomEdge.svelte +++ b/examples/svelte/src/routes/examples/overview/CustomEdge.svelte @@ -1,46 +1,35 @@ - + - - - + + + diff --git a/examples/svelte/src/routes/examples/overview/InitTracker.svelte b/examples/svelte/src/routes/examples/overview/InitTracker.svelte index 8b486f8c..a040625e 100644 --- a/examples/svelte/src/routes/examples/overview/InitTracker.svelte +++ b/examples/svelte/src/routes/examples/overview/InitTracker.svelte @@ -1,18 +1,18 @@ diff --git a/examples/svelte/src/routes/examples/reset/+page.svelte b/examples/svelte/src/routes/examples/reset/+page.svelte index e7857d70..4fff7a6a 100644 --- a/examples/svelte/src/routes/examples/reset/+page.svelte +++ b/examples/svelte/src/routes/examples/reset/+page.svelte @@ -1,16 +1,17 @@ - +
- + diff --git a/examples/svelte/src/routes/examples/stress/+page.svelte b/examples/svelte/src/routes/examples/stress/+page.svelte index 0d67394b..e8e434dc 100644 --- a/examples/svelte/src/routes/examples/stress/+page.svelte +++ b/examples/svelte/src/routes/examples/stress/+page.svelte @@ -1,5 +1,4 @@ - + diff --git a/examples/svelte/src/routes/examples/subflows/+page.svelte b/examples/svelte/src/routes/examples/subflows/+page.svelte index a4574a6e..fee35ba5 100644 --- a/examples/svelte/src/routes/examples/subflows/+page.svelte +++ b/examples/svelte/src/routes/examples/subflows/+page.svelte @@ -1,5 +1,4 @@ - + diff --git a/examples/svelte/src/routes/examples/subflows/DebugNode.svelte b/examples/svelte/src/routes/examples/subflows/DebugNode.svelte index ecacb06b..c207659c 100644 --- a/examples/svelte/src/routes/examples/subflows/DebugNode.svelte +++ b/examples/svelte/src/routes/examples/subflows/DebugNode.svelte @@ -3,12 +3,23 @@ type $$Props = NodeProps; - export let id: string; - export let positionAbsoluteX: number = 0; - export let positionAbsoluteY: number = 0; - export let zIndex: number = 0; + interface Props { + id: string; + positionAbsoluteX?: number; + positionAbsoluteY?: number; + zIndex?: number; + [key: string]: any + } - $$restProps; + let { + id, + positionAbsoluteX = 0, + positionAbsoluteY = 0, + zIndex = 0, + ...rest + }: Props = $props(); + + rest; diff --git a/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte b/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte index 73d3a073..da369442 100644 --- a/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte +++ b/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte @@ -1,5 +1,4 @@ - + - - + + diff --git a/examples/svelte/src/routes/examples/usenodesdata/+page.svelte b/examples/svelte/src/routes/examples/usenodesdata/+page.svelte index 8f041b0a..ed258370 100644 --- a/examples/svelte/src/routes/examples/usenodesdata/+page.svelte +++ b/examples/svelte/src/routes/examples/usenodesdata/+page.svelte @@ -1,11 +1,11 @@ - - + diff --git a/examples/svelte/src/routes/examples/usenodesdata/ResultNode.svelte b/examples/svelte/src/routes/examples/usenodesdata/ResultNode.svelte index 701d0506..a9f14360 100644 --- a/examples/svelte/src/routes/examples/usenodesdata/ResultNode.svelte +++ b/examples/svelte/src/routes/examples/usenodesdata/ResultNode.svelte @@ -4,22 +4,22 @@ Position, useNodeConnections, useNodesData, - type NodeProps + type NodeProps, + type Node } from '@xyflow/svelte'; import { isTextNode, type MyNode } from './+page.svelte'; - type $$Props = NodeProps; - - export let id: $$Props['id']; - $$restProps; + let { id }: NodeProps = $props(); const connections = useNodeConnections({ id: id, handleType: 'target' }); - $: nodeData = useNodesData($connections.map((connection) => connection.source)); - $: textNodes = $nodeData.filter(isTextNode); + let nodeData = $derived( + useNodesData(connections.current.map((connection) => connection.source)) + ); + let textNodes = $derived(nodeData.current.filter(isTextNode));
diff --git a/examples/svelte/src/routes/examples/usenodesdata/TextNode.svelte b/examples/svelte/src/routes/examples/usenodesdata/TextNode.svelte index 1fe5ff70..10ea8e70 100644 --- a/examples/svelte/src/routes/examples/usenodesdata/TextNode.svelte +++ b/examples/svelte/src/routes/examples/usenodesdata/TextNode.svelte @@ -1,13 +1,9 @@
@@ -15,7 +11,7 @@
updateNodeData(id, { text: evt.currentTarget.value })} + oninput={(evt) => updateNodeData(id, { text: evt.currentTarget.value })} />
diff --git a/examples/svelte/src/routes/examples/usenodesdata/UppercaseNode.svelte b/examples/svelte/src/routes/examples/usenodesdata/UppercaseNode.svelte index 600b7ec8..33990b6d 100644 --- a/examples/svelte/src/routes/examples/usenodesdata/UppercaseNode.svelte +++ b/examples/svelte/src/routes/examples/usenodesdata/UppercaseNode.svelte @@ -5,15 +5,12 @@ useNodeConnections, useNodesData, useSvelteFlow, + type Node, type NodeProps } from '@xyflow/svelte'; import { isTextNode, type MyNode } from './+page.svelte'; - type $$Props = NodeProps; - - export let id: $$Props['id']; - export let data: $$Props['data']; - $$restProps; + let { id }: NodeProps> = $props(); const { updateNodeData } = useSvelteFlow(); const connections = useNodeConnections({ @@ -21,20 +18,17 @@ handleType: 'target' }); - $: nodeData = useNodesData($connections[0]?.source); - $: textNode = isTextNode($nodeData) ? $nodeData : null; + let nodeData = $derived(useNodesData(connections.current[0]?.source)); + let textNodeData = $derived(isTextNode(nodeData.current) ? nodeData.current.data.text : null); - $: console.log(textNode?.data, data); - - $: { - const input = textNode?.data.text.toUpperCase() ?? ''; + $effect.pre(() => { + const input = textNodeData?.toUpperCase() ?? ''; updateNodeData(id, { text: input }); - console.log('updatedNodeData with', input); - } + });
- +
uppercase transform
diff --git a/examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte b/examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte index 2ba652a4..aa37a49a 100644 --- a/examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte +++ b/examples/svelte/src/routes/examples/usesvelteflow/Flow.svelte @@ -1,12 +1,11 @@
- + diff --git a/examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte b/examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte index 0a27afd9..c64131f0 100644 --- a/examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte +++ b/examples/svelte/src/routes/examples/usesvelteflow/Sidebar.svelte @@ -1,5 +1,5 @@ diff --git a/examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte index 89a73e1c..1b302a8b 100644 --- a/examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte +++ b/examples/svelte/src/routes/examples/useupdatenodeinternals/CustomNode.svelte @@ -1,23 +1,20 @@ - + {#each Array.from({ length: handleCount }) as handle, i} diff --git a/examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte b/examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte index 42c76cd0..a24c2467 100644 --- a/examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte +++ b/examples/svelte/src/routes/examples/useupdatenodeinternals/Flow.svelte @@ -1,5 +1,4 @@
- + - +
diff --git a/examples/svelte/src/routes/examples/validation/+page.svelte b/examples/svelte/src/routes/examples/validation/+page.svelte index d2a7cd2e..123a7e90 100644 --- a/examples/svelte/src/routes/examples/validation/+page.svelte +++ b/examples/svelte/src/routes/examples/validation/+page.svelte @@ -1,5 +1,4 @@ diff --git a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte index bb04fcb8..389804d6 100644 --- a/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte +++ b/examples/svelte/src/routes/tests/generic/[topic]/[example]/Flow.svelte @@ -1,19 +1,25 @@ - + {#if flowConfig.panelProps} {/if} diff --git a/examples/svelte/svelte.config.js b/examples/svelte/svelte.config.js index 56ed51a8..94011562 100644 --- a/examples/svelte/svelte.config.js +++ b/examples/svelte/svelte.config.js @@ -5,8 +5,10 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; const config = { // Consult https://kit.svelte.dev/docs/integrations#preprocessors // for more information about preprocessors - preprocess: vitePreprocess(), - + preprocess: vitePreprocess({ script: true }), + compilerOptions: { + runes: true + }, kit: { // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. // If your environment is not supported or you settled on a specific environment, switch out the adapter. diff --git a/examples/svelte/tsconfig.json b/examples/svelte/tsconfig.json index 6ae0c8c4..2bb201c3 100644 --- a/examples/svelte/tsconfig.json +++ b/examples/svelte/tsconfig.json @@ -8,7 +8,10 @@ "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, - "strict": true + "strict": true, + "target": "ES2022", + "verbatimModuleSyntax": true, + "isolatedModules": true } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // diff --git a/examples/svelte/vite.config.ts b/examples/svelte/vite.config.ts index 17c69201..6b35eada 100644 --- a/examples/svelte/vite.config.ts +++ b/examples/svelte/vite.config.ts @@ -3,6 +3,10 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [sveltekit()], + build: { + sourcemap: true, + minify: false + }, server: { fs: { // Allow serving files from one level up to the project root diff --git a/packages/react/src/components/NodeWrapper/utils.tsx b/packages/react/src/components/NodeWrapper/utils.tsx index 8c699c64..c8c7d5c7 100644 --- a/packages/react/src/components/NodeWrapper/utils.tsx +++ b/packages/react/src/components/NodeWrapper/utils.tsx @@ -23,9 +23,9 @@ export const builtinNodeTypes: NodeTypes = { export function getNodeInlineStyleDimensions( node: InternalNode ): { - width: number | string | undefined; - height: number | string | undefined; - } { + width: number | string | undefined; + height: number | string | undefined; +} { if (node.internals.handleBounds === undefined) { return { width: node.width ?? node.initialWidth ?? node.style?.width, diff --git a/packages/react/src/components/NodesSelection/index.tsx b/packages/react/src/components/NodesSelection/index.tsx index ae587b56..ecaef17b 100644 --- a/packages/react/src/components/NodesSelection/index.tsx +++ b/packages/react/src/components/NodesSelection/index.tsx @@ -61,9 +61,9 @@ export function NodesSelection({ const onContextMenu = onSelectionContextMenu ? (event: MouseEvent) => { - const selectedNodes = store.getState().nodes.filter((n) => n.selected); - onSelectionContextMenu(event, selectedNodes); - } + const selectedNodes = store.getState().nodes.filter((n) => n.selected); + onSelectionContextMenu(event, selectedNodes); + } : undefined; const onKeyDown = (event: KeyboardEvent) => { diff --git a/packages/svelte/.eslintignore b/packages/svelte/.eslintignore deleted file mode 100644 index c4563de9..00000000 --- a/packages/svelte/.eslintignore +++ /dev/null @@ -1,14 +0,0 @@ -.DS_Store -node_modules -/build -/.svelte-kit -dist -/package -.env -.env.* -!.env.example - -# Ignore files for PNPM, NPM and YARN -pnpm-lock.yaml -package-lock.json -yarn.lock diff --git a/packages/svelte/.eslintrc.cjs b/packages/svelte/.eslintrc.cjs deleted file mode 100644 index 4b29a016..00000000 --- a/packages/svelte/.eslintrc.cjs +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - root: true, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:svelte/recommended', - 'prettier' - ], - parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint'], - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020, - extraFileExtensions: ['.svelte'] - }, - env: { - browser: true, - es2017: true, - node: true - }, - overrides: [ - { - files: ['*.svelte'], - parser: 'svelte-eslint-parser', - parserOptions: { - parser: '@typescript-eslint/parser' - } - } - ] -}; diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index cca4d7a7..9ddca2be 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,5 +1,21 @@ # @xyflow/svelte +## 1.0.0 + +Yeah! Svelte Flow 1.0. is here 🚀 It is based on Svelte 5 and introduces a lot of new features and improvements. Please refer to the [migration guide](https://svelteflow.dev/learn/troubleshooting/migrate-to-v1) to see how to upgrade. + +### New features + +- **[Reconnect edges](https://svelteflow.dev/examples/edges/reconnect-edge)**: You can reconnect your edges by using the new `` component. It can be used to add custom reconnection points on custom edges. +- **Keyboard navigation & A11y**: We added support for keyboard navigation and improved accessibility for screen readers. You can now tab through nodes and edges and move nodes with the arrow keys. Can be disabled via [**disableKeyboardA11y**](https://svelteflow.dev/api-reference/svelte-flow#disablekeyboarda11y) +- **[Click connect](https://svelteflow.dev/examples/edges/click-connect)**: You can now create a new connection by clicking on a handle one by one. +- **[Enhanced ViewportPortal](https://svelteflow.dev/api-reference/components/viewport-portal)**: You can now decide if you want to render something below or above the nodes & edges in the viewport. +- **Improved [fitView](https://svelteflow.dev/api-reference/hooks/use-svelte-flow#fitview)**: We finetuned the `fitView` function to better work with dynamically added nodes. +- **colorModeSSR** prop: You can pass a fallback color mode for server side rendering when colorMode is set to 'system'. +- [**elevateNodesOnSelect**](https://svelteflow.dev/api-reference/svelte-flow#elevateNodesOnSelect) & [**elevateEdgesOnSelect**](https://svelteflow.dev/api-reference/svelte-flow#elevateEdgesOnSelect): Control if nodes & edges should be elevated via z-index when selected. +- [**noDragClass, noWheelClass, noPanClass**](https://svelteflow.dev/api-reference/svelte-flow#style-props): You can now modify the class name used to disable dragging, panning and zooming. +- [**onselectionchange**](https://svelteflow.dev/api-reference/svelte-flow#onselectionchange) & [**useOnSelectionChange**](https://svelteflow.dev/api-reference/hooks/use-on-selection-change): You can now listen to selection changes via a callback + ## 0.1.39 ### Patch Changes diff --git a/packages/svelte/eslint.config.js b/packages/svelte/eslint.config.js new file mode 100644 index 00000000..56e30008 --- /dev/null +++ b/packages/svelte/eslint.config.js @@ -0,0 +1,39 @@ +import globals from 'globals'; +import js from '@eslint/js'; +import ts from 'typescript-eslint'; +import svelte from 'eslint-plugin-svelte'; +import eslintConfigPrettier from 'eslint-config-prettier'; +import svelteConfig from './svelte.config.js'; + +export default ts.config( + js.configs.recommended, + ...ts.configs.recommended, + ...svelte.configs.recommended, + eslintConfigPrettier, + { + languageOptions: { + ecmaVersion: 2020, + sourceType: 'module', + globals: { + ...globals.browser, + ...globals.es2017, + ...globals.node + } + } + }, + { + files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], + ignores: ['eslint.config.js', 'svelte.config.js'], + languageOptions: { + parserOptions: { + projectService: true, + extraFileExtensions: ['.svelte'], + parser: ts.parser, + svelteConfig + } + } + }, + { + ignores: ['.svelte-kit/*', 'build/*', 'dist/*'] // Add common ignore patterns + } +); diff --git a/packages/svelte/package.json b/packages/svelte/package.json index b91d26b1..555afdf5 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -1,6 +1,6 @@ { "name": "@xyflow/svelte", - "version": "0.1.39", + "version": "1.0.0", "description": "Svelte Flow - A highly customizable Svelte library for building node-based editors, workflow systems, diagrams and more.", "keywords": [ "svelte", @@ -51,45 +51,48 @@ "access": "public" }, "dependencies": { - "@svelte-put/shortcut": "3.1.1", - "@xyflow/system": "workspace:*", - "classcat": "^5.0.4" + "@svelte-put/shortcut": "^4.1.0", + "@xyflow/system": "workspace:*" }, "devDependencies": { - "@sveltejs/adapter-auto": "^3.1.1", - "@sveltejs/kit": "^2.5.4", - "@sveltejs/package": "^2.3.0", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "autoprefixer": "^10.4.18", - "cssnano": "^6.1.0", - "dotenv": "^16.4.5", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.35.1", - "postcss": "^8.4.35", - "postcss-cli": "^11.0.0", + "@eslint/js": "^9.24.0", + "@sveltejs/adapter-auto": "^6.0.0", + "@sveltejs/kit": "^2.20.7", + "@sveltejs/package": "^2.3.11", + "@sveltejs/vite-plugin-svelte": "^5.0.3", + "@typescript-eslint/eslint-plugin": "^8.30.1", + "@typescript-eslint/parser": "^8.30.1", + "autoprefixer": "^10.4.21", + "cssnano": "^7.0.6", + "dotenv": "^16.5.0", + "eslint": "^9.24.0", + "eslint-config-prettier": "^10.1.2", + "eslint-plugin-svelte": "^3.5.1", + "globals": "^16.0.0", + "postcss": "^8.5.3", + "postcss-cli": "^11.0.1", "postcss-combine-duplicated-selectors": "^10.0.3", - "postcss-import": "^16.0.1", - "postcss-nested": "^6.0.1", + "postcss-import": "^16.1.0", + "postcss-nested": "^7.0.2", "postcss-rename": "^0.6.1", - "prettier": "^3.2.5", - "prettier-plugin-svelte": "^3.2.2", - "svelte": "^4.2.12", - "svelte-check": "^3.6.7", - "svelte-eslint-parser": "^0.33.1", - "svelte-preprocess": "^5.1.3", - "tslib": "^2.6.2", - "typescript": "5.4.5" + "prettier": "^3.5.3", + "prettier-plugin-svelte": "^3.3.3", + "svelte": "^5.27.0", + "svelte-check": "^4.1.6", + "svelte-eslint-parser": "^1.1.2", + "svelte-preprocess": "^6.0.3", + "tslib": "^2.8.1", + "typescript": "^5.8.3", + "typescript-eslint": "^8.30.1" }, "peerDependencies": { - "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" + "svelte": "^5.25.0" }, "files": [ "dist" ], "typesVersions": { - ">4.0": { + ">5.0": { "index": [ "./dist/lib/index.d.ts" ] diff --git a/packages/svelte/src/lib/actions/drag/index.ts b/packages/svelte/src/lib/actions/drag/index.ts index 0d28f4e7..18aa2e3c 100644 --- a/packages/svelte/src/lib/actions/drag/index.ts +++ b/packages/svelte/src/lib/actions/drag/index.ts @@ -1,10 +1,10 @@ -import { get } from 'svelte/store'; -import { XYDrag, type OnDrag } from '@xyflow/system'; +import { XYDrag, type NodeBase, type OnDrag, type XYDragParams } from '@xyflow/system'; import type { SvelteFlowStore } from '$lib/store/types'; +import type { Node, Edge, NodeTargetEventWithPointer } from '$lib/types'; -export type UseDragParams = { - store: SvelteFlowStore; +export type UseDragParams = { + store: SvelteFlowStore; disabled?: boolean; noDragClass?: string; handleSelector?: string; @@ -17,7 +17,10 @@ export type UseDragParams = { onNodeMouseDown?: (id: string) => void; }; -export default function drag(domNode: Element, params: UseDragParams) { +export default function drag( + domNode: Element, + params: UseDragParams +) { const { store, onDrag, onDragStart, onDragStop, onNodeMouseDown } = params; const dragInstance = XYDrag({ onDrag, @@ -25,32 +28,34 @@ export default function drag(domNode: Element, params: UseDragParams) { onDragStop, onNodeMouseDown, getStoreItems: () => { - const snapGrid = get(store.snapGrid); - const vp = get(store.viewport); + const { snapGrid, viewport } = store; return { - nodes: get(store.nodes), - nodeLookup: get(store.nodeLookup), - edges: get(store.edges), - nodeExtent: get(store.nodeExtent), + nodes: store.nodes satisfies NodeBase[], + nodeLookup: store.nodeLookup, + edges: store.edges, + nodeExtent: store.nodeExtent, snapGrid: snapGrid ? snapGrid : [0, 0], snapToGrid: !!snapGrid, - nodeOrigin: get(store.nodeOrigin), - multiSelectionActive: get(store.multiselectionKeyPressed), - domNode: get(store.domNode), - transform: [vp.x, vp.y, vp.zoom], - autoPanOnNodeDrag: get(store.autoPanOnNodeDrag), - nodesDraggable: get(store.nodesDraggable), - selectNodesOnDrag: get(store.selectNodesOnDrag), - nodeDragThreshold: get(store.nodeDragThreshold), + nodeOrigin: store.nodeOrigin, + multiSelectionActive: store.multiselectionKeyPressed, + domNode: store.domNode, + transform: [viewport.x, viewport.y, viewport.zoom], + autoPanOnNodeDrag: store.autoPanOnNodeDrag, + nodesDraggable: store.nodesDraggable, + selectNodesOnDrag: store.selectNodesOnDrag, + nodeDragThreshold: store.nodeDragThreshold, unselectNodesAndEdges: store.unselectNodesAndEdges, updateNodePositions: store.updateNodePositions, + onSelectionDrag: store.onselectiondrag, + onSelectionDragStart: store.onselectiondragstart, + onSelectionDragStop: store.onselectiondragstop, panBy: store.panBy }; } - }); + } as XYDragParams>); - function updateDrag(domNode: Element, params: UseDragParams) { + function updateDrag(domNode: Element, params: UseDragParams) { if (params.disabled) { dragInstance.destroy(); return; @@ -69,7 +74,7 @@ export default function drag(domNode: Element, params: UseDragParams) { updateDrag(domNode, params); return { - update(params: UseDragParams) { + update(params: UseDragParams) { updateDrag(domNode, params); }, destroy() { diff --git a/packages/svelte/src/lib/actions/portal/index.ts b/packages/svelte/src/lib/actions/portal/index.ts index fba6562c..927ec7f0 100644 --- a/packages/svelte/src/lib/actions/portal/index.ts +++ b/packages/svelte/src/lib/actions/portal/index.ts @@ -1,31 +1 @@ -type PortalOptions = { - target?: string; - domNode: Element | null; -}; - -function tryToMount(node: Element, domNode: Element | null, target: string | undefined) { - if (!domNode) { - return; - } - - const targetEl = target ? domNode.querySelector(target) : domNode; - - if (targetEl) { - targetEl.appendChild(node); - } -} - -export default function (node: Element, { target, domNode }: PortalOptions) { - tryToMount(node, domNode, target); - - return { - async update({ target, domNode }: PortalOptions) { - tryToMount(node, domNode, target); - }, - destroy() { - if (node.parentNode) { - node.parentNode.removeChild(node); - } - } - }; -} +export { portal } from './portal.svelte'; diff --git a/packages/svelte/src/lib/actions/portal/portal.svelte.ts b/packages/svelte/src/lib/actions/portal/portal.svelte.ts new file mode 100644 index 00000000..b20dec35 --- /dev/null +++ b/packages/svelte/src/lib/actions/portal/portal.svelte.ts @@ -0,0 +1,38 @@ +import { useStore } from '$lib/store'; + +type Portal = 'viewport-back' | 'viewport-front' | 'root' | 'edge-labels'; + +function tryToMount(node: Element, domNode: Element | null, target: Portal | undefined) { + if (!target || !domNode) { + return; + } + + const targetEl = target === 'root' ? domNode : domNode.querySelector(`.svelte-flow__${target}`); + + if (targetEl) { + targetEl.appendChild(node); + } +} + +export function portal(node: Element, target: Portal | undefined) { + const store = useStore(); + + let previousTarget: Portal | undefined = target; + + tryToMount(node, store.domNode, target); + + return { + async update(target: Portal) { + if (target !== previousTarget) { + node.parentNode?.removeChild(node); + previousTarget = target; + } + tryToMount(node, store.domNode, target); + }, + destroy() { + if (node.parentNode) { + node.parentNode.removeChild(node); + } + } + }; +} diff --git a/packages/svelte/src/lib/actions/zoom/index.ts b/packages/svelte/src/lib/actions/zoom/index.ts index 85070d68..47cfa49e 100644 --- a/packages/svelte/src/lib/actions/zoom/index.ts +++ b/packages/svelte/src/lib/actions/zoom/index.ts @@ -1,4 +1,3 @@ -import type { Writable } from 'svelte/store'; import { PanOnScrollMode, XYPanZoom, @@ -10,17 +9,16 @@ import { } from '@xyflow/system'; type ZoomParams = { - viewport: Writable; + viewport: Viewport; initialViewport: Viewport; minZoom: number; maxZoom: number; - dragging: Writable; + setPanZoomInstance: (panZoomInstance: PanZoomInstance) => void; onPanZoomStart?: OnPanZoom; onPanZoom?: OnPanZoom; onPanZoomEnd?: OnPanZoom; onPaneContextMenu?: (event: MouseEvent) => void; translateExtent: CoordinateExtent; - panZoom: Writable; zoomOnScroll: boolean; zoomOnPinch: boolean; zoomOnDoubleClick: boolean; @@ -38,18 +36,19 @@ type ZoomParams = { lib: string; paneClickDistance: number; onTransformChange: (transform: Transform) => void; + onDraggingChange: (dragging: boolean) => void; }; export default function zoom(domNode: Element, params: ZoomParams) { const { - panZoom, minZoom, maxZoom, initialViewport, - viewport, - dragging, translateExtent, - paneClickDistance + paneClickDistance, + setPanZoomInstance, + onDraggingChange, + onTransformChange } = params; const panZoomInstance = XYPanZoom({ @@ -59,11 +58,19 @@ export default function zoom(domNode: Element, params: ZoomParams) { translateExtent, viewport: initialViewport, paneClickDistance, - onDraggingChange: dragging.set + onDraggingChange }); - const currentViewport = panZoomInstance.getViewport(); - viewport.set(currentViewport); - panZoom.set(panZoomInstance); + + const viewport = panZoomInstance.getViewport(); + if ( + initialViewport.x !== viewport.x || + initialViewport.y !== viewport.y || + initialViewport.zoom !== viewport.zoom + ) { + onTransformChange([viewport.x, viewport.y, viewport.zoom]); + } + + setPanZoomInstance(panZoomInstance); panZoomInstance.update(params); diff --git a/packages/svelte/src/lib/components/A11yDescriptions/A11yDescriptions.svelte b/packages/svelte/src/lib/components/A11yDescriptions/A11yDescriptions.svelte new file mode 100644 index 00000000..a26778c1 --- /dev/null +++ b/packages/svelte/src/lib/components/A11yDescriptions/A11yDescriptions.svelte @@ -0,0 +1,30 @@ + + + + + +{#if !store.disableKeyboardA11y} +
+ {store.ariaLiveMessage} +
+{/if} diff --git a/packages/svelte/src/lib/components/A11yDescriptions/index.ts b/packages/svelte/src/lib/components/A11yDescriptions/index.ts new file mode 100644 index 00000000..af58b941 --- /dev/null +++ b/packages/svelte/src/lib/components/A11yDescriptions/index.ts @@ -0,0 +1,5 @@ +export { default as A11yDescriptions } from './A11yDescriptions.svelte'; + +export const ARIA_NODE_DESC_KEY = 'svelte-flow__node-desc'; +export const ARIA_EDGE_DESC_KEY = 'svelte-flow__edge-desc'; +export const ARIA_LIVE_MESSAGE = 'svelte-flow__aria-live'; diff --git a/packages/svelte/src/lib/components/Attribution/Attribution.svelte b/packages/svelte/src/lib/components/Attribution/Attribution.svelte index bb7041d7..f860950d 100644 --- a/packages/svelte/src/lib/components/Attribution/Attribution.svelte +++ b/packages/svelte/src/lib/components/Attribution/Attribution.svelte @@ -2,10 +2,7 @@ import { Panel } from '$lib/container/Panel'; import type { AttributionProps } from './types'; - type $$Props = AttributionProps; - - export let proOptions: $$Props['proOptions'] = undefined; - export let position: $$Props['position'] = 'bottom-right'; + let { proOptions, position = 'bottom-right' }: AttributionProps = $props(); {#if !proOptions?.hideAttribution} diff --git a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte deleted file mode 100644 index 36b3763e..00000000 --- a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - - - -{#if interactionWidthValue} - -{/if} - -{#if label} - - {label} - -{/if} diff --git a/packages/svelte/src/lib/components/BaseEdge/index.ts b/packages/svelte/src/lib/components/BaseEdge/index.ts deleted file mode 100644 index 65bb0fbc..00000000 --- a/packages/svelte/src/lib/components/BaseEdge/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as BaseEdge } from './BaseEdge.svelte'; diff --git a/packages/svelte/src/lib/components/BaseEdge/types.ts b/packages/svelte/src/lib/components/BaseEdge/types.ts deleted file mode 100644 index 41a1189b..00000000 --- a/packages/svelte/src/lib/components/BaseEdge/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { EdgeProps } from '$lib/types'; - -export type BaseEdgeProps = Pick< - EdgeProps, - 'interactionWidth' | 'label' | 'labelStyle' | 'style' -> & { - id?: string; - /** SVG path of the edge */ - path: string; - /** The x coordinate of the label */ - labelX?: number; - /** The y coordinate of the label */ - labelY?: number; - /** Marker at start of edge - * @example 'url(#arrow)' - */ - markerStart?: string; - /** Marker at end of edge - * @example 'url(#arrow)' - */ - markerEnd?: string; - class?: string; -}; diff --git a/packages/svelte/src/lib/components/CallOnMount/CallOnMount.svelte b/packages/svelte/src/lib/components/CallOnMount/CallOnMount.svelte deleted file mode 100644 index 4184da6f..00000000 --- a/packages/svelte/src/lib/components/CallOnMount/CallOnMount.svelte +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/packages/svelte/src/lib/components/CallOnMount/index.ts b/packages/svelte/src/lib/components/CallOnMount/index.ts deleted file mode 100644 index 3dee0d92..00000000 --- a/packages/svelte/src/lib/components/CallOnMount/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as CallOnMount } from './CallOnMount.svelte'; diff --git a/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte b/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte index 71e3f2c9..d8750cab 100644 --- a/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte +++ b/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte @@ -1,7 +1,5 @@ - -{#if $connection.inProgress} - - - - - {#if !isCustomComponent} +{#if store.connection.inProgress} + + + {#if LineComponent} + + {:else} {/if} diff --git a/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte b/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte index 9ab028c0..187567d7 100644 --- a/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte +++ b/packages/svelte/src/lib/components/EdgeLabel/EdgeLabel.svelte @@ -1,31 +1,53 @@ - -
{}} - on:click={() => { - if (id) handleEdgeSelect(id); - }} - > - -
- +
{ + if (selectEdgeOnClick && id) store.handleEdgeSelection(id); + }} + {...rest} +> + {@render children?.()} +
+ + diff --git a/packages/svelte/src/lib/components/EdgeLabel/index.ts b/packages/svelte/src/lib/components/EdgeLabel/index.ts index 2e0a457c..bd3bb47f 100644 --- a/packages/svelte/src/lib/components/EdgeLabel/index.ts +++ b/packages/svelte/src/lib/components/EdgeLabel/index.ts @@ -1 +1,2 @@ export { default as EdgeLabel } from './EdgeLabel.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/components/EdgeLabel/types.ts b/packages/svelte/src/lib/components/EdgeLabel/types.ts new file mode 100644 index 00000000..0135cdf6 --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeLabel/types.ts @@ -0,0 +1,12 @@ +import type { Snippet } from 'svelte'; +import type { HTMLAttributes } from 'svelte/elements'; + +export type EdgeLabelProps = { + x?: number; + y?: number; + width?: number; + height?: number; + selectEdgeOnClick?: boolean; + transparent?: boolean; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte b/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte deleted file mode 100644 index 76bc8061..00000000 --- a/packages/svelte/src/lib/components/EdgeLabelRenderer/EdgeLabelRenderer.svelte +++ /dev/null @@ -1,10 +0,0 @@ - - -
- -
diff --git a/packages/svelte/src/lib/components/EdgeLabelRenderer/index.ts b/packages/svelte/src/lib/components/EdgeLabelRenderer/index.ts deleted file mode 100644 index 02f40786..00000000 --- a/packages/svelte/src/lib/components/EdgeLabelRenderer/index.ts +++ /dev/null @@ -1 +0,0 @@ -export { default as EdgeLabelRenderer } from './EdgeLabelRenderer.svelte'; diff --git a/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte b/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte new file mode 100644 index 00000000..96842f26 --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeReconnectAnchor/EdgeReconnectAnchor.svelte @@ -0,0 +1,123 @@ + + + + {#if !reconnecting && children} + {@render children()} + {/if} + diff --git a/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts b/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts new file mode 100644 index 00000000..5c3ad2c7 --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeReconnectAnchor/index.ts @@ -0,0 +1,2 @@ +export { default as EdgeReconnectAnchor } from './EdgeReconnectAnchor.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts b/packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts new file mode 100644 index 00000000..74ed6d6d --- /dev/null +++ b/packages/svelte/src/lib/components/EdgeReconnectAnchor/types.ts @@ -0,0 +1,13 @@ +import type { HandleType, XYPosition } from '@xyflow/system'; +import type { Snippet } from 'svelte'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; + +export type EdgeReconnectAnchorProps = { + type: HandleType; + reconnecting?: boolean; + style?: string; + class?: ClassValue; + position?: XYPosition; + size?: number; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte index 02401f61..c1c988fd 100644 --- a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte +++ b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte @@ -1,115 +1,147 @@ - + - - + {#if !hidden} - + { - onMouseEvent(e, 'edgecontextmenu'); - }} - on:mouseenter={(e) => { - onMouseEvent(e, 'edgemouseenter'); - }} - on:mouseleave={(e) => { - onMouseEvent(e, 'edgemouseleave'); - }} + {onclick} + oncontextmenu={onedgecontextmenu + ? (e) => { + onmouseevent(e, onedgecontextmenu); + } + : undefined} + onpointerenter={onedgepointerenter + ? (e) => { + onmouseevent(e, onedgepointerenter); + } + : undefined} + onpointerleave={onedgepointerleave + ? (e) => { + onmouseevent(e, onedgepointerleave); + } + : undefined} aria-label={ariaLabel === null ? undefined : ariaLabel ? ariaLabel : `Edge from ${source} to ${target}`} - role="img" + aria-describedby={focusable ? `${ARIA_EDGE_DESC_KEY}-${store.flowId}` : undefined} + role={focusable ? 'button' : 'img'} + onkeydown={focusable ? onkeydown : undefined} + tabindex={focusable ? 0 : undefined} > - import { getContext } from 'svelte'; - import type { Writable } from 'svelte/store'; - import cc from 'classcat'; import { Position, XYHandle, isMouseEvent, - type HandleConnection, areConnectionMapsEqual, handleConnectionChange, - ConnectionMode + ConnectionMode, + getHostForElement, + type HandleConnection, + type Optional, + type ConnectionState, + type Connection } from '@xyflow/system'; import { useStore } from '$lib/store'; - import type { HandleProps } from '$lib/types'; - type $$Props = HandleProps; + import type { ConnectableContext } from '../NodeWrapper/types'; + import type { HandleProps } from './types'; - export let id: $$Props['id'] = undefined; - export let type: $$Props['type'] = 'source'; - export let position: $$Props['position'] = Position.Top; - export let style: $$Props['style'] = undefined; - export let isValidConnection: $$Props['isValidConnection'] = undefined; - export let onconnect: $$Props['onconnect'] = undefined; - export let ondisconnect: $$Props['ondisconnect'] = undefined; - // @todo implement connectablestart, connectableend - // export let isConnectableStart: $$Props['isConnectableStart'] = undefined; - // export let isConnectableEnd: $$Props['isConnectableEnd'] = undefined; + let { + id: handleId = null, + type = 'source', + position = Position.Top, + style, + class: className, + isConnectable: isConnectableProp, + isConnectableStart = true, + isConnectableEnd = true, + isValidConnection, + onconnect, + ondisconnect, + children, + ...rest + }: HandleProps = $props(); - let isConnectableProp: $$Props['isConnectable'] = undefined; - export { isConnectableProp as isConnectable }; - - let className: $$Props['class'] = undefined; - export { className as class }; - - $: isTarget = type === 'target'; const nodeId = getContext('svelteflow__node_id'); - const connectable = getContext>('svelteflow__node_connectable'); - $: isConnectable = isConnectableProp !== undefined ? isConnectableProp : $connectable; + const isConnectableContext = getContext('svelteflow__node_connectable'); - $: handleId = id || null; + let isTarget = $derived(type === 'target'); + let isConnectable = $derived( + isConnectableProp !== undefined ? isConnectableProp : isConnectableContext.value + ); - const store = useStore(); - const { - connectionMode, - domNode, - nodeLookup, - connectionRadius, - viewport, - isValidConnection: isValidConnectionStore, - lib, - addEdge, - onedgecreate, - panBy, - cancelConnection, - updateConnection, - autoPanOnConnect, - edges, - connectionLookup, - onconnect: onConnectAction, - onconnectstart: onConnectStartAction, - onconnectend: onConnectEndAction, - flowId, - connection - } = store; + let store = useStore(); - function onPointerDown(event: MouseEvent | TouchEvent) { + let prevConnections: Map | null = null; + $effect.pre(() => { + if (onconnect || ondisconnect) { + // connectionLookup is not reactive, so we use edges to get notified about updates + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + store.edges; + let connections = store.connectionLookup.get( + `${nodeId}-${type}${handleId ? `-${handleId}` : ''}` + ); + + if (prevConnections && !areConnectionMapsEqual(connections, prevConnections)) { + const _connections = connections ?? new Map(); + + handleConnectionChange(prevConnections, _connections, ondisconnect); + handleConnectionChange(_connections, prevConnections, onconnect); + } + + prevConnections = new Map(connections); + } + }); + + let [connectionInProgress, connectingFrom, connectingTo, isPossibleTargetHandle, valid] = + $derived.by(() => { + if (!store.connection.inProgress) { + return [false, false, false, false, null]; + } + + const { fromHandle, toHandle, isValid } = store.connection; + + const connectingFrom = + fromHandle && + fromHandle.nodeId === nodeId && + fromHandle.type === type && + fromHandle.id === handleId; + + const connectingTo = + toHandle && + toHandle.nodeId === nodeId && + toHandle.type === type && + toHandle.id === handleId; + + const isPossibleTargetHandle = + store.connectionMode === ConnectionMode.Strict + ? fromHandle?.type !== type + : nodeId !== fromHandle?.nodeId || handleId !== fromHandle?.id; + + const valid = connectingTo && isValid; + + return [true, connectingFrom, connectingTo, isPossibleTargetHandle, valid]; + }); + + function onConnectExtended(connection: Connection) { + const edge = store.onbeforeconnect?.(connection) ?? connection; + + if (!edge) { + return; + } + + store.addEdge(edge); + store.onconnect?.(connection); + } + + function onpointerdown(event: MouseEvent | TouchEvent) { const isMouseTriggered = isMouseEvent(event); if ((isMouseTriggered && event.button === 0) || !isMouseTriggered) { @@ -73,77 +115,82 @@ handleId, nodeId, isTarget, - connectionRadius: $connectionRadius, - domNode: $domNode, - nodeLookup: $nodeLookup, - connectionMode: $connectionMode, - lib: $lib, - autoPanOnConnect: $autoPanOnConnect, - flowId: $flowId, - isValidConnection: isValidConnection ?? $isValidConnectionStore, - updateConnection, - cancelConnection, - panBy, - onConnect: (connection) => { - const edge = $onedgecreate ? $onedgecreate(connection) : connection; - - if (!edge) { - return; - } - - addEdge(edge); - $onConnectAction?.(connection); - }, + connectionRadius: store.connectionRadius, + domNode: store.domNode, + nodeLookup: store.nodeLookup, + connectionMode: store.connectionMode, + lib: 'svelte', + autoPanOnConnect: store.autoPanOnConnect, + flowId: store.flowId, + isValidConnection: isValidConnection ?? store.isValidConnection, + updateConnection: store.updateConnection, + cancelConnection: store.cancelConnection, + panBy: store.panBy, + onConnect: onConnectExtended, onConnectStart: (event, startParams) => { - $onConnectStartAction?.(event, { + store.onconnectstart?.(event, { nodeId: startParams.nodeId, handleId: startParams.handleId, handleType: startParams.handleType }); }, onConnectEnd: (event, connectionState) => { - $onConnectEndAction?.(event, connectionState); + store.onconnectend?.(event, connectionState); }, - getTransform: () => [$viewport.x, $viewport.y, $viewport.zoom], - getFromHandle: () => $connection.fromHandle + getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom], + getFromHandle: () => store.connection.fromHandle }); } } - let prevConnections: Map | null = null; - let connections: Map | undefined; - - $: if (onconnect || ondisconnect) { - // connectionLookup is not reactive, so we use edges to get notified about updates - $edges; - connections = $connectionLookup.get(`${nodeId}-${type}${id ? `-${id}` : ''}`); - } - - $: { - if (prevConnections && !areConnectionMapsEqual(connections, prevConnections)) { - const _connections = connections ?? new Map(); - - handleConnectionChange(prevConnections, _connections, ondisconnect); - handleConnectionChange(_connections, prevConnections, onconnect); + function onclick(event: MouseEvent) { + if (!nodeId || (!store.clickConnectStartHandle && !isConnectableStart)) { + return; } - prevConnections = connections ?? new Map(); - } + if (!store.clickConnectStartHandle) { + store.onclickconnectstart?.(event, { nodeId, handleId, handleType: type }); + store.clickConnectStartHandle = { nodeId, type, id: handleId }; + return; + } - $: connectionInProcess = !!$connection.fromHandle; - $: connectingFrom = - $connection.fromHandle?.nodeId === nodeId && - $connection.fromHandle?.type === type && - $connection.fromHandle?.id === handleId; - $: connectingTo = - $connection.toHandle?.nodeId === nodeId && - $connection.toHandle?.type === type && - $connection.toHandle?.id === handleId; - $: isPossibleEndHandle = - $connectionMode === ConnectionMode.Strict - ? $connection.fromHandle?.type !== type - : nodeId !== $connection.fromHandle?.nodeId || handleId !== $connection.fromHandle?.id; - $: valid = connectingTo && $connection.isValid; + const doc = getHostForElement(event.target); + const isValidConnectionHandler = isValidConnection ?? store.isValidConnection; + + const { connectionMode, clickConnectStartHandle, flowId, nodeLookup } = store; + const { connection, isValid } = XYHandle.isValid(event, { + handle: { + nodeId, + id: handleId, + type + }, + connectionMode, + fromNodeId: clickConnectStartHandle.nodeId, + fromHandleId: clickConnectStartHandle.id ?? null, + fromType: clickConnectStartHandle.type, + isValidConnection: isValidConnectionHandler, + flowId, + doc, + lib: 'svelte', + nodeLookup + }); + + if (isValid && connection) { + onConnectExtended(connection); + } + + const connectionClone = structuredClone($state.snapshot(store.connection)) as Optional< + ConnectionState, + 'inProgress' + >; + delete connectionClone.inProgress; + connectionClone.toPosition = connectionClone.toHandle + ? connectionClone.toHandle.position + : null; + store.onclickconnectend?.(event, connectionClone); + + store.clickConnectStartHandle = null; + } - {#if !hidden}
{ - dispatchNodeEvent('nodedrag', { event, targetNode, nodes }); + onnodedrag?.({ event, targetNode: targetNode as NodeType, nodes: nodes as NodeType[] }); }, onDragStart: (event, _, targetNode, nodes) => { - dispatchNodeEvent('nodedragstart', { event, targetNode, nodes }); + onnodedragstart?.({ + event, + targetNode: targetNode as NodeType, + nodes: nodes as NodeType[] + }); }, onDragStop: (event, _, targetNode, nodes) => { - dispatchNodeEvent('nodedragstop', { event, targetNode, nodes }); + onnodedragstop?.({ event, targetNode: targetNode as NodeType, nodes: nodes as NodeType[] }); }, store }} bind:this={nodeRef} data-id={id} - class={cc(['svelte-flow__node', `svelte-flow__node-${nodeType}`, className])} + class={['svelte-flow__node', `svelte-flow__node-${type}`, className]} class:dragging class:selected class:draggable @@ -185,29 +236,42 @@ style:z-index={zIndex} style:transform="translate({positionX}px, {positionY}px)" style:visibility={initialized ? 'visible' : 'hidden'} - style="{style ?? ''};{inlineStyleDimensions.width}{inlineStyleDimensions.height}" - on:click={onSelectNodeHandler} - on:mouseenter={(event) => dispatchNodeEvent('nodemouseenter', { node, event })} - on:mouseleave={(event) => dispatchNodeEvent('nodemouseleave', { node, event })} - on:mousemove={(event) => dispatchNodeEvent('nodemousemove', { node, event })} - on:contextmenu={(event) => dispatchNodeEvent('nodecontextmenu', { node, event })} + style={nodeStyle} + onclick={onSelectNodeHandler} + onpointerenter={onnodepointerenter + ? (event) => onnodepointerenter({ node: userNode, event }) + : undefined} + onpointerleave={onnodepointerleave + ? (event) => onnodepointerleave({ node: userNode, event }) + : undefined} + onpointermove={onnodepointermove + ? (event) => onnodepointermove({ node: userNode, event }) + : undefined} + oncontextmenu={onnodecontextmenu + ? (event) => onnodecontextmenu({ node: userNode, event }) + : undefined} + onkeydown={focusable ? onKeyDown : undefined} + tabIndex={focusable ? 0 : undefined} + role={focusable ? 'button' : undefined} + aria-describedby={store.disableKeyboardA11y + ? undefined + : `${ARIA_NODE_DESC_KEY}-${store.flowId}`} > - & { - measuredWidth?: number; - measuredHeight?: number; - type: string; - positionX: number; - positionY: number; - 'on:nodeclick'?: (event: MouseEvent) => void; +export type ConnectableContext = { + value: boolean; +}; + +export type NodeWrapperProps = { + node: InternalNode; + store: SvelteFlowStore; + nodeClickDistance?: number; resizeObserver?: ResizeObserver | null; - isParent?: boolean; - zIndex: number; - node: InternalNode; - initialized: boolean; - nodeClickDistance?: number; }; diff --git a/packages/svelte/src/lib/components/NodeWrapper/utils.ts b/packages/svelte/src/lib/components/NodeWrapper/utils.ts deleted file mode 100644 index f795e31d..00000000 --- a/packages/svelte/src/lib/components/NodeWrapper/utils.ts +++ /dev/null @@ -1,33 +0,0 @@ -export function getNodeInlineStyleDimensions({ - width, - height, - initialWidth, - initialHeight, - measuredWidth, - measuredHeight -}: { - width?: number; - height?: number; - initialWidth?: number; - initialHeight?: number; - measuredWidth?: number; - measuredHeight?: number; -}): { - width: string | undefined; - height: string | undefined; -} { - if (measuredWidth === undefined && measuredHeight === undefined) { - const styleWidth = width ?? initialWidth; - const styleHeight = height ?? initialHeight; - - return { - width: styleWidth ? `width:${styleWidth}px;` : '', - height: styleHeight ? `height:${styleHeight}px;` : '' - }; - } - - return { - width: width ? `width:${width}px;` : '', - height: height ? `height:${height}px;` : '' - }; -} diff --git a/packages/svelte/src/lib/components/Selection/Selection.svelte b/packages/svelte/src/lib/components/Selection/Selection.svelte index a9e0e7d6..25a7de2e 100644 --- a/packages/svelte/src/lib/components/Selection/Selection.svelte +++ b/packages/svelte/src/lib/components/Selection/Selection.svelte @@ -1,18 +1,28 @@ {#if isVisible}
+ >
{/if} diff --git a/packages/svelte/src/lib/container/NodeRenderer/types.ts b/packages/svelte/src/lib/container/NodeRenderer/types.ts deleted file mode 100644 index 93c78afe..00000000 --- a/packages/svelte/src/lib/container/NodeRenderer/types.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type NodeRendererProps = { - nodeClickDistance?: number; -}; diff --git a/packages/svelte/src/lib/container/Pane/Pane.svelte b/packages/svelte/src/lib/container/Pane/Pane.svelte index c2200935..db11bd7d 100644 --- a/packages/svelte/src/lib/container/Pane/Pane.svelte +++ b/packages/svelte/src/lib/container/Pane/Pane.svelte @@ -1,4 +1,4 @@ - - - - + +
- + {@render children()}
- - diff --git a/packages/svelte/src/lib/container/Pane/index.ts b/packages/svelte/src/lib/container/Pane/index.ts index 2161528c..ddbb36e5 100644 --- a/packages/svelte/src/lib/container/Pane/index.ts +++ b/packages/svelte/src/lib/container/Pane/index.ts @@ -1 +1,2 @@ export { default as Pane } from './Pane.svelte'; +export * from './types'; diff --git a/packages/svelte/src/lib/container/Pane/types.ts b/packages/svelte/src/lib/container/Pane/types.ts index 96d97701..8442834e 100644 --- a/packages/svelte/src/lib/container/Pane/types.ts +++ b/packages/svelte/src/lib/container/Pane/types.ts @@ -1,4 +1,12 @@ -export type PaneProps = { +import type { Snippet } from 'svelte'; +import type { Node, Edge, PaneEvents } from '$lib/types'; +import type { SvelteFlowStore } from '$lib/store/types'; + +export type PaneProps = { + store: SvelteFlowStore; panOnDrag?: boolean | number[]; selectionOnDrag?: boolean; -}; + onselectionstart?: (event: PointerEvent) => void; + onselectionend?: (event: PointerEvent) => void; + children: Snippet; +} & PaneEvents; diff --git a/packages/svelte/src/lib/container/Panel/Panel.svelte b/packages/svelte/src/lib/container/Panel/Panel.svelte index 4ea6661b..81a3796d 100644 --- a/packages/svelte/src/lib/container/Panel/Panel.svelte +++ b/packages/svelte/src/lib/container/Panel/Panel.svelte @@ -1,26 +1,19 @@
- + {@render children?.()}
diff --git a/packages/svelte/src/lib/container/Panel/index.ts b/packages/svelte/src/lib/container/Panel/index.ts index aa07206d..bc926449 100644 --- a/packages/svelte/src/lib/container/Panel/index.ts +++ b/packages/svelte/src/lib/container/Panel/index.ts @@ -1,2 +1,2 @@ export { default as Panel } from './Panel.svelte'; -export type { PanelProps } from './types'; +export * from './types'; diff --git a/packages/svelte/src/lib/container/Panel/types.ts b/packages/svelte/src/lib/container/Panel/types.ts index b6e4dd0a..3b377a45 100644 --- a/packages/svelte/src/lib/container/Panel/types.ts +++ b/packages/svelte/src/lib/container/Panel/types.ts @@ -1,5 +1,5 @@ import type { PanelPosition } from '@xyflow/system'; -import type { HTMLAttributes } from 'svelte/elements'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; export type PanelProps = HTMLAttributes & { 'data-testid'?: string; @@ -9,5 +9,5 @@ export type PanelProps = HTMLAttributes & { */ position?: PanelPosition; style?: string; - class?: string; + class?: ClassValue; }; diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index d9bee5d3..9b039558 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -1,218 +1,143 @@ - -
- + +
+
- - -
-
+ /> +
- + - -
- - + + {@render children?.()} + diff --git a/packages/svelte/src/lib/container/SvelteFlow/Wrapper.svelte b/packages/svelte/src/lib/container/SvelteFlow/Wrapper.svelte new file mode 100644 index 00000000..b1353a42 --- /dev/null +++ b/packages/svelte/src/lib/container/SvelteFlow/Wrapper.svelte @@ -0,0 +1,143 @@ + + +
} +> + {@render children?.()} +
+ + diff --git a/packages/svelte/src/lib/container/SvelteFlow/types.ts b/packages/svelte/src/lib/container/SvelteFlow/types.ts index 0963424e..3df0a991 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/types.ts +++ b/packages/svelte/src/lib/container/SvelteFlow/types.ts @@ -1,4 +1,4 @@ -import type { DOMAttributes } from 'svelte/elements'; +import type { ClassValue } from 'svelte/elements'; import type { ConnectionLineType, NodeOrigin, @@ -17,7 +17,10 @@ import type { ColorMode, OnConnect, OnConnectStart, - OnConnectEnd + OnConnectEnd, + OnReconnect, + OnReconnectStart, + OnReconnectEnd } from '@xyflow/system'; import type { @@ -29,324 +32,443 @@ import type { DefaultEdgeOptions, FitViewOptions, OnDelete, - OnEdgeCreate, + OnBeforeConnect, OnBeforeDelete, - IsValidConnection + IsValidConnection, + OnBeforeReconnect, + OnSelectionChange } from '$lib/types'; -import type { Writable } from 'svelte/store'; -export type SvelteFlowProps = DOMAttributes & { - /** The id of the flow - * - * This is necessary if you want to render multiple flows. - * @optional - */ - id?: string; - /** An array of nodes to render in a controlled flow. - * @example - * const nodes = writable([ - * { - * id: 'node-1', - * type: 'input', - * data: { label: 'Node 1' }, - * position: { x: 250, y: 50 } - * } - * ]); - */ - nodes: Writable; - /** An array of edges to render in a controlled flow. - * @example - * const edges = writable([ - * { - * id: 'edge-1-2', - * source: 'node-1', - * target: 'node-2', - * } - * ]); - */ - edges: Writable; - /** Custom node types to be available in a flow. - * - * Svelte Flow matches a node's type to a component in the nodeTypes object. - * @example - * import CustomNode from './CustomNode.svelte'; - * - * const nodeTypes = { nameOfNodeType: CustomNode }; - */ - nodeTypes?: NodeTypes; - /** Custom edge types to be available in a flow. - * - * Svelte Flow matches an edge's type to a component in the edgeTypes object. - * @example - * import CustomEdge from './CustomEdge.svelte'; - * - * const edgeTypes = { nameOfEdgeType: CustomEdge }; - */ - edgeTypes?: EdgeTypes; - /** Pressing down this key you can select multiple elements with a selection box. - * @default 'Shift' - */ - selectionKey?: KeyDefinition | KeyDefinition[] | null; - /** If a key is set, you can pan the viewport while that key is held down even if panOnScroll is set to false. - * - * By setting this prop to null you can disable this functionality. - * @default 'Space' - */ - panActivationKey?: KeyDefinition | KeyDefinition[] | null; - /** Pressing down this key deletes all selected nodes & edges. - * @default 'Backspace' - */ - deleteKey?: KeyDefinition | KeyDefinition[] | null; - /** Pressing down this key you can select multiple elements by clicking. - * @default 'Meta' for macOS, "Ctrl" for other systems - */ - multiSelectionKey?: KeyDefinition | KeyDefinition[] | null; - /** If a key is set, you can zoom the viewport while that key is held down even if panOnScroll is set to false. - * - * By setting this prop to null you can disable this functionality. - * @default 'Meta' for macOS, "Ctrl" for other systems - * */ - zoomActivationKey?: KeyDefinition | KeyDefinition[] | null; - /** If set, initial viewport will show all nodes & edges */ - fitView?: boolean; - /** Options to be used in combination with fitView - * @example - * const fitViewOptions = { - * padding: 0.1, - * includeHiddenNodes: false, - * minZoom: 0.1, - * maxZoom: 1, - * duration: 200, - * nodes: [{id: 'node-1'}, {id: 'node-2'}], // nodes to fit - * }; - */ - fitViewOptions?: FitViewOptions; - /** Defines nodes relative position to its coordinates - * @example - * [0, 0] // default, top left - * [0.5, 0.5] // center - * [1, 1] // bottom right - */ - nodeOrigin?: NodeOrigin; - /** With a threshold greater than zero you can control the distinction between node drag and click events. - * - * If threshold equals 1, you need to drag the node 1 pixel before a drag event is fired. - * @default 1 - */ - nodeDragThreshold?: number; - /** Distance that the mouse can move between mousedown/up that will trigger a click - * @default 0 - */ - paneClickDistance?: number; - /** Distance that the mouse can move between mousedown/up that will trigger a click - * @default 0 - */ - nodeClickDistance?: number; - /** Minimum zoom level - * @default 0.5 - */ - minZoom?: number; - /** Maximum zoom level - * @default 2 - */ - maxZoom?: number; - /** Sets the initial position and zoom of the viewport. - * - * If a default viewport is provided but fitView is enabled, the default viewport will be ignored. - * @example - * const initialViewport = { - * zoom: 0.5, - * position: { x: 0, y: 0 } - * }; - */ - initialViewport?: Viewport; - /** Custom viewport writable to be used instead of internal one */ - viewport?: Writable; - /** The radius around a handle where you drop a connection line to create a new edge. - * @default 20 - */ - connectionRadius?: number; - /** 'strict' connection mode will only allow you to connect source handles to target handles. - * - * 'loose' connection mode will allow you to connect handles of any type to one another. - * @default 'strict' - */ - connectionMode?: ConnectionMode; - /** Styles to be applied to the connection line */ - connectionLineStyle?: string; - /** Styles to be applied to the container of the connection line */ - connectionLineContainerStyle?: string; - /** When set to "partial", when the user creates a selection box by click and dragging nodes that are only partially in the box are still selected. - * @default 'full' - */ - selectionMode?: SelectionMode; - /** Grid all nodes will snap to - * @example [20, 20] - */ - snapGrid?: SnapGrid; - /** Color of edge markers - * @example "#b1b1b7" - */ - defaultMarkerColor?: string; - /** Controls if all nodes should be draggable - * @default true - */ - nodesDraggable?: boolean; - /** Controls if all nodes should be connectable to each other - * @default true - */ - nodesConnectable?: boolean; - /** Controls if all elements should (nodes & edges) be selectable - * @default true - */ - elementsSelectable?: boolean; - /** By default the viewport extends infinitely. You can use this prop to set a boundary. - * - * The first pair of coordinates is the top left boundary and the second pair is the bottom right. - * @example [[-1000, -10000], [1000, 1000]] - */ - translateExtent?: CoordinateExtent; - /** By default the nodes can be placed anywhere. You can use this prop to set a boundary. - * - * The first pair of coordinates is the top left boundary and the second pair is the bottom right. - * @example [[-1000, -10000], [1000, 1000]] - */ - nodeExtent?: CoordinateExtent; - /** Disabling this prop will allow the user to scroll the page even when their pointer is over the flow. - * @default true - */ - preventScrolling?: boolean; - /** Controls if the viewport should zoom by scrolling inside the container */ - zoomOnScroll?: boolean; - /** Controls if the viewport should zoom by double clicking somewhere on the flow */ - zoomOnDoubleClick?: boolean; - /** Controls if the viewport should zoom by pinching on a touch screen */ - zoomOnPinch?: boolean; - /** Controls if the viewport should pan by scrolling inside the container - * - * Can be limited to a specific direction with panOnScrollMode - */ - panOnScroll?: boolean; - /** This prop is used to limit the direction of panning when panOnScroll is enabled. - * - * The "free" option allows panning in any direction. - * @default "free" - * @example "horizontal" | "vertical" - */ - panOnScrollMode?: PanOnScrollMode; - /** Enableing this prop allows users to pan the viewport by clicking and dragging. - * - * You can also set this prop to an array of numbers to limit which mouse buttons can activate panning. - * @example [0, 2] // allows panning with the left and right mouse buttons - * [0, 1, 2, 3, 4] // allows panning with all mouse buttons - */ - panOnDrag?: boolean | number[]; - /** Select multiple elements with a selection box, without pressing down selectionKey */ - selectionOnDrag?: boolean; - /** You can enable this optimisation to instruct Svelte Flow to only render nodes and edges that would be visible in the viewport. - * - * This might improve performance when you have a large number of nodes and edges but also adds an overhead. - * @default false - */ - onlyRenderVisibleElements?: boolean; - /** You can enable this prop to automatically pan the viewport while making a new connection. - * @default true - */ - autoPanOnConnect?: boolean; - /** You can enable this prop to automatically pan the viewport while dragging a node. - * @default true - */ - autoPanOnNodeDrag?: boolean; - /** Set position of the attribution - * @default 'bottom-right' - * @example 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' - */ - attributionPosition?: PanelPosition; - /** By default, we render a small attribution in the corner of your flows that links back to the project. - * - * Anyone is free to remove this attribution whether they're a Pro subscriber or not - * but we ask that you take a quick look at our {@link https://reactflow.dev/learn/troubleshooting/remove-attribution | removing attribution guide} - * before doing so. - */ - proOptions?: ProOptions; - /** Defaults to be applied to all new edges that are added to the flow. - * - * Properties on a new edge will override these defaults if they exist. - * @example - * const defaultEdgeOptions = { - * type: 'customEdgeType', - * animated: true, - * interactionWidth: 10, - * data: { label: 'custom label' }, - * hidden: false, - * deletable: true, - * selected: false, - * focusable: true, - * markerStart: EdgeMarker.ArrowClosed, - * markerEnd: EdgeMarker.ArrowClosed, - * zIndex: 12, - * ariaLabel: 'custom aria label' - * } - */ - defaultEdgeOptions?: DefaultEdgeOptions; - /** Sets a fixed width for the flow */ - width?: number; - /** Sets a fixed height for the flow */ - height?: number; - /** Controls color scheme used for styling the flow - * @default 'system' - * @example 'system' | 'light' | 'dark' - */ - colorMode?: ColorMode; - /** Class to be applied to the flow container */ - class?: string; - /** Styles to be applied to the flow container */ - style?: string; - /** Choose from the built-in edge types to be used for connections - * @default 'default' | ConnectionLineType.Bezier - * @example 'straight' | 'default' | 'step' | 'smoothstep' | 'bezier' - * @example ConnectionLineType.Straight | ConnectionLineType.Default | ConnectionLineType.Step | ConnectionLineType.SmoothStep | ConnectionLineType.Bezier - */ - connectionLineType?: ConnectionLineType; - /** This callback can be used to validate a new connection - * - * If you return false, the edge will not be added to your flow. - * If you have custom connection logic its preferred to use this callback over the isValidConnection prop on the handle component for performance reasons. - * @default (connection: Connection) => true - */ - isValidConnection?: IsValidConnection; - /** This event handler is called when the user begins to pan or zoom the viewport */ - onMoveStart?: OnMoveStart; - /** This event handler is called when the user pans or zooms the viewport */ - onMove?: OnMove; - /** This event handler is called when the user stops panning or zooming the viewport */ - onMoveEnd?: OnMoveEnd; - /** Ocassionally something may happen that causes Svelte Flow to throw an error. - * - * Instead of exploding your application, we log a message to the console and then call this event handler. - * You might use it for additional logging or to show a message to the user. - */ - onerror?: OnError; - /** This handler gets called when the user deletes nodes or edges. - * @example - * onDelete={({nodes, edges}) => { - * console.log('deleted nodes:', nodes); - * console.log('deleted edges:', edges); - * }} - */ - ondelete?: OnDelete; - /** This handler gets called before the user deletes nodes or edges and provides a way to abort the deletion by returning false. */ - onbeforedelete?: OnBeforeDelete; +import type { Component } from 'svelte'; +import type { + EdgeEvents, + NodeEvents, + NodeSelectionEvents, + OnSelectionDrag, + PaneEvents +} from '$lib/types/events'; - /** This handler gets called when a new edge is created. You can use it to modify the newly created edge. */ - onedgecreate?: OnEdgeCreate; - - /** This event gets fired when a connection successfully completes and an edge is created. */ - onconnect?: OnConnect; - /** When a user starts to drag a connection line, this event gets fired. */ - onconnectstart?: OnConnectStart; - /** When a user stops dragging a connection line, this event gets fired. */ - onconnectend?: OnConnectEnd; - /** This handler gets called when the flow is finished initializing */ - oninit?: () => void; -}; +export type SvelteFlowProps< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +> = NodeEvents & + NodeSelectionEvents & + EdgeEvents & + PaneEvents & { + /** + * The id of the flow. This is necessary if you want to render multiple flows. + */ + id?: string; + /** Sets a fixed width for the flow */ + width?: number; + /** Sets a fixed height for the flow */ + height?: number; + /** + * An array of nodes to render in a flow. + * @example + * const nodes = $state.raw([ + * { + * id: 'node-1', + * type: 'input', + * data: { label: 'Node 1' }, + * position: { x: 250, y: 50 } + * } + * ]); + */ + nodes?: NodeType[]; + /** + * An array of edges to render in a flow. + * @example + * const edges = $state.raw([ + * { + * id: 'edge-1-2', + * source: 'node-1', + * target: 'node-2', + * } + * ]); + */ + edges?: EdgeType[]; + /** + * Custom node types to be available in a flow. + * Svelte Flow matches a node's type to a component in the nodeTypes object. + * @example + * import CustomNode from './CustomNode.svelte'; + * + * const nodeTypes = { nameOfNodeType: CustomNode }; + */ + nodeTypes?: NodeTypes; + /** + * Custom edge types to be available in a flow. + * Svelte Flow matches an edge's type to a component in the edgeTypes object. + * @example + * import CustomEdge from './CustomEdge.svelte'; + * + * const edgeTypes = { nameOfEdgeType: CustomEdge }; + */ + edgeTypes?: EdgeTypes; + /** Pressing down this key you can select multiple elements with a selection box. + * @default 'Shift' + */ + selectionKey?: KeyDefinition | KeyDefinition[] | null; + /** If a key is set, you can pan the viewport while that key is held down even if panOnScroll is set to false. + * + * By setting this prop to null you can disable this functionality. + * @default 'Space' + */ + panActivationKey?: KeyDefinition | KeyDefinition[] | null; + /** Pressing down this key deletes all selected nodes & edges. + * @default 'Backspace' + */ + deleteKey?: KeyDefinition | KeyDefinition[] | null; + /** Pressing down this key you can select multiple elements by clicking. + * @default 'Meta' for macOS, "Ctrl" for other systems + */ + multiSelectionKey?: KeyDefinition | KeyDefinition[] | null; + /** If a key is set, you can zoom the viewport while that key is held down even if panOnScroll is set to false. + * + * By setting this prop to null you can disable this functionality. + * @default 'Meta' for macOS, "Ctrl" for other systems + * */ + zoomActivationKey?: KeyDefinition | KeyDefinition[] | null; + /** If set, initial viewport will show all nodes & edges */ + fitView?: boolean; + /** + * Options to be used in combination with fitView + * @example + * const fitViewOptions = { + * padding: 0.1, + * includeHiddenNodes: false, + * minZoom: 0.1, + * maxZoom: 1, + * duration: 200, + * nodes: [{id: 'node-1'}, {id: 'node-2'}], // nodes to fit + * }; + */ + fitViewOptions?: FitViewOptions; + /** + * Defines nodes relative position to its coordinates + * @default [0, 0] + * @example + * [0, 0] // default, top left + * [0.5, 0.5] // center + * [1, 1] // bottom right + */ + nodeOrigin?: NodeOrigin; + /** + * With a threshold greater than zero you can control the distinction between node drag and click events. + * If threshold equals 1, you need to drag the node 1 pixel before a drag event is fired. + * @default 1 + */ + nodeDragThreshold?: number; + /** + * Distance that the mouse can move between mousedown/up that will trigger a click + * @default 0 + */ + paneClickDistance?: number; + /** Distance that the mouse can move between mousedown/up that will trigger a click + * @default 0 + */ + nodeClickDistance?: number; + /** Minimum zoom level + * @default 0.5 + */ + minZoom?: number; + /** Maximum zoom level + * @default 2 + */ + maxZoom?: number; + /** + * Sets the initial position and zoom of the viewport. + * If a default viewport is provided but fitView is enabled, the default viewport will be ignored. + * @default { zoom: 1, position: { x: 0, y: 0 } } + * @example + * const initialViewport = { + * zoom: 0.5, + * position: { x: 0, y: 0 } + * }; + */ + initialViewport?: Viewport; + /** Custom viewport to be used instead of internal one */ + viewport?: Viewport; + /** + * The radius around a handle where you drop a connection line to create a new edge. + * @default 20 + */ + connectionRadius?: number; + /** + * 'strict' connection mode will only allow you to connect source handles to target handles. + * 'loose' connection mode will allow you to connect handles of any type to one another. + * @default 'strict' + */ + connectionMode?: ConnectionMode; + /** Provide a custom snippet to be used insted of the default connection line */ + connectionLineComponent?: Component; + /** Styles to be applied to the connection line */ + connectionLineStyle?: string; + /** Styles to be applied to the container of the connection line */ + connectionLineContainerStyle?: string; + /** + * When set to "partial", when the user creates a selection box by click and dragging + * nodes that are only partially in the box are still selected. + * @default 'full' + */ + selectionMode?: SelectionMode; + /** + * Controls if nodes should be automatically selected when being dragged + */ + selectNodesOnDrag?: boolean; + /** + * Grid all nodes will snap to + * @example [20, 20] + */ + snapGrid?: SnapGrid; + /** Color of edge markers + * @example "#b1b1b7" + */ + defaultMarkerColor?: string; + /** + * Controls if all nodes should be draggable + * @default true + */ + nodesDraggable?: boolean; + /** + * Controls if all nodes should be connectable to each other + * @default true + */ + nodesConnectable?: boolean; + /** Controls if all elements should (nodes & edges) be selectable + * @default true + */ + elementsSelectable?: boolean; + /** + * When `true`, focus between nodes can be cycled with the `Tab` key and selected with the `Enter` + * key. This option can be overridden by individual nodes by setting their `focusable` prop. + * @default true + */ + nodesFocusable?: boolean; + /** + * When `true`, focus between edges can be cycled with the `Tab` key and selected with the `Enter` + * key. This option can be overridden by individual edges by setting their `focusable` prop. + * @default true + */ + edgesFocusable?: boolean; + /** + * By default the viewport extends infinitely. You can use this prop to set a boundary. + * The first pair of coordinates is the top left boundary and the second pair is the bottom right. + * @default @default [[-∞, -∞], [+∞, +∞]] + * @example [[-1000, -10000], [1000, 1000]] + */ + translateExtent?: CoordinateExtent; + /** + * By default the nodes can be placed anywhere. You can use this prop to set a boundary. + * The first pair of coordinates is the top left boundary and the second pair is the bottom right. + * @default [[-∞, -∞], [+∞, +∞]] + * @example [[-1000, -10000], [1000, 1000]] + */ + nodeExtent?: CoordinateExtent; + /** + * Disabling this prop will allow the user to scroll the page even when their pointer is over the flow. + * @default true + */ + preventScrolling?: boolean; + /** + * Controls if the viewport should zoom by scrolling inside the container. + * @default true + */ + zoomOnScroll?: boolean; + /** + * Controls if the viewport should zoom by double clicking somewhere on the flow + * @default true + */ + zoomOnDoubleClick?: boolean; + /** + * Controls if the viewport should zoom by pinching on a touch screen + * @default true + */ + zoomOnPinch?: boolean; + /** + * Controls if the viewport should pan by scrolling inside the container + * Can be limited to a specific direction with panOnScrollMode + * @default false + */ + panOnScroll?: boolean; + /** + * This prop is used to limit the direction of panning when panOnScroll is enabled. + * The "free" option allows panning in any direction. + * @default "free" + * @example "horizontal" | "vertical" + */ + panOnScrollMode?: PanOnScrollMode; + /** + * Enableing this prop allows users to pan the viewport by clicking and dragging. + * You can also set this prop to an array of numbers to limit which mouse buttons can activate panning. + * @default true + * @example [0, 2] // allows panning with the left and right mouse buttons + * [0, 1, 2, 3, 4] // allows panning with all mouse buttons + */ + panOnDrag?: boolean | number[]; + /** + * Select multiple elements with a selection box, without pressing down selectionKey. + * @default false + */ + selectionOnDrag?: boolean; + /** + * You can enable this optimisation to instruct Svelte Flow to only render nodes and edges that would be visible in the viewport. + * This might improve performance when you have a large number of nodes and edges but also adds an overhead. + * @default false + */ + onlyRenderVisibleElements?: boolean; + /** + * You can enable this prop to automatically pan the viewport while making a new connection. + * @default true + */ + autoPanOnConnect?: boolean; + /** + * You can enable this prop to automatically pan the viewport while dragging a node. + * @default true + */ + autoPanOnNodeDrag?: boolean; + /** + * Defaults to be applied to all new edges that are added to the flow. + * Properties on a new edge will override these defaults if they exist. + * @example + * const defaultEdgeOptions = { + * type: 'customEdgeType', + * animated: true + * } + */ + defaultEdgeOptions?: DefaultEdgeOptions; + /** + * Controls color scheme used for styling the flow + * @default 'system' + * @example 'system' | 'light' | 'dark' + */ + colorMode?: ColorMode; + /** Fallback color mode for SSR if colorMode is set to 'system' */ + colorModeSSR?: Omit; + /** Class to be applied to the flow container */ + class?: ClassValue; + /** Styles to be applied to the flow container */ + style?: string; + /** Choose from the built-in edge types to be used for connections + * @default 'default' | ConnectionLineType.Bezier + * @example 'straight' | 'default' | 'step' | 'smoothstep' | 'bezier' + * @example ConnectionLineType.Straight | ConnectionLineType.Default | ConnectionLineType.Step | ConnectionLineType.SmoothStep | ConnectionLineType.Bezier + */ + connectionLineType?: ConnectionLineType; + /** Enabling this option will raise the z-index of nodes when they are selected. + * @default true + */ + elevateNodesOnSelect?: boolean; + /** + * Enabling this option will raise the z-index of edges when they are selected, + * or when the connected nodes are selected. + * @default true + */ + elevateEdgesOnSelect?: boolean; + /** + * You can use this prop to disable keyboard accessibility features such as selecting nodes or + * moving selected nodes with the arrow keys. + * @default false + */ + disableKeyboardA11y?: boolean; + /** + * If a node is draggable, clicking and dragging that node will move it around the canvas. Adding + * the `"nodrag"` class prevents this behavior and this prop allows you to change the name of that + * class. + * @default "nodrag" + */ + noDragClass?: string; + /** + * Typically, scrolling the mouse wheel when the mouse is over the canvas will zoom the viewport. + * Adding the `"nowheel"` class to an element n the canvas will prevent this behavior and this prop + * allows you to change the name of that class. + * @default "nowheel" + */ + noWheelClass?: string; + /** + * If an element in the canvas does not stop mouse events from propagating, clicking and dragging + * that element will pan the viewport. Adding the `"nopan"` class prevents this behavior and this + * prop allows you to change the name of that class. + * @default "nopan" + */ + noPanClass?: string; + /** Toggles ability to make connections via clicking the handles */ + clickConnect?: boolean; + /** + * This callback can be used to validate a new connection. + * If you return `false`, the edge will not be added to your flow. + * If you have custom connection logic its preferred to use this callback over the + * `isValidConnection` prop on the handle component for performance reasons. + */ + /** + * Set position of the attribution + * @default 'bottom-right' + * @example 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' + */ + attributionPosition?: PanelPosition; + /** + * By default, we render a small attribution in the corner of your flows that links back to the project. + * You are free to remove this attribution but we ask that you take a quick look at our + * {@link https://svelteflow.dev/learn/troubleshooting/remove-attribution | removing attribution guide} + * before doing so. + */ + proOptions?: ProOptions; + isValidConnection?: IsValidConnection; + /** This event handler is called when the user begins to pan or zoom the viewport */ + onmovestart?: OnMoveStart; + /** This event handler is called when the user pans or zooms the viewport */ + onmove?: OnMove; + /** This event handler is called when the user stops panning or zooming the viewport */ + onmoveend?: OnMoveEnd; + /** + * Ocassionally something may happen that causes Svelte Flow to throw an error. + * Instead of exploding your application, we log a message to the console and then call this event handler. + * You might use it for additional logging or to show a message to the user. + */ + onflowerror?: OnError; + /** This handler gets called when the user deletes nodes or edges. + * @example + * onDelete={({nodes, edges}) => { + * console.log('deleted nodes:', nodes); + * console.log('deleted edges:', edges); + * }} + */ + ondelete?: OnDelete; + /** This handler gets called before the user deletes nodes or edges and provides a way to abort the deletion by returning false. */ + onbeforedelete?: OnBeforeDelete; + /** This handler gets called when a new edge is created. You can use it to modify the newly created edge. */ + onbeforeconnect?: OnBeforeConnect; + /** This event gets fired when a connection successfully completes and an edge is created. */ + onconnect?: OnConnect; + /** When a user starts to drag a connection line, this event gets fired. */ + onconnectstart?: OnConnectStart; + /** When a user stops dragging a connection line, this event gets fired. */ + onconnectend?: OnConnectEnd; + /** This event gets fired when after an edge was reconnected*/ + onreconnect?: OnReconnect; + /** This event gets fired when a user starts to reconnect an edge */ + onreconnectstart?: OnReconnectStart; + /** This event gets fired when a user stops reconnecting an edge */ + onreconnectend?: OnReconnectEnd; + /** This handler gets called when an edge is reconnected. You can use it to modify the edge before the update is applied. */ + onbeforereconnect?: OnBeforeReconnect; + /** A connection is started by clicking on a handle */ + onclickconnectstart?: OnConnectStart; + /** A connection is finished by clicking on a handle */ + onclickconnectend?: OnConnectEnd; + /** This handler gets called when the flow is finished initializing */ + oninit?: () => void; + /** This event handler gets called when the selected nodes & edges change */ + onselectionchange?: OnSelectionChange; + /** This event handler gets called when a user starts to drag a selection box. */ + onselectiondragstart?: OnSelectionDrag; + /** This event handler gets called when a user drags a selection box. */ + onselectiondrag?: OnSelectionDrag; + /** This event handler gets called when a user stops dragging a selection box. */ + onselectiondragstop?: OnSelectionDrag; + /** This event handler gets called when the user starts to drag a selection box */ + onselectionstart?: (event: PointerEvent) => void; + /** This event handler gets called when the user finishes dragging a selection box */ + onselectionend?: (event: PointerEvent) => void; + }; diff --git a/packages/svelte/src/lib/container/SvelteFlow/utils.ts b/packages/svelte/src/lib/container/SvelteFlow/utils.ts deleted file mode 100644 index d7a71a7c..00000000 --- a/packages/svelte/src/lib/container/SvelteFlow/utils.ts +++ /dev/null @@ -1,91 +0,0 @@ -import type { Writable } from 'svelte/store'; -import type { CoordinateExtent } from '@xyflow/system'; - -import type { SvelteFlowStore } from '$lib/store/types'; -import type { EdgeTypes, NodeTypes } from '$lib/types'; - -// this is helper function for updating the store -// for props where we need to call a specific store action -export function updateStore( - store: SvelteFlowStore, - { - nodeTypes, - edgeTypes, - minZoom, - maxZoom, - translateExtent, - paneClickDistance - }: { - nodeTypes?: NodeTypes; - edgeTypes?: EdgeTypes; - minZoom?: number; - maxZoom?: number; - translateExtent?: CoordinateExtent; - paneClickDistance?: number; - } -) { - if (nodeTypes !== undefined) { - store.setNodeTypes(nodeTypes); - } - - if (edgeTypes !== undefined) { - store.setEdgeTypes(edgeTypes); - } - - if (minZoom !== undefined) { - store.setMinZoom(minZoom); - } - - if (maxZoom !== undefined) { - store.setMaxZoom(maxZoom); - } - - if (translateExtent !== undefined) { - store.setTranslateExtent(translateExtent); - } - - if (paneClickDistance !== undefined) { - store.setPaneClickDistance(paneClickDistance); - } -} - -const getKeys = (obj: T) => Object.keys(obj) as Array; - -type UnwrapWritable = T extends Writable ? U : T; - -// @todo there must be a better way to define the types here.. -export type UpdatableStoreProps = { - flowId?: UnwrapWritable; - connectionLineType?: UnwrapWritable; - connectionRadius?: UnwrapWritable; - selectionMode?: UnwrapWritable; - snapGrid?: UnwrapWritable; - defaultMarkerColor?: UnwrapWritable; - nodesDraggable?: UnwrapWritable; - nodesConnectable?: UnwrapWritable; - elementsSelectable?: UnwrapWritable; - onlyRenderVisibleElements?: UnwrapWritable; - isValidConnection?: UnwrapWritable; - autoPanOnConnect?: UnwrapWritable; - autoPanOnNodeDrag?: UnwrapWritable; - connectionMode?: UnwrapWritable; - onerror?: UnwrapWritable; - ondelete?: UnwrapWritable; - onedgecreate?: UnwrapWritable; - nodeDragThreshold?: UnwrapWritable; - onconnect?: UnwrapWritable; - onconnectstart?: UnwrapWritable; - onconnectend?: UnwrapWritable; - onbeforedelete?: UnwrapWritable; - nodeOrigin?: UnwrapWritable; -}; - -export function updateStoreByKeys(store: SvelteFlowStore, keys: UpdatableStoreProps) { - getKeys(keys).forEach((prop) => { - const update = keys[prop]; - if (update !== undefined) { - // @ts-expect-error @todo: how to fix this TS error? - store[prop].set(update); - } - }); -} diff --git a/packages/svelte/src/lib/container/Viewport/Viewport.svelte b/packages/svelte/src/lib/container/Viewport/Viewport.svelte index a6578a87..c7c5b4cf 100644 --- a/packages/svelte/src/lib/container/Viewport/Viewport.svelte +++ b/packages/svelte/src/lib/container/Viewport/Viewport.svelte @@ -1,22 +1,18 @@ -
- + {@render children()}
- - diff --git a/packages/svelte/src/lib/container/Zoom/Zoom.svelte b/packages/svelte/src/lib/container/Zoom/Zoom.svelte index 4148d278..42a644a6 100644 --- a/packages/svelte/src/lib/container/Zoom/Zoom.svelte +++ b/packages/svelte/src/lib/container/Zoom/Zoom.svelte @@ -1,92 +1,77 @@ -
{ + store.dragging = dragging; + }, + setPanZoomInstance: (instance: PanZoomInstance) => { + store.panZoom = instance; + }, + onPanZoomStart: onmovestart, + onPanZoom: onmove, + onPanZoomEnd: onmoveend, zoomOnScroll, zoomOnDoubleClick, zoomOnPinch, - panOnScroll: _panOnScroll, - panOnDrag: _panOnDrag, + panOnScroll: panOnScrollActive, + panOnDrag: panOnDragActive, panOnScrollSpeed: 0.5, panOnScrollMode: panOnScrollMode || PanOnScrollMode.Free, - zoomActivationKeyPressed: $zoomActivationKeyPressed, + zoomActivationKeyPressed: store.zoomActivationKeyPressed, preventScrolling: typeof preventScrolling === 'boolean' ? preventScrolling : true, - noPanClassName: 'nopan', - noWheelClassName: 'nowheel', - userSelectionActive: !!$selectionRect, - translateExtent: $translateExtent, - lib: $lib, + noPanClassName: store.noPanClass, + noWheelClassName: store.noWheelClass, + userSelectionActive: !!store.selectionRect, + translateExtent: store.translateExtent, + lib: 'svelte', paneClickDistance, - onTransformChange + onTransformChange: (transform: Transform) => { + store.viewport = { x: transform[0], y: transform[1], zoom: transform[2] }; + } }} > - + {@render children()}
- - diff --git a/packages/svelte/src/lib/container/Zoom/types.ts b/packages/svelte/src/lib/container/Zoom/types.ts index b7b4f29b..247a16e9 100644 --- a/packages/svelte/src/lib/container/Zoom/types.ts +++ b/packages/svelte/src/lib/container/Zoom/types.ts @@ -1,11 +1,11 @@ -import type { OnMoveStart, OnMove, OnMoveEnd, PanOnScrollMode, Viewport } from '@xyflow/system'; +import type { SvelteFlowStore } from '$lib/store/types'; +import type { Edge, Node } from '$lib/types'; +import type { OnMoveStart, OnMove, OnMoveEnd, PanOnScrollMode } from '@xyflow/system'; +import type { Snippet } from 'svelte'; -export type ZoomProps = { - initialViewport?: Viewport; +export type ZoomProps = { + store: SvelteFlowStore; panOnScrollMode: PanOnScrollMode; - onMove?: OnMove; - onMoveStart?: OnMoveStart; - onMoveEnd?: OnMoveEnd; preventScrolling: boolean; zoomOnScroll: boolean; zoomOnDoubleClick: boolean; @@ -13,4 +13,9 @@ export type ZoomProps = { panOnScroll: boolean; panOnDrag: boolean | number[]; paneClickDistance: number; + onmove?: OnMove; + onmovestart?: OnMoveStart; + onmoveend?: OnMoveEnd; + oninit?: () => void; + children: Snippet; }; diff --git a/packages/svelte/src/lib/hooks/derivedWarning.svelte.ts b/packages/svelte/src/lib/hooks/derivedWarning.svelte.ts new file mode 100644 index 00000000..c676f4b1 --- /dev/null +++ b/packages/svelte/src/lib/hooks/derivedWarning.svelte.ts @@ -0,0 +1,24 @@ +import { key } from '$lib/store'; +import type { StoreContext } from '$lib/store/types'; +import { getContext } from 'svelte'; + +/** + * Warns the user that they should use $derived() when calling a hook. + * This is not neccessarry when the hook is called inside a child of , + * however exceptions can be made if you don't want to return a closure. + * @param functionName - The name of the function that is being called + * @param force - If true, the warning will be shown regardless if child of + */ +export function derivedWarning(functionName: string) { + const storeContext = getContext(key); + + if (!storeContext) { + throw new Error( + `In order to use ${functionName}() you need to wrap your component in a ` + ); + } + + if (storeContext.provider && typeof window === 'object' && !$effect.tracking()) { + throw new Error(`Use $derived(${functionName}()) to receive updates when values change.`); + } +} diff --git a/packages/svelte/src/lib/hooks/useColorMode.svelte.ts b/packages/svelte/src/lib/hooks/useColorMode.svelte.ts new file mode 100644 index 00000000..9ec2d65d --- /dev/null +++ b/packages/svelte/src/lib/hooks/useColorMode.svelte.ts @@ -0,0 +1,14 @@ +import type { ColorModeClass } from '@xyflow/system'; +import { useStore } from './useStore'; + +/** + * Hook for receiving the current color mode class 'dark' or 'light'. + * + */ +export function useColorMode(): { current: ColorModeClass } { + const { colorMode } = $derived(useStore()); + + return { + current: colorMode + }; +} diff --git a/packages/svelte/src/lib/hooks/useColorModeClass.ts b/packages/svelte/src/lib/hooks/useColorModeClass.ts deleted file mode 100644 index 07a9a824..00000000 --- a/packages/svelte/src/lib/hooks/useColorModeClass.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { ColorMode, ColorModeClass } from '@xyflow/system'; -import { readable, type Readable } from 'svelte/store'; - -function getMediaQuery() { - if (typeof window === 'undefined' || !window.matchMedia) { - return null; - } - - return window.matchMedia('(prefers-color-scheme: dark)'); -} - -/** - * Hook for receiving the current color mode class 'dark' or 'light'. - * - * @internal - * @param colorMode - The color mode to use ('dark', 'light' or 'system') - */ -export function useColorModeClass(colorMode: ColorMode = 'light'): Readable { - const colorModeClass = readable('light', (set) => { - if (colorMode !== 'system') { - set(colorMode); - - return; - } - - const mediaQuery = getMediaQuery(); - const updateColorModeClass = () => set(mediaQuery?.matches ? 'dark' : 'light'); - - set(mediaQuery?.matches ? 'dark' : 'light'); - mediaQuery?.addEventListener('change', updateColorModeClass); - - return () => { - mediaQuery?.removeEventListener('change', updateColorModeClass); - }; - }); - - return colorModeClass; -} diff --git a/packages/svelte/src/lib/hooks/useConnection.svelte.ts b/packages/svelte/src/lib/hooks/useConnection.svelte.ts new file mode 100644 index 00000000..da3688f4 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useConnection.svelte.ts @@ -0,0 +1,19 @@ +import { useStore } from '$lib/store'; + +import type { ConnectionState } from '@xyflow/system'; + +/** + * Hook for receiving the current connection. + * + * @public + * @returns Current connection as a signal + */ +export function useConnection(): { current: ConnectionState } { + const { connection } = $derived(useStore()); + + return { + get current() { + return connection; + } + }; +} diff --git a/packages/svelte/src/lib/hooks/useConnection.ts b/packages/svelte/src/lib/hooks/useConnection.ts deleted file mode 100644 index 4402ab69..00000000 --- a/packages/svelte/src/lib/hooks/useConnection.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { Readable } from 'svelte/store'; -import { useStore } from '$lib/store'; - -import type { ConnectionState } from '@xyflow/system'; - -/** - * Hook for receiving the current connection. - * - * @public - * @returns current connection as a readable store - */ -export function useConnection(): Readable { - const { connection } = useStore(); - - return connection; -} diff --git a/packages/svelte/src/lib/hooks/useHandleConnections.ts b/packages/svelte/src/lib/hooks/useHandleConnections.ts deleted file mode 100644 index 16f84f0c..00000000 --- a/packages/svelte/src/lib/hooks/useHandleConnections.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { derived } from 'svelte/store'; -import { areConnectionMapsEqual, type HandleConnection, type HandleType } from '@xyflow/system'; - -import { useStore } from '$lib/store'; -import { getContext } from 'svelte'; - -export type useHandleConnectionsParams = { - type: HandleType; - nodeId?: string; - id?: string | null; -}; - -const initialConnections: HandleConnection[] = []; - -/** - * Hook to check if a is connected to another and get the connections. - * - * @public - * @deprecated Use `useNodeConnections` instead. - * @param param.nodeId - * @param param.type - handle type 'source' or 'target' - * @param param.id - the handle id (this is only needed if the node has multiple handles of the same type) - * @returns an array with connections - */ -export function useHandleConnections({ type, nodeId, id }: useHandleConnectionsParams) { - const { edges, connectionLookup } = useStore(); - - console.warn( - '[DEPRECATED] `useHandleConnections` is deprecated. Instead use `useNodeConnections` https://svelteflow.dev/api-reference/hooks/useNodeConnections' - ); - - const _nodeId = getContext('svelteflow__node_id'); - const currentNodeId = nodeId ?? _nodeId; - - let prevConnections: Map | undefined = undefined; - - return derived( - [edges, connectionLookup], - ([, connectionLookup], set) => { - const nextConnections = connectionLookup.get(`${currentNodeId}-${type}${id ? `-${id}` : ''}`); - - if (!areConnectionMapsEqual(nextConnections, prevConnections)) { - prevConnections = nextConnections; - set(Array.from(prevConnections?.values() || [])); - } - }, - initialConnections - ); -} diff --git a/packages/svelte/src/lib/hooks/useHandleEdgeSelect.ts b/packages/svelte/src/lib/hooks/useHandleEdgeSelect.ts deleted file mode 100644 index 5e6ba5d3..00000000 --- a/packages/svelte/src/lib/hooks/useHandleEdgeSelect.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { get } from 'svelte/store'; -import { errorMessages } from '@xyflow/system'; - -import { useStore } from '$lib/store'; - -export function useHandleEdgeSelect() { - const { - edgeLookup, - selectionRect, - selectionRectMode, - multiselectionKeyPressed, - addSelectedEdges, - unselectNodesAndEdges, - elementsSelectable - } = useStore(); - - return (id: string) => { - const edge = get(edgeLookup).get(id); - - if (!edge) { - console.warn('012', errorMessages['error012'](id)); - return; - } - - const selectable = - edge.selectable || (get(elementsSelectable) && typeof edge.selectable === 'undefined'); - - if (selectable) { - selectionRect.set(null); - selectionRectMode.set(null); - - if (!edge.selected) { - addSelectedEdges([id]); - } else if (edge.selected && get(multiselectionKeyPressed)) { - unselectNodesAndEdges({ nodes: [], edges: [edge] }); - } - } - }; -} diff --git a/packages/svelte/src/lib/hooks/useInitialized.svelte.ts b/packages/svelte/src/lib/hooks/useInitialized.svelte.ts new file mode 100644 index 00000000..931c6cf1 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useInitialized.svelte.ts @@ -0,0 +1,28 @@ +import { useStore } from '$lib/store'; + +/** + * Hook for seeing if nodes are initialized + * @returns A boolean that indicates if nodes are initialized + * @public + */ +export function useNodesInitialized() { + const { nodesInitialized } = $derived(useStore()); + return { + get current() { + return nodesInitialized; + } + }; +} + +/** + * Hook for seeing if the viewport is initialized + * @returns - reactive viewportInitialized + */ +export function useViewportInitialized() { + const { viewportInitialized } = $derived(useStore()); + return { + get current() { + return viewportInitialized; + } + }; +} diff --git a/packages/svelte/src/lib/hooks/useInitialized.ts b/packages/svelte/src/lib/hooks/useInitialized.ts deleted file mode 100644 index 0f486abf..00000000 --- a/packages/svelte/src/lib/hooks/useInitialized.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useStore } from '$lib/store'; -import type { Readable } from 'svelte/store'; - -/** - * Hook for seeing if nodes are initialized - * @returns - nodesInitialized Writable - */ -export function useNodesInitialized() { - const { nodesInitialized } = useStore(); - return { - subscribe: nodesInitialized.subscribe - } as Readable; -} - -/** - * Hook for seeing if the flow is initialized - * @returns - initialized Writable - */ -export function useInitialized() { - const { initialized } = useStore(); - return { - subscribe: initialized.subscribe - } as Readable; -} diff --git a/packages/svelte/src/lib/hooks/useInternalNode.svelte.ts b/packages/svelte/src/lib/hooks/useInternalNode.svelte.ts new file mode 100644 index 00000000..46c1cc04 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useInternalNode.svelte.ts @@ -0,0 +1,25 @@ +import { useStore } from '$lib/store'; +import type { InternalNode } from '$lib/types'; + +/** + * Hook to get an internal node by id. + * + * @public + * @param id - the node id + * @returns An internal node or undefined + */ +export function useInternalNode(id: string): { current: InternalNode | undefined } { + const { nodeLookup, nodes } = $derived(useStore()); + + const node = $derived.by(() => { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + nodes; + return nodeLookup.get(id); + }); + + return { + get current() { + return node; + } + }; +} diff --git a/packages/svelte/src/lib/hooks/useInternalNode.ts b/packages/svelte/src/lib/hooks/useInternalNode.ts deleted file mode 100644 index 16c83960..00000000 --- a/packages/svelte/src/lib/hooks/useInternalNode.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { derived, type Readable } from 'svelte/store'; - -import { useStore } from '$lib/store'; -import type { InternalNode } from '$lib/types'; - -/** - * Hook to get an internal node by id. - * - * @public - * @param id - the node id - * @returns a readable with an internal node or undefined - */ -export function useInternalNode(id: string): Readable { - const { nodeLookup, nodes } = useStore(); - - return derived([nodeLookup, nodes], ([nodeLookup]) => nodeLookup.get(id)); -} diff --git a/packages/svelte/src/lib/hooks/useNodeConnections.svelte.ts b/packages/svelte/src/lib/hooks/useNodeConnections.svelte.ts new file mode 100644 index 00000000..111fc715 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useNodeConnections.svelte.ts @@ -0,0 +1,70 @@ +import { + areConnectionMapsEqual, + type NodeConnection, + type HandleType, + type Connection, + handleConnectionChange +} from '@xyflow/system'; + +import { useStore } from '$lib/store'; +import { getContext } from 'svelte'; + +type UseNodeConnectionsParams = { + id?: string; + handleType?: HandleType; + handleId?: string; + onConnect?: (connections: Connection[]) => void; + onDisconnect?: (connections: Connection[]) => void; +}; + +const initialConnections: NodeConnection[] = []; + +/** + * Hook to retrieve all edges connected to a node. Can be filtered by handle type and id. + * + * @public + * @param param.id - node id - optional if called inside a custom node + * @param param.handleType - filter by handle type 'source' or 'target' + * @param param.handleId - filter by handle id (this is only needed if the node has multiple handles of the same type) + * @param param.onConnect - gets called when a connection is established + * @param param.onDisconnect - gets called when a connection is removed + * @returns An array with connections + */ +export function useNodeConnections({ + id, + handleType, + handleId, + onConnect, + onDisconnect +}: UseNodeConnectionsParams = {}) { + const { edges, connectionLookup } = $derived(useStore()); + + const contextNodeId = getContext('svelteflow__node_id'); + const nodeId = id ?? contextNodeId; + + let prevConnections: Map = new Map(); + let connectionsArray: NodeConnection[] = initialConnections; + + const connections = $derived.by(() => { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + edges; + const nextConnections = + connectionLookup.get( + `${nodeId}${handleType ? (handleId ? `-${handleType}-${handleId}` : `-${handleType}`) : ''}` + ) ?? new Map(); + if (!areConnectionMapsEqual(nextConnections, prevConnections)) { + if (onConnect) handleConnectionChange(nextConnections, prevConnections, onConnect); + if (onDisconnect) handleConnectionChange(prevConnections, nextConnections, onDisconnect); + + prevConnections = nextConnections; + connectionsArray = Array.from(nextConnections.values() || initialConnections); + } + return connectionsArray; + }); + + return { + get current() { + return connections; + } + }; +} diff --git a/packages/svelte/src/lib/hooks/useNodeConnections.ts b/packages/svelte/src/lib/hooks/useNodeConnections.ts deleted file mode 100644 index e3c28759..00000000 --- a/packages/svelte/src/lib/hooks/useNodeConnections.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { getContext } from 'svelte'; -import { derived } from 'svelte/store'; -import { - areConnectionMapsEqual, - errorMessages, - type NodeConnection, - type HandleType -} from '@xyflow/system'; - -import { useStore } from '$lib/store'; - -const error014 = errorMessages['error014'](); - -type UseNodeConnectionsParams = { - id?: string; - handleType?: HandleType; - handleId?: string; - // TODO: Svelte 5 - // onConnect?: (connections: Connection[]) => void; - // onDisconnect?: (connections: Connection[]) => void; -}; - -const initialConnections: NodeConnection[] = []; - -/** - * Hook to retrieve all edges connected to a node. Can be filtered by handle type and id. - * - * @public - * @param param.id - node id - optional if called inside a custom node - * @param param.handleType - filter by handle type 'source' or 'target' - * @param param.handleId - filter by handle id (this is only needed if the node has multiple handles of the same type) - * @todo @param param.onConnect - gets called when a connection is established - * @todo @param param.onDisconnect - gets called when a connection is removed - * @returns an array with connections - */ -export function useNodeConnections({ id, handleType, handleId }: UseNodeConnectionsParams = {}) { - const { edges, connectionLookup } = useStore(); - - const nodeId = getContext('svelteflow__node_id'); - const currentNodeId = id ?? nodeId; - - if (!currentNodeId) { - throw new Error(error014); - } - - let prevConnections: Map | undefined = undefined; - - return derived( - [edges, connectionLookup], - ([, connectionLookup], set) => { - const nextConnections = connectionLookup.get( - `${currentNodeId}${handleType ? (handleId ? `-${handleType}-${handleId}` : `-${handleType}`) : ''}` - ); - - if (!areConnectionMapsEqual(nextConnections, prevConnections)) { - prevConnections = nextConnections; - set(Array.from(prevConnections?.values() || [])); - } - }, - initialConnections - ); -} diff --git a/packages/svelte/src/lib/hooks/useNodesData.ts b/packages/svelte/src/lib/hooks/useNodesData.svelte.ts similarity index 71% rename from packages/svelte/src/lib/hooks/useNodesData.ts rename to packages/svelte/src/lib/hooks/useNodesData.svelte.ts index 2e8fba50..71432ceb 100644 --- a/packages/svelte/src/lib/hooks/useNodesData.ts +++ b/packages/svelte/src/lib/hooks/useNodesData.svelte.ts @@ -1,4 +1,3 @@ -import { derived, type Readable } from 'svelte/store'; import { shallowNodeData } from '@xyflow/system'; import type { Node } from '$lib/types'; @@ -9,22 +8,24 @@ import { useStore } from '$lib/store'; * * @public * @param nodeId - The id (or ids) of the node to get the data from - * @returns A readable store with an array of data objects + * @returns An array of data objects */ export function useNodesData( nodeId: string -): Readable | null>; +): { current: Pick | null }; export function useNodesData( nodeIds: string[] -): Readable[]>; +): { current: Pick[] }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export function useNodesData(nodeIds: any): any { - const { nodes, nodeLookup } = useStore(); + const { nodes, nodeLookup } = $derived(useStore()); // eslint-disable-next-line @typescript-eslint/no-explicit-any let prevNodesData: any[] = []; let initialRun = true; - return derived([nodes, nodeLookup], ([, nodeLookup], set) => { + const nodeData = $derived.by(() => { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + nodes; const nextNodesData = []; const isArrayOfIds = Array.isArray(nodeIds); const _nodeIds = isArrayOfIds ? nodeIds : [nodeIds]; @@ -42,8 +43,15 @@ export function useNodesData(nodeIds: any): any { if (!shallowNodeData(nextNodesData, prevNodesData) || initialRun) { prevNodesData = nextNodesData; - set(isArrayOfIds ? nextNodesData : nextNodesData[0] ?? null); initialRun = false; } + + return isArrayOfIds ? prevNodesData : (prevNodesData[0] ?? null); }); + + return { + get current() { + return nodeData; + } + }; } diff --git a/packages/svelte/src/lib/hooks/useNodesEdges.ts b/packages/svelte/src/lib/hooks/useNodesEdges.ts deleted file mode 100644 index 062f596d..00000000 --- a/packages/svelte/src/lib/hooks/useNodesEdges.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useStore } from '$lib/store'; - -/** - * Hook for getting the current nodes from the store. - * - * @public - * @returns store with an array of nodes - */ -export function useNodes() { - const { nodes } = useStore(); - return nodes; -} - -/** - * Hook for getting the current edges from the store. - * - * @public - * @returns store with an array of edges - */ -export function useEdges() { - const { edges } = useStore(); - return edges; -} diff --git a/packages/svelte/src/lib/hooks/useNodesEdgesViewport.svelte.ts b/packages/svelte/src/lib/hooks/useNodesEdgesViewport.svelte.ts new file mode 100644 index 00000000..aea6ab84 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useNodesEdgesViewport.svelte.ts @@ -0,0 +1,75 @@ +import { useStore } from '$lib/store'; +import type { Edge, Node } from '$lib/types'; +import type { Viewport } from '@xyflow/system'; + +/** + * Hook for getting the current nodes from the store. + * + * @public + * @returns A reactive signal of the current nodes + */ +export function useNodes() { + const store = $derived(useStore()); + return { + get current() { + return store.nodes; + }, + set current(nodes) { + store.nodes = nodes; + }, + update(updateFn: (nodes: Node[]) => Node[]) { + store.nodes = updateFn(store.nodes); + }, + set(nodes: Node[]) { + store.nodes = nodes; + } + }; +} + +/** + * Hook for getting the current edges from the store. + * + * @public + * @returns A reactive signal of the current edges + */ +export function useEdges() { + const store = $derived(useStore()); + return { + get current() { + return store.edges; + }, + set current(edges) { + store.edges = edges; + }, + update(updateFn: (edges: Edge[]) => Edge[]) { + store.edges = updateFn(store.edges); + }, + set(edges: Edge[]) { + store.edges = edges; + } + }; +} + +/** + * Hook for getting the current viewport from the store. + * + * @public + * @returns A reactive signal of the current viewport + */ +export function useViewport() { + const store = $derived(useStore()); + return { + get current() { + return store.viewport; + }, + set current(viewport: Viewport) { + store.viewport = viewport; + }, + update(updateFn: (viewport: Viewport) => Viewport) { + store.viewport = updateFn(store.viewport); + }, + set(viewport: Viewport) { + store.viewport = viewport; + } + }; +} diff --git a/packages/svelte/src/lib/hooks/useOnSelectionChange.svelte.ts b/packages/svelte/src/lib/hooks/useOnSelectionChange.svelte.ts new file mode 100644 index 00000000..f827ddcc --- /dev/null +++ b/packages/svelte/src/lib/hooks/useOnSelectionChange.svelte.ts @@ -0,0 +1,15 @@ +import type { OnSelectionChange } from '$lib/types'; +import { useStore } from '$lib/hooks/useStore'; + +export function useOnSelectionChange(onselectionchange: OnSelectionChange) { + const store = $derived(useStore()); + const symbol = Symbol(); + + $effect(() => { + store.selectionChangeHandlers.set(symbol, onselectionchange); + + return () => { + store.selectionChangeHandlers.delete(symbol); + }; + }); +} diff --git a/packages/svelte/src/lib/hooks/useStore.ts b/packages/svelte/src/lib/hooks/useStore.ts new file mode 100644 index 00000000..11c89e7e --- /dev/null +++ b/packages/svelte/src/lib/hooks/useStore.ts @@ -0,0 +1,25 @@ +import { getContext } from 'svelte'; +import type { StoreContext, SvelteFlowStore } from '../store/types'; + +import { key } from '../store'; +import { derivedWarning } from './derivedWarning.svelte'; +import type { Node, Edge } from '$lib/types'; + +export function useStore< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +>(): SvelteFlowStore { + const storeContext = getContext>(key); + + if (!storeContext) { + throw new Error( + 'To call useStore outside of you need to wrap your component in a ' + ); + } + + if (process.env.NODE_ENV === 'development') { + derivedWarning('useStore'); + } + + return storeContext.getStore(); +} diff --git a/packages/svelte/src/lib/hooks/useSvelteFlow.ts b/packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts similarity index 66% rename from packages/svelte/src/lib/hooks/useSvelteFlow.ts rename to packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts index 4c90d6eb..42e91e0d 100644 --- a/packages/svelte/src/lib/hooks/useSvelteFlow.ts +++ b/packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts @@ -1,4 +1,3 @@ -import { get, type Writable } from 'svelte/store'; import { getOverlappingArea, isRectObject, @@ -22,16 +21,16 @@ import { import { useStore } from '$lib/store'; import type { Edge, FitViewOptions, InternalNode, Node } from '$lib/types'; -import { isNode } from '$lib/utils'; +import { isEdge, isNode } from '$lib/utils'; +import { untrack } from 'svelte'; /** - * Hook for accessing the ReactFlow instance. + * Hook for accessing the SvelteFlow instance. * * @public - * - * @returns helper functions + * @returns A set of helper functions */ -export function useSvelteFlow(): { +export function useSvelteFlow(): { /** * Zooms viewport in by 1.2. * @@ -50,33 +49,33 @@ export function useSvelteFlow(): { * @param id - the node id * @returns the node or undefined if no node was found */ - getInternalNode: (id: string) => InternalNode | undefined; + getInternalNode: (id: string) => InternalNode | undefined; /** * Returns a node by id. * * @param id - the node id * @returns the node or undefined if no node was found */ - getNode: (id: string) => Node | undefined; + getNode: (id: string) => NodeType | undefined; /** * Returns nodes. * * @returns nodes array */ - getNodes: (ids?: string[]) => Node[]; + getNodes: (ids?: string[]) => NodeType[]; /** * Returns an edge by id. * * @param id - the edge id * @returns the edge or undefined if no edge was found */ - getEdge: (id: string) => Edge | undefined; + getEdge: (id: string) => EdgeType | undefined; /** * Returns edges. * * @returns edges array */ - getEdges: (ids?: string[]) => Edge[]; + getEdges: (ids?: string[]) => EdgeType[]; /** * Sets the current zoom level. * @@ -132,10 +131,10 @@ export function useSvelteFlow(): { * @returns an array of intersecting nodes */ getIntersectingNodes: ( - nodeOrRect: Node | { id: Node['id'] } | Rect, + nodeOrRect: NodeType | { id: NodeType['id'] } | Rect, partially?: boolean, - nodesToIntersect?: Node[] - ) => Node[]; + nodesToIntersect?: NodeType[] + ) => NodeType[]; /** * Checks if the given node or rect intersects with the passed rect. * @@ -146,7 +145,7 @@ export function useSvelteFlow(): { * @returns true if the node or rect intersects with the given area */ isNodeIntersecting: ( - nodeOrRect: Node | { id: Node['id'] } | Rect, + nodeOrRect: NodeType | { id: NodeType['id'] } | Rect, area: Rect, partially?: boolean ) => boolean; @@ -169,9 +168,9 @@ export function useSvelteFlow(): { nodes, edges }: { - nodes?: (Node | { id: Node['id'] })[]; - edges?: (Edge | { id: Edge['id'] })[]; - }) => Promise<{ deletedNodes: Node[]; deletedEdges: Edge[] }>; + nodes?: (Partial & { id: string })[]; + edges?: (Partial & { id: string })[]; + }) => Promise<{ deletedNodes: NodeType[]; deletedEdges: EdgeType[] }>; /** * Converts a screen / client position to a flow position. * @@ -196,7 +195,6 @@ export function useSvelteFlow(): { * const clientPosition = flowToScreenPosition({ x: node.position.x, y: node.position.y }) */ flowToScreenPosition: (flowPosition: XYPosition) => XYPosition; - viewport: Writable; /** * Updates a node. * @@ -207,9 +205,14 @@ export function useSvelteFlow(): { * @example * updateNode('node-1', (node) => ({ position: { x: node.position.x + 10, y: node.position.y } })); */ + // updateNode: ( + // id: string, + // nodeUpdate: Partial | ((node: NodeType) => Partial), + // options?: { replace: boolean } + // ) => void; updateNode: ( id: string, - nodeUpdate: Partial | ((node: Node) => Partial), + nodeUpdate: Partial | ((node: NodeType) => Partial), options?: { replace: boolean } ) => void; /** @@ -224,7 +227,7 @@ export function useSvelteFlow(): { */ updateNodeData: ( id: string, - dataUpdate: object | ((node: Node) => object), + dataUpdate: Partial | ((node: NodeType) => Partial), options?: { replace: boolean } ) => void; /** @@ -232,7 +235,22 @@ export function useSvelteFlow(): { * * @returns the nodes, edges and the viewport as a JSON object */ - toObject: () => { nodes: Node[]; edges: Edge[]; viewport: Viewport }; + /** + * Updates an edge. + * + * @param id - id of the edge to update + * @param edgeUpdate - the edge update as an object or a function that receives the current edge and returns the edge update + * @param options.replace - if true, the edge is replaced with the edge update, otherwise the changes get merged + * + * @example + * updateNode('node-1', (node) => ({ position: { x: node.position.x + 10, y: node.position.y } })); + */ + updateEdge: ( + id: string, + edgeUpdate: Partial | ((edge: EdgeType) => Partial), + options?: { replace: boolean } + ) => void; + toObject: () => { nodes: NodeType[]; edges: EdgeType[]; viewport: Viewport }; /** * Returns the bounds of the given nodes or node ids. * @@ -240,7 +258,7 @@ export function useSvelteFlow(): { * * @returns the bounds of the given nodes */ - getNodesBounds: (nodes: (Node | InternalNode | string)[]) => Rect; + getNodesBounds: (nodes: (NodeType | InternalNode | string)[]) => Rect; /** Gets all connections for a given handle belonging to a specific node. * * @param type - handle type 'source' or 'target' @@ -258,37 +276,17 @@ export function useSvelteFlow(): { id?: string | null; }) => HandleConnection[]; } { - const { - zoomIn, - zoomOut, - fitView, - onbeforedelete, - snapGrid, - viewport, - width, - height, - minZoom, - maxZoom, - panZoom, - nodes, - edges, - domNode, - nodeLookup, - nodeOrigin, - edgeLookup, - connectionLookup - } = useStore(); + const store = $derived(useStore()); - const getNodeRect = (node: Node | { id: Node['id'] }): Rect | null => { - const $nodeLookup = get(nodeLookup); - const nodeToUse = isNode(node) ? node : $nodeLookup.get(node.id)!; + const getNodeRect = (node: NodeType | { id: NodeType['id'] }): Rect | null => { + const nodeToUse = isNode(node) ? node : store.nodeLookup.get(node.id)!; const position = nodeToUse.parentId ? evaluateAbsolutePosition( nodeToUse.position, nodeToUse.measured, nodeToUse.parentId, - $nodeLookup, - get(nodeOrigin) + store.nodeLookup, + store.nodeOrigin ) : nodeToUse.position; @@ -302,61 +300,61 @@ export function useSvelteFlow(): { return nodeToRect(nodeWithPosition); }; - const updateNode = ( + function updateNode( id: string, - nodeUpdate: Partial | ((node: Node) => Partial), + nodeUpdate: Partial | ((node: NodeType) => Partial), options: { replace: boolean } = { replace: false } - ) => { - const node = get(nodeLookup).get(id)?.internals.userNode; + ) { + store.nodes = untrack(() => store.nodes).map((node) => { + if (node.id === id) { + const nextNode = typeof nodeUpdate === 'function' ? nodeUpdate(node) : nodeUpdate; + return options?.replace && isNode(nextNode) ? nextNode : { ...node, ...nextNode }; + } - if (!node) { - return; - } + return node; + }); + } - const nextNode = typeof nodeUpdate === 'function' ? nodeUpdate(node as Node) : nodeUpdate; + function updateEdge( + id: string, + edgeUpdate: Partial | ((edge: EdgeType) => Partial), + options: { replace: boolean } = { replace: false } + ) { + store.edges = untrack(() => store.edges).map((edge) => { + if (edge.id === id) { + const nextEdge = typeof edgeUpdate === 'function' ? edgeUpdate(edge) : edgeUpdate; + return options.replace && isEdge(nextEdge) ? nextEdge : { ...edge, ...nextEdge }; + } - if (options.replace) { - nodes.update((nds) => - nds.map((node) => { - if (node.id === id) { - return isNode(nextNode) ? nextNode : { ...node, ...nextNode }; - } + return edge; + }); + } - return node; - }) - ); - } else { - Object.assign(node, nextNode); - nodes.update((nds) => nds); - } - }; - - const getInternalNode = (id: string) => get(nodeLookup).get(id); + const getInternalNode = (id: string) => store.nodeLookup.get(id); return { - zoomIn, - zoomOut, + zoomIn: store.zoomIn, + zoomOut: store.zoomOut, getInternalNode, getNode: (id) => getInternalNode(id)?.internals.userNode, - getNodes: (ids) => (ids === undefined ? get(nodes) : getElements(get(nodeLookup), ids)), - getEdge: (id) => get(edgeLookup).get(id), - getEdges: (ids) => (ids === undefined ? get(edges) : getElements(get(edgeLookup), ids)), + getNodes: (ids) => (ids === undefined ? store.nodes : getElements(store.nodeLookup, ids)), + getEdge: (id) => store.edgeLookup.get(id), + getEdges: (ids) => (ids === undefined ? store.edges : getElements(store.edgeLookup, ids)), setZoom: (zoomLevel, options) => { - const currentPanZoom = get(panZoom); - return currentPanZoom - ? currentPanZoom.scaleTo(zoomLevel, { duration: options?.duration }) + const panZoom = store.panZoom; + return panZoom + ? panZoom.scaleTo(zoomLevel, { duration: options?.duration }) : Promise.resolve(false); }, - getZoom: () => get(viewport).zoom, + getZoom: () => store.viewport.zoom, setViewport: async (nextViewport, options) => { - const currentViewport = get(viewport); - const currentPanZoom = get(panZoom); + const currentViewport = store.viewport; - if (!currentPanZoom) { + if (!store.panZoom) { return Promise.resolve(false); } - await currentPanZoom.setViewport( + await store.panZoom.setViewport( { x: nextViewport.x ?? currentViewport.x, y: nextViewport.y ?? currentViewport.y, @@ -367,10 +365,10 @@ export function useSvelteFlow(): { return Promise.resolve(true); }, - getViewport: () => get(viewport), + getViewport: () => $state.snapshot(store.viewport), setCenter: async (x, y, options) => { - const nextZoom = typeof options?.zoom !== 'undefined' ? options.zoom : get(maxZoom); - const currentPanZoom = get(panZoom); + const nextZoom = typeof options?.zoom !== 'undefined' ? options.zoom : store.maxZoom; + const currentPanZoom = store.panZoom; if (!currentPanZoom) { return Promise.resolve(false); @@ -378,8 +376,8 @@ export function useSvelteFlow(): { await currentPanZoom.setViewport( { - x: get(width) / 2 - x * nextZoom, - y: get(height) / 2 - y * nextZoom, + x: store.width / 2 - x * nextZoom, + y: store.height / 2 - y * nextZoom, zoom: nextZoom }, { duration: options?.duration } @@ -387,31 +385,29 @@ export function useSvelteFlow(): { return Promise.resolve(true); }, - fitView, + fitView: store.fitView, fitBounds: async (bounds: Rect, options?: FitBoundsOptions) => { - const currentPanZoom = get(panZoom); - - if (!currentPanZoom) { + if (!store.panZoom) { return Promise.resolve(false); } const viewport = getViewportForBounds( bounds, - get(width), - get(height), - get(minZoom), - get(maxZoom), + store.width, + store.height, + store.minZoom, + store.maxZoom, options?.padding ?? 0.1 ); - await currentPanZoom.setViewport(viewport, { duration: options?.duration }); + await store.panZoom.setViewport(viewport, { duration: options?.duration }); return Promise.resolve(true); }, getIntersectingNodes: ( - nodeOrRect: Node | { id: Node['id'] } | Rect, + nodeOrRect: NodeType | { id: NodeType['id'] } | Rect, partially = true, - nodesToIntersect?: Node[] + nodesToIntersect?: NodeType[] ) => { const isRect = isRectObject(nodeOrRect); const nodeRect = isRect ? nodeOrRect : getNodeRect(nodeOrRect); @@ -420,8 +416,8 @@ export function useSvelteFlow(): { return []; } - return (nodesToIntersect || get(nodes)).filter((n) => { - const internalNode = get(nodeLookup).get(n.id); + return (nodesToIntersect || store.nodes).filter((n) => { + const internalNode = store.nodeLookup.get(n.id); if (!internalNode || (!isRect && n.id === nodeOrRect.id)) { return false; } @@ -434,7 +430,7 @@ export function useSvelteFlow(): { }); }, isNodeIntersecting: ( - nodeOrRect: Node | { id: Node['id'] } | Rect, + nodeOrRect: NodeType | { id: NodeType['id'] } | Rect, area: Rect, partially = true ) => { @@ -451,23 +447,26 @@ export function useSvelteFlow(): { return partiallyVisible || overlappingArea >= nodeRect.width * nodeRect.height; }, deleteElements: async ({ nodes: nodesToRemove = [], edges: edgesToRemove = [] }) => { - const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ + const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove< + NodeType, + EdgeType + >({ nodesToRemove, edgesToRemove, - nodes: get(nodes), - edges: get(edges), - onBeforeDelete: get(onbeforedelete) + nodes: store.nodes, + edges: store.edges, + onBeforeDelete: store.onbeforedelete }); if (matchingNodes) { - nodes.update((nds) => - nds.filter((node) => !matchingNodes.some(({ id }) => id === node.id)) + store.nodes = untrack(() => store.nodes).filter( + (node) => !matchingNodes.some(({ id }) => id === node.id) ); } if (matchingEdges) { - edges.update((eds) => - eds.filter((edge) => !matchingEdges.some(({ id }) => id === edge.id)) + store.edges = untrack(() => store.edges).filter( + (edge) => !matchingEdges.some(({ id }) => id === edge.id) ); } @@ -480,15 +479,13 @@ export function useSvelteFlow(): { position: XYPosition, options: { snapToGrid: boolean } = { snapToGrid: true } ) => { - const _domNode = get(domNode); - - if (!_domNode) { + if (!store.domNode) { return position; } - const _snapGrid = options.snapToGrid ? get(snapGrid) : false; - const { x, y, zoom } = get(viewport); - const { x: domX, y: domY } = _domNode.getBoundingClientRect(); + const _snapGrid = options.snapToGrid ? store.snapGrid : false; + const { x, y, zoom } = store.viewport; + const { x: domX, y: domY } = store.domNode.getBoundingClientRect(); const correctedPosition = { x: position.x - domX, y: position.y - domY @@ -507,14 +504,12 @@ export function useSvelteFlow(): { * @returns */ flowToScreenPosition: (position: XYPosition) => { - const _domNode = get(domNode); - - if (!_domNode) { + if (!store.domNode) { return position; } - const { x, y, zoom } = get(viewport); - const { x: domX, y: domY } = _domNode.getBoundingClientRect(); + const { x, y, zoom } = store.viewport; + const { x: domX, y: domY } = store.domNode.getBoundingClientRect(); const rendererPosition = rendererPointToPoint(position, [x, y, zoom]); return { @@ -524,49 +519,43 @@ export function useSvelteFlow(): { }, toObject: () => { - return { - nodes: get(nodes).map((node) => ({ - ...node, - // we want to make sure that changes to the nodes object that gets returned by toObject - // do not affect the nodes object - position: { ...node.position }, - data: { ...node.data } - })), - edges: get(edges).map((edge) => ({ ...edge })), - viewport: { ...get(viewport) } - }; + return structuredClone({ + nodes: [...store.nodes], + edges: [...store.edges], + viewport: { ...store.viewport } + }); }, updateNode, updateNodeData: (id, dataUpdate, options) => { - const node = get(nodeLookup).get(id)?.internals.userNode; + const node = store.nodeLookup.get(id)?.internals.userNode; if (!node) { return; } const nextData = typeof dataUpdate === 'function' ? dataUpdate(node) : dataUpdate; - - node.data = options?.replace ? nextData : { ...node.data, ...nextData }; - - nodes.update((nds) => nds); + updateNode(id, (node) => ({ + ...node, + data: options?.replace ? nextData : { ...node.data, ...nextData } + })); }, + updateEdge, getNodesBounds: (nodes) => { - const _nodeLookup = get(nodeLookup); - const _nodeOrigin = get(nodeOrigin); - - return getNodesBounds(nodes, { nodeLookup: _nodeLookup, nodeOrigin: _nodeOrigin }); + return getNodesBounds(nodes, { nodeLookup: store.nodeLookup, nodeOrigin: store.nodeOrigin }); }, getHandleConnections: ({ type, id, nodeId }) => - Array.from( - get(connectionLookup) - .get(`${nodeId}-${type}-${id ?? null}`) - ?.values() ?? [] - ), - viewport + Array.from(store.connectionLookup.get(`${nodeId}-${type}-${id ?? null}`)?.values() ?? []) }; } -function getElements(lookup: Map, ids: string[]): Node[]; -function getElements(lookup: Map, ids: string[]): Edge[]; + +function getElements( + lookup: Map>, + ids: string[] +): NodeType[]; +function getElements( + lookup: Map, + ids: string[] +): EdgeType[]; // eslint-disable-next-line @typescript-eslint/no-explicit-any function getElements(lookup: Map, ids: string[]): any[] { const result = []; diff --git a/packages/svelte/src/lib/hooks/useUpdateNodeInternals.svelte.ts b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.svelte.ts new file mode 100644 index 00000000..f6124312 --- /dev/null +++ b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.svelte.ts @@ -0,0 +1,40 @@ +import { useStore } from '$lib/store'; +import { getContext } from 'svelte'; + +/** + * When you programmatically add or remove handles to a node or update a node's + * handle position, you need to let Svelte Flow know about it using this hook. This + * will update the internal dimensions of the node and properly reposition handles + * on the canvas if necessary. + * + * @public + * @returns A function for telling Svelte Flow to update the internal state of one or more nodes + * that you have changed programmatically. + */ +export function useUpdateNodeInternals(): (nodeId?: string | string[]) => void { + const { domNode, updateNodeInternals } = $derived(useStore()); + const nodeId = getContext('svelteflow__node_id') as string | undefined; + + // @todo: do we want to add this to system? + const updateInternals = (id?: string | string[]) => { + if (!id && !nodeId) { + throw new Error('When using outside of a node, you must provide an id.'); + } + const updateIds = id ? (Array.isArray(id) ? id : [id]) : [nodeId]; + const updates = new Map(); + + updateIds.forEach((updateId) => { + const nodeElement = domNode?.querySelector( + `.svelte-flow__node[data-id="${updateId}"]` + ) as HTMLDivElement; + + if (nodeElement) { + updates.set(updateId, { id: updateId, nodeElement, force: true }); + } + }); + + requestAnimationFrame(() => updateNodeInternals(updates)); + }; + + return updateInternals; +} diff --git a/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts b/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts deleted file mode 100644 index 489dec0b..00000000 --- a/packages/svelte/src/lib/hooks/useUpdateNodeInternals.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { get } from 'svelte/store'; -import type { UpdateNodeInternals } from '@xyflow/system'; - -import { useStore } from '$lib/store'; - -/** - * Hook for updating node internals. - * - * @public - * @returns function for updating node internals - */ -export function useUpdateNodeInternals(): UpdateNodeInternals { - const { domNode, updateNodeInternals } = useStore(); - - // @todo: do we want to add this to system? - const updateInternals = (id: string | string[]) => { - const updateIds = Array.isArray(id) ? id : [id]; - const updates = new Map(); - - updateIds.forEach((updateId) => { - const nodeElement = get(domNode)?.querySelector( - `.svelte-flow__node[data-id="${updateId}"]` - ) as HTMLDivElement; - - if (nodeElement) { - updates.set(updateId, { id: updateId, nodeElement, force: true }); - } - }); - - requestAnimationFrame(() => updateNodeInternals(updates)); - }; - - return updateInternals; -} diff --git a/packages/svelte/src/lib/index.ts b/packages/svelte/src/lib/index.ts index 25eb0f9c..158c78fd 100644 --- a/packages/svelte/src/lib/index.ts +++ b/packages/svelte/src/lib/index.ts @@ -5,12 +5,17 @@ export * from '$lib/container/SvelteFlow/types'; // components export * from '$lib/container/Panel'; export * from '$lib/components/SvelteFlowProvider'; -export * from '$lib/components/EdgeLabelRenderer'; export * from '$lib/components/ViewportPortal'; -export * from '$lib/components/BaseEdge'; -export { BezierEdge, StepEdge, SmoothStepEdge, StraightEdge } from '$lib/components/edges'; +export { + BezierEdge, + StepEdge, + SmoothStepEdge, + StraightEdge, + BaseEdge +} from '$lib/components/edges'; export * from '$lib/components/Handle'; export * from '$lib/components/EdgeLabel'; +export * from '$lib/components/EdgeReconnectAnchor'; // plugins export * from '$lib/plugins/Controls'; @@ -26,15 +31,18 @@ export { useStore } from '$lib/store'; export * from '$lib/utils'; //hooks -export * from '$lib/hooks/useSvelteFlow'; -export * from '$lib/hooks/useUpdateNodeInternals'; -export * from '$lib/hooks/useConnection'; -export * from '$lib/hooks/useNodesEdges'; -export * from '$lib/hooks/useHandleConnections'; -export * from '$lib/hooks/useNodeConnections'; -export * from '$lib/hooks/useNodesData'; -export * from '$lib/hooks/useInternalNode'; -export { useInitialized, useNodesInitialized } from '$lib/hooks/useInitialized'; +export * from '$lib/hooks/useSvelteFlow.svelte'; +export * from '$lib/hooks/useUpdateNodeInternals.svelte'; +export * from '$lib/hooks/useConnection.svelte'; +export * from '$lib/hooks/useNodesEdgesViewport.svelte'; +export * from '$lib/hooks/useNodeConnections.svelte'; +export * from '$lib/hooks/useNodesData.svelte'; +export * from '$lib/hooks/useInternalNode.svelte'; +export * from '$lib/hooks/useInitialized.svelte'; +export * from '$lib/hooks/useOnSelectionChange.svelte'; + +//actions +export * from '$lib/actions/portal'; // types export type { @@ -47,16 +55,10 @@ export type { EdgeTypes, DefaultEdgeOptions } from '$lib/types/edges'; -export type { HandleProps, FitViewOptions } from '$lib/types/general'; -export type { - Node, - NodeTypes, - DefaultNodeOptions, - BuiltInNode, - NodeProps, - InternalNode -} from '$lib/types/nodes'; +export type { FitViewOptions, OnBeforeDelete } from '$lib/types/general'; +export type { Node, NodeTypes, BuiltInNode, NodeProps, InternalNode } from '$lib/types/nodes'; export type { SvelteFlowStore } from '$lib/store/types'; +export * from '$lib/types/events'; // system types export { diff --git a/packages/svelte/src/lib/plugins/Background/Background.svelte b/packages/svelte/src/lib/plugins/Background/Background.svelte index c6a67d48..72952c8f 100644 --- a/packages/svelte/src/lib/plugins/Background/Background.svelte +++ b/packages/svelte/src/lib/plugins/Background/Background.svelte @@ -1,4 +1,4 @@ - - - diff --git a/packages/svelte/src/lib/plugins/Background/DotPattern.svelte b/packages/svelte/src/lib/plugins/Background/DotPattern.svelte index 62c0077a..3972ecab 100644 --- a/packages/svelte/src/lib/plugins/Background/DotPattern.svelte +++ b/packages/svelte/src/lib/plugins/Background/DotPattern.svelte @@ -1,14 +1,12 @@ diff --git a/packages/svelte/src/lib/plugins/Background/LinePattern.svelte b/packages/svelte/src/lib/plugins/Background/LinePattern.svelte index 6ef75599..a57f05e2 100644 --- a/packages/svelte/src/lib/plugins/Background/LinePattern.svelte +++ b/packages/svelte/src/lib/plugins/Background/LinePattern.svelte @@ -1,16 +1,22 @@ diff --git a/packages/svelte/src/lib/plugins/Background/types.ts b/packages/svelte/src/lib/plugins/Background/types.ts index dba56b97..2e74491f 100644 --- a/packages/svelte/src/lib/plugins/Background/types.ts +++ b/packages/svelte/src/lib/plugins/Background/types.ts @@ -1,3 +1,5 @@ +import type { ClassValue } from 'svelte/elements'; + export enum BackgroundVariant { Lines = 'lines', Dots = 'dots', @@ -5,6 +7,7 @@ export enum BackgroundVariant { } export type BackgroundProps = { + /** When multiple backgrounds are present on the page, each one should have a unique id. */ id?: string; /** Color of the background */ bgColor?: string; @@ -13,14 +16,27 @@ export type BackgroundProps = { /** Class applied to the pattern */ patternClass?: string; /** Class applied to the container */ - class?: string; - /** Gap between repetitions of the pattern */ + class?: ClassValue; + /** + * The gap between patterns. Passing in a tuple allows you to control the x and y gap + * independently. + * @default 20 + */ gap?: number | [number, number]; - /** Size of a single pattern element */ + /** + * The radius of each dot or the size of each rectangle if `BackgroundVariant.Dots` or + * `BackgroundVariant.Cross` is used. This defaults to 1 or 6 respectively, or ignored if + * `BackgroundVariant.Lines` is used. + */ size?: number; - /** Line width of the Line pattern */ + /** + * The stroke thickness used when drawing the pattern. + * @default 1 + */ lineWidth?: number; - /** Variant of the pattern + /** + * Variant of the pattern. + * @default BackgroundVariant.Dots * @example BackgroundVariant.Lines, BackgroundVariant.Dots, BackgroundVariant.Cross * 'lines', 'dots', 'cross' */ diff --git a/packages/svelte/src/lib/plugins/Controls/ControlButton.svelte b/packages/svelte/src/lib/plugins/Controls/ControlButton.svelte index 1e648de8..03fa34bf 100644 --- a/packages/svelte/src/lib/plugins/Controls/ControlButton.svelte +++ b/packages/svelte/src/lib/plugins/Controls/ControlButton.svelte @@ -1,30 +1,29 @@ diff --git a/packages/svelte/src/lib/plugins/Controls/Controls.svelte b/packages/svelte/src/lib/plugins/Controls/Controls.svelte index 2984ad2c..035fc93c 100644 --- a/packages/svelte/src/lib/plugins/Controls/Controls.svelte +++ b/packages/svelte/src/lib/plugins/Controls/Controls.svelte @@ -1,8 +1,6 @@ - + {#if before} + {@render before()} + {/if} {#if showZoom} {:else}{/if} {/if} - - + {#if children} + {@render children()} + {/if} + {#if after} + {@render after()} + {/if} diff --git a/packages/svelte/src/lib/plugins/Controls/types.ts b/packages/svelte/src/lib/plugins/Controls/types.ts index a4e5f9d7..7b011a22 100644 --- a/packages/svelte/src/lib/plugins/Controls/types.ts +++ b/packages/svelte/src/lib/plugins/Controls/types.ts @@ -1,4 +1,5 @@ -import type { HTMLButtonAttributes } from 'svelte/elements'; +import type { Snippet } from 'svelte'; +import type { ClassValue, HTMLAttributes, HTMLButtonAttributes } from 'svelte/elements'; import type { PanelPosition } from '@xyflow/system'; import type { FitViewOptions } from '$lib/types'; @@ -19,18 +20,23 @@ export type ControlsProps = { buttonBgColorHover?: string; buttonColor?: string; buttonColorHover?: string; + buttonBorderColor?: string; 'aria-label'?: string; style?: string; - class?: string; + class?: ClassValue; orientation?: 'horizontal' | 'vertical'; + children?: Snippet; + before?: Snippet; + after?: Snippet; fitViewOptions?: FitViewOptions; -}; +} & HTMLAttributes; export type ControlButtonProps = HTMLButtonAttributes & { - class?: string; + class?: ClassValue; bgColor?: string; bgColorHover?: string; color?: string; colorHover?: string; borderColor?: string; + children?: Snippet; }; diff --git a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte index fa8e7703..cfc0e5e7 100644 --- a/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte +++ b/packages/svelte/src/lib/plugins/Minimap/Minimap.svelte @@ -1,4 +1,4 @@ - - {#if $panZoom} + {#if store.panZoom} {#if ariaLabel}{ariaLabel}{/if} - {#each $nodes as userNode (userNode.id)} - {@const node = $nodeLookup.get(userNode.id)} + {#each store.nodes as userNode (userNode.id)} + {@const node = store.nodeLookup.get(userNode.id)} {#if node && nodeHasDimensions(node)} {@const nodeDimesions = getNodeDimensions(node)} - import cc from 'classcat'; + import type { ClassValue } from 'svelte/elements'; - export let x: number; - export let y: number; - export let width: number = 0; - export let height: number = 0; - export let borderRadius: number = 5; - export let color: string | undefined = undefined; - export let shapeRendering: string; - export let strokeColor: string | undefined = undefined; - export let strokeWidth: number = 2; - export let selected: boolean = false; - let className: string = ''; - export { className as class }; + let { + x, + y, + width, + height, + borderRadius = 5, + color, + shapeRendering, + strokeColor, + strokeWidth = 2, + selected, + class: className + }: { + x: number; + y: number; + width: number; + height: number; + borderRadius?: number; + color?: string; + shapeRendering: string; + strokeColor?: string; + strokeWidth?: number; + selected?: boolean; + class?: ClassValue; + } = $props(); diff --git a/packages/svelte/src/lib/plugins/Minimap/interactive.ts b/packages/svelte/src/lib/plugins/Minimap/interactive.ts index 064f0d27..49084f6d 100644 --- a/packages/svelte/src/lib/plugins/Minimap/interactive.ts +++ b/packages/svelte/src/lib/plugins/Minimap/interactive.ts @@ -1,14 +1,9 @@ -import { get, type Writable } from 'svelte/store'; -import { - XYMinimap, - type PanZoomInstance, - type Viewport, - type XYMinimapUpdate -} from '@xyflow/system'; +import { XYMinimap, type PanZoomInstance, type XYMinimapUpdate } from '@xyflow/system'; +import type { SvelteFlowStore } from '$lib/store/types'; export type UseInteractiveParams = { panZoom: PanZoomInstance; - viewport: Writable; + store: SvelteFlowStore; getViewScale: () => number; } & XYMinimapUpdate; @@ -17,12 +12,22 @@ export default function interactive(domNode: Element, params: UseInteractivePara domNode, panZoom: params.panZoom, getTransform: () => { - const viewport = get(params.viewport); + const { viewport } = params.store; return [viewport.x, viewport.y, viewport.zoom]; }, getViewScale: params.getViewScale }); + minimap.update({ + translateExtent: params.translateExtent, + width: params.width, + height: params.height, + inversePan: params.inversePan, + zoomStep: params.zoomStep, + pannable: params.pannable, + zoomable: params.zoomable + }); + function update(params: UseInteractiveParams) { minimap.update({ translateExtent: params.translateExtent, diff --git a/packages/svelte/src/lib/plugins/Minimap/types.ts b/packages/svelte/src/lib/plugins/Minimap/types.ts index d66577a8..dd6903de 100644 --- a/packages/svelte/src/lib/plugins/Minimap/types.ts +++ b/packages/svelte/src/lib/plugins/Minimap/types.ts @@ -1,5 +1,5 @@ import type { PanelPosition } from '@xyflow/system'; - +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; import type { Node } from '$lib/types'; export type GetMiniMapNodeAttribute = (node: Node) => string; @@ -29,7 +29,7 @@ export type MiniMapProps = { */ position?: PanelPosition; /** Class applied to container */ - class?: string; + class?: ClassValue; /** Style applied to container */ style?: string; /** The aria-label applied to container */ @@ -46,4 +46,4 @@ export type MiniMapProps = { inversePan?: boolean; /** Step size for zooming in/out */ zoomStep?: number; -}; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/plugins/NodeResizer/NodeResizer.svelte b/packages/svelte/src/lib/plugins/NodeResizer/NodeResizer.svelte index b57afcd1..8ced5ba3 100644 --- a/packages/svelte/src/lib/plugins/NodeResizer/NodeResizer.svelte +++ b/packages/svelte/src/lib/plugins/NodeResizer/NodeResizer.svelte @@ -7,29 +7,15 @@ XY_RESIZER_LINE_POSITIONS } from '@xyflow/system'; - type $$Props = NodeResizerProps; - - export let nodeId: $$Props['nodeId'] = undefined; - export let isVisible: $$Props['isVisible'] = true; - export let handleClass: $$Props['handleClass'] = undefined; - export let handleStyle: $$Props['handleStyle'] = undefined; - export let lineClass: $$Props['lineClass'] = undefined; - export let lineStyle: $$Props['lineStyle'] = undefined; - export let color: $$Props['color'] = undefined; - export let minWidth: $$Props['minWidth'] = 10; - export let minHeight: $$Props['minHeight'] = 10; - export let maxWidth: $$Props['maxWidth'] = Number.MAX_VALUE; - export let maxHeight: $$Props['maxHeight'] = Number.MAX_VALUE; - export let keepAspectRatio: $$Props['keepAspectRatio'] = false; - export let shouldResize: $$Props['shouldResize'] = undefined; - export let onResizeStart: $$Props['onResizeStart'] = undefined; - export let onResize: $$Props['onResize'] = undefined; - export let onResizeEnd: $$Props['onResizeEnd'] = undefined; - - let _minWidth = minWidth || 10; - let _minHeight = minHeight || 10; - let _maxWidth = maxWidth || Number.MAX_VALUE; - let _maxHeight = maxHeight || Number.MAX_VALUE; + let { + isVisible = true, + nodeId, + handleClass, + handleStyle, + lineClass, + lineStyle, + ...rest + }: NodeResizerProps = $props(); {#if isVisible} @@ -40,34 +26,10 @@ {nodeId} {position} variant={ResizeControlVariant.Line} - {color} - minWidth={_minWidth} - minHeight={_minHeight} - maxWidth={_maxWidth} - maxHeight={_maxHeight} - {onResizeStart} - {keepAspectRatio} - {shouldResize} - {onResize} - {onResizeEnd} + {...rest} /> {/each} {#each XY_RESIZER_HANDLE_POSITIONS as position (position)} - + {/each} {/if} diff --git a/packages/svelte/src/lib/plugins/NodeResizer/ResizeControl.svelte b/packages/svelte/src/lib/plugins/NodeResizer/ResizeControl.svelte index 7e686880..b30ecc47 100644 --- a/packages/svelte/src/lib/plugins/NodeResizer/ResizeControl.svelte +++ b/packages/svelte/src/lib/plugins/NodeResizer/ResizeControl.svelte @@ -1,6 +1,5 @@
- + {@render children?.()}
diff --git a/packages/svelte/src/lib/plugins/NodeResizer/types.ts b/packages/svelte/src/lib/plugins/NodeResizer/types.ts index ebe44b8b..23140c52 100644 --- a/packages/svelte/src/lib/plugins/NodeResizer/types.ts +++ b/packages/svelte/src/lib/plugins/NodeResizer/types.ts @@ -1,3 +1,5 @@ +import type { Snippet } from 'svelte'; +import type { HTMLAttributes } from 'svelte/elements'; import type { ControlPosition, ResizeControlVariant, @@ -42,7 +44,7 @@ export type NodeResizerProps = { onResize?: OnResize; /** Callback called when resizing ends */ onResizeEnd?: OnResizeEnd; -}; +} & HTMLAttributes; export type ResizeControlProps = Pick< NodeResizerProps, @@ -67,6 +69,5 @@ export type ResizeControlProps = Pick< * @example ResizeControlVariant.Handle, ResizeControlVariant.Line */ variant?: ResizeControlVariant; - class?: string; - style?: string; -}; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte index 58d73db5..65a5c2d3 100644 --- a/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte +++ b/packages/svelte/src/lib/plugins/NodeToolbar/NodeToolbar.svelte @@ -1,39 +1,36 @@ -{#if $domNode && isActive && toolbarNodes} +{#if store.domNode && isActive && toolbarNodes}
`${acc}${node.id} `, '').trim()} + use:portal={'root'} class="svelte-flow__node-toolbar" - use:portal={{ domNode: $domNode }} + data-id={toolbarNodes.reduce((acc, node) => `${acc}${node.id} `, '').trim()} style:position="absolute" style:transform style:z-index={zIndex} + {...rest} > - + {@render children?.()}
{/if} diff --git a/packages/svelte/src/lib/plugins/NodeToolbar/types.ts b/packages/svelte/src/lib/plugins/NodeToolbar/types.ts index aec506a3..704a0d83 100644 --- a/packages/svelte/src/lib/plugins/NodeToolbar/types.ts +++ b/packages/svelte/src/lib/plugins/NodeToolbar/types.ts @@ -1,4 +1,6 @@ import type { Position, Align } from '@xyflow/system'; +import type { Snippet } from 'svelte'; +import type { HTMLAttributes } from 'svelte/elements'; export type NodeToolbarProps = { /** The id of the node, or array of ids the toolbar should be displayed at */ @@ -16,4 +18,5 @@ export type NodeToolbarProps = { offset?: number; /** If true, node toolbar is visible even if node is not selected */ isVisible?: boolean; -}; + children?: Snippet; +} & HTMLAttributes; diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 8f07f105..4312b2b3 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -1,14 +1,9 @@ -import { getContext, setContext } from 'svelte'; -import { derived, get, writable } from 'svelte/store'; import { - createMarkerIds, - getElementsToRemove, panBy as panBySystem, updateNodeInternals as updateNodeInternalsSystem, addEdge as addEdgeUtil, initialConnection, errorMessages, - pointToRendererPoint, type UpdateNodePositions, type InternalNodeUpdate, type ViewportHelperFunctionOptions, @@ -17,107 +12,81 @@ import { type CoordinateExtent, type UpdateConnection, type ConnectionState, - type NodeOrigin, updateAbsolutePositions, - withResolvers + snapPosition, + calculateNodePosition } from '@xyflow/system'; import type { EdgeTypes, NodeTypes, Node, Edge, FitViewOptions } from '$lib/types'; -import { initialEdgeTypes, initialNodeTypes, getInitialStore } from './initial-store'; -import type { SvelteFlowStore } from './types'; -import { syncNodeStores, syncEdgeStores, syncViewportStores } from './utils'; -import { getVisibleEdges } from './visible-edges'; -import { getVisibleNodes } from './visible-nodes'; +import { initialEdgeTypes, initialNodeTypes, getInitialStore } from './initial-store.svelte'; +import { type StoreSignals, type SvelteFlowStore, type SvelteFlowStoreActions } from './types'; export const key = Symbol(); -export function createStore({ - nodes, - edges, - width, - height, - fitView: fitViewOnCreate, - nodeOrigin, - nodeExtent -}: { - nodes?: Node[]; - edges?: Edge[]; - width?: number; - height?: number; - fitView?: boolean; - nodeOrigin?: NodeOrigin; - nodeExtent?: CoordinateExtent; -}): SvelteFlowStore { - const store = getInitialStore({ - nodes, - edges, - width, - height, - fitView: fitViewOnCreate, - nodeOrigin, - nodeExtent - }); +export { useStore } from '../hooks/useStore'; + +export function createStore( + signals: StoreSignals +): SvelteFlowStore { + const store = getInitialStore(signals); function setNodeTypes(nodeTypes: NodeTypes) { - store.nodeTypes.set({ + store.nodeTypes = { ...initialNodeTypes, ...nodeTypes - }); + }; } function setEdgeTypes(edgeTypes: EdgeTypes) { - store.edgeTypes.set({ + store.edgeTypes = { ...initialEdgeTypes, ...edgeTypes - }); + }; } - function addEdge(edgeParams: Edge | Connection) { - const edges = get(store.edges); - store.edges.set(addEdgeUtil(edgeParams, edges)); + function addEdge(edgeParams: EdgeType | Connection) { + store.edges = addEdgeUtil(edgeParams, store.edges); } const updateNodePositions: UpdateNodePositions = (nodeDragItems, dragging = false) => { - const nodeLookup = get(store.nodeLookup); - - for (const [id, dragItem] of nodeDragItems) { - const node = nodeLookup.get(id)?.internals.userNode; - - if (!node) { - continue; - } - - node.position = dragItem.position; - node.dragging = dragging; - } - - store.nodes.update((nds) => nds); + store.nodes = store.nodes.map((node) => { + const dragItem = nodeDragItems.get(node.id); + return dragItem ? { ...node, position: dragItem.position, dragging } : node; + }); }; function updateNodeInternals(updates: Map) { - const nodeLookup = get(store.nodeLookup); - const parentLookup = get(store.parentLookup); const { changes, updatedInternals } = updateNodeInternalsSystem( updates, - nodeLookup, - get(store.parentLookup), - get(store.domNode), - get(store.nodeOrigin) + store.nodeLookup, + store.parentLookup, + store.domNode, + store.nodeOrigin ); if (!updatedInternals) { return; } - updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent }); + updateAbsolutePositions(store.nodeLookup, store.parentLookup, { + nodeOrigin: store.nodeOrigin, + nodeExtent: store.nodeExtent + }); + if (store.fitViewQueued) { + store.resolveFitView(); + } + + const newNodes = new Map(); for (const change of changes) { - const node = nodeLookup.get(change.id)?.internals.userNode; + const userNode = store.nodeLookup.get(change.id)?.internals.userNode; - if (!node) { + if (!userNode) { continue; } + const node = { ...userNode }; + switch (change.type) { case 'dimensions': { const measured = { ...node.measured, ...change.dimensions }; @@ -132,34 +101,37 @@ export function createStore({ } case 'position': node.position = change.position ?? node.position; - break; } + + newNodes.set(change.id, node); } - store.nodes.update((nds) => nds); + store.nodes = store.nodes.map((node) => newNodes.get(node.id) ?? node); - if (!get(store.nodesInitialized)) { - store.nodesInitialized.set(true); + if (!store.nodesInitialized) { + store.nodesInitialized = true; } } function fitView(options?: FitViewOptions) { // We either create a new Promise or reuse the existing one // Even if fitView is called multiple times in a row, we only end up with a single Promise - const fitViewResolver = get(store.fitViewResolver) ?? withResolvers(); + const fitViewResolver = store.fitViewResolver ?? Promise.withResolvers(); // We schedule a fitView by setting fitViewQueued and triggering a setNodes - store.fitViewQueued.set(true); - store.fitViewOptions.set(options); - store.fitViewResolver.set(fitViewResolver); - store.nodes.set(get(store.nodes)); + store.fitViewQueued = true; + store.fitViewOptions = options; + store.fitViewResolver = fitViewResolver; + + // We need to update the nodes so that adoptUserNodes is triggered + store.nodes = [...store.nodes]; return fitViewResolver.promise; } function zoomBy(factor: number, options?: ViewportHelperFunctionOptions) { - const panZoom = get(store.panZoom); + const panZoom = store.panZoom; if (!panZoom) { return Promise.resolve(false); } @@ -176,235 +148,226 @@ export function createStore({ } function setMinZoom(minZoom: number) { - const panZoom = get(store.panZoom); + const panZoom = store.panZoom; if (panZoom) { - panZoom.setScaleExtent([minZoom, get(store.maxZoom)]); - store.minZoom.set(minZoom); + panZoom.setScaleExtent([minZoom, store.maxZoom]); + store.minZoom = minZoom; } } function setMaxZoom(maxZoom: number) { - const panZoom = get(store.panZoom); + const panZoom = store.panZoom; if (panZoom) { - panZoom.setScaleExtent([get(store.minZoom), maxZoom]); - store.maxZoom.set(maxZoom); + panZoom.setScaleExtent([store.minZoom, maxZoom]); + store.maxZoom = maxZoom; } } function setTranslateExtent(extent: CoordinateExtent) { - const panZoom = get(store.panZoom); + const panZoom = store.panZoom; if (panZoom) { panZoom.setTranslateExtent(extent); - store.translateExtent.set(extent); + store.translateExtent = extent; } } - function resetSelectedElements(elements: Node[] | Edge[]) { - let elementsChanged = false; - elements.forEach((element) => { - if (element.selected) { - element.selected = false; - elementsChanged = true; - } - }); - return elementsChanged; - } - function setPaneClickDistance(distance: number) { - get(store.panZoom)?.setClickDistance(distance); + store.panZoom?.setClickDistance(distance); + } + + function deselect( + elements: T[], + elementsToDeselect: Set | null = null + ): [boolean, T[]] { + let deselected = false; + + const newElements = elements.map((element) => { + const shouldDeselect = elementsToDeselect ? elementsToDeselect.has(element.id) : true; + + if (shouldDeselect && element.selected) { + deselected = true; + return { ...element, selected: false }; + } + return element; + }); + + return [deselected, newElements]; } function unselectNodesAndEdges(params?: { nodes?: Node[]; edges?: Edge[] }) { - const resetNodes = resetSelectedElements(params?.nodes || get(store.nodes)); - if (resetNodes) store.nodes.set(get(store.nodes)); + const nodesToDeselect = params?.nodes ? new Set(params.nodes.map((node) => node.id)) : null; + const [nodesDeselected, newNodes] = deselect(store.nodes, nodesToDeselect); + if (nodesDeselected) { + store.nodes = newNodes; + } - const resetEdges = resetSelectedElements(params?.edges || get(store.edges)); - if (resetEdges) store.edges.set(get(store.edges)); + const edgesToDeselect = params?.edges ? new Set(params.edges.map((node) => node.id)) : null; + const [edgesDeselected, newEdges] = deselect(store.edges, edgesToDeselect); + if (edgesDeselected) { + store.edges = newEdges; + } } - store.deleteKeyPressed.subscribe(async (deleteKeyPressed) => { - if (deleteKeyPressed) { - const nodes = get(store.nodes); - const edges = get(store.edges); - const selectedNodes = nodes.filter((node) => node.selected); - const selectedEdges = edges.filter((edge) => edge.selected); - - const { nodes: matchingNodes, edges: matchingEdges } = await getElementsToRemove({ - nodesToRemove: selectedNodes, - edgesToRemove: selectedEdges, - nodes, - edges, - onBeforeDelete: get(store.onbeforedelete) - }); - - if (matchingNodes.length || matchingEdges.length) { - store.nodes.update((nds) => - nds.filter((node) => !matchingNodes.some((mN) => mN.id === node.id)) - ); - store.edges.update((eds) => - eds.filter((edge) => !matchingEdges.some((mE) => mE.id === edge.id)) - ); - - get(store.ondelete)?.({ - nodes: matchingNodes, - edges: matchingEdges - }); - } - } - }); - function addSelectedNodes(ids: string[]) { - const isMultiSelection = get(store.multiselectionKeyPressed); + const isMultiSelection = store.multiselectionKeyPressed; - store.nodes.update((ns) => - ns.map((node) => { - const nodeWillBeSelected = ids.includes(node.id); - const selected = isMultiSelection - ? node.selected || nodeWillBeSelected - : nodeWillBeSelected; + store.nodes = store.nodes.map((node) => { + const nodeWillBeSelected = ids.includes(node.id); + const selected = isMultiSelection ? node.selected || nodeWillBeSelected : nodeWillBeSelected; + if (node.selected !== selected) { // we need to mutate the node here in order to have the correct selected state in the drag handler + const internalNode = store.nodeLookup.get(node.id); + if (internalNode) internalNode.selected = selected; node.selected = selected; - - return node; - }) - ); + return { ...node }; + } + return node; + }); if (!isMultiSelection) { - store.edges.update((es) => - es.map((edge) => { - edge.selected = false; - return edge; - }) - ); + unselectNodesAndEdges({ nodes: [] }); } } function addSelectedEdges(ids: string[]) { - const isMultiSelection = get(store.multiselectionKeyPressed); + const isMultiSelection = store.multiselectionKeyPressed; - store.edges.update((edges) => - edges.map((edge) => { - const edgeWillBeSelected = ids.includes(edge.id); - const selected = isMultiSelection - ? edge.selected || edgeWillBeSelected - : edgeWillBeSelected; + store.edges = store.edges.map((edge) => { + const edgeWillBeSelected = ids.includes(edge.id); + const selected = isMultiSelection ? edge.selected || edgeWillBeSelected : edgeWillBeSelected; - edge.selected = selected; - - return edge; - }) - ); + if (edge.selected !== selected) { + return { ...edge, selected }; + } + return edge; + }); if (!isMultiSelection) { - store.nodes.update((ns) => - ns.map((node) => { - node.selected = false; - return node; - }) - ); + unselectNodesAndEdges({ edges: [] }); } } - function handleNodeSelection(id: string) { - const node = get(store.nodes)?.find((n) => n.id === id); + function handleNodeSelection(id: string, unselect?: boolean, nodeRef?: HTMLDivElement | null) { + const node = store.nodeLookup.get(id); if (!node) { console.warn('012', errorMessages['error012'](id)); return; } - store.selectionRect.set(null); - store.selectionRectMode.set(null); + store.selectionRect = null; + store.selectionRectMode = null; if (!node.selected) { addSelectedNodes([id]); - } else if (node.selected && get(store.multiselectionKeyPressed)) { + } else if (unselect || (node.selected && store.multiselectionKeyPressed)) { unselectNodesAndEdges({ nodes: [node], edges: [] }); + + requestAnimationFrame(() => nodeRef?.blur()); } } + function handleEdgeSelection(id: string) { + const edge = store.edgeLookup.get(id); + + if (!edge) { + console.warn('012', errorMessages['error012'](id)); + return; + } + + const selectable = + edge.selectable || (store.elementsSelectable && typeof edge.selectable === 'undefined'); + + if (selectable) { + store.selectionRect = null; + store.selectionRectMode = null; + + if (!edge.selected) { + addSelectedEdges([id]); + } else if (edge.selected && store.multiselectionKeyPressed) { + unselectNodesAndEdges({ nodes: [], edges: [edge] }); + } + } + } + + function moveSelectedNodes(direction: XYPosition, factor: number) { + const { nodeExtent, snapGrid, nodeOrigin, nodeLookup, nodesDraggable, onerror } = store; + + const nodeUpdates = new Map(); + /* + * by default a node moves 5px on each key press + * if snap grid is enabled, we use that for the velocity + */ + const xVelo = snapGrid?.[0] ?? 5; + const yVelo = snapGrid?.[1] ?? 5; + + const xDiff = direction.x * xVelo * factor; + const yDiff = direction.y * yVelo * factor; + + for (const node of nodeLookup.values()) { + const isSelected = + node.selected && + (node.draggable || (nodesDraggable && typeof node.draggable === 'undefined')); + + if (!isSelected) { + continue; + } + + let nextPosition = { + x: node.internals.positionAbsolute.x + xDiff, + y: node.internals.positionAbsolute.y + yDiff + }; + + if (snapGrid) { + nextPosition = snapPosition(nextPosition, snapGrid); + } + + const { position, positionAbsolute } = calculateNodePosition({ + nodeId: node.id, + nextPosition, + nodeLookup, + nodeExtent, + nodeOrigin, + onError: onerror + }); + + node.position = position; + node.internals.positionAbsolute = positionAbsolute; + + nodeUpdates.set(node.id, node); + } + updateNodePositions(nodeUpdates); + } + function panBy(delta: XYPosition) { - const viewport = get(store.viewport); return panBySystem({ delta, - panZoom: get(store.panZoom), - transform: [viewport.x, viewport.y, viewport.zoom], - translateExtent: get(store.translateExtent), - width: get(store.width), - height: get(store.height) + panZoom: store.panZoom, + transform: [store.viewport.x, store.viewport.y, store.viewport.zoom], + translateExtent: store.translateExtent, + width: store.width, + height: store.height }); } - const _connection = writable(initialConnection); const updateConnection: UpdateConnection = (newConnection: ConnectionState) => { - _connection.set({ ...newConnection }); + store._connection = { ...newConnection }; }; function cancelConnection() { - _connection.set(initialConnection); + store._connection = initialConnection; } function reset() { - store.selectionRect.set(null); - store.selectionRectMode.set(null); - store.snapGrid.set(null); - store.isValidConnection.set(() => true); - + store.resetStoreValues(); unselectNodesAndEdges(); - cancelConnection(); } - return { - // state - ...store, - - // derived state - visibleEdges: getVisibleEdges(store), - visibleNodes: getVisibleNodes(store), - connection: derived([_connection, store.viewport], ([connection, viewport]) => { - return connection.inProgress - ? { - ...connection, - to: pointToRendererPoint(connection.to, [viewport.x, viewport.y, viewport.zoom]) - } - : { ...connection }; - }), - markers: derived( - [store.edges, store.defaultMarkerColor, store.flowId], - ([edges, defaultColor, id]) => createMarkerIds(edges, { defaultColor, id }) - ), - initialized: (() => { - let initialized = false; - const initialNodesLength = get(store.nodes).length; - const initialEdgesLength = get(store.edges).length; - return derived( - [store.nodesInitialized, store.edgesInitialized, store.viewportInitialized], - ([nodesInitialized, edgesInitialized, viewportInitialized]) => { - // If it was already initialized, return true from then on - if (initialized) return initialized; - - // if it hasn't been initialised check if it's now - if (initialNodesLength === 0) { - initialized = viewportInitialized; - } else if (initialEdgesLength === 0) { - initialized = viewportInitialized && nodesInitialized; - } else { - initialized = viewportInitialized && nodesInitialized && edgesInitialized; - } - - return initialized; - } - ); - })(), - - // actions - syncNodeStores: (nodes) => syncNodeStores(store.nodes, nodes), - syncEdgeStores: (edges) => syncEdgeStores(store.edges, edges), - syncViewport: (viewport) => syncViewportStores(store.panZoom, store.viewport, viewport), + const storeWithActions = Object.assign(store, { setNodeTypes, setEdgeTypes, addEdge, @@ -412,7 +375,7 @@ export function createStore({ updateNodeInternals, zoomIn, zoomOut, - fitView: (options?: FitViewOptions) => fitView(options), + fitView, setMinZoom, setMaxZoom, setTranslateExtent, @@ -421,47 +384,13 @@ export function createStore({ addSelectedNodes, addSelectedEdges, handleNodeSelection, + handleEdgeSelection, + moveSelectedNodes, panBy, updateConnection, cancelConnection, reset - }; -} + } satisfies SvelteFlowStoreActions); -export function useStore(): SvelteFlowStore { - const store = getContext<{ getStore: () => SvelteFlowStore }>(key); - - if (!store) { - throw new Error( - 'In order to use useStore you need to wrap your component in a ' - ); - } - - return store.getStore(); -} - -export function createStoreContext({ - nodes, - edges, - width, - height, - fitView, - nodeOrigin, - nodeExtent -}: { - nodes?: Node[]; - edges?: Edge[]; - width?: number; - height?: number; - fitView?: boolean; - nodeOrigin?: NodeOrigin; - nodeExtent?: CoordinateExtent; -}) { - const store = createStore({ nodes, edges, width, height, fitView, nodeOrigin, nodeExtent }); - - setContext(key, { - getStore: () => store - }); - - return store; + return storeWithActions; } diff --git a/packages/svelte/src/lib/store/initial-store.svelte.ts b/packages/svelte/src/lib/store/initial-store.svelte.ts new file mode 100644 index 00000000..8ba4efa4 --- /dev/null +++ b/packages/svelte/src/lib/store/initial-store.svelte.ts @@ -0,0 +1,450 @@ +import { + infiniteExtent, + SelectionMode, + ConnectionMode, + devWarn, + adoptUserNodes, + getViewportForBounds, + updateConnectionLookup, + initialConnection, + type SelectionRect, + type SnapGrid, + type MarkerProps, + type PanZoomInstance, + type CoordinateExtent, + type NodeOrigin, + type OnError, + type Viewport, + type OnConnect, + type OnConnectStart, + type OnConnectEnd, + type NodeLookup, + type ConnectionState, + getInternalNodesBounds, + createMarkerIds, + type EdgeLookup, + type ConnectionLookup, + type ParentLookup, + pointToRendererPoint, + type ColorModeClass, + type Transform, + fitViewport, + type Handle, + type OnReconnect, + type OnReconnectStart, + type OnReconnectEnd +} from '@xyflow/system'; + +import DefaultNode from '$lib/components/nodes/DefaultNode.svelte'; +import InputNode from '$lib/components/nodes/InputNode.svelte'; +import OutputNode from '$lib/components/nodes/OutputNode.svelte'; +import GroupNode from '$lib/components/nodes/GroupNode.svelte'; + +import { + BezierEdgeInternal, + SmoothStepEdgeInternal, + StraightEdgeInternal, + StepEdgeInternal +} from '$lib/components/edges'; + +import type { + NodeTypes, + EdgeTypes, + FitViewOptions, + OnDelete, + OnBeforeConnect, + OnBeforeDelete, + IsValidConnection, + Edge, + Node, + EdgeLayouted, + InternalNode, + OnBeforeReconnect, + OnSelectionChange, + OnSelectionDrag +} from '$lib/types'; + +import type { StoreSignals } from './types'; +import { MediaQuery } from 'svelte/reactivity'; +import { getLayoutedEdges, getVisibleNodes, type EdgeLayoutAllOptions } from './visibleElements'; + +export const initialNodeTypes = { + input: InputNode, + output: OutputNode, + default: DefaultNode, + group: GroupNode +}; + +export const initialEdgeTypes = { + straight: StraightEdgeInternal, + smoothstep: SmoothStepEdgeInternal, + default: BezierEdgeInternal, + step: StepEdgeInternal +}; + +export function getInitialStore( + signals: StoreSignals +) { + // We use a class here, because Svelte adds getters & setter for us. + // Inline classes have some performance implications but we just call it once (max twice). + class SvelteFlowStore { + flowId: string = $derived(signals.props.id ?? '1'); + domNode = $state(null); + panZoom: PanZoomInstance | null = $state(null); + width = $state(signals.width ?? 0); + height = $state(signals.height ?? 0); + + nodesInitialized: boolean = $derived.by(() => { + const nodesInitialized = adoptUserNodes(signals.nodes, this.nodeLookup, this.parentLookup, { + nodeExtent: this.nodeExtent, + nodeOrigin: this.nodeOrigin, + elevateNodesOnSelect: signals.props.elevateNodesOnSelect ?? true, + checkEquality: true + }); + + if (this.fitViewQueued && nodesInitialized) { + if (this.fitViewOptions?.duration) { + this.resolveFitView(); + } else { + /** + * When no duration is set, viewport is set immediately which prevents an update + * I do not understand why, however we are setting state in a derived which is a no-go + */ + queueMicrotask(() => { + this.resolveFitView(); + }); + } + } + + return nodesInitialized; + }); + viewportInitialized: boolean = $derived(this.panZoom !== null); + + _edges: EdgeType[] = $derived.by(() => { + updateConnectionLookup(this.connectionLookup, this.edgeLookup, signals.edges); + return signals.edges; + }); + + get nodes() { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions + this.nodesInitialized; + return signals.nodes; + } + set nodes(nodes) { + signals.nodes = nodes; + } + get edges() { + return this._edges; + } + set edges(edges) { + signals.edges = edges; + } + + _prevSelectedNodes: NodeType[] = []; + _prevSelectedNodeIds = new Set(); + selectedNodes = $derived.by(() => { + const selectedNodesCount = this._prevSelectedNodeIds.size; + const selectedNodeIds = new Set(); + const selectedNodes = this.nodes.filter((node) => { + if (node.selected) { + selectedNodeIds.add(node.id); + this._prevSelectedNodeIds.delete(node.id); + } + return node.selected; + }); + + // Either the number of selected nodes has changed or two nodes changed their selection state + // at the same time. However then the previously selected node will be inside _prevSelectedNodeIds + if (selectedNodesCount !== selectedNodeIds.size || this._prevSelectedNodeIds.size > 0) { + this._prevSelectedNodes = selectedNodes; + } + + this._prevSelectedNodeIds = selectedNodeIds; + return this._prevSelectedNodes; + }); + + _prevSelectedEdges: EdgeType[] = []; + _prevSelectedEdgeIds = new Set(); + selectedEdges = $derived.by(() => { + const selectedEdgesCount = this._prevSelectedEdgeIds.size; + const selectedEdgeIds = new Set(); + const selectedEdges = this.edges.filter((edge) => { + if (edge.selected) { + selectedEdgeIds.add(edge.id); + this._prevSelectedEdgeIds.delete(edge.id); + } + return edge.selected; + }); + // Either the number of selected edges has changed or two edges changed their selection state + // at the same time. However then the previously selected edge will be inside _prevSelectedEdgeIds + if (selectedEdgesCount !== selectedEdgeIds.size || this._prevSelectedEdgeIds.size > 0) { + this._prevSelectedEdges = selectedEdges; + } + this._prevSelectedEdgeIds = selectedEdgeIds; + return this._prevSelectedEdges; + }); + + selectionChangeHandlers = new Map>(); + + nodeLookup: NodeLookup> = new Map(); + parentLookup: ParentLookup> = new Map(); + connectionLookup: ConnectionLookup = new Map(); + edgeLookup: EdgeLookup = new Map(); + + _prevVisibleEdges = new Map>(); + visible = $derived.by(() => { + const { + // We need to access this._nodes to trigger on changes + // eslint-disable-next-line @typescript-eslint/no-unused-vars + nodes, + _edges: edges, + _prevVisibleEdges: previousEdges, + nodeLookup, + connectionMode, + onerror, + onlyRenderVisibleElements, + defaultEdgeOptions + } = this; + + let visibleNodes: Map>; + let visibleEdges: Map>; + + const options = { + edges, + defaultEdgeOptions, + previousEdges, + nodeLookup, + connectionMode, + elevateEdgesOnSelect: signals.props.elevateEdgesOnSelect ?? true, + onerror + }; + + if (onlyRenderVisibleElements) { + // We only subscribe to viewport, width, height if onlyRenderVisibleElements is true + const { viewport, width, height } = this; + const transform: Transform = [viewport.x, viewport.y, viewport.zoom]; + + visibleNodes = getVisibleNodes(nodeLookup, transform, width, height); + visibleEdges = getLayoutedEdges({ + ...options, + onlyRenderVisible: true, + visibleNodes, + transform, + width, + height + }); + } else { + visibleNodes = this.nodeLookup; + visibleEdges = getLayoutedEdges(options as EdgeLayoutAllOptions); + } + + return { + nodes: visibleNodes, + edges: visibleEdges + }; + }); + + nodesDraggable: boolean = $derived(signals.props.nodesDraggable ?? true); + nodesConnectable: boolean = $derived(signals.props.nodesConnectable ?? true); + elementsSelectable: boolean = $derived(signals.props.elementsSelectable ?? true); + nodesFocusable: boolean = $derived(signals.props.nodesFocusable ?? true); + edgesFocusable: boolean = $derived(signals.props.edgesFocusable ?? true); + + disableKeyboardA11y: boolean = $derived(signals.props.disableKeyboardA11y ?? false); + + minZoom: number = $derived(signals.props.minZoom ?? 0.5); + maxZoom: number = $derived(signals.props.maxZoom ?? 2); + + nodeOrigin: NodeOrigin = $derived(signals.props.nodeOrigin ?? [0, 0]); + nodeExtent: CoordinateExtent = $derived(signals.props.nodeExtent ?? infiniteExtent); + translateExtent: CoordinateExtent = $derived(signals.props.translateExtent ?? infiniteExtent); + + defaultEdgeOptions: Partial = $derived(signals.props.defaultEdgeOptions ?? {}); + + nodeDragThreshold: number = $derived(signals.props.nodeDragThreshold ?? 1); + autoPanOnNodeDrag: boolean = $derived(signals.props.autoPanOnNodeDrag ?? true); + autoPanOnConnect: boolean = $derived(signals.props.autoPanOnConnect ?? true); + + fitViewQueued: boolean = signals.props.fitView ?? false; + fitViewOptions: FitViewOptions | undefined = signals.props.fitViewOptions; + fitViewResolver: PromiseWithResolvers | null = null; + + snapGrid: SnapGrid | null = $derived(signals.props.snapGrid ?? null); + + dragging: boolean = $state(false); + selectionRect: SelectionRect | null = $state(null); + + selectionKeyPressed: boolean = $state(false); + multiselectionKeyPressed: boolean = $state(false); + deleteKeyPressed: boolean = $state(false); + panActivationKeyPressed: boolean = $state(false); + zoomActivationKeyPressed: boolean = $state(false); + selectionRectMode: string | null = $state(null); + ariaLiveMessage = $state(''); + selectionMode: SelectionMode = $derived(signals.props.selectionMode ?? SelectionMode.Partial); + + nodeTypes: NodeTypes = $derived({ ...initialNodeTypes, ...signals.props.nodeTypes }); + edgeTypes: EdgeTypes = $derived({ ...initialEdgeTypes, ...signals.props.edgeTypes }); + + noPanClass: string = $derived(signals.props.noPanClass ?? 'nopan'); + noDragClass: string = $derived(signals.props.noDragClass ?? 'nodrag'); + noWheelClass: string = $derived(signals.props.noWheelClass ?? 'nowheel'); + + // _viewport is the internal viewport. + // when binding to viewport, we operate on signals.viewport instead + _viewport: Viewport = $state(signals.props.initialViewport ?? { x: 0, y: 0, zoom: 1 }); + get viewport() { + return signals.viewport ?? this._viewport; + } + set viewport(newViewport: Viewport) { + if (signals.viewport) { + signals.viewport = newViewport; + } + this._viewport = newViewport; + } + + // _connection is viewport independent and originating from XYHandle + _connection: ConnectionState = $state(initialConnection); + // We derive a viewport dependent connection here + connection: ConnectionState = $derived.by(() => { + if (this._connection.inProgress) { + return { + ...this._connection, + to: pointToRendererPoint(this._connection.to, [ + this.viewport.x, + this.viewport.y, + this.viewport.zoom + ]) + }; + } else { + return this._connection; + } + }); + connectionMode: ConnectionMode = $derived( + signals.props.connectionMode ?? ConnectionMode.Strict + ); + connectionRadius: number = $derived(signals.props.connectionRadius ?? 20); + isValidConnection: IsValidConnection = $derived( + signals.props.isValidConnection ?? (() => true) + ); + + selectNodesOnDrag: boolean = $derived(signals.props.selectNodesOnDrag ?? true); + + defaultMarkerColor: string = $derived(signals.props.defaultMarkerColor ?? '#b1b1b7'); + markers: MarkerProps[] = $derived.by(() => { + return createMarkerIds(signals.edges, { + defaultColor: this.defaultMarkerColor, + id: this.flowId, + defaultMarkerStart: this.defaultEdgeOptions.markerStart, + defaultMarkerEnd: this.defaultEdgeOptions.markerEnd + }); + }); + onlyRenderVisibleElements: boolean = $derived(signals.props.onlyRenderVisibleElements ?? false); + onerror: OnError = $derived(signals.props.onflowerror ?? devWarn); + + ondelete?: OnDelete = $derived(signals.props.ondelete); + onbeforedelete?: OnBeforeDelete = $derived(signals.props.onbeforedelete); + + onbeforeconnect?: OnBeforeConnect = $derived(signals.props.onbeforeconnect); + onconnect?: OnConnect = $derived(signals.props.onconnect); + onconnectstart?: OnConnectStart = $derived(signals.props.onconnectstart); + onconnectend?: OnConnectEnd = $derived(signals.props.onconnectend); + + onbeforereconnect?: OnBeforeReconnect = $derived(signals.props.onbeforereconnect); + onreconnect?: OnReconnect = $derived(signals.props.onreconnect); + onreconnectstart?: OnReconnectStart = $derived(signals.props.onreconnectstart); + onreconnectend?: OnReconnectEnd = $derived(signals.props.onreconnectend); + + clickConnect?: boolean = $derived(signals.props.clickConnect ?? true); + onclickconnectstart?: OnConnectStart = $derived(signals.props.onclickconnectstart); + onclickconnectend?: OnConnectEnd = $derived(signals.props.onclickconnectend); + clickConnectStartHandle: Pick | null = $state(null); + + onselectiondrag?: OnSelectionDrag = $derived(signals.props.onselectiondrag); + onselectiondragstart?: OnSelectionDrag = $derived(signals.props.onselectiondragstart); + onselectiondragstop?: OnSelectionDrag = $derived(signals.props.onselectiondragstop); + + resolveFitView = async () => { + if (!this.panZoom) { + return; + } + + await fitViewport( + { + nodes: this.nodeLookup, + width: this.width, + height: this.height, + panZoom: this.panZoom, + minZoom: this.minZoom, + maxZoom: this.maxZoom + }, + this.fitViewOptions + ); + + this.fitViewResolver?.resolve(true); + /** + * wait for the fitViewport to resolve before deleting the resolver, + * we want to reuse the old resolver if the user calls fitView again in the mean time + */ + this.fitViewQueued = false; + this.fitViewOptions = undefined; + this.fitViewResolver = null; + }; + + _prefersDark = new MediaQuery( + '(prefers-color-scheme: dark)', + signals.props.colorModeSSR === 'dark' + ); + colorMode: ColorModeClass = $derived( + signals.props.colorMode === 'system' + ? this._prefersDark.current + ? 'dark' + : 'light' + : (signals.props.colorMode ?? 'light') + ); + + constructor() { + // Process intial fitView here + if (signals.props.fitView && !signals.props.initialViewport && this.width && this.height) { + const bounds = getInternalNodesBounds(this.nodeLookup, { + filter: (node) => + !!((node.width || node.initialWidth) && (node.height || node.initialHeight)) + }); + this.viewport = getViewportForBounds(bounds, this.width, this.height, 0.5, 2, 0.1); + } + + if (process.env.NODE_ENV === 'development') { + warnIfDeeplyReactive(signals.nodes, 'nodes'); + warnIfDeeplyReactive(signals.edges, 'edges'); + } + } + + resetStoreValues() { + this.dragging = false; + this.selectionRect = null; + this.selectionRectMode = null; + this.selectionKeyPressed = false; + this.multiselectionKeyPressed = false; + this.deleteKeyPressed = false; + this.panActivationKeyPressed = false; + this.zoomActivationKeyPressed = false; + this._connection = initialConnection; + this.clickConnectStartHandle = null; + this.viewport = signals.props.initialViewport ?? { x: 0, y: 0, zoom: 1 }; + this.ariaLiveMessage = ''; + } + } + return new SvelteFlowStore(); +} + +// Only way to check if an object is a proxy +// is to see if is failes to perform a structured clone +function warnIfDeeplyReactive(array: unknown[] | undefined, name: string) { + try { + if (array && array.length > 0) { + structuredClone(array[0]); + } + } catch { + console.warn(`Use $state.raw for ${name} to prevent performance issues.`); + } +} diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts deleted file mode 100644 index 3a88696d..00000000 --- a/packages/svelte/src/lib/store/initial-store.ts +++ /dev/null @@ -1,202 +0,0 @@ -import { readable, writable } from 'svelte/store'; -import { - infiniteExtent, - SelectionMode, - ConnectionMode, - ConnectionLineType, - devWarn, - adoptUserNodes, - getViewportForBounds, - updateConnectionLookup, - initialConnection, - type SelectionRect, - type SnapGrid, - type MarkerProps, - type PanZoomInstance, - type CoordinateExtent, - type NodeOrigin, - type OnError, - type Viewport, - type ConnectionLookup, - type OnConnect, - type OnConnectStart, - type OnConnectEnd, - type NodeLookup, - type EdgeLookup, - type ConnectionState, - type ParentLookup, - getInternalNodesBounds, - withResolvers -} from '@xyflow/system'; - -import DefaultNode from '$lib/components/nodes/DefaultNode.svelte'; -import InputNode from '$lib/components/nodes/InputNode.svelte'; -import OutputNode from '$lib/components/nodes/OutputNode.svelte'; -import GroupNode from '$lib/components/nodes/GroupNode.svelte'; - -import { - BezierEdgeInternal, - SmoothStepEdgeInternal, - StraightEdgeInternal, - StepEdgeInternal -} from '$lib/components/edges'; - -import type { - NodeTypes, - EdgeTypes, - EdgeLayouted, - Node, - Edge, - FitViewOptions, - OnDelete, - OnEdgeCreate, - OnBeforeDelete, - IsValidConnection, - InternalNode -} from '$lib/types'; -import { createNodesStore, createEdgesStore } from './utils'; - -export const initialNodeTypes = { - input: InputNode, - output: OutputNode, - default: DefaultNode, - group: GroupNode -}; - -export const initialEdgeTypes = { - straight: StraightEdgeInternal, - smoothstep: SmoothStepEdgeInternal, - default: BezierEdgeInternal, - step: StepEdgeInternal -}; - -export const getInitialStore = ({ - nodes = [], - edges = [], - width, - height, - fitView, - nodeOrigin, - nodeExtent -}: { - nodes?: Node[]; - edges?: Edge[]; - width?: number; - height?: number; - fitView?: boolean; - nodeOrigin?: NodeOrigin; - nodeExtent?: CoordinateExtent; -}) => { - const nodeLookup: NodeLookup = new Map(); - const parentLookup = new Map(); - const connectionLookup = new Map(); - const edgeLookup = new Map(); - - const storeNodeOrigin = nodeOrigin ?? [0, 0]; - const storeNodeExtent = nodeExtent ?? infiniteExtent; - - adoptUserNodes(nodes, nodeLookup, parentLookup, { - nodeExtent: storeNodeExtent, - nodeOrigin: storeNodeOrigin, - elevateNodesOnSelect: false, - checkEquality: false - }); - - updateConnectionLookup(connectionLookup, edgeLookup, edges); - - let viewport: Viewport = { x: 0, y: 0, zoom: 1 }; - - if (fitView && width && height) { - const bounds = getInternalNodesBounds(nodeLookup, { - filter: (node) => !!((node.width || node.initialWidth) && (node.height || node.initialHeight)) - }); - viewport = getViewportForBounds(bounds, width, height, 0.5, 2, 0.1); - } - - const fitViewQueued = writable(false); - const fitViewOptions = writable(undefined); - const fitViewResolver = writable> | null>(null); - const panZoom = writable(null); - const widthStore = writable(500); - const heightStore = writable(500); - const minZoom = writable(0.5); - const maxZoom = writable(2); - - return { - flowId: writable(null), - nodes: createNodesStore( - nodes, - nodeLookup, - parentLookup, - storeNodeOrigin, - storeNodeExtent, - fitViewQueued, - fitViewOptions, - fitViewResolver, - panZoom, - widthStore, - heightStore, - minZoom, - maxZoom - ), - nodeLookup: readable>(nodeLookup), - parentLookup: readable>(parentLookup), - edgeLookup: readable>(edgeLookup), - visibleNodes: readable([]), - edges: createEdgesStore(edges, connectionLookup, edgeLookup), - visibleEdges: readable([]), - connectionLookup: readable(connectionLookup), - width: widthStore, - height: heightStore, - minZoom, - maxZoom, - nodeOrigin: writable(storeNodeOrigin), - nodeDragThreshold: writable(1), - nodeExtent: writable(storeNodeExtent), - translateExtent: writable(infiniteExtent), - autoPanOnNodeDrag: writable(true), - autoPanOnConnect: writable(true), - fitViewQueued, - fitViewOptions, - fitViewResolver, - panZoom, - snapGrid: writable(null), - dragging: writable(false), - selectionRect: writable(null), - selectionKeyPressed: writable(false), - multiselectionKeyPressed: writable(false), - deleteKeyPressed: writable(false), - panActivationKeyPressed: writable(false), - zoomActivationKeyPressed: writable(false), - selectionRectMode: writable(null), - selectionMode: writable(SelectionMode.Partial), - nodeTypes: writable(initialNodeTypes), - edgeTypes: writable(initialEdgeTypes), - viewport: writable(viewport), - connectionMode: writable(ConnectionMode.Strict), - domNode: writable(null), - connection: readable(initialConnection), - connectionLineType: writable(ConnectionLineType.Bezier), - connectionRadius: writable(20), - isValidConnection: writable(() => true), - nodesDraggable: writable(true), - nodesConnectable: writable(true), - elementsSelectable: writable(true), - selectNodesOnDrag: writable(true), - markers: readable([]), - defaultMarkerColor: writable('#b1b1b7'), - lib: readable('svelte'), - onlyRenderVisibleElements: writable(false), - onerror: writable(devWarn), - ondelete: writable(undefined), - onedgecreate: writable(undefined), - onconnect: writable(undefined), - onconnectstart: writable(undefined), - onconnectend: writable(undefined), - onbeforedelete: writable(undefined), - nodesInitialized: writable(false), - edgesInitialized: writable(false), - viewportInitialized: writable(false), - initialized: readable(false) - }; -}; diff --git a/packages/svelte/src/lib/store/types.ts b/packages/svelte/src/lib/store/types.ts index 88ee8be0..fd345c61 100644 --- a/packages/svelte/src/lib/store/types.ts +++ b/packages/svelte/src/lib/store/types.ts @@ -1,4 +1,3 @@ -import type { Writable } from 'svelte/store'; import type { InternalNodeUpdate, XYPosition, @@ -10,16 +9,14 @@ import type { Viewport } from '@xyflow/system'; -import type { getInitialStore } from './initial-store'; +import type { getInitialStore } from './initial-store.svelte'; import type { Node, Edge, NodeTypes, EdgeTypes, FitViewOptions } from '$lib/types'; +import type { SvelteFlowProps } from '$lib/container/SvelteFlow'; -export type SvelteFlowStoreActions = { - syncNodeStores: (nodesStore: Writable) => void; - syncEdgeStores: (edgeStore: Writable) => void; - syncViewport: (viewportStore?: Writable) => void; +export type SvelteFlowStoreActions = { setNodeTypes: (nodeTypes: NodeTypes) => void; setEdgeTypes: (edgeTypes: EdgeTypes) => void; - addEdge: (edge: Edge | Connection) => void; + addEdge: (edge: EdgeType | Connection) => void; zoomIn: (options?: ViewportHelperFunctionOptions) => Promise; zoomOut: (options?: ViewportHelperFunctionOptions) => Promise; setMinZoom: (minZoom: number) => void; @@ -29,16 +26,96 @@ export type SvelteFlowStoreActions = { fitView: (options?: FitViewOptions) => Promise; updateNodePositions: UpdateNodePositions; updateNodeInternals: (updates: Map) => void; - unselectNodesAndEdges: (params?: { nodes?: Node[]; edges?: Edge[] }) => void; + unselectNodesAndEdges: (params?: { nodes?: NodeType[]; edges?: EdgeType[] }) => void; addSelectedNodes: (ids: string[]) => void; addSelectedEdges: (ids: string[]) => void; - handleNodeSelection: (id: string) => void; + handleNodeSelection: (id: string, unselect?: boolean, nodeRef?: HTMLDivElement | null) => void; + handleEdgeSelection: (id: string) => void; + moveSelectedNodes: (direction: XYPosition, factor: number) => void; panBy: (delta: XYPosition) => Promise; updateConnection: UpdateConnection; cancelConnection: () => void; reset(): void; }; -export type SvelteFlowStoreState = ReturnType; +export type SvelteFlowRestProps = Omit< + SvelteFlowProps, + | 'width' + | 'height' + | 'class' + | 'proOptions' + | 'selectionKey' + | 'deleteKey' + | 'panActivationKey' + | 'multiSelectionKey' + | 'zoomActivationKey' + | 'paneClickDistance' + | 'nodeClickDistance' + | 'onMoveStart' + | 'onMoveEnd' + | 'onMove' + | 'onnodeclick' + | 'onnodecontextmenu' + | 'onnodedrag' + | 'onnodedragstart' + | 'onnodedragstop' + | 'onnodepointerenter' + | 'onnodepointermove' + | 'onnodepointerleave' + | 'onselectionclick' + | 'onselectioncontextmenu' + | 'onedgeclick' + | 'onedgecontextmenu' + | 'onedgepointerenter' + | 'onedgepointerleave' + | 'onpaneclick' + | 'onpanecontextmenu' + | 'panOnScrollMode' + | 'preventScrolling' + | 'zoomOnScroll' + | 'zoomOnDoubleClick' + | 'zoomOnPinch' + | 'panOnScroll' + | 'panOnDrag' + | 'selectionOnDrag' + | 'connectionLineComponent' + | 'connectionLineStyle' + | 'connectionLineContainerStyle' + | 'connectionLineType' + | 'attributionPosition' + | 'children' + | 'nodes' + | 'edges' + | 'viewport' +>; -export type SvelteFlowStore = SvelteFlowStoreState & SvelteFlowStoreActions; +export type StoreSignals = { + props: SvelteFlowRestProps; + width?: number; + height?: number; + nodes: NodeType[]; + edges: EdgeType[]; + viewport?: Viewport; +}; + +export type SvelteFlowStoreState< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +> = ReturnType>; + +export type SvelteFlowStore< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +> = SvelteFlowStoreState & SvelteFlowStoreActions; + +export type StoreContext = { + getStore: () => SvelteFlowStore; + provider: boolean; +}; + +export type ProviderContext< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +> = StoreContext & { + setStore: (store: SvelteFlowStore) => void; +}; diff --git a/packages/svelte/src/lib/store/utils.ts b/packages/svelte/src/lib/store/utils.ts deleted file mode 100644 index 0fa76828..00000000 --- a/packages/svelte/src/lib/store/utils.ts +++ /dev/null @@ -1,258 +0,0 @@ -import { - writable, - get, - type Unsubscriber, - type Subscriber, - type Updater, - type Writable -} from 'svelte/store'; -import { - adoptUserNodes, - updateConnectionLookup, - type Viewport, - type PanZoomInstance, - type ConnectionLookup, - type EdgeLookup, - type NodeLookup, - type ParentLookup, - type NodeOrigin, - infiniteExtent, - type CoordinateExtent, - fitViewport, - withResolvers -} from '@xyflow/system'; - -import type { - DefaultEdgeOptions, - DefaultNodeOptions, - Edge, - FitViewOptions, - InternalNode, - Node -} from '$lib/types'; - -// we need to sync the user nodes and the internal nodes so that the user can receive the updates -// made by Svelte Flow (like dragging or selecting a node). -export function syncNodeStores( - nodesStore: ReturnType, - userNodesStore: Writable -) { - const nodesStoreSetter = nodesStore.set; - const userNodesStoreSetter = userNodesStore.set; - const currentNodesStore = get(nodesStore); - const currentUserNodesStore = get(userNodesStore); - // depending how the user initializes the nodes, we need to decide if we want to use - // the user nodes or the internal nodes for initialization. A user can use a SvelteFlowProvider - // without providing any nodes, in that case we want to use the nodes passed by the user. - // By default we are using the store nodes, because they already have the absolute positions. - const initWithUserNodes = currentNodesStore.length === 0 && currentUserNodesStore.length > 0; - - let val = initWithUserNodes ? currentUserNodesStore : currentNodesStore; - nodesStore.set(val); - - const _set = (nds: Node[]) => { - const updatedNodes = nodesStoreSetter(nds); - val = updatedNodes; - - userNodesStoreSetter(val); - - return updatedNodes; - }; - - nodesStore.set = userNodesStore.set = _set; - nodesStore.update = userNodesStore.update = (fn: (nds: Node[]) => Node[]) => _set(fn(val)); -} - -// same for edges -export function syncEdgeStores( - edgesStore: ReturnType, - userEdgesStore: Writable -) { - const nodesStoreSetter = edgesStore.set; - const userEdgesStoreSetter = userEdgesStore.set; - - let val = get(userEdgesStore); - edgesStore.set(val); - - const _set = (eds: Edge[]) => { - nodesStoreSetter(eds); - userEdgesStoreSetter(eds); - val = eds; - }; - - edgesStore.set = userEdgesStore.set = _set; - edgesStore.update = userEdgesStore.update = (fn: (nds: Edge[]) => Edge[]) => _set(fn(val)); -} - -// it is possible to pass a viewport store to SvelteFlow for having more control -// if that's the case we need to sync the internal viewport with the user viewport -export const syncViewportStores = ( - panZoomStore: Writable, - viewportStore: Writable, - userViewportStore?: Writable -) => { - if (!userViewportStore) { - return; - } - - const panZoom = get(panZoomStore); - - const viewportStoreSetter = viewportStore.set; - const userViewportStoreSetter = userViewportStore.set; - - let val = userViewportStore ? get(userViewportStore) : { x: 0, y: 0, zoom: 1 }; - viewportStore.set(val); - - viewportStore.set = (vp: Viewport) => { - viewportStoreSetter(vp); - userViewportStoreSetter(vp); - - val = vp; - - return vp; - }; - - userViewportStore.set = (vp: Viewport) => { - panZoom?.syncViewport(vp); - - viewportStoreSetter(vp); - userViewportStoreSetter(vp); - - val = vp; - - return vp; - }; - - viewportStore.update = (fn: (vp: Viewport) => Viewport) => { - viewportStore.set(fn(val)); - }; - - userViewportStore.update = (fn: (vp: Viewport) => Viewport) => { - userViewportStore.set(fn(val)); - }; -}; - -export type NodeStoreOptions = { - elevateNodesOnSelect?: boolean; -}; - -// we are creating a custom store for the internals nodes in order to update the zIndex and positionAbsolute. -// The user only passes in relative positions, so we need to calculate the absolute positions based on the parent nodes. -export const createNodesStore = ( - nodes: Node[], - nodeLookup: NodeLookup, - parentLookup: ParentLookup, - nodeOrigin: NodeOrigin = [0, 0], - nodeExtent: CoordinateExtent = infiniteExtent, - fitViewQueued: Writable, - fitViewOptions: Writable, - fitViewResolver: Writable> | null>, - panZoom: Writable, - width: Writable, - height: Writable, - minZoom: Writable, - maxZoom: Writable -): { - subscribe: (this: void, run: Subscriber) => Unsubscriber; - update: (this: void, updater: Updater) => void; - set: (this: void, value: Node[]) => Node[]; - setDefaultOptions: (opts: DefaultNodeOptions) => void; - setOptions: (opts: NodeStoreOptions) => void; -} => { - const { subscribe, set, update } = writable([]); - let value = nodes; - let defaults = {}; - let elevateNodesOnSelect = true; - - const _set = (nds: Node[]): Node[] => { - const nodesInitialized = adoptUserNodes(nds, nodeLookup, parentLookup, { - elevateNodesOnSelect, - nodeOrigin, - nodeExtent, - defaults, - checkEquality: false - }); - - if (get(fitViewQueued) && nodesInitialized && get(panZoom)) { - const fitViewPromise = fitViewport( - { - nodes: nodeLookup, - width: get(width), - height: get(height), - panZoom: get(panZoom)!, - minZoom: get(minZoom), - maxZoom: get(maxZoom) - }, - get(fitViewOptions) - ); - fitViewPromise.then((value) => { - get(fitViewResolver)?.resolve(value); - fitViewResolver.set(null); - }); - - fitViewQueued.set(false); - fitViewOptions.set(undefined); - } - - value = nds; - - set(value); - - return value; - }; - - const _update: typeof update = (fn: (nds: Node[]) => Node[]) => _set(fn(value)); - - const setDefaultOptions = (options: DefaultNodeOptions) => { - defaults = options; - }; - - const setOptions = (options: NodeStoreOptions) => { - elevateNodesOnSelect = options.elevateNodesOnSelect ?? elevateNodesOnSelect; - }; - - _set(value); - - return { - subscribe, - set: _set, - update: _update, - setDefaultOptions, - setOptions - }; -}; - -export const createEdgesStore = ( - edges: Edge[], - connectionLookup: ConnectionLookup, - edgeLookup: EdgeLookup, - defaultOptions?: DefaultEdgeOptions -): Writable & { setDefaultOptions: (opts: DefaultEdgeOptions) => void } => { - const { subscribe, set, update } = writable([]); - let value = edges; - let defaults = defaultOptions || {}; - - const _set: typeof set = (eds: Edge[]) => { - const nextEdges = defaults ? eds.map((edge) => ({ ...defaults, ...edge })) : eds; - - updateConnectionLookup(connectionLookup, edgeLookup, nextEdges); - - value = nextEdges; - set(value); - }; - - const _update: typeof update = (fn: (eds: Edge[]) => Edge[]) => _set(fn(value)); - - const setDefaultOptions = (options: DefaultEdgeOptions) => { - defaults = options; - }; - - _set(value); - - return { - subscribe, - set: _set, - update: _update, - setDefaultOptions - }; -}; diff --git a/packages/svelte/src/lib/store/visible-edges.ts b/packages/svelte/src/lib/store/visible-edges.ts deleted file mode 100644 index d1b4a467..00000000 --- a/packages/svelte/src/lib/store/visible-edges.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { derived } from 'svelte/store'; -import { isEdgeVisible, getEdgePosition, getElevatedEdgeZIndex } from '@xyflow/system'; - -import type { EdgeLayouted } from '$lib/types'; -import type { SvelteFlowStoreState } from './types'; - -export function getVisibleEdges(store: SvelteFlowStoreState) { - const visibleEdges = derived( - [ - store.edges, - store.nodes, - store.nodeLookup, - store.onlyRenderVisibleElements, - store.viewport, - store.width, - store.height - ], - ([edges, , nodeLookup, onlyRenderVisibleElements, viewport, width, height]) => { - const visibleEdges = - onlyRenderVisibleElements && width && height - ? edges.filter((edge) => { - const sourceNode = nodeLookup.get(edge.source); - const targetNode = nodeLookup.get(edge.target); - - return ( - sourceNode && - targetNode && - isEdgeVisible({ - sourceNode, - targetNode, - width, - height, - transform: [viewport.x, viewport.y, viewport.zoom] - }) - ); - }) - : edges; - - return visibleEdges; - } - ); - - return derived( - [visibleEdges, store.nodes, store.nodeLookup, store.connectionMode, store.onerror], - ([visibleEdges, , nodeLookup, connectionMode, onerror]) => { - const layoutedEdges = visibleEdges.reduce((res, edge) => { - const sourceNode = nodeLookup.get(edge.source); - const targetNode = nodeLookup.get(edge.target); - - if (!sourceNode || !targetNode) { - return res; - } - - const edgePosition = getEdgePosition({ - id: edge.id, - sourceNode, - targetNode, - sourceHandle: edge.sourceHandle || null, - targetHandle: edge.targetHandle || null, - connectionMode, - onError: onerror - }); - - if (edgePosition) { - res.push({ - ...edge, - zIndex: getElevatedEdgeZIndex({ - selected: edge.selected, - zIndex: edge.zIndex, - sourceNode, - targetNode, - elevateOnSelect: false - }), - ...edgePosition - }); - } - - return res; - }, []); - - return layoutedEdges; - } - ); -} diff --git a/packages/svelte/src/lib/store/visible-nodes.ts b/packages/svelte/src/lib/store/visible-nodes.ts deleted file mode 100644 index e615439f..00000000 --- a/packages/svelte/src/lib/store/visible-nodes.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { derived } from 'svelte/store'; -import { getNodesInside, type Transform } from '@xyflow/system'; -import type { SvelteFlowStoreState } from './types'; - -export function getVisibleNodes(store: SvelteFlowStoreState) { - return derived( - [ - store.nodeLookup, - store.onlyRenderVisibleElements, - store.width, - store.height, - store.viewport, - store.nodes - ], - ([nodeLookup, onlyRenderVisibleElements, width, height, viewport]) => { - const transform: Transform = [viewport.x, viewport.y, viewport.zoom]; - - return onlyRenderVisibleElements - ? getNodesInside(nodeLookup, { x: 0, y: 0, width, height }, transform, true) - : Array.from(nodeLookup.values()); - } - ); -} diff --git a/packages/svelte/src/lib/store/visibleElements.ts b/packages/svelte/src/lib/store/visibleElements.ts new file mode 100644 index 00000000..e8ff8aca --- /dev/null +++ b/packages/svelte/src/lib/store/visibleElements.ts @@ -0,0 +1,147 @@ +import type { DefaultEdgeOptions, Node, Edge, EdgeLayouted, InternalNode } from '$lib/types'; +import { + ConnectionMode, + getEdgePosition, + getElevatedEdgeZIndex, + getNodesInside, + isEdgeVisible, + type NodeLookup, + type OnError, + type Transform +} from '@xyflow/system'; + +export function getVisibleNodes( + nodeLookup: NodeLookup>, + transform: Transform, + width: number, + height: number +) { + const visibleNodes = new Map>(); + getNodesInside(nodeLookup, { x: 0, y: 0, width: width, height: height }, transform, true).forEach( + (node) => { + visibleNodes.set(node.id, node); + } + ); + return visibleNodes; +} + +export interface EdgeLayoutBaseOptions { + edges: EdgeType[]; + defaultEdgeOptions: DefaultEdgeOptions; + elevateEdgesOnSelect: boolean; + previousEdges: Map>; + nodeLookup: NodeLookup>; + connectionMode: ConnectionMode; + onerror: OnError; +} + +export interface EdgeLayoutAllOptions + extends EdgeLayoutBaseOptions { + onlyRenderVisible: never; + visibleNodes: never; + transform: never; + width: never; + height: never; +} + +export interface EdgeLayoutOnlyVisibleOptions< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +> extends EdgeLayoutBaseOptions { + visibleNodes: Map; + transform: Transform; + width: number; + height: number; + onlyRenderVisible: true; +} + +export type EdgeLayoutOptions = + | EdgeLayoutAllOptions + | EdgeLayoutOnlyVisibleOptions; + +export function getLayoutedEdges( + options: EdgeLayoutOptions +): Map> { + const { + edges, + defaultEdgeOptions, + nodeLookup, + previousEdges, + connectionMode, + onerror, + onlyRenderVisible, + elevateEdgesOnSelect + } = options; + const layoutedEdges = new Map>(); + for (const edge of edges) { + const sourceNode = nodeLookup.get(edge.source); + const targetNode = nodeLookup.get(edge.target); + + if (!sourceNode || !targetNode) { + continue; + } + + if (onlyRenderVisible) { + const { visibleNodes, transform, width, height } = options; + if ( + isEdgeVisible({ + sourceNode, + targetNode, + width: width!, + height: height!, + transform: transform! + }) + ) { + visibleNodes!.set(sourceNode.id, sourceNode); + visibleNodes!.set(targetNode.id, targetNode); + } else { + continue; + } + } + + // we reuse the previous edge object if + // the current and previous edge are the same + // and the source and target node are the same + // and references to internalNodes are the same + const previous = previousEdges.get(edge.id); + if ( + previous && + edge === previous.edge && + sourceNode == previous.sourceNode && + targetNode == previous.targetNode + ) { + layoutedEdges.set(edge.id, previous); + continue; + } + + const edgePosition = getEdgePosition({ + id: edge.id, + sourceNode, + targetNode, + sourceHandle: edge.sourceHandle || null, + targetHandle: edge.targetHandle || null, + connectionMode, + onError: onerror + }); + + if (edgePosition) { + layoutedEdges.set(edge.id, { + ...defaultEdgeOptions, + ...edge, + ...edgePosition, + zIndex: getElevatedEdgeZIndex({ + selected: edge.selected, + zIndex: edge.zIndex ?? defaultEdgeOptions.zIndex, + sourceNode, + targetNode, + elevateOnSelect: elevateEdgesOnSelect + }), + sourceNode, + targetNode, + edge + }); + } + } + + return layoutedEdges; +} diff --git a/packages/svelte/src/lib/types/edges.ts b/packages/svelte/src/lib/types/edges.ts index 2a9a1445..c903512a 100644 --- a/packages/svelte/src/lib/types/edges.ts +++ b/packages/svelte/src/lib/types/edges.ts @@ -1,4 +1,4 @@ -import type { SvelteComponent, ComponentType } from 'svelte'; +import type { Component } from 'svelte'; import type { EdgeBase, BezierPathOptions, @@ -9,6 +9,7 @@ import type { } from '@xyflow/system'; import type { Node } from '$lib/types'; +import type { ClassValue, HTMLAttributes } from 'svelte/elements'; /** * An `Edge` is the complete description with everything Svelte Flow needs to know in order to @@ -22,9 +23,32 @@ export type Edge< label?: string; labelStyle?: string; style?: string; - class?: string; + class?: ClassValue; + focusable?: boolean; }; +export type BaseEdgeProps = Pick< + EdgeProps, + 'interactionWidth' | 'label' | 'labelStyle' | 'style' +> & { + id?: string; + /** SVG path of the edge */ + path: string; + /** The x coordinate of the label */ + labelX?: number; + /** The y coordinate of the label */ + labelY?: number; + /** Marker at start of edge + * @example 'url(#arrow)' + */ + markerStart?: string; + /** Marker at end of edge + * @example 'url(#arrow)' + */ + markerEnd?: string; + class?: ClassValue; +} & HTMLAttributes; + type SmoothStepEdge = Record> = Edge< EdgeData, 'smoothstep' @@ -115,47 +139,23 @@ export type StraightEdgeProps = Omit + Component< + EdgeProps & { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data?: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + type: any; + } > >; export type DefaultEdgeOptions = DefaultEdgeOptionsBase; -export type EdgeLayouted = Pick< - Edge, - | 'type' - | 'id' - | 'data' - | 'style' - | 'source' - | 'target' - | 'animated' - | 'selected' - | 'selectable' - | 'deletable' - | 'label' - | 'labelStyle' - | 'interactionWidth' - | 'markerStart' - | 'markerEnd' - | 'sourceHandle' - | 'targetHandle' - | 'ariaLabel' - | 'hidden' - | 'class' - | 'zIndex' -> & +export type EdgeLayouted = EdgeType & EdgePosition & { sourceNode?: Node; targetNode?: Node; sourceHandleId?: string | null; targetHandleId?: string | null; + edge: EdgeType; }; diff --git a/packages/svelte/src/lib/types/events.ts b/packages/svelte/src/lib/types/events.ts new file mode 100644 index 00000000..24db8e1e --- /dev/null +++ b/packages/svelte/src/lib/types/events.ts @@ -0,0 +1,77 @@ +import type { Edge } from './edges'; +import type { Node } from './nodes'; + +export type NodeEventWithPointer = ({ + node, + event +}: { + node: NodeType; + event: T; +}) => void; + +export type NodesEventWithPointer = ({ + nodes, + event +}: { + nodes: NodeType[]; + event: T; +}) => void; + +export type NodeTargetEventWithPointer = ({ + targetNode, + nodes, + event +}: { + targetNode: NodeType | null; + nodes: NodeType[]; + event: T; +}) => void; + +export type NodeEvents = { + /** This event handler is called when a user clicks on a node. */ + onnodeclick?: NodeEventWithPointer; + /** This event handler is called when a user right-clicks on a node. */ + onnodecontextmenu?: NodeEventWithPointer; + /** This event handler is called when a user drags a node. */ + onnodedrag?: NodeTargetEventWithPointer; + /** This event handler is called when a user starts to drag a node. */ + onnodedragstart?: NodeTargetEventWithPointer; + /** This event handler is called when a user stops dragging a node. */ + onnodedragstop?: NodeTargetEventWithPointer; + /** This event handler is called when the pointer of a user enters a node. */ + onnodepointerenter?: NodeEventWithPointer; + /** This event handler is called when the pointer of a user leaves a node. */ + onnodepointerleave?: NodeEventWithPointer; + /** This event handler is called when the pointer of a user moves over a node. */ + onnodepointermove?: NodeEventWithPointer; +}; + +export type NodeSelectionEvents = { + /** This event handler is called when a user right-clicks the selection box. */ + onselectioncontextmenu?: NodesEventWithPointer; + /** This event handler is called when a user clicks the selection box. */ + onselectionclick?: NodesEventWithPointer; +}; + +export type PaneEvents = { + /** This event handler is called when a user clicks the pane. */ + onpaneclick?: ({ event }: { event: MouseEvent }) => void; + /** This event handler is called when a user right-clicks the pane. */ + onpanecontextmenu?: ({ event }: { event: MouseEvent }) => void; +}; + +export type EdgeEvents = { + /** This event handler is called when a user clicks an edge. */ + onedgeclick?: ({ edge, event }: { edge: EdgeType; event: MouseEvent }) => void; + /** This event handler is called when a user right-clicks an edge. */ + onedgecontextmenu?: ({ edge, event }: { edge: EdgeType; event: MouseEvent }) => void; + /** This event handler is called when the pointer of a user enters an edge. */ + onedgepointerenter?: ({ edge, event }: { edge: EdgeType; event: PointerEvent }) => void; + /** This event handler is called when the pointer of a user enters an edge. */ + onedgepointerleave?: ({ edge, event }: { edge: EdgeType; event: PointerEvent }) => void; +}; + +export type OnSelectionDrag = ( + event: MouseEvent, + nodes: NodeType[] +) => void; diff --git a/packages/svelte/src/lib/types/general.ts b/packages/svelte/src/lib/types/general.ts index 3e15ecee..34474408 100644 --- a/packages/svelte/src/lib/types/general.ts +++ b/packages/svelte/src/lib/types/general.ts @@ -4,8 +4,7 @@ import type { XYPosition, Handle, Connection, - OnBeforeDeleteBase, - HandleProps as HandlePropsSystem + OnBeforeDeleteBase } from '@xyflow/system'; import type { Node } from './nodes'; @@ -22,17 +21,20 @@ export type ConnectionData = { connectionStatus: string | null; }; -export type HandleProps = HandlePropsSystem & { - class?: string; - style?: string; - onconnect?: (connections: Connection[]) => void; - ondisconnect?: (connections: Connection[]) => void; -}; - export type FitViewOptions = FitViewOptionsBase; -export type OnDelete = (params: { nodes: Node[]; edges: Edge[] }) => void; -export type OnEdgeCreate = (connection: Connection) => Edge | Connection | void; +export type OnDelete = (params: { + nodes: NodeType[]; + edges: EdgeType[]; +}) => void; + +export type OnBeforeConnect = ( + connection: Connection +) => EdgeType | Connection | void; +export type OnBeforeReconnect = ( + newEdge: EdgeType, + oldEdge: EdgeType +) => EdgeType | void; export type OnBeforeDelete< NodeType extends Node = Node, EdgeType extends Edge = Edge @@ -41,3 +43,8 @@ export type OnBeforeDelete< export type IsValidConnection = ( edge: EdgeType | Connection ) => boolean; + +export type OnSelectionChange< + NodeType extends Node = Node, + EdgeType extends Edge = Edge +> = (params: { nodes: NodeType[]; edges: EdgeType[] }) => void; diff --git a/packages/svelte/src/lib/types/index.ts b/packages/svelte/src/lib/types/index.ts index 16df96cc..2796d0eb 100644 --- a/packages/svelte/src/lib/types/index.ts +++ b/packages/svelte/src/lib/types/index.ts @@ -1,3 +1,4 @@ export * from './nodes'; export * from './edges'; export * from './general'; +export * from './events'; diff --git a/packages/svelte/src/lib/types/nodes.ts b/packages/svelte/src/lib/types/nodes.ts index e5bd8552..2299f11f 100644 --- a/packages/svelte/src/lib/types/nodes.ts +++ b/packages/svelte/src/lib/types/nodes.ts @@ -1,4 +1,5 @@ -import type { ComponentType, SvelteComponent } from 'svelte'; +import type { Component } from 'svelte'; +import type { ClassValue } from 'svelte/elements'; import type { InternalNodeBase, NodeBase, NodeProps as NodePropsBase } from '@xyflow/system'; /** @@ -17,8 +18,9 @@ export type Node< NodeData extends Record = Record, NodeType extends string = string > = NodeBase & { - class?: string; + class?: ClassValue; style?: string; + focusable?: boolean; }; // @todo: currently generics for nodes are not really supported @@ -30,31 +32,16 @@ export type NodeProps = NodePropsBase & export type NodeTypes = Record< string, - ComponentType< - SvelteComponent< - NodeProps & { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - data: any; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - type: any; - } - > + Component< + NodeProps & { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + data: any; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + type: any; + } > >; -export type DefaultNodeOptions = Partial>; - export type BuiltInNode = | Node<{ label: string }, 'input' | 'output' | 'default'> | Node, 'group'>; - -export type NodeEventMap = { - nodeclick: { node: Node; event: MouseEvent | TouchEvent }; - nodecontextmenu: { node: Node; event: MouseEvent | TouchEvent }; - nodedrag: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent }; - nodedragstart: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent }; - nodedragstop: { targetNode: Node | null; nodes: Node[]; event: MouseEvent | TouchEvent }; - nodemouseenter: { node: Node; event: MouseEvent | TouchEvent }; - nodemouseleave: { node: Node; event: MouseEvent | TouchEvent }; - nodemousemove: { node: Node; event: MouseEvent | TouchEvent }; -}; diff --git a/packages/svelte/src/lib/utils/index.ts b/packages/svelte/src/lib/utils/index.ts index ed1aef35..122f8091 100644 --- a/packages/svelte/src/lib/utils/index.ts +++ b/packages/svelte/src/lib/utils/index.ts @@ -1,4 +1,4 @@ -import { isNodeBase, isEdgeBase } from '@xyflow/system'; +import { isNodeBase, isEdgeBase, type XYPosition } from '@xyflow/system'; import type { Edge, Node } from '$lib/types'; @@ -21,3 +21,14 @@ export const isNode = (element: unknown): element */ export const isEdge = (element: unknown): element is EdgeType => isEdgeBase(element); + +export function toPxString(value: number | undefined): string | undefined { + return value === undefined ? undefined : `${value}px`; +} + +export const arrowKeyDiffs: Record = { + ArrowUp: { x: 0, y: -1 }, + ArrowDown: { x: 0, y: 1 }, + ArrowLeft: { x: -1, y: 0 }, + ArrowRight: { x: 1, y: 0 } +}; diff --git a/packages/svelte/src/routes/+page.svelte.d.ts b/packages/svelte/src/routes/+page.svelte.d.ts new file mode 100644 index 00000000..7097772f --- /dev/null +++ b/packages/svelte/src/routes/+page.svelte.d.ts @@ -0,0 +1,23 @@ +/** @typedef {typeof __propDef.props} PageProps */ +/** @typedef {typeof __propDef.events} PageEvents */ +/** @typedef {typeof __propDef.slots} PageSlots */ +// export default class Page extends SvelteComponentTyped<{ +// [x: string]: never; +// }, { +// [evt: string]: CustomEvent; +// }, {}> { +// } +export type PageProps = typeof __propDef.props; +export type PageEvents = typeof __propDef.events; +export type PageSlots = typeof __propDef.slots; +// import { SvelteComponentTyped } from "svelte"; +// declare const __propDef: { +// props: { +// [x: string]: never; +// }; +// events: { +// [evt: string]: CustomEvent; +// }; +// slots: {}; +// }; +export {}; diff --git a/packages/svelte/src/styles/base.css b/packages/svelte/src/styles/base.css index a0cf3040..56bfb526 100644 --- a/packages/svelte/src/styles/base.css +++ b/packages/svelte/src/styles/base.css @@ -7,3 +7,7 @@ text-align: center; position: absolute; } + +.svelte-flow__container { + user-select: none; +} diff --git a/packages/svelte/src/styles/style.css b/packages/svelte/src/styles/style.css index 981bc92e..dc35ccc6 100644 --- a/packages/svelte/src/styles/style.css +++ b/packages/svelte/src/styles/style.css @@ -8,15 +8,10 @@ position: absolute; padding: 2px; font-size: 10px; - cursor: pointer; color: var(--xy-edge-label-color, var(--xy-edge-label-color-default)); background: var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default)); } -.svelte-flow__nodes { - z-index: 0; -} - -.svelte-flow__edgelabel-renderer { - z-index: 0; +.svelte-flow__container { + user-select: none; } diff --git a/packages/svelte/svelte.config.js b/packages/svelte/svelte.config.js index 60749928..cfe265ab 100644 --- a/packages/svelte/svelte.config.js +++ b/packages/svelte/svelte.config.js @@ -1,9 +1,12 @@ import adapter from '@sveltejs/adapter-auto'; -import preprocess from 'svelte-preprocess'; +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { - preprocess: preprocess(), + preprocess: vitePreprocess(), + compilerOptions: { + runes: true + }, kit: { adapter: adapter() } diff --git a/packages/svelte/tsconfig.json b/packages/svelte/tsconfig.json index d9cfe5d6..8fbe9e82 100644 --- a/packages/svelte/tsconfig.json +++ b/packages/svelte/tsconfig.json @@ -8,8 +8,7 @@ "resolveJsonModule": true, "skipLibCheck": true, "sourceMap": true, - "strict": true, - "noErrorTruncation": true + "strict": true } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bb3a0689..c962a91e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,7 +52,7 @@ importers: version: 3.0.2(@types/react-dom@18.2.8)(@types/react@18.2.24)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)(vite@4.5.3(@types/node@20.14.6)(terser@5.31.0)) '@astrojs/svelte': specifier: ^4.0.2 - version: 4.0.2(astro@3.2.2(@types/node@20.14.6)(terser@5.31.0))(svelte@4.2.1)(typescript@5.4.5)(vite@4.5.3(@types/node@20.14.6)(terser@5.31.0)) + version: 4.0.2(astro@3.2.2(@types/node@20.14.6)(terser@5.31.0))(svelte@4.2.1)(typescript@5.8.3)(vite@4.5.3(@types/node@20.14.6)(terser@5.31.0)) '@types/react': specifier: ^18.2.24 version: 18.2.24 @@ -154,57 +154,57 @@ importers: examples/svelte: dependencies: '@dagrejs/dagre': - specifier: ^1.0.4 - version: 1.0.4 + specifier: ^1.1.4 + version: 1.1.4 '@sveltejs/vite-plugin-svelte': - specifier: ^3.1.1 - version: 3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) + specifier: ^5.0.3 + version: 5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) '@xyflow/svelte': specifier: workspace:^ version: link:../../packages/svelte devDependencies: '@sveltejs/adapter-auto': - specifier: ^3.2.1 - version: 3.2.1(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0))) + specifier: ^6.0.0 + version: 6.0.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))) '@sveltejs/kit': - specifier: ^2.5.10 - version: 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) + specifier: ^2.20.7 + version: 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) '@typescript-eslint/eslint-plugin': - specifier: ^6.10.0 - version: 6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.4.5))(eslint@8.53.0)(typescript@5.4.5) + specifier: ^8.30.1 + version: 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^6.10.0 - version: 6.10.0(eslint@8.53.0)(typescript@5.4.5) + specifier: ^8.30.1 + version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) eslint: - specifier: ^8.53.0 - version: 8.53.0 + specifier: ^9.24.0 + version: 9.24.0 eslint-config-prettier: - specifier: ^9.0.0 - version: 9.0.0(eslint@8.53.0) + specifier: ^10.1.2 + version: 10.1.2(eslint@9.24.0) eslint-plugin-svelte: - specifier: ^2.35.0 - version: 2.35.0(eslint@8.53.0)(svelte@4.2.12) + specifier: ^3.5.1 + version: 3.5.1(eslint@9.24.0)(svelte@5.27.0) prettier: - specifier: ^3.0.3 - version: 3.0.3 + specifier: ^3.5.3 + version: 3.5.3 prettier-plugin-svelte: - specifier: ^3.0.3 - version: 3.0.3(prettier@3.0.3)(svelte@4.2.12) + specifier: ^3.3.3 + version: 3.3.3(prettier@3.5.3)(svelte@5.27.0) svelte: - specifier: ^4.2.12 - version: 4.2.12 + specifier: ^5.27.0 + version: 5.27.0 svelte-check: - specifier: ^3.6.6 - version: 3.6.6(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12) + specifier: ^4.1.6 + version: 4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3) tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.8.1 + version: 2.8.1 typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.8.3 + version: 5.8.3 vite: - specifier: ^5.2.12 - version: 5.2.12(@types/node@20.14.6)(terser@5.31.0) + specifier: ^6.3.0 + version: 6.3.0(@types/node@20.14.6)(terser@5.31.0) packages/react: dependencies: @@ -273,90 +273,99 @@ importers: packages/svelte: dependencies: '@svelte-put/shortcut': - specifier: 3.1.1 - version: 3.1.1(svelte@4.2.12) + specifier: ^4.1.0 + version: 4.1.0(svelte@5.27.0) '@xyflow/system': specifier: workspace:* version: link:../system - classcat: - specifier: ^5.0.4 - version: 5.0.4 devDependencies: + '@eslint/js': + specifier: ^9.24.0 + version: 9.24.0 '@sveltejs/adapter-auto': - specifier: ^3.1.1 - version: 3.1.1(@sveltejs/kit@2.5.4(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0))) + specifier: ^6.0.0 + version: 6.0.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))) '@sveltejs/kit': - specifier: ^2.5.4 - version: 2.5.4(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) + specifier: ^2.20.7 + version: 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) '@sveltejs/package': - specifier: ^2.3.0 - version: 2.3.0(svelte@4.2.12)(typescript@5.4.5) + specifier: ^2.3.11 + version: 2.3.11(svelte@5.27.0)(typescript@5.8.3) + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.3 + version: 5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) '@typescript-eslint/eslint-plugin': - specifier: ^7.2.0 - version: 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + specifier: ^8.30.1 + version: 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/parser': - specifier: ^7.2.0 - version: 7.2.0(eslint@8.57.0)(typescript@5.4.5) + specifier: ^8.30.1 + version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) autoprefixer: - specifier: ^10.4.18 - version: 10.4.18(postcss@8.4.35) + specifier: ^10.4.21 + version: 10.4.21(postcss@8.5.3) cssnano: - specifier: ^6.1.0 - version: 6.1.0(postcss@8.4.35) + specifier: ^7.0.6 + version: 7.0.6(postcss@8.5.3) dotenv: - specifier: ^16.4.5 - version: 16.4.5 + specifier: ^16.5.0 + version: 16.5.0 eslint: - specifier: ^8.57.0 - version: 8.57.0 + specifier: ^9.24.0 + version: 9.24.0 eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@8.57.0) + specifier: ^10.1.2 + version: 10.1.2(eslint@9.24.0) eslint-plugin-svelte: - specifier: ^2.35.1 - version: 2.35.1(eslint@8.57.0)(svelte@4.2.12) + specifier: ^3.5.1 + version: 3.5.1(eslint@9.24.0)(svelte@5.27.0) + globals: + specifier: ^16.0.0 + version: 16.0.0 postcss: - specifier: ^8.4.35 - version: 8.4.35 + specifier: ^8.5.3 + version: 8.5.3 postcss-cli: - specifier: ^11.0.0 - version: 11.0.0(postcss@8.4.35) + specifier: ^11.0.1 + version: 11.0.1(postcss@8.5.3) postcss-combine-duplicated-selectors: specifier: ^10.0.3 - version: 10.0.3(postcss@8.4.35) + version: 10.0.3(postcss@8.5.3) postcss-import: - specifier: ^16.0.1 - version: 16.0.1(postcss@8.4.35) + specifier: ^16.1.0 + version: 16.1.0(postcss@8.5.3) postcss-nested: - specifier: ^6.0.1 - version: 6.0.1(postcss@8.4.35) + specifier: ^7.0.2 + version: 7.0.2(postcss@8.5.3) postcss-rename: specifier: ^0.6.1 - version: 0.6.1(postcss@8.4.35) + version: 0.6.1(postcss@8.5.3) prettier: - specifier: ^3.2.5 - version: 3.2.5 + specifier: ^3.5.3 + version: 3.5.3 prettier-plugin-svelte: - specifier: ^3.2.2 - version: 3.2.2(prettier@3.2.5)(svelte@4.2.12) + specifier: ^3.3.3 + version: 3.3.3(prettier@3.5.3)(svelte@5.27.0) svelte: - specifier: ^4.2.12 - version: 4.2.12 + specifier: ^5.27.0 + version: 5.27.0 svelte-check: - specifier: ^3.6.7 - version: 3.6.7(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12) + specifier: ^4.1.6 + version: 4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3) svelte-eslint-parser: - specifier: ^0.33.1 - version: 0.33.1(svelte@4.2.12) + specifier: ^1.1.2 + version: 1.1.2(svelte@5.27.0) svelte-preprocess: - specifier: ^5.1.3 - version: 5.1.3(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12)(typescript@5.4.5) + specifier: ^6.0.3 + version: 6.0.3(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.5.3))(postcss@8.5.3)(svelte@5.27.0)(typescript@5.8.3) tslib: - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.8.1 + version: 2.8.1 typescript: - specifier: 5.4.5 - version: 5.4.5 + specifier: ^5.8.3 + version: 5.8.3 + typescript-eslint: + specifier: ^8.30.1 + version: 8.30.1(eslint@9.24.0)(typescript@5.8.3) packages/system: dependencies: @@ -401,8 +410,8 @@ importers: tests/playwright: dependencies: '@playwright/experimental-ct-react': - specifier: ^1.45.0 - version: 1.45.0(@types/node@20.14.6)(terser@5.31.0)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) + specifier: ^1.51.1 + version: 1.51.1(@types/node@20.14.6)(terser@5.31.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) '@types/react': specifier: ^18.3.3 version: 18.3.3 @@ -416,12 +425,12 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) typescript: - specifier: ^5.4.5 - version: 5.4.5 + specifier: ^5.7.3 + version: 5.7.3 devDependencies: '@playwright/test': - specifier: ^1.45.0 - version: 1.45.0 + specifier: ^1.51.1 + version: 1.51.1 '@types/node': specifier: ^20.14.6 version: 20.14.6 @@ -430,22 +439,22 @@ importers: devDependencies: '@typescript-eslint/eslint-plugin': specifier: ^8.23.0 - version: 8.23.0(@typescript-eslint/parser@8.23.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) '@typescript-eslint/parser': specifier: ^8.23.0 - version: 8.23.0(eslint@8.57.0)(typescript@5.4.5) + version: 8.29.1(eslint@9.24.0)(typescript@5.8.3) eslint-config-prettier: specifier: ^10.0.1 - version: 10.0.1(eslint@8.57.0) + version: 10.1.1(eslint@9.24.0) eslint-config-turbo: specifier: ^2.4.0 - version: 2.4.0(eslint@8.57.0)(turbo@2.0.3) + version: 2.5.0(eslint@9.24.0)(turbo@2.0.3) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@10.0.1(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5) + version: 4.2.1(eslint-config-prettier@10.1.1(eslint@9.24.0))(eslint@9.24.0)(prettier@3.5.3) eslint-plugin-react: specifier: ^7.37.4 - version: 7.37.4(eslint@8.57.0) + version: 7.37.5(eslint@9.24.0) tooling/rollup-config: devDependencies: @@ -463,7 +472,7 @@ importers: version: 0.4.4(rollup@4.18.0) '@rollup/plugin-typescript': specifier: 11.1.6 - version: 11.1.6(rollup@4.18.0)(tslib@2.6.2)(typescript@5.4.5) + version: 11.1.6(rollup@4.18.0)(tslib@2.8.1)(typescript@5.7.3) rollup: specifier: ^4.18.0 version: 4.18.0 @@ -472,7 +481,7 @@ importers: version: 2.2.4(rollup@4.18.0) typescript: specifier: ^5.4.5 - version: 5.4.5 + version: 5.7.3 tooling/tsconfig: {} @@ -847,22 +856,16 @@ packages: '@cypress/xvfb@1.2.4': resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} - '@dagrejs/dagre@1.0.4': - resolution: {integrity: sha512-jrEore+HhW1yg1Rsd9H1PPMcoEOD4bVh0WCXc6GqzyzubnJj4GaWGg8ETOrskTd/3n/g5LOzumGM4CCgpNLJNw==} + '@dagrejs/dagre@1.1.4': + resolution: {integrity: sha512-QUTc54Cg/wvmlEUxB+uvoPVKFazM1H18kVHBQNmK2NbrDR5ihOCR6CXLnDSZzMcSQKJtabPUWridBOlJM3WkDg==} - '@dagrejs/graphlib@2.1.13': - resolution: {integrity: sha512-calbMa7Gcyo+/t23XBaqQqon8LlgE9regey4UVoikoenKBXvUnCUL3s9RP6USCxttfr0XWVICtYUuKMdehKqMw==} + '@dagrejs/graphlib@2.2.4': + resolution: {integrity: sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==} engines: {node: '>17.0.0'} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -878,15 +881,9 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} + engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -902,15 +899,9 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} + engines: {node: '>=18'} cpu: [arm] os: [android] @@ -926,15 +917,9 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} + engines: {node: '>=18'} cpu: [x64] os: [android] @@ -950,15 +935,9 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -974,15 +953,9 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -998,15 +971,9 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1022,15 +989,9 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1046,15 +1007,9 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1070,15 +1025,9 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1094,15 +1043,9 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1118,15 +1061,9 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1142,15 +1079,9 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1166,15 +1097,9 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1190,15 +1115,9 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1214,15 +1133,9 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1238,17 +1151,17 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] '@esbuild/netbsd-x64@0.18.20': resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} @@ -1262,17 +1175,17 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] '@esbuild/openbsd-x64@0.18.20': resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} @@ -1286,15 +1199,9 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1310,15 +1217,9 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1334,15 +1235,9 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1358,15 +1253,9 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1382,15 +1271,9 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1400,37 +1283,63 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.10.0': resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint-community/regexpp@4.9.1': resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + '@eslint/config-array@0.20.0': + resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.1': + resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.13.0': + resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@2.1.2': resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@2.1.3': - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/js@8.43.0': resolution: {integrity: sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@8.53.0': - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.24.0': + resolution: {integrity: sha512-uIY/y3z0uvOGX8cp1C2fiC4+ZmBhp6yZWkojtHL1YEMnRt1Y63HB9TM17proGEmeG7HeUY+UP36F0aknKYTpYA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.8': + resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.0.0': resolution: {integrity: sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==} @@ -1442,16 +1351,19 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.11.13': resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -1460,9 +1372,13 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} deprecated: Use @eslint/object-schema instead - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} + engines: {node: '>=18.18'} '@jridgewell/gen-mapping@0.3.3': resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} @@ -1494,6 +1410,9 @@ packages: '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.20': resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} @@ -1518,12 +1437,12 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@playwright/experimental-ct-core@1.45.0': - resolution: {integrity: sha512-XxAZW3TnkkRlqRRiAnN/q8wzuspqDA2o8912TQkhbH2BKD3Ko4RLMVy0J7QJ+quG1fCp1/rlbg96/fB15wOemg==} + '@playwright/experimental-ct-core@1.51.1': + resolution: {integrity: sha512-kpRZWBT3SMukL1fx8BwEj385Pkgtp86bBKzmrmJU30lWlQiIDFNaIHosgxQC68c8y2mg3Una/lBSHNc2Fotgkw==} engines: {node: '>=18'} - '@playwright/experimental-ct-react@1.45.0': - resolution: {integrity: sha512-GoT7eZMR5wLPFjGwQbGywiy2Z+9jwx5F+GJAZE1xbqMJPzSB5bv8zd5g09mWN4aKOHpc/kzkCBv0bxzW/es51A==} + '@playwright/experimental-ct-react@1.51.1': + resolution: {integrity: sha512-Lu14QiemO2TWfiL6TQPWBH2n+4IvPYH/W6cfblzYpLu/TZdJ7e608l3GwqAGRN5FJym3YOonC7x1Q5EAwcBarg==} engines: {node: '>=18'} hasBin: true @@ -1532,8 +1451,8 @@ packages: engines: {node: '>=16'} hasBin: true - '@playwright/test@1.45.0': - resolution: {integrity: sha512-TVYsfMlGAaxeUllNkywbwek67Ncf8FRGn8ZlRdO291OL3NjG9oMbfVhyP82HQF0CZLMrYsvesqoUekxdWuF9Qw==} + '@playwright/test@1.51.1': + resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==} engines: {node: '>=18'} hasBin: true @@ -1618,81 +1537,181 @@ packages: cpu: [arm] os: [android] + '@rollup/rollup-android-arm-eabi@4.39.0': + resolution: {integrity: sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==} + cpu: [arm] + os: [android] + '@rollup/rollup-android-arm64@4.18.0': resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] + '@rollup/rollup-android-arm64@4.39.0': + resolution: {integrity: sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==} + cpu: [arm64] + os: [android] + '@rollup/rollup-darwin-arm64@4.18.0': resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] + '@rollup/rollup-darwin-arm64@4.39.0': + resolution: {integrity: sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==} + cpu: [arm64] + os: [darwin] + '@rollup/rollup-darwin-x64@4.18.0': resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] + '@rollup/rollup-darwin-x64@4.39.0': + resolution: {integrity: sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.39.0': + resolution: {integrity: sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.39.0': + resolution: {integrity: sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==} + cpu: [x64] + os: [freebsd] + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + resolution: {integrity: sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.18.0': resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + resolution: {integrity: sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==} + cpu: [arm] + os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.18.0': resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-gnu@4.39.0': + resolution: {integrity: sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==} + cpu: [arm64] + os: [linux] + '@rollup/rollup-linux-arm64-musl@4.18.0': resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] + '@rollup/rollup-linux-arm64-musl@4.39.0': + resolution: {integrity: sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + resolution: {integrity: sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==} + cpu: [loong64] + os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] os: [linux] + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + resolution: {integrity: sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==} + cpu: [ppc64] + os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.18.0': resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + resolution: {integrity: sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.39.0': + resolution: {integrity: sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==} + cpu: [riscv64] + os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.18.0': resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] os: [linux] + '@rollup/rollup-linux-s390x-gnu@4.39.0': + resolution: {integrity: sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==} + cpu: [s390x] + os: [linux] + '@rollup/rollup-linux-x64-gnu@4.18.0': resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-gnu@4.39.0': + resolution: {integrity: sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==} + cpu: [x64] + os: [linux] + '@rollup/rollup-linux-x64-musl@4.18.0': resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] + '@rollup/rollup-linux-x64-musl@4.39.0': + resolution: {integrity: sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==} + cpu: [x64] + os: [linux] + '@rollup/rollup-win32-arm64-msvc@4.18.0': resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] + '@rollup/rollup-win32-arm64-msvc@4.39.0': + resolution: {integrity: sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==} + cpu: [arm64] + os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.18.0': resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] + '@rollup/rollup-win32-ia32-msvc@4.39.0': + resolution: {integrity: sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==} + cpu: [ia32] + os: [win32] + '@rollup/rollup-win32-x64-msvc@4.18.0': resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] + '@rollup/rollup-win32-x64-msvc@4.39.0': + resolution: {integrity: sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==} + cpu: [x64] + os: [win32] + '@sideway/address@4.1.4': resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} @@ -1706,41 +1725,32 @@ packages: resolution: {integrity: sha512-rUV5WyJrJLoloD4NDN1V1+LDMDWOa4OTsT4yYJwQNpTU6FWxkxHpL7eu4w+DmiH8x/EAM1otkPE1+LaspIbplw==} engines: {node: '>=18'} - '@svelte-put/shortcut@3.1.1': - resolution: {integrity: sha512-2L5EYTZXiaKvbEelVkg5znxqvfZGZai3m97+cAiUBhLZwXnGtviTDpHxOoZBsqz41szlfRMcamW/8o0+fbW3ZQ==} + '@svelte-put/shortcut@4.1.0': + resolution: {integrity: sha512-wImNEIkbxAIWFqlfuhcbC+jRPDeRa/uJGIXHMEVVD+jqL9xCwWNnkGQJ6Qb2XVszuRLHlb8SGZDL3Io/h3vs8w==} peerDependencies: - svelte: ^3.55.0 || ^4.0.0 || ^5.0.0 + svelte: ^5.1.0 - '@sveltejs/adapter-auto@3.1.1': - resolution: {integrity: sha512-6LeZft2Fo/4HfmLBi5CucMYmgRxgcETweQl/yQoZo/895K3S9YWYN4Sfm/IhwlIpbJp3QNvhKmwCHbsqQNYQpw==} + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + + '@sveltejs/adapter-auto@6.0.0': + resolution: {integrity: sha512-7mR2/G7vlXakaOj6QBSG9dwBfTgWjV+UnEMB5Z6Xu0ZbdXda6c0su1fNkg0ab0zlilSkloMA2NjCna02/DR7sA==} peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/adapter-auto@3.2.1': - resolution: {integrity: sha512-/3xx8ZFCD5UBc/7AbyXkFF3HNCzWAp2xncH8HA4doGjoGQEN7PmwiRx4Y9nOzi4mqDqYYUic0gaIAE2khWWU4Q==} - peerDependencies: - '@sveltejs/kit': ^2.0.0 - - '@sveltejs/kit@2.5.10': - resolution: {integrity: sha512-OqoyTmFG2cYmCFAdBfW+Qxbg8m23H4dv6KqwEt7ofr/ROcfcIl3Z/VT56L22H9f0uNZyr+9Bs1eh2gedOCK9kA==} + '@sveltejs/kit@2.20.7': + resolution: {integrity: sha512-dVbLMubpJJSLI4OYB+yWYNHGAhgc2bVevWuBjDj8jFUXIJOAnLwYP3vsmtcgoxNGUXoq0rHS5f7MFCsryb6nzg==} engines: {node: '>=18.13'} hasBin: true peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 + vite: ^5.0.3 || ^6.0.0 - '@sveltejs/kit@2.5.4': - resolution: {integrity: sha512-eDxK2d4EGzk99QsZNoPXe7jlzA5EGqfcCpUwZ912bhnalsZ2ZsG5wGRthkydupVjYyqdmzEanVKFhLxU2vkPSQ==} - engines: {node: '>=18.13'} - hasBin: true - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 - - '@sveltejs/package@2.3.0': - resolution: {integrity: sha512-wmtwEfi3gQnmtotAjygRHR6cmLfpblQl1dU764f3N2I5DPe34llFs44bHOYcuk91Bp2sSq6bWUmNwxGlYCchOA==} + '@sveltejs/package@2.3.11': + resolution: {integrity: sha512-DSMt2U0XNAdoQBYksrmgQi5dKy7jUTVDJLiagS/iXF7AShjAmTbGJQKruBuT/FfYAWvNxfQTSjkXU8eAIjVeNg==} engines: {node: ^16.14 || >=18} hasBin: true peerDependencies: @@ -1754,13 +1764,13 @@ packages: svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 '@sveltejs/vite-plugin-svelte@2.5.3': resolution: {integrity: sha512-erhNtXxE5/6xGZz/M9eXsmI7Pxa6MS7jyTy06zN3Ck++ldrppOnOlJwHHTsMC7DHDQdgUp4NAc4cDNQ9eGdB/w==} @@ -1769,12 +1779,12 @@ packages: svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0 vite: ^4.0.0 - '@sveltejs/vite-plugin-svelte@3.1.1': - resolution: {integrity: sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==} - engines: {node: ^18.0.0 || >=20} + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 '@swc/core-darwin-arm64@1.3.96': resolution: {integrity: sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==} @@ -1912,6 +1922,12 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/hast@2.3.7': resolution: {integrity: sha512-EVLigw5zInURhzfXUM65eixfadfsHKomGKUakToXo84t8gGIJuTcD2xooM2See7GyQ7DRtYjhCHnSUQez8JaLw==} @@ -1960,9 +1976,6 @@ packages: '@types/prop-types@15.7.9': resolution: {integrity: sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==} - '@types/pug@2.0.10': - resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} - '@types/react-dom@18.2.14': resolution: {integrity: sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==} @@ -1993,9 +2006,6 @@ packages: '@types/semver@6.2.5': resolution: {integrity: sha512-NAxro9/RqWXTqdSjccDZAjA4nXK+6zRun+HvibYJfGy8TQhpOC7Vv6v2rlHYKrT0Q8jGGoNRd/xVdHRIQRNlFQ==} - '@types/semver@7.5.6': - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - '@types/sinonjs__fake-timers@8.1.1': resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} @@ -2014,171 +2024,99 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@6.10.0': - resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@7.2.0': - resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/eslint-plugin@8.23.0': - resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} + '@typescript-eslint/eslint-plugin@8.29.1': + resolution: {integrity: sha512-ba0rr4Wfvg23vERs3eB+P3lfj2E+2g3lhWcCVukUuhtcdUx5lSIFZlGFEBHKr+3zizDa/TvZTptdNHVZWAkSBg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@6.10.0': - resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/eslint-plugin@8.30.1': + resolution: {integrity: sha512-v+VWphxMjn+1t48/jO4t950D6KR8JaJuNXzi33Ve6P8sEmPr5k6CEXjdGwT6+LodVnEa91EQCtwjWNUCPweo+Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@7.2.0': - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@8.23.0': - resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} + '@typescript-eslint/parser@8.29.1': + resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@6.10.0': - resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@7.2.0': - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/scope-manager@8.23.0': - resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/type-utils@6.10.0': - resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@7.2.0': - resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/type-utils@8.23.0': - resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} + '@typescript-eslint/parser@8.30.1': + resolution: {integrity: sha512-H+vqmWwT5xoNrXqWs/fesmssOW70gxFlgcMlYcBaWNPIEWDgLa4W9nkSPmhuOgLnXq9QYgkZ31fhDyLhleCsAg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@6.10.0': - resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@7.2.0': - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@8.23.0': - resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} + '@typescript-eslint/scope-manager@8.29.1': + resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@6.10.0': - resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@7.2.0': - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@8.23.0': - resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} + '@typescript-eslint/scope-manager@8.30.1': + resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@6.10.0': - resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/utils@7.2.0': - resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/utils@8.23.0': - resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} + '@typescript-eslint/type-utils@8.29.1': + resolution: {integrity: sha512-DkDUSDwZVCYN71xA4wzySqqcZsHKic53A4BLqmrWFFpOpNSoxX233lwGu/2135ymTCR04PoKiEEEvN1gFYg4Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <5.8.0' + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@6.10.0': - resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/type-utils@8.30.1': + resolution: {integrity: sha512-64uBF76bfQiJyHgZISC7vcNz3adqQKIccVoKubyQcOnNcdJBvYOILV1v22Qhsw3tw3VQu5ll8ND6hycgAR5fEA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@7.2.0': - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@8.23.0': - resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} + '@typescript-eslint/types@8.29.1': + resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@typescript-eslint/types@8.30.1': + resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.29.1': + resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/typescript-estree@8.30.1': + resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.29.1': + resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/utils@8.30.1': + resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + + '@typescript-eslint/visitor-keys@8.29.1': + resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/visitor-keys@8.30.1': + resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react-swc@3.4.1': resolution: {integrity: sha512-7YQOQcVV5x1luD8nkbCDdyYygFvn1hjqJk68UvNAzY2QG4o4N5EwAhLLFNOcd1HrdMwDl0VElP8VutoWf9IvJg==} @@ -2212,8 +2150,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -2277,6 +2215,10 @@ packages: aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + array-buffer-byte-length@1.0.0: resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} @@ -2364,8 +2306,8 @@ packages: peerDependencies: postcss: ^8.1.0 - autoprefixer@10.4.18: - resolution: {integrity: sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==} + autoprefixer@10.4.21: + resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} hasBin: true peerDependencies: @@ -2391,8 +2333,9 @@ packages: axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} - axobject-query@4.0.0: - resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} @@ -2454,13 +2397,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + browserslist@4.24.4: + resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -2484,8 +2427,8 @@ packages: resolution: {integrity: sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==} engines: {node: '>=6'} - call-bind-apply-helpers@1.0.1: - resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} call-bind@1.0.5: @@ -2499,8 +2442,8 @@ packages: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} - call-bound@1.0.3: - resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} callsites@3.1.0: @@ -2525,11 +2468,11 @@ packages: caniuse-lite@1.0.30001553: resolution: {integrity: sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==} - caniuse-lite@1.0.30001594: - resolution: {integrity: sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g==} + caniuse-lite@1.0.30001680: + resolution: {integrity: sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==} - caniuse-lite@1.0.30001639: - resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} + caniuse-lite@1.0.30001712: + resolution: {integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2569,9 +2512,9 @@ packages: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -2626,6 +2569,10 @@ packages: resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} engines: {node: '>=6'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -2712,14 +2659,18 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + css-declaration-sorter@6.4.1: resolution: {integrity: sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==} engines: {node: ^10 || ^12 || >=14} peerDependencies: postcss: ^8.0.9 - css-declaration-sorter@7.1.1: - resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==} + css-declaration-sorter@7.2.0: + resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 @@ -2750,9 +2701,9 @@ packages: peerDependencies: postcss: ^8.2.15 - cssnano-preset-default@6.1.0: - resolution: {integrity: sha512-4DUXZoDj+PI3fRl3MqMjl9DwLGjcsFP4qt+92nLUcN1RGfw2TY+GwNoG2B38Usu1BrcTs8j9pxNfSusmvtSjfg==} - engines: {node: ^14 || ^16 || >=18.0} + cssnano-preset-default@7.0.6: + resolution: {integrity: sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -2762,9 +2713,9 @@ packages: peerDependencies: postcss: ^8.2.15 - cssnano-utils@4.0.2: - resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} - engines: {node: ^14 || ^16 || >=18.0} + cssnano-utils@5.0.0: + resolution: {integrity: sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -2774,9 +2725,9 @@ packages: peerDependencies: postcss: ^8.2.15 - cssnano@6.1.0: - resolution: {integrity: sha512-e2v4w/t3OFM6HTuSweI4RSdABaqgVgHlJp5FZrQsopHnKKHLFIvK2D3C4kHWeFIycN/1L1J5VIrg5KlDzn3r/g==} - engines: {node: ^14 || ^16 || >=18.0} + cssnano@7.0.6: + resolution: {integrity: sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -2923,6 +2874,24 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -2975,6 +2944,10 @@ packages: resolution: {integrity: sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==} engines: {node: '>= 0.6.0'} + dependency-graph@1.0.0: + resolution: {integrity: sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==} + engines: {node: '>=4'} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2990,8 +2963,8 @@ packages: devalue@4.3.2: resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} - devalue@5.0.0: - resolution: {integrity: sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==} + devalue@5.1.1: + resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==} diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} @@ -3029,8 +3002,8 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} - dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + dotenv@16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} dotenv@8.6.0: @@ -3057,11 +3030,11 @@ packages: electron-to-chromium@1.4.563: resolution: {integrity: sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw==} - electron-to-chromium@1.4.693: - resolution: {integrity: sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw==} + electron-to-chromium@1.5.134: + resolution: {integrity: sha512-zSwzrLg3jNP3bwsLqWHmS5z2nIOQ5ngMnfMZOWWtXnqqQkPVyOipxK98w+1beLw1TB+EImPNcG8wVP/cLVs2Og==} - electron-to-chromium@1.4.815: - resolution: {integrity: sha512-OvpTT2ItpOXJL7IGcYakRjHCt8L5GrrN/wHCQsRB4PQa1X9fe+X9oen245mIId7s14xvArCGSTIq644yPUKKLg==} + electron-to-chromium@1.5.56: + resolution: {integrity: sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==} emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -3121,6 +3094,10 @@ packages: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.2: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} @@ -3144,9 +3121,6 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es6-promise@3.3.1: - resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==} - esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} engines: {node: '>=12'} @@ -3157,22 +3131,17 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} - engines: {node: '>=12'} - hasBin: true - - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} + engines: {node: '>=18'} hasBin: true escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} escape-string-regexp@1.0.5: @@ -3187,32 +3156,20 @@ packages: resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} engines: {node: '>=12'} - eslint-compat-utils@0.1.2: - resolution: {integrity: sha512-Jia4JDldWnFNIru1Ehx1H5s9/yxiRHY/TimCuUc0jNexew3cF1gI6CYZil1ociakfWO3rRqFjl1mskBblB3RYg==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - - eslint-config-prettier@10.0.1: - resolution: {integrity: sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==} + eslint-config-prettier@10.1.1: + resolution: {integrity: sha512-4EQQr6wXwS+ZJSzaR5ZCrYgLxqvUjdXctaEtBqHcbkW944B1NQyO4qpdHQbXBONfwxXdkAY81HH4+LUfrg+zPw==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-config-prettier@9.0.0: - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + eslint-config-prettier@10.1.2: + resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-config-turbo@2.4.0: - resolution: {integrity: sha512-AiRdy83iwyG4+iMSxXQGUbEClxkGxSlXYH8E2a+0972ao75OWnlDBiiuLMOzDpJubR+QVGC4zonn29AIFCSbFw==} + eslint-config-turbo@2.5.0: + resolution: {integrity: sha512-QJvZBEWDWQx1JyQCr0uwf4aQYhDSAGoHBdx+cPtpPzNEjZw16Ig8BglXxHZBh3I8/fI1U53cLgXwvb28BUZhPA==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -3228,34 +3185,24 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react@7.37.4: - resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==} + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} engines: {node: '>=4'} peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-svelte@2.35.0: - resolution: {integrity: sha512-3WDFxNrkXaMlpqoNo3M1ZOQuoFLMO9+bdnN6oVVXaydXC7nzCJuGy9a0zqoNDHMSRPYt0Rqo6hIdHMEaI5sQnw==} - engines: {node: ^14.17.0 || >=16.0.0} + eslint-plugin-svelte@3.5.1: + resolution: {integrity: sha512-Qn1slddZHfqYiDO6IN8/iN3YL+VuHlgYjm30FT+hh0Jf/TX0jeZMTJXQMajFm5f6f6hURi+XO8P+NPYD+T4jkg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 - svelte: ^3.37.0 || ^4.0.0 + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true - eslint-plugin-svelte@2.35.1: - resolution: {integrity: sha512-IF8TpLnROSGy98Z3NrsKXWDSCbNY2ReHDcrYTuXZMbfX7VmESISR78TWgO9zdg4Dht1X8coub5jKwHzP0ExRug==} - engines: {node: ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 - svelte: ^3.37.0 || ^4.0.0 - peerDependenciesMeta: - svelte: - optional: true - - eslint-plugin-turbo@2.4.0: - resolution: {integrity: sha512-qCgoRi/OTc1VMxab7+sdKiV1xlkY4qjK9sM+kS7+WogrB1DxLguJSQXvk4HA13SD5VmJsq+8FYOw5q4EUk6Ixg==} + eslint-plugin-turbo@2.5.0: + resolution: {integrity: sha512-qQk54MrUZv0gnpxV23sccTc+FL3UJ8q7vG7HmXuS2RP8gdjWDwI1CCJTJD8EdRIDjsMxF0xi0AKcMY0CwIlXVg==} peerDependencies: eslint: '>6.6.0' turbo: '>2.0.0' @@ -3264,6 +3211,10 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@8.3.0: + resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3277,18 +3228,22 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint@9.24.0: + resolution: {integrity: sha512-eh/jxIEJyZrvbWRe4XuVclLPDYSYYYgLy5zXGGxD6j8zjSAxFEzI2fL/8xNq6O2yKqVt+eF2YhV+hxjV6UKXwQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true - eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - esm-env@1.0.0: - resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -3303,6 +3258,9 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} + esrap@1.4.6: + resolution: {integrity: sha512-F/D2mADJ9SHY3IwksD4DAXjTt7qt7GWUf3/8RhCNWmC/67tyb55dpimHmy7EplakFaflV0R/PC+fdSPqrRHAQw==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3399,6 +3357,14 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3407,6 +3373,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -3426,6 +3396,10 @@ packages: resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} engines: {node: '>=12.0.0'} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} @@ -3441,6 +3415,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + forever-agent@0.6.1: resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} @@ -3519,8 +3497,8 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} - get-intrinsic@1.2.7: - resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} get-proto@1.0.1: @@ -3596,6 +3574,14 @@ packages: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.0.0: + resolution: {integrity: sha512-iInW14XItCXET01CQFqudPOWP2jYMl7T+QRQT+UNcR/iQncN/F0UNpgd76iFkBPgNQb4+X3LV9tLJYzwh+Gl3A==} + engines: {node: '>=18'} + globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} @@ -3604,9 +3590,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3615,9 +3598,6 @@ packages: resolution: {integrity: sha512-/1WM/LNHRAOH9lZta77uGbq0dAEQM+XjNesWwhlERDVenqothRbnzTrL3/LrIoEPPjeUHC3vrS6TwoyxeHs7MQ==} engines: {node: '>=18'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} @@ -3782,9 +3762,6 @@ packages: import-meta-resolve@3.1.1: resolution: {integrity: sha512-qeywsE/KC3w9Fd2ORrRDUw6nS/nLwZpXgfrOc2IILvZYnCaEMd+D56Vfg9k4G29gIeVi3XKql1RQatME8iYsiw==} - import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -3984,6 +3961,9 @@ packages: is-reference@3.0.2: resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} + is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4171,8 +4151,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.29.0: - resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==} + known-css-properties@0.35.0: + resolution: {integrity: sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==} lazy-ass@1.6.0: resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} @@ -4193,8 +4173,8 @@ packages: resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} engines: {node: '>=14'} - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} lines-and-columns@1.2.4: @@ -4280,14 +4260,13 @@ packages: magic-string@0.30.10: resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.5: resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} engines: {node: '>=12'} - magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} - map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -4489,10 +4468,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -4511,10 +4486,6 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -4542,6 +4513,11 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -4578,8 +4554,11 @@ packages: node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -4626,8 +4605,8 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} object.fromentries@2.0.8: @@ -4769,13 +4748,17 @@ packages: picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -4793,8 +4776,8 @@ packages: engines: {node: '>=16'} hasBin: true - playwright-core@1.45.0: - resolution: {integrity: sha512-lZmHlFQ0VYSpAs43dRq1/nJ9G/6SiTI7VPqidld9TDefL9tX87bTKExWZZUF5PeRyqtXqd8fQi2qmfIedkwsNQ==} + playwright-core@1.51.1: + resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} engines: {node: '>=18'} hasBin: true @@ -4803,8 +4786,8 @@ packages: engines: {node: '>=16'} hasBin: true - playwright@1.45.0: - resolution: {integrity: sha512-4z3ac3plDfYzGB6r0Q3LF8POPR20Z8D0aXcxbJvmfMgSSq1hkcgvFRXJk9rUq5H/MJ0Ktal869hhOdI/zUTeLA==} + playwright@1.51.1: + resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} engines: {node: '>=18'} hasBin: true @@ -4812,6 +4795,12 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + postcss-calc@10.0.2: + resolution: {integrity: sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==} + engines: {node: ^18.12 || ^20.9 || >=22.0} + peerDependencies: + postcss: ^8.4.38 + postcss-calc@9.0.1: resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} engines: {node: ^14 || ^16 || >=18.0} @@ -4825,15 +4814,22 @@ packages: peerDependencies: postcss: ^8.0.0 + postcss-cli@11.0.1: + resolution: {integrity: sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + postcss: ^8.0.0 + postcss-colormin@6.0.0: resolution: {integrity: sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.2.15 - postcss-colormin@6.1.0: - resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-colormin@7.0.2: + resolution: {integrity: sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4849,9 +4845,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-convert-values@6.1.0: - resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-convert-values@7.0.4: + resolution: {integrity: sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4861,9 +4857,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-discard-comments@6.0.2: - resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-discard-comments@7.0.3: + resolution: {integrity: sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4873,9 +4869,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-discard-duplicates@6.0.3: - resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-discard-duplicates@7.0.1: + resolution: {integrity: sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4885,9 +4881,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-discard-empty@6.0.3: - resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-discard-empty@7.0.0: + resolution: {integrity: sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4897,9 +4893,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-discard-overridden@6.0.2: - resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-discard-overridden@7.0.0: + resolution: {integrity: sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4909,8 +4905,8 @@ packages: peerDependencies: postcss: ^8.0.0 - postcss-import@16.0.1: - resolution: {integrity: sha512-i2Pci0310NaLHr/5JUFSw1j/8hf1CzwMY13g6ZDxgOavmRHQi2ba3PmUHoihO+sjaum+KmCNzskNsw7JDrg03g==} + postcss-import@16.1.0: + resolution: {integrity: sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==} engines: {node: '>=18.0.0'} peerDependencies: postcss: ^8.0.0 @@ -4945,9 +4941,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-merge-longhand@6.0.4: - resolution: {integrity: sha512-vAfWGcxUUGlFiPM3nDMZA+/Yo9sbpc3JNkcYZez8FfJDv41Dh7tAgA3QGVTocaHCZZL6aXPXPOaBMJsjujodsA==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-merge-longhand@7.0.4: + resolution: {integrity: sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4957,9 +4953,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-merge-rules@6.1.0: - resolution: {integrity: sha512-lER+W3Gr6XOvxOYk1Vi/6UsAgKMg6MDBthmvbNqi2XxAk/r9XfhdYZSigfWjuWWn3zYw2wLelvtM8XuAEFqRkA==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-merge-rules@7.0.4: + resolution: {integrity: sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4969,9 +4965,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-minify-font-values@6.0.3: - resolution: {integrity: sha512-SmAeTA1We5rMnN3F8X9YBNo9bj9xB4KyDHnaNJnBfQIPi+60fNiR9OTRnIaMqkYzAQX0vObIw4Pn0vuKEOettg==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-minify-font-values@7.0.0: + resolution: {integrity: sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4981,9 +4977,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-minify-gradients@6.0.3: - resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-minify-gradients@7.0.0: + resolution: {integrity: sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -4993,9 +4989,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-minify-params@6.1.0: - resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-minify-params@7.0.2: + resolution: {integrity: sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5005,9 +5001,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-minify-selectors@6.0.3: - resolution: {integrity: sha512-IcV7ZQJcaXyhx4UBpWZMsinGs2NmiUC60rJSkyvjPCPqhNjVGsrJUM+QhAtCaikZ0w0/AbZuH4wVvF/YMuMhvA==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-minify-selectors@7.0.4: + resolution: {integrity: sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5017,9 +5013,9 @@ packages: peerDependencies: postcss: ^8.2.14 - postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} + postcss-nested@7.0.2: + resolution: {integrity: sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==} + engines: {node: '>=18.0'} peerDependencies: postcss: ^8.2.14 @@ -5029,9 +5025,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-charset@6.0.2: - resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-charset@7.0.0: + resolution: {integrity: sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5041,9 +5037,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-display-values@6.0.2: - resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-display-values@7.0.0: + resolution: {integrity: sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5053,9 +5049,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-positions@6.0.2: - resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-positions@7.0.0: + resolution: {integrity: sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5065,9 +5061,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-repeat-style@6.0.2: - resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-repeat-style@7.0.0: + resolution: {integrity: sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5077,9 +5073,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-string@6.0.2: - resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-string@7.0.0: + resolution: {integrity: sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5089,9 +5085,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-timing-functions@6.0.2: - resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-timing-functions@7.0.0: + resolution: {integrity: sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5101,9 +5097,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-unicode@6.1.0: - resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-unicode@7.0.2: + resolution: {integrity: sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5113,9 +5109,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-url@6.0.2: - resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-url@7.0.0: + resolution: {integrity: sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5125,9 +5121,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-normalize-whitespace@6.0.2: - resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-normalize-whitespace@7.0.0: + resolution: {integrity: sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5137,9 +5133,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-ordered-values@6.0.2: - resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-ordered-values@7.0.1: + resolution: {integrity: sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5149,9 +5145,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-reduce-initial@6.1.0: - resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-reduce-initial@7.0.2: + resolution: {integrity: sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5161,9 +5157,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-reduce-transforms@6.0.2: - resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-reduce-transforms@7.0.0: + resolution: {integrity: sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5179,11 +5175,11 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-safe-parser@6.0.0: - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} peerDependencies: - postcss: ^8.3.3 + postcss: ^8.4.31 postcss-scss@4.0.9: resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} @@ -5195,8 +5191,12 @@ packages: resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} engines: {node: '>=4'} - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-selector-parser@7.0.0: + resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} engines: {node: '>=4'} postcss-svgo@6.0.0: @@ -5205,9 +5205,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-svgo@6.0.3: - resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} - engines: {node: ^14 || ^16 || >= 18} + postcss-svgo@7.0.1: + resolution: {integrity: sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==} + engines: {node: ^18.12.0 || ^20.9.0 || >= 18} peerDependencies: postcss: ^8.4.31 @@ -5217,9 +5217,9 @@ packages: peerDependencies: postcss: ^8.2.15 - postcss-unique-selectors@6.0.3: - resolution: {integrity: sha512-NFXbYr8qdmCr/AFceaEfdcsKGCvWTeGO6QVC9h2GvtWgj0/0dklKQcaMMVzs6tr8bY+ase8hOtHW8OBTTRvS8A==} - engines: {node: ^14 || ^16 || >=18.0} + postcss-unique-selectors@7.0.3: + resolution: {integrity: sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5234,12 +5234,8 @@ packages: resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} engines: {node: ^10 || ^12 || >=14} - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.1: @@ -5259,14 +5255,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier-plugin-svelte@3.0.3: - resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==} - peerDependencies: - prettier: ^3.0.0 - svelte: ^3.2.0 || ^4.0.0-next.0 - - prettier-plugin-svelte@3.2.2: - resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} + prettier-plugin-svelte@3.3.3: + resolution: {integrity: sha512-yViK9zqQ+H2qZD1w/bH7W8i+bVfKrD8GIFjkFe4Thl6kCT9SlAsXVNmt3jCvQOCsnOhcvYgsoVlRV/Eu6x5nNw==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 @@ -5276,13 +5266,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.0.3: - resolution: {integrity: sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==} - engines: {node: '>=14'} - hasBin: true - - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.5.3: + resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} hasBin: true @@ -5444,6 +5429,10 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -5559,11 +5548,6 @@ packages: rfdc@1.3.1: resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -5584,6 +5568,11 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rollup@4.39.0: + resolution: {integrity: sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -5627,9 +5616,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sander@0.5.1: - resolution: {integrity: sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==} - sax@1.3.0: resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} @@ -5661,6 +5647,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -5759,9 +5750,9 @@ packages: simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + sirv@3.0.0: + resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + engines: {node: '>=18'} sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5790,16 +5781,12 @@ packages: smob@1.5.0: resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} - sorcery@0.11.0: - resolution: {integrity: sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==} - hasBin: true - source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} source-map-support@0.5.21: @@ -5962,9 +5949,9 @@ packages: peerDependencies: postcss: ^8.2.15 - stylehacks@6.1.0: - resolution: {integrity: sha512-ETErsPFgwlfYZ/CSjMO2Ddf+TsnkCVPBPaoB99Ro8WMAxf7cglzmFsRBhRmKObFjibtcvlNxFFPHuyr3sNlNUQ==} - engines: {node: ^14 || ^16 || >=18.0} + stylehacks@7.0.4: + resolution: {integrity: sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==} + engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} peerDependencies: postcss: ^8.4.31 @@ -5984,23 +5971,19 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@3.6.6: - resolution: {integrity: sha512-b9q9rOHOMYF3U8XllK7LmXTq1LeWQ98waGfEJzrFutViadkNl1tgdEtxIQ8yuPx+VQ4l7YrknYol+0lfZocaZw==} + svelte-check@4.1.6: + resolution: {integrity: sha512-P7w/6tdSfk3zEVvfsgrp3h3DFC75jCdZjTQvgGJtjPORs1n7/v2VMPIoty3PWv7jnfEm3x0G/p9wH4pecTb0Wg==} + engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: - svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + typescript: '>=5.0.0' - svelte-check@3.6.7: - resolution: {integrity: sha512-tKEjemK9FYCySAseCaIt+ps5o0XRvLC7ECjyJXXtO7vOQhR9E6JavgoUbGP1PCulD2OTcB/fi9RjV3nyF1AROw==} - hasBin: true + svelte-eslint-parser@1.1.2: + resolution: {integrity: sha512-vqFBRamDKo1l70KMfxxXj1/0Cco5TfMDnqaAjgz6D8PyoMhfMcDOLRkAwPg8WkMyZjMtQL3wW66TZ0x59iqO2w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - - svelte-eslint-parser@0.33.1: - resolution: {integrity: sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - svelte: ^3.37.0 || ^4.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true @@ -6011,27 +5994,21 @@ packages: peerDependencies: svelte: ^3.19.0 || ^4.0.0 - svelte-hmr@0.16.0: - resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: ^3.19.0 || ^4.0.0 - - svelte-preprocess@5.1.3: - resolution: {integrity: sha512-xxAkmxGHT+J/GourS5mVJeOXZzne1FR5ljeOUAMXUkfEhkLEllRreXpbl3dIYJlcJRfL1LO1uIAPpBpBfiqGPw==} - engines: {node: '>= 16.0.0', pnpm: ^8.0.0} + svelte-preprocess@6.0.3: + resolution: {integrity: sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==} + engines: {node: '>= 18.0.0'} peerDependencies: '@babel/core': ^7.10.2 coffeescript: ^2.5.1 less: ^3.11.3 || ^4.0.0 postcss: ^7 || ^8 - postcss-load-config: ^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + postcss-load-config: '>=3' pug: ^3.0.0 sass: ^1.26.8 - stylus: ^0.55.0 + stylus: '>=0.55' sugarss: ^2.0.0 || ^3.0.0 || ^4.0.0 - svelte: ^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 - typescript: '>=3.9.5 || ^4.0.0 || ^5.0.0' + svelte: ^4.0.0 || ^5.0.0-next.100 || ^5.0.0 + typescript: ^5.0.0 peerDependenciesMeta: '@babel/core': optional: true @@ -6060,8 +6037,8 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 typescript: ^4.9.4 || ^5.0.0 - svelte2tsx@0.7.3: - resolution: {integrity: sha512-yrjJFvqp32Ag4Oke+T1xXZLqMNrS0gjzAM//+L6+7OhXWMDuMs0fkyb9ymixK9keVOLJ1GbeEVfg59c3E2IN+w==} + svelte2tsx@0.7.34: + resolution: {integrity: sha512-WTMhpNhFf8/h3SMtR5dkdSy2qfveomkhYei/QW9gSPccb0/b82tjHvLop6vT303ZkGswU/da1s6XvrLgthQPCw==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 @@ -6070,17 +6047,17 @@ packages: resolution: {integrity: sha512-LpLqY2Jr7cRxkrTc796/AaaoMLF/1ax7cto8Ot76wrvKQhrPmZ0JgajiWPmg9mTSDqO16SSLiD17r9MsvAPTmw==} engines: {node: '>=16'} - svelte@4.2.12: - resolution: {integrity: sha512-d8+wsh5TfPwqVzbm4/HCXC783/KPHV60NvwitJnyTA5lWn1elhXMNWhXGCJ7PwPa8qFUnyJNIyuIRt2mT0WMug==} - engines: {node: '>=16'} + svelte@5.27.0: + resolution: {integrity: sha512-Uai13Ydt1ZE+bUHme6b9U38PCYVNCqBRoBMkUKbFbKiD7kHWjdUUrklYAQZJxyKK81qII4mrBwe/YmvEMSlC9w==} + engines: {node: '>=18'} svgo@3.0.2: resolution: {integrity: sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==} engines: {node: '>=14.0.0'} hasBin: true - svgo@3.2.0: - resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} + svgo@3.3.2: + resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} engines: {node: '>=14.0.0'} hasBin: true @@ -6118,8 +6095,9 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} @@ -6162,14 +6140,8 @@ packages: trough@2.1.0: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - ts-api-utils@1.0.3: - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' @@ -6177,8 +6149,8 @@ packages: tsconfig-resolver@3.0.1: resolution: {integrity: sha512-ZHqlstlQF449v8glscGRXzL6l2dZvASPCdXJRWG4gHEZlUVx2Jtmr+a2zeVG4LCsKhDXKRj5R3h0C/98UcVAQg==} - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} tty-table@4.2.2: resolution: {integrity: sha512-2gvCArMZLxgvpZ2NvQKdnYWIFLe7I/z5JClMuhrDXunmKgSZcQKcZRjN9XjAFiToMz2pUo1dEIXyrm0AwgV5Tw==} @@ -6300,11 +6272,28 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typescript-eslint@8.30.1: + resolution: {integrity: sha512-D7lC0kcehVH7Mb26MRQi64LMyRJsj3dToJxM1+JVTl53DQSV5/7oUGWQLcKl1C1KnoVHxMMU2FNQMffr7F3Row==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} hasBin: true + typescript@5.7.3: + resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.8.3: + resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} + engines: {node: '>=14.17'} + hasBin: true + ultrahtml@1.5.2: resolution: {integrity: sha512-qh4mBffhlkiXwDAOxvSGxhL0QEQsTbnP9BozOK3OYPEGvPvdWzvAUaXNtUSMdNsKDtuyjEbyVUPFZ52SSLhLqw==} @@ -6387,8 +6376,8 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -6488,54 +6477,34 @@ packages: terser: optional: true - vite@5.2.12: - resolution: {integrity: sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.3.0: + resolution: {integrity: sha512-9aC0n4pr6hIbvi1YOpFjwQ+QOTGssvbJKoeYkuHHGWwlXfdxQlI8L2qNMo9awEEcCPSiS+5mJZk5jH1PAqoDeQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' + sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: optional: true sass: optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - vite@5.3.2: - resolution: {integrity: sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: + sass-embedded: optional: true stylus: optional: true @@ -6543,6 +6512,10 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true vitefu@0.2.5: resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} @@ -6552,6 +6525,14 @@ packages: vite: optional: true + vitefu@1.0.4: + resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} @@ -6613,8 +6594,8 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} - which-typed-array@1.1.18: - resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + which-typed-array@1.1.19: + resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} engines: {node: '>= 0.4'} which@1.3.1: @@ -6696,6 +6677,9 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zimmerframe@1.1.2: + resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} + zod@3.21.1: resolution: {integrity: sha512-+dTu2m6gmCbO9Ahm4ZBDapx2O6ZY9QSPXst2WXjcznPMwf2YNpn3RevLx4KkZp1OPW/ouFcoBtBzFz/LeY69oA==} @@ -6786,12 +6770,12 @@ snapshots: - supports-color - vite - '@astrojs/svelte@4.0.2(astro@3.2.2(@types/node@20.14.6)(terser@5.31.0))(svelte@4.2.1)(typescript@5.4.5)(vite@4.5.3(@types/node@20.14.6)(terser@5.31.0))': + '@astrojs/svelte@4.0.2(astro@3.2.2(@types/node@20.14.6)(terser@5.31.0))(svelte@4.2.1)(typescript@5.8.3)(vite@4.5.3(@types/node@20.14.6)(terser@5.31.0))': dependencies: '@sveltejs/vite-plugin-svelte': 2.5.3(svelte@4.2.1)(vite@4.5.3(@types/node@20.14.6)(terser@5.31.0)) astro: 3.2.2(@types/node@20.14.6)(terser@5.31.0) svelte: 4.2.1 - svelte2tsx: 0.6.23(svelte@4.2.1)(typescript@5.4.5) + svelte2tsx: 0.6.23(svelte@4.2.1)(typescript@5.8.3) transitivePeerDependencies: - supports-color - typescript @@ -6823,7 +6807,7 @@ snapshots: '@babel/code-frame@7.24.7': dependencies: '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + picocolors: 1.1.1 '@babel/compat-data@7.23.2': {} @@ -6862,7 +6846,7 @@ snapshots: '@babel/traverse': 7.24.7 '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.4.0 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -6899,7 +6883,7 @@ snapshots: dependencies: '@babel/compat-data': 7.24.7 '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 + browserslist: 4.24.4 lru-cache: 5.1.1 semver: 6.3.1 @@ -7025,7 +7009,7 @@ snapshots: '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.1 + picocolors: 1.1.1 '@babel/parser@7.23.0': dependencies: @@ -7114,7 +7098,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.7 '@babel/parser': 7.24.7 '@babel/types': 7.24.7 - debug: 4.3.5 + debug: 4.4.0 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7343,16 +7327,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@dagrejs/dagre@1.0.4': + '@dagrejs/dagre@1.1.4': dependencies: - '@dagrejs/graphlib': 2.1.13 + '@dagrejs/graphlib': 2.2.4 - '@dagrejs/graphlib@2.1.13': {} + '@dagrejs/graphlib@2.2.4': {} - '@esbuild/aix-ppc64@0.20.2': - optional: true - - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.25.2': optional: true '@esbuild/android-arm64@0.18.20': @@ -7361,10 +7342,7 @@ snapshots: '@esbuild/android-arm64@0.19.5': optional: true - '@esbuild/android-arm64@0.20.2': - optional: true - - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.25.2': optional: true '@esbuild/android-arm@0.18.20': @@ -7373,10 +7351,7 @@ snapshots: '@esbuild/android-arm@0.19.5': optional: true - '@esbuild/android-arm@0.20.2': - optional: true - - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.25.2': optional: true '@esbuild/android-x64@0.18.20': @@ -7385,10 +7360,7 @@ snapshots: '@esbuild/android-x64@0.19.5': optional: true - '@esbuild/android-x64@0.20.2': - optional: true - - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.25.2': optional: true '@esbuild/darwin-arm64@0.18.20': @@ -7397,10 +7369,7 @@ snapshots: '@esbuild/darwin-arm64@0.19.5': optional: true - '@esbuild/darwin-arm64@0.20.2': - optional: true - - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.25.2': optional: true '@esbuild/darwin-x64@0.18.20': @@ -7409,10 +7378,7 @@ snapshots: '@esbuild/darwin-x64@0.19.5': optional: true - '@esbuild/darwin-x64@0.20.2': - optional: true - - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.25.2': optional: true '@esbuild/freebsd-arm64@0.18.20': @@ -7421,10 +7387,7 @@ snapshots: '@esbuild/freebsd-arm64@0.19.5': optional: true - '@esbuild/freebsd-arm64@0.20.2': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.25.2': optional: true '@esbuild/freebsd-x64@0.18.20': @@ -7433,10 +7396,7 @@ snapshots: '@esbuild/freebsd-x64@0.19.5': optional: true - '@esbuild/freebsd-x64@0.20.2': - optional: true - - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.25.2': optional: true '@esbuild/linux-arm64@0.18.20': @@ -7445,10 +7405,7 @@ snapshots: '@esbuild/linux-arm64@0.19.5': optional: true - '@esbuild/linux-arm64@0.20.2': - optional: true - - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.25.2': optional: true '@esbuild/linux-arm@0.18.20': @@ -7457,10 +7414,7 @@ snapshots: '@esbuild/linux-arm@0.19.5': optional: true - '@esbuild/linux-arm@0.20.2': - optional: true - - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.25.2': optional: true '@esbuild/linux-ia32@0.18.20': @@ -7469,10 +7423,7 @@ snapshots: '@esbuild/linux-ia32@0.19.5': optional: true - '@esbuild/linux-ia32@0.20.2': - optional: true - - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.25.2': optional: true '@esbuild/linux-loong64@0.18.20': @@ -7481,10 +7432,7 @@ snapshots: '@esbuild/linux-loong64@0.19.5': optional: true - '@esbuild/linux-loong64@0.20.2': - optional: true - - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.25.2': optional: true '@esbuild/linux-mips64el@0.18.20': @@ -7493,10 +7441,7 @@ snapshots: '@esbuild/linux-mips64el@0.19.5': optional: true - '@esbuild/linux-mips64el@0.20.2': - optional: true - - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.25.2': optional: true '@esbuild/linux-ppc64@0.18.20': @@ -7505,10 +7450,7 @@ snapshots: '@esbuild/linux-ppc64@0.19.5': optional: true - '@esbuild/linux-ppc64@0.20.2': - optional: true - - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.25.2': optional: true '@esbuild/linux-riscv64@0.18.20': @@ -7517,10 +7459,7 @@ snapshots: '@esbuild/linux-riscv64@0.19.5': optional: true - '@esbuild/linux-riscv64@0.20.2': - optional: true - - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.25.2': optional: true '@esbuild/linux-s390x@0.18.20': @@ -7529,10 +7468,7 @@ snapshots: '@esbuild/linux-s390x@0.19.5': optional: true - '@esbuild/linux-s390x@0.20.2': - optional: true - - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.25.2': optional: true '@esbuild/linux-x64@0.18.20': @@ -7541,10 +7477,10 @@ snapshots: '@esbuild/linux-x64@0.19.5': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-x64@0.25.2': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/netbsd-arm64@0.25.2': optional: true '@esbuild/netbsd-x64@0.18.20': @@ -7553,10 +7489,10 @@ snapshots: '@esbuild/netbsd-x64@0.19.5': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/netbsd-x64@0.25.2': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/openbsd-arm64@0.25.2': optional: true '@esbuild/openbsd-x64@0.18.20': @@ -7565,10 +7501,7 @@ snapshots: '@esbuild/openbsd-x64@0.19.5': optional: true - '@esbuild/openbsd-x64@0.20.2': - optional: true - - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.25.2': optional: true '@esbuild/sunos-x64@0.18.20': @@ -7577,10 +7510,7 @@ snapshots: '@esbuild/sunos-x64@0.19.5': optional: true - '@esbuild/sunos-x64@0.20.2': - optional: true - - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.25.2': optional: true '@esbuild/win32-arm64@0.18.20': @@ -7589,10 +7519,7 @@ snapshots: '@esbuild/win32-arm64@0.19.5': optional: true - '@esbuild/win32-arm64@0.20.2': - optional: true - - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.25.2': optional: true '@esbuild/win32-ia32@0.18.20': @@ -7601,10 +7528,7 @@ snapshots: '@esbuild/win32-ia32@0.19.5': optional: true - '@esbuild/win32-ia32@0.20.2': - optional: true - - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.25.2': optional: true '@esbuild/win32-x64@0.18.20': @@ -7613,10 +7537,7 @@ snapshots: '@esbuild/win32-x64@0.19.5': optional: true - '@esbuild/win32-x64@0.20.2': - optional: true - - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.25.2': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.43.0)': @@ -7624,20 +7545,40 @@ snapshots: eslint: 8.43.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.0(eslint@8.53.0)': + '@eslint-community/eslint-utils@4.4.0(eslint@9.24.0)': dependencies: - eslint: 8.53.0 + eslint: 9.24.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.24.0)': dependencies: - eslint: 8.57.0 + eslint: 9.24.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.9.1': {} + '@eslint/config-array@0.20.0': + dependencies: + '@eslint/object-schema': 2.1.6 + debug: 4.4.0 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@eslint/config-helpers@0.2.1': {} + + '@eslint/core@0.12.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.13.0': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.2': dependencies: ajv: 6.12.6 @@ -7652,27 +7593,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/eslintrc@2.1.3': + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 + debug: 4.4.0 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -7682,9 +7609,14 @@ snapshots: '@eslint/js@8.43.0': {} - '@eslint/js@8.53.0': {} + '@eslint/js@9.24.0': {} - '@eslint/js@8.57.0': {} + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.2.8': + dependencies: + '@eslint/core': 0.13.0 + levn: 0.4.1 '@fastify/busboy@2.0.0': {} @@ -7694,6 +7626,13 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + '@humanwhocodes/config-array@0.11.13': dependencies: '@humanwhocodes/object-schema': 2.0.1 @@ -7702,30 +7641,24 @@ snapshots: transitivePeerDependencies: - supports-color - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4(supports-color@8.1.1) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/object-schema@2.0.1': {} - '@humanwhocodes/object-schema@2.0.2': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.2': {} '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.20 '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/resolve-uri@3.1.1': {} @@ -7743,6 +7676,8 @@ snapshots: '@jridgewell/sourcemap-codec@1.4.15': {} + '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/trace-mapping@0.3.20': dependencies: '@jridgewell/resolve-uri': 3.1.1 @@ -7781,42 +7716,50 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - '@playwright/experimental-ct-core@1.45.0(@types/node@20.14.6)(terser@5.31.0)': + '@playwright/experimental-ct-core@1.51.1(@types/node@20.14.6)(terser@5.31.0)': dependencies: - playwright: 1.45.0 - playwright-core: 1.45.0 - vite: 5.3.2(@types/node@20.14.6)(terser@5.31.0) + playwright: 1.51.1 + playwright-core: 1.51.1 + vite: 6.3.0(@types/node@20.14.6)(terser@5.31.0) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass + - sass-embedded - stylus - sugarss - terser + - tsx + - yaml - '@playwright/experimental-ct-react@1.45.0(@types/node@20.14.6)(terser@5.31.0)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0))': + '@playwright/experimental-ct-react@1.51.1(@types/node@20.14.6)(terser@5.31.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))': dependencies: - '@playwright/experimental-ct-core': 1.45.0(@types/node@20.14.6)(terser@5.31.0) - '@vitejs/plugin-react': 4.3.1(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) + '@playwright/experimental-ct-core': 1.51.1(@types/node@20.14.6)(terser@5.31.0) + '@vitejs/plugin-react': 4.3.1(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color - terser + - tsx - vite + - yaml '@playwright/test@1.44.1': dependencies: playwright: 1.44.1 - '@playwright/test@1.45.0': + '@playwright/test@1.51.1': dependencies: - playwright: 1.45.0 + playwright: 1.51.1 '@polka/url@1.0.0-next.24': {} @@ -7869,14 +7812,14 @@ snapshots: optionalDependencies: rollup: 4.18.0 - '@rollup/plugin-typescript@11.1.6(rollup@4.18.0)(tslib@2.6.2)(typescript@5.4.5)': + '@rollup/plugin-typescript@11.1.6(rollup@4.18.0)(tslib@2.8.1)(typescript@5.7.3)': dependencies: '@rollup/pluginutils': 5.1.0(rollup@4.18.0) resolve: 1.22.8 - typescript: 5.4.5 + typescript: 5.7.3 optionalDependencies: rollup: 4.18.0 - tslib: 2.6.2 + tslib: 2.8.1 '@rollup/pluginutils@5.1.0(rollup@4.18.0)': dependencies: @@ -7889,51 +7832,111 @@ snapshots: '@rollup/rollup-android-arm-eabi@4.18.0': optional: true + '@rollup/rollup-android-arm-eabi@4.39.0': + optional: true + '@rollup/rollup-android-arm64@4.18.0': optional: true + '@rollup/rollup-android-arm64@4.39.0': + optional: true + '@rollup/rollup-darwin-arm64@4.18.0': optional: true + '@rollup/rollup-darwin-arm64@4.39.0': + optional: true + '@rollup/rollup-darwin-x64@4.18.0': optional: true + '@rollup/rollup-darwin-x64@4.39.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.39.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.39.0': + optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true + '@rollup/rollup-linux-arm-gnueabihf@4.39.0': + optional: true + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true + '@rollup/rollup-linux-arm-musleabihf@4.39.0': + optional: true + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true + '@rollup/rollup-linux-arm64-gnu@4.39.0': + optional: true + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true + '@rollup/rollup-linux-arm64-musl@4.39.0': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.39.0': + optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true + '@rollup/rollup-linux-powerpc64le-gnu@4.39.0': + optional: true + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true + '@rollup/rollup-linux-riscv64-gnu@4.39.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.39.0': + optional: true + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true + '@rollup/rollup-linux-s390x-gnu@4.39.0': + optional: true + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true + '@rollup/rollup-linux-x64-gnu@4.39.0': + optional: true + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true + '@rollup/rollup-linux-x64-musl@4.39.0': + optional: true + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true + '@rollup/rollup-win32-arm64-msvc@4.39.0': + optional: true + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true + '@rollup/rollup-win32-ia32-msvc@4.39.0': + optional: true + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true + '@rollup/rollup-win32-x64-msvc@4.39.0': + optional: true + '@sideway/address@4.1.4': dependencies: '@hapi/hoek': 9.3.0 @@ -7944,64 +7947,44 @@ snapshots: '@sindresorhus/merge-streams@1.0.0': {} - '@svelte-put/shortcut@3.1.1(svelte@4.2.12)': + '@svelte-put/shortcut@4.1.0(svelte@5.27.0)': dependencies: - svelte: 4.2.12 + svelte: 5.27.0 - '@sveltejs/adapter-auto@3.1.1(@sveltejs/kit@2.5.4(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.0)': dependencies: - '@sveltejs/kit': 2.5.4(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) - import-meta-resolve: 4.0.0 + acorn: 8.14.0 - '@sveltejs/adapter-auto@3.2.1(@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))': + '@sveltejs/adapter-auto@6.0.0(@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))': dependencies: - '@sveltejs/kit': 2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) + '@sveltejs/kit': 2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.5.10(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0))': + '@sveltejs/kit@2.20.7(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 - devalue: 5.0.0 - esm-env: 1.0.0 + devalue: 5.1.1 + esm-env: 1.2.2 import-meta-resolve: 4.1.0 kleur: 4.1.5 - magic-string: 0.30.10 + magic-string: 0.30.17 mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.6.0 - sirv: 2.0.4 - svelte: 4.2.12 - tiny-glob: 0.2.9 - vite: 5.2.12(@types/node@20.14.6)(terser@5.31.0) + sirv: 3.0.0 + svelte: 5.27.0 + vite: 6.3.0(@types/node@20.14.6)(terser@5.31.0) - '@sveltejs/kit@2.5.4(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0))': + '@sveltejs/package@2.3.11(svelte@5.27.0)(typescript@5.8.3)': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) - '@types/cookie': 0.6.0 - cookie: 0.6.0 - devalue: 4.3.2 - esm-env: 1.0.0 - import-meta-resolve: 4.0.0 - kleur: 4.1.5 - magic-string: 0.30.8 - mrmime: 2.0.0 - sade: 1.8.1 - set-cookie-parser: 2.6.0 - sirv: 2.0.4 - svelte: 4.2.12 - tiny-glob: 0.2.9 - vite: 5.3.2(@types/node@20.14.6)(terser@5.31.0) - - '@sveltejs/package@2.3.0(svelte@4.2.12)(typescript@5.4.5)': - dependencies: - chokidar: 3.6.0 + chokidar: 4.0.3 kleur: 4.1.5 sade: 1.8.1 - semver: 7.6.0 - svelte: 4.2.12 - svelte2tsx: 0.7.3(svelte@4.2.12)(typescript@5.4.5) + semver: 7.6.3 + svelte: 5.27.0 + svelte2tsx: 0.7.34(svelte@5.27.0)(typescript@5.8.3) transitivePeerDependencies: - typescript @@ -8014,21 +7997,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) - debug: 4.3.5 - svelte: 4.2.12 - vite: 5.2.12(@types/node@20.14.6)(terser@5.31.0) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0))': - dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) - debug: 4.3.5 - svelte: 4.2.12 - vite: 5.3.2(@types/node@20.14.6)(terser@5.31.0) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) + debug: 4.4.0 + svelte: 5.27.0 + vite: 6.3.0(@types/node@20.14.6)(terser@5.31.0) transitivePeerDependencies: - supports-color @@ -8046,31 +8020,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) - debug: 4.3.5 + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)))(svelte@5.27.0)(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) + debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.10 - svelte: 4.2.12 - svelte-hmr: 0.16.0(svelte@4.2.12) - vite: 5.2.12(@types/node@20.14.6)(terser@5.31.0) - vitefu: 0.2.5(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.1(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)))(svelte@4.2.12)(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) - debug: 4.3.5 - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.10 - svelte: 4.2.12 - svelte-hmr: 0.16.0(svelte@4.2.12) - vite: 5.3.2(@types/node@20.14.6)(terser@5.31.0) - vitefu: 0.2.5(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)) + magic-string: 0.30.17 + svelte: 5.27.0 + vite: 6.3.0(@types/node@20.14.6)(terser@5.31.0) + vitefu: 1.0.4(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)) transitivePeerDependencies: - supports-color @@ -8204,6 +8163,10 @@ snapshots: '@types/estree@1.0.5': {} + '@types/estree@1.0.6': {} + + '@types/estree@1.0.7': {} + '@types/hast@2.3.7': dependencies: '@types/unist': 2.0.9 @@ -8248,8 +8211,6 @@ snapshots: '@types/prop-types@15.7.9': {} - '@types/pug@2.0.10': {} - '@types/react-dom@18.2.14': dependencies: '@types/react': 18.2.36 @@ -8287,8 +8248,6 @@ snapshots: '@types/semver@6.2.5': {} - '@types/semver@7.5.6': {} - '@types/sinonjs__fake-timers@8.1.1': {} '@types/sizzle@2.3.8': {} @@ -8304,255 +8263,159 @@ snapshots: '@types/node': 18.7.16 optional: true - '@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.4.5))(eslint@8.53.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.29.1(@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.4.5) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 8.23.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/type-utils': 8.23.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 8.23.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 8.23.0 - eslint: 8.57.0 + '@typescript-eslint/parser': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/type-utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.29.1 + eslint: 9.24.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - optionalDependencies: - typescript: 5.4.5 + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/type-utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 + eslint: 9.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@8.29.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.4.5 + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.29.1 + debug: 4.4.0 + eslint: 9.24.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.23.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 8.23.0 - debug: 4.3.5 - eslint: 8.57.0 - typescript: 5.4.5 + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0 + eslint: 9.24.0 + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.10.0': + '@typescript-eslint/scope-manager@8.29.1': dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 - '@typescript-eslint/scope-manager@7.2.0': + '@typescript-eslint/scope-manager@8.30.1': dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 - '@typescript-eslint/scope-manager@8.23.0': + '@typescript-eslint/type-utils@8.29.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 - - '@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.24.0)(typescript@5.8.3) + debug: 4.4.0 + eslint: 9.24.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - ts-api-utils: 1.0.3(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + debug: 4.4.0 + eslint: 9.24.0 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.23.0(eslint@8.57.0)(typescript@5.4.5)': + '@typescript-eslint/types@8.29.1': {} + + '@typescript-eslint/types@8.30.1': {} + + '@typescript-eslint/typescript-estree@8.29.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.4.5) - '@typescript-eslint/utils': 8.23.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.5 - eslint: 8.57.0 - ts-api-utils: 2.0.1(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@6.10.0': {} - - '@typescript-eslint/types@7.2.0': {} - - '@typescript-eslint/types@8.23.0': {} - - '@typescript-eslint/typescript-estree@6.10.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/visitor-keys': 6.10.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.4(supports-color@8.1.1) - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.23.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 - debug: 4.3.5 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 + debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.0 - ts-api-utils: 2.0.1(typescript@5.4.5) - typescript: 5.4.5 + semver: 7.6.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.4.5) - eslint: 8.53.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) - eslint: 8.57.0 - semver: 7.6.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/utils@8.23.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.4.5) - eslint: 8.57.0 - typescript: 5.4.5 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@6.10.0': + '@typescript-eslint/utils@8.29.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 6.10.0 - eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.24.0) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) + eslint: 9.24.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/visitor-keys@7.2.0': + '@typescript-eslint/utils@8.30.1(eslint@9.24.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 7.2.0 - eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.8.3) + eslint: 9.24.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/visitor-keys@8.23.0': + '@typescript-eslint/visitor-keys@8.29.1': dependencies: - '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/types': 8.29.1 eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.0': {} + '@typescript-eslint/visitor-keys@8.30.1': + dependencies: + '@typescript-eslint/types': 8.30.1 + eslint-visitor-keys: 4.2.0 '@vitejs/plugin-react-swc@3.4.1(vite@4.5.0(@types/node@20.14.6)(terser@5.31.0))': dependencies: @@ -8583,14 +8446,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-react@4.3.1(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0))': + '@vitejs/plugin-react@4.3.1(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0))': dependencies: '@babel/core': 7.24.7 '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 react-refresh: 0.14.2 - vite: 5.3.2(@types/node@20.14.6)(terser@5.31.0) + vite: 6.3.0(@types/node@20.14.6)(terser@5.31.0) transitivePeerDependencies: - supports-color @@ -8598,11 +8461,15 @@ snapshots: dependencies: acorn: 8.10.0 + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn@8.10.0: {} acorn@8.11.2: {} - acorn@8.11.3: {} + acorn@8.14.0: {} aggregate-error@3.1.0: dependencies: @@ -8661,6 +8528,8 @@ snapshots: dependencies: dequal: 2.0.3 + aria-query@5.3.2: {} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.7 @@ -8673,7 +8542,7 @@ snapshots: array-buffer-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-array-buffer: 3.0.5 array-includes@3.1.8: @@ -8748,7 +8617,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 arrify@1.0.1: {} @@ -8847,14 +8716,14 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - autoprefixer@10.4.18(postcss@8.4.35): + autoprefixer@10.4.21(postcss@8.5.3): dependencies: - browserslist: 4.23.0 - caniuse-lite: 1.0.30001594 + browserslist: 4.24.4 + caniuse-lite: 1.0.30001712 fraction.js: 4.3.7 normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.35 + picocolors: 1.1.1 + postcss: 8.5.3 postcss-value-parser: 4.2.0 available-typed-arrays@1.0.5: {} @@ -8878,9 +8747,7 @@ snapshots: dependencies: dequal: 2.0.3 - axobject-query@4.0.0: - dependencies: - dequal: 2.0.3 + axobject-query@4.1.0: {} b4a@1.6.4: optional: true @@ -8955,19 +8822,19 @@ snapshots: node-releases: 2.0.13 update-browserslist-db: 1.0.13(browserslist@4.22.1) - browserslist@4.23.0: + browserslist@4.24.2: dependencies: - caniuse-lite: 1.0.30001594 - electron-to-chromium: 1.4.693 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + caniuse-lite: 1.0.30001680 + electron-to-chromium: 1.5.56 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) - browserslist@4.23.1: + browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001639 - electron-to-chromium: 1.4.815 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) + caniuse-lite: 1.0.30001712 + electron-to-chromium: 1.5.134 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.4) buffer-crc32@0.2.13: {} @@ -8987,7 +8854,7 @@ snapshots: cachedir@2.4.0: {} - call-bind-apply-helpers@1.0.1: + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 @@ -9008,15 +8875,15 @@ snapshots: call-bind@1.0.8: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.0 get-intrinsic: 1.2.4 set-function-length: 1.2.2 - call-bound@1.0.3: + call-bound@1.0.4: dependencies: - call-bind-apply-helpers: 1.0.1 - get-intrinsic: 1.2.7 + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 callsites@3.1.0: {} @@ -9039,9 +8906,9 @@ snapshots: caniuse-lite@1.0.30001553: {} - caniuse-lite@1.0.30001594: {} + caniuse-lite@1.0.30001680: {} - caniuse-lite@1.0.30001639: {} + caniuse-lite@1.0.30001712: {} caseless@0.12.0: {} @@ -9082,17 +8949,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@3.6.0: + chokidar@4.0.3: dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + readdirp: 4.0.2 chownr@1.1.4: optional: true @@ -9142,6 +9001,8 @@ snapshots: clsx@2.0.0: {} + clsx@2.1.1: {} + code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -9230,13 +9091,19 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + css-declaration-sorter@6.4.1(postcss@8.4.21): dependencies: postcss: 8.4.21 - css-declaration-sorter@7.1.1(postcss@8.4.35): + css-declaration-sorter@7.2.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 css-select@5.1.0: dependencies: @@ -9249,7 +9116,7 @@ snapshots: css-tree@2.2.1: dependencies: mdn-data: 2.0.28 - source-map-js: 1.0.2 + source-map-js: 1.2.1 css-tree@2.3.1: dependencies: @@ -9293,47 +9160,47 @@ snapshots: postcss-svgo: 6.0.0(postcss@8.4.21) postcss-unique-selectors: 6.0.0(postcss@8.4.21) - cssnano-preset-default@6.1.0(postcss@8.4.35): + cssnano-preset-default@7.0.6(postcss@8.5.3): dependencies: - browserslist: 4.23.0 - css-declaration-sorter: 7.1.1(postcss@8.4.35) - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 - postcss-calc: 9.0.1(postcss@8.4.35) - postcss-colormin: 6.1.0(postcss@8.4.35) - postcss-convert-values: 6.1.0(postcss@8.4.35) - postcss-discard-comments: 6.0.2(postcss@8.4.35) - postcss-discard-duplicates: 6.0.3(postcss@8.4.35) - postcss-discard-empty: 6.0.3(postcss@8.4.35) - postcss-discard-overridden: 6.0.2(postcss@8.4.35) - postcss-merge-longhand: 6.0.4(postcss@8.4.35) - postcss-merge-rules: 6.1.0(postcss@8.4.35) - postcss-minify-font-values: 6.0.3(postcss@8.4.35) - postcss-minify-gradients: 6.0.3(postcss@8.4.35) - postcss-minify-params: 6.1.0(postcss@8.4.35) - postcss-minify-selectors: 6.0.3(postcss@8.4.35) - postcss-normalize-charset: 6.0.2(postcss@8.4.35) - postcss-normalize-display-values: 6.0.2(postcss@8.4.35) - postcss-normalize-positions: 6.0.2(postcss@8.4.35) - postcss-normalize-repeat-style: 6.0.2(postcss@8.4.35) - postcss-normalize-string: 6.0.2(postcss@8.4.35) - postcss-normalize-timing-functions: 6.0.2(postcss@8.4.35) - postcss-normalize-unicode: 6.1.0(postcss@8.4.35) - postcss-normalize-url: 6.0.2(postcss@8.4.35) - postcss-normalize-whitespace: 6.0.2(postcss@8.4.35) - postcss-ordered-values: 6.0.2(postcss@8.4.35) - postcss-reduce-initial: 6.1.0(postcss@8.4.35) - postcss-reduce-transforms: 6.0.2(postcss@8.4.35) - postcss-svgo: 6.0.3(postcss@8.4.35) - postcss-unique-selectors: 6.0.3(postcss@8.4.35) + browserslist: 4.24.2 + css-declaration-sorter: 7.2.0(postcss@8.5.3) + cssnano-utils: 5.0.0(postcss@8.5.3) + postcss: 8.5.3 + postcss-calc: 10.0.2(postcss@8.5.3) + postcss-colormin: 7.0.2(postcss@8.5.3) + postcss-convert-values: 7.0.4(postcss@8.5.3) + postcss-discard-comments: 7.0.3(postcss@8.5.3) + postcss-discard-duplicates: 7.0.1(postcss@8.5.3) + postcss-discard-empty: 7.0.0(postcss@8.5.3) + postcss-discard-overridden: 7.0.0(postcss@8.5.3) + postcss-merge-longhand: 7.0.4(postcss@8.5.3) + postcss-merge-rules: 7.0.4(postcss@8.5.3) + postcss-minify-font-values: 7.0.0(postcss@8.5.3) + postcss-minify-gradients: 7.0.0(postcss@8.5.3) + postcss-minify-params: 7.0.2(postcss@8.5.3) + postcss-minify-selectors: 7.0.4(postcss@8.5.3) + postcss-normalize-charset: 7.0.0(postcss@8.5.3) + postcss-normalize-display-values: 7.0.0(postcss@8.5.3) + postcss-normalize-positions: 7.0.0(postcss@8.5.3) + postcss-normalize-repeat-style: 7.0.0(postcss@8.5.3) + postcss-normalize-string: 7.0.0(postcss@8.5.3) + postcss-normalize-timing-functions: 7.0.0(postcss@8.5.3) + postcss-normalize-unicode: 7.0.2(postcss@8.5.3) + postcss-normalize-url: 7.0.0(postcss@8.5.3) + postcss-normalize-whitespace: 7.0.0(postcss@8.5.3) + postcss-ordered-values: 7.0.1(postcss@8.5.3) + postcss-reduce-initial: 7.0.2(postcss@8.5.3) + postcss-reduce-transforms: 7.0.0(postcss@8.5.3) + postcss-svgo: 7.0.1(postcss@8.5.3) + postcss-unique-selectors: 7.0.3(postcss@8.5.3) cssnano-utils@4.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 - cssnano-utils@4.0.2(postcss@8.4.35): + cssnano-utils@5.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 cssnano@6.0.1(postcss@8.4.21): dependencies: @@ -9341,11 +9208,11 @@ snapshots: lilconfig: 2.1.0 postcss: 8.4.21 - cssnano@6.1.0(postcss@8.4.35): + cssnano@7.0.6(postcss@8.5.3): dependencies: - cssnano-preset-default: 6.1.0(postcss@8.4.35) - lilconfig: 3.1.1 - postcss: 8.4.35 + cssnano-preset-default: 7.0.6(postcss@8.5.3) + lilconfig: 3.1.2 + postcss: 8.5.3 csso@5.0.5: dependencies: @@ -9468,7 +9335,7 @@ snapshots: data-view-buffer@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -9480,7 +9347,7 @@ snapshots: data-view-byte-length@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -9492,7 +9359,7 @@ snapshots: data-view-byte-offset@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -9524,6 +9391,14 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + + debug@4.4.0: + dependencies: + ms: 2.1.3 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -9575,6 +9450,8 @@ snapshots: dependency-graph@0.11.0: {} + dependency-graph@1.0.0: {} + dequal@2.0.3: {} detect-indent@6.1.0: {} @@ -9584,7 +9461,7 @@ snapshots: devalue@4.3.2: {} - devalue@5.0.0: {} + devalue@5.1.1: {} diff@5.1.0: {} @@ -9622,7 +9499,7 @@ snapshots: dotenv@16.0.3: {} - dotenv@16.4.5: {} + dotenv@16.5.0: {} dotenv@8.6.0: {} @@ -9630,7 +9507,7 @@ snapshots: dunder-proto@1.0.1: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 @@ -9645,9 +9522,9 @@ snapshots: electron-to-chromium@1.4.563: {} - electron-to-chromium@1.4.693: {} + electron-to-chromium@1.5.134: {} - electron-to-chromium@1.4.815: {} + electron-to-chromium@1.5.56: {} emoji-regex@10.3.0: {} @@ -9767,7 +9644,7 @@ snapshots: arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 data-view-buffer: 1.0.2 data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 @@ -9777,7 +9654,7 @@ snapshots: es-set-tostringtag: 2.1.0 es-to-primitive: 1.3.0 function.prototype.name: 1.1.8 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -9813,7 +9690,7 @@ snapshots: typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 unbox-primitive: 1.1.0 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 es-define-property@1.0.0: dependencies: @@ -9826,13 +9703,13 @@ snapshots: es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-set-tostringtag: 2.0.3 function-bind: 1.1.2 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 globalthis: 1.0.4 gopd: 1.2.0 has-property-descriptors: 1.0.2 @@ -9848,6 +9725,10 @@ snapshots: dependencies: es-errors: 1.3.0 + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.4 @@ -9856,14 +9737,14 @@ snapshots: es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 es-set-tostringtag@2.1.0: dependencies: es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -9883,8 +9764,6 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - es6-promise@3.3.1: {} - esbuild@0.18.20: optionalDependencies: '@esbuild/android-arm': 0.18.20 @@ -9935,61 +9814,37 @@ snapshots: '@esbuild/win32-ia32': 0.19.5 '@esbuild/win32-x64': 0.19.5 - esbuild@0.20.2: + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 - - esbuild@0.21.5: - optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 escalade@3.1.1: {} - escalade@3.1.2: {} + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -9997,41 +9852,29 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.1.2(eslint@8.53.0): + eslint-config-prettier@10.1.1(eslint@9.24.0): dependencies: - eslint: 8.53.0 + eslint: 9.24.0 - eslint-compat-utils@0.1.2(eslint@8.57.0): + eslint-config-prettier@10.1.2(eslint@9.24.0): dependencies: - eslint: 8.57.0 + eslint: 9.24.0 - eslint-config-prettier@10.0.1(eslint@8.57.0): + eslint-config-turbo@2.5.0(eslint@9.24.0)(turbo@2.0.3): dependencies: - eslint: 8.57.0 - - eslint-config-prettier@9.0.0(eslint@8.53.0): - dependencies: - eslint: 8.53.0 - - eslint-config-prettier@9.1.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-config-turbo@2.4.0(eslint@8.57.0)(turbo@2.0.3): - dependencies: - eslint: 8.57.0 - eslint-plugin-turbo: 2.4.0(eslint@8.57.0)(turbo@2.0.3) + eslint: 9.24.0 + eslint-plugin-turbo: 2.5.0(eslint@9.24.0)(turbo@2.0.3) turbo: 2.0.3 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@10.0.1(eslint@8.57.0))(eslint@8.57.0)(prettier@3.2.5): + eslint-plugin-prettier@4.2.1(eslint-config-prettier@10.1.1(eslint@9.24.0))(eslint@9.24.0)(prettier@3.5.3): dependencies: - eslint: 8.57.0 - prettier: 3.2.5 + eslint: 9.24.0 + prettier: 3.5.3 prettier-linter-helpers: 1.0.0 optionalDependencies: - eslint-config-prettier: 10.0.1(eslint@8.57.0) + eslint-config-prettier: 10.1.1(eslint@9.24.0) - eslint-plugin-react@7.37.4(eslint@8.57.0): + eslint-plugin-react@7.37.5(eslint@9.24.0): dependencies: array-includes: 3.1.8 array.prototype.findlast: 1.2.5 @@ -10039,12 +9882,12 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 8.57.0 + eslint: 9.24.0 estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 minimatch: 3.1.2 - object.entries: 1.1.8 + object.entries: 1.1.9 object.fromentries: 2.0.8 object.values: 1.2.1 prop-types: 15.8.1 @@ -10053,52 +9896,27 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-svelte@2.35.0(eslint@8.53.0)(svelte@4.2.12): + eslint-plugin-svelte@3.5.1(eslint@9.24.0)(svelte@5.27.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@jridgewell/sourcemap-codec': 1.4.15 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.53.0 - eslint-compat-utils: 0.1.2(eslint@8.53.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.24.0) + '@jridgewell/sourcemap-codec': 1.5.0 + eslint: 9.24.0 esutils: 2.0.3 - known-css-properties: 0.29.0 - postcss: 8.4.35 - postcss-load-config: 3.1.4(postcss@8.4.35) - postcss-safe-parser: 6.0.0(postcss@8.4.35) - postcss-selector-parser: 6.0.13 - semver: 7.5.4 - svelte-eslint-parser: 0.33.1(svelte@4.2.12) + known-css-properties: 0.35.0 + postcss: 8.5.3 + postcss-load-config: 3.1.4(postcss@8.5.3) + postcss-safe-parser: 7.0.1(postcss@8.5.3) + semver: 7.6.3 + svelte-eslint-parser: 1.1.2(svelte@5.27.0) optionalDependencies: - svelte: 4.2.12 + svelte: 5.27.0 transitivePeerDependencies: - - supports-color - ts-node - eslint-plugin-svelte@2.35.1(eslint@8.57.0)(svelte@4.2.12): - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@jridgewell/sourcemap-codec': 1.4.15 - debug: 4.3.4(supports-color@8.1.1) - eslint: 8.57.0 - eslint-compat-utils: 0.1.2(eslint@8.57.0) - esutils: 2.0.3 - known-css-properties: 0.29.0 - postcss: 8.4.35 - postcss-load-config: 3.1.4(postcss@8.4.35) - postcss-safe-parser: 6.0.0(postcss@8.4.35) - postcss-selector-parser: 6.0.13 - semver: 7.6.0 - svelte-eslint-parser: 0.33.1(svelte@4.2.12) - optionalDependencies: - svelte: 4.2.12 - transitivePeerDependencies: - - supports-color - - ts-node - - eslint-plugin-turbo@2.4.0(eslint@8.57.0)(turbo@2.0.3): + eslint-plugin-turbo@2.5.0(eslint@9.24.0)(turbo@2.0.3): dependencies: dotenv: 16.0.3 - eslint: 8.57.0 + eslint: 9.24.0 turbo: 2.0.3 eslint-scope@7.2.2: @@ -10106,6 +9924,11 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 + eslint-scope@8.3.0: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} @@ -10154,93 +9977,53 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@8.53.0: + eslint@9.24.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.3 - '@eslint/js': 8.53.0 - '@humanwhocodes/config-array': 0.11.13 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.24.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/config-array': 0.20.0 + '@eslint/config-helpers': 0.2.1 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.24.0 + '@eslint/plugin-kit': 0.2.8 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + '@humanwhocodes/retry': 0.4.2 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 + cross-spawn: 7.0.6 + debug: 4.4.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color - eslint@8.57.0: + esm-env@1.2.2: {} + + espree@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - esm-env@1.0.0: {} + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 espree@9.6.1: dependencies: @@ -10254,6 +10037,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@1.4.6: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -10384,6 +10171,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.4.3(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -10392,6 +10183,10 @@ snapshots: dependencies: flat-cache: 3.1.1 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 @@ -10417,6 +10212,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + flatted@3.2.9: {} follow-redirects@1.15.3(debug@4.3.4): @@ -10427,6 +10227,10 @@ snapshots: dependencies: is-callable: 1.2.7 + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + forever-agent@0.6.1: {} form-data@2.3.3: @@ -10493,7 +10297,7 @@ snapshots: function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -10520,12 +10324,12 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 - get-intrinsic@1.2.7: + get-intrinsic@1.3.0: dependencies: - call-bind-apply-helpers: 1.0.1 + call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 @@ -10561,9 +10365,9 @@ snapshots: get-symbol-description@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 getos@3.2.1: dependencies: @@ -10613,6 +10417,10 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@16.0.0: {} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 @@ -10622,8 +10430,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globalyzer@0.1.0: {} - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -10642,8 +10448,6 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.1.0 - globrex@0.1.2: {} - gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 @@ -10817,8 +10621,6 @@ snapshots: import-meta-resolve@3.1.1: {} - import-meta-resolve@4.0.0: {} - import-meta-resolve@4.1.0: {} imurmurhash@0.1.4: {} @@ -10869,8 +10671,8 @@ snapshots: is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} @@ -10900,7 +10702,7 @@ snapshots: is-boolean-object@1.2.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-buffer@2.0.5: {} @@ -10925,8 +10727,8 @@ snapshots: is-data-view@1.0.2: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-typed-array: 1.1.15 is-date-object@1.0.5: @@ -10935,7 +10737,7 @@ snapshots: is-date-object@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-docker@3.0.0: {} @@ -10946,7 +10748,7 @@ snapshots: is-finalizationregistry@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-fullwidth-code-point@3.0.0: {} @@ -10983,7 +10785,7 @@ snapshots: is-number-object@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -11002,6 +10804,10 @@ snapshots: dependencies: '@types/estree': 1.0.3 + is-reference@3.0.3: + dependencies: + '@types/estree': 1.0.6 + is-regex@1.1.4: dependencies: call-bind: 1.0.7 @@ -11009,7 +10815,7 @@ snapshots: is-regex@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -11026,7 +10832,7 @@ snapshots: is-shared-array-buffer@1.0.4: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-stream@2.0.1: {} @@ -11038,7 +10844,7 @@ snapshots: is-string@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-subdir@1.2.0: @@ -11051,7 +10857,7 @@ snapshots: is-symbol@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-symbols: 1.1.0 safe-regex-test: 1.1.0 @@ -11065,7 +10871,7 @@ snapshots: is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 is-typedarray@1.0.0: {} @@ -11081,12 +10887,12 @@ snapshots: is-weakref@1.1.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 is-weakset@2.0.4: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-windows@1.0.2: {} @@ -11104,7 +10910,7 @@ snapshots: dependencies: define-data-property: 1.1.4 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 has-symbols: 1.1.0 set-function-name: 2.0.2 @@ -11182,7 +10988,7 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.29.0: {} + known-css-properties@0.35.0: {} lazy-ass@1.6.0: {} @@ -11199,7 +11005,7 @@ snapshots: lilconfig@3.0.0: {} - lilconfig@3.1.1: {} + lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -11274,7 +11080,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 lru-cache@4.1.5: dependencies: @@ -11293,11 +11099,11 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - magic-string@0.30.5: + magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.5.0 - magic-string@0.30.8: + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -11616,7 +11422,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.10 - debug: 4.3.5 + debug: 4.3.7 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -11665,10 +11471,6 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -11686,10 +11488,6 @@ snapshots: mkdirp-classic@0.5.3: optional: true - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mri@1.2.0: {} mrmime@2.0.0: {} @@ -11704,6 +11502,8 @@ snapshots: nanoid@3.3.7: {} + nanoid@3.3.8: {} + napi-build-utils@1.0.2: optional: true @@ -11724,7 +11524,7 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 node-abi@3.51.0: dependencies: @@ -11740,7 +11540,9 @@ snapshots: node-releases@2.0.13: {} - node-releases@2.0.14: {} + node-releases@2.0.18: {} + + node-releases@2.0.19: {} normalize-package-data@2.5.0: dependencies: @@ -11783,17 +11585,18 @@ snapshots: object.assign@4.1.7: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.0.0 has-symbols: 1.1.0 object-keys: 1.1.1 - object.entries@1.1.8: + object.entries@1.1.9: dependencies: - call-bind: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 define-properties: 1.2.1 - es-object-atoms: 1.0.0 + es-object-atoms: 1.1.1 object.fromentries@2.0.8: dependencies: @@ -11805,7 +11608,7 @@ snapshots: object.values@1.2.1: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -11850,7 +11653,7 @@ snapshots: own-keys@1.0.1: dependencies: - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-keys: 1.1.1 safe-push-apply: 1.0.0 @@ -11908,7 +11711,7 @@ snapshots: pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 path-exists@4.0.0: {} @@ -11942,10 +11745,12 @@ snapshots: picocolors@1.0.0: {} - picocolors@1.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} + picomatch@4.0.2: {} + pify@2.3.0: {} pify@4.0.1: {} @@ -11956,7 +11761,7 @@ snapshots: playwright-core@1.44.1: {} - playwright-core@1.45.0: {} + playwright-core@1.51.1: {} playwright@1.44.1: dependencies: @@ -11964,26 +11769,26 @@ snapshots: optionalDependencies: fsevents: 2.3.2 - playwright@1.45.0: + playwright@1.51.1: dependencies: - playwright-core: 1.45.0 + playwright-core: 1.51.1 optionalDependencies: fsevents: 2.3.2 possible-typed-array-names@1.0.0: {} + postcss-calc@10.0.2(postcss@8.5.3): + dependencies: + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 + postcss-calc@9.0.1(postcss@8.4.21): dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.13 postcss-value-parser: 4.2.0 - postcss-calc@9.0.1(postcss@8.4.35): - dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 - postcss-value-parser: 4.2.0 - postcss-cli@11.0.0(postcss@8.4.21): dependencies: chokidar: 3.5.3 @@ -12002,20 +11807,19 @@ snapshots: transitivePeerDependencies: - jiti - postcss-cli@11.0.0(postcss@8.4.35): + postcss-cli@11.0.1(postcss@8.5.3): dependencies: chokidar: 3.5.3 - dependency-graph: 0.11.0 + dependency-graph: 1.0.0 fs-extra: 11.2.0 - get-stdin: 9.0.0 - globby: 14.0.0 - picocolors: 1.0.0 - postcss: 8.4.35 - postcss-load-config: 5.0.2(postcss@8.4.35) - postcss-reporter: 7.0.5(postcss@8.4.35) + picocolors: 1.1.1 + postcss: 8.5.3 + postcss-load-config: 5.0.2(postcss@8.5.3) + postcss-reporter: 7.0.5(postcss@8.5.3) pretty-hrtime: 1.0.3 read-cache: 1.0.0 slash: 5.1.0 + tinyglobby: 0.2.12 yargs: 17.7.2 transitivePeerDependencies: - jiti @@ -12028,12 +11832,12 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-colormin@6.1.0(postcss@8.4.35): + postcss-colormin@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.23.0 + browserslist: 4.24.2 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-combine-duplicated-selectors@10.0.3(postcss@8.4.21): @@ -12041,9 +11845,9 @@ snapshots: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - postcss-combine-duplicated-selectors@10.0.3(postcss@8.4.35): + postcss-combine-duplicated-selectors@10.0.3(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-selector-parser: 6.0.13 postcss-convert-values@6.0.0(postcss@8.4.21): @@ -12052,43 +11856,44 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-convert-values@6.1.0(postcss@8.4.35): + postcss-convert-values@7.0.4(postcss@8.5.3): dependencies: - browserslist: 4.23.0 - postcss: 8.4.35 + browserslist: 4.24.2 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-discard-comments@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 - postcss-discard-comments@6.0.2(postcss@8.4.35): + postcss-discard-comments@7.0.3(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 postcss-discard-duplicates@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 - postcss-discard-duplicates@6.0.3(postcss@8.4.35): + postcss-discard-duplicates@7.0.1(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-discard-empty@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 - postcss-discard-empty@6.0.3(postcss@8.4.35): + postcss-discard-empty@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-discard-overridden@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 - postcss-discard-overridden@6.0.2(postcss@8.4.35): + postcss-discard-overridden@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-import@15.1.0(postcss@8.4.21): dependencies: @@ -12097,19 +11902,19 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.8 - postcss-import@16.0.1(postcss@8.4.35): + postcss-import@16.1.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-load-config@3.1.4(postcss@8.4.35): + postcss-load-config@3.1.4(postcss@8.5.3): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-load-config@5.0.2(postcss@8.4.21): dependencies: @@ -12118,12 +11923,12 @@ snapshots: optionalDependencies: postcss: 8.4.21 - postcss-load-config@5.0.2(postcss@8.4.35): + postcss-load-config@5.0.2(postcss@8.5.3): dependencies: lilconfig: 3.0.0 yaml: 2.3.4 optionalDependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-merge-longhand@6.0.0(postcss@8.4.21): dependencies: @@ -12131,11 +11936,11 @@ snapshots: postcss-value-parser: 4.2.0 stylehacks: 6.0.0(postcss@8.4.21) - postcss-merge-longhand@6.0.4(postcss@8.4.35): + postcss-merge-longhand@7.0.4(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 - stylehacks: 6.1.0(postcss@8.4.35) + stylehacks: 7.0.4(postcss@8.5.3) postcss-merge-rules@6.0.1(postcss@8.4.21): dependencies: @@ -12145,22 +11950,22 @@ snapshots: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - postcss-merge-rules@6.1.0(postcss@8.4.35): + postcss-merge-rules@7.0.4(postcss@8.5.3): dependencies: - browserslist: 4.23.0 + browserslist: 4.24.2 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.16 + cssnano-utils: 5.0.0(postcss@8.5.3) + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 postcss-minify-font-values@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-minify-font-values@6.0.3(postcss@8.4.35): + postcss-minify-font-values@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-minify-gradients@6.0.0(postcss@8.4.21): @@ -12170,11 +11975,11 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-minify-gradients@6.0.3(postcss@8.4.35): + postcss-minify-gradients@7.0.0(postcss@8.5.3): dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 5.0.0(postcss@8.5.3) + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-minify-params@6.0.0(postcss@8.4.21): @@ -12184,11 +11989,11 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-minify-params@6.1.0(postcss@8.4.35): + postcss-minify-params@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.23.0 - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 + browserslist: 4.24.2 + cssnano-utils: 5.0.0(postcss@8.5.3) + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-minify-selectors@6.0.0(postcss@8.4.21): @@ -12196,37 +12001,38 @@ snapshots: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - postcss-minify-selectors@6.0.3(postcss@8.4.35): + postcss-minify-selectors@7.0.4(postcss@8.5.3): dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.16 + cssesc: 3.0.0 + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 postcss-nested@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - postcss-nested@6.0.1(postcss@8.4.35): + postcss-nested@7.0.2(postcss@8.5.3): dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.13 + postcss: 8.5.3 + postcss-selector-parser: 7.0.0 postcss-normalize-charset@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 - postcss-normalize-charset@6.0.2(postcss@8.4.35): + postcss-normalize-charset@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-normalize-display-values@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-display-values@6.0.2(postcss@8.4.35): + postcss-normalize-display-values@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-positions@6.0.0(postcss@8.4.21): @@ -12234,9 +12040,9 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-positions@6.0.2(postcss@8.4.35): + postcss-normalize-positions@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-repeat-style@6.0.0(postcss@8.4.21): @@ -12244,9 +12050,9 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-repeat-style@6.0.2(postcss@8.4.35): + postcss-normalize-repeat-style@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-string@6.0.0(postcss@8.4.21): @@ -12254,9 +12060,9 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-string@6.0.2(postcss@8.4.35): + postcss-normalize-string@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-timing-functions@6.0.0(postcss@8.4.21): @@ -12264,9 +12070,9 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-timing-functions@6.0.2(postcss@8.4.35): + postcss-normalize-timing-functions@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-unicode@6.0.0(postcss@8.4.21): @@ -12275,10 +12081,10 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-unicode@6.1.0(postcss@8.4.35): + postcss-normalize-unicode@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.23.0 - postcss: 8.4.35 + browserslist: 4.24.2 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-url@6.0.0(postcss@8.4.21): @@ -12286,9 +12092,9 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-url@6.0.2(postcss@8.4.35): + postcss-normalize-url@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-normalize-whitespace@6.0.0(postcss@8.4.21): @@ -12296,9 +12102,9 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-normalize-whitespace@6.0.2(postcss@8.4.35): + postcss-normalize-whitespace@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-ordered-values@6.0.0(postcss@8.4.21): @@ -12307,10 +12113,10 @@ snapshots: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-ordered-values@6.0.2(postcss@8.4.35): + postcss-ordered-values@7.0.1(postcss@8.5.3): dependencies: - cssnano-utils: 4.0.2(postcss@8.4.35) - postcss: 8.4.35 + cssnano-utils: 5.0.0(postcss@8.5.3) + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-reduce-initial@6.0.0(postcss@8.4.21): @@ -12319,20 +12125,20 @@ snapshots: caniuse-api: 3.0.0 postcss: 8.4.21 - postcss-reduce-initial@6.1.0(postcss@8.4.35): + postcss-reduce-initial@7.0.2(postcss@8.5.3): dependencies: - browserslist: 4.23.0 + browserslist: 4.24.2 caniuse-api: 3.0.0 - postcss: 8.4.35 + postcss: 8.5.3 postcss-reduce-transforms@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 postcss-value-parser: 4.2.0 - postcss-reduce-transforms@6.0.2(postcss@8.4.35): + postcss-reduce-transforms@7.0.0(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 postcss-rename@0.6.1(postcss@8.4.21): @@ -12340,9 +12146,9 @@ snapshots: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - postcss-rename@0.6.1(postcss@8.4.35): + postcss-rename@0.6.1(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-selector-parser: 6.0.13 postcss-reporter@7.0.5(postcss@8.4.21): @@ -12351,26 +12157,31 @@ snapshots: postcss: 8.4.21 thenby: 1.3.4 - postcss-reporter@7.0.5(postcss@8.4.35): + postcss-reporter@7.0.5(postcss@8.5.3): dependencies: picocolors: 1.0.0 - postcss: 8.4.35 + postcss: 8.5.3 thenby: 1.3.4 - postcss-safe-parser@6.0.0(postcss@8.4.35): + postcss-safe-parser@7.0.1(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 - postcss-scss@4.0.9(postcss@8.4.35): + postcss-scss@4.0.9(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-selector-parser@6.0.13: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-selector-parser@6.0.16: + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-selector-parser@7.0.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -12381,21 +12192,21 @@ snapshots: postcss-value-parser: 4.2.0 svgo: 3.0.2 - postcss-svgo@6.0.3(postcss@8.4.35): + postcss-svgo@7.0.1(postcss@8.5.3): dependencies: - postcss: 8.4.35 + postcss: 8.5.3 postcss-value-parser: 4.2.0 - svgo: 3.2.0 + svgo: 3.3.2 postcss-unique-selectors@6.0.0(postcss@8.4.21): dependencies: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - postcss-unique-selectors@6.0.3(postcss@8.4.35): + postcss-unique-selectors@7.0.3(postcss@8.5.3): dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.16 + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 postcss-value-parser@4.2.0: {} @@ -12411,17 +12222,11 @@ snapshots: picocolors: 1.0.0 source-map-js: 1.0.2 - postcss@8.4.38: + postcss@8.5.3: dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 - - postcss@8.4.39: - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.1 - source-map-js: 1.2.0 + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 prebuild-install@7.1.1: dependencies: @@ -12452,21 +12257,14 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.12): + prettier-plugin-svelte@3.3.3(prettier@3.5.3)(svelte@5.27.0): dependencies: - prettier: 3.0.3 - svelte: 4.2.12 - - prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12): - dependencies: - prettier: 3.2.5 - svelte: 4.2.12 + prettier: 3.5.3 + svelte: 5.27.0 prettier@2.8.8: {} - prettier@3.0.3: {} - - prettier@3.2.5: {} + prettier@3.5.3: {} pretty-bytes@5.6.0: {} @@ -12622,6 +12420,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.0.2: {} + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -12640,7 +12440,7 @@ snapshots: es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 get-proto: 1.0.1 which-builtin-type: 1.2.1 @@ -12793,10 +12593,6 @@ snapshots: rfdc@1.3.1: {} - rimraf@2.7.1: - dependencies: - glob: 7.2.3 - rimraf@3.0.2: dependencies: glob: 7.2.3 @@ -12831,13 +12627,39 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 + rollup@4.39.0: + dependencies: + '@types/estree': 1.0.7 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.39.0 + '@rollup/rollup-android-arm64': 4.39.0 + '@rollup/rollup-darwin-arm64': 4.39.0 + '@rollup/rollup-darwin-x64': 4.39.0 + '@rollup/rollup-freebsd-arm64': 4.39.0 + '@rollup/rollup-freebsd-x64': 4.39.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.39.0 + '@rollup/rollup-linux-arm-musleabihf': 4.39.0 + '@rollup/rollup-linux-arm64-gnu': 4.39.0 + '@rollup/rollup-linux-arm64-musl': 4.39.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.39.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-gnu': 4.39.0 + '@rollup/rollup-linux-riscv64-musl': 4.39.0 + '@rollup/rollup-linux-s390x-gnu': 4.39.0 + '@rollup/rollup-linux-x64-gnu': 4.39.0 + '@rollup/rollup-linux-x64-musl': 4.39.0 + '@rollup/rollup-win32-arm64-msvc': 4.39.0 + '@rollup/rollup-win32-ia32-msvc': 4.39.0 + '@rollup/rollup-win32-x64-msvc': 4.39.0 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 rxjs@7.8.1: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 sade@1.8.1: dependencies: @@ -12860,8 +12682,8 @@ snapshots: safe-array-concat@1.1.3: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 - get-intrinsic: 1.2.7 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 has-symbols: 1.1.0 isarray: 2.0.5 @@ -12886,19 +12708,12 @@ snapshots: safe-regex-test@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-regex: 1.2.1 safer-buffer@2.1.2: {} - sander@0.5.1: - dependencies: - es6-promise: 3.3.1 - graceful-fs: 4.2.11 - mkdirp: 0.5.6 - rimraf: 2.7.1 - sax@1.3.0: {} scheduler@0.23.0: @@ -12926,6 +12741,8 @@ snapshots: dependencies: lru-cache: 6.0.0 + semver@7.6.3: {} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -13020,16 +12837,16 @@ snapshots: side-channel-map@1.0.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-weakmap@1.0.2: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 object-inspect: 1.13.4 side-channel-map: 1.0.1 @@ -13067,7 +12884,7 @@ snapshots: is-arrayish: 0.3.2 optional: true - sirv@2.0.4: + sirv@3.0.0: dependencies: '@polka/url': 1.0.0-next.24 mrmime: 2.0.0 @@ -13102,16 +12919,9 @@ snapshots: smob@1.5.0: {} - sorcery@0.11.0: - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - buffer-crc32: 0.2.13 - minimist: 1.2.8 - sander: 0.5.1 - source-map-js@1.0.2: {} - source-map-js@1.2.0: {} + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -13219,12 +13029,12 @@ snapshots: string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-abstract: 1.23.9 es-errors: 1.3.0 es-object-atoms: 1.0.0 - get-intrinsic: 1.2.7 + get-intrinsic: 1.3.0 gopd: 1.2.0 has-symbols: 1.1.0 internal-slot: 1.1.0 @@ -13240,7 +13050,7 @@ snapshots: string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-data-property: 1.1.4 define-properties: 1.2.1 es-abstract: 1.23.9 @@ -13275,7 +13085,7 @@ snapshots: string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 - call-bound: 1.0.3 + call-bound: 1.0.4 define-properties: 1.2.1 es-object-atoms: 1.0.0 @@ -13333,11 +13143,11 @@ snapshots: postcss: 8.4.21 postcss-selector-parser: 6.0.13 - stylehacks@6.1.0(postcss@8.4.35): + stylehacks@7.0.4(postcss@8.5.3): dependencies: - browserslist: 4.23.0 - postcss: 8.4.35 - postcss-selector-parser: 6.0.16 + browserslist: 4.24.2 + postcss: 8.5.3 + postcss-selector-parser: 6.1.2 supports-color@5.5.0: dependencies: @@ -13353,95 +13163,55 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@3.6.6(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12): + svelte-check@4.1.6(picomatch@4.0.2)(svelte@5.27.0)(typescript@5.8.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 - chokidar: 3.6.0 - fast-glob: 3.3.2 - import-fresh: 3.3.0 - picocolors: 1.0.0 + chokidar: 4.0.3 + fdir: 6.4.3(picomatch@4.0.2) + picocolors: 1.1.1 sade: 1.8.1 - svelte: 4.2.12 - svelte-preprocess: 5.1.3(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12)(typescript@5.4.5) - typescript: 5.4.5 + svelte: 5.27.0 + typescript: 5.8.3 transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss + - picomatch - svelte-check@3.6.7(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12): + svelte-eslint-parser@1.1.2(svelte@5.27.0): dependencies: - '@jridgewell/trace-mapping': 0.3.25 - chokidar: 3.6.0 - fast-glob: 3.3.2 - import-fresh: 3.3.0 - picocolors: 1.0.0 - sade: 1.8.1 - svelte: 4.2.12 - svelte-preprocess: 5.1.3(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12)(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - '@babel/core' - - coffeescript - - less - - postcss - - postcss-load-config - - pug - - sass - - stylus - - sugarss - - svelte-eslint-parser@0.33.1(svelte@4.2.12): - dependencies: - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - postcss: 8.4.35 - postcss-scss: 4.0.9(postcss@8.4.35) + eslint-scope: 8.3.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + postcss: 8.5.3 + postcss-scss: 4.0.9(postcss@8.5.3) + postcss-selector-parser: 7.0.0 optionalDependencies: - svelte: 4.2.12 + svelte: 5.27.0 svelte-hmr@0.15.3(svelte@4.2.1): dependencies: svelte: 4.2.1 - svelte-hmr@0.16.0(svelte@4.2.12): + svelte-preprocess@6.0.3(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.5.3))(postcss@8.5.3)(svelte@5.27.0)(typescript@5.8.3): dependencies: - svelte: 4.2.12 - - svelte-preprocess@5.1.3(@babel/core@7.24.7)(postcss-load-config@5.0.2(postcss@8.4.35))(postcss@8.4.35)(svelte@4.2.12)(typescript@5.4.5): - dependencies: - '@types/pug': 2.0.10 - detect-indent: 6.1.0 - magic-string: 0.30.8 - sorcery: 0.11.0 - strip-indent: 3.0.0 - svelte: 4.2.12 + svelte: 5.27.0 optionalDependencies: '@babel/core': 7.24.7 - postcss: 8.4.35 - postcss-load-config: 5.0.2(postcss@8.4.35) - typescript: 5.4.5 + postcss: 8.5.3 + postcss-load-config: 5.0.2(postcss@8.5.3) + typescript: 5.8.3 - svelte2tsx@0.6.23(svelte@4.2.1)(typescript@5.4.5): + svelte2tsx@0.6.23(svelte@4.2.1)(typescript@5.8.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 svelte: 4.2.1 - typescript: 5.4.5 + typescript: 5.8.3 - svelte2tsx@0.7.3(svelte@4.2.12)(typescript@5.4.5): + svelte2tsx@0.7.34(svelte@5.27.0)(typescript@5.8.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.2.12 - typescript: 5.4.5 + svelte: 5.27.0 + typescript: 5.8.3 svelte@4.2.1: dependencies: @@ -13459,22 +13229,22 @@ snapshots: magic-string: 0.30.5 periscopic: 3.1.0 - svelte@4.2.12: + svelte@5.27.0: dependencies: '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.5 - acorn: 8.11.3 - aria-query: 5.3.0 - axobject-query: 4.0.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.0) + '@types/estree': 1.0.7 + acorn: 8.14.0 + aria-query: 5.3.2 + axobject-query: 4.1.0 + clsx: 2.1.1 + esm-env: 1.2.2 + esrap: 1.4.6 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.8 - periscopic: 3.1.0 + magic-string: 0.30.17 + zimmerframe: 1.1.2 svgo@3.0.2: dependencies: @@ -13483,9 +13253,9 @@ snapshots: css-select: 5.1.0 css-tree: 2.3.1 csso: 5.0.5 - picocolors: 1.0.0 + picocolors: 1.1.1 - svgo@3.2.0: + svgo@3.3.2: dependencies: '@trysound/sax': 0.2.0 commander: 7.2.0 @@ -13493,7 +13263,7 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.0 + picocolors: 1.1.1 tar-fs@2.1.1: dependencies: @@ -13531,7 +13301,7 @@ snapshots: terser@5.31.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.14.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -13543,10 +13313,10 @@ snapshots: through@2.3.8: {} - tiny-glob@0.2.9: + tinyglobby@0.2.12: dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 tmp@0.0.33: dependencies: @@ -13579,13 +13349,9 @@ snapshots: trough@2.1.0: {} - ts-api-utils@1.0.3(typescript@5.4.5): + ts-api-utils@2.1.0(typescript@5.8.3): dependencies: - typescript: 5.4.5 - - ts-api-utils@2.0.1(typescript@5.4.5): - dependencies: - typescript: 5.4.5 + typescript: 5.8.3 tsconfig-resolver@3.0.1: dependencies: @@ -13596,7 +13362,7 @@ snapshots: strip-bom: 4.0.0 type-fest: 0.13.1 - tslib@2.6.2: {} + tslib@2.8.1: {} tty-table@4.2.2: dependencies: @@ -13671,7 +13437,7 @@ snapshots: typed-array-buffer@1.0.3: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 es-errors: 1.3.0 is-typed-array: 1.1.15 @@ -13749,8 +13515,22 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.10 + typescript-eslint@8.30.1(eslint@9.24.0)(typescript@5.8.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.30.1(@typescript-eslint/parser@8.30.1(eslint@9.24.0)(typescript@5.8.3))(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.24.0)(typescript@5.8.3) + eslint: 9.24.0 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + typescript@5.4.5: {} + typescript@5.7.3: {} + + typescript@5.8.3: {} + ultrahtml@1.5.2: {} unbox-primitive@1.0.2: @@ -13762,7 +13542,7 @@ snapshots: unbox-primitive@1.1.0: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 has-bigints: 1.0.2 has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 @@ -13848,19 +13628,19 @@ snapshots: dependencies: browserslist: 4.22.1 escalade: 3.1.1 - picocolors: 1.0.0 + picocolors: 1.1.1 - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.1.1(browserslist@4.24.2): dependencies: - browserslist: 4.23.0 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 - update-browserslist-db@1.0.16(browserslist@4.23.1): + update-browserslist-db@1.1.1(browserslist@4.24.4): dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 + browserslist: 4.24.4 + escalade: 3.2.0 + picocolors: 1.1.1 uri-js@4.4.1: dependencies: @@ -13927,28 +13707,21 @@ snapshots: vite@4.5.3(@types/node@20.14.6)(terser@5.31.0): dependencies: esbuild: 0.18.20 - postcss: 8.4.38 + postcss: 8.5.3 rollup: 3.29.4 optionalDependencies: '@types/node': 20.14.6 fsevents: 2.3.3 terser: 5.31.0 - vite@5.2.12(@types/node@20.14.6)(terser@5.31.0): + vite@6.3.0(@types/node@20.14.6)(terser@5.31.0): dependencies: - esbuild: 0.20.2 - postcss: 8.4.38 - rollup: 4.18.0 - optionalDependencies: - '@types/node': 20.14.6 - fsevents: 2.3.3 - terser: 5.31.0 - - vite@5.3.2(@types/node@20.14.6)(terser@5.31.0): - dependencies: - esbuild: 0.21.5 - postcss: 8.4.39 - rollup: 4.18.0 + esbuild: 0.25.2 + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + postcss: 8.5.3 + rollup: 4.39.0 + tinyglobby: 0.2.12 optionalDependencies: '@types/node': 20.14.6 fsevents: 2.3.3 @@ -13958,13 +13731,9 @@ snapshots: optionalDependencies: vite: 4.5.3(@types/node@20.14.6)(terser@5.31.0) - vitefu@0.2.5(vite@5.2.12(@types/node@20.14.6)(terser@5.31.0)): + vitefu@1.0.4(vite@6.3.0(@types/node@20.14.6)(terser@5.31.0)): optionalDependencies: - vite: 5.2.12(@types/node@20.14.6)(terser@5.31.0) - - vitefu@0.2.5(vite@5.3.2(@types/node@20.14.6)(terser@5.31.0)): - optionalDependencies: - vite: 5.3.2(@types/node@20.14.6)(terser@5.31.0) + vite: 6.3.0(@types/node@20.14.6)(terser@5.31.0) vscode-oniguruma@1.7.0: {} @@ -14011,7 +13780,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: - call-bound: 1.0.3 + call-bound: 1.0.4 function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 @@ -14023,7 +13792,7 @@ snapshots: isarray: 2.0.5 which-boxed-primitive: 1.1.1 which-collection: 1.0.2 - which-typed-array: 1.1.18 + which-typed-array: 1.1.19 which-collection@1.0.2: dependencies: @@ -14062,12 +13831,13 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 - which-typed-array@1.1.18: + which-typed-array@1.1.19: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.8 - call-bound: 1.0.3 - for-each: 0.3.3 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 gopd: 1.2.0 has-tostringtag: 1.0.2 @@ -14157,6 +13927,8 @@ snapshots: yocto-queue@1.0.0: {} + zimmerframe@1.1.2: {} + zod@3.21.1: {} zustand@4.4.1(@types/react@18.2.24)(immer@10.0.4)(react@18.2.0): diff --git a/tests/playwright/e2e/edges.spec.ts b/tests/playwright/e2e/edges.spec.ts index 5d5e4258..768f056c 100644 --- a/tests/playwright/e2e/edges.spec.ts +++ b/tests/playwright/e2e/edges.spec.ts @@ -92,7 +92,7 @@ test.describe('Edges', () => { await edge.click(); await expect(edge).toHaveClass(/selected/); - await page.keyboard.press('Backspace'); + await page.keyboard.press('d'); await expect(edge).not.toBeAttached(); }); @@ -112,10 +112,9 @@ test.describe('Edges', () => { await page.mouse.down(); await page.mouse.up(); - // TODO: times out on webkit await expect(edge).toHaveClass(/selected/); - await page.keyboard.press('Backspace'); + await page.keyboard.press('d'); await expect(edge).toBeAttached(); }); @@ -139,12 +138,10 @@ test.describe('Edges', () => { const edgeBox = await edge.boundingBox(); - //FIXME: Negative values are not working. Investigate further await page.mouse.move(edgeBox!.x + edgeBox!.width * 0.5 + 21, edgeBox!.y + edgeBox!.height * 0.5); await page.mouse.down(); await page.mouse.up(); - // TODO: times out on webkit await expect(edge).toHaveClass(/selected/); }); diff --git a/tests/playwright/e2e/nodes.spec.ts b/tests/playwright/e2e/nodes.spec.ts index decd2c4f..b405d0e0 100644 --- a/tests/playwright/e2e/nodes.spec.ts +++ b/tests/playwright/e2e/nodes.spec.ts @@ -17,40 +17,37 @@ test.describe('Nodes', () => { }); test('selecting multiple nodes with shift drag', async ({ page }) => { + let nodeSelection = page.locator( + FRAMEWORK === 'react' ? '.react-flow__nodesselection' : '.svelte-flow__selection' + ); + let selection = page.locator(FRAMEWORK === 'react' ? '.react-flow__selection' : '.svelte-flow__selection'); + const nodes = page.locator(`.${FRAMEWORK}-flow__node`); - const firstNode = nodes.first(); - const secondNode = nodes.nth(1); - const thirdNode = nodes.nth(2); - await expect(firstNode).toBeInViewport(); - await expect(secondNode).toBeInViewport(); - await expect(thirdNode).toBeInViewport(); + await expect(nodes.first()).toHaveCSS('visibility', 'visible'); + await expect(nodes.nth(1)).toHaveCSS('visibility', 'visible'); + await expect(nodes.nth(2)).toHaveCSS('visibility', 'visible'); + const box = await nodes.first().boundingBox(); - const box = await firstNode.boundingBox(); - - await page.mouse.move(box!.x - 150, box!.y - 25); await page.keyboard.down('Shift'); + await page.mouse.move(box!.x - 150, box!.y - 25); await page.mouse.down(); await page.mouse.move(box!.x + 275, box!.y + 200); + + await expect(selection).toBeInViewport(); await page.mouse.up(); await page.keyboard.up('Shift'); - await expect(firstNode).toHaveClass(/selected/); - await expect(secondNode).toHaveClass(/selected/); - await expect(thirdNode).toHaveClass(/selected/); + await expect(nodes.first()).toHaveClass(/selected/); + await expect(nodes.nth(1)).toHaveClass(/selected/); + await expect(nodes.nth(2)).toHaveClass(/selected/); - let selection: Locator | undefined; - if (FRAMEWORK === 'react') { - selection = page.locator('.react-flow__nodesselection'); - } else if (FRAMEWORK === 'svelte') { - selection = page.locator('.svelte-flow__selection'); - } - - if (selection) await expect(selection).toBeInViewport(); + await expect(nodeSelection).toBeInViewport(); }); test('selectable=false prevents selection', async ({ page }) => { const locator = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notSelectable"]')); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); await locator.click(); await expect(locator).not.toHaveClass(/selected/); @@ -61,6 +58,8 @@ test.describe('Nodes', () => { test('dragging a node', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).first(); + await expect(node).toHaveCSS('visibility', 'visible'); + const transformBeforeMove = await node.evaluate((element) => { return element.style.transform; }); @@ -79,6 +78,7 @@ test.describe('Nodes', () => { test('draggable=false prevents dragging', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notDraggable"]')); + await expect(node).toHaveCSS('visibility', 'visible'); const transformBeforeMove = await node.evaluate((element) => { return element.style.transform; @@ -98,6 +98,7 @@ test.describe('Nodes', () => { test('custom drag handle works', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="drag-handle"]')); + await expect(node).toHaveCSS('visibility', 'visible'); const dragHandle = page.locator('.custom-drag-handle'); const transformBeforeMove = await node.evaluate((element) => { @@ -133,9 +134,10 @@ test.describe('Nodes', () => { test.describe('deleting', () => { test('deleting a node and its edges', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="Node-1"]')); + await expect(node).toHaveCSS('visibility', 'visible'); await node.click(); - await page.keyboard.press('Backspace'); + await page.keyboard.press('d'); await expect(node).not.toBeAttached(); @@ -143,14 +145,15 @@ test.describe('Nodes', () => { expect(edges).toHaveLength(0); }); - // TODO: pressing backspace creates problems on webkit test('deletable=false prevents deletion', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="notDeletable"]')); + await expect(node).toHaveCSS('visibility', 'visible'); await expect(node).toBeAttached(); await node.click(); - await page.keyboard.press('Backspace'); + // pressing backspace breaks webkit + await page.keyboard.press('d'); await expect(node).toBeAttached(); }); @@ -158,60 +161,86 @@ test.describe('Nodes', () => { test.describe('connecting', () => { test('connecting two nodes', async ({ page }) => { + let connectionLine = page.locator(`.${FRAMEWORK}-flow__connectionline`); const outputSourceHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-1"]')); const inputSourceHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-4"]')); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); await expect(outputSourceHandle).toBeInViewport(); await expect(inputSourceHandle).toBeInViewport(); - const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); await outputSourceHandle.hover(); await page.mouse.down(); await inputSourceHandle.hover(); + await expect(connectionLine).toBeInViewport(); await page.mouse.up(); - const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); - expect(edgesAfter).toHaveLength(edgesBefore.length + 1); + await expect(connectionLine).not.toBeInViewport(); + + await expect(page.locator('[data-id="xy-edge__Node-1-Node-4"]')).toBeInViewport(); + + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(3); }); test('connecting two output handles does not work', async ({ page }) => { + let connectionLine = page.locator(`.${FRAMEWORK}-flow__connectionline`); const firstOutputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-2"]')); const secondOutputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-4"]')); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); await expect(firstOutputHandle).toBeInViewport(); await expect(secondOutputHandle).toBeInViewport(); - const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); await firstOutputHandle.hover(); await page.mouse.down(); - await secondOutputHandle.hover(); + + // await secondOutputHandle.hover(); + // Does not work in SvelteFlow for whatever reason!? + // but the following works... + const box = await secondOutputHandle.boundingBox(); + await page.mouse.move(box!.x + 2, box!.y + 2); + + await expect(connectionLine).toBeInViewport(); await page.mouse.up(); - const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); - expect(edgesAfter).toHaveLength(edgesBefore.length); + await expect(connectionLine).not.toBeInViewport(); + + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); }); test('connecting two input handles does not work', async ({ page }) => { + let connectionLine = page.locator(`.${FRAMEWORK}-flow__connectionline`); const firstInputHandle = page.locator(`.${FRAMEWORK}-flow__handle`).and(page.locator('[data-nodeid="Node-1"]')); const secondInputHandle = page .locator(`.${FRAMEWORK}-flow__handle`) .and(page.locator('[data-nodeid="Node-3"]')) .and(page.locator('.source')); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); await expect(firstInputHandle).toBeInViewport(); await expect(secondInputHandle).toBeInViewport(); - const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); await firstInputHandle.hover(); await page.mouse.down(); - await secondInputHandle.hover(); + + // await secondInputHandle.hover(); + // Does not work in SvelteFlow for whatever reason!? + // but the following works... + const box = await secondInputHandle.boundingBox(); + await page.mouse.move(box!.x + 2, box!.y + 2); + + await expect(connectionLine).toBeInViewport(); await page.mouse.up(); - const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); - expect(edgesAfter).toHaveLength(edgesBefore.length); + await expect(connectionLine).not.toBeInViewport(); + + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); }); test('connectable=false prevents connections', async ({ page }) => { @@ -222,18 +251,18 @@ test.describe('Nodes', () => { const notConnectableBox = await notConnectableHandle.boundingBox(); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); await expect(outputHandle).toBeInViewport(); await expect(notConnectableHandle).toBeInViewport(); - const edgesBefore = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); await outputHandle.hover(); await page.mouse.down(); await page.mouse.move(notConnectableBox!.x + 2, notConnectableBox!.y + 2); await page.mouse.up(); - const edgesAfter = await page.locator(`.${FRAMEWORK}-flow__edge`).all(); - expect(edgesAfter).toHaveLength(edgesBefore.length); + await expect(page.locator(`.${FRAMEWORK}-flow__edge`)).toHaveCount(2); }); }); @@ -245,12 +274,14 @@ test.describe('Nodes', () => { test('classes get applied', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="Node-1"]')); + await expect(node).toHaveCSS('visibility', 'visible'); await expect(node).toHaveClass(/playwright-test-class-123/); }); test('styles get applied', async ({ page }) => { const node = page.locator(`.${FRAMEWORK}-flow__node`).and(page.locator('[data-id="Node-1"]')); + await expect(node).toHaveCSS('visibility', 'visible'); await expect(node).toHaveCSS('background-color', 'rgb(255, 0, 0)'); }); diff --git a/tests/playwright/e2e/pane.spec.ts b/tests/playwright/e2e/pane.spec.ts index 4c27e33c..9f51ae5c 100644 --- a/tests/playwright/e2e/pane.spec.ts +++ b/tests/playwright/e2e/pane.spec.ts @@ -172,13 +172,12 @@ test.describe('Pane non-default', () => { }); }); -test.describe('Pane activation keys', () => { - test.beforeEach(async ({ page }) => { - // Go to the starting url before each test. - await page.goto('/tests/generic/pane/activation-keys'); +// test.describe('Pane activation keys', () => { +// test.beforeEach(async ({ page }) => { +// // Go to the starting url before each test. +// await page.goto('/tests/generic/pane/activation-keys'); - // Wait till the edges are rendered - await page.waitForSelector('[data-id="first-edge"]', { timeout: 5000 }); - }); - // TODO -}); +// // Wait till the edges are rendered +// await page.waitForSelector('[data-id="first-edge"]', { timeout: 5000 }); +// }); +// }); diff --git a/tests/playwright/e2e/props.spec.ts b/tests/playwright/e2e/props.spec.ts index b8104633..d9d3e7eb 100644 --- a/tests/playwright/e2e/props.spec.ts +++ b/tests/playwright/e2e/props.spec.ts @@ -6,17 +6,19 @@ test.describe('Props', () => { test.describe('colorMode', async () => { test('render default light color mode', async ({ page }) => { await page.goto('/examples/color-mode'); - const locator = page.locator(`.${FRAMEWORK}-flow`); - await expect(locator).not.toHaveClass(/dark/); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); + + await expect(page.locator(`.${FRAMEWORK}-flow`)).not.toHaveClass(/dark/); }); test('render dark color mode', async ({ page }) => { await page.goto('/examples/color-mode'); - const locator = page.locator(`.${FRAMEWORK}-flow`); + await expect(page.locator(`.${FRAMEWORK}-flow__node`).first()).toHaveCSS('visibility', 'visible'); + await page.getByTestId('colormode-select').selectOption({ label: 'dark' }); - await expect(locator).toHaveClass(/dark/); + await expect(page.locator(`.${FRAMEWORK}-flow`)).toHaveClass(/dark/); }); }); }); diff --git a/tests/playwright/package-lock.json b/tests/playwright/package-lock.json index e6abed25..e7164ee6 100644 --- a/tests/playwright/package-lock.json +++ b/tests/playwright/package-lock.json @@ -9,15 +9,15 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@playwright/experimental-ct-react": "^1.44.1", + "@playwright/experimental-ct-react": "^1.51.1", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "typescript": "^5.4.5" + "typescript": "^5.7.3" }, "devDependencies": { - "@playwright/test": "^1.44.1", + "@playwright/test": "^1.51.1", "@types/node": "^20.14.6" } }, @@ -352,6 +352,7 @@ "os": [ "aix" ], + "peer": true, "engines": { "node": ">=12" } @@ -367,6 +368,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -382,6 +384,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -397,6 +400,7 @@ "os": [ "android" ], + "peer": true, "engines": { "node": ">=12" } @@ -412,6 +416,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=12" } @@ -427,6 +432,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": ">=12" } @@ -442,6 +448,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -457,6 +464,7 @@ "os": [ "freebsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -472,6 +480,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -487,6 +496,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -502,6 +512,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -517,6 +528,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -532,6 +544,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -547,6 +560,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -562,6 +576,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -577,6 +592,7 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } @@ -592,10 +608,26 @@ "os": [ "linux" ], + "peer": true, "engines": { "node": ">=12" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", @@ -607,10 +639,26 @@ "os": [ "netbsd" ], + "peer": true, "engines": { "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", @@ -622,6 +670,7 @@ "os": [ "openbsd" ], + "peer": true, "engines": { "node": ">=12" } @@ -637,6 +686,7 @@ "os": [ "sunos" ], + "peer": true, "engines": { "node": ">=12" } @@ -652,6 +702,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -667,6 +718,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -682,6 +734,7 @@ "os": [ "win32" ], + "peer": true, "engines": { "node": ">=12" } @@ -730,52 +783,522 @@ } }, "node_modules/@playwright/experimental-ct-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.44.1.tgz", - "integrity": "sha512-IqeXzfmpHH8yHA0fGQ//l/tDJHzUmg2dQj3t28E1tCshvnYc9fVr53Na9+/B8ME//vw0UFpv+CSKcOTHwWrhQg==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.51.1.tgz", + "integrity": "sha512-kpRZWBT3SMukL1fx8BwEj385Pkgtp86bBKzmrmJU30lWlQiIDFNaIHosgxQC68c8y2mg3Una/lBSHNc2Fotgkw==", "dependencies": { - "playwright": "1.44.1", - "playwright-core": "1.44.1", - "vite": "^5.2.8" + "playwright": "1.51.1", + "playwright-core": "1.51.1", + "vite": "^5.4.14 || ^6.0.0" }, "engines": { - "node": ">=16" + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/android-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/android-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/android-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/darwin-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-arm": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-loong64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-s390x": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/linux-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/sunos-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/win32-arm64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/win32-ia32": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/@esbuild/win32-x64": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/esbuild": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", + "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.2", + "@esbuild/android-arm": "0.25.2", + "@esbuild/android-arm64": "0.25.2", + "@esbuild/android-x64": "0.25.2", + "@esbuild/darwin-arm64": "0.25.2", + "@esbuild/darwin-x64": "0.25.2", + "@esbuild/freebsd-arm64": "0.25.2", + "@esbuild/freebsd-x64": "0.25.2", + "@esbuild/linux-arm": "0.25.2", + "@esbuild/linux-arm64": "0.25.2", + "@esbuild/linux-ia32": "0.25.2", + "@esbuild/linux-loong64": "0.25.2", + "@esbuild/linux-mips64el": "0.25.2", + "@esbuild/linux-ppc64": "0.25.2", + "@esbuild/linux-riscv64": "0.25.2", + "@esbuild/linux-s390x": "0.25.2", + "@esbuild/linux-x64": "0.25.2", + "@esbuild/netbsd-arm64": "0.25.2", + "@esbuild/netbsd-x64": "0.25.2", + "@esbuild/openbsd-arm64": "0.25.2", + "@esbuild/openbsd-x64": "0.25.2", + "@esbuild/sunos-x64": "0.25.2", + "@esbuild/win32-arm64": "0.25.2", + "@esbuild/win32-ia32": "0.25.2", + "@esbuild/win32-x64": "0.25.2" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/@playwright/experimental-ct-core/node_modules/vite": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.0.tgz", + "integrity": "sha512-9aC0n4pr6hIbvi1YOpFjwQ+QOTGssvbJKoeYkuHHGWwlXfdxQlI8L2qNMo9awEEcCPSiS+5mJZk5jH1PAqoDeQ==", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.3", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.12" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, "node_modules/@playwright/experimental-ct-react": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.44.1.tgz", - "integrity": "sha512-qRhv2zmZVwtzAYWwQO4j+It0S5zLUuZg/7Ke61ymCC5jGqlwf2kYqogFxBiDdhAO1sz/dN0UtdU+6df0HK5yzw==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.51.1.tgz", + "integrity": "sha512-Lu14QiemO2TWfiL6TQPWBH2n+4IvPYH/W6cfblzYpLu/TZdJ7e608l3GwqAGRN5FJym3YOonC7x1Q5EAwcBarg==", "dependencies": { - "@playwright/experimental-ct-core": "1.44.1", + "@playwright/experimental-ct-core": "1.51.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@playwright/test": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", - "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.51.1.tgz", + "integrity": "sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==", "dev": true, "dependencies": { - "playwright": "1.44.1" + "playwright": "1.51.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.0.tgz", + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", "cpu": [ "arm" ], @@ -785,9 +1308,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.0.tgz", + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", "cpu": [ "arm64" ], @@ -797,9 +1320,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.0.tgz", + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", "cpu": [ "arm64" ], @@ -809,9 +1332,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.0.tgz", + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", "cpu": [ "x64" ], @@ -820,10 +1343,34 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.0.tgz", + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.0.tgz", + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.0.tgz", + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", "cpu": [ "arm" ], @@ -833,9 +1380,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.0.tgz", + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", "cpu": [ "arm" ], @@ -845,9 +1392,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.0.tgz", + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", "cpu": [ "arm64" ], @@ -857,9 +1404,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.0.tgz", + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", "cpu": [ "arm64" ], @@ -868,10 +1415,22 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.0.tgz", + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.0.tgz", + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", "cpu": [ "ppc64" ], @@ -881,9 +1440,21 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.0.tgz", + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.0.tgz", + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", "cpu": [ "riscv64" ], @@ -893,9 +1464,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.0.tgz", + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", "cpu": [ "s390x" ], @@ -905,9 +1476,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.0.tgz", + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", "cpu": [ "x64" ], @@ -917,9 +1488,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.0.tgz", + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", "cpu": [ "x64" ], @@ -929,9 +1500,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.0.tgz", + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", "cpu": [ "arm64" ], @@ -941,9 +1512,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.0.tgz", + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", "cpu": [ "ia32" ], @@ -953,9 +1524,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.0.tgz", + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", "cpu": [ "x64" ], @@ -1002,9 +1573,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" }, "node_modules/@types/node": { "version": "20.14.6", @@ -1178,6 +1749,7 @@ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "hasInstallScript": true, + "peer": true, "bin": { "esbuild": "bin/esbuild" }, @@ -1226,6 +1798,19 @@ "node": ">=0.8.0" } }, + "node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -1315,9 +1900,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", @@ -1337,42 +1922,53 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, "node_modules/playwright": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", - "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", + "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", "dependencies": { - "playwright-core": "1.44.1" + "playwright-core": "1.51.1" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", - "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", + "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", "funding": [ { "type": "opencollective", @@ -1388,9 +1984,9 @@ } ], "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -1428,11 +2024,11 @@ } }, "node_modules/rollup": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz", - "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==", + "version": "4.40.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.0.tgz", + "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.7" }, "bin": { "rollup": "dist/bin/rollup" @@ -1442,22 +2038,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.18.0", - "@rollup/rollup-android-arm64": "4.18.0", - "@rollup/rollup-darwin-arm64": "4.18.0", - "@rollup/rollup-darwin-x64": "4.18.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.18.0", - "@rollup/rollup-linux-arm-musleabihf": "4.18.0", - "@rollup/rollup-linux-arm64-gnu": "4.18.0", - "@rollup/rollup-linux-arm64-musl": "4.18.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0", - "@rollup/rollup-linux-riscv64-gnu": "4.18.0", - "@rollup/rollup-linux-s390x-gnu": "4.18.0", - "@rollup/rollup-linux-x64-gnu": "4.18.0", - "@rollup/rollup-linux-x64-musl": "4.18.0", - "@rollup/rollup-win32-arm64-msvc": "4.18.0", - "@rollup/rollup-win32-ia32-msvc": "4.18.0", - "@rollup/rollup-win32-x64-msvc": "4.18.0", + "@rollup/rollup-android-arm-eabi": "4.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", "fsevents": "~2.3.2" } }, @@ -1478,9 +2078,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -1496,6 +2096,21 @@ "node": ">=4" } }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dependencies": { + "fdir": "^6.4.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -1505,9 +2120,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1555,6 +2170,7 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.38", @@ -1614,6 +2230,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } diff --git a/tests/playwright/package.json b/tests/playwright/package.json index a6dea9d4..6f3c27c2 100644 --- a/tests/playwright/package.json +++ b/tests/playwright/package.json @@ -14,15 +14,15 @@ "author": "", "license": "ISC", "devDependencies": { - "@playwright/test": "^1.45.0", + "@playwright/test": "^1.51.1", "@types/node": "^20.14.6" }, "dependencies": { - "@playwright/experimental-ct-react": "^1.45.0", + "@playwright/experimental-ct-react": "^1.51.1", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "react": "^18.3.1", "react-dom": "^18.3.1", - "typescript": "^5.4.5" + "typescript": "^5.7.3" } }